[gelöst]Summe über eine Spalte erstellen ohne Flow Field

6. Juni 2007 07:44

Hallo Zusammen,

ich muss eine Summe über eine Spalte machen und das Ergebnis am besten in eine Variable speichern, wie muss ich denn da vorgehen, wenn ich kein Flow Field verwenden will?

Vielen Dank!

Grüsse
Silvia
Zuletzt geändert von Silvia am 6. Juni 2007 09:26, insgesamt 1-mal geändert.

6. Juni 2007 08:15

Ich denke CALCSUMS ist was Du suchst:
CALCSUMS (Record)
Use this function to calculate the total of a column of SumIndexFields in a C/SIDE table. Using parameters, you can tell the system exactly which fields to calculate.

[Ok :=] Record.CALCSUMS (Field1, [Field2],...)
Ok

Data type: boolean

If you omit this optional return value and if one of the fields is not a SumIndexField, a run-time error occurs. If you include a return value, the system assumes you will handle any errors.

Record

Data type: record

The record that contains the SumIndexFields you want to calculate.

Field1, Field2, ...

Data type: decimal

One or more decimal fields, which are defined as SumIndexFields, in the current key.

Comments
Use this function to total columns in a table. This function operates only on records that meet the conditions of any filters associated with the record.

Example
This example shows how to use the CALCSUMS function.

"Cust. Ledger Entry".SETCURRENTKEY("Customer No.","Date");
"Cust. Ledger Entry".SETRANGE("Customer No.", 'AAA 1050');
"Cust. Ledger Entry".SETRANGE("Date", 010196D, 123196D);
"Cust. Ledger Entry".CALCSUMS("Amount");

The first line selects a key. The second and third lines set filters for the fields Customer No. and Date in the Cust. Ledger Entry record so the total is only calculated within the specified range. The CALCSUMS function then finds the net change in account AAA 1050 for 1996. The Amount field will show the result of the calculation.

6. Juni 2007 08:17

Ganz ohne FlowFields und SumIndexFields:

Code:
//Filter setzen
Record.SETRANGE(...); oder Record.SETFILTER(...); // sofern notwendig
Variable := 0;
IF Record.FINDFIRST THEN REPEAT
  Variable += Record.Feld; // steht für Variable := Variable + Record.Feld;
UNTIL Record.NEXT = 0;


Fertig!

6. Juni 2007 08:40

Hmmm, da muss der "Performance Optimierer" in mir gringfügige Änderungen anraten (zumindest wenn der Code auf SQL Server läuft):

Code:
//Filter setzen
Record.SETRANGE(...); oder Record.SETFILTER(...); // sofern notwendig
Variable := 0;
IF Record.FINDSET(FALSE, FALSE) THEN REPEAT
  Variable += Record.Feld; // steht für Variable := Variable + Record.Feld;
UNTIL Record.NEXT = 0;


FINDFIRST sollte nur dann verwendetet werden, wenn auch nur der erste Datensatz verwendet wird. Sobald ein Result-Set (= Mehrzahl von Datensätzen) bearbeitet wird, dann sollte der FINDSET oder u.U. noch der alte FIND('-') benutzt werden ...

(Ja, ich weiß, diese Haarspaltereien sind nervig ... :oops: )

6. Juni 2007 08:47

stryk hat geschrieben:FINDFIRST sollte nur dann verwendetet werden, wenn auch nur der erste Datensatz verwendet wird. Sobald ein Result-Set (= Mehrzahl von Datensätzen) bearbeitet wird, dann sollte der FINDSET oder u.U. noch der alte FIND('-') benutzt werden ...


Mist, dann hab ich das mal wieder verwechselt ... Eigentlich schreibe ich immer FIND('-') und wollte mir angewöhnen, performanceoptimiert zu schreiben *g*

6. Juni 2007 08:52

vielen Dank schon mal an Euch!

Natalie Deine Lösung fand ich gut, da ich keine FlowFields usw. brauche! :-)

Jetzt hab ich noch eine Frage:

ich habe eine Form über die ich Filter setzen lasse die dann in Textboxen stehen zb. Zähler auswählen, Zählernr. usw.
danach soll eine Textbox mit der Summenberechnung gefüllt werden, wie kann ich es steuern dass dieses Summenfeld gefüllt wird nachdem alle Filter gewählt wurden?

6. Juni 2007 09:12

@Natalie & Stryk
stryk hat geschrieben:Ja, ich weiß, diese Haarspaltereien sind nervig .


Finde ich gar nicht, :-P
gerade durch solche Diskussionen können alle beteiligten (bzw. Forenmitglieder) etwas lernen!
Gruß Mikka

6. Juni 2007 09:13

Die Textbox muss die Eigenschaft "SourceExpr" = den Namen deiner gefüllten Variable haben.

6. Juni 2007 09:26

uuups ja genau...das hatte ich ganz vergessen, danke!

6. Juni 2007 11:03

mikka hat geschrieben:Finde ich gar nicht, :-P
gerade durch solche Diskussionen können alle beteiligten (bzw. Forenmitglieder) etwas lernen!
Gruß Mikka


In dem Fall auf jeden Fall :wink:

Ich wusste z.B. nicht, dass man FINDFIRST nur verwenden soll, wenn nur der 1. Datensatz erwartet wird. Ich hatte das einfach als neuere Funktion zu FIND('-') genommen...
Von daher war die Diskussion hier jetzt ganz gut :-)

Gruß
Alez

6. Juni 2007 11:21

Dann empfehle ich dir dieses Thema hier ganz dringend:

Performance