Problem mit Kalkulationen in WPReporter

  • 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:

    Code
    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:

    Code
    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:

    Code
    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.

    Code
    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:

    Code
    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

    Code
    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

    • Offizieller Beitrag

    Zunächts bitte beachten dass OnPaintCalc ausschliesslich für ziwshcensummen in header/footer verwendet werden soll. Diese funktion wird zur Zeit der Anzeige ausgeführt, die generierten werte werden nicht gespeichert oder geladen.

    Wenn Sie summen brauchen bitte die werde beim ducrchlauf hochsummieren und dann in eine entsprechende summenvariable (berechnetes feld) eingeben. Das FormulaInterface wird dafür nicht benötigt.


    Für die Gruppen füsse kein CALC feld verwenden.


    Sie solten 2 footer bänder haben, eines für die zwischensummen (InputTextField PAINTCALC), das andere für die end summe mailmetrge feld (InputMergeField)

    WPAT_PAR_NAME, WPAT_PAR_COMMAND wird bei WPReporter gar nicht verwendet! Daher das problem mit PaintCalc. Nur MergeFelder verwenden!

    Bitte den report erst entsprechend vereinfachen (ohne zwischensummen) - dann die zwischensummen nachrüsten.