How To Use Aurelius – 20.02.2017 – Frankfurt

Ob einfache 2-schichtige Desktopanwendungen oder komplexere 3-schichtige Architekturen, den meisten Anwendungen im Delphi-Umfeld ist gemein, dass sie auf ganz traditionelle Art und Weise auf die Daten zugreifen. Angefangen hat es vor vielen Jahren mit der BDE und oftmals Paradox. Die BDE ist auch heute noch in einigen Anwendungen zu finden, die Datenbanken zumindest haben sich jedoch in den allermeisten Fällen zur „richtigen“ DBMSen wie MS SQL, Oracle, Firebird usw. entwickelt. Der Zugriff auf diese Datenbanken erfolgt jedoch immer noch – egal ob per BDE oder ganz „modern“ per FireDAC – mit Tabellen, Abfragen und ganz viel SQL.

Wer kennt es nicht? Man muss im Programm Informationen zur letzen Rechnung eines bestimmten Kunden anzeigen und schon geht es los:

Query1.SQL.Text := 'select RG.Rechnungsnummer, RG.Datum, RG.Kundennummer, KD.Name, KD.Anschrift' +
'from Rechnungen RG, Kunden KD' +
'where KD.Kundennummer = RG.Kundennummer' +
'and RG.Kundennummer = :Kundennummer';

Query1.ParamByName('Kundennummer').AsInteger := 4711;  
Query1.Open; 

LRGNummer := Query1.FieldByName('Rechnungsnummer').AsString; 
LabelRGNnummer := LRGNummer.ToString;
LabelRGDatum := Query1.FieldByName('Rechnungsdatum').AsString; 
LabelRGKDName := Query1.FieldByName('Name').AsString; 
Query1.Close;

Query1.SQL.Text := 'select PosNr, Beschreibung, Menge, EP from Positionen' +
'from RGPositionen' +
'where Rechnungsnummer = :Rechnungsnummer';
Query1.ParamByName('Rechnungsnummer').AsInteger := LRGNummer;
Query1.Open;

while not Query1.EOF do begin
  List1.Items.Add(Format(Pos %d : %d, [Query1.FieldByName('PosNr'), Query1.FieldByName('Menge').AsInteger * Query1.FieldByName('EP').AsInteger ]));
  Query1.Next;
end;
Query1.Close;

Wir haben zwar schon in vielen Veranstaltungen erlebt, wie der Vortragende ganz wunderbar mit Klassen, also TKunde, TRechnung und TRechnungsPosition gearbeitet hat, um uns all die tollen Vorzüge der Objekt-orientierten Programmierung näher zu bringen, allerdings wurde dabei meist unterschlagen, wie denn diese Klassen ihre Inhalte aus einer Datenbank beziehen können. Allenfalls wurde in einer „Dataabstraktionsschicht“ genau so ein wüster SQL Code wie oben gezeigt.

Die Arbeit mit Business-Objekten und deren Verbindung in die Datenbank sollte schlichtweg einfacher und übersichtlicher funktionieren. Genau dazu dienen Objekt-relationale Mapper, auch ORM genannt.

In anderen Entwicklungswelten, wie zum Beispiel Java oder .NET existieren u.a. mit Hibernate und Entity Framework sehr leistungsfähige ORMs. In Delphi gibt es ORMs zwar auch schon seit einiger Zeit, aber die Projekte stecken entweder noch in den Kinderschuhen oder bieten nicht wirklich die Möglichkeiten, die für einen sinnvollen Einsatz notwendig wären.

Im kommerziellen Delphi-Umfeld gibt es mit Aurelius (TMS) sowie EntityDAC (DevArt) mittlerweile zwei ausgewachsene Lösungen. Da Aurelius sich bereits in einigen unserer Kundenprojekte, sowohl im Desktop- als auch im mobilen Bereich bewährt hat, möchte ich Ihnen in diesem Seminar die praktische Nutzung von Aurelius beibringen. Nach dem Seminar werden Sie in der Lage sein, folgenden Code in Ihrer Anwendung zu nutzen:

LRechnung := LKunde.Rechnungen.OrderBy('Datum', false).First;

LabelRGNnummer :=LRechnung.Rechnungsnummer.ToString;
LabelRGDatum := LRechnung.Rechnungsdatum.ToString; 
LabelRGKDName := LKunde.Name.ToString; 

for LPosition in LRechnung.Positionen do begin
  List1.Items.Add(Format('Pos %d : %d', [LPosition.PosNr, LPosition.GesamtPreis]);
end;

Wir werden dazu im Seminar eine komplette Anwendung entwickeln, die die Daten per Aurelius an Objekte bindet und alle typischen Operationen (Abfrage, Einfügen, Löschen) auf einfache objektorientierte Art unterstützen wird.

Alle Teilnehmer des Seminars erhalten eine kostenlose, unbegrenzt nutzbare Aurelius-Lizenz für den direkt Einsatz in eigenen Projekten.

Eventbrite - HowToUse-Day für TMS Aurelius