Autor Beitrag
Arne Danikowski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Fr 16.01.09 17:40 
Hallo,

ich habe hier so ein kleines Programm bei dem Abrechnungen zu einem bestimmten Datum eingegeben werden.
Nun soll über ein Button alle Summen eines Tabellenfeldes zusammengezählt werden.

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:
27:
28:
29:
30:
procedure TVMain.BitBtnSummeClick(Sender: TObject);
trech1,trech2:single;
Var tagesdatum:String;
begin
  Tagesdatum := DateToStr(now); //Tagesdatum in Stringvariable
  DM.ADOAbrechnung.SQL.Clear; 
  DM.ADOAbrechnung.SQL.Text := 'Select * from Abrechnung WHERE (datum like ' + QuotedStr(tagesdatum) + ')'; //Datenbank nach Tagesdatum Filtern
  DM.ADOabrechnung.Open;
  DM.ADOTSK.Edit; //Tabelle in Editmodus
  DM.ADOTSK.Insert; //Neuen Datensatz anlegen
  DM.ADOTSK.FieldByName('Datum').AsDateTime :=StrToDate(tagesdatum); //Tagesdatum an Tabell in Feld Datum übergeben
  try
    DM.ADOabrechnung.First;
    begin
      while not DM.ADOAbrechnung.EOF do

      begin
        trech1 := StrToFloat(DM.ADOAbrechnung.FieldByName('Summe').AsString); //Wert aus Feld Summe erster datensatz in Variable
        trech2 := (trech1 + trech2); // Addition Startwert für trech2 ist 0
        DM.ADOTSK.Edit; //Tabelle Editmodus
        DM.ADOTSK.FieldByName('Summe').AsString := FloatToStrF(trech2, ffnumber, 7, 2); //Ergebnis aus Addition in Tabelle schreiben
        DM.ADOTSK.Post; //Tabelle speichern
        DM.ADOAbrechnung.Next; //Nächster Datensatz beginne bei trech1:= ........
      end;

    end;
  finally
DM.ADOTSK.Open; //Alles fertig aktualisiere Tabelle
  end;
    end;


Nun passiert folgendes: Der Datensatz wird angelegt, das Datum eingetragen aber es wird kein Wert in das Feld Summe geschrieben.
Ich erhalte auch keine Fehlermeldung.

Was mach ich falsch?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 16.01.09 18:50 
Wieso willst Du ein berechnetes Feld in die DB schreiben? Und wieso tust Du das innerhalb der Schleife immer wieder? Und wenn das Schreiben unbedingt nötig ist, wäre das auf DB-Ebene (Stored Procedure) nicht sinnvoller?
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Fr 16.01.09 19:35 
Das ist ja die Frage.
ich will ja kein berechnendes Feld in die DB schreiben, sondern ein Ergebnis.
Dieses Ergebnis setzt sich auch mehreren Datensätzen einer anderen Tabelle zusammen.

Also noch mal:

Ich erstelle Datensätze an einem bestimmten Datum. Können mehrerer sein. Die Anzahl ist verschieden.
Diese Datensätze haben ein Feld mit einer Summe X

Wenn diese Datensätze fertig eingegeben würden, möchte ich über einen Button einen sogenannten Abschluss machen.
Das Feld Summe aus X Datensätze an Tag X ergeben Summe y

Diese Summe Y möchte ich ein eine andere Tabelle schreiben. Diese Tabelle hat 2 Felder

1. Datum
2. Summe Y

Somit weiß ich, welche Gesamtsumme am Tag X eingegeben worden ist.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 16.01.09 19:44 
Naja, dann würde ich das aber zumindest per SQL machen und nicht per Client-Anwendung.
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
INSERT INTO Summentabelle(Datum, Summe)
  SELECT aDatum, aSumme FROM(
    SELECT Datum AS aDatum, SUM(Summe) AS aSumme
    FROM Abrechnung 
    WHERE (aDatum like tagesdatum)
    GROUP BY aDatum) x


Sollte das nicht gehen, müsste man das eben in 2 Schritten machen: erst die Summe ermitteln, dann eintragen.