Listen und Berichte
ClassiX bietet eine einheitliche Konzeption für die Anzeige und die Ausgabe von Listen, welche aus drei Teilen besteht. So gibt es zum einen das Modul, welches die Liste und die Suche definiert. Dann gibt es den Bericht, welchem eine eigene Spalten-Definition und Datenbasis zugrunde liegen kann. Als drittes gibt es das Reporting-Modul, welches die Schnittstelle zwischen dem Modul und dem Bericht herstellt.
Modulaufbau
Im folgenden werden die Elemente beschrieben, aus welchen das Modul aufgebaut ist.
Benötigte Widgets
Für das Anzeigen berichtsabhängiger Listen sind in einem Modul folgende Widgets notwendig :
- ObjectListView für die Anzeige der Liste (Es müssen keine besonderen Flags gesetzt sein, dies ist nur ein Beispiel):
ObjectListView(ListBox, SELECT_MULTIPLE, ACCEPT_DROP, AUTO_POSITION, 7, 60, 561, 120)
-
Der optionale Prompt mit dem Namen "DefaultReportListBoxPmt" wird angezeigt, wenn die Standardliste gewählt wurde:
Prompt(DefaultReportListBoxPmt, 10, 71, T("Standard Liste", "Default List"))Wenn mehrere Listboxen in einem Fenster sind, können die Prompts für jede Listbox einzeln definiert werden. Dazu müssen die zusammengehörenden Widgets (Listbox und die Prompts) in einer Group oder Compsite definiert werden. Der Bezeichner für die Prompts muss mit "DefaultReportListBoxPmt" oder "SpecifiedReportListBoxPmt" beginnen.
- Der optionale Prompt mit dem Namen "SpecifiedReportListBoxPmt" wird mit dem gweählten Berichtsnamen aktualisiert und angezeigt:
Prompt(SpecifedReportListBoxPmt, HIDDEN, RED, 7, 30, T("Berichtsabhängige Liste", "Report specific List"))
-
Der optionaler Button für die erweiterte Suche, damit können Query abfragen über Liste definierten und ausgeführt werden.
Button(ExpandedSearchBtn, 1200, 11, 200, 7, T("Erweiterte Suche", "Expanded search")) [ SELECT: "CX_PERSON" "" INVALID INVALID INVALID INVALID Widget(, ListBox) SendMsg(ADVANCED_SEARCH) ] -
Definition eines Menüeintrags, Buttons oder Toolbar-Buttons für die Auswahl eines Berichts un den Export der Daten in die Zwischenablage, Excel oder HTML.
Button(CopyClipboardButton, TOOLTIP("Alle Kunden in die Zwischenablage kopieren", "Copy to clipboard"), 0, 0, "copytoclipboard.bmp") [ SELECT: // Call report service NULL // set standard report variables first [ projectSetup::GetCyberEnterprise Copy(partner.Name(6)) // cxVar04 = Mandant projectSetup::GetUser_ Dup if { Copy(partner.Name(6)) } else { Drop "" } // cxVar03 = Bearbeiter CreateTransObject(CX_TIME) String // cxVar02 = Uhrzeit CreateTransObject(CX_DATE) String // cxVar01 = Datum ] # "CX_CUSTOMER" Widget(, ListBox) SendMsg(PRINT_REPORT) ]Parameter für den Aufruf von SendMsg(PRINT_REPORT):
Top Definition des ListBox- oder TreeBox-Widgets das für die Anzeige der Liste verwendet werden soll. Top - 1 Name des Datenkonnektors, dessen Berichte verwendet werden sollen.
Wenn in einem in einem Fenster oder Notebook mehrer Listen dargestellt und für jede Liste die Prompts definiert werden sollen. Können Sie wie folgt definieren werden:- Beim Aufruf der Message "PRINT_REPORT" wird der Berichtstyp z.B. "CX_EXAMPLE" übergeben. Wenn Sie mehrere Listen definieren wollen, müssen Sie jeder Liste eine eigenen Berichtstyp zuordnen. Um die Verbindung der Listen im Type klar zu machen, können Sie die Typen z.B. "CX_EXAMPLE_UP", "CX_EXAMPLE_DOWN" usw. benennen.
- Für die Zuordnung der Prompts ist der String nach dem letzten "_" wichtig, d.h. der Prompt "DefaultReportListBoxPmt_UP" wird der Liste "CX_EXAMPLE_UP" zugeordnet.
Top - 2 Kopfdaten für einen möglichen BIRT-Bericht.
Top - 3 NULL - dieser Parameter wird nicht verwendet, deswegen sollte hier NULL übergeben werden.
Definition : ListView
Die Standardliste ist die in der Regel standardmäßig sichtbare Liste, welcher der User zum Arbeiten in ClassiX nutzt. Die Spalten-Definitionen werden mit der Procedure SetListBox vorgenommen. Die Messages SAVE_FORMAT und RESET_FORMAT werden durch die Menüeinträge "Format speichern" und "Format zurücksetzen" im Burger der Liste ausgelöst und ermöglichen es benutzerabhängige Formatierungen (Auswahl der Spalten, Sortierung) zu speichern. Diese werden im INITIALIZE über den Provideraufruf report::SetListboxByReport wieder geladen.
Prompt(DefaultReportListBoxPmt, 15, 11, T("Standard Liste", "Default List")) Prompt(SpecifedReportListBoxPmt, HIDDEN, RED, 15, 11, T("Berichtsabhängige Liste", "Report specific List")) Button(ExpandedSearchBtn, 1200, 11, 200, 7, T("Erweiterte Suche", "Expanded search")) [ SELECT: "CX_PERSON" "" INVALID INVALID INVALID INVALID Widget(, ListBox) SendMsg(ADVANCED_SEARCH) ] ObjectListView(ListBox, OPTIMIZE, SELECT_MULTIPLE, BITMAP_SIZE, DRAG_COPY, HZ_SCROLL_BAR, AUTO_POSITION, 15, 22, 980, 117) [ INITIALIZE: SetListBox "CX_PERSON" NULL Widget cxReport::SetListboxByReport Drop SAVE_FORMAT : "CX_PERSON" Widget cxReport::SaveActiveFormatAsUserDefaultReport RESET_FORMAT: Widget cxReport::SetListboxByDefault RELOAD_FORMAT: Widget(, StartButton) SendMsg(SELECT, DIRECT) REPORT_LIST: EndTXN BeginTXN(READ) // NULL is necessary for compatible call NULL // set standard report variables first [ cyberEnterprise Dup if Copy(partner.Name(6)) else { Drop "" } // cxVar04 = Mandant user if { user Copy(partner.Name(6)) } else "" // cxVar03 = Bearbeiter CreateTransObject(CX_TIME) String // cxVar02 = Uhrzeit CreateTransObject(CX_DATE) String // cxVar01 = Datum ] # Widget Copy(default.report) Widget SendMsg(PRINT_REPORT) ]
Nachricht | Beschreibung |
---|---|
SAVE_FORMAT | Nachricht wird getrickert, wenn im Menü "Listenformat speichern" angeklickt wird. |
RESET_FORMAT | Nachricht wird getrickert, wenn im Menü "Listenformat zurücksetzen" angeklickt wird. |
RELOAD_FORMAT |
Diese Nachricht wird beim Zurücksetzten des Listenformats getriggert. Ist nur notwendig, wenn der Aufbau der Standardliste mit verschiedenen Formatnamen definiert wurde. |
REPORT_LIST | Nachricht wird getrickert, wenn im Menü "Liste ausgeben" angeklickt wird. |
DEPLOY_FORMAT | Diese Nachricht wird nach dem Setzen eines neuen Formats über das Berichteauswahlfenster. |
LIST_VIEW_COLLECTION_SELECTED | Diese Liste wird bei der Auswahl einer gespeicherten Liste mit dem Objekt CX_LIST_VIEW_COLLECTION auf dem Stack gesendet. |
Slotname | Beschreibung |
---|---|
default.format | Aktuelles Standard-Format der Lisbox |
reported.masterObject | Der Bericht mit dem das Standard-Format gesetzt wird. |
accessPath | Beschreibung des Berichts |
exported.accessPath | Dateinamen für den Export der Liste per Excel oder HTM |
Das Makro SetListBox definiert das Standardformat und ggf. die Standardsortierung der Listbox.
Define(SetListBox) ResetWindow [ Path(CX_LINK_TXN::TopTransaction().uniqueID) HEADER T("Warenkorb", "Shopping cart") ] SetFormat [ Path(CX_LINK_TXN::TopTransaction().shortName) HEADER T("Name", "Name") ] SetFormat [ "TopTransaction().uniqueID" ] SetSort ;
Definition : Benutzereinstellung Standard Darstellung
Das Burger-Menü rechts oben in der Liste bietet die Möglichkeit die angezeigten Spalten auszuwählen sowie das Listenformat und die Sortierung zurückzusetzen. Wenn diese Formatänderungen dauerhaft übernommen werden sollen, muss der Menüpunkt "Listenformat speichern" ausgewählt werden.
Definition: Erweiterte Suche
Die erweiterte Suche ist eine einfache Möglichkeit für Daten die über eine Liste und einem Datenkonnektor definiert sind eine Query-Abfrage ähnlich SQL auszuführen. Die Ergebnisse können im Excel- und HTML-Format exportiert oder in die aufrufende Liste übernommen werden.
Beispiel für die Definition des Buttons:
Button(ExpandedSearchBtn, 870, 22, 200, 7, T("Erweiterte Suche", "Expanded search")) [ SELECT: CX_REPORT" ""; INVALID INVALID INVALID INVALID Widget(, ListBox) SendMsg(ADVANCED_SEARCH) ]
Parameter für den Aufruf von SendMsg(ADVANCED_SEARCH): siehe
Definition: Export als Excel-Datei
Der Inhalt einer ListBox kann mit nur einem Provideraufruf direkt als Excel-Datei im XLSX-Format exportiert werden. Dazu ist keine Excel-Version notwendig. Für den Dateinamen nimmt wird der Slot "exported.accessPath" am Widget oder die Beschreibung der Gruppe/Fenster genommen.
Button(ExportBtn, TOOLTIP("Selektierte oder alle Positionen Export", "Export selected or all items"), 30, 140, 200, 8, T("E&xport nach Excel", "E&xport into Excel")) [ SELECT: EndTXN BeginTXN(READ) TRUE GetObjectsSelected(, FoundObjectsWinListBox) # Cardinality if TRUE else FALSE Widget(, FoundObjectsWinListBox) excelFile::ExportObjectListIntoExcelFile ]
Parameter für den Aufruf von excelFile::ExportObjectListIntoExcelFile:
Top | Definition des ListBox- oder TreeBox-Widgets das für den Export der Liste verwendet werden soll. |
Top - 1 | TRUE - Nur die ausgewählten Positionen werden exportiert FALSE - Alle Positionen der Liste werden exportiert. |
Top - 2 |
TRUE - Listenköpfe werden übernommen |
Definition: Export als HTML-Datei
Der Inhalt einer ListBox kann mit nur einem Provideraufruf direkt als HTML-Datei in einer Tabelle exportiert werden. Für den Dateinamen nimmt wird der Slot "exported.accessPath" am Widget oder die Beschreibung der Gruppe/Fenster genommen.
Button(ExportHTMLBtn, TOOLTIP("Selektierte oder alle Positionen Export", "Export selected or all items"), 30, 140, 200, 8, T("E&xport nach HTML", "E&xport into HTML")) [ SELECT: EndTXN BeginTXN(READ) TRUE GetObjectsSelected(, FoundObjectsWinListBox) # Cardinality if TRUE else FALSE Widget(, FoundObjectsWinListBox) httpTools::ExportObjectListIntoFile ]
Parameter für den Aufruf von httpTools::ExportObjectListIntoFile:
Top | Definition des ListBox- oder TreeBox-Widgets das für den Export der Liste verwendet werden soll. |
Top - 1 | TRUE - Nur die ausgewählten Positionen werden exportiert FALSE - Alle Positionen der Liste werden exportiert. |
Top - 2 |
TRUE - Listenköpfe werden übernommen |
Definition : Abfrage Datenbasis
Es gibt Berichte, die müssen wiederkehrend aufgerufen werden. So könnte wöchentlich ein Bericht der gelieferten aber noch nicht fakturierten Aufträge erstellt werden. Dies kann automatisiert werden, damit man nicht jedes Mal die gleiche Liste aufrufen und die gleichen Auswahlkriterien auswählen muss. Hierzu gibt es im Module der Berichte die Funktion "Abfrage Datenbasis".
Aus der Sicht des Anwenders funktioniert die Funktion wie folgt. Man öffnet das Listenmodul und wählt die Suchkriterien aus. Anschließend öffnet man das Reporting Modul und wählt einen Bericht aus oder legt einen neuen Bericht an. Bei der Bearbeitung des Berichtes kann man die "Kommandos zur Abfrage der Datenbasis" automatisch erstellen. Der Bericht holt sich hierbei die Suchkriterien aus dem Listenmodul in Form von Kommandos, die später automatisch abgesetzt werden. Der Anwender ist so in der Lage den Bericht unter seinen Favoriten zu speichern und automatisch ausführen zu lassen.
Damit dies Funktioniert müssen beim Schreiben des Moduls folgende Makros definiert werden.
Die Berichtsabhängige Liste benötige die Message SELECT_EXECUTES_TO_CREATE_DATA_COLLECTION, welche das Makro SelectExecutesToCreateDataCollection aufruft.
Im Hauptmakro SelectExecutesToCreateDataCollection sind dann folgende Absätze einzufügen:
- Öffnen des Listenfensters, wenn dieses noch nicht offen ist.
- Leeren der Suchmakse
- Auslesen der Suchargumente um umwandeln dies in Execute Kommandos
- Öffnen des Reporting Moduls
- Selektieren des Berichts im Reporting Modul
Define(SelectExecutesToCreateDataCollection_SetTestMsg) Substitute("\"", "\\\"") "\"" Swap + "\" SendMsg(TEST_PRODUCT)" + ; Define(SelectExecutesToCreateDataCollection) -> sender [] -> executeVector CreateTransObject(CX_TRANSACTION) Dup -> tmpExecuteTxn executeVector Insert T("Listenfenster öffnen") tmpExecuteTxn Put(mlShortName) "Widget(SelectWin) Call(IsOpen) ifnot { NULL SendMsg(LIST_PRODUCT) }" SelectExecutesToCreateDataCollection_SetTestMsg tmpExecuteTxn Put(system.comment) CreateTransObject(CX_TRANSACTION) Dup -> tmpExecuteTxn executeVector Insert T("Suchmaske leeren") tmpExecuteTxn Put(mlShortName) "ClearWindow(SelectWin, ListBoxHeaderGroup)" SelectExecutesToCreateDataCollection_SetTestMsg tmpExecuteTxn Put(system.comment) GetValue(, UniqueIDStr) Truncate Cardinality if { CreateTransObject(CX_TRANSACTION) Dup -> tmpExecuteTxn executeVector Insert T("Filter Nummer") tmpExecuteTxn Put(mlShortName) "\"" GetValue(, UniqueIDStr) + "\" PutValue(SelectWin, UniqueIDStr) Widget(SelectWin, UniqueIDStr) SendMsg(SELECT,DIRECT)" + SelectExecutesToCreateDataCollection_SetTestMsg tmpExecuteTxn Put(system.comment) } CreateTransObject(CX_TRANSACTION) Dup -> tmpExecuteTxn executeVector Insert T("Reporting Fenster öffnen") tmpExecuteTxn Put(mlShortName) "\"Widget(SelectWin,CopyClipboardButton) SendMsg(SELECT, DIRECT)\" SendMsg(TEST_PRODUCT)" tmpExecuteTxn Put(system.comment) CreateTransObject(CX_TRANSACTION) Dup -> tmpExecuteTxn executeVector Insert T("Report selektieren") tmpExecuteTxn Put(mlShortName) "Var(tmpReport) Module \"reprtedt\" StringFind if { tmpReport \"Select(EditWin, Reports) Widget(EditWin, SwitchDataBaseBtn) SendMsg(SELECT, DIRECT)\" SendMsg(TEST_PRINT_REPORT) }" tmpExecuteTxn Put(system.comment) executeVector sender SendMsg(EXECUTES_TO_CREATE_DATA_COLLECTION_SELECTED, DIRECT) ;
Definition: Filterung Datenbasis
Beim Aufruf des Bericht Dialogs werden die aktuellen Daten der Liste als Datenbasis verwendet bzw. durch die Schritte in "Abfrage Datenbasis" zusammen gestellt. Anschließend können. Diese Daten werden vor der Ausführung der Filterung in das "ObjectListView" Objekt geschrieben. Mit den Befehlen in der Filterung können Sie diese Daten manipulieren. Es besteht dabei die Möglichkeit über die Variablen objectList ( = ObjectListView) und parentWindow ( = Fenster) direkt auf die Daten der Listbox zu zugreifen.
Beispiele:
Beschreibung | Code |
---|---|
Laden der Collection der Liste auf den Stack | objectList parentWindow GetCollection(STACK, STACK) |
Die Liste Löschen und den ersten Eintrag zurück schreiben | objectList parentWindow ClearObox(STACK, STACK) 0 Swap GetElement objectList parentWindow UpdateObox(STACK, STACK) |
Definition: Gespeicherte Liste
Damit eine gespeicherte Liste direkt aus dem Fenster eigene gespeicherte Listen ausgerufen werden, muss das Fenster mit der Listbox eine "EXEC_..."-Nachrichten empfangen können. Hat kann ein Fenster nicht diese Nachricht empfangen, so können gespeicherte Listen nur über das Berichtsfenster ausgewählt werden.