![]() |
AW: gesonderte Ergebnisberechnung in DB-Tab eingeben
Hoffentlich stelle ich mich nicht zu blöd an. So sieht nun die neue ButtonClick-Procedure aus:
Delphi-Quellcode:
Ich bin nicht sicher, ob ich Dein Hinweis richtig aufgenommen habe.
procedure TMainFrm.btnTestInput1Click(Sender: TObject);
var CurrentCustomerID: string; begin qryMain.SQL.Clear; qryMain.Params.Clear; if IsEdit then begin CurrentCustomerID := lvProductList.Selected.Caption; qryMain.SQL.Text := 'UPDATE WARENVERKAUF1 SET KDNR=:KDNR,NAME=:NAME,VORNAME=:VORNAME,FIRMA=:FIRMA,PRODUKT=:PRODUKT,ANZAHL=:ANZAHL,PREIS=:PREIS WHERE ID = :2'; qryMain.ParamByName('ID').AsString := CurrentCustomerID; qryMain.ParamByName('Anzahl').asInteger:=strtoint(edtTestInput.text); qryMain.ExecSQL; qryMain.SQL.Text := 'SELECT ID,KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS FROM WARENVERKAUF1'; qryMain.ExecSQL; RefreshItems(CurrentCustomerID, edtCustomerNumber.Text, EdtName.Text, EdtVorname.Text, EdtFirma.Text, EdtProdukt.Text, EdtAnzahl.Text, EdtPreis.Text); end; end; Zwischenzeitlich habe ich eine völlig neue Tabelle "Warenverkauf1" geschrieben. Dort ist der Lehmann (Beispiel) mit der ID 2 aufgeführt. Reichen diese Angaben zum 2. Testbutton? Zusätzlich wie angemahnt ein SELECT eingefügt. :| |
AW: gesonderte Ergebnisberechnung in DB-Tab eingeben
in dem UPDATE muß es dann heißen
SQL-Code:
und für den SELECT
Where ID=2
Delphi-Quellcode:
und ich packe immer vor und hinter jede Query noch ein
qryMain.SQL.Text := 'SELECT ID,KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS FROM WARENVERKAUF1';
qryMain.Open; while not qryMain.EOF do begin { hier die Werte übernehmen} idfeld:=qryMain.Fields.Fieldbyname('ID').asstring; ...... qryMain.Next; end;
Delphi-Quellcode:
also
.Close
Delphi-Quellcode:
damit ich mir keinen Dreck einhandele.
qryMain.Close;
qryMain.SQL.Text := 'SELECT ID,KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS FROM WARENVERKAUF1'; qryMain.Open; while not qryMain.EOF do begin { hier die Werte übernehmen} idfeld:=qryMain.Fields.Fieldbyname('ID').asstring; ...... qryMain.Next; end; qryMain.Close; Gruß K-H P.S. das .Close natürlich auch vor das Update-Statement. |
AW: gesonderte Ergebnisberechnung in DB-Tab eingeben
nach den Vorschlägen von K.H sieht meine Procedure für den neuen Testbutton so aus:
Delphi-Quellcode:
Hoffentlich ist das richtig. Er läuft jedenfalls durch.
procedure TMainFrm.btnTestInput1Click(Sender: TObject);
var CurrentCustomerID: string; begin qryMain.SQL.Clear; qryMain.Params.Clear; if IsEdit then begin CurrentCustomerID := lvProductList.Selected.Caption; qryMain.SQL.Text := 'UPDATE WARENVERKAUF1 SET KDNR=:KDNR,NAME=:NAME,VORNAME=:VORNAME,FIRMA=:FIRMA,PRODUKT=:PRODUKT,ANZAHL=:ANZAHL,PREIS=:PREIS WHERE ID = 2'; qryMain.ParamByName('ID').AsString := CurrentCustomerID; qryMain.ParamByName('Anzahl').asInteger:=strtoint(edtTestInput.text); qryMain.ExecSQL; qryMain.Close; qryMain.SQL.Text := 'SELECT ID,KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS FROM WARENVERKAUF1'; qryMain.Open; while not qryMain.EOF do begin CurrentCustomerID:=qryMain.Fields.Fieldbyname('ID').asstring; edtCustomerNumber.Text := qryMain.FieldByName('KDNR').AsString; EdtName.Text := qryMain.FieldByName('NAME').AsString; EdtVorname.Text := qryMain.FieldByName('VORNAME').AsString; EdtFirma.Text := qryMain.FieldByName('FIRMA').AsString; EdtProdukt.Text := qryMain.FieldByName('PRODUKT').AsString; EdtAnzahl.Text := qryMain.FieldByName('ANZAHL').Asstring; EdtPreis.Text := qryMain.FieldByName('PREIS').Asstring; qryMain.Next; end; qryMain.close; qryMain.ExecSQL; RefreshItems(CurrentCustomerID, edtCustomerNumber.Text, EdtName.Text, EdtVorname.Text, EdtFirma.Text, EdtProdukt.Text, EdtAnzahl.Text, EdtPreis.Text); end; end; Mein Debug-Versuch ist gescheitert, denn er durchläuft mit F7 (einzelne Schritte) den Weg bis nach Wladiwostock. Ein Haltepunkt auf die obige Proc. brachte auch nichts, denn da geht es um die Eingaben. und ich kann sogar "Hundehütte" eingeben, wenn ich das Wort in Integer umwandeln könnte. Die Anzahl bei Lehmann bleibt immer gleich.Habe ich die Update - Where-Bedingung und nachfolgend die ParamByName Werte richtig eingesetzt? Wo ist der Hund für die Hundehütte? |
AW: gesonderte Ergebnisberechnung in DB-Tab eingeben
Zunächst:
Delphi-Quellcode:
dann würde ich den Update auf das/die Felder beschränken, die Du wirklich übergibst.
end;
qryMain.close; qryMain.ExecSQL; {---------- das ist Quark!!} RefreshItems(CurrentCustomerID, edtCustomerNumber.Text, EdtName.Text, EdtVorname.Text, EdtFirma.Text, EdtProdukt.Text, EdtAnzahl.Text, EdtPreis.Text); end; und er müßte Dich gewaltig anmeckern, da es keinen Parameter ":ID" mehr gibt, da ist irgendetwas oberfaul! hab ich erst jetzt bemerkt, was hat es mit
Delphi-Quellcode:
auf sich?
IsEdit
Gruß K-H |
AW: gesonderte Ergebnisberechnung in DB-Tab eingeben
das qryMain.ExecSQL habe ich reingenommen, um die SELECT - Anweisung auszuführen. Muss man nicht schreiben? Als wieder raus.
Die isEdit Var. dient lediglich der Button-Sichtbarkeit. Aus der UPDATE Anweisung habe ich schon die Memos rausgenommen. Welche sollten noch raus. Es könnte doch später mal sein, dass auch ein Name oder ein Produkt verändert werden, oder sehe ich das falsch. Nehmt es mir nicht krumm. Ich bin sowas von unbeleckt und schwebe zur Zeit ohne festen Boden nahe der Cloud 4 also noch vor Wolke 7, denn noch ist der Hund nicht gefangen. Er meckert an keiner Stelle. Ím Anhang ist auch das ausführbare Kompilat und sollte so lauffähig sein. Da ich die Daten sowohl der Tabelle Warenverkauf als auch Warenverkauf1 sowohl in den Editfeldern als auch in der ListView sehe, ist doch eine Verbindung zur Datenbank und zur dortigen Tabelle hergestellt. Jetzt wäre es doch nach meinem Verständnis nur eine Frage der Selection des Datensatzes und des Feldes, dass mit der Neueingabe über das TestEditfeld manipuliert werden soll. Hierzu wäre doch nichts in den TQSL-Komponenten einzustellen. Auch die Datenbanktabelle ist soweit unbedenklich. Sicher mache ich den Fehler bei der Selection oder der Zuweisung der entsprechenden Daten. Könnte ich testweise welche Daten rausnehmen? Ich danke Euch für Eure Geduld. |
AW: gesonderte Ergebnisberechnung in DB-Tab eingeben
Hallöle...:P
Zitat:
Umkehrschluß: Ich habe noch nie ein Close benötigt. 8-) Zitat:
Delphi-Quellcode:
procedure TMainFrm.btnTestInput1Click(Sender: TObject);
var CurrentCustomerID: string; begin // qryMain.SQL.Clear; ! nicht notwendig -> raus // qryMain.Params.Clear; ! nicht notwendig -> raus if IsEdit then // Ist das Flag gesetzt? begin //richtig wenn die Selected.Caption auch die "2" enthällt. (Debugger) CurrentCustomerID := lvProductList.Selected.Caption; // es fehlen Parameter (die "2" wieder auf Parameter gesetzt) // benenne die Parameter mit 3 stelligen Kürzeln. Da siehst du was ist ein Parameter... // die Parameter im SQL müssen vorhanden sein // ENTWEDER bei kompletten Update qryMain.SQL.Text := 'UPDATE WARENVERKAUF1 SET KDNR = :KNR, NAME = :NAM, VORNAME = :VNA, FIRMA = :FIR, PRODUKT = :PRO, ANZAHL = :ANZ, PREIS = :PRE WHERE ID = :CID'; // das ist die ID für die Auswahl des Datensatzes (WHERE ID = :CID) qryMain.ParamByName('CID').AsString := CurrentCustomerID; // Hier gehören die Eingabefelder hin als Quelle für das UPDATE qryMain.ParamByName('KNR').AsString := edtCustomerNumber.Text; qryMain.ParamByName('NAM').AsString := edtName.Text; qryMain.ParamByName('VAN').AsString := edtVorname.Text; qryMain.ParamByName('FIR').AsString := edtFirma.Text; qryMain.ParamByName('PRO').AsString := edtProdukt.Text; qryMain.ParamByName('ANZ').AsInteger := StrToInt(edtTestInput.Text); qryMain.ParamByName('PRE').AsString := edtPreis.Text; // ODER nur die Anzahl qryMain.SQL.Text := 'UPDATE WARENVERKAUF1 SET ANZAHL = :ANZ WHERE ID = :CID'; // das ist die ID für die Auswahl des Datensatzes (WHERE ID = :CID) qryMain.ParamByName('CID').AsString := CurrentCustomerID; qryMain.ParamByName('ANZ').AsInteger := StrToInt(edtTestInput.Text); // Ausführen des Updates qryMain.ExecSQL; // qryMain.Close; ! nicht notwendig -> raus // Alle Daten neu holen qryMain.SQL.Text := 'SELECT ID, KDNR, NAME, VORNAME, FIRMA, PRODUKT, ANZAHL, PREIS FROM WARENVERKAUF1'; qryMain.Open; // Aktualisierung ListView while not qryMain.EOF do begin // Der "Datenszeiger" wird auf den nächsten Datensatz gesetzt RefreshItems(qryMain.FieldByName('ID').AsString;, qryMain.FieldByName('KDNR').AsString, qryMain.FieldByName('NAME').AsString, qryMain.FieldByName('VORNAME').AsString, qryMain.FieldByName('FIRMA').AsString, qryMain.FieldByName('PRODUKT').AsString, IntToStr(qryMain.FieldByName('ANZAHL').AsInteger), qryMain.FieldByName('PREIS').AsString); // nächsten Datensatz auswählen qryMain.Next; end; //qryMain.close; ! nicht notwendig -> raus //qryMain.ExecSQL; ! nicht notwendig -> raus end; end; |
AW: gesonderte Ergebnisberechnung in DB-Tab eingeben
So nun der nächste Versuch Procedure btnTestInput1Click, also der neue Button für das neue InputEdit:
Delphi-Quellcode:
Es läuft wieder alles gut durch. (Kleinere Schreibfehler beseitigt). Ergebnis ist leider gleich. Geprüft, ob sich am Zeitstempel der Datentabelle nach der Eingabe was ändert. Es ändert sich nichts. Der Zeitstempel bleibt auf den Zeitpunkt der Erstellung 16:10 Uhr. Also in die Datenbank wird nichts Neues geschrieben über den gewählten Zugang. Leider. Es gibt auch keine Fehlermeldung an die man sich halten könnte. Ich kenne keine weitere Stellschraube, wo man prüfen oder ändern könnte. Ist das von mir angeregte Problem so exzotisch? Ich dachte, dass so etwas durchaus üblich wäre oder denke ich da völlig daneben?
procedure TMainFrm.btnTestInput1Click(Sender: TObject);
var CurrentCustomerID: string; begin //qryMain.SQL.Clear; //qryMain.Params.Clear; if IsEdit then begin CurrentCustomerID := lvProductList.Selected.Caption; //qryMain.SQL.Text := 'UPDATE WARENVERKAUF1 SET KDNR=:KDNR,NAME=:NAME,VORNAME=:VORNAME,FIRMA=:FIRMA,PRODUKT=:PRODUKT,ANZAHL=:ANZAHL,PREIS=:PREIS WHERE ID = 2'; qryMain.SQL.Text:= 'UPDATE Warenverkauf1 SET KDNR = :KNR, NAME = :NAM, VORNAME =: VNA, FORMA = : FIR, PRODUKT = : PRO, ANZAHL =: ANZ, PREIS = :PRE WHERE ID =CID'; qryMain.ParamByName('CID').AsString := CurrentCustomerID; qryMain.ParamByName('NAM').AsString := EdtName.text; qryMain.ParamByName('VAN').AsString := EdtVorname.text; qryMain.ParamByName('FIR').AsString := EdtFirma.text; qryMain.ParamByName('PRO').AsString := EdtProdukt.text; qryMain.ParamByName('ANZ').asInteger:=strtoint(edtTestInput2.text); qryMain.ParamByName('PRE').AsString := EdtPreis.text; qryMain.ExecSQL; qryMain.SQL.Text := 'SELECT ID,KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS FROM WARENVERKAUF1'; qryMain.Open; while not qryMain.EOF do begin RefreshItems(qryMain.FieldByName('ID').AsString, qryMain.FieldByName('KDNR').AsString, qryMain.FieldByName('Name').AsString, qryMain.FieldByName('VORNAME').AsString, qryMain.FieldByName('FIRMA').AsString, qryMain.FieldByName('PRODUKT').AsString, Inttostr(qryMain.FieldByName('ANZAHL').AsInteger), qryMain.FieldByName('PREIS').AsString); qryMain.Next; end; end; end; |
AW: gesonderte Ergebnisberechnung in DB-Tab eingeben
So nun die letzte Variante für heute:
Delphi-Quellcode:
Also isEdit war wohl ein Störenfried. Habe ihn rausgenommen. in der Variante nur ID für Anzahl (s.o.) klappt es!!!
procedure TMainFrm.btnTestInput1Click(Sender: TObject);
var CurrentCustomerID: string; begin //if IsEdit then begin CurrentCustomerID := lvProductList.Selected.Caption; qryMain.SQL.Text:= 'UPDATE WARENVERKAUF1 SET ANZAHL = :ANZ WHERE ID= :CID'; //qryMain.SQL.Text:= 'UPDATE Warenverkauf1 SET KDNR = :KNR, NAME = :NAM, VORNAME = : VNA, FIRMA = : FIR, PRODUKT = : PRO, ANZAHL =: ANZ, PREIS = :PRE WHERE ID = :CID'; qryMain.ParamByName('CID').AsString := CurrentCustomerID; //qryMain.ParamByName('KNR').AsString := edtCustomerNumber.text; //qryMain.ParamByName('NAM').AsString := EdtName.text; //qryMain.ParamByName('VNA').AsString := EdtVorname.text; //qryMain.ParamByName('FIR').AsString := EdtFirma.text; //qryMain.ParamByName('PRO').AsString := EdtProdukt.text; qryMain.ParamByName('ANZ').asInteger:=strtoint(edtTestInput2.text); //qryMain.ParamByName('PRE').AsString := EdtPreis.text; qryMain.ExecSQL; qryMain.SQL.Text := 'SELECT ID,KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS FROM WARENVERKAUF1'; qryMain.Open; while not qryMain.EOF do begin RefreshItems(qryMain.FieldByName('ID').AsString, qryMain.FieldByName('KDNR').AsString, qryMain.FieldByName('Name').AsString, qryMain.FieldByName('VORNAME').AsString, qryMain.FieldByName('FIRMA').AsString, qryMain.FieldByName('PRODUKT').AsString, Inttostr(qryMain.FieldByName('ANZAHL').AsInteger), qryMain.FieldByName('PREIS').AsString); qryMain.Next; end; end; end; Er reagiert auf die Eingabe im Editfeld mit 66666 so, dass er mir die Datensätze kopiert und in der Kopie die Eingabe von 66666 aufführt. Beim Neustart ist dann in der Tabelle die 66666 exakt enthalten. Ist zwar komisch, doch es geht erst einmal. Mit allen Feldern wollte er nicht und hat bereits bei VNA gemeckert, dass er VNA nicht kennen würde. Also dann zur Variante 2 - nur Anzahl übergegangen und hier das Ergebnis. Morgen will ich mir die Sache nochmals genauer ansehen. Nochmals vielen Dank bislang. Wenn ihr eine Erklärung für das Verhalten haben solltet, wäre ich dankbar. Jedenfalls klappt es mit dem obigen Code wie beschrieben. |
AW: gesonderte Ergebnisberechnung in DB-Tab eingeben
Halleluja...:thumb:
Zitat:
Was fällt dir in den 3 Codeauszügen auf?
Delphi-Quellcode:
RICHTIG (weil von mir): Leerzeichen als Abtrennung "Name = :PAR", Jeder Paramater ist ein : gefolgt von einem Kürzel "ID = :CID"
qryMain.SQL.Text := 'UPDATE WARENVERKAUF1 SET KDNR = :KNR, NAME = :NAM, VORNAME = :VNA, FIRMA = :FIR, PRODUKT = :PRO, ANZAHL = :ANZ, PREIS = :PRE WHERE ID = :CID';
...
Delphi-Quellcode:
FALSCH: Manche Parameter haben kein : und andere ein Leezeichen im Namen (ANZAHL =: ANZ)
qryMain.SQL.Text:= 'UPDATE Warenverkauf1 SET KDNR = :KNR, NAME = :NAM, VORNAME =: VNA, FORMA = : FIR, PRODUKT = : PRO, ANZAHL =: ANZ, PREIS = :PRE WHERE ID =CID';
...
Delphi-Quellcode:
FALSCH: Manche Parameter haben ein Leezeichen im Namen (ANZAHL =: ANZ)...andere stimmen wieder. (ID = :CID) :gruebel:
qryMain.SQL.Text:= 'UPDATE Warenverkauf1 SET KDNR = :KNR, NAME = :NAM, VORNAME = : VNA, FIRMA = : FIR, PRODUKT = : PRO, ANZAHL =: ANZ, PREIS = :PRE WHERE ID = :CID';
... Das das hier geht ist normal:
Delphi-Quellcode:
...trotzdem: kein Leerzeichen als Abtrennung "ID= :CID"
qryMain.SQL.Text:= 'UPDATE WARENVERKAUF1 SET ANZAHL = :ANZ WHERE ID= :CID';
. Zitat:
Parameter auch wenn es FireDac ist, es ist überall gleich: ![]() Zitat:
Zitat:
|
AW: gesonderte Ergebnisberechnung in DB-Tab eingeben
vergib es mir, es war schon spät und den Tag über wuseln meine beiden Enkel herum. Meine Konzentration war nicht mehr gegeben. Leider habe ich den Fehler gemacht, die mail auszudrucken und dann die Hinweise per Hand statt copy/paste einzugeben. Die Codevervollständigung habe ich eingeschaltet und benutze sie, doch hier und da habe ich wohl einfach nicht drauf gesehen und weitergeschrieben, stur wie ich manchmal so bin. Ich gelobe Besserung. Das mit den Leerzeichen habe ich nicht gewußt.
Nun werde ich die ganze Sache nochmals in Ruhe betrachten. Ist das normal, dass er nach der Eingabe und dem ButtonClick die gesamte Tabelle mit den Datensätzen zb. 1-10 nochmals als neue Tabelle hinter 10 mit 1-10 und den neuen Werten wiederholt? Beim Neustart des Programms ist dann alles paletti mit dem neuen Wert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 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 by Thomas Breitkreuz