Home » Tutorials » Datenbanken » Datenbanken für Fortgeschrittene

Datenbanken für Fortgeschrittene

Zugriff auf Felder

Das Thema Oberfläche wollen wir nun nicht weiter vertiefen; es ging nur um die Demonstration der DBLookupCombobox, die in diesem Zusammenhang sehr nützliche Dienste leistet.
Wenden wir uns nun dem Programmcode zu: Wie kann ich auf die Daten in den Tabellen zugreifen, ohne visuelle Komponenten bemühen zu müssen?
Für solche Fälle ist TTable mit hilfreichen Methoden und Eigenschaften ausgestattet.

Ersatz für DBNavigator

Für jeden der Buttons des DBNavigators gibt es eine Methode:

 table1.first;    //Springt zum ersten Datensatz
  table1.prior;    //zum vorigen Datensatz
  table1.next;     //zum nächsten Datensatz
  table1.last;     //zum letzten Datensatz
  table1.edit;     //wechselt in den Editiermodus
  table1.post;     //speichert Änderungen am aktuellen Datensatz
  table1.refresh;  //lädt die Daten erneut

Zugriff auf die Daten

Eine Table steht immer auf einem einzelnen Datensatz. Über

nummer := Table1.RecNo;

lässt sich die Nummer des aktiven Datensatzes ermitteln. Die Gesamtzahl der Datensätze erhält man über

anzahl := Table1.RecordCount;

Zum Zugriff auf die Daten des aktiven Datensatzes gibt es nun mehrere Möglichkeiten. Die einfachere ist folgende:

Table1.FieldByName('Feldname').AsString;

Statt ‚Feldname‘ muss der Name des Datenfeldes angegeben werden. Und statt AsString gibt es auch AsInteger usw. Hier wird der Typ angegeben, in den der Wert umgewandelt werden soll. Ist in dem Feld eine Zahl gespeichert, kann man sie über AsString und über AsInteger auslesen. Bei einem String, der Buchstaben enthält, führt AsInteger dagegen zwangsläufig zu einem Fehler.
Wollen wir beispielsweise aus der Tabelle Lager, die gerade auf dem ersten Datensatz steht, den Wert von „Ort“ auslesen und in Label1 anzeigen, geht das so:

Label1.Caption := Table3.FieldByName('Ort').AsString;

Nun stellt sich natürlich die Frage, wie ich einen bestimmten Datensatz in der Tabelle finde. Das folgt in einem extra Abschnitt.
Die zweite Möglichkeit zum Zugriff auf die Daten sieht so aus:
Bei Doppelklick auf eine Table-Komponente öffnet sich ein kleines Fenster.

Klickt man hier mit der rechten Maustaste und wählt „Alle Felder hinzufügen“, erhält man bei der Tabelle „ArtikelAnzahl“ nebenstehend abgebildetes Fenster. Jedes einzelne Datenfeld ist nun als eigenes Objekt der Klasse TField (bzw. deren Nachkommen wie TStringField, TSmallIntField usw.) vorhanden, das über den Objektinspektor konfiguriert werden kann.
Und genauso einfach kann man darauf zugreifen. Voriges Beispiel hieße nun

Label1.Caption := Table3Ort.value;

Wie zu sehen ist, werden der Name der Table-Komponente und Name des Datenfeldes zu dem Bezeichner des Field-Objektes verbunden. Die Eigenschaft Value hat dabei den Typ, wie er in der Datenbankoberfläche festgelegt worden ist.
Der Nachteil dabei ist, dass die Tabelle genau auf die Struktur festgelegt ist, wie sie in dem Feldeditor abgebildet ist. Tabellen mit anderem Aufbau lassen sich über diese Table-Komponente nicht mehr öffnen. Das kann Probleme dabei bringen, wenn das Format der Tabelle geändert wird; auch wenn nur ein Stringfeld um ein paar Zeichen verlängert oder verkürzt wird.
Bei der ersten Variante gibt es solche Probleme nicht, da nirgends statisch festgehalten ist, welchen Aufbau die Tabelle haben muss.

Beispiel 1

Hier wird die Gesamtzahl aller Radiergummis ermittelt und in Label1 angezeigt:

procedure TForm1.Button1Click(Sender: TObject);
var gesamtzahl: integer;
begin
  // Verhindern, dass die Anzeige ständig aktualisiert wird:
  Table1.DisableControls;
  Table1.first;
  gesamtzahl:=0;
  while not Table1.eof do begin
    if Table1.FieldByName('Artikel').AsString='Radiergummi' then
      gesamtzahl:=gesamtzahl+Table1.FieldByName('Anzahl').AsInteger;
    Table1.next;
  end;
  Table1.EnableControls;
  Label1.Caption:='Radiergummis: '+IntToStr(gesamtzahl);
end;

Beispiel 2 – Filterung

Um die Daten in einer Table zu filtern, werden die Eigenschaften Filtered und Filter von TTabel eingesetzt. Im Beispiel ist Table1 mit einem DBGrid verbunden. Hierin sollen nun nur alle Datensätze angezeigt werden, die Radiergummis betreffen:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Table1.Active:=False;
  Table1.Filtered := False;
  Table1.Filter := 'Artikel = ' + QuotedStr('Radiergummi');
  Table1.Filtered := True;
  Table1.Open;
end;