AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kundenliste

Ein Thema von EdAdvokat · begonnen am 14. Apr 2017 · letzter Beitrag vom 22. Apr 2017
Antwort Antwort
Hobbycoder

Registriert seit: 22. Feb 2017
1.002 Beiträge
 
#1

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
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Kundenliste

  Alt 17. Apr 2017, 15:36
Danke zunächst. Habe hoffentlich richtig Deine Hinweise umgesetzt:
Delphi-Quellcode:
type
  TCustomer=class
  private
    FID: integer;
    FKDNR : Integer;
    FName: string;
    FVorname: string;
    FFirma : string;
    FProdukt: string;
    FAnzahl : Integer;
    FPreis : Currency;
    procedure SetID(const Value: Integer);
    procedure SetKDNR(const Value: Integer);
    procedure SetName(const Value: string);
    procedure SetVorname(const Value: string);
    procedure SetFirma (const Value : string);
    procedure SetProdukt(const Value : String);
    procedure SetAnzahl (const Value : Integer);
    procedure SetPreis(const Value: Currency);
  public
    constructor Create;

  published
    property ID: integer read FID write SetID;
    property KDNR: integer read FKDNr write SetKDNR;
    property Name: string read FName write SetName;
    property Vorname: string read FVorname write SetVorname;
    property Firma: string read FFirma write SetFirma;
    property Produkt: string read FProdukt write setProdukt;
    property Anzahl: Integer read FAnzahl write SetAnzahl;
    property Preis: Currency read FPreis write SetPreis;
  end;
und weiter:
Delphi-Quellcode:
constructor TCustomer.Create;
begin
  inherited;
  self.FID:=-1;
end;
Methode SaveToDB:
Delphi-Quellcode:
procedure TCustomerList.SavetoDB(con: TZConnection);
var
  zqryMain: TZQuery;
  i: Integer;
  CustomerListe: TCustomerList;
begin
  zqryMain:=TZQuery.Create(nil);
  try
    zqryMain.connection:=con;
    zqryMain.sql.text:='INSERT INTO WARENVERKAUF1 (KDNR, NAME, VORNAME, FIRMA, PRODUKT, ANZAHL, PREIS) VALUES (:KNR, :NAM, :VNA, :FIR, :PRO, :ANZ, :PRE)';
    zqryMain.params.parseSQL(zqryMain.sql.text, True);
for i:=0 to self.count-1 do
begin
  if CustomerListe[i].ID=(-1) then
  zqryMain.SQL.text:='INSERT INTO WARENVERKAUF1(KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS) VALUES(:KNR, :NAM, :VNA, :FIR, :PRO, :ANZ, :PRE)else
  zqryMain.SQL.Text:='UPDATE WARENVERKAUF1 SET KDNR=:KNR, NAME =:NAM, VORNAME=:VNA, FIRMA=:FIR, PRODUKT=:PRO, ANZAHL=:ANZ, PREIS=:PRE WHERE ID=:ID';

  zqryMain.params.ParamValues['KNR']:=self[i].KDNR;
  zqryMain.params.paramValues['NAM']:=self[i].Name;
  zqryMain.params.paramValues['VNA']:=self[i].Vorname;
  zqryMain.params.ParamValues['FIR']:=self[i].Firma;
  zqryMain.Params.ParamValues['PRO']:=self[i].Produkt;
  zqryMain.Params.ParamValues['ANZ']:=self[i].Anzahl;
  zqryMain.params.paramValues['PRE']:=self[i].Preis;
  zqryMain.ExecSQL;
  zqryMain.Next;
end;
finally
  zqryMain.free;
end;
end;
Ist das bis hierher exakt?
Ergebnis ist jedoch weiterhin, bei löschen und bearbeiten kommt "Argument außerhalb des Bereiches".
Nachdem ich LoadFromDB aufgerufen habe kann ich einen Datensatz bearbeiten, jedoch nach OK verschiebt sich die Listview-Ansicht nach links dh. Die Anzeige für die ID wird mit der KDNR und die der KDNR mit Name... belegt. Also alles wie gehabt.
Norbert

Geändert von EdAdvokat (17. Apr 2017 um 15:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.658 Beiträge
 
Delphi 12 Athens
 
#3

AW: Kundenliste

  Alt 17. Apr 2017, 15:43
Beim Ändern von Daten ist das Next wieder überflüssig, welcher nächste Datensatz sollte das auch sein?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Kundenliste

  Alt 17. Apr 2017, 16:22
ok zqryMain.Next; ist raus. Sicher ist hier auch einiges doppelt und könnte wohl raus:
zqryMain.sql.text:='INSERT INTO WARENVERKAUF1 (KDNR, NAME, VORNAME, FIRMA, PRODUKT, ANZAHL, PREIS) VALUES (:KNR, :NAM, :VNA, :FIR, :PRO, :ANZ, :PRE)'; ist das so OK?
Es bleibt jedoch alles beim alten. "Argument außerhalb des Bereiches" und Verschiebung.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.658 Beiträge
 
Delphi 12 Athens
 
#5

AW: Kundenliste

  Alt 17. Apr 2017, 17:00
Wo soll denn diese ominöse CustomerListe plötzlich herkommen? Du bist doch bereits in der TCustomerlist, wozu dann die Variable, die nirgends initialisiert bzw. instanziert wird?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Kundenliste

  Alt 17. Apr 2017, 17:31
Danke habe es jetzt so gelöst:
Delphi-Quellcode:
procedure TCustomerList.SavetoDB(con: TZConnection);
var
  zqryMain: TZQuery;
  i: Integer;
begin
  zqryMain:=TZQuery.Create(nil);
  try
    zqryMain.connection:=con;
   // zqryMain.sql.text:='INSERT INTO WARENVERKAUF1 (KDNR, NAME, VORNAME, FIRMA, PRODUKT, ANZAHL, PREIS) VALUES (:KNR, :NAM, :VNA, :FIR, :PRO, :ANZ, :PRE)';
   // zqryMain.params.parseSQL(zqryMain.sql.text, True);
for i:=0 to self.count-1 do
begin
  if Self[i].ID=(-1) then
  zqryMain.SQL.text:='INSERT INTO WARENVERKAUF1(KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS) VALUES(:KNR, :NAM, :VNA, :FIR, :PRO, :ANZ, :PRE)else
  zqryMain.SQL.Text:='UPDATE WARENVERKAUF1 SET KDNR=:KNR, NAME =:NAM, VORNAME=:VNA, FIRMA=:FIR, PRODUKT=:PRO, ANZAHL=:ANZ, PREIS=:PRE WHERE ID=:ID';
  zqryMain.params.parseSQL(zqryMain.sql.text, True);

  zqryMain.params.ParamValues['KNR']:=self[i].KDNR;
  zqryMain.params.paramValues['NAM']:=self[i].Name;
  zqryMain.params.paramValues['VNA']:=self[i].Vorname;
  zqryMain.params.ParamValues['FIR']:=self[i].Firma;
  zqryMain.Params.ParamValues['PRO']:=self[i].Produkt;
  zqryMain.Params.ParamValues['ANZ']:=self[i].Anzahl;
  zqryMain.params.paramValues['PRE']:=self[i].Preis;
  zqryMain.ExecSQL;
 
end;
finally
  zqryMain.free;
end;
end;
hoffentlich ist das nicht wieder Blödsinn. Doch es bleibt alles wie es war.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.658 Beiträge
 
Delphi 12 Athens
 
#7

AW: Kundenliste

  Alt 17. Apr 2017, 18:02
Zähl doch mal die SQL-Parameter.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz