PBToolboxAI AcheterBuyKaufenAcquistaComprarComprar

← Historique de tous les composants← History of every component← Versionsverlauf aller Komponenten← Cronologia di tutti i componenti← Historial de todos los componentes← Histórico de todos os componentes

L'historique des versions est publié en anglais.Version history is published in English.Der Versionsverlauf wird auf Englisch veröffentlicht.La cronologia delle versioni è pubblicata in inglese.El historial de versiones se publica en inglés.O histórico de versões é publicado em inglês.

Crosstab — version history

u_pbt_crosstab · Introduced in 3.0

The pivot table of a DataStore: rows, columns, aggregated values, filters, subtotals, calculated fields and measures, CSV and Excel export. Introduced in 3.0.

4.0 — October 2026 #

New #

  • is_thousands (constants THOUSANDS_LOCALE, THOUSANDS_NONE, THOUSANDS_SPACE): the default thousands separator of the measures, read back live.
  • of_set_label_filter(as_field, as_type, as_a, as_b) in text, with LABEL_CONTAINS, LABEL_BEGINS, LABEL_ENDS — the two-double form could only take a number — and the constants LABEL_GT, LABEL_LT, LABEL_BETWEEN.
  • Constants VALUEFILTER_TOP, VALUEFILTER_BOTTOM, VALUEFILTER_GT, VALUEFILTER_LT, VALUEFILTER_BETWEEN, DATE_YEAR, DATE_QUARTER, DATE_MONTH, and CF_ICONS on the field handle.
  • The keyboard can move a field: the chip menu offers "Move left / Move right" and "Add to rows / columns / filters", and opens with Shift+F10 or the Menu key; the focus stays on the element acted on, and follows a chip into its new zone.
  • Only the visible columns are drawn: a customer code or a day-level date placed in Columns no longer freezes the screen.
  • An empty member (NULL, empty text) is a single "(blank)" member, sorted last and filterable.
  • The quarter prefix follows the display language (T1 in French, Italian, Spanish, Portuguese).
  • A drag in progress is cancelled by Esc, by releasing the button outside, or when the window loses the focus.
  • Every native menu of the component (like every native menu of the library) lets the user type the first letters of an entry to jump to it, read through the keyboard layout; a menu with more than 500 entries only draws what is visible.
  • of_remove_field(as_field): takes a field out of every zone it sits in — Rows, Columns, Filters and each of its values — with its filters, without rebuilding the layout; ue_layout_changed tells the new one (-4 when the field sits in no zone, -5 for a field the data does not hold).
  • of_get_cell_value(as_row_tuple_json, as_col_tuple_json, ai_measure, ad_value): reads the value one cell shows, addressed by the tuples of ue_cell_double_clicked ({} for the total, a partial tuple for a subtotal) and the position of the measure in Values, from 1; a collapsed branch or hidden subtotals are read all the same.
  • ib_copy_headers: Ctrl+C copies the headers with the selected cells — the column names on a first line, the member of each row (its whole path, "North / Boston") in a first column.

Fixed #

  • DataStore dates on a non-French machine (3/15/2025, 15.03.2025) are grouped in the right month and read back as yyyy-mm-dd; dates sort in time order, and codes such as 12-A / Q10 in natural order; a timestamp column is converted and groupable, a time column no longer offers "Group by date".
  • Numbers are shown in the display language in German, Italian, Spanish and Portuguese (1.234,5), no longer the American way.
  • of_export_csv: decimals use the display language's separator (read as numbers by a French Excel), and a label starting with =, +, - or @ is written with a leading apostrophe so it never runs as a formula when opened.
  • of_export_xlsx exports the table as it is on screen: hidden totals and subtotals left out, top grand total, currency symbol before the amount, "negatives in red", "values on rows" orientation; more than 16,384 columns is refused and ue_xlsx_saved says why; control characters no longer make the file unreadable.
  • The CSV and Excel exports and the copy follow the "values on rows" orientation, and "values on rows" without column fields supports selection, copy, value sort and large tables.
  • "Add to values" on a field already in Values adds a value instead of replacing its values; "Remove" on a filtered field removes its filter with it.
  • The same field can be both a dimension and a value in any call order; "Remove" on a dimension chip removes only that chip.
  • AGG_DISTINCT_COUNT ignores empty cells, as Excel does.
  • A formula that uses a calculated measure is refused through ue_calc_field_error (it was accepted and was worth 0); removing a calculated measure no longer shifts the calculated and derived fields.
  • ue_layout_changed carries the whole layout even when a member contains a brace; a value sort whose column disappears falls back on the row total.
  • A text with a tab or a line break in the DataStore stays in its cell (it created ghost rows and shifted columns).
  • is_label is kept after a new of_from_datastore; is_label = "" gives back the DataWindow header.
  • is_show, is_conditional_formatting and of_set_value_format set before of_add_value_field are kept, read back and applied when the field enters Values.
  • of_set_member_filter(field, "") removes the filter (it kept no member: an empty table), like of_set_member_order(""); the member filter of the grid is applied by OK, with up to 10,000 members listed.
  • of_collapse_all collapses column groups too.
  • ib_enabled = false also silences the keyboard (Enter no longer opens a chip menu, Ctrl+C no longer copies); Ctrl+C after of_clear_layout or of_reset no longer fails.
  • Hovering a cell lights its row header too; in right-to-left reading, indentation and chevrons are on the correct side.
  • Dark mode: negative numbers, icon arrows and the selected cell of a colour scale are readable; column headers are darker on hover and on totals in the Office themes.
  • In right-to-left reading, native menus hang from the right edge of their title and cascades open to the left (Left opens, Right closes).
  • Enter or Esc pressed in the component, when it does not use them, goes back to the window: the PowerBuilder Default or Cancel CommandButton fires (the key was lost).
  • A disabled component (ib_enabled = false) leaves the Tab order; enabled again (or after of_reset), it takes its place back.
  • A language set by PBT_SetLanguage applies from the very next order given to the component: a text of an event raised by that order no longer comes in the old language.
  • With no language chosen by the application, the component announces English to screen readers (it announced French).
  • is_theme_style, is_theme_mode and il_theme_accent read back the style and mode shown and the component's own accent (-1 when it has none); an unknown or badly written value is ignored instead of leaving the component without a theme, and an axis left empty follows the application's theme.
  • The application accent (PBT_SetDefaultThemeAccent) survives a change of theme, is followed as long as the component has no accent of its own, and repaints everything derived from it (hover, pressed, selections); Windows high contrast is supported.
  • Reading back il_back_color_hover or il_text_color_hover of an item never coloured returns -1 (the theme's colour), like the other item colours (it returned 0, black).

Behavior changes #

  • of_set_data(ds) is renamed of_from_datastore(ds), the name used by the datagrid and the scheduler; same arguments, same codes.
  • A field that does not exist (a typo) passed to an add, a filter, a format, an order or a date grouping returns -5; so do an unknown filter type, aggregation or date part, a calculated measure placed in Rows, an of_set_value_filter at a position without a measure, an of_set_layout that is not JSON and an of_remove_calc_field / of_remove_calc_measure of an unknown name (they returned 0).
  • ad_value of ue_cell_double_clicked is the displayed value (0.8 under "80.0 %", no longer the raw aggregate) and NULL for an empty cell; an empty member is null in the tuples.
  • The thousands separator of of_set_value_format applies to that measure only (",", "." and " " are recognized; "" = the default of the Options menu).
  • Sorting a column or collapsing a group with the mouse raises ue_layout_changed, like everything of_get_layout records.
  • In the demo version, Ctrl+C is refused like an export, and the grid says so.
  • A handle kept after of_remove_calc_field or of_remove_calc_measure is released (IsValid() returns false).
  • Ctrl+C on cells copies the headers with the figures by default; ib_copy_headers = false copies the figures alone.
  • ue_cell_double_clicked receives ai_measure, the position of the double-clicked value in Values (from 1), before ad_value: with the two tuples, it is the address of_get_cell_value reads back.
  • of_export_csv and of_export_xlsx with a relative path write in the folder the application started in, not in the current folder of the moment (which a DirList or a file dialog may have moved); ue_csv_saved / ue_xlsx_saved give the full path, and a path that depends on the current folder of a drive (\x, C:x) is refused.
  • See the 3 → 4 migration guide, sections 11.3, 11.5, 11.33, 11.42, 11.44 and 11.48.

3.0 — September 2026 #

New #

  • First release: a pivot table fed by a DataStore (of_set_data), with fields placed in rows, columns, values and filters by code (of_add_row_field, of_add_col_field, of_add_value_field, of_add_filter_field) or dragged by the user from the field list (ib_field_list).
  • Aggregations AGG_* (sum, count, distinct count, average, min, max), the same field several times in Values, display modes is_show (percentage of the row, the column or the grand total, running total, difference) and conditional formatting is_conditional_formatting (colour scale, data bars).
  • Row and column subtotals and grand totals (ib_row_subtotals, ib_col_subtotals, ib_row_grand_total, ib_col_grand_total, is_totals_position), measures on columns or rows (is_values_axis), expand and collapse (of_expand_all, of_collapse_all, of_expand_to_level).
  • Date grouping (of_group_date_field: year, quarter, month), member filters and order, label filters and value filters (top/bottom N, greater than…).
  • Calculated fields (per source row) and calculated measures (on the aggregates), with ue_calc_field_error for a formula that does not compile.
  • Number formats (of_set_value_format: decimals, thousands, currency symbol before or after) and is_currency_symbol for the "Number format" menu.
  • CSV and Excel export to a path (of_export_csv, of_export_xlsx → ue_csv_saved, ue_xlsx_saved), Ctrl+C copy (ue_copy), double-click on a cell (ue_cell_double_clicked).
  • Layout save and restore (of_get_layout, of_set_layout, ue_layout_changed) and a field handle n_pbt_crosstab_field (of_field): is_label, is_show, is_conditional_formatting.
  • ue_script_error: a script error in the page reaches PowerBuilder with its message instead of being lost.
  • of_set_property, of_get_property and of_component_name: drive a property by its name (settings screen, saved configuration).