Lade...
 

Listen und Berichte

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.

    \"Erweiterte Suche\"-Button
    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 Zwischenablage
    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.

Definition Standardliste
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) ]
Empfange Nachricht
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.
Slots, die automatisch gesetzt werden.
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.

Makro SetListBox
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:

Beispiel für SendMsg(ADVANCED_SEARCH)
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.

Beispiel für die Definition des Buttons:
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
FALSE - Ohne Listenköpfe

 

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.

Beispiel für die Definition des Buttons:
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
FALSE - Ohne Listenköpfe

 

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.

Definition Berichtsabhängige Liste
ObjectListView(HiddenReportListBox, HIDDEN, SELECT_MULTIPLE, AUTO_POSITION, 7, , 79, 561, 120) [ INITIALIZE : Widget SetHiddenReportListBox ... SELECT_EXECUTES_TO_CREATE_DATA_COLLECTION: SelectExecutesToCreateDataCollection ]

 

Zur Implementierung der Funktionalität empfiehlt es sich ein Makro SelectExecutesToCreateDataCollection_SetTestMsg zu benutzen, welches die auszuführenden Kommandos aufbereitet und die Test-Massage definiert.

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
Makros zur Abfrage der Datenbasis
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.