Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Brauche Ideen für flexiblen/modularen Programmteil (https://www.delphipraxis.net/166054-brauche-ideen-fuer-flexiblen-modularen-programmteil.html)

Aphton 27. Jan 2012 16:28

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;

Furtbichler 29. Jan 2012 10:13

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.

Sir Rufo 29. Jan 2012 12:20

AW: Brauche Ideen für flexiblen/modularen Programmteil
 
Jede der genannten Datenquellen kann quasi direkt in ein DataSet überführet werden.
Code:
............ Orcacle DB -> ??? -> DataSet
............ Orcacle DB -> ADO -> DataSet
.................. LDAP -> ADO -> DataSet
...... lokale CSV-Datei -> ADO -> DataSet
FTP -> lokale CSV-Datei -> ADO -> DataSet
Dieses wäre dann der Extract-Teil, der Rest sollte dann eigentlich Spaziergang sein :)

jobo 29. Jan 2012 18:33

AW: Brauche Ideen für flexiblen/modularen Programmteil
 
Zitat:

Zitat von Furtbichler (Beitrag 1148114)
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.

Apropos ETL und Oracle:
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.

Jumpy 31. Jan 2012 11:02

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.
Seite 2 von 2     12   

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