| Autor |
Beitrag |
Krischa
      
Beiträge: 118
Windows 7 64 Bit
Delphi 2007
|
Verfasst: Fr 29.05.09 08:27
Hi,
ich möchte ein Feld überprüfen ob es einen negativen oder einen positiven Inhalt hat, damit ich weiß ob eine Rechnung oder eine Gutschrift gedruckt werden muss. Bedingung: Wenn alle negativen Wert haben zu einer Rechnungsnummer -> Gutschrift ansonsten Rechnung:
Habe bisher folgenden Code. Er will einfach nicht die while-Schleife durchlaufen. Er ingoriert den Teil komplett und gibt mir eine Gutschrift raus. Negativ und Positiv sind die jeweiligen Zählvariablen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| for i := 0 to rechnungsnummer.Count - 1 do begin rech:=true; positiv:=0; negativ:=0; query1.DatabaseName:=pfad1; query1.SQL.Text:='SELECT * FROM '+abe1+' WHERE RENR="'+rechnungsnummer[i]+'"'; query1.open; while not query1.eof do begin positiv:=positiv+1; if (query1.fieldbyname('VP').Value<0) then begin negativ:=negativ+1; end; query1.Next; end; query1.First; if positiv=negativ then rech:=false; if rech=true then ni:=Rechnung(ni) else ni:=Gutschrift(ni); query1.Close; end; |
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 29.05.09 08:34
Ich vermute, dass query1.eof am Beginn der Scheife schon TRUE ist. Daher wird die Schleife nicht durchlaufen. Ich denke, Du wirst Dein Problem im SQL-Statement suchen müssen.
Noch ein paar Anmerkungen: Du solltest vielleicht Dich mal die Parametern auseinandersetzen. Und warum machst Du ein SELECT *.., wenn Du nur das Feld VP benötigst?
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Krischa 
      
Beiträge: 118
Windows 7 64 Bit
Delphi 2007
|
Verfasst: Fr 29.05.09 08:46
Ein Select * ist von Nöten damit ich an den Rest der Felder komme. nach der Überprüfung muss ich ja noch die Rechnung/Gutschrift drucken und ohne Werte geht es Schlecht. Die Schleife ist halt noch nicht fertig. Wenn ich die gleiche Select-Anweisung direkt auf der Datenbank mache findet er 8 Datensätze. Und wenn ich im Programm schreibe:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| while query1.eof do begin positiv:=positiv+1; if (query1.fieldbyname('VP').Value<0) then negativ:=negativ+1; query1.Next; end; |
dann bringt er mir 70 000 Datensätze aber die 8 die er bringen soll Fehlen. (not im while-Kopf weggelassen)
| Zitat: | | Du solltest vielleicht Dich mal die Parametern auseinandersetzen. |
Ich benutze noch nicht solange Delphi und SQL was meinst du damit?
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 29.05.09 09:22
Das "not" gehört schon in den Kopf der While-Schleife.
Schau Dir mal wirklich im Debugger den Wert von query1.SQL.Text an. Oder per ShowMessage ausgeben lassen. Und dann vielleicht mal kopieren und direkt auf der DB ausführen. Ich bin mir sicher, dass dort der Fehler liegen muss.
Mit Parametern muss man nicht die Abfrage zu zusammenbasteln, wie Du es machst. Das hilft auch, solche Fehler zu vermeiden. Die Quellcode wird viel besser lesbar.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 29.05.09 09:28
Ich frage mich, wieso Du nicht bereits per SQL die Summe bildest und prüfst, ob diese > 0 ist.
|
|
Krischa 
      
Beiträge: 118
Windows 7 64 Bit
Delphi 2007
|
Verfasst: Fr 29.05.09 09:29
Ich lasse mir die SQL-Anweisung im showmessage anzeigen und sehe keinen Fehler. Das mit dem Parametern muss sein. Ich lese am anfang eine Systemtabelle aus in der dann die ganzen Tabellennamen und pfade drin stehen. Geht leider nicht anders.
@deddyh
Bedingung für Gutschrift ALLE Werte im Feld VP müssen negativ sein
Bedingung für Rechnung es dürfen sowohl positive als auch negative Werte im Feld VP sein
=> Summe bringt mir garnix
Zuletzt bearbeitet von Krischa am Fr 29.05.09 09:32, insgesamt 3-mal bearbeitet
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 29.05.09 09:30
DeddyH hat folgendes geschrieben : | | Ich frage mich, wieso Du nicht bereits per SQL die Summe bildest und prüfst, ob diese > 0 ist. |
Wenn ich das richtig verstehe, prüft er ja nicht die Endsumme, sondern zählt die Positiven und Negativen Positionen der Rechnung. Wenn es mehr negative als positive Positionen gibt, ist es für ihn eine Gutschrift.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 29.05.09 09:38
Auch das ginge per SQL, dann muss man nicht am Client "hampeln" 
|
|
Krischa 
      
Beiträge: 118
Windows 7 64 Bit
Delphi 2007
|
Verfasst: Fr 29.05.09 09:43
Und was müsste ich machen damit es per SQL geht?
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 29.05.09 09:45
DeddyH hat folgendes geschrieben : | Auch das ginge per SQL, dann muss man nicht am Client "hampeln"  |
Nur mal interessehalber, wie würdest Du es machen?
Ich sehe 2 Möglichkeiten:
1. 2 Abfragen:
SQL-Anweisung 1: 2:
| SELECT COUNT(*) FROM TABELLE WHERE WERT < 0 AND RENR = 4711 SELECT COUNT(*) FROM TABELLE WHERE WERT >= 0 AND RENR = 4711 |
Dabei Werte merken und hinterher vergleichen
2. Möglichkeit: Beides in eine Abfrage fummeln:
SQL-Anweisung 1: 2: 3: 4: 5:
| SELECT COALESCE((SELECT COUNT(*) FROM TABELLE WHERE WERT < 0 AND RENR = 4711), 0) > COALESCE((SELECT COUNT(*) FROM TABELLE WHERE WERT >= 0 AND RENR = 4711),0) AS ISGUTSCHRIFT FROM RDB$DATABASE |
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 29.05.09 09:52
So etwas müsste auch gehen (ungetestet):
SQL-Anweisung 1: 2: 3:
| SELECT SUM(CASE WHEN Wert > 0 THEN 1 ELSE -1 END) AS IsGutschrift FROM Tabelle WHERE ReNr = 4711 |
|
|