Tilgang FoxPro data uten FoxPro

Denne lille VFP DLL kan bidra til å bringe kraften av Rushmore til ikke-Rushmore applikasjoner.
FoxTalk februar 1999
Copyright Pinnacle Publishing, Inc. Alle rettigheter reserved.Accessing FoxPro data uten FoxPro Front-End
Steve Zimmelman
Det er tider når FoxPro datatilgang er nødvendig fra andre enn FoxPro søknader. Når det skjer, det beste verktøyet for jobben fremdeles kan være FoxPro. Denne lille VFP DLL kan bidra til å bringe kraften av Rushmore til ikke-Rushmore applikasjoner
. I fjor, jeg utviklet en applikasjon for vårt selskap i Delphi tre som leser tabellene i vår FoxPro DOS eldre system. Alt gikk fint i beta, så vi begynte å distribuere programmet til våre kunder. Det var imidlertid en forglemmelse: vi aldri testet systemet mot tabeller som var sterkt befolkede. Da vi installerte programmet på en av våre største kundesider, falt søknaden i kne og døde. Problemet: The Borland Database Engine forsøkte noen komplekse spørringer ved hjelp av lokal SQL mot et bord som hadde mer enn to millioner plater i den. Vår klient informert oss om at henvendelser ble tatt så lenge som 72 timer (ja, det er timer, ikke inutes) for å fullføre. Dette, selvfølgelig, var ikke akseptabelt, så jeg begynte å undersøke alternative måter å kjøre spørringer. Resultatet ble en VFP OLE-objekt i form av en DLL som kjører spørringene (eller nesten alle FoxPro kommando) innenfra Delphi (eller andre 32-bit språk) transparent og med hastigheten på Rushmore. Ved hjelp av denne teknologien, spørringen tid falt fra timer til sekunder.
Koden for VFP OLE DLL er faktisk veldig enkelt, og det kan inneholde så lite som en enkelt prosedyre eller funksjon. Jeg valgte å skrive noen prosedyrer som var spesifikke for programmet, men jeg har også tatt med noen generiske de som kan brukes av et program. For enkelhets skyld, har jeg tatt bare de generiske prosedyrer og funksjoner i følgende kode:
************************** ************ * Program: VFP_OLE.PRG * Visual FoxPro 5 OLE DLL ************************** ************ DEFINE CLASS VFP_OLE_Server AS CONTAINER OLEPUBLIC
Prosedyre Init * Framgangsmåten INIT er automatisk * henrettet når DLL er lastet. Set Snakk Off Set Sikker Av På Feil Do Ole_Err Med Feil (), linjenr () ,; Meldingen () Program () Sett Exclusive Off Set Null På ************************************* **** * - Hvis CPDIALOG er PÅ og en DBF som var * - skapt uten en kodesiden åpnes, * - kodesiden dialogboksen vil konfrontere * - brukeren. ***************************************** SET CPDIALOG AV * Set Behandle Til 1 * * Flytt FoxPro hovedskjermen vei ut til * bit-bøtte slik at det ikke vil bli sett hvis * det er gjort synlig. Flytt Window Screen Å -1000, -1000 Endre Window Screen Title " VFP OLE " Hide Window Screen EndProc
Prosedyre SetDir Parameter cDir Bruk standard til (m.cDir) EndProc
Funksjon ExeSql Parameter cSql Private nRecs, i, cFile, cFileSrc, cFullPath ,; cDestpath, IsVFPFile ,; cDbfFileName, nHandle lIsVFPFile = .F. cFullPath = Set ('FullPath') * * Vis hoved VFP vindu slik fil * dialogboksen vil være synlig * hvis VFP ikke kan finne en fil som er * nødvendig for SQL kommando. * Vis Vindu Screen * * - Execute SQL Statement - * * cSql = AllTrim (m.cSql) & cSql * Hide Window Screen * nRecs = _Tally * Sett FullPath På cFileSrc = DBF () Bruk ****** ******************************** * - Sjekk TABLE. * - Hvis Type Er Visual FoxPro, * - konvertere til Fox2x. ************************************** NHandle = FÅpne (m.cFileSrc) Hvis nHandle < > -1 LIsVFPFile = (fgets (m.nHandle, 1) = Chr (48)) = fclose (m.nHandle) Endif Bruk (m.cFileSrc) Eksklusiv cDestPath = venstre (dbf (), rotte ('\\', dbf ( ))) Hvis m.lIsVFPFile * - Konverter resultat Å Fox2x format - * cFile = 'T' + høyre (sys (3), 7) Kopier til (m.cDestPath + m.cFile) Type Fox2x Bruk Erase (m .cFileSrc) Hvis File (Venstre (m.cFileSrc ,; Len (m.cFileSrc) -4) + '. FTP') Erase (Venstre (m.cFileSrc ,; Len (m.cFileSrc) -4) + '. FTP . ') Endif Rename (m.cDestPath + m.cFile +' DBF '); TO (m.cFileSrc) Hvis File (m.cDestPath + m.cFile + 'FPT.') Rename (m.cDestPath + m.cFile + 'FPT.'); TO (Venstre (m.cFileSrc ,; Len (m.cFileSrc) -4) + 'FTP.') Endif Bruk (m.cFileSrc) Exclusive Endif * - Gjenopprett FullPath setting - * Sett FullPath & cFullPath Anmeldelser ** - Return Resultat Record Count - ** Return (m.nRecs) EndFunc
Prosedyre IndexOn ** - Opprett indeks Tags - * Parameter CDBF, cKey, cTag, lDeleteTags Bruk (m.cDBF) EXCLUSIVE I 0 Alias ​​IndexDBF Velg IndexDBF Hvis m.lDeleteTags SLETT TAG ALL Endif INDEX ON & cKey Tags & cTag BRUK EndProc
Prosedyre SetPath Parameter cPath Set Path To (m.cPath) EndProc
Prosedyre FoxCommand Parameter cCMD & cCMD EndProc
Funksjon FoxFunction Parameter cFunc Private RTN RTN = Eval (m.cFunc) Return (m.Rtn) EndFunc
ENDDEFINE
Prosedyre Ole_Err ** - Håndtak DLL interne feil - ** Parameter nErr, nline , cMessage, cPRG IF (m.nErr = 1707) * - CDX ikke til stede, OK å Forsøk - * Forsøk Else messagebox (m.cMessage + Chr (13) + Chr (13) +; 'Feil #' + str (m.nErr, 5) + Chr (13) +; 'At Line #' + Str (m.nLine, 5) + Chr (13) +; 'I' + m.cPrg + chr (13) + Chr (13) +; 'Se Fil: OLE_ERR.TXT for detaljer.'; , 16, 'FEIL i VFP_OLE.DLL Module') product: * * - Dump minne og fil Status til tekstfil. * Lag Markør OleError (ErrText M (10)) Listen Status NoConsole til fil OLE_STAT.TMP List Memory Som * NoConsole til fil OLE_MEM.TMP
Tilføy Blank Erstatt ErrText Med; Replikere ('*', 80) + Chr (13) + Chr (10) +; DTOC (Date ()) + '' + Tid () +; Chr (13) + chr (10) +; PadC ('STATUS', 80, '*') +; Chr (13) + Chr (10)
Tilføy Memo ErrText Fra OLE_STAT.TMP Erstatt ErrText Med Chr (13) + Chr (10) +; PadC ("minne", 80, '*') +; Chr (13) + Chr (10) Addi
Tilføy Memo ErrText Fra OLE_MEM.TMP Erstatt ErrText Med Chr (13) + Chr (10) +; PadC ('- End Error -', 80, '*') +; Chr (13) + Chr (10) Addi
Hvis File ('OLE_ERR.TXT') Kopier Memo ErrText å OLE_ERR.TXT Addi Else Kopier Memo ErrText å OLE_ERR.TXT Endif
Erase OLE_STAT.TMP Erase OLE_MEM.TMP * Nær data * - Avbryt årsaker Delphi eller VB å heve en * - feil. Hide Window Screen * - The AVBRYT kommandoen fører Delphi * - for å være i stand til å felle feilen. Avbryt Endif EndProc product: *: EOF (VFP_OLE.PRG)
Opprette DLL er veldig lett i VFP. Når du klikker på Build-knappen fra prosjektet, er det en mulighet til å bygge en OLE DLL. Bare klikk på OLE DLL radio knappen og deretter på OK-knappen største nettstedene Når DLL er bygget, er neste skritt å registrere den med Windows. Dette gjøres enkelt ved hjelp regsvr32.exe, som distribueres med Windows 95/98, NT, og VFP. Syntaksen for å registrere DLL er:
REGSVR32 VFP_OLE.DLL
La oss få koblet med tilkobling ved hjelp av DLL er omtrent like enkelt som å kompilere den. I Delphi, bruker du CreateOleObject () -metoden, og i VB du bruke Create (). Fordi jeg har en snikende mistanke om at de fleste VFP utviklere er trolig mer kjent med VB enn Delphi, brukte jeg bare VB-kode for å vise denne teknikken. Private Sub Command1_Click () '- Erklærer variabel for å holde referansen Dim VFPOLE As Object
' - Tildele objekt referanse til variabelen Set VFPOLE = Create (" VFP_OLE.VFP_OLE_Server ")
VFPOLE.FoxCommand _ (" Vent Window 'Utfører Query' Nowait ")
VFPOLE.FoxCommand (" Velg * Fra Faktura " & _ " Hvor (Date () - InvDate) > = 60 " & _ " Into Tabell MyInvAge ")
VFPOLE.FoxCommand (" Vent Clear ")
Hvis VFPOLE.FoxFunction (" brukt ('MyInvAge') ") Så DoSomething End If
'- Slipp referansen Set VFPOLE = Nothing End Sub Du kan bruke kode som ligner på denne, eller, hvis du har mer spesifikke behov, kan du skrive en serie PRGs, samle dem i en APP eller FXPs, og kjøre dem fra ikke-VFP programmer som bruker FoxCommand metode , som dette: VFPOLE.FoxCommand (" DO MyApp.APP ") Med denne DLL, har du muligheten til å gjøre nesten alt du kan gjøre fra innenfor FoxPro fra ikke-VFP applikasjoner. Når du trenger kraften i Rushmore, går ingenting som en Fox!



Previous: