Moin...

Warum benutzt du nicht die Anweisungen (
SQL, ParamByName) die du in früheren Threads gelernt hast?
http://www.delphipraxis.net/192351-g...-eingeben.html
Mit dem Debugger würdest du selber sehen warum manche Sachen nicht aufgerufen werden oder die Werte nicht stimmen (Breakpoints).

Ohne Debugger ist programmieren wie den Ast eines Baumes abschneiden mit einem glatten Messer.

Damit solltest du dich VOR den Objektlisten beschäftigen.
Delphi-Quellcode:
procedure TCustomerList.SavetoDB(con: TZConnection);
var
zqryMain: TZQuery;
I: Integer;
begin
zqryMain := TZQuery.Create(nil);
try
zqryMain.connection := con; // Connection zuordnen
for I := 0 to Self.Count - 1 do // Liste durchlaufen
begin
if Self[I].ID = -1 then // !!!! Das hatten wir doch schonmal ähnlich...Ist die ID jedes Objektes in der Liste > -1 ????
begin // !!! begin-end Blöcke da du erkennst was zueinander gehört...auch bei einer Anweisung macht es Sinn.
zqryMain.SQL.Text := 'UPDATE WARENVERKAUF1 SET KDNR = :KNR, NAME = :NAM, VORNAME =: VNA, FIRMA = :FIR, PRODUKT = :PRO, ANZAHL = :ANZ, PREIS = :PRE WHERE ID = :ID'
// Parameter nur mit ID -1 zuordnen !!!
zqryMain.ParamByName('ID').AsInteger := Self[I].ID;
// As... übergibt gleich den "richtigen" Typ...Value ist was für Weicheier :-), die nicht wissen welcher Wert übergeben werden soll.
end
else
begin
zqryMain.SQL.Text := 'INSERT INTO WARENVERKAUF1(KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS) VALUES(:KNR, :NAM, :VNA, :FIR, :PRO, :ANZ, :PRE)';
// keine Codevervollständigung benutzt wegen Schreibfehler (text). :-(
end;
// zqryMain.params.parseSQL(zqryMain.sql.text, True);
// Quatsch. ??? Wo hast du das her? Ich kenne kein Beispiel wo man das parseSQL benötigt...nur im Notfalle ist es "vorhanden".
// Parameter zuordnen
zqryMain.ParamByName('KNR').AsString := Self[I].KDNR;
zqryMain.ParamByName('NAM').AsString := Self[I].Name;
zqryMain.ParamByName('VNA').AsString := Self[I].Vorname;
zqryMain.ParamByName('FIR').AsString := Self[I].Firma;
zqryMain.ParamByName('PRO').AsString := Self[I].Produkt;
zqryMain.ParamByName('ANZ').AsInteger := Self[I].Anzahl;
zqryMain.ParamByName('PRE').AsString := Self[I].Preis; // besser Typ Float
// As... übergibt gleich den "richtigen" Typ...Value ist was für Weicheier :-), die nicht wissen welcher Wert übergeben werden soll.
// Ausführen
zqryMain.ExecSQL;
end;
finally
zqryMain.Free; // keine Codevervollständigung benutzt wegen Schreibfehler (free). :-(
end;
end;