Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   Funktionen aus Crystal Reports im Report Builder anwenden (https://www.delphipraxis.net/159387-funktionen-aus-crystal-reports-im-report-builder-anwenden.html)

Metallicwar 25. Mär 2011 15:15

Funktionen aus Crystal Reports im Report Builder anwenden
 
Hallo zusammen, ich muss einen Report der mit Crystal Reports erstellt worden ist, mit dem Report Builder nachbauen.
Mein Problem ist es, dass ich für manche Funktionen die bei Crystal angewandt worden sind, einfach keine passenden Funktionen im Report Builder finde.
Einige Beispiele:

Crystal:
Code:
totext(truncate({B_Ergebnisse.Tagesbrutto}/60),"00",2)
    + ":"
    + totext(abs(remainder({B_Ergebnisse.Tagesbrutto},60)),"00",2)
Report Builder (die ,2 aus Crystal Syntax wird nicht berücksichtigt):
Code:
  Value := FormatString(IntToStr(Trunc(dbPipelineAktuellerMonat['Tagesbrutto'] div 60)), '00')
          + ':'
          + FormatString(IntToStr(dbPipelineAktuellerMonat['Tagesbrutto'] mod 60 * (-1)), '00');
weitere Berechnungen aus Crystal Report:
Code:
totext(Truncate({B_Ergebnisse.Tagesbrutto}/60,2))
Bei dieser Berechnung, bin ich völlig ratlos^^ ("0,00",2,",","."???)
Code:
if {Monatswerte_Report.KRANKSTUNDENBEZAHLT} = 0 then
    totext(Truncate({Monatswerte_Report.KRANKSTUNDENBEZAHLT}/60,2),"0,00",2,",",".")
else
    totext(Truncate({Monatswerte_Report.KRANKSTUNDENBEZAHLT}/60,2),2,".",",")
zum Schluss eine kleine Auflistung, der Funktionen die ich im Report Builder benötige:
-totext
-abs
-remainder

oder mit welchen Funktionen aus Delphi, könnte ich meine Berechnungen wie bei Crystal umsetzen? (könnte diese Funktionen, dann ja in den Report Builder importieren)

Metallicwar 30. Mär 2011 13:51

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
kann mir keiner weiterhelfen?

exilant 30. Mär 2011 15:08

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Du kannst beim Reportbuilder doch im OnGetText-Event jede Druckausgabe so formatieren wie du möchtest. Auch hier gilt wie eigentlich immer: Übersetze nicht von einer(CR) in die andere (RB) "Sprache" sondern baue die Funktionalität nach. Du wirst ja wissen wie der Report aussehen soll, oder?

Offensichtlich handelt es ich bei den Formeln aus CR um eher triviale Formatierungen von Minutenwerten. Wo genau ist das Problem?

Suche in der Delphi Hilfe nach Format, Formatfloat, trunc, abs, mod, div

Zitat:

Bei dieser Berechnung, bin ich völlig ratlos^^ ("0,00",2,",","."???)
Auch das sieht nach einer Formatierung aus: Zwei Stellen Genauigkeit, Dezimaltrenner="," und Tausendertrenner="."

"Sprichst" du Delphi?

dataspider 31. Mär 2011 07:27

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Hi,

vielleicht ist es einfacher, wenn du auch ein paar Beispile der Ausgabe mit listest.
Also, welcher Wert sieht im Report dann wie aus.
Ich kenn z.B. totext scheint wie to_char von Oracle (z.B. aus "1" "001").
Dann kann man die Funktion in Delphi nachbauen und dann über RAP (wenn du die Enterprise von RB hast) einbinden.

Frank

Metallicwar 11. Apr 2011 07:51

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
danke für die Antworten!!
Mal schauen ob ich es hinbekomme.
P.S. Ja ich habe die Enterprise Version.
MfG David

Metallicwar 11. Apr 2011 11:20

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Hi, bin gerade dabei Funktionen aus Delphi in den Report Builder zu importieren.
Ich möchte zunächst die Funktion RoundTo importieren, um auf zwei Nachkommastellen zu runden:
Code:
totext(truncate({B_Ergebnisse.Tagesbrutto}/60),"00",2)
Delphi-Quellcode:
unit Import;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, Math, raFunc, ppRTTI, raIDE, DateUtils;

type
  TmyRoundToFunction = class (TraStringFunction)
  public
    procedure ExecuteFunction(aParams: TraParamList); override;
    class function GetSignature: String; override;
  end;

implementation

{------------------------------------------------------------------------------}
{ TmyRoundToFunction.GetSignature }

class function TmyRoundToFunction.GetSignature: String;
begin
  Result := 'function RoundTo(const AValue: Extended; const ADigit: TRoundToEXRangeExtended): Extended;';
end;

{------------------------------------------------------------------------------}
{ TmyRoundToFunction.ExecuteFunction }

procedure TmyRoundToFunction.ExecuteFunction(aParams: TraParamList);
var
 varAValue, varRueckgabe: Extended;
 varADigit: TRoundToEXRangeExtended;
begin
  GetParamValue(0, varAValue);
  GetParamValue(1, varADigit);

  varRueckgabe := RoundTo(varAValue, varADigit);

  SetParamValue(2, varRueckgabe);

end;

initialization
  raRegisterFunction('RoundTo', TmyRoundToFunction);

finalization
  raUnRegisterFunction('RoundTo');

end.
Da ich leider nicht weiß, wie ich Functionen aus Delphi zur Designzeit im Report Builder verwenden kann, habe ich die Unit raIDE eingebunden, damit ich zur Laufzeit, Variablenberechnungen durchführen kann. Sobald ich aber den Reiter "Sprache" unter Berechnungen aufrufe erhalte ich folgende Fehlermeldung:
Zitat:

"Cannot compile Signature for Zeichenkette function: RoundTo"

dataspider 11. Apr 2011 12:30

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Hi,

mir fallen ein paar Dinge auf.

1. Du leitest von TraStringFunction ab. TraSystemFunction ist IMHO besser geeignet.
2. RoundTo hast du einmal für RAP und dann noch mal in Delphi als normale Funktion integriert. Das könnte Probleme bereiten.
[EDIT]
3. Ganz nützlich ist auch noch die Kategorie - zur Übersichtlichkeit
Code:
class function TmyRoundToFunction.Category: string;
begin
  Result := 'Crystal Reports';
end;
Frank

Metallicwar 11. Apr 2011 12:52

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Hallo,
Zitat:

1. Du leitest von TraStringFunction ab. TraSystemFunction ist IMHO besser geeignet.
ok, hab ich abgeändert.
2. RoundTo hast du einmal für RAP und dann noch mal in Delphi als normale Funktion integriert. Das könnte Probleme bereiten.
Habe alle TmyRoundToFunction. .... durch TmyRundenFunction ersetzt,
[EDIT]
3. Ganz nützlich ist auch noch die Kategorie - zur Übersichtlichkeit
markieren
Code:
class function TmyRoundToFunction.Category: string;
begin
Result := 'Crystal Reports';
end;
hab nochmal im Developer Guide nachgeschaut! Danke, das hab ich auch seit langem gesucht, wie ich eigene Kategorien anlegen kann.
Hmmn, trotz der Änderungen besteht der Fehler weiterhin. Ich könnte mir vorstellen, dass er mit den Datentypen nicht klarkommt. (TRoundToEXRangeExtended)
oder an was könnte es noch liegen?

dataspider 11. Apr 2011 13:22

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Zitat:

Zitat von Metallicwar (Beitrag 1094398)
Habe alle TmyRoundToFunction. .... durch TmyRundenFunction ersetzt, [/B]

Ich meinte:
Code:
...
  varRueckgabe := RoundTo(varAValue, varADigit); // Hier Funktion RoundTo
...
initialization
  raRegisterFunction('RoundTo', TmyRoundToFunction); // und hier noch mal für RAP
TRoundToEXRangeExtended wird wohl auch nicht funktionieren.
Wobei ich aus dem Hut auch nicht weiss, wie man Typen registriert. Kannst du hier keinen Standard Typ nehmen?

Frank

Metallicwar 11. Apr 2011 13:39

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
ich hab vor einiger Zeit schonmals eine Function (DaysInAMonth) aus Delphi importiert.
Beim importieren, habe ich auch keine Funktion anderst genannt.
Delphi-Quellcode:
unit Monatstage;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, raFunc, ppRTTI, DateUtils;

type
  TmyDaysInAMonthFunction = class (TraStringFunction)
  public
    procedure ExecuteFunction(aParams: TraParamList); override;
    class function GetSignature: String; override;
  end;

implementation

uses U_DataModule, U_Main;

{------------------------------------------------------------------------------}
{ TmyDaysInAMonthFunction.GetSignature }

class function TmyDaysInAMonthFunction.GetSignature: String;
begin
  Result := 'function DaysInAMonth(iJahr: Integer; iMonat: Integer): Integer;';
end;

{------------------------------------------------------------------------------}
{ TmyDaysInAMonthFunction.ExecuteFunction }

procedure TmyDaysInAMonthFunction.ExecuteFunction(aParams: TraParamList);
var
 iJahr, iMonat, iRueckgabe: Integer;
begin
  GetParamValue(0, iJahr);
  GetParamValue(1, iMonat);

  //iRueckgabe := DaysInMonth(EncodeDate(iJahr, iMonat, 1));
  iRueckgabe := DaysInAMonth(iJahr, iMonat);

  SetParamValue(2, iRueckgabe);

end;

initialization
  raRegisterFunction('DaysInAMonth', TmyDaysInAMonthFunction);

finalization
  raUnRegisterFunction('DaysInAMonth');

end.
Diese Funktion hab ich dann einfach nur abgeändert auf RoundTo, also wird es vermutlich an den Parametern liegen und nicht an den Funktionsnamen. Bin am ausprobieren, aber ich bekomms einfach nicht hin .

Metallicwar 11. Apr 2011 14:35

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Hi, also hab's in die Newsgroup gepostet und recht zügig eine Antwort bekommen.

Zitat:

Hi David,

You are correct, RAP is not going to be able to resolve the TRoundToEXRangeExtended type. Perhaps try using a simpler type (String or Integer) and convert to the TRoundToEXRangeExtended type inside the Execute routine.
versteh aber leider nicht genau wie ich das anstellen soll.

Delphi-Quellcode:
class function TmyRoundToFunction.GetSignature: String;
begin
  Result := 'function RoundTo(const AValue: Extended; const ADigit: TRoundToEXRangeExtended): Extended;';
end;
wo soll ich den Datentyp ändern und wie kann ich bsp. von Int nach Extended umwandeln?

dataspider 11. Apr 2011 14:59

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Hi,

so sollte es gehen:
Delphi-Quellcode:
Uses
  SysUtils, raFunc, ppRTTI, Math;

type
  TmyRoundToFunction = class(TraSystemFunction)
  public
    class function Category: string; override;
    procedure ExecuteFunction(AParams: TraParamList); override;
    class function GetSignature: string; override;
  end;

implementation

class function TmyRoundToFunction.Category: string;
begin
  Result := 'Crystal Reports';
end;

procedure TmyRoundToFunction.ExecuteFunction(AParams: TraParamList);
var
  AValue: Extended;
  AResult: Extended;
  ATempDigit: Integer;
  ADigit: TRoundToEXRangeExtended; // [-20 .. 20]
begin
  GetParamValue(0, AValue);
  GetParamValue(1, ATempDigit);
  try
    ADigit := ATempDigit; // prüfen auf TRoundToEXRangeExtended
    AResult := RoundTo(AValue, ADigit);
    SetParamValue(2, AResult);
  except
    raise Exception.Create('ADigit ist kein TRoundToEXRangeExtended');
  end;
end;

class function TmyRoundToFunction.GetSignature: string;
begin
  Result := 'function RoundTo(const AValue: Extended; const ADigit: Integer): Extended';
end;

initialization
  raRegisterFunction('RoundTo', TmyRoundToFunction);

finalization
  raUnRegisterFunction('RoundTo');

end.
Frank

Metallicwar 11. Apr 2011 15:12

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Hallo Frank,
danke für den Code, aber ich erhalte nachwievor die selbe Fehlermeldung.
Also Laut Aussage von Digital Metaphors einen einfacheren Typ verwenden (String oder Integer) und in der Execute Methode in den TRoundToEXRangeExtended umwandeln, aber wie?!? Steh auf dem Schlauch ...

dataspider 11. Apr 2011 15:16

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Zitat:

Zitat von Metallicwar (Beitrag 1094434)
aber ich erhalte nachwievor die selbe Fehlermeldung.

Das kann nicht sein, da ich den Typ in der Signatur auf Integer geändert habe.

Frank

Metallicwar 11. Apr 2011 15:21

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Zitat:

vor einer Minute
Zitat von Metallicwar:
aber ich erhalte nachwievor die selbe Fehlermeldung.
Das kann nicht sein, da ich den Typ in der Signatur auf Integer geändert habe.

Frank

Versteh ich nicht, hast du's mal bei dir getestet, habe deinen Code 1 zu 1 übernommen und bekommen trotzdem eine Fehlermeldung: 'Cannot compile signature for Crystal Reports function: RoundTo'

Wäre super, wenn wir das Problem heute noch lösen könnten.

dataspider 11. Apr 2011 15:26

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Zitat:

Zitat von Metallicwar (Beitrag 1094439)
Versteh ich nicht, hast du's mal bei dir getestet, habe deinen Code 1 zu 1 übernommen und bekommen trotzdem eine Fehlermeldung:

Ne, sorry - hab es jetzt unter D2010 getestet mit dem selben Fehler...sollte zu finden sein...

Frank

dataspider 11. Apr 2011 15:33

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Sorry,

bei der Signatur fehlte das Semikolon:

Delphi-Quellcode:
  Result := 'function RoundTo(AValue: Extended; ADigit: Integer): Extended;';

[Edit]
Seh gerade, dass ich das Const vor den Paramtern entfert habe. Kannst du wieder rein nehmen, spielt IMHO keine Rolle...[/EDIT]


Frank

Metallicwar 11. Apr 2011 15:50

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Vielen Dank Frank.

Letzte Frage bis dahin:
Delphi-Quellcode:
begin
  Value := RoundTo(Trunc(dbPipelineAktuellerMonat['Tagesbrutto'] div 60), 2)
          + ':'
          + Roundto((-1) * (dbPipelineAktuellerMonat['Tagesbrutto'] mod 60),2);
Fehler: Inkompatible Typen..

Erwartet ja Extended und das Datenfeld ist ein Integer... IntTo???

Metallicwar 11. Apr 2011 16:16

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
:roteyes: ehm, ich kriegs nicht hin -.-
Kann mir bitte nochmal jmd bei der Typumwandlung helfen? :D

dataspider 11. Apr 2011 16:33

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Ich nehme an, gleich gibt es was auf die Mütze!
Denn Pushen ist hier nicht gerade beliebt.

Und ich klink mich hier jetzt auch erst mal aus.

Du kommst so nicht weiter. Das nächste Problem ist mod und div und so weiter.

Und es geht wohl nur um die Formatierung eines Wertes (wurde ja schon erwähnt).

Vergiss einfach, die Funktionen 1 zu 1 nachbilden zu wollen.
Schau die den Wert an und die Ausgabe und mach eine Formatfunktion, die nur den Wert bekommt und den String zurückgibt.

Frank

Metallicwar 13. Apr 2011 11:15

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Hallo, ich melde mich mal wieder zurück, komme nun gut vorran, arbeite jetzte mit FormatDateTime.
Habe dazu allerdings noch 2 Fragen:
Delphi-Quellcode:
  Value := FormatDateTime('hh,nn', (dbPipelineAktuellerMonat['Tagesbrutto'] * 60 / 86400); //Tagesbrutto 510
--> Ergebnis : 08:30

Ich möchte mir diese Uhrzeit auch in dezimaler Form anzeigen lassen, also 08:30 => 08:50 oder 08:55 => 8:91


Mein anderes Problem ist, ich möchte mir wieder die Stunden, Minuten eines Wertes berechnen.
ich müsse auf 77,5 Stunden kommen, d.h. ich müsste meine 4650 Minuten / 60 nehmen und käme auf meine hh:nn.
bei
Delphi-Quellcode:
  Value := (FormatDateTime('hh:nn', PipelineMonatsWerte_Tabelle['ISTSTUNDENBRUTTO'] / 60);
liefert er mir jedoch als Ergebnis 12:00 ?!?

Kann mir bitte jemand weiterhelfen?

dataspider 13. Apr 2011 13:54

AW: Funktionen aus Crystal Reports im Report Builder anwenden
 
Es ist eigentlich nicht meine Art.
Aber jetz muss auch ich mich mal "aufregen..."

Beschäftige dich doch mal mit den Typen und Formatfunktionen und experimentiere, bis du es verstanden hast.

zum Üben...:

Delphi-Quellcode:
procedure Uebung;
Var
  ADateValue: TDateTime;
  AFloatValue: Extended;
  s1: string;
  s2: string;
begin
  ADateValue := 510 * 60 / 86400;
  s1 := TimeToStr(ADateValue); // '08:30:00'

  AFloatValue := ADateValue * 24; // 8,5
  s2 := Format('%0.2d:%0.2d', [
      Trunc(AFloatValue),     {Vor dem Komma}
      Trunc((AFloatValue - Trunc(AFloatValue)) * 100) {Nach dem Komma}
      ]); // '08:50'
end;
Es gibt weitere Möglichkeiten. So kann man die Zeit mit DecodeTime in Stunden, Minuten ... zerlegen...
Mit ausreichend Eigeninitiative bkommst du den Rest selbst raus.

Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz