AW: Brauche Ideen für flexiblen/modularen Programmteil
Delphi-Quellcode:
TDatenSammlerClass = class of TDatenSammler;
TDatenSammler = class public procedure LoadFromFile(const AFilename: String); virtual; abstract; procedure SaveToTable(const ATable: TTable); virtual; abstract; end; TCSVImporter = class(TDatenSammler) public procedure LoadFromFile(const AFilename: String); override; procedure SaveToTable(const ATable: TTable); override; end; // #1 für weitere Formate - dementsprechende Klasse implementieren (von TDatenSammler ableiten) (...) implementation type TDatenSammlerExtAssoc = record Ext: String; _Class: TDatenSammlerClass; end; const DatenSammlerExtAssoc: Array[0..{anzahl der Datenformate - 1}] of TDatenSammlerExtAssoc = ((Ext: '.csv'; _Class: TCSVImporter), {...}); // #2 Wichtig: hier ^ registrieren function GetDatenSammlerClassFromExt(const AExt: String): TDatenSammlerClass; var i: Integer; begin for i := 0 to High(DatenSammlerExtAssoc) do with DatenSammlerExtAssoc[i] do if Ext = AExt then begin Result := _Class; break; end; end; {...später im Programm} var ldr: TDatenSammler; begin ldr := GetDatenSammlerClassFromExt(ExtractFileExt(Filename)).Create; ldr.LoadFromFile(Filename); ldr.SaveToTable(MyTable); ldr.Free; end; |
AW: Brauche Ideen für flexiblen/modularen Programmteil
Was Du da bauen sollst, nennt sich ETL-Prozess. Googel mal danach, es gibt auch einige Freeware ETL Tools. benetl z.B. ist für mysql und postgres. Schau dir die mal an, vielleicht bekommst Du Denkanstöße.
Wie DeddyH schon erwähnt hat, ist das ein gutes Beispiel für den sinnvollen Einsatz eines Interfaces. |
AW: Brauche Ideen für flexiblen/modularen Programmteil
Jede der genannten Datenquellen kann quasi direkt in ein DataSet überführet werden.
Code:
Dieses wäre dann der Extract-Teil, der Rest sollte dann eigentlich Spaziergang sein :)
............ Orcacle DB -> ??? -> DataSet
............ Orcacle DB -> ADO -> DataSet .................. LDAP -> ADO -> DataSet ...... lokale CSV-Datei -> ADO -> DataSet FTP -> lokale CSV-Datei -> ADO -> DataSet |
AW: Brauche Ideen für flexiblen/modularen Programmteil
Zitat:
Wenn Du hier über Prozesse sprichst, die große Datenmengen bewegen und Oracle als Ziel fix ist, denk doch noch mal darüber nach, ob sich eine direkte Durchführung der Ladeprozesse in Oracle nicht lohnen würde. Dein Programm würde sie dann nur starten. Ohne Oracle zu hypen: sobald der Prozess nativ auf dem Zielsystem (welches auch immer), also mehr oder weniger mit Bordmitteln oder hauseigenen Tools durchgeführt wird, hast Du maximale Performance und vermutlich auch Robustheit. |
AW: Brauche Ideen für flexiblen/modularen Programmteil
@all:
Erstmal danke für die rege Beteiligung. Komme wg. WE erst jetzt zum Antorten. Und das auch nur kurz, weil ich eure Anregungen/Links erstmal nur überflogen habe und mir das alles nochmal gründlich durchlesen will. @jobo & Furtbichler: ETL als Stichwort für den Vorgang ist sehr passend und ähnlich. Nur was die Datenmenge usw. angeht, wird das bei mir glaub ich nur der "kleine Bruder" von ETL :) (z.Zt. vllt. 2000 Datensätze aus allen momentanen Quellen (4), recht einheitliche Struktur, nur im kleinen müssen Formatanpassungen vorgenommen werden) @Aphton: Ich hab noch nicht alle Details deines Beispiels verstanden, aber das sieht schon sehr interessant aus. So wie ich die Konstruktion verstanden habe, kann ich über einen String (der wer weiß voher kommen kann, z.B. Parameter) festlegen, welche Klasse ich jetzt brauche. Wenn ich ein Datensammlerklasse mehrmals brauchen will müsste ich dann in dem Teil "später im Programm" sowas einbauen, wie "if GetDatenSammlerClassFromExt('blub') is nil then GetDatenSammlerClassFromExt('blub').Create" Sprich wenn erstmalig gebraucht, neu erzeugen, sonst wiederverwenden? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz