De eerste herinneringen aan modelspoor is van de Lego trein. Het was werkelijk magisch: schitterend van de eenvoud en toch heel veelzijdig. Lego had een stevig motorblok waarin 4 wielen gestoken konden worden en waarop op verschillende plekken 2 mini banaanstekers voor de voeding ingeplugd konden worden. Wat we dan meestal deden is achter een locomotief een speciale batterijwagon maken met daarin uiteraard de batterijen, die vervolgens met een klein snoertje met de locomotief verbonden werd. Vooraan het batterijvak was een grote witte hevel om de trein in gang te zetten en de richting te bepalen.
Uitbreidingen
Wissels
Op een eenvoudige ovaal raak je gauw uitgekeken. Dus kwamen er wissels. Dat maakte spelen weer een tijdje leuker.
Pendelbaan
Helemaal geweldig vond ik de pendelbaan uitbreiding. Er kwam een module bij die de stroom kon omdraaien aan de hand van een hevel. Deze hevel stak horizontaal onder de trein vandaan aan de zijkant. Door op bepaalde plekken een paaltje aan de rails te monteren wisselde de trein daar (weliswaar erg abrupt) van richting. Daar kon je een hele tijd naar kijken.
Latere herinnering
N modelspoor
Mijn vader kwam thuis met een hele doos N spoor materiaal. Wat een kleine treintjes en zo gedetailleerd. De schaal is 1:160. Ineens hadden we verschillende locomotieven en treinstellen, wagons, rails in allerlei soorten en maten en huisjes en stations! Wat een rijkdom. Eigenlijk waren wij toen nog veel te jong voor dit fragiele materiaal. Het duurde niet lang voordat de pantograaf van een trein verbogen was en er klei op andere onderdelen zat.
Railbus
Het leukste vond ik het wit-blauwe treinstel. Omdat je er geen wagons aan hoefde te hangen, maar vooral omdat de lichtjes magisch aan gingen: 3 witte aan de voorkant en 2 rode aan de achterkant. En als je de rijrichting veranderde, veranderden de lampen mee.
Modelspoorbanen zijn in mijn leven vanaf de eerste Lego treinen. Veel later bracht mijn vader een hele doos N spoor materiaal mee. Volgens mij heeft hij er zelf nooit wat mee gedaan, maar ik was geïntrigeerd. Vooral het wit-blauwe dubbele treinstel waarvan 3 witte lampjes en 2 rode lampjes gingen branden gelijk met de richting waarin de trein reed. Later bouwde ik verschillende banen waarin ik ervaring opdeed. Bijvoorbeeld dat als je een talud maakt van massief gips, dat de baan dan wel heel zwaar wordt.
De afgelopen jaren sluimert het modelspoor virus. Ik bezoek het spoorwegmuseum, verschillende treinenbeurzen, koop wat materiaal zoals spoor en een analoog VT98 treinstel, experimenteer wat met de Arduino en lees veel websites over modelspoorwegbouw.
Mijn idee is om ooit een pendelbaan te maken met de VT98 omdat ik het een erg leuk model vind. Het is eigenlijk een dieselbus op het spoor met een heel typisch eigen geluid en een heel specifieke leuke waarschuwingstoeter.
If you just want to read the contents of an Excel spreadsheet, there is an easier way using the Microsoft Excel (ODBC) Driver.
In a previous post (Foxpro and Excel) we have shown how to control Excel using the Excel.Application object. But if you are just interested in the contents, there is an even easier way to achieve this: The Microsoft Excel (ODBC) driver. that is present on most systems with MS Office installed.
To get an SQL connection to an Excel sheet is no more difficult than this:
lcXLfile = [c:\temp\demo.xlsx]
* Warning: The driver wil never fail!
* If the file does not exist, this driver wil create the file.
IF !FILE(lcXLfile)
? [Excel file not found]
RETURN .F.
ENDIF
lcConnection = [DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=]+lcXLfile
lnHandle = SQLSTRINGCONNECT(lcConnection)
* Get all sheetnames in a cursor (every sheet is a Table)
? SQLTABLES(lnHandle,[],[crSheets])
lcQuery = [SELECT * FROM ]+TRIM(STRTRAN(crSheets.Table_Name,['],["]))
? SQLEXEC(lnHandle, lcQuery, [crResults])
SQLDISCONNECT(lnHandle)
The SQLTABLES command creates a cursor with a row for each sheet in the Excel file. You can filter the kind of tables in the second parameter. This is a typical row:
Field name
Field type
Length
Example
TABLE_CAT
Memo
4
C:\TEMP\DEMO.XLSX
TABLE_SCHEM
Character
128
.NULL.
TABLE_NAME
Character
128
‘Sheet1$’
TABLE_TYPE
Character
128
TABLE
REMARKS
Character
254
.NULL.
SQLTABLES structure
Remarks
Quotes in the SQLTABLES result
The TABLE_NAME field contains single quotes, These seem not to work in a SQL statement. So you have to replace them with double quotes. Check out the lcQuery line in the code above..
Field names in queries
Only when a sheet is properly filled the field names in queries are automatically named correctly: The titles in the first row are accepted as fieldnames. However, if the first row is left blank or there are multiple tables on a page, the result becomes erratic.. In this situation some or all fields get the title F1. and so on (number being the column number).
Field types
It seems the unaltered query results deliver just 2 kinds of columns: Numbers and Memo’s. Both columns may contain .NULL. values.
Quotes in query’s
To compare or use strings in SQL query’s, you need to use the single quotes again. For instance:
lcQuery = [SELECT * FROM "Sheet1$" WHERE surname='de Graaf']
SQLEXEC(lnHandle,lcQuery,[crDeGraaf])
Double complex because the sheet (table) name has to be encapsulated in double quotes, while a compare string has to be encapsulated in single quotes.. I can’t think of a reason for this odd behavior.
Read only
As to be expected, this ODBC method to an Excel file is limited to reading the file. Trying to insert or update using SQL commands renders the result that the query has to be updatable.