Komponenten
Zweck
Mit Hilfe der Komponenten TRPCTable können sie auf die Daten aus der Datenbank zugreifen.
TRPCTable bietet einen indirekten Zugriff auf jeden Datensatz und jedes Feld der zugrundeliegenden Datenbanktabellen.
Die Daten werden über die Abfrage die in der Eigenschaft SQLSelect hinterlegt ist aus der Datenbank abgerufen und stehen im Speicher am Client zur weiteren Bearbeitung zur Verfügung.
Diese Daten können jetzt mittels verbundenen visuellen Elementen oder auch programmatisch bearbeitet werden, und die daraus resultierenden Änderungen können dann an die Datenabank übertragen werden.
Beispiel
Folgendes Beispiel soll die Funktionsweise der TRPCTable verdeutlichen.
procedure loadUser;
var
aTable: TRPCTable;
begin
aTable:= TRPCTable.create;
try
aTable.SystemDB := true; //Die cp_user Tabelle befindet sich in der System Datenbank
with aTable.SQLSelect do
begin
add(' SELECT US_ID, US_LOGINNAME, US_LASTNAME, US_FIRSTNAME, US_WEBSITE ');
add(' FROM CP_USER ');
end;
with aTable.SQLUpdate do
begin
add(' UPDATE CP_USER ');
add(' SET US_WEBSITE = :US_WEBSITE ');
add(' WHERE US_ID = :US_ID ');
end;
aTable.readData;
//Die Daten überprüfen und ändern
updateWebSiteData(aTable);
finally
aTable.free;
end;
end;
Mögliches Ergebnis der Methode loadUser:
CPAMET | Menzinger | Tabitha |
CPARAS | Ranimirov | Sinisa |
CPABAF | Baldemaier | Florian |
Diese Datenmenge befindet sich jetzt direkt im Speicher am Client.
Nun kann man sich durch die Datenmenge bewegen mittels den Methoden first, next, prior, last.
In unserem Beispiel werden wir diese in einer einfachen Form durchgehen:
procedure updateWebSiteData(aTable: TRPCTable);
begin
aTable.First; //zum ersten Datensatz bewegen
while not aTable.eof do //Solange wir noch nicht am Ende der Datenmenge sind
begin
if trim(aTable.FieldByName('US_WEBSITE').AsString) = '' then
begin
aTable.Edit; //Datensatz zur Bearbeitung öffnen
aTable.FieldByName('US_WEBSITE').AsString := 'www.cp-austria.at';
aTable.Post; //Die Änderungen am aktuellen Datensatz abschliessen (UPDATE SQL wird erstellt und in die Queue gelegt)
end;
aTable.Next; //Zum nächsten Datensatz bewegen
end;
aTable.writeData; //Die Änderungen in die Datenbank schreiben (SQL Queue wird ausgeführt)
end;
Jesemal wenn sie die Methode post aufrufen und zuvor einen bestehenden Datensatz bearbeitet haben, schaut die RPCTable nach welche SQLUpdate Anweisung hinterlegt worden ist.
Diese wird jetzt geparst und alle Platzhalter (alle Bezeichner mit einem Doppelpunkt davor) werden ersetzt.
Dabei wird zuerst nachgesehen ob ein Parameter mittels der Methoden setStringParam, setDateParam usw. hinterlegt worden ist den die Parameter haben die höhere Priorität.
Wurde kein Parameter gefunden, dann versucht die RPCTable ein Datenbank Feld zu finden welches den gleichen Namen wie der Bezeicher hat und sezt den Inhalt des Feldes ein.
Kann beides nicht gefunden werden wird eine Fehlermeldung geworfen.
Analog zur SQLUpdate Anweisung funktionieren die SQLInsert und SQLDelete Anweisung.
SQLInsert wird erstellt wenn mit append bzw. insert ein neuer Datensatz erzeugt wird und danach dieser mit post abgeschlossen wird.
SQLDelete wird ausgeführt wenn mit delete der aktuelle Datensatz gelöscht wird.
Tipps:
- Ändern sie mehrere Felder in einem Datensatz innerhalb eines edit-post aufrufes damit nur eine SQL Anweisung erstellt wird.
- Wenn mehrere Datensätze geändert werden rufen sie erst am Ende writeData auf da sonst bei jeder Änderung mit dem Server kommunziert wird und dies Zeit kostet.