De meeste recente versie van de COMSDK bevat een voorbeeld (gedemonstreerd op SDE’s en DevCon Europe) dat toegang geeft via de VO RDD’s tot datavanuit een willekeurige COM-Client applicatie. Voorbeelden daarvan zijn VBA (dus de Office applicaties als Word en Excel) maar ook vanuit VB-script. Na de installatie van de COMSDK vindt je een submap in de comsdk-map genaamd dbReader. Deze applicatie is een voorbeeld van een com-server applicatie geschreven met behulp van de COMSDK functies en classes.
Deze .Exe geeft toegang tot je (dbf)data via de VO RDD’s (of ADS). dbReader bevat een object-model dat wat afwijkt van dbServer, maar is qua mogelijkheden vergelijkbaar. Het object-model is sterk geoptimaliseerd voor het lezen en zoeken in dbf’s en niet direct geschikt voor het doen van updates.
Installatie
Eerst moet de TS_DBREADER.AEF in je COMSDK project geïmporteerd worden. Compileer en maak een .Exe. Heb je nog geen COMSDK project in VO open dan het kant en klare project door dubbel te klikken op de .voprj file in de Project map in de COMSDK map onder \cavo27. Afhankelijk van de manier waarop je dbReader wilt gaan gebruiken heb je eigenlijk twee verschillende opties; 1. Installatie in een separate map en zorgen dat alle VO-runtime DLL’s daarin beschikbaar zijn. Tevens dient ts_dbreader.tlb hieraan aanwezig te zijn.
2. Maak de .Exe in \Cavo27\bin en copieer ts_dbreader.tlb daarin.
Als dbReader onderdeel uit moet maken van een bestaande VO-applicatie dan moet TS_dbReader.Exe en .Tlb in in de map geplaatst worden waar de andere VO-DLL’s en .Executables staan.
Nadat er een werkende TS_dbReader.exe is moet deze geregistreerd worden in de registry. Het component beschikt over interne code om dat te regelen, het is alleen een kwestie die code een keer aan te roepen. Open een command venster, ga naar de map waarin de .Exe zich bevindt en start het component met de commandline switch /REGISTER. Dit registreerd het component en z’n typelibrary (de .Tlb file), als de registratie correct verloopt krijg je twee messageboxes te zien die de registratie bevestigen.
Het gebruik
Je bent nu gereed het dbReader component te testen, dit kan bijvoorbeeld door het schrijven van een klein VB-script. Open Notepad en plak de volgende code: Set IXPServer=CreateObject("TS_DBReader.Server")
MsgBox IXPServer,,"IXPServer(TS_DBReader.Server)"
Sla dit script op als TestdbReader.VBS en voer het script uit door erop te dubbelklikken vanuit de Windows verkenner. Het component zal dan gestart worden en de messagebox geeft de ‘AsString’ variant van de com-server, in dit geval de details van de VO-class en wat andere interne informatie.
Nu weet je zeker dat je een werkend component hebt op je systeem, laten we vervolgens het script wat gaan uitbreiden. We openen een dbf en skippen door de records. Hieronder weer wat voorbeeldcode, denk er wel even aan het pad en bestandsnaam aan te passen op de situatie zoals die op je systeem is. De voorbeeldbestanden zijn geïnstalleerd tijdens de installatie van de COMSDK.
Set IXPServer=CreateObject("TS_DBReader.Server")
MsgBox IXPServer,,"IXPServer(TS_DBReader.Server)"
Set IXPRecordsetFactory = IXPServer.IRecordsetFactory(-1,"DBFCDX","C:\Cavo27\comsdk\DBReader\TS_DBReaderTestFileCDX.DBF")
MsgBox IXPRecordsetFactory,,"IXPRecordsetFactory"
lShared=True
lReadOnly=False
Set IXPRecordset = IXPRecordsetFactory.IRecordsetEx(lShared,lReadOnly)
MsgBox IXPRecordset,,"IXPRecordset"
Set IXPCursor = IXPRecordset.ICursor
MsgBox IXPCursor,,"IXPCursor"
Tmp = IXPCursor.Skip(+3)
While Not IXPCursor.IsBOF
Set IXPRecord = IXPCursor.IRecord
MsgBox IXPRecord,,IXPRecord
Tmp = IXPCursor.Skip(-1)
Wend
Opslaan en uitvoeren en zoals je dan ziet krijg je de informatie vanuit de dbReader objecten. Met behulp van het Cursor-object kun je ook de veldwaarden opvragen, op en manier die vergelijkbaar is met VO Fieldget():
MsgBox IXPCursor.FieldValue(1),,"IXPCursor.FieldValue(1)"
Er is een behoorlijke hoeveelheid methoden en eigenschappen in het dbReader object-model. TS_DBReader.VBS in de dbReader map bevat een groot aantal regels voorbeeldcode die wij als test gebruikt hebben maar kan ook fungeren als ingang om te kijken hoe de andere functionaliteiten van dbReaderfolder, zolas zoeken, indexen selecteren, filters en scopes zetten etc. werken. En, heel belangrijk, in de TS_dbReader.AEF staat alle sourcecode, dus wil je het graag anders of aanvullen dan heb je die mogelijkheid tot je beschikking. Leuk zou het natuurlijk zijn je aanpassingen ook te beschrijven en te posten zodat anderen er ook gebruik van kunnen maken.
Ok, nu we weten hoe dbReader werkt kunnen we gaan bekijken hoe het te gebruiken is vanuit een Office applicatie als MS-Word. Om dit meteen een beetje modern te maken zullen we gebruik maken van de nieuwe XML-functionaliteiten in Office 2003 zodat je dit als basis zou kunnen gebruiken voor je eigen Smart-documents. Office 2003 biedt de mogelijkheid XML-schema’s (XSD’s) te koppelen aan documenten en zo onderdelen van teksten te ‘taggen’. Net als je dat wellicht in het verleden gedaan hebt met velden of bookmarks. Deze XML-tags kunnen dan vervolgens als XML-elementen vanuit VBA-script worden benaderd en geven je de mogelijkheid je Word-document als een XML-document op te slaan. Hier is een weergave van een deel van een Word-document met tags en data zoals gepresenteerd wordt door MS-Word als je die weergave aanzet.
Het gekoppelde schema hieronder:
xml version="1.0" encoding="utf-8" ?>
<xs:schema id="XMLSchema1" targetNamespace="http://tempuri.org/XMLSchema1.xsd" elementFormDefault="qualified"
xmlns="http://tempuri.org/XMLSchema1.xsd" xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Address">
<xs:complexType>
<xs:sequence>
<xs:element name="GIVEN" type="xs:string" />
<xs:element name="SURNAME" type="xs:string" />
<xs:element name="GAB" type="xs:integer" />
<xs:element name="TITLE" type="xs:string" />
xs:sequence>
xs:complexType>
xs:element>
xs:schema>
Het is niet mijn bedoeling in dit artikel uit te weiden over XML-schema’s en Word maar er is meer dan voldoende informatie hierover op MSDN te vinden. Ik stel deze pagina voor als startpunt: http://msdn.microsoft.com/office/understanding/xmloffice, en nog een interessante link is deze: http://msdn.microsoft.com/office/understanding/xmloffice/articles/default.aspx?pull=/library/en-us/dno2k3ta/html/odc_ofeditingxmlwordexcel.asp
Aangenomen dat we een document hebben dat een schema heeft en opgemaakt is kunnen we nu vanuit een VBA-macro code schrijven die ons component aanroept en de XML-elementen vult met data aangereikt door dbReader:
Sub Test()
Dim IXPServer
‘ Create object
Set IXPServer = CreateObject("TS_DBReader.Server")
‘ Get factory specifying file
Set IXPRecordsetFactory = IXPServer.IRecordsetFactory(-1, "DBFCDX", "C:\Cavo27a\comsdk\DBReader\TS_DBReaderTestFileCDX.DBF")
lShared = True
lReadOnly = False
‘ Open recordset and Cursor
Set IXPRecordset = IXPRecordsetFactory.IRecordsetEx(lShared, lReadOnly)
Set IXPCursor = IXPRecordset.ICursor
‘ Loop through all XMLNodes filling them
For i = 1 To ActiveDocument.XMLNodes.Count
ufield = ActiveDocument.XMLNodes.Item(i).BaseName
uvalue = IXPCursor.FieldValue(i)
ActiveDocument.XMLNodes.Item(i).Text = uvalue
Next i
End Sub
In een echt scenario zou je waarschijnlijk de Node-naam gebruiken om de veldnaam te identificeren (en uField gebruiken als parameter voor de aanroep van FeildValue), maar verder is dit ongeveer alle code die je nodig hebt. Ik heb dit hier niet gedaan omdat ik geen XSD voor TS_DBReaderTestFileCDX.DBF gemaakt had. Overigens wist je dat een schema maken, en je DBF naar XML converteren tegenwoordig standaard kan via de dfbViewer in de dbserver editor van VO? Dit vereist wel een correct MS-XML install, maar gezien gebruik van Office 2003 zal dat in principe al het geval zijn.
Conclusie
Dit is slechts één manier om te starten met de nieuwe MS-technologieen (in dit geval Office 2003/XML) zonder dat je je hele applicatie overnieuw hoeft te schrijven. Dit stelt je in staat snel in te spelen op behoeften die klanten mogelijk hebben om je apps te laten samenwerken met moderne applicaties als Office 2003 en om wat ervaring op te doen met XML-technieken, iets wat we het komende jaar meer en meer voorbij zullen zien komen. Het zorgt er bovendien voor dat je niet vastroest in je 32-bits omgeving en je alsvast geleidelijk aanpast aan de nieuwe generaties software die grotendeels XML en Schema gebaseerd zullen zijn.
Succes hiermee. Ik hoor graag jullie reacties en ervaringen,
Ed Richard
Lijst van files nodig voor TS_dbReader.Exe
TS_dbReader.TLB
VO27SYS.DLL (bij VO 2.7b)
VO27RUN.DLL ( ,, )
*.RDD based on what RDD’s you need to use
CPU27.DLL (installatie door COMSDK in \Cavo27\bin)