Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Count() + Datensätze überschreiben (https://www.delphipraxis.net/160416-count-datensaetze-ueberschreiben.html)

-187- 11. Mai 2011 23:05

Datenbank: Firebird • Version: 2 • Zugriff über: IB

Count() + Datensätze überschreiben
 
Moin ! Ich hab ein seltsames Problem zu dem mir keine Überschrift einfällt ^...

Folgendes habe ich vor:

1. Zähle alle Datensätze die den Status Valid haben.
2. Überschreibe alle Datensätze mit dem Status Waiting die nicht den Status Valid haben.

--> Nach dem überschreiben hatte ich aufeinmal weniger "Valids" als vor dem schreiben. Also mach ich noch:
3. Zähle nochmal alle Datensätze

Ergebnis zu 1.: 119
Ergebnis zu 3.: 71

Source:
Delphi-Quellcode:
    //Zählung 1
    JobQuery1.Close;
    JobQuery1.SQL.Clear;
    JobQuery1.SQL.Add('SELECT COUNT(STATUS) FROM JOBTABLE WHERE STATUS=''Valid'';');
    JobQuery1.Open;
    ShowMessage(JobQuery1.Fields[0].AsString);

    //Alle nicht "Valid" überschreiben
    JobDBGrid1.DataSource.DataSet.DisableControls;
    JobTable1.First;
    while not JobTable1.Eof do
    begin
      RowNumber:=JobTable1.FieldByName('ROWNUMBER').AsString;
      if not (JobTable1.FieldByName('STATUS').AsString='Valid') then
      begin
        myList.Add(RowNumber);
        JobQuery1.Close;
        JobQuery1.SQL.Clear;
        JobQuery1.SQL.Add(Format('UPDATE %s SET '+
        '%s = ''%s'''+
        'WHERE ROWNUMBER = ''%s'';', [fMain.JobTable1.TableName,'STATUS','Waiting',RowNumber]));
        JobQuery1.Open;
        JobQuery1.Close;
      end;
      JobTable1.Next;
    end;
    JobDBGrid1.DataSource.DataSet.EnableControls;

    //Zählung 2
    JobQuery1.Close;
    JobQuery1.SQL.Clear;
    JobQuery1.SQL.Add('SELECT COUNT(STATUS) FROM JOBTABLE WHERE STATUS=''Valid'';');
    JobQuery1.Open;
    ShowMessage(JobQuery1.Fields[0].AsString);

:?::?::?:


Edit: Moment, eine Sache prüfe ich nochmal :)

s.h.a.r.k 11. Mai 2011 23:11

AW: Count() + Datensätze überschreiben
 
Ich kapier deine Logik nicht so recht :gruebel: Du willst alle Datensätze ändern, die nicht den Status Valid haben, richtig? Du willst dann den Wert von der Spalte Status auf Waiting setzen? Warum machst du das nicht in einer Query?

Code:
UPDATE table SET Status = 'Waitung' WHERE Status <> 'Valid'
Zudem solltest du deine Queries parametrisieren -- mein Query ist das wahrlich nicht, ich weiß. Es ging dabei ja auch nur um die Query selbst.

PS: Danach kannst du via Query.RowsAffected die Anzahl der geänderten Datensätze abfrage. Je nach Komponenten heißt die Property evtl. anders.

tsteinmaurer 11. Mai 2011 23:15

AW: Count() + Datensätze überschreiben
 
Versteh ich nicht, warum du soviel Logik in die Client-Applikation bringst.

Reicht nicht einfach ein simples:

Code:
update jobtable set status = 'Waiting' where status <> 'Valid'
???

Thomas

-187- 11. Mai 2011 23:18

AW: Count() + Datensätze überschreiben
 
Hmm :) Warum einfach wenns auch kompliziert geht ? ..keine Ahnung warum ich es mir so schwer gemacht habe. Danke für den Ansatz, damit stimmt die Zählung.

Trotzdem versteh ich nicht warum mein Code nicht funktioniert. (Abgesehen von dem Schwachsinn den ich da gemacht hab) :thumb:

s.h.a.r.k 11. Mai 2011 23:19

AW: Count() + Datensätze überschreiben
 
Vielleicht wegen deiner ROWNUMBER-Einschränkung?

tsteinmaurer 11. Mai 2011 23:20

AW: Count() + Datensätze überschreiben
 
Abhaken und gar keine Zeit mehr verschwenden, warum es nicht funktioniert. Mach ich auch. :-D

lg,
Thomas

-187- 11. Mai 2011 23:21

AW: Count() + Datensätze überschreiben
 
Na ja so einfach kann ich es mir nicht machen :) Vielleicht habt ihr "myList.Add(RowNumber);" übersehen. Die Liste verarbeite ich später noch.

//Edit: @Armin, falls du auf Duplicates hinaus willst, das habe ich bereits geprüft -> Keine Dups vorhanden.

tsteinmaurer 11. Mai 2011 23:26

AW: Count() + Datensätze überschreiben
 
Weil er vermutlich mit JobQuery1.Open dein DML-Statement gar nicht ausführt. Du musst dazu JobQuery1.Execute oder Ähnliches verwenden.

Thomas

s.h.a.r.k 11. Mai 2011 23:28

AW: Count() + Datensätze überschreiben
 
Nein, darauf wollte ich nicht hinaus. Denn dann hätte die UPDATE-Query halt zwei Datensätze geupdatet, d.h. das Problem definitiv wo anders.

Die ROWNUMBER kannst ja in einem weiteren SELECT mit WHERE Status <> 'Valid' abfragen und in eine Liste werfen.

-187- 11. Mai 2011 23:36

AW: Count() + Datensätze überschreiben
 
Jap, hab es jetzt umgebaut -> Funktioniert :thumb:

Trotzdem, werde da vielleicht nochmal nachhaken 8-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz