(C) 2005-2010 Ethea
Nella cartella Demos di Delphi è contenuta l'applicazione MastApp. L'applicazione è in grado di accedere tramite BDE a due database diversi, uno in formato Paradox e l'altro in formato InterBase. Questo documento intende elencare i passi necessari a convertire l'applicazione all'uso della tecnologia dbExpress attraverso InstantBDExpress. Anche se la conversione di applicazioni reali si presenta di norma più complessa, questo è comunque un esempio indicativo.
Le cose possono variare leggermente da una versione di Delphi all'altra.
Prima di procedere occorre verificare di aver installato nell'IDE di Delphi i componenti InstantBDExpress e di aver configurato in modo corretto l'alias di accesso al database MASTSQL attraverso InstantBDExpress Administrator. L'alias dovrebbe già essere presente nel file di configurazione IBDXConnections.ini, con questi valori:
[MASTSQL]
GetDriverFunc=getSQLDriverINTERBASE
LibraryName=dbexpint.dll
VendorLib=gds32.dll
Database=C:\Programmi\File comuni\Borland Shared\Data\MASTSQL.GDB
RoleName=RoleName
User_Name=sysdba
Password=masterkey
ServerCharSet=
SQLDialect=1
BlobSize=-1
CommitRetain=False
WaitOnLocks=True
ErrorResourceFile=
LocaleCode=0000
Interbase TransIsolation=ReadCommited
Trim Char=False
DriverName=Interbase
Verificate il percorso del database e provate ad effettuare la connessione.
Prima di procedere alla conversione dell'applicazione occorre fare pulizia e togliere il supporto a Paradox (se partite da MastApp per Delphi 2006 o successivo, alcune delle modifiche che proponiamo sono già state effettuate).
Dalla unit Main.pas:
Togliere la possibilità di selezionare il database Paradox o InterBase, eliminando le voci di menù ViewLocal e ViewRemote e i relativi event handler ViewLocalClick e ViewRemoteClick.
Togliere l'event handler ViewMenuClick che serve per verificare se il database remoto è disponibile.
Eliminare i metodi UpdateRSConnect e InitRSRUN (sono vecchie procedure per il supporto a ReportSmith).
Dalla unit DataMod.pas:
Togliere le routine DataDirectory, SetDatabaseAlias, UseLocalData, UseRemoteData.
Accertarsi che il valore della proprietà Database.AliasName sia MASTSQL, o MASTSQL30 per Delphi 2006.
Se partite dalla versione distribuita con Delphi 2006, spostate il codice presente nel metodo OrdersBeforePost e mettetelo in un event handler per Orders.BeforeInsert. Si tratta di una modifica errata introdotta in Delphi 2006 da Borland. La versione fornita con InstantBDExpress è già corretta.
Togliere la uses DbTables in tutte le unit tranne DataMod: sono uses che non servono effettivamente. La unit DbTables va eliminata dalle clausole uses di queste unit: Main, BRPARTS, EDPARTS, BrCstOrd, EDCUST, EDORDER, SrchDlg. A seconda della tecnica che sceglieremo di applicare nel seguito, questo passaggio potrebbe non essere necessario; tuttavia, eliminare dalle clausole uses le unit non effettivamente usate è comunque una buona pratica da seguire.
A questo punto abbiamo una applicazione BDE "pulita" che fa uso di componenti TQuery e TTable per accedere ai dati e di TDatabase per la connessione. Volendo procedere con la tecnica della unit interposer, leggete la prossima sezione; altrimenti saltatela e procedete con la successiva, che illustra l'approccio di sostituzione dei componenti.
Nota: a partire da Delphi 2009 occorre aggiungere ad una clausola uses dell'applicazione la unit relativa al driver DBExpress che usate. In questo caso, si può aggiungere DBXInterbase alla clausola uses della unit DataMod. Da Delphi 2010, si può anche optare per DBXFirebird in alternativa (a seconda di come avete definito la connessione MastSQL nel file di configurazione).
Come abbiamo visto nel documento Strategie di conversione, ci sono diversi modi alternativi per applicare questa tecnica.
La prima alternativa è quella che funziona meglio in questa particolare applicazione. Perché possano funzionare le opzioni 2 e 3, infatti, occorre ricompilare tutte le unit che usano DbTables. In questo caso (almeno con Delphi 7) si tratta delle unit DBLookup e QuickRpt. La prima può essere semplicemente rimossa dalle clausole uses in cui compare, dato che è solo un relitto del passato, mentre della seconda (la unit principale di Quick Reports) di solito non si ha il sorgente.
Quindi, applichiamo l'opzione 1 e avremo un'applicazione che usa il BDE a design time ma DBExpress a run time. Lanciamo l'applicazione per verificare che tutto continui a funzionare correttamente.
Questa tecnica prevede la sostituzione dei componenti BDE con componenti IBDX. Si tratta della soluzione più laboriosa, con modifiche effettuate manualmente per mostrare nei dettagli il procedimento.
Procediamo con la sostituzione dei componenti BDE con i relativi componenti InstantBDExpress.
1) Usare TIBDXDatabase al posto di TDatabase:
Aprire il data module DataMod, disconnettere il database (e di conseguenza tutte le Query e le Table) e selezionare il comando View as Text
Sostituire la classe TDatabase con TIBDXDatabase
Eliminare la proprietà Params.Strings
Salvare e confermare a Delphi di rinominare la classe anche nella unit .pas; Delphi lo farà automaticamente.
2) Usare TIBDXQuery e TIBDXTable
Sempre nel data module DataMod, selezionare View as Text
Search & Replace di TTable con TIBDXTable
Search & Replace di TQuery con TIBDXQuery (attenzione a non cambiare per sbaglio il nome dell'oggetto CustQuery)
Search & Replace di TFloatField con TIBDXFloatField
Search & Replace di TStringField con TIBDXStringField
Search & Replace di TBooleanField con TIBDXBooleanField
Search & Replace di TCurrencyField con TIBDXCurrencyField
Search & Replace di TDateTimeField con TIBDXDateTimeField
Search & Replace di TIntegerField con TIBDXIntegerField
Selezionare View as Form, salvare e confermare a Delphi di rinominare tutte le classi anche nella unit .pas
Nota: in realtà per questa applicazione non è necessario sostituire tutte le classi dei campi; basterebbe solamente la classe TIBDXDateTimeField, in quanto derivata da TSQLTimeStampField, che è il campo usato da dbExpress per le date. L'operazione serve a mostrare quali sono i passaggi da effettuare con altre applicazioni BDE. Inoltre i componenti TIBDXQuery e TIBDXTable creano dei campi di tipo TIBDX...Field, quindi è preferibile procedere in questo modo per omogeneità.
Il Search & Replace può anche essere affidato a GReplace, ma in questo caso banale si può operare anche a mano come descritto sopra.
Nella unit DataMod.pas occorre a questo punto eliminare tutti i riferimenti al BDE:
Togliere la uses DbTables dalla unit DataMod.pas
Volendo, si può aggiungere alla main form un'opzione per la connessione al database. Ora occorre lanciare l'applicazione e provare ad utilizzarla.
Se non riuscite a riprodurre tutti questi passi, sono disponibili nella cartella demos di IBDX due versioni dell'applicazione MastApp già convertite: nella cartella MastAppInterposer trovate un'applicazione convertita tramite la tecnica della unit interposer, e in MastAppIBDX una convertita mediante sostituzione di componenti. Questi esempi vi aiuteranno a confrontare il vostro lavoro e verificare che cosa non ha funzionato.