Autor Beitrag
Nikola
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
BeitragVerfasst: Mo 24.03.03 15:11 
Hallo,

Wie kann Ich in Tabelle suchen in DBGrid anzeigen und gleichzeitig aus der ergebnismenge Summe berechnen?



ausblenden volle Höhe 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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
  with DM.L_LagerDB do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM l_lager WHERE');
    if (Length(vLager.Legierung)>0) then
    begin
      SQL.Add('Legierung='+QuotedStr(vLager.Legierung)+' and');
    end;
    if (Length(vLager.Werk)>0) then
    begin
      SQL.Add('Werk='+QuotedStr(vLager.Werk)+' and');
    end;
    if (vLager.Aussen>0) then
    begin
      DecimalSeparator:='.';
      SQL.Add('Aussen='+QuotedStr(FloatToStr(vLager.Aussen))+' and');
      DecimalSeparator:=',';
    end;
    if (vLager.Wand>0) then
    begin
      DecimalSeparator:='.';
      SQL.Add('Wand='+QuotedStr(FloatToStr(vLager.Wand))+' and');
      DecimalSeparator:=',';
    end;
    if (vLager.Laenge_von>0) then
    begin
      SQL.Add('Laenge_von='+QuotedStr(IntToStr(vLager.Laenge_von))+' and');
    end;
    if (vLager.Laenge_bis>0) then
    begin
      SQL.Add('Laenge_bis='+QuotedStr(IntToStr(vLager.Laenge_bis))+' and');
    end;
    // Suche Neumaterial aus Lager //
    if (Length(vLager.N_Lager)>0) then
    begin
      if (Length(vLager.W_Lager)>0) or
         (Length(vLager.Z_Lager)>0) or
         (Length(vLager.F_Lager)>0) then
      begin
        SQL.Add('Lager='+QuotedStr(vLager.N_Lager)+' or');
      end else
      begin
        SQL.Add('Lager='+QuotedStr(vLager.N_Lager)+' and');
      end;
    end;
    // Suche Zwischenmaterial aus Lager //
    if (Length(vLager.W_Lager)>0) then
    begin
      if (Length(vLager.Z_Lager)>0) or
         (Length(vLager.F_Lager)>0) then
      begin
        SQL.Add('Lager='+QuotedStr(vLager.W_Lager)+' or');
      end else
      begin
        SQL.Add('Lager='+QuotedStr(vLager.W_Lager)+' and');
      end;
    end;
    // Suche ZBV aus Lager //
    if (Length(vLager.Z_Lager)>0) then
    begin
      if (Length(vLager.F_Lager)>0) then
      begin
        SQL.Add('Lager='+QuotedStr(vLager.Z_Lager)+' or');
      end else
      begin
        SQL.Add('Lager='+QuotedStr(vLager.Z_Lager)+' and');
      end;
    end;
    // Suche Fertigmaterial aus Lager //
    if (Length(vLager.F_Lager)>0) then
    begin
      SQL.Add('Lager='+QuotedStr(vLager.F_Lager)+' and');
    end;
    // Suche Festigkeit Hart //
    if (Length(vLager.H_Festigkeit)>0) then
    begin
      if (Length(vLager.hH_Festigkeit)>0) or
         (Length(vLager.W_Festigkeit)>0) then
      begin
        SQL.Add('Festigkeit='+QuotedStr(vLager.H_Festigkeit)+' or');
      end else
      begin
        SQL.Add('Festigkeit='+QuotedStr(vLager.H_Festigkeit)+' and');
      end;
    end;
    // Suche Festigkeit Halbhart //
    if (Length(vLager.hH_Festigkeit)>0) then
    begin
      if (Length(vLager.W_Festigkeit)>0) then
      begin
        SQL.Add('Festigkeit='+QuotedStr(vLager.hH_Festigkeit)+' or');
      end else
      begin
        SQL.Add('Festigkeit='+QuotedStr(vLager.hH_Festigkeit)+' and');
      end;
    end;
    // Suche Festigkeit Weich //
    if (Length(vLager.W_Festigkeit)>0) then
    begin
      SQL.Add('Festigkeit='+QuotedStr(vLager.W_Festigkeit)+' and');
    end;
    SQL.Add('Nummer>0');
    SQL.Add('ORDER BY Nummer');
  end;
  DM.L_LagerDB.Open;
  StatusBar3.Panels[0].Text:='Gefunden: '+IntToStr(DM.L_LagerDB.RecordCount);
  StatusBar3.Panels[1].Text:='Kg: '+mSumme;


Wo baue ich SELECT SUM(Restmenge) AS mSumme FROM l_lager...

Bitte um Hilfe!

Nikola
kiwicht
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Mo 24.03.03 18:44 
Also eigentlich hatte ich mich jetzt den ganzen Tag davor gesträubt diese Frage zu beantworten, weil´s einfach zu unübersichtlich ist, aber ich bin ja kein Unmensch.

Erstens:

Code-Optimierung:


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 
aus:

if (Length(vLager.Legierung)>0) then 
    begin 
      SQL.Add('Legierung='+QuotedStr(vLager.Legierung)+' and'); 
    end; 

wird

if (Length(vLager.Legierung) > 0 then SQL.Add('Legierung = " +QuotedStr(vLager.Legierung) + ' AND ');

(ich hätte dir die anderen natürlich auch umschreiben können, aber ich bin ja nicht blöd :P, die Schreibarbeit überlasse ich schön dem zuständigen Programmierer :D)


2. Auch SQL mag Leerzeichen:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Die letzten drei SQL.Add´s:
 if (Length(vLager.W_Festigkeit)>0) then 
    begin 
      SQL.Add('Festigkeit='+QuotedStr(vLager.W_Festigkeit)+' and'); 
    end; 
    SQL.Add('Nummer>0'); 
    SQL.Add('ORDER BY Nummer'); 
ergeben als SQL-String, wenn mich nicht alles irrt:

Festigkeit=xxx andNummer>0ORDER BY NUMMER


Also mein Vorschlag, überarbeite den ganzen Algoritmus nochmal was
1. die Übersichtlichkeit
und
2. die Fehlerbeseitung
angeht.
Dann kriegst du vielleicht auch ein paar mehr Hilfestellungen, weil so schreckt das ganze Gedöns unheimlich ab.... ;)

mfg
kiwicht

PS: zum 2. Punkt: da du nicht erwähntest, ob diese ganze Funktion funktioniert (<- LOL...), bin ich mir auch nicht sicher, ob die fehlenden Leerzeichen tatsächlich zu einem Fehler führen, aber der Übersicht wegen würde ich trotzdem ein paar Leerzeichen einbauen ;)

PPS: ist nicht böse gemeint, nur n Tip :D
Nikola Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
BeitragVerfasst: Mo 24.03.03 20:31 
Hallo kiwicht

Also mein Vorschlag, überarbeite den ganzen Algoritmus nochmal was
1. die Übersichtlichkeit
und
2. die Fehlerbeseitung
angeht.
Dann kriegst du vielleicht auch ein paar mehr Hilfestellungen, weil so schreckt das ganze Gedöns unheimlich ab


1.) begin und end tun nichts an die Übersichtlichkeit
2.) es Gibt kein Fehler in der CODE

3.) meine Frage wahr ins code zusatz zu implementieren
das ich aus einem bestimten feld der tabelle Summe bekome
was ich sonst genau den gleichen Code 2x schreiben müste bis
auf die select abfrage

ausblenden Quelltext
1:
SELECT SUM(Restmenge) AS Summe FROM l_lager WHERE					


mfg
Nikola
kiwicht
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Mo 24.03.03 21:52 
Nikola hat folgendes geschrieben:


1.) begin und end tun nichts an die Übersichtlichkeit
2.) es Gibt kein Fehler in der CODE
3.) meine Frage wahr ins code zusatz zu implementieren
das ich aus einem bestimten feld der tabelle Summe bekome
was ich sonst genau den gleichen Code 2x schreiben müste bis
auf die select abfrage

ausblenden Quelltext
1:
SELECT SUM(Restmenge) AS Summe FROM l_lager WHERE					


mfg
Nikola


zu 1.
Zugegeben, es ist Geschmacks-Sache, aber rein technisch gesehen könnte man deinen ganzen Block auf weniger als die Hälfte reduzieren, und für mich wäre das eine Verbesserung, aber egal, ist ja dein Progg ;)

zu 2.
Ok, war ja auch nur ne Vermutung, wenn das natürlich alles fehlerfrei läuft, dann möcht ich nix gesagt haben.

und jetzt nochma ganz explizit zu deiner Frage:

Du willst aus der aus einer SELECT-Abfrage zurück gelieferten Ergebniss-Menge eine Summe eines bestimmten Integer-Datenfeldes berechnen.

Hast du denn schon mal folgendes probiert:

ausblenden Quelltext
1:
2:
3:
SELECT SUM(Restmenge) AS Summe FROM l_lager WHERE  

[...] und hier deine ganzen Bedingungen [...]


Das müsste doch gehen, jedenfalls hab ich eben ma in mein schlaues Büchlein geschaut, und da stehts auch so drin...

hc