COMSDK als basis voor toegang tot uw VO- databases vanuit Office2003

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)

 

Commentaar van anderen:
ChristianLouboutin op 14-8-2010 om 11:25
Christian Louboutin Shoes, Christian Louboutin, Christian Louboutin Shoes, Wedding Shoes, Christian Louboutin Copyright 2010, Chemicals Chemistry via VerticalNews. Christian Louboutin Shoes, Wedding Shoes Pattinson great actorly virtue is that he wears clothes well, so it too bad he slackered-out in cargo pants here. Christian Louboutin, Christian Louboutin Shoes, Wedding Shoes, Discount Christian Louboutin, Manolo Blahnik Shoes Tyler is less revealed than telegraphed through accessories a dead brother depth, a pack-a-day habit angst, a bookstore job smart, Discount Christian Louboutin, Louboutin, Christian Louboutin Sale, Louboutin Shoes, Sale Christian Louboutin Rodita zip sandals New style Black 14 a rich, aloof, and permanently disappointed daddy Pierce Brosnan. Louboutin Sale, Herve Leger Bandage Dress, Herve Leger Dress, Herve Leger V Neck Dress, Herve Leger Bandage Dress Falling for You Love, angst, and something else is in the air in Remember Me Remember Me Herve Leger Dress, Chanel Shoes, Yves Saint Laurent Shoes, Manolo Blahnik Shoes Platform Cage Sandal 13 by Allen Coulter Summit Entertainment Opens March 12 Putatively a new romance starring Robert Pattinson, Remember Me begins like a vigilante movie Alexander Wang Shoes, Louboutin Shoes, Louboutin Sale, Louboutin, Christian Louboutin Sale, Buy Christian Louboutin A Brooklyn subway platform, a racially charged stickup girl watches her mother get shot. Christian, Christian Louboutin Discount, Christian Dior Shoes, Christian Louboutin Pumps Pattinson great actorly virtue is that he wears clothes well, so it too bad he slackered-out in cargo pants here.
Geef feedback:

CAPTCHA image
Vul de bovenstaande code hieronder in
Verzend Commentaar