Thema: Kundenliste

Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#22

AW: Kundenliste

  Alt 17. Apr 2017, 13:23
Im Grunde bist du doch schon recht weit. Nur die SaveToDB-Routine läuft noch nicht so, wie du es dir vorgestellt hast (wenn ich das richtig verstanden habe).

Es gibt ja grundsätzlich 2 Möglichkeiten mit Daten in einer DB zu arbeiten.
1. Mit laufender Verbindung zu der Tabelle, z.B. über ein geöffnetes TQuery oder TTable und über ein DataSource das ganze an Datensensitive Componenten zu binden z.B: DBEdit, DBCompobox, etc.
Dann kann man über Query.Edit einen Datensatz editieren. Die angebundenen Controls erhalten dann automatisch die Möglichkeit deren Daten zu ändern. Und über Query.POst btw. Query.Cancel das Editieren zu beenden. Gleiches würde z.B. über Query.Append mit neuen Datensätzen gehen.
Wie das dann genau unter Zeos aussieht, müsstest du dir erarbeiten

2. So wie du es jetzt hast. Daten komplett in eine ObjectList einlesen. Dann Objekte Bearbeiten, löschen oder hinzufügen und wieder komplett speichern.
Doch beim Speichern stellt sich dann aber die Frage: Ist der Datensatz nun neu oder ist er nur editiert? Davon ist nämlich abhängig, ob du beim Speichern über SQL das mit Insert oder mit Update machst.
Ich mache das immer folgerndermaßen. Man kann eigentlich in der SQL-DB in den Tabellen ein Datenfald mit Autoincrement versehen. Oft auch Lfdnr (laufende Nummer) oder ID benannt. Jeder Datensatz erhält darüber eine eindeutige Nummer innerhalb seiner Tabelle. Diese Nummer wird nicht noch einmal vergeben, auch wenn der Datensatz gelöscht wird. Und sie wird automatisch vergeben, also braucht/darf sie beim Insert nicht angegeben werden.
So, nun würde ich in den Objecten diese ID als Integer mit aufnehmen und beim LoadFromDB mit laden. Außerdem würde ich den Objecten eine Constructor spendieren in dem diese ID mit -1 vorbelegt ist.
Delphi-Quellcode:
Type
Tblabla=class
  private
    FID: Integer;
    procedure SetID(value: Integer);
  public
    constructor Create;
  published
    property ID: Integer read FID write SetID;
end;

constructor Tblabla.Create;
begin
  inherited;
  self.FID:=-1;
end;
Nun erhält jedes neue Object der Objectliste in ID den Wert -1.
Beim LoadFromDB wird ja auch für jeden Datensatz ein Object erzeugt, aber genau dort wird auch die ID aus der DB geladen, also hat ID dann der autoincrement-wert aus der DB und nicht mehr -1.

Wenn du nun in der Objektliste ein neues Object anlegst, bekommt es aber automatisch als ID erst einmal -1.
Jetzt kannst du bei SaveToDB anhand der ID wunderbar unterscheiden, ob ein Insert oder ein Update notwendig ist:
Delphi-Quellcode:
Procedure TblablaList.SaveToDB(....);
begin
  for i:=0 to blablaList.Count-1 do
  begin
    if blablaList[i].ID=-1 then
      q.sql.text:='Insert into Kundenliste (Name, Vorname) VALUES (:name, :Vorname)' eise
      q.sql.text:='Update Kundenliste SET Name=:name, Vorname=:Vorname where ID=:id';
   ....
  end;
end;
Möglicherweise hilft dir das etwas weiter.
Gruß Hobbycoder
  Mit Zitat antworten Zitat