Freitag, 21. Dezember 2018

Wie erstellt man einen Standardreport mit dem Reportdesigner im SQL-Manager - Beispiel: Personalliste

In diesem Einführungsbeispiel soll Schritt für Schritt die Entwicklung eines einfachen Reports (Personalliste des Call-Centers) im WINcontact-Reportdesigner auf der Grundlage einer Datenbankabfrage im SQL-Manager vorgestellt werden.

Schritte zur Erstellung eines Reports im SQL-Manager
  1. Erstellung einer Datenbankabfrage, welche die Daten für den Report liefert.
  2. Speichern der Abfrage unter einem eindeutigen Namen in der WINcontact–Datenbank
  3. Designen eines Reports zu genau dieser Abfrage (deren Daten als Banddatenquelle bereitgestellt werden) und Speichern der Reportvorlage in der WINcontact–Datenbank
  4. Freigabe des Reports zur allgemeinen Verwendung
Aufgabenstellung

Der Report soll Name und Privatanschriften aller in WINcontact erfaßten Call-Center-Mitarbeiter in Abhängigkeit ihrer Dienststellung ausgeben, wobei die Auswahl der Dienststellung über einen Dialog im Report (und nicht in der Datenbankabfrage) erfolgen soll

Datenbereitstellung über eine SQL-Abfrage im SQL-Manager

Die Stammdaten der Call-Center-Mitarbeiter, wie sie in der Personalverwaltung des Administration-Centers angezeigt werden, sind in der globalen Tabelle NUTZER enthalten. 

1. Datenbankabfrage erstellen

Die Daten, die der Report benötigt, lassen sich schnell mit folgender Abfrage gewinnen:

SELECT
 ISNULL(ANREDE,'')+' '+ISNULL(VORNAME,'')+' '+NACHNAME AS MITARBEITER,
 CASE
  WHEN TYP=1 THEN 'Administrator'
  WHEN TYP=2 THEN 'Supervisor'
  WHEN TYP=3 THEN 'Controller'
  WHEN TYP=4 THEN 'Callagent'
  END AS DIENSTSTELLUNG,
 PPLZ+' '+PORT AS ORT,
 PORTSTEIL AS ORTSTEIL,
 PSTRASSE+' '+ISNULL(PHNR,'') AS STRASSE,
 PTELEFON, PFAX, PEMAIL
FROM TMGLOBAL..NUTZER
WHERE TYP<5
ORDER BY TYP, NACHNAME
(Außendienstmitarbeiter werden in der Abfrage ignoriert)

2. Abfrage testen und speichern

Diese Abfrage muss in der WINcontact–Datenbank unter einem eindeutigen Bezeichner gespeichert werden, da nur für in der Datenbank gespeicherte Abfragen Reporte erstellt werden können.


Anschließend ist in der Werkzeugleiste des SQL-Managers die Druckfunktion freigeschalten. Über dessen Pull-Down-Menü kann dann der Reportdesigner geöffnet werden. Achten Sie aber darauf, dass die Datenbankabfrage immer auch ein paar Datensätze liefert, um beim Reportdesign einige Testdaten zur Verfügung zu haben.

3. Reportdesign

Nachdem Sie den Reportdesigner gestartet haben, sollten Sie ihn erst einmal Ihren Vorstellungen entsprechend anpassen. Wir empfehlen, dass Sie erst einmal die verfügbaren Symbolleisten und Hilfsfenster aufblenden. Dazu brauchen Sie nur im Hauptmenü unter "Ansicht" – "Symbolleisten" alle verfügbaren Einträge markieren. Der Objektinspektor sowie der Daten- und der Reportbaum sind andockbare Fenster. Sie sollten Sie mit der Maus so verschieben, dass am Ende folgende Anordnung der einzelnen Designerelemente erreicht wird:



Ganz links befindet sich die Palette mit den Reportdesignerobjekten, dann folgt der Objektinspektor, der über die <F11>-Taste ein- und ausgeschalten werden kann (ausprobieren!), dann der Reportbaum und schließlich die Arbeitsfläche, auf der der Report entworfen wird. Rechts daneben ist noch der Datenbaum angedockt. Alle diese Einstellungen bleiben auch beim Schließen des Designers erhalten.

Hinweis: Die einzelnen Symbolleisten sind ein- und ausschaltbar und können sowohl im angedockten Zustand aber auch als separate Fenster dargestellt werden.

Achten Sie bitte auf den Datenbaum. Dort finden Sie unter dem Reiter "Daten" alle von der SQL-Abfrage zurückgelieferten Datenfelder in der Banddatenquelle. Weitere Daten aus WINcontact werden über Reportvariablen und über nutzerdefinierte SQL-Variablen zur Nutzung zur Verfügung gestellt, die Sie analog über die Seite "Variablen" im Datenbaum erreichen. Außerdem finden Sie an genau der gleichen Stelle auch noch spezielle Systemvariablen, die vom Reportdesigner selbst angeboten werden.

Nach diesen wenigen Vorarbeiten können wir mit dem Design des Reports beginnen.

Wie bereits erwähnt, werden Reporte aus "Bändern" aufgebaut, die jeweils eine spezifische Funktion haben. Ein Reporttitelband z. B. wird immer nur auf die erste Seite eines mehrseitigen Reports gedruckt während ein Seitenkopfband ("PageHeader") auf jede Seite des Reports an oberster Position gedruckt wird. Daten werden gewöhnlich auf einem Masterdatenband ausgegeben, welches mit einer Datenquelle wie z. B. der Banddatenquelle verbunden ist. 

Die einzelnen Bänder erreichen Sie über die entsprechende Funktion in der senkrechten Leiste der Reportobjekte.


Als erstes fügen wir dem Report ein Masterdatenband hinzu und verbinden es mit der Banddatenquelle. Aufblenden der Reportvorschau zeigt, dass noch keine Daten angezeigt werden. Das ist auch nicht weiter verwunderlich, da das Band noch leer ist. Um den Namen der Callagenten auf dem Band auszugeben, wechseln Sie auf der rechten Seite in den Datenbaum und dort in die Banddatenquelle. Dann markieren Sie mit der Maus den Eintrag "MITARBEITER" und ziehen ihn mit gedrückter rechter Maustaste auf das Masterdatenband:


Wie bei jedem anderen Windows-Control auch können Sie das Textobjekt mit dem Datenfeld mit der Maus verschieben und auch dessen Größe ändern (probieren Sie bitte auch einmal die Kursortasten in Verbindung mit der <Shift> und der <Strg>-Taste aus, das Control muss aber fokussiert sein (Ankerkästchen)). Die Vorschau zeigt das Ergebnis:


Klicken Sie bitte als Nächstes auf den MasterData-Bandheader (worauf das Band fokussiert wird -> Ankerkästchen) und ändern Sie mit der Maus die Bandhöhe. Überprüfen sie danach den Effekt über die Reportvorschau.

Anschließend können Sie das MasterData-Band nach folgender Vorlage selbst gestalten:


Mit Hilfe der Funktionen in der Formatierungsleiste lässt sich jedes Textobjekt individuell formatieren (Mitarbeitername fett, Dienststellung rot und italic etc.).

Wie Sie in der Vorschau sehen können, werden auf dem Ausdruck jeweils in der Bandhöhe genau die Daten eines Datensatzes ausgegeben, für die auf dem Band jeweils ein Textobjekt existiert.


Jetzt führen Sie bitte auf das Textfeld "PTELEFON" einen Doppelklick aus:


Sie gelangen dann in den Textfeldeditor. In diesem Editor können Sie beliebigen Text schreiben und (immer in eckigen Klammern!) Platzhalter für Datenbankfelder und Variablen eintragen, z. B.


Wenn Sie mehrzeiligen Text eintragen, müssen Sie i. d. R. auch die Höhe des entsprechenden Textobjektes auf dem Band (und eventuell die Bandhöhe) anpassen.

Wir haben Ihnen demonstriert, wie man durch "Holen" und "Verschieben" eines Datenbankfeldes aus dem Datenbaum ein Reportband füllen kann. Sie können natürlich auch ein "pures" Textobjekt einfügen, in dem Sie es einfach der Reportobjektpalette entnehmen. Einfach anklicken, dass an der Maus hängende Textobjekt auf dem Band ablegen und in das anschließend aufgeblendete Memo-Objekt (=Textfeldeditor) den gewünschten Text schreiben. Das ist die ganze Vorgehensweise. Mit diesem Wissen können Sie jetzt das Datenband noch etwas schöner gestalten, beispielsweise so:



Die Linie als obere Begrenzung wurde mit dem Linienwerkzeug aus der Reportobjektpalette realisiert.

Kommen wir jetzt zum Objektinspektor. Achten Sie einmal darauf: Immer wenn Sie auf der Arbeitsfläche ein Objekt markieren (sichtbar an den Ankerkästchen), wird dieses Objekt mit all seinen Eigenschaften in den Objektinspektor eingetragen. Wenn Sie z. B. das erste Textfeld ("MITARBEITER") auf dem Masterdatenband markieren, dann finden Sie u. a. folgende Eintragungen im Objektinspektor:


Die Bedeutung der einzelnen Einträge wird Ihnen dabei immer kurz und bündig in der Infobox im unteren Teil des Objektinspektors angezeigt (hier "Align"). Um die Funktionsweise zu verstehen, wählen Sie einfach einmal die Eigenschaft "BrushStyle" aus und aus der Klappbox, die aufgeblendet wird, wenn Sie in das dazugehörige Eingabefeld klicken, den Wert "bsDiagCross". Den Effekt können Sie sowohl im Designer als auch in der Reportvorschau beobachten. Und damit dürfte bereits das Funktionsprinzip des Objektinspektors klar geworden sein. Wir empfehlen Ihnen, dass Sie jetzt noch die eine oder andere Eigenschaft des Textobjektes ändern und den Effekt im Vorschaumodus beobachten.

Neben dem Objektinspektor besitzen die meisten Reportobjekte auch noch ein individuelles Kontextmenü, über das weitere Funktionen zur Verfügung gestellt werden. Es lässt sich nach Fokussierung des Objektes über die rechte Maustaste öffnen.

Was jetzt noch fehlt, ist ein Reporttitel mit ein paar Angaben zum Call-Center und zum Bearbeiter dieses Reports. Sie brauchen dazu erst einmal nur ein Reporttitelband auf die Arbeitsfläche legen. Im Objektinspektor setzen wir dann die Höhe (=Height) des Bandes auf 4 Zentimeter (kleiner Hinweis: im Hauptmenü unter Ansicht – Optionen können Sie festlegen, ob Sie als Längenmaß im Report Zentimeter, Zoll oder Pixel verwenden möchten). Auf dieses Band platzieren wir dann ein Textobjekt aus der Objektpalette und geben als Text "Personalliste Call-Center" ein. Danach ändern wir die Eigenschaft "Align" im Objektinspektor noch auf "baWidth", wodurch das Band über die gesamte Seite gezogen wird. Zum Schluss sollten Sie das Textobjekt noch mit den Funktionen der Formatierungsleiste in Schriftart und Schriftgröße anpassen.

Jetzt wollen wir zum ersten Mal die Reportvariablen verwenden, die von WINcontact zur Verfügung gestellt werden. Dazu legen Sie wieder ein Rechteckobjekt auf das Reporttitelband und tragen als Text "Call-Center:" ein. Achten Sie jetzt bitte einmal auf die Werkzeugleiste des Texteditor bzw. Memofenster. Sie finden dort als erste Funktion "Ausdruck einfügen". Ein Klick darauf öffnet den Ausdruckeditor (er ist weitgehend mit dem Datenbaum am rechten Rand des Designers identisch), in dem Sie auf die Seite "Variablen" wechseln. Dort finden Sie u. a. den Zweig "Auftragnehmer". Der "Auftragnehmer" sind Sie, d. h. hier werden in Form von Variablen die Angaben zur Verfügung gestellt, die Sie im Administration-Center im Hauptmenü unter "Einstellungen Call-Center" eingetragen haben.

Jetzt noch die beiden Textobjekten formatieren und den Report ausprobieren:


Auf die gleiche Weise können Sie jetzt noch weitere Textobjekte im Reporttitelband anordnen, z. B.


Das Reporttitelband wird immer nur auf die erste Seite eines mehrseitigen Reports gedruckt. Möchte man, dass auch auf jeder anderen Seite ein Seitenheader erscheint, dann muss noch zusätzlich ein Seitenkopfband ("PageHeader") in den Report eingefügt und mit Text versehen werden:


Wie die Vorschau zeigt, wird dieser Header überflüssigerweise auch auf der ersten Seite angezeigt. Aber hier hilft der Objektinspektor weiter. Das Band "PageHeader" besitzt nämlich die Eigenschaft "PrintOnFirstPage", die Sie einfach nur auf "False" setzen müssen, um den Druck des Seitenkopfes auf der Titelseite zu unterdrücken.

Jetzt benötigen wir nur noch ein Seitenfußband ("PageFooter") für die Aufnahme der Seitennumerierung:


Dabei wird für die Anzeige der jeweils aktuellen Seitennummer die Systemvariable [Page] verwendet, die zentriert in ein Textobjekt eingetragen werden muß.

Damit ist die Gestaltung des Reports erst einmal abgeschlossen.

Der zweite Teil der Aufgabenstellung besteht darin, dass dieser Report auch in Abhängigkeit der Dienststellung der Mitarbeiter ausgegeben werden soll (also jeweils nur Administratoren, Supervisoren, Controller oder Callagenten). Diese Anforderung wollen wir über einen Dialog im Report lösen, in dem der Anwender die jeweilige Dienststellung auswählen kann, deren Mitarbeiter auszudrucken sind. Wir kommen an dieser Stelle zum ersten Mal mit der Programmierschnittstelle eines Reports in Berührung. 

Ein Dialogfenster in einen Report zu integrieren ist ganz einfach. Setzen Sie den Mauszeiger in die Reiterleiste "Code – Date – Page1" und wählen Sie aus dem Kontextmenü "Neuer Dialog". Als Reaktion darauf wird eine neue Seite "DialogPage1" mit einem leeren Dialogformular im Reportdesigner angelegt.

Beachten Sie auch, dass sich die Objektpalette am linken Rand geändert hat. Dort wird jetzt eine Vielzahl von neuen Dialogelementen (ähnlich wie im Fragenkatalogdesigner) angeboten.

Mit der Maus oder über den Objektinspektor können Sie die Größe des Dialogfensters nach Bedarf verändern. Danach legen Sie bitte zwei Schaltflächen (Buttons) auf den Dialog und ändern deren Beschriftung auf "Weiter" und "Abbrechen" (Objektinspektor, Eigenschaft "Caption"):


Jeder Button besitzt die Eigenschaft ModalResult, welches festlegt, wie und auf welche Weise das modale Dialogfenster geschlossen wird. Die Klappbox im Objektinspektor stellt dafür mehrere Auswahlmöglichkeiten bereit. Der Taste "Weiter" erhält "mrOK", was bewirkt, dass das Dialogfenster geschlossen und anschließend der Report aufgeblendet wird. "mrCancel" bricht dagegen den Dialog und damit auch die Reporterstellung ab. Diesen Eigenschaftswert müssen Sie der Taste "Abbrechen" zuweisen. Anschließend können Sie das Verhalten im Vorschaumodus überprüfen. 

Als Nächstes integrieren wir eine Klappbox (Kombinationsfeld) in den Dialog und beschriften ihn mit einem Textlabel:


Jetzt brauchen wir nur noch die Klappbox mit Vorgaben füllen. Die Vorgabenliste entspricht der Eigenschaft "Items" der Klappbox. Sie ist über den Objektinspektor zugänglich:


Außerdem sollten Sie noch die Eigenschaft "Text" löschen (es sei denn, Sie möchten die Klappbox mit einer Vorgabe belegen).

Damit ist die Erstellung des Auswahldialogs abgeschlossen. Wir müssen jetzt nur noch die Funktionalität des Reports anpassen (d. h., dass er z. B. nur die "Callagenten" auflistet, wenn in der Klappbox "Callagent" ausgewählt wurde). Dazu nutzen wir die Programmierschnittstelle des Reportdesigners aus.

Jedes Reportobjekt besitzt neben seinen "Eigenschaften" auch "Ereignisse", die hinter dem gleichnamigen Reiter im Objektinspektor aufgelistet werden. Solche Ereignisse sind z. B.:
  • OnBeforePrint wird ausgeführt, bevor das Objekt gedruckt wird
  • OnAfterPrint wird ausgeführt, nachdem das Objekt gedruckt wurde
In unserem Fall ist das Ereignis "OnBeforePrint" interessant und zwar das des Hauptdatenbandes "MasterData1". Dieses Band wird für jeden Datensatz der Banddatenquelle mit den darauf liegenden Textobjekten genau einmal ausgegeben. Dabei wird es nur dann gedruckt, wenn es auch sichtbar, d. h. dessen Eigenschaft "Visible" gleich "True" (also "wahr"), ist. Und genau diese Eigenschaft wollen wir ausnutzen, um entsprechend der Klappboxauswahl die auszugebenden Personaldaten nach der Dienststellung zu filtern. Bevor das Masterband gedruckt wird (Ereignis "OnBeforePrint") muss es entweder sichtbar oder unsichtbar geschalten werden je nachdem, ob der jeweils von der Banddatenquelle zurückgelieferte Datensatz im Feld "Dienststellung" den Wert enthält, der auch in der Klappbox des Dialoges ausgewählt wurde oder nicht. Dazu ist ein klein wenig Programmcode notwendig. Zuerst fokussieren Sie bitte das Hauptdatenband "MasterData1" auf der Reportseite und wechseln anschließend im Objektinspektor auf die Ereignisseite. Darin führen Sie einen Doppelklick auf das freie Feld neben dem Ereignis "OnBeforePrint" aus, worauf automatisch eine leere Ereignisbehandlungsroutine auf der Codeseite angelegt wird:

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin

end;


Darin muss jetzt lediglich festgelegt werden, dass, wenn der von der Banddatenquelle übergebene Datensatz als "Dienststellung" den gleichen Wert enthält wie die Klappbox im Dialogfenster, das Band "sichtbar" geschalten wird und ansonsten unsichtbar. Wenn die Klappbox dagegen leer ist, dann muß das Masterdatenband immer "sichtbar" sein, damit alle Personaldatensätze im Report ausgegeben werden. In Pascalscript sieht das dann so aus:

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
  if ComboBox1.Text<>'' then
   if Trim(<BandDatenQuelle."DIENSTSTELLUNG">)=ComboBox1.Text then
    MasterData1.Visible:=True
   else MasterData1.Visible:=False;
end;


Dazu folgende Anmerkungen: Sie können in einem Script auf jedes Reportobjekt über dessen Namen (so wie er im Kopf des Objektinspektors erscheint) und mit einem Punkt (".") dazwischen auf jede Eigenschaft des Objektes zugreifen, z. B. mit ComboBox1.Text auf den Inhalt der Klappbox im Dialogfenster. Datenbankfelder und Reportvariablen haben die gleiche Syntax wie auf der Reportseite, nur dass die eckigen Klammern durch spitze Klammern ersetzt sind, z. B. <BandDatenQuelle."DIENSTSTELLUNG">.

Und damit ist der Report fertig. Wenn Sie möchten, können Sie sich noch etwas mit dem Codeeditor beschäftigen. Er erlaubt z. B. das Setzen von Haltepunkten und das Anzeigen von Variableninhalten zur Laufzeit, was bei einem sehr umfangreichen Scriptcode sehr beim Debugging helfen kann.

Jetzt brauchen Sie nur noch das SQL-Script im SQL-Manager global freigeben und Sie können die Personalliste im Administration-Center jederzeit unter "Auswertung" (Projektbaumeintrag "Administrator") anzeigen und ausdrucken lassen.

Keine Kommentare:

Kommentar veröffentlichen