Autor Beitrag
Krischa
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 118

Windows 7 64 Bit
Delphi 2007
BeitragVerfasst: 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.

ausblenden 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<0then
    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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 118

Windows 7 64 Bit
Delphi 2007
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 while query1.eof do
   begin
    positiv:=positiv+1;
    if (query1.fieldbyname('VP').Value<0then
      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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 118

Windows 7 64 Bit
Delphi 2007
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 29.05.09 09:30 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: Fr 29.05.09 09:38 
Auch das ginge per SQL, dann muss man nicht am Client "hampeln" ;)
Krischa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 118

Windows 7 64 Bit
Delphi 2007
BeitragVerfasst: Fr 29.05.09 09:43 
Und was müsste ich machen damit es per SQL geht?
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 29.05.09 09:45 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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:
ausblenden 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),0AS 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



BeitragVerfasst: Fr 29.05.09 09:52 
So etwas müsste auch gehen (ungetestet):
ausblenden SQL-Anweisung
1:
2:
3:
SELECT SUM(CASE WHEN Wert > 0 THEN 1 ELSE -1 ENDAS IsGutschrift
FROM Tabelle
WHERE ReNr = 4711