AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken gesonderte Ergebnisberechnung in DB-Tab eingeben
Thema durchsuchen
Ansicht
Themen-Optionen

gesonderte Ergebnisberechnung in DB-Tab eingeben

Ein Thema von EdAdvokat · begonnen am 11. Apr 2017 · letzter Beitrag vom 13. Apr 2017
Antwort Antwort
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.429 Beiträge
 
Delphi 12 Athens
 
#1

AW: gesonderte Ergebnisberechnung in DB-Tab eingeben

  Alt 11. Apr 2017, 15:21
Hallöle...
Zitat:
Abfrage eines Datensatzes
Query.sql.text := 'Select irgendwas...';
Öffnen
Query.Open;
Datenzeiger positionieren
Query.first;
Editmode einschalten
Query.edit;
Feld ändern
Query.fieldByName('feldname').asinteger := ....
Zurückschreiben
Query.Post;
..bitte keine DB sensitiven Controls. Späterhinaus will er seine Daten in Objektlisten speichern...
Zitat:
denke ich er ist auf dem richtigen Weg. Ob die Syntax so ganz richtig ist(?) Bei mir werden die Parameter immer mit .Value:= übergenen.
...Value ist auch eine Möglichkeit. Aber intern hat er immer den Cast zu richtigem Typ. As...spricht gleich den richtigen Typ der in der DB an. So findet auch heraus das man einen falschen Typ übergeben hat.

Zum Problem am Beispiel:
Delphi-Quellcode:
qryMain.SQL.Text := 'UPDATE WARENVERKAUF SET KDNR=:KDNR,NAME=:NAME,VORNAME=:VORNAME,FIRMA=:FIRMA,PRODUKT=:PRODUKT,ANZAHL=:ANZAHL,PREIS=:PREIS,MEMO=:MEMO WHERE ID = :CID';
qryMain.ParamByName('CID').AsString := CurrentCustomerID; // Ist die ID auch bekannt? Was sagt der Debugger über den Wert?
qryMain.ParamByName('Anzahl').AsInteger:= edtTestInput.Text;
qryMain.ExecSQL;
... Was steht im Feld ID der Datenbank drin? LEHMANN = ID(?) Du kannst nicht einfach den Wert eintragen. Du mußt auch der Datenbank sagen zu welchem Kunden (CurrentCustomerID) der Wert gehört.
Mache ein Edit nebendran mit der ID des Datensatzes. Diese "ausgewählte" ID übergibst du dem UPDATE Statement anstatt der CurrentCustomerID. Nach dem Eintragen in die DB mußt du auch die Daten wieder abholen (SELECT) und die LV aktualisieren.

Geändert von haentschman (11. Apr 2017 um 15:39 Uhr)
  Mit Zitat antworten Zitat
EdAdvokat

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

AW: gesonderte Ergebnisberechnung in DB-Tab eingeben

  Alt 11. Apr 2017, 16:39
Hoffentlich stelle ich mich nicht zu blöd an. So sieht nun die neue ButtonClick-Procedure aus:

Delphi-Quellcode:
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;
Ich bin nicht sicher, ob ich Dein Hinweis richtig aufgenommen habe.
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.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: gesonderte Ergebnisberechnung in DB-Tab eingeben

  Alt 11. Apr 2017, 16:51
in dem UPDATE muß es dann heißen Where ID=2 und für den SELECT
Delphi-Quellcode:
   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;
und ich packe immer vor und hinter jede Query noch ein .Close also
Delphi-Quellcode:
   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;
damit ich mir keinen Dreck einhandele.

Gruß
K-H

P.S.
das .Close natürlich auch vor das Update-Statement.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (11. Apr 2017 um 16:54 Uhr)
  Mit Zitat antworten Zitat
EdAdvokat

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

AW: gesonderte Ergebnisberechnung in DB-Tab eingeben

  Alt 11. Apr 2017, 17:16
nach den Vorschlägen von K.H sieht meine Procedure für den neuen Testbutton so aus:
Delphi-Quellcode:
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;
Hoffentlich ist das richtig. Er läuft jedenfalls durch.
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?
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: gesonderte Ergebnisberechnung in DB-Tab eingeben

  Alt 11. Apr 2017, 17:26
Zunächst:
Delphi-Quellcode:
   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;
dann würde ich den Update auf das/die Felder beschränken, die Du wirklich übergibst.
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 IsEdit auf sich?
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
EdAdvokat

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

AW: gesonderte Ergebnisberechnung in DB-Tab eingeben

  Alt 11. Apr 2017, 17:53
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.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.429 Beiträge
 
Delphi 12 Athens
 
#7

AW: gesonderte Ergebnisberechnung in DB-Tab eingeben

  Alt 11. Apr 2017, 19:52
Hallöle...
Zitat:
das .Close natürlich auch
immer wieder interessant wie sich manche Aussagen halten. Das CLOSE muß nicht hin. Die Query macht intern ein automatisch ein CLOSE im Ausführen vor dem Setzen des SQL.Text
Umkehrschluß: Ich habe noch nie ein Close benötigt.

Zitat:
hab ich erst jetzt bemerkt, was hat es mit IsEdit auf sich?
...aus seinem letzten Testprojekt...ein Flag für den Bearbeiten Modus. Hier nicht relevant.

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;
  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 08:55 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