PBToolboxAI v3 ← Site

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 #

Userobjectu_pbt_crosstab
Item-Klasse— (Felder werden über Methoden platziert)
WofürIhren Benutzern eine Kreuzauswertung Ihrer Daten bieten, die sie selbst umstellen, ohne SQL zu schreiben oder nach Excel auszuweichen
Grenze im Demomodus500 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.

BereichWas er enthältWirkung
ZeilenGruppierungsfelderEine Zeilenebene je Feld, einklappbar
SpaltenGruppierungsfelderEine Ebene von Spaltenkopfzeilen je Feld
WerteNumerische Felder und ihr AggregatWas in den Zellen berechnet wird
FilterAuswahlfelderEin 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 #

KonstanteWertFü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 #

EigenschaftTypStandardZweck
is_totals_positionstring"bottom"Wo die Zeile der Gesamtsumme steht: TOTALS_BOTTOM (am Fuß, Standard) oder TOTALS_TOP (oben, direkt unter den Kopfzeilen)
is_values_axisstring"cols"Ausrichtung der Kennzahlen, wenn es mehrere gibt: VALUES_COLS (nebeneinander in Spalten, Standard) oder VALUES_ROWS (untereinander in Zeilen)
is_currency_symbolstring""Die Währung, die das Menü Zahlenformat eines Wert-Chips anbietet, neben „Kein Symbol“ und „%“. Leer = die der Anzeigesprache ($ auf Englisch, € sonst)
ib_field_listbooleantrueZeigt das Feldpanel an, in dem der Benutzer die Tabelle mit der Maus umstellt
ib_row_subtotalsbooleantrueZeigt eine Zwischensumme je Zeilengruppe an
ib_col_subtotalsbooleantrueZeigt eine Zwischensumme je Spaltengruppe an
ib_row_grand_totalbooleantrueZeigt die Gesamtsummenzeile unter der Tabelle an (das Gegenstück zu ib_col_grand_total)
ib_col_grand_totalbooleantrueZeigt die Gesamtsummenspalte nach der Tabelle an (das Gegenstück zu ib_row_grand_total)
ib_enabledbooleantrueAusgegraut: 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_stylestringfluentVisueller Stil der Komponente (Konstanten THEME_STYLE_*)
is_theme_modestringlightHelle oder dunkle Variante (Konstanten THEME_MODE_*)
il_theme_accentlong-1Akzentfarbe dieser Komponente (-1 = Akzent des Designs)
is_tooltipstring""Einfacher Tooltip beim Überfahren der Komponente
is_super_tooltip_titlestring""Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""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.

EigenschaftTypStandardZweck
is_labelstring""Lesbare Bezeichnung des Feldes ("montant" → "Umsatz")
is_showstring"normal"Was die Zelle anzeigt: "normal", "pctGrand" (% der Gesamtsumme), "pctRow" (% der Zeile), "pctCol" (% der Spalte), "running" (laufende Summe), "diff" (Abweichung zum Vorherigen)
is_conditional_formattingstring"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 #

MethodeZweck
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 #

MethodeZweck
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 #

MethodeZweck

Filtern #

MethodeZweck
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 #

MethodeZweck
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 #

MethodeZweck
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 #

MethodeZweck
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 ( ) → stringGibt 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 #

MethodeZweck
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 #

EventAusgelö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:

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 #

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.

MitgliederRolleBeschrieben in
of_count · of_keys_at · of_hasDurchlaufen, was die Komponente enthält3.2 Die Items
of_resetDie Komponente zurücksetzen3.6 Eine Komponente zurücksetzen: of_reset()
of_set_property · of_get_property · of_component_nameEine Eigenschaft über ihren Namen steuern3.1 Die Eigenschaften-Engine
of_register_shortcut · of_clear_shortcutsTastenkürzel der Komponente3.5 Tastenkombinationen
of_is_created · of_is_ready · of_get_last_errorOb sie entstanden ist, ob sie bereit ist, was fehlschlug3.7 Diagnose
of_save_as_png · of_save_as_jpgDie Darstellung als Bild exportieren3.8 Die Darstellung als Bild exportieren
of_set_redrawÄnderungen zu einem einzigen Neuzeichnen bündeln3.10 Best Practices
of_preload_iconsSymbole ohne VerzögerungSofortige Anzeige: of_icon
of_set_translationEine Beschriftung der Komponente übersetzen5.2 Eine Beschriftung anpassen: of_set_translation
of_focus_webviewDer Komponente den Fokus geben6.4 Tastatur und Fokus
of_print · of_print_to_pdfDrucken oder ein PDF schreiben6.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.


← Komponentenreferenz · Inhalt des Handbuchs