Kürzel für FieldByName
In TDataset findet sich die Funktion FieldByName, mit der man ein Datenfeld (TField) über seine Bezeichnung ansprechen kann. Oft nutzt man nun das Konstrukt
lVariable := dataset.FieldByName('feldname').AsString;
Damit sucht man das Datenfeld feldname im aktuellen Datensatz und greift auf seinen Wert als String zu. Mit den Funktionen von IhsDataset lässt sich dies in kürzerer Form darstellen:
lVariable := idataset.AsS('feldname');
Für die am häufigsten verwendeten Datentypen gibt es folgende Funktionen:
function AsB(const mFieldname: string): Boolean; overload;
function AsC(const mFieldname: string): currency; overload;
function AsDT(const mFieldname: string): TDateTime; overload;
function AsI(const mFieldname: string): Int64; overload;
function AsS(const mFieldname: string): string; overload;
function AsV(const mFieldname: string): Variant; overload;
Dazu kommen ein paar Ergänzungen, die für Spezialfälle die Behandlung vereinfachen:
function AsBT(const mFieldname: string; mTrue: Integer): Boolean; overload;
Die Funktion geht davon aus, dass mFieldname auf ein Integer-Feld verweist. Der Wert mTrue definiert, welcher Integerwert als True angesehen wird. Alle anderen Werte sind False.
function AsBF(const mFieldname: string; mFalse: Integer): Boolean; overload;
Entsprechend kann man mit dieser Funktion den Integerwert für False definieren. Alle anderen Werte gelte dann als True.
function AsDTFmt(const mFieldname: string; const mFmt: string): string;
Diese Funktion übernimmt aus einem Feld einen DateTime-Wert, der dann über den Formatstring (formatDateTime) zu einem String formatiert wird.
function AsIB(const mFieldname: string; mTrueValue: Integer = 1): Boolean;
Will man nun mehrere Feld-Wert-Zusweisungen in einer Anweisung erledigen, kann man die folgenden Funktionen verwenden. Damit sind etwa Konstruktionen möglich in der Art:
iDataset.AsI('id', local_id).AsS('caption', caption_var);
Die Variablen local_id und caption_var sind nach diesem Aufruf mit den entsprechenden Werten aus dem Datensatz belegt.
ACHTUNG: es ist dabei zu beachten, dass die Zuweisungen von var-Parametern leider in Delphi nicht unbedingt in der Reihenfolge geschehen, wie man sie erwarten könnte. Der Compiler macht gerade in der Form des Fluent Interfaces hier Unvorhergesehenes. Dies sollte man bedenken, da eine Zeile wie
iDataset.AsI('id', lcoal_id).Locate('key', local_id);
nicht oder nicht zuverlässig zum gewünschten Ergebnis führen. An dieser Stelle muss man den Umweg über eine lokale Variable gehen:
lDS := hsDS;
lDS.AsI('id', local_id);
lDS.Locate('key', local_id);
Verwendet man hier das Fluent Interface nicht, funktionieren diese Konstrukte wie erwartet. Folgende überladene Funktionen stehen zur Verfügung:
function AsB(const mFieldname: string; out mValue: Boolean): IhsDataset; overload;
function AsC(const mFieldname: string; out mValue: currency): IhsDataset; overload;
function AsDT(const mFieldname: string; out mValue: TDateTime): IhsDataset; overload;
function AsI(const mFieldname: string; out mValue: Int64): IhsDataset; overload;
function AsI(const mFieldname: string; out mValue: Integer): IhsDataset; overload;
function AsS(const mFieldname: string; out mValue: string): IhsDataset; overload;
function AsV(const mFieldname: string; out mValue: Variant): IhsDataset; overload;
Braucht man auch noch einen Defaultwert für die Rückgabe, gibt es eine Gruppe weiterer Funktionen in der Art "As[Datentyp]Def". Das ist besonders hilfreich, wenn man sich nicht sicher ist, ob das Dataset den gewünschten Feldnamen auch wirklich beinhaltet. Ist das Feld nicht vorhanden, wird der Default-Wert zurückgegeben, ansonsten der entsprechende Wert des Datensatzes.
function AsBDef(const mFieldname: string; mValue: Boolean): Boolean;
function AsCDef(const mFieldname: string; mValue: currency): Currency;
function AsDTDef(const mFieldname: string; mValue: TDateTime): TDateTime;
function AsIDef(const mFieldname: string; mValue: Integer): Integer; overload;
function AsIDef(const mFieldname: string; mValue: Int64): Int64; overload;
function AsSDef(const mFieldname: string; mValue: string): string;
function AsVDef(const mFieldname: string; mValue: Variant): Variant;