Datensatzorientierte Datenbankprogrammierung mit C++-Builder (Delphi)

Willemers Informatik-Ecke

Zugriff auf die Datenbankfelder

Der Zugriff erfolgt über die DataSet auf die Feldliste. Diese ist per Vererbung auch in TTable und TQuery vorhanden. Mit Table->Fields[0] wird das erste Feld zugegriffen. Im allgemeinen wird man es allerdings bevorzugen, den Feldnamen zu verwenden. Dabei gibt es zwei Varianten: FieldByName und FieldValues.

FieldByName

FieldByName ist eine Methode, die als Parameter den Feldnamen als String erwartet. Ihr Rückgabewert ist ein TField. Zum Auslesen muss eine Methode des Feldes verwendet werden, um die Umwandlung zum Zieltyp zu erreichen. Beispiel:

StringVar = Tabelle->FieldByName("Name")->AsString;

TField hat unter anderem folgende Member:

FieldNameName der Spalte
DataSizebenötigte Byte
DataTypeKonstante, die den Typ beschreibt
DataSetzeigt auf den DataSet, zu dem das Feld gehört
IsIndexFieldgibt an, ob aktueller Index dieses Feld enthält

FieldValues

Etwas eleganter ist der Zugriff über FieldValues.

StringVar = Tabelle->FieldValues["Name"];

Sequentielles Auslesen einer Tabelle

Das folgende Beispiel liest alle Datensätze der Tabelle Buchung und summiert die Beträge in der Variablen lSumme.

float lSumme=0.0;

    Buchung->First();
    while (!(Buchung->Eof)) {
        lSumme = lSumme + Buchung->FieldValues["Betrag"];
        Buchung->Next();
    }

Analog zur Methode First(), die auf den ersten Satz positioniert, gibt es die Methode Las(), die auf den letzten Satz geht. In diesem Fall würde statt Next() die Methode Prior() verwendet und das Ende der Schleife wäre nicht bei Eof, sondern bei Bof erreicht.

Suchen in einer Tabelle

GotoKey

Soll nach einem Schlüssel (key) gesucht werden, wird dazu der Record der Tabelle mit dem gesuchten Schlüssel belegt und anschließend GotoKey aufgerufen. Damit der Schlüssel im Recordbereich beschrieben werden kann muss vorher EditKey aufgerufen werden. Bei Tabellen mit mehreren Schlüsselfeldern werden alle Felder belegt. Das folgende Beispiel sucht in einer Tabelle, in der der Key aus den Spalten Key1 und Key2 zusammen gesetzt ist.

DB->Tabelle->EditKey();
DB->Tabelle->FieldValues["Key1"] = "Schluessel1";
DB->Tabelle->FieldValues["Key2"] = "Schluessel2";
DB->Tabelle->GotoKey();

FindNearest

Zum Suchen in einer Tabelle muss ein Index gesetzt werden. Dieser wird zunächst mit der Tabelle bei seiner Erstellung definiert. Hier können beliebig viele Sekundärindizes im Database Desktop angelegt werden. Jeder erhält dabei einen eindeutigen Namen. Im Programm wird dann eine (nicht sichtbare) Table-Komponente erzeugt. Jede Table-Komponente kann nur einen Index als Key verwenden, der in IndexName festgelegt wird. Im Programm wird mit der Funktion FindKey(TVarKey) oder FindNearest kann nach einem Begriff über diesen Schlüssel gesucht werden.

DB->Tabelle->FindNearest(ARRAYOFCONST((Search->Text)));

Damit wird in der Tabelle auf den Satz navigiert, der Search->Text am nächsten kommt. Das Makro ARRAYOFCONST braucht übrigens tatsächlich zwei Klammern.

Locate

Alternativ kann die Methode Locate der Klasse TDataSet verwendet werden. Sie ist sowohl auf TTable als auch auf TQuery anwendbar.

TLocatOptions SrchOpt;

    SrchOpt = loPartialKey;
    Adressen->Locate("Name", "Meier", SrchOpt);

Damit wird aus der Tabelle Adressen auf den ersten Datensatz positioniert, dessen Name mit Meier beginnt.

vgl.: Wiehland (Hrsg): Borland C++ Builder Das Buch. tewi-Verlag, München, 1998. S.590-591

Schreiben in eine Tabelle

Das Einfügen eines Satzes in eine Tabelle erfolgt in drei Schritten. Zunächst wird ein Leersatz mit Insert eingefügt. Dann werden die Felder des Satzes gefüllt und dann der Satz mit Aufruf von Post() in die Tabelle geschrieben:

TTable *Tab;

    Tab->Insert();
    Tab->FieldValues["NAME"] = EditText->Text;
    Tab->Post();

Soll statt einen neuen Satz an der aktuellen Stelle eingefügt zu werden, nur der aktuelle Satz geändert werden, wird statt Tab->Insert() der Aufruf Tab->Edit() verwendet. Tab->Append() statt Tab->Insert() hängt den neuen Satz am Ende der Tabelle an.

Filter

Sollen nicht alle Zeilen einer Tabelle angezeigt werden, sondern nur ein bestimmter Bereich, kann man Filter einsetzen. Zu diesem Zweck werden vor allem die Eigenschaften von TTable Filter und Filtered eingesetzt.

Beispielsweise sollen alle Buchungen, die einen bestimmten Kunden betreffen angezeigt werden. Dieser Kunde habe die Kundenkennung AW12345. Durch Setzen der Eigenschaft Filter wird die Bedingung beschrieben. Dabei entspricht der Syntax in etwa einer WHERE-Klausel eines SQL-Befehls.

KdNr = 'AW12345'

Aktiv wird der Filter, sobald die Eigenschaft Filtered auf true gesetzt wird. Für obiges Beispiel heiße die TTable Buchung:

Buchung->Filter = "KdNr = 'AW12345'";
Buchung->Filtered = true;

Besonders interessant wird es, wenn die abzufragende Kundennummer zur Programmlaufzeit bestimmt werden kann. Im folgenden Beispiel steht in der Variablen strKunde vom Typ AnsiString die Kundenkennung:

Buchung->Filter = "KdNr = '" + strKunde + "'";
Buchung->Filtered = true;


Homepage (C) Copyright 2003 Arnold Willemer