Har fået til opgavet at opgradere et delphi program baseret på en paradox database til noget mere fleksibilt, dvs. at kunderne storset selv skal kunne vælge hvilken database de vil benytte. Idag består systemet af 3-4 datamoduler med x-antal ttable og tqueries og et til svarende antal datasources. Derudover ligger der en del ttables spredt rundt omkring på de forskelige forms og på en del quickreports. Har et par ideer til hvordan det kan løses, men om de vil kunne lade sig gøre i praksis ved jeg ikke, så det jeg er ude efter er en diskussion/foreslag til hvordan man kan løse problemet!
Under alle omstændigheder skulle hele databasen nok strømlignes således den blev kompatibel med flest mulige databaser, bl.a. skulle booleans laves om til char(1).
Min første ide går ud på at man bibeholder bde'en så vil man skulle alle datasets igennem og ændre boolfields til char + at man nok skal ændre på tablename da de fra paradox har .db endelsen.
Min anden ide får ud på at man lave x antal nye datamoduler for de forskellige database typer, ADO, Interbase, Flashfiler osv. og så lave en procedure som skifter datasourcen til de tabbeller som ligger på det valgte datamodul, incl. felt definitoner.
Jeg har meget lidt erfaring med databaser, men kan da anbefale dig at låne Delphi 4 Programmering af Per Amdal Steffensen på biblioteket. Der er to afsnit om databaser i den. Samtidig er den godt skrevet og på dansk!
Ellers kan du lave et array af en record-type... På den måde kan du faktisk opbygge din egen database! :)
Det smarte ved det er nemlig at du med delphi kan lave følgende:
type TPlydsHesteRecord = record //Min record-type med nogle forskellige variabler Ja: Boolean; Nej: Boolean; Hest: Integer; HesteMule: TPoint; HesteHale: String[200]; end; end;
procedure SkrivFil; var F: File of TPlydsHesteRecord; //filen som skal være vores database A: array [0..99] of TPlydsHesteRecord; //det array af filer databasefilen skal fyldes op med I: Integer; //Tællevariabel begin try //Hvis der sker en fejl skal vi fange den AssignFile(F, ExtractFilePath(Application.ExeName) + 'MinHesteDB.hst'); //Angiver stien som databasen skal ligge i og sætter den til variablen Rewrite(F); //Skriver en ny fil og før den klar til at blive skrevet i for I := Low(A) to High(A) do //Fra array start til array slut Write(F, A[I]); //skriver array-index I i filen F finally //Til sidst (selv om der er sket fejl) CloseFile(F); //Filen lukkes og der kan ikke skrives til den før den åbnes næste gang end; end;
Når den så skal læses ind igen, her vil jeg ikke kommentere ting som er kommenteret en gang:
procedure LaesFil; var F: File of TPlydsHesteRecord; A: array [0..99] of TPlydsHesteRecord; begin try AssignFile(F, ExtractFilePath(Application.ExeName) + 'MinHesteDB.hst'); FileMode := 0; //Gør at vi kun får læse-tilladelse til filen Reset(F); //Gør filen klar til læsning while not Eof(F) do //Mens vi ikke er i slutningen af filen, gør Read(F, A[I]); //Læser en TPlydsHestRecord ind i A[I] fra filen finally CloseFile(F); end; end;
Jeg har styr på både delphi og databaser. Det jeg efterlyser er nogle smarte metoder hvis disse eksistere til at konverterer en ældre applikations database til noget nyere.
Del programmet op i nogle veldefineret lag(Grænse,Funk,Model) og definere de objekter som er i systemet. Nu kender jeg ikke systemet, men man kunne forestille sig at der var kunde,mearbejder og varekartotek eksempelvis. Så deler man det op så at skærmflader ligger i grænsefladen, beregninger som dækker over flere tabeller i funktionslaget og selve database kommunikationen ligger i modellaget som kunne være implementeret som en DLL fil, så kan man nøjes med at skifte dll filen ud.
Hvis du vil have det overstået det på en nem måde. så kan du oprette nogle forskellige datamoduler - men det kræver så at recompilere programmet når man ønsker at skifte database - ellers skal man kunne læse indstillinger fra en inifil.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.