Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Rechnungsproblem (https://www.delphipraxis.net/79285-sql-rechnungsproblem.html)

manfred_h 19. Okt 2006 16:37

Datenbank: Firebird • Version: 1.5 • Zugriff über: Fibplus

SQL Rechnungsproblem
 
Hallo zusammen

hab hier ein Problem. Seit einiger Zeit versuche ich aus 2 Tabellen 2 Werte
voneinander abzuziehen.
Irgendwie stehe ich auf dem Schlauch. Wie komme ich an den Wert damit ich
mit ihm die rechnung machen kann?

Delphi-Quellcode:
  DM_bibeladmin.Art_value.close;
  DM_bibeladmin.Art_value.SelectSQL.Clear;
  DM_bibeladmin.Art_value.SelectSQL.Add('SELECT SUM(IN_COUNT)FROM BIBEL_ART_D WHERE '+
                                          '(( ID_ART = :ID) AND ( I_O = 1))');

  i := strtoInt(dm_bibeladmin.Art_value.??????);
  //
  DM_bibeladmin.Art_value.close;
  DM_bibeladmin.Art_value.SelectSQL.Clear;
  DM_bibeladmin.Art_value.SelectSQL.Add('SELECT SUM(IN_COUNT)FROM BIBEL_ART_D WHERE '+
                                          '(( ID_ART = :ID) AND ( I_O = 0))');

  o := strtoInt(dm_bibeladmin.Art_value.??????);

PS: mit der SQLabfrage erhalte ich einen Wert.
SQL-Code:
('SELECT SUM(IN_COUNT)FROM BIBEL_ART_D WHERE '+
                                          '(( ID_ART = :ID) AND ( I_O = 1))');

Shalom
Manfred

mkinzler 19. Okt 2006 16:44

Re: SQL Rechnungsproblem
 
Delphi-Quellcode:
DM_bibeladmin.Art_value.SelectSQL.Add('SELECT SUM(IN_COUNT) as summe FROM BIBEL_ART_D WHERE '+
                                          '(( ID_ART = :ID) AND ( I_O = 1))');

  i := strtoInt(dm_bibeladmin.Art_value.FieldByName('Summe').Value;);

alzaimar 19. Okt 2006 16:48

Re: SQL Rechnungsproblem
 
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
DM_bibeladmin.Art_value.SelectSQL.Add('SELECT SUM(IN_COUNT) as summe FROM BIBEL_ART_D WHERE '+
                                          '(( ID_ART = :ID) AND ( I_O = 1))');
DM_bibeladmin.Art_value.SelectSQL.Active := True; // <---- das fehlte noch (die Query muss ja zum Server)
  i := strtoInt(dm_bibeladmin.Art_value.FieldByName('Summe').Value;);


mkinzler 19. Okt 2006 16:49

Re: SQL Rechnungsproblem
 
Zitat:

Zitat von alzaimar
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
DM_bibeladmin.Art_value.SelectSQL.Add('SELECT SUM(IN_COUNT) as summe FROM BIBEL_ART_D WHERE '+
                                          '(( ID_ART = :ID) AND ( I_O = 1))');
DM_bibeladmin.Art_value.SelectSQL.Active := True; // <---- das fehlte noch (die Query muss ja zum Server)
  i := strtoInt(dm_bibeladmin.Art_value.FieldByName('Summe').Value;);


So genau hab ich mir den Code nicht angeschaut. Stimmt natürlich!

manfred_h 19. Okt 2006 17:36

Re: SQL Rechnungsproblem
 
Besten dank für Eure schnelle Hilfe !!!

konnte es mit Eurer Hilfe so lösen:
Delphi-Quellcode:
  DM_bibeladmin.Art_value.close;
  DM_bibeladmin.Art_value.SelectSQL.Clear;
  DM_bibeladmin.Art_value.SelectSQL.Add('SELECT SUM(IN_COUNT) as summe FROM BIBEL_ART_D WHERE '+
                                          '(( ID_ART = :ID) AND ( I_O = 1))');
  DM_bibeladmin.Art_value.Active := True;

  i := strtoInt (DM_bibeladmin.Art_value.FieldByName('Summe').Value);
  //
  //
  DM_bibeladmin.Art_value.close;
  DM_bibeladmin.Art_value.SelectSQL.Clear;
  DM_bibeladmin.Art_value.SelectSQL.Add('SELECT SUM(OUT_COUNT) as summe FROM BIBEL_ART_D WHERE '+
                                          '(( ID_ART = :ID) AND ( I_O = 0))');
  DM_bibeladmin.Art_value.Active := True;

  o := strtoInt (DM_bibeladmin.Art_value.FieldByName('Summe').Value);
  //
  //
  c := i - o;
  DM_bibeladmin.Bibel_Art.Edit;
  DM_bibeladmin.Bibel_Art.FieldByName('STOCK').Value := c ;
  DM_bibeladmin.Bibel_Art.CommitUpdToCach;
ein kleines Problem bleibt noch wenn nicht drinn ist NULL dann giebts ein Problem.


Shalom
Manfred

Hansa 19. Okt 2006 20:35

Re: SQL Rechnungsproblem
 
Du meinst die "Summe" ?

Dann müßte man so ungefähr prüfen :

Delphi-Quellcode:
if not DM_bibeladmin.Bibel_Art.FieldByName('SUMME').IsNull then
...

mkinzler 19. Okt 2006 20:40

Re: SQL Rechnungsproblem
 
Ich würde nicht die Summe auf NULL prüfen, sondern verhindern das Null-Werte summiert werden:
SQL-Code:
SELECT SUM(IN_COUNT) as summe FROM BIBEL_ART_D WHERE (( ID_ART = :ID) AND ( I_O = 1)) and ( IN_COUNT is not NULL);
Sonst führt schon ein leerer Record zu keinem Ergebnis mehr.

Hansa 19. Okt 2006 21:01

Re: SQL Rechnungsproblem
 
Könnte zu unsicher sein. Wird die Summe auf NULL geprüft, wie bei mir, dann ist das Ergebnis = NULL, sofern auch nur EIN Datensatzfeld NULL ist. Dann könnte man eine Meldung bringen : "Genaue Summe kann nicht ermittelt werden, weil mind. ein Feld undefiniert". Habe ich 20 Zahlen und will irgendwas vorhandenes addieren, 10 Zahlen sind undefiniert (also=NULL), dann wird eben eine Summe über alles was <> NULL ist, zurückgeliefert ! Eventuell ist das auch hinzunehmen, wenn es selten vorkommt und die Summe nicht zu 100% stimmen muß. Kleiner aber feiner Unterschied, den man je nach Anforderung wissen sollte.

mkinzler 19. Okt 2006 21:07

Re: SQL Rechnungsproblem
 
Natürlich kommt es auf den Inhalt (Bedeutung) dieses Feldes an. Die beste Lösung wäre natürlich die Nullwerte mittels Constraint oder default zu verhindern.

raiguen 19. Okt 2006 21:57

Re: SQL Rechnungsproblem
 
Moin :-)
Hm, bin grad schwer am Grübeln... Habe mich noch nie bei einem SQL_statemnet bzgl der SUM()-Funktion um NULL-Werte der zu summierenden Felder gestört bzw Gedanken gemacht - sprich: selbst wenn ein Feld NULL ist, dann hat mich bzw in keinster Weise gestört. Woraus ich somit schließe: der SQL-Server handelt die NULL-Werte entsprechend selbsttätig, so dass IMMER korrekte Ergebnisse herauskommen.
Sicherlich sollten Feldwerte - speziell bei Feldern, die zur Berechnung herangezogen werden - keine NULL-Werte zulässig sein; ich belege diese dann meist wenn 0 vor bzw jen nach Verwendungszweck auch mit anderen 'Default'-Werten; somit bin ich immer auf der sicheren Seite *denkich*

Soweit dazu...

Hansa 20. Okt 2006 00:56

Re: SQL Rechnungsproblem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Stop, es ist noch etwas komplizierter, als gedacht. Sum etc. summiert z.B. nur die NOT NULL Felder. Das habe ich gemeint. Da muß man eventuell aber eingreifen. Was ich eigentlich meinte war aber, daß die IF usw. Geschichten, wobei ein Feld NULL ist das Ganze über den Haufen schmeißen, sofern NULL-Felder ins Spiel kommen.

Zitat:

In aggregate functions only non-NULL fields are involved in the computation. Exception: COUNT(*).
Das geht aber noch viel weiter. Am Null-Guide führt deshalb IMHO kein Weg mehr vorbei. Da steht alles genau drin.

manfred_h 20. Okt 2006 08:22

Re: SQL Rechnungsproblem
 
Guten Morgen

vielen Dank für Eure Bemühungen :thumb:
werde das alles anschauen.

Shalom
Manfred

jensw_2000 20. Okt 2006 09:19

Re: SQL Rechnungsproblem
 
Gibt es in Firebird keine ISNULL Funktion ?

ISNULL ersetzt bei folgendem Aufruf alle NULL Werte durch 0

SQL-Code:
SELECT SUM(ISNULL(IN_COUNT,0)) AS Summe
FROM BIBEL_ART_D
WHERE (( ID_ART = :ID) AND ( I_O = 1));

manfred_h 20. Okt 2006 10:52

Re: SQL Rechnungsproblem
 
Danke nun läufts.

konnte das ganze so lösen.

Delphi-Quellcode:
  DM_bibeladmin.Art_value.close;
  DM_bibeladmin.Art_value.SelectSQL.Clear;
  DM_bibeladmin.Art_value.SelectSQL.Add('SELECT SUM(IN_COUNT) as summe FROM BIBEL_ART_D WHERE '+
                                          '(( ID_ART = :ID) AND ( I_O = 1))');
  DM_bibeladmin.Art_value.Active := True;
    if DM_bibeladmin.Art_value.FieldByName('Summe').IsNull
     then i := 0
     else i := strtoInt (DM_bibeladmin.Art_value.FieldByName('Summe').Value) ;
  //
  //
  DM_bibeladmin.Art_value.close;
  DM_bibeladmin.Art_value.SelectSQL.Clear;
  DM_bibeladmin.Art_value.SelectSQL.Add('SELECT SUM(OUT_COUNT) as summe FROM BIBEL_ART_D WHERE '+
                                          '(( ID_ART = :ID) AND ( I_O = 0))');
  DM_bibeladmin.Art_value.Active := True;
    if DM_bibeladmin.Art_value.FieldByName('Summe').IsNull
     then o := 0
     else o := strtoInt (DM_bibeladmin.Art_value.FieldByName('Summe').Value) ;
  //
  //
  c := i - o;
  DM_bibeladmin.Bibel_Art.Edit;
  DM_bibeladmin.Bibel_Art.FieldByName('STOCK').Value := c ;
  DM_bibeladmin.Bibel_Art.CommitUpdToCach;
end;
Shalom
Manfred


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.

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