crosstab — u_pbt_crosstab #
← Komponentenreferenz · Inhalt des Handbuchs
Vollständige Crosstab-Tabelle: Bereiche für Zeilen / Spalten / Werte, gespeist aus einem DataStore, Aggregate, Filter, bedingte Formatierung, Datumsgruppierung, berechnete Kennzahlen und Exporte nach CSV / Excel.
▶ Live ansehen — Demoanwendung, Kachel Crosstab: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.
Auf einen Blick #
| Userobject | u_pbt_crosstab |
| Item-Klasse | — (Felder werden über Methoden platziert) |
| Wofür | Ihren Benutzern eine Kreuzauswertung Ihrer Daten bieten, die sie selbst umstellen, ohne SQL zu schreiben oder nach Excel auszuweichen |
| Grenze im Demomodus | 500 verarbeitete Quellzeilen; CSV- und Excel-Exporte deaktiviert — siehe Der Demomodus |
Das Prinzip #
Sie übergeben der Komponente einen flachen Datenbestand — einen DataStore, also jede beliebige Abfrage, die in Ihrer Anwendung bereits geschrieben ist. Um den Rest kümmert sich das Crosstab: Es leitet daraus die Feldliste ab, und Sie verteilen die Felder auf vier Bereiche.
| Bereich | Was er enthält | Wirkung |
|---|---|---|
| Zeilen | Gruppierungsfelder | Eine Zeilenebene je Feld, einklappbar |
| Spalten | Gruppierungsfelder | Eine Ebene von Spaltenkopfzeilen je Feld |
| Werte | Numerische Felder und ihr Aggregat | Was in den Zellen berechnet wird |
| Filter | Auswahlfelder | Ein Filter oberhalb der Tabelle, der auf alles angewendet wird |
Die gesamte Berechnung findet in der Komponente statt: Sind die Daten einmal übergeben, löst das Umstellen der Tabelle keinen einzigen Rückweg zur Datenbank oder zu PowerBuilder aus.
Schnellstart #
// Event open des Fensters
datastore lds
lds = create datastore
lds.dataobject = "d_ventes"
lds.SetTransObject(SQLCA)
lds.Retrieve()
// 1. Daten uebergeben: die Felder werden aus den Spalten abgeleitet
uo_croise.of_set_data(lds)
// 2. Die Felder auf die Bereiche verteilen
uo_croise.of_add_row_field(/*Feld*/ "region")
uo_croise.of_add_col_field(/*Feld*/ "annee")
uo_croise.of_add_value_field(/*Feld*/ "montant", /*Aggregat*/ uo_croise.AGG_SUM)
// 3. Darstellen: Format der Betraege und Gesamtsummen
uo_croise.of_set_value_format(/*Feld*/ "montant", /*Dezimalstellen*/ 0, /*Tausender*/ "locale", /*Symbol*/ "$", /*Symbol_davor*/ true)
uo_croise.ib_row_grand_total = true
uo_croise.ib_col_grand_total = true
// Event ue_cell_double_clicked von uo_croise: (string as_row_tuple_json, string as_col_tuple_json, double ad_value)
// Der Benutzer moechte das Detail hinter einer Zahl: die passende Liste oeffnen.
of_ouvrir_detail(as_row_tuple_json, as_col_tuple_json)
Konstanten #
| Konstante | Wert | Für |
|---|---|---|
TOTALS_BOTTOM · TOTALS_TOP | "bottom" "top" | is_totals_position |
VALUES_COLS · VALUES_ROWS | "cols" "rows" | is_values_axis |
AGG_SUM · AGG_COUNT · AGG_DISTINCT_COUNT | "sum" "count" "dcount" | of_add_value_field |
AGG_AVG · AGG_MIN · AGG_MAX | "avg" "min" "max" | of_add_value_field |
Die Aggregat-Konstanten werden auf der Komponente gelesen: uo_croise.AGG_SUM. Die eines Feldes (SHOW_*, CF_*) werden auf dem Handle des Feldes gelesen.
Eigenschaften #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_totals_position | string | "bottom" | Wo die Zeile der Gesamtsumme steht: TOTALS_BOTTOM (am Fuß, Standard) oder TOTALS_TOP (oben, direkt unter den Kopfzeilen) |
is_values_axis | string | "cols" | Ausrichtung der Kennzahlen, wenn es mehrere gibt: VALUES_COLS (nebeneinander in Spalten, Standard) oder VALUES_ROWS (untereinander in Zeilen) |
is_currency_symbol | string | "" | Die Währung, die das Menü Zahlenformat eines Wert-Chips anbietet, neben „Kein Symbol“ und „%“. Leer = die der Anzeigesprache ($ auf Englisch, € sonst) |
ib_field_list | boolean | true | Zeigt das Feldpanel an, in dem der Benutzer die Tabelle mit der Maus umstellt |
ib_row_subtotals | boolean | true | Zeigt eine Zwischensumme je Zeilengruppe an |
ib_col_subtotals | boolean | true | Zeigt eine Zwischensumme je Spaltengruppe an |
ib_row_grand_total | boolean | true | Zeigt die Gesamtsummenzeile unter der Tabelle an (das Gegenstück zu ib_col_grand_total) |
ib_col_grand_total | boolean | true | Zeigt die Gesamtsummenspalte nach der Tabelle an (das Gegenstück zu ib_row_grand_total) |
ib_enabled | boolean | true | Ausgegraut: das Raster zeigt weiterhin seine Zahlen — eine leere Crosstab-Tabelle ist etwas anderes als eine von der Anwendung abgeschaltete — reagiert aber nicht mehr auf den Zeiger |
is_theme_style | string | fluent | Visueller Stil der Komponente (Konstanten THEME_STYLE_*) |
is_theme_mode | string | light | Helle oder dunkle Variante (Konstanten THEME_MODE_*) |
il_theme_accent | long | -1 | Akzentfarbe dieser Komponente (-1 = Akzent des Designs) |
is_tooltip | string | "" | Einfacher Tooltip beim Überfahren der Komponente |
is_super_tooltip_title | string | "" | Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip) |
is_super_tooltip_text | string | "" | Text des erweiterten Tooltips (Rich-Markup zulässig) |
is_super_tooltip_image | string | "" | Bild des erweiterten Tooltips |
Eigenschaften eines Feldes #
of_field (string as_field) liefert das Handle eines Feldes: Sie holen es einmal und steuern das Feld anschließend über seine Eigenschaften. Das Handle wird beim ersten Aufruf erzeugt und danach wiederverwendet.
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_label | string | "" | Lesbare Bezeichnung des Feldes ("montant" → "Umsatz") |
is_show | string | "normal" | Was die Zelle anzeigt: "normal", "pctGrand" (% der Gesamtsumme), "pctRow" (% der Zeile), "pctCol" (% der Spalte), "running" (laufende Summe), "diff" (Abweichung zum Vorherigen) |
is_conditional_formatting | string | "none" | Bedingte Formatierung: CF_NONE, CF_SCALE (Farbskala) oder CF_BARS (Balken in der Zelle) |
Die Werte von is_show und is_conditional_formatting stehen auch als Konstanten auf dem Handle zur Verfügung (SHOW_PCT_COL, CF_SCALE…).
n_pbt_crosstab_field lnv_champ
lnv_champ = uo_croise.of_field(/*Feld*/ "montant")
lnv_champ.is_label = "Umsatz"
lnv_champ.is_conditional_formatting = lnv_champ.CF_SCALE
⚠️ Inkompatible Änderung. Diese Eigenschaft hieß
is_cf: Die Abkürzung sagte an der Aufrufstelle nichts aus. Der alte Name existiert nicht mehr — Code, der ihn verwendet, lässt sich nicht kompilieren. Die Ersetzung ist mechanisch:is_cf→is_conditional_formatting, ohne Änderung der Werte oder des Verhaltens.
Methoden #
Speisen und benennen #
| Methode | Zweck |
|---|---|
of_set_data (datastore ads_data) | Übergibt den Datenbestand: Die Felder werden aus den Spalten des DataStore abgeleitet, ihre Bezeichnung aus dem Text der Kopfzeile. Gibt 0 zurück, sobald die Daten geladen sind, -5, wenn der DataStore ungültig ist oder keine Spalte besitzt, -2, wenn die Komponente nicht erstellt ist |
of_field (string as_field) | Liefert das Handle eines Feldes, um es zu bezeichnen oder zu formatieren (siehe Eigenschaften eines Feldes) |
Die Tabelle aufbauen #
| Methode | Zweck |
|---|---|
of_clear_layout ( ) | Leert alle vier Bereiche: Die Tabelle wird wieder leer, die Daten bleiben geladen. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_add_row_field (string as_field) | Fügt ein Feld im Bereich Zeilen hinzu (die Reihenfolge der Aufrufe bestimmt die Reihenfolge der Ebenen). Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_add_col_field (string as_field) | Fügt ein Feld im Bereich Spalten hinzu. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_add_value_field (string as_field, string as_agg) | Fügt eine Kennzahl im Bereich Werte hinzu, samt ihrem Aggregat. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_add_filter_field (string as_field) | Fügt ein Feld im Bereich Filter oberhalb der Tabelle hinzu. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
Die von of_add_value_field akzeptierten Aggregate werden von der Komponente als Konstanten bereitgestellt: AGG_SUM (Standard), AGG_COUNT, AGG_DISTINCT_COUNT (Zählung eindeutiger Werte), AGG_AVG, AGG_MIN, AGG_MAX.
Summen und Zwischensummen #
| Methode | Zweck |
|---|
Filtern #
| Methode | Zweck |
|---|---|
of_set_member_filter (string as_field, string as_values_tab) | Behält nur die aufgeführten Werte eines Feldes. Die Werte sind durch Tabulatoren getrennt (~t). Gibt 0 zurück, sobald angewendet, -5 bei einem ungültigen Argument, -2, wenn die Komponente nicht erstellt ist |
of_clear_member_filter (string as_field) | Entfernt diesen Filter. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_set_value_filter (string as_field, string as_type, double ad_a, double ad_b, integer ai_measure_index) | Filtert auf die Summe: "top" (die ersten ad_a), "gt", "lt", "between". ai_measure_index bezeichnet die betroffene Kennzahl (die erste = 1). Gibt 0 zurück, sobald angewendet, -5 bei einem ungültigen Argument, -2, wenn die Komponente nicht erstellt ist |
of_clear_value_filter (string as_field) | Entfernt diesen Filter. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_set_label_filter (string as_field, string as_type, double ad_a, double ad_b) | Filtert auf den Wert des Feldes selbst: "gt", "lt", "between". Gibt 0 zurück, sobald angewendet, -5 bei einem ungültigen Argument, -2, wenn die Komponente nicht erstellt ist |
of_clear_label_filter (string as_field) | Entfernt diesen Filter. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
Formatieren #
| Methode | Zweck |
|---|---|
of_set_value_format (string as_field, integer ai_decimals, string as_thousands, string as_suffix { , boolean ab_symbol_before }) | Format einer Kennzahl: Anzahl der Dezimalstellen (0 bis 6), Tausendertrennzeichen ("locale", "space", "none"), Symbol — standardmäßig hinter der Zahl (1 234 EUR), DAVOR, wenn ab_symbol_before true ist ($1,234). Gibt 0 zurück, sobald angewendet, -5 bei einem ungültigen Argument, -2, wenn die Komponente nicht erstellt ist |
of_clear_value_format (string as_field) | Zurück zum Standardformat. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_set_member_order (string as_field, string as_values_tab) | Den Werten eines Feldes vorgegebene Anzeigereihenfolge (getrennt durch ~t); eine leere Zeichenkette stellt die natürliche Reihenfolge wieder her. Gibt 0 zurück, sobald angewendet, -5 bei einem ungültigen Argument, -2, wenn die Komponente nicht erstellt ist |
Datumsangaben und berechnete Felder #
| Methode | Zweck |
|---|---|
of_group_date_field (string as_field, string as_part) | Erzeugt ein aus einer Datumsspalte abgeleitetes Feld: "year", "quarter" oder "month". Es reiht sich in die Feldliste ein und wird wie jedes andere verwendet. Gibt 0 zurück, sobald angewendet, -5 bei einem ungültigen Argument, -2, wenn die Komponente nicht erstellt ist |
of_add_calc_field (string as_name, string as_label, string as_formula) | Berechnetes Feld Zeile für Zeile ("[montant] * 0.8" = der Nettobetrag jedes Verkaufs, danach wie jede Spalte summiert), in jedem Bereich verwendbar. Nicht für ein Verhältnis von Summen (Durchschnittspreis): dafür of_add_calc_measure. Gibt 0 zurück, sobald angewendet, -5 bei einem ungültigen Argument, -2, wenn die Komponente nicht erstellt ist |
of_remove_calc_field (string as_name) | Entfernt ein berechnetes Feld. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_add_calc_measure (string as_name, string as_label, string as_formula) | Berechnete Kennzahl Zelle für Zelle, auf den Summen ("[marge] / [ca]" = globale Margenquote). Wird ausschließlich im Bereich Werte platziert. Gibt 0 zurück, sobald angewendet, -5 bei einem ungültigen Argument, -2, wenn die Komponente nicht erstellt ist |
of_remove_calc_measure (string as_name) | Entfernt eine berechnete Kennzahl. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
Eine Formel akzeptiert die Operatoren + - * / ( ), Zahlen und Felder in eckigen Klammern. Eine ungültige Formel löst ue_calc_field_error aus — nichts stürzt ab.
Aufklappen, speichern, exportieren #
| Methode | Zweck |
|---|---|
of_expand_all ( ) · of_collapse_all ( ) | Klappt alle Zeilengruppen auf oder zu. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_expand_to_level (integer ai_level) | Klappt bis zu einer bestimmten Ebene auf (1 = nur die erste Ebene). Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_get_layout ( ) → string | Gibt den vollständigen Zustand der Tabelle zurück — unverändert aufbewahren, dann über of_set_layout wiederherstellen |
of_set_layout (string as_state_json) | Stellt einen zuvor erhaltenen Zustand wieder her. Gibt 0 zurück, sobald angewendet, -5 bei einem ungültigen Argument, -2, wenn die Komponente nicht erstellt ist |
of_export_csv (string as_path) | Schreibt eine CSV-Datei der aktuellen Ansicht (UTF-8 mit BOM, Semikolon); ue_csv_saved bestätigt. Das Gegenstück zu of_export_xlsx. Gibt 0 zurück, sobald angewendet, -5 bei einem ungültigen Argument, -2, wenn die Komponente nicht erstellt ist |
of_export_xlsx (string as_path) | Schreibt eine Excel-Datei der Tabelle einschließlich Formatierung; ue_xlsx_saved bestätigt. Gibt 0 zurück, sobald angewendet, -5 bei einem ungültigen Argument, -2, wenn die Komponente nicht erstellt ist |
Gemeinsame #
| Methode | Zweck |
|---|---|
of_reset ( ) | Versetzt die Komponente in ihren Neuzustand zurück. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_set_redraw (boolean) | Fasst eine Folge von Änderungen zu einer einzigen Darstellung zusammen. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist |
of_save_as_png (string) · of_save_as_jpg (string) | Exportiert die Darstellung als Bild. Gibt 0 zurück, -2, wenn die Komponente nicht erstellt ist, -4, wenn die Aufnahme fehlschlägt, -5 bei leerem Pfad |
Events #
| Event | Ausgelöst wenn |
|---|---|
ue_layout_changed (string as_layout_json) | Der Benutzer hat die Tabelle umgestellt (ein Feld verschoben, ein Aggregat geändert, eine Gruppe eingeklappt…) |
ue_cell_double_clicked (string as_row_tuple_json, string as_col_tuple_json, double ad_value) | Doppelklick auf eine Zelle: Die ersten beiden Argumente beschreiben die Kreuzung, das dritte den angezeigten Wert. Das ist der Einstiegspunkt für ein Detail |
ue_csv_saved (string as_path, boolean ab_ok, string as_error) | Die CSV-Datei wurde geschrieben — oder nicht, und as_error sagt warum |
ue_xlsx_saved (string as_path, boolean ab_ok, string as_error) | Die Excel-Datei wurde geschrieben — oder nicht, und as_error sagt warum |
ue_calc_field_error (string as_field, string as_message) | Die Formel eines berechneten Feldes oder einer berechneten Kennzahl ist ungültig |
ue_copy (string as_tsv) | Der Benutzer hat eine Zellauswahl kopiert (Strg+C): Es liegt an Ihnen, sie in die Zwischenablage zu legen |
ue_ready ( ) | Die Komponente ist fertig geladen; alles zuvor Gesendete wurde nachgespielt |
ue_runtime_missing ( ) | Die WebView2-Runtime fehlt: die Komponente bleibt leer |
ue_bg_color (long al_color) | Die Komponente hat ihre Design-Hintergrundfarbe berechnet; das Userobject hat sie bereits übernommen (backcolor) |
Was der Benutzer ohne eine einzige Zeile Code tun kann #
Die Tabelle ist lebendig: Genau darin liegt der Sinn der Komponente. Bei eingeblendetem Feldpanel (ib_field_list = true) kann der Benutzer:
- ein Feld von einem Bereich in einen anderen ziehen und die Kreuzauswertung beliebig umstellen;
- das Aggregat einer Kennzahl ändern (Summe, Mittelwert, Anzahl…);
- die Werte eines Feldes über eine Ankreuzliste filtern;
- eine Zeilen- oder Spaltengruppe ein- oder ausklappen;
- über eine Kopfzeile sortieren;
- einen Zellblock auswählen und kopieren.
Jede dieser Aktionen wird in ue_layout_changed gemeldet: Zusammen mit of_get_layout / of_set_layout können Sie Ihren Benutzern damit „gespeicherte Ansichten“ anbieten.
Über die Tastatur. Jede dieser Gesten ist ohne Maus erreichbar: Tab führt auf ein Feld, ein Zuklapp-Dreieck oder eine sortierbare Kopfzeile, Eingabe oder Leertaste löst sie aus. Auf einem Feld öffnet das dessen Menü — jenes mit Zu Zeilen / Spalten / Werten / Filtern hinzufügen und Entfernen: der gesamte Aufbau der Tabelle läuft darüber.
Beispiele #
Ein vollständiger Vertriebsbericht #
// Zeilen: Region, dann Stadt innerhalb jeder Region
uo_croise.of_clear_layout()
uo_croise.of_add_row_field(/*Feld*/ "region")
uo_croise.of_add_row_field(/*Feld*/ "ville")
// Spalten: eine je Jahr
uo_croise.of_add_col_field(/*Feld*/ "annee")
// Zellen: der Gesamtbetrag
uo_croise.of_add_value_field(/*Feld*/ "montant", /*Aggregat*/ uo_croise.AGG_SUM)
// Darstellung: lesbare Betraege, Zwischen- und Gesamtsummen
uo_croise.of_set_value_format(/*Feld*/ "montant", /*Dezimalstellen*/ 0, /*Tausender*/ "locale", /*Symbol*/ "$", /*Symbol_davor*/ true)
uo_croise.ib_row_subtotals = true
uo_croise.ib_row_grand_total = true
uo_croise.ib_col_grand_total = true
// Die Zellen einfaerben, um grosse Betraege auf einen Blick zu erkennen
uo_croise.of_field(/*Feld*/ "montant").is_conditional_formatting = n_pbt_crosstab_field.CF_SCALE
Lesbare Bezeichnungen #
Ihre Spalten heißen oft mt_ht oder cd_reg. Benennen Sie sie ein für alle Mal um, direkt nach of_set_data.
uo_croise.of_set_data(lds)
uo_croise.of_field("region").is_label = "Region"
uo_croise.of_field("ville").is_label = "Stadt"
uo_croise.of_field("categorie").is_label = "Kategorie"
uo_croise.of_field("annee").is_label = "Jahr"
uo_croise.of_field("montant").is_label = "Umsatz"
uo_croise.of_field("quantite").is_label = "Menge"
Anteile statt Beträge auswerten #
n_pbt_crosstab_field lnv_montant
uo_croise.of_clear_layout()
uo_croise.of_add_row_field(/*Feld*/ "categorie")
uo_croise.of_add_col_field(/*Feld*/ "annee")
uo_croise.of_add_value_field(/*Feld*/ "montant", /*Aggregat*/ uo_croise.AGG_SUM)
// Nur zwei Kategorien auf dem Bildschirm behalten (Werte durch einen Tabulator getrennt)
uo_croise.of_set_member_filter(/*Feld*/ "categorie", /*Werte*/ "Informatique~tMobilier")
lnv_montant = uo_croise.of_field(/*Feld*/ "montant")
// Den Anteil jeder Zelle an der Summe ihrer Spalte anzeigen
lnv_montant.is_show = lnv_montant.SHOW_PCT_COL
// Ein kleiner Balken in jeder Zelle, um die Anteile auf einen Blick zu vergleichen
lnv_montant.is_conditional_formatting = lnv_montant.CF_BARS
Eine eigene Kennzahl: der Durchschnittspreis #
Eine berechnete Kennzahl wird auf den Summen jeder Zelle ausgewertet, nicht Zeile für Zeile: Genau das macht ein Verhältnis korrekt.
uo_croise.of_clear_layout()
uo_croise.of_add_row_field(/*Feld*/ "region")
// Die beiden Summen, die als Grundlage der Berechnung dienen
uo_croise.of_add_value_field(/*Feld*/ "montant", /*Aggregat*/ uo_croise.AGG_SUM)
uo_croise.of_add_value_field(/*Feld*/ "quantite", /*Aggregat*/ uo_croise.AGG_SUM)
// Durchschnittspreis = Gesamtbetrag geteilt durch Gesamtmenge
uo_croise.of_add_calc_measure(/*Name*/ "prix_moyen", /*Bezeichnung*/ "Durchschnittspreis", &
/*Formel*/ "[montant] / [quantite]")
uo_croise.of_set_value_format(/*Feld*/ "prix_moyen", /*Dezimalstellen*/ 2, /*Tausender*/ "locale", /*Symbol*/ "$", /*Symbol_davor*/ true)
// Dann wie jedes Feld unter die Werte stellen (das Aggregat zaehlt nicht: eine Kennzahl wird berechnet)
uo_croise.of_add_value_field(/*Feld*/ "prix_moyen", /*Aggregat*/ uo_croise.AGG_SUM)
// Event ue_calc_field_error von uo_croise: (string as_field, string as_message)
// Ungueltige Formel: warnen, ohne etwas zu zerstoeren, die Tabelle bleibt sichtbar.
uo_statut.of_item("main").is_text = "Formel " + as_field + ": " + as_message
Nach Monat, Quartal oder Jahr auswerten #
Eine Datumsspalte lässt sich nicht unverändert kreuzen — jeder einzelne Tag ergäbe eine eigene Zeile. Leiten Sie zuerst die gewünschte Ebene ab.
// Drei aus der Spalte date_vente abgeleitete Felder erzeugen
uo_croise.of_group_date_field(/*Feld*/ "date_vente", /*Ebene*/ "year")
uo_croise.of_group_date_field(/*Feld*/ "date_vente", /*Ebene*/ "quarter")
uo_croise.of_group_date_field(/*Feld*/ "date_vente", /*Ebene*/ "month")
// Dann wie jedes andere Feld kreuzen: Jahr in den Spalten, Quartal darunter
uo_croise.of_add_col_field("date_vente__year")
uo_croise.of_add_col_field("date_vente__quarter")
Die Rangliste der zehn besten Regionen #
// Nur die 10 Regionen mit der hoechsten Summe der ersten Kennzahl behalten
uo_croise.of_set_value_filter(/*Feld*/ "region", /*Typ*/ "top", &
/*a*/ 10, /*b*/ 0, /*Kennzahl*/ 1)
Exportieren #
Der Export übernimmt exakt die aktuelle Ansicht: dieselben Filter, dieselben Summen, dieselbe Formatierung.
// Nach Excel: die Datei wird direkt unter dem angegebenen Pfad geschrieben
uo_croise.of_export_xlsx("C:\temp\ventes.xlsx")
// Event ue_xlsx_saved von uo_croise: (string as_path, boolean ab_ok, string as_error)
// inv_notif = ein n_pbt_toaster, als Instanzvariable des Fensters deklariert
if ab_ok then
inv_notif.is_title = "Export abgeschlossen"
inv_notif.is_text = as_path
inv_notif.is_kind = inv_notif.KIND_SUCCESS
else
inv_notif.is_title = "Export nicht möglich"
inv_notif.is_text = as_error
inv_notif.is_kind = inv_notif.KIND_ERROR
end if
inv_notif.of_show()
// Nach CSV: eine Datei, wie bei Excel; ue_csv_saved bestaetigt
uo_croise.of_export_csv(/*Pfad*/ "C:\exports\ventes.csv")
Gespeicherte Ansichten anbieten #
string ls_vue
// Aktuelle Ansicht sichern : of_get_layout antwortet sofort
ls_vue = uo_croise.of_get_layout()
// Den Inhalt UNVERAENDERT aufbewahren: er wird ohne Umwandlung wieder abgespielt.
of_enregistrer_vue(is_vue_courante, ls_vue)
// Spaeter: eine gespeicherte Ansicht wieder abspielen
uo_croise.of_set_layout(of_lire_vue("Ventes par region"))
Hinter einer Zahl ins Detail gehen #
// Event ue_cell_double_clicked von uo_croise: (string as_row_tuple_json, string as_col_tuple_json, double ad_value)
// Die ersten beiden Argumente beschreiben die Kreuzung (welche Zeilenwerte,
// welche Spaltenwerte): genug, um eine Detailabfrage neu aufzubauen.
w_detail_ventes lw_detail
OpenWithParm(lw_detail, as_row_tuple_json + "|" + as_col_tuple_json)
Best Practices #
- Rufen Sie
of_set_datanur ein einziges Mal je Datenbestand auf: Die Tabelle danach umzustellen kostet nichts, die Daten erneut zu übergeben ist teuer. - Setzen Sie die Bezeichnungen (
of_field("...").is_label) direkt nachof_set_data: Sie folgen dem Feld überallhin, auch in das Feldpanel und in die Exporte. - Filtern Sie auf SQL-Seite weg, was nicht ausgewertet werden soll: Das Crosstab ist schnell, aber ein halb so großer DataStore öffnet sich doppelt so schnell.
of_clear_layout()leert die Bereiche, ohne die Daten erneut zu übergeben: Das ist der richtige Aufruf, um mehrere Auswertungen auf derselben Quelle anzubieten.- Ein Datumsfeld wird immer über
of_group_date_fieldgekreuzt, niemals direkt. - Lassen Sie das Feldpanel auf Auswertungsbildschirmen sichtbar und blenden Sie es auf festen Dashboards aus.
Vom gemeinsamen Sockel geerbt #
Diese Mitglieder gibt es bei jeder visuellen Komponente — sie sind nicht dieser eigen. Sie werden einmal in den übergreifenden Kapiteln beschrieben; diese Tabelle sagt nur, wo man sie liest.
| Mitglieder | Rolle | Beschrieben in |
|---|---|---|
of_count · of_keys_at · of_has | Durchlaufen, was die Komponente enthält | 3.2 Die Items |
of_reset | Die Komponente zurücksetzen | 3.6 Eine Komponente zurücksetzen: of_reset() |
of_set_property · of_get_property · of_component_name | Eine Eigenschaft über ihren Namen steuern | 3.1 Die Eigenschaften-Engine |
of_register_shortcut · of_clear_shortcuts | Tastenkürzel der Komponente | 3.5 Tastenkombinationen |
of_is_created · of_is_ready · of_get_last_error | Ob sie entstanden ist, ob sie bereit ist, was fehlschlug | 3.7 Diagnose |
of_save_as_png · of_save_as_jpg | Die Darstellung als Bild exportieren | 3.8 Die Darstellung als Bild exportieren |
of_set_redraw | Änderungen zu einem einzigen Neuzeichnen bündeln | 3.10 Best Practices |
of_preload_icons | Symbole ohne Verzögerung | Sofortige Anzeige: of_icon |
of_set_translation | Eine Beschriftung der Komponente übersetzen | 5.2 Eine Beschriftung anpassen: of_set_translation |
of_focus_webview | Der Komponente den Fokus geben | 6.4 Tastatur und Fokus |
of_print · of_print_to_pdf | Drucken oder ein PDF schreiben | 6.9 Drucken |
Zwei Helfer werden nicht geerbt: of_icon und of_escape_markup liegen auf n_pbt_utils. Deklarieren Sie eines — n_pbt_utils lnv_utils, nichts zu erzeugen — und rufen Sie sie darauf auf.