15. December 2006 von Martin
Wer schon einmal einen Bericht mit Crystal Reports erstellt hat, weiß wie mächtig und wie beliebig nervig der Umgang mit diesem Werkzeug ist. Wie jeder andere Formulargenerator hat auch Crystal seine Macken, Stärken und Schwächen.
Ich werde hier in loser Reihenfolge Beispiele und Lösungen vorstellen, die mir bei meiner Arbeit mit Crystal Reports geholfen haben, bzw. für dessen Lösung ich lange suchen musste.
Variablen Formularübergreifend behandeln
Hier habe ich ganz schön lange gesucht, bis ich die Lösung gefunden habe. Das Problem war, dass ich zwei Summen, aus zwei verschiedenen Unterberichten im Hauptformular weiterverarbeiten wollte. Aber wie an die Felder kommen? Die Lösung ist dafür ganz einfach: Shared Variables!
Um mit Shared Variables arbeiten zu können, muss als erstes im Berichtskopf eine Formel hinterlegt werden, in der die Variablen initialisiert werden:
SHARED STRINGVAR Summe; //Die Variable muss zuerst deklariert werden.
""; // Als Rückgabewert der Formel kommt ein leeres Textfeld hin.
Dann kann ich in jeder anderen Formel mit dieser Variablen arbeiten. Allerdings muss sie jedes Mal am Anfang der Formel deklariert werden:
SHARED STRINGVAR Summe; //Deklaration
Summe := {TABLE.FIELD1}; //Erst jetzt kann ich damit arbeiten...
Um dann den Wert der Variable auszugeben:
SHARED STRINGVAR Summe;
Summe;
Dann kann man problemlos diese Werte in Formeln oder im Bericht nutzen.
Mehrere Record Werte in einer Zeile anzeigen
Mehrere Datensätze in einem Bericht auszugeben ist mit Hilfe der Gruppiermöglichkeit ja kein Problem. Nur was mache ich, wenn die Ergebnisse nicht untereinander, sondern nebeneinander ausgegeben werden sollen.
Lösung 1 (Quick ‚n Dirty): Man fügt eine Kreuztabelle ein, macht alle Felder bis auf die Spaltenbezeichnungen unsichtbar, und gut. Aber eben eine nicht schöne Lösung.
Lösung 2 (Elegant): Man fügt eine Gruppe in sein Formular, besser Unterformular ein. Dann muss man die Werte sammeln und im Gruppenfuß ausgeben:
In den Gruppenkopf ein unterdrücktes Formelfeld zur (Re-)Initialisierung anlegen:
Shared StringVar Array x;
Redim x[5];
Shared NumberVar i := 1
In den Detailbereich wird dann folgende Formel eingefügt, während der Detailbereich aber unterdrückt wird:
Shared StringVar Array x;
Shared NumberVar i;
x[i] := {Feld};
i := i+1
Und zum Schluss erfolgt die Ausgabe in einem Feld über eine Formel im Gruppenfuß:
Shared StringVar Array x;
Shared NumberVar i;
Local NumberVar j;
Local NumberVar n;
Local StringVar str := "";
For j := 1 to i - 1 Do
(
str := str + x[j];
For n:= 1 to 4-Len(x[j]) Do
str := str + " "
);
str
Bestimmte Bereiche oder Felder Aus- und Einblenden
Bestimmte Bereiche / Felder sollen nur auf bestimmten Seiten angezeigt werden?
Kein Problem!
Zum Beispiel soll die Seitenzahl in einem Formular nur auf der zweiten Seite erscheinen.
Das Feld oder die Formel mit der Seitenzahl in den Bericht einfügen und im Formatierdialog unterdrücken. Neben der Checkbox befindet sich die Schaltfläche für den Formeleditor. Im Formeleditor dann als Auswahlformel eingeben:
PageNumber = 1;
Das heißt, dass dieses Feld nur dann unterdrückt wird, wenn die Seitenzahl 1 ist, auf allen anderen Seiten wird das Feld eingeblendet.







[...] Und hier geht es los [mehr] [...]
Sehr hilfreich… hab was gelernt!
Danke für die Tipps!
Wie kann ich denn Bilder (BLOB-Felder) nebeneinander positionieren?
Super Hinweis, der viele Stunden … erspart! Danke.
Hi, danke für den Tipp Werte in einer Zeile.
Funktioniert super!
Grüße aus Freiburg,
Jens
Super Tipp, hat auf Anhieb geklappt
vielen Dank
Grüsse aus der Schweiz
Eigentlich ganz gut. Habe aber eine Frage. Wo und wie kann ich eine shared Variable überwachen? Oder wie kann ich einen Array und CR auslesen, den ich von einer global variable an eine shared variable übergeben habe.
Zu Variablen Formularübergreifend behandeln
Ich habe einen Unterbericht, aus welchem ich den Wert auslesen möchte, um in im Hauptbericht in einer Formel zu verwenden. Wie von dir beschrieben, habe ich die Variable deklariert. Nur für was steht {TABLE.FIELD1}? Dies müsste doch irgendein Bezug zum Unterbericht sein, oder? Mein Unterbericht lautet: srKnz und die darin enthaltene Tabelle: relAcp; auszugebendes Feld: MwstKnz
Es wäre sehr dringend! Danke schon mal…
Gruß
Steffi
Hallo Steffi,
{TABLE.FIELD1} steht für das Feld in der Tabelle, aus dem Du die Variable füllen möchtest. In Deinem Fall sollte das dann so aussehen:
{relAcp.MwstKnz};
HTH
Martin
Hallo,
scheitere an diesem Punkt:
Shared StringVar Array x;
Shared NumberVar i;
x[i] := {Feld};
i := i+1
CR teilt dann immer brav mit, dass hier eine Zeichenfolge benötigt wird. Mein DB-Feld ist eine Zahl. Wie bekomme ich das nun hin, damit es klappt?
Gruss
Nick
Hallo Nick,
ist das oben genau Deine Formel?
Insbesondere geht es um diese Zeile:
x[i] := {Feld};
Weil hier, wie auch schon bei Steffi, die Spalte Deiner Tabelle stehen müsste.
Woher soll Crystal denn sonst wissen, was verwendet werden soll?
Also statt
x[i] := {Feld};x[i] := {DeineTabelle.DeineSpalte};
Servus Martin,
kurze Frage. Hast Du ein Lösung gefunden Unterbrichte zu unterdrücken so das sie doch ausgeführt werden?
Ich habe immer wieder das Problem, das ich in einem UB etwas ermittle und im Anschluss im HB auswerte. Exportiert man den CR Bericht nach Excel, wird der Berichtsabschnitt in dem der UB positioniert ist, als leer Zeile exportiert. Sehr unschön.
Ich würde gerne den Berichtsabschnitt unterdrücken und trotzdem soll der UB ausgeführt werden. Analog zu Formeln. Die können unterdrückt werden und werden trotzdem berücksichtigt.
Danke & Gruß,
Erik
Hey, super Tipp mit den Records in einer Zeile!
Hab es mit einer IF Funktion noch erweitert, weil nur bestimmte Records angezeigt werden sollten, die gleichzeitig noch einen bestimmten Eintrag besitzen… vielen Dank!
Da ich im Textfuß diese Ausgabe benötige ist das eine schöne Lösung, kann man ggf. mit einem Code noch vorgeben, dass er einen Zeilenumbruch machen soll? Danke
Hallo noch mal
keiner eine Idee, wie man einen Unterbericht unterdrücken könnte obwohl er ausgeführt wird und Daten in Variablen zur verfügung stellt. Der UB selbst stellt keine Daten da. Lediglich eine Berechnungs – Formel ist die UB enthalten. Selbige ist auch unterdrückt. Eigentlich ein leerer Bericht…
Wäre super wenn einer zumindest eine Idee hätte was ich noch probieren könnte.
Danke
habs
war ganz einfach ^^
Berichtsabschnitt mit dem Hacken leeren Bericht unterdrücken versehen und zusätzlich den UB ebenfalls mit dem selben haken versehen.
hatte ich schon mal ausprobiert. Hat aber nie geklappt. Nun auf einmal schon…
Danke & gruß,
Erik
Hallo,
es gibt auch noch eine andere Möglichkeit mehrere Datensätze nebeneinander anzeigen zu lassen:
Bereichs-Assistent –> Details und dann “Mehrspaltig formatieren”
Dann öffnet sich das Tab “Layout”. Dort wird bestimmt wie die einzelnen Datensätze aufgelistet werden soll. Jetzt nicht mehr alles untereinander sonder ob zuerst Horizontal, dann vertikal aufgefüllt werden soll oder umgedreht. Bei Breite wird eingestellt wie breit die Spalte sein soll, in der die Datensätze einzeln von links nach rechts angezeigt werden.
Jetzt habe ich auch noch eine Frage zu Variablen:
.
Im HB bei Details habe ich ein UB mit der ich mir einen Wert anzeigen lasse bzw. aus einer anderen Tabelle auslese. Diesen benötige ich direkt in der gleichen Details-Zeile. Sprich im muss damit weiterarbeiten. Momentan sieht es so aus, dass der Wert mir erst in der nächsten Zeile angezeigt wird.
z.B. wenn Details A und Details B existieren und ich bei Details A den UB habe wird er mir erst bei Details B angezeigt. Ich benötige ihn aber schon bei Details A. Hat jemand eine Lösung?
Ansonsten habe ich beim Excel-Export zwei Zeilen
Danke und Gruß,
Daniel
Hallo,
vielen Dank für den Tipp mit den Feldern nebeneinander mit Array. Ich habe allerdings beim Export (egal welcher Art) das Problem das ich die Fehlermeldung “A subscript must be between 1 and the size of the array”.
Hast du eine Idee an was das liegen könnte?
Gruß Jens
Achja, die Meldung kommt bei der Formel die im Detailbereich steht
Hallo,
ich möchte mehrere Bilder (BLOB) nebeneinander darstellen, bekomme es aber leider nicht hin.
Habt ihr eine Lösung?
Gruß Max
ich möchte in einem Report die Seitenorientierung von Seite 1 (Hochformat) in Seite 2 (Querformat) zu wechseln.
Hat jemand dazu eine Lösung ?
Danke.