Wir versuchen, ähnlich dem Beispiel SimpleReporter, Berechnungen über Gruppen von Datensätzen in einem Report durchzuführen.
Dabei tritt das Problem auf, dass die Gruppenberechnungen falsch durchgeführt werden.
Entweder liefert die Parent-Tabelle in der Behandlung von TWPFormulaInterface.OnTextObjectPaintCalc mittels TParagraph.GetObjList([wpobjMergeField], Objects, nil, pobj.Source) keine Objekte (dies, wenn nach TWPSuperMerge.Execute nicht TWPRichText.RecalcText(true,true) ausgeführt wird, s.u.).
Oder in TWPFormulaInterface.OnTextObjectPaintCalc ist der Wert von pobj.Params umgesetzt worden, sodass eine weitere Behandlung im Ereignishandler nicht mehr möglich ist (dies, wenn nach TWPSuperMerge.Execute TWPRichText.RecalcText(true,true) ausgeführt wird, s.u.).
Die Vorlage ist folgendermassen gestaltet:
[Group "Customer"]
DataBand
Tabellenzeile mit Mergefeldern (Kundeninformationen)
[Group "INVOICE"]
DataBand
Tabellenzeile mit Mergefeldern (Rechnungsdaten)
FooterBand
Tabellenzeile mit kalkulierten Feldern (Anzahl der Gruppenzeilen, bzw. Summen über den Gruppenfeldern)
[EndGroup "INVOICE"]
[EndGroup "Customer"]
Tabellenzeile mit kalkulierten Feldern (Gesamtsummen über verschiedenen Feldern der Tabelle)
Mergefelder in Tabellen werden über folgenden Code erzeugt:
obj := FWPToolsEditor.WPRichText1.InputMergeField( FieldName, DisplayText ); if (obj.ParentPar <> nil) then begin par := obj.ParentPar; par.ASetStringProp(WPAT_PAR_NAME, FieldName); end;
Felder, die zur Kalkulation der Gruppensummen, bzw. Datensatzanzahl im Footer dienen, werden wie folgt erzeugt:
obj := FWPToolsEditor.WPRichText1.InputTextFieldName('PAINT_CALC'); obj.Source := FieldName; obj.Params := '[' + Calculation + '(' + FieldName + ')]';
Calculation enthält dabei einen der konstanten Werte 'GRPCOUNT' oder 'GRPSUM'.
Felder, die die Gesamtsummen über allen Gruppen berechnen, werden folgendermassen erzeugt:
obj := par.AppendNewObject( wpobjTextObject, false, false ); obj.Name := 'CALC'; obj.Source := FieldName; obj.Params := '[' + FieldName + ']';
Der Ereignishandler TWPFormulaInterface.OnTextObjectPaintCalc behandelt dann das übergebene Textobjekt.
Orientiert habe ich mich dabei an dem Beispiel SimpleReporter.
procedure WPFormulaInterfaceTextObjectPaintCalc( ...)var i, ColNr : Integer; CalcResult : Extended; Table : TParagraph; Objects : TList;begin try Table := pobj.ParentPar.ParentTable; ColNr := pobj.ParentPar.ColNr; CalcResult := 0; Objects := TList.Create; if (Table <> nil) then Table.GetObjList([wpobjMergeField], Objects, nil, pobj.Source); if ( AnsiContainsStr(pobj.Params, 'GRPCOUNT') ) then begin ResultText := IntToStr(Objects.Count); UseIt := true; end else if ( AnsiContainsStr(pobj.Params, 'GRPSUM') ) then begin for i := 0 to Objects.Count-1 do begin // CalcResult := CalcResult + StrToFloat(TWPTextObj(Objects[i]).EmbeddedText); CalcResult := CalcResult + TWPTextObj(Objects[i]).EmbeddedTextAsFloat; end; ResultText := FloatToStr(CalcResult); UseIt := true; end; except ResultText := '#Error#'; UseIt := true; end;end;
Zusammengeführt werden die Vorlage und die Daten über die Zeilen:
WPSuperMerge.SetSourceDest( WPLoad.Memo.RTFData, WPRichText.Memo.RTFData ); WPSuperMerge.Execute; WPRichText.RecalcText(true,true); WPRichText.ReformatAll( true, true );
Ohne den Aufruf von RecalcText werden kalkulierte Felder, die in der Vorlage über
par.ASetStringProp(WPAT_PAR_NAME, ParagraphName);
par.ASetStringProp(WPAT_PAR_COMMAND, Formula); // Bsp.: Formula := 'left(2)*left(1)'
par.ASet(WPAT_ParProtected,1);
in Tabellenzellen eingefügt werden, nicht kalkuliert.
Wo liegt der Fehler?
Jede Hilfe ist willkommen,
AET