Free Pascal programmieren lernen.
FirefirdSQL DB Select Datenabfrage
Einleitung – FirefirdSQL DB Select Abfrage
Für eine FirefirdSQL DB Select Abfrage mit einer Benutzeroberfläche, benötigst du einige Hilfsprozeduren. Du benötigst eine Prozedur um Daten zur Komponente TListView hinzuzufügen. Die Daten müssen beim starten des Programms geladen werden. Hierfür wirst du eine Prozedur erstellen die durch ein Ereignis des Form1 angelegt wird. Für den späteren Verlauf setzt du eine globale Hilfsvariable. Diese wird später für den Speichern Button benötigt. Denn legst du neue Daten an, benötigst du eine Insert Prozedur. Für das speichern bereits vorhandener Inhalte eine Update Prozedur. Die Variable wird später gesetzt, wenn der User das Programm aufruft und auf den Button Neu anlegen klickt. Eine weitere Prozedur für die Datenabfrage benötigst du, wenn der User die ListView anklickt und einen neuen oder noch nicht ausgewählten Eintrag auswählt. Die Daten müssen in diesem Fall neu in die Editfelder geladen werden. Zum Schluss hast du dann noch die eigentliche Prozedur, die die Daten aus der Datenbank abfragt. Diese wird durch die einzelnen Ereignis Prozeduren mehrfach aufgerufen und wird daher, in eine eigene Prozedur geschrieben. Ich werde mit der Prozedur AddToListView beginnen und danach die SelectAbfrage in einer eigenen Prozedur erstellen. Alle andren Prozeduren kommen dann später hinzu, da diese von diesen beiden Prozeduren abhängig sind.
Teil 01: Die Prozedur – AddToListView
Wenn du genau wissen möchtest wie eine ListView funktioniert, dann habe ich dafür die Funktionsweise der Komponente in einem Artikel der Komponenten Bibliothek sehr genau beschrieben. Nachfolgend werde ich nur die Prozedur AddToListView beschreiben.
procedure TForm1.AddToListViewPersonen(ID, LastName, FirstName, Tel, Mobilnum : string);
var
item : TListItem;
begin
item := Form1.LVPeople.Items.Add;
item.caption := ID;
item.subItems.Add(LastName);
item.subItems.Add(FirstName);
item.subItems.Add(Tel);
item.subItems.Add(Mobilnum);
end;
In der ersten Zeile findest du den Namen der Prozedur AddToListViewPersonen als Parameter werden der Prozedur fünf Strings übergeben. In Zeile zwei leitest du die Variablendeklaration der Prozedur ein. Die dritte Zeile legt eine Variable vom Typ TListItem an. Mit dem Wort begin leitest du in der vierten Zeile die eigentliche Prozedur ein. In der Variablen item wird in der fünften Zeile, die ListView des Form1 übergeben mit der Eigenschaft Item hinzufügen (add). Der erste Eintrag der ListView ist immer die Beschreibung englisch Caption. Der Caption weisen wir in Zeile sechs den Wert des Parameters ID zu. In den Nachfolgenden Zeilen füllst du die Items mit den weiteren Parametern. Am Ende schließt du die Prozedur mit einem End sauber ab.
Teil 02 – Die Prozedur SelectDBData:
Die Prozedur SelectDBData hat verschiedene Bereiche. Diese werden ich einzeln erklären und am Ende nochmal die gesamte Prozedur vorstellen. Die Prozedur wird in der Unit des Form2 abgelegt. Alle Prozeduren die etwas mit der Datenbank zu tun haben, legst du hier ab und rufst diese dann später da auf, wo du sie benötigst.
Teil 02-01 – Kopf und Datenabfrage mit FirefirdSQL DB Select
procedure TForm2.SelectDBData;
var
strID, strLastName, strFirstName, strTel, strMobile : string;
begin
connectDB;
SQLQPeople.SQL.Text := 'Select * From PERSONEN';
SQLQPeople.Active := true;
SQLQPeople.Open;
In der ersten Zeile steht wieder der Prozedurname SelectDBData. In Zeile zwei leitest du die Variablendeklaration ein. Nun folgt die Variablendeklaration in der dritten Zeile. Du benötigst fünf String Variablen. Für größere Programme ist es wichtig die Variablen genau zu bezeichnen. Der Name strID ist also für dich jetzt ausreichend. Bei einem größeren Programm indem du verschiedene ListView‘s befüllst, wäre hier noch der Zusatz Personen denkbar. Dies dient der besseren Identifizierung um welche ListView es sich handelt. In der nächsten Zeile leitest du mit dem Wort begin die eigentliche Prozedur ein. In Zeile fünf rufst du die Prozedur zum Verbindungsaufbau auf. Diese habe ich in diesem Artikel beschrieben. Zeile sechs wird das SQL Statement festgelegt. Die genaue Bedeutung lautet: Setze von der Komponente SQLQPeople die Eigenschaft SQL als Text mit dem Inhalt als String ‚Select * From PERSONEN‘ Rufe (Select) alles (*) von from der Tabelle Personen ab. Die Datenbank und der Zugriff auf diese wird in dem oben beschriebenen Artikel festgelegt. In Zeile sieben wird die Komponente SQLQPeople die Eigenschaft Active auf wahr (true) gesetzt. Als nächstes öffnest du die Verbindung zur Datenbank über das SQLQuery SQLQPeople mit der Eigenschaft open. Zu diesem Zeitpunkt hast du die Daten abgefragt und müsst diese nun in deine Editfelder und in deine ListView ausgeben. Jetzt befüllst du die Editfelder: Dies geschieht in Zeile neun bis dreizehn.
Teil 02-02 – Editfelder befüllen
Form1.EdtID.Text := SQLQPeople.FieldbyName('ID').AsString;
Form1.EdtLastName.Text := SQLQPeople.FieldbyName('NAME').AsString;
.EdtFirstName.Text := SQLQPeople.FieldbyName('VORNAME').AsString;
Form1.EdtTel.Text := SQLQPeople.FieldbyName('TEL').AsString;
Form1.EdtMobile.Text := SQLQPeople.FieldbyName('MOBIL').AsString;
Du änderst nur die Spalten der Tabelleneinträge der Datenbank. Alles andere bleibt gleich, daher erkläre ich nur die Anweisung in Zeile neun. Setze in Form1 die Eigenschaft Text des Editfeldes EdtID mit den Inhalten der Datenbank von SQLQPeople und rufe das Feld vom Name ID als Text (String) ab. Dies wiederholst du wie beschrieben für das Feld Name, Vorname, Tel und Mobil. Jetzt folgt das befüllen der ListView.
Teil 02-03 – ListView befüllen
while not SQLQPeople.Eof do
begin
strID := SQLQPeople.FieldbyName('ID').AsString;
strLastName := SQLQPeople.FieldbyName('NAME').AsString;
strFirstName := SQLQPeople.FieldbyName('VORNAME').AsString;
strTel := SQLQPeople.FieldbyName('TEL').AsString;
strMobile := SQLQPeople.FieldbyName('MOBIL').AsString;
Form1.AddToListViewPersonen(strID, strLastName, strFirstName, strTel, strMobile);
SQLQPeople.next;
end;
closeDB;
end;
In Zeile vierzehn beginnst du mit einer While Schleife. Diese durchläuft die abgefragten Daten des SQLQuery SQLQPeople so lange bis der letzte Datensatz erreicht ist. Wie bei den Editfeldern rufst du die Daten ab und du legst diese in Zeile sechszehn bis zwanzig in die deklarierten String Variablen ab. In der darauffolgenden Zeile 21 befüllst du über die in Teil 1 festgelegte Prozedur AddToListViewPersonen mit den Stringvariablen die ListView. In Zeile 22 gehst du zum nächsten Eintrag des Querys und führst die While Schleife so lange durch, bis alle Einträge abgerufen wurden. Danach beendest du in Zeile 23 die While Schleife. In der nächsten Zeile 24 beendest du mit der Prozedur closeDB die Datenbankverbindung. In der letzten Zeile 25 beendest du die Prozedur.
Teil 03: Globale Hilfsvariable festlegen
Für den späteren Serienartikel benötigst du noch die globale Variable isInsertOrUpdate. Diese deklarierst du in der Unit des Form1 unter Var als globale Variable (s.U.). Im späteren Verlauf kannst du dann festlegen, ob ein neuer Eintrag angelegt werden soll, oder ob du ein Datenbank Update durchführen musst. Dies kannst du dank dieser Variabel dann über einen Speichern Button erledigen, anstelle über zwei verschiedene Buttons.
Var
Form1: TForm1;
isInsertOrUpdate : integer;
Die Prozedur SetProjectVarSettings setzt diese Variable dann als Standard auf 1. Bei größeren Programmen kannst du die Programmsettings in einer extra Prozedur auslagern und diese dann über das Form1 Ereignis ShowForm abrufen.
procedure TForm1.SetProjectVarSettings;
begin
{* isInsertOrUpdate = 1 = Update ist gesetzt.
* isInsertOrUpdate = 01 = Insert ist gesetzt.
*}
isInsertOrUpdate := 1;
end;
Teil 04: Daten automatisch laden mit FirefirdSQL DB Select
Ähnlich wie in Abschnitt drei, kannst du auch die Datenbank abfragen die du zum Start benötigst, bei einem größeren Programm in eine extra Prozedur auslagern (s.u.). In der Prozedur SelectFormDBData rufst du bei unserem kleinen Programm allerdings nur die Prozedur SelectDBData auf.
procedure TForm1.SelectFormDBData;
Begin
Form2.SelectDBData;
end;
Um die Daten nun beim Start des Programms zu sehen benötigst du vom Form1 das Ereignis FormShow. In dieser rufst du nun die Prozedur SetProjectVarSettings und SelectFormDbData ab.
procedure TForm1.FormShow(Sender: TObject);
begin
// Projekt Variablen setzen.
SetProjectVarSettings;
// Projekt DB Daten laden
SelectFormDBData;
end;
Zur Laufzeit deines Programms werden nun alle Daten in der ListView und in den Editfelder angezeigt.
Teil 05: ListView Fehler Behebung und eine weitere FirefirdSQL DB Select Abfrage
Wenn du nun in die ListView klickst ändert sich noch nichts, wenn du einen neuen Eintrag auswählst. Bei einem Klick in den leeren Bereich stürzt dein Programm sogar komplett ab. Dies beheben wir mit der nachfolgenden Prozedur. Diese wird durch das Ereignis LVPeople OnClick automatisch leer erzeugt.
procedure TForm1.LVPeopleClick(Sender: TObject);
var
strID : string;
begin
if LVPeople.Selected <> nil then
begin
strID := LVPeople.Selected.caption;
Form2.loadDBData(strID);
end
else
begin
// Wenn keine Reihe ausgewählt ist mache nichts.
end;
end;
Am Anfang benötigst du eine Variable vom Typ String, diese lautet StrID und wird in der dritten Zeile der Prozedur festgelegt. In Zeile fünf erstellst du nun eine wichtige „Wenn“ (If) „Dann“ (Else) Abfrage. Diese lautet if LVPeople.Selected <> nil then dies bedeutet: “Wenn die Auswahl (Selected) der Komponente LVPeople kleiner oder größer nichts (nil) ist, dann mache folgendes“ Trifft die Wenn (if) Abfrage zu dann lade die Caption des Ausgewählten Eintrags, dies ist in unserem Fall die ID. In der nächsten Zeile ladest du mit der Prozedur loadDBData die ausgewählte ID. Dies ist keine normale Select Abfrage wie oben, sondern muss als Prozedur ebenfalls neu erstellt werden. Beschreiben werde ich diese Prozedur unten. Die Else Anweisung bleibt leer diese wird ausgeführt, wenn der Wert Nil also nichts ist und der DAU User ins Leere geklickt hat. Der DAU User steht für dümmster anzunehmender User. Dies soll bei der Programmierung dabei helfen Fehler zu beheben, die z.B. durch einen Fehlklick oder Fehleingabe verursacht werden.
procedure TForm2.loadDBData(strID : string);
begin
SQLQPeople.SQL.Text := 'Select * From PERSONEN where ID ='''+strID+''';';
SQLQPeople.Active := true;
Form1.EdtID.Text := SQLQPeople.FieldbyName('ID').AsString;
Form1.EdtLastName.Text := SQLQPeople.FieldbyName('NAME').AsString;
Form1.EdtFirstName.Text := SQLQPeople.FieldbyName('VORNAME').AsString;
Form1.EdtTel.Text := SQLQPeople.FieldbyName('TEL').AsString;
Form1.EdtMobile.Text := SQLQPeople.FieldbyName('MOBIL').AsString;
closeDB;
end;
Jetzt komme ich wie versprochen noch zu der Prozedur loadDBData. Dieses Übergibst du die strID als String Variable und rufst in der SQL Abfrage ‚Select * From PERSONEN where ID =“’+strID+“‘; aus. Dies bedeuten wähle (Select) alles (*) von der Tabelle Personen das auf ID = strID zutrifft aus. Dann befüllst du mit dem Datensatz die Editfelder wie schon weiter oben beschrieben neu. Zum Schluss beendest du die Datenbank Verbindung mit der Prozedur closeDB und die Prozedur mit einem end;.
So das war es auch mit Teil 3 und der Select Abfrage unserer kleinen Software.
Die fertige Software können Sie in meinem Downloadbereich kostenlos und ohne Anmeldung Lazarus-FDB Personen-Ver1-04-08-2020.