Crosstab — version history
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(constantsTHOUSANDS_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, withLABEL_CONTAINS,LABEL_BEGINS,LABEL_ENDS— the two-doubleform could only take a number — and the constantsLABEL_GT,LABEL_LT,LABEL_BETWEEN.- Constants
VALUEFILTER_TOP,VALUEFILTER_BOTTOM,VALUEFILTER_GT,VALUEFILTER_LT,VALUEFILTER_BETWEEN,DATE_YEAR,DATE_QUARTER,DATE_MONTH, andCF_ICONSon 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_changedtells the new one (-4when the field sits in no zone,-5for 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 ofue_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 asyyyy-mm-dd; dates sort in time order, and codes such as12-A/Q10in natural order; atimestampcolumn is converted and groupable, atimecolumn 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_xlsxexports 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 andue_xlsx_savedsays 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_COUNTignores empty cells, as Excel does.- A formula that uses a calculated measure is refused through
ue_calc_field_error(it was accepted and was worth0); removing a calculated measure no longer shifts the calculated and derived fields. ue_layout_changedcarries 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_labelis kept after a newof_from_datastore;is_label = ""gives back the DataWindow header.is_show,is_conditional_formattingandof_set_value_formatset beforeof_add_value_fieldare 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), likeof_set_member_order(""); the member filter of the grid is applied by OK, with up to 10,000 members listed.of_collapse_allcollapses column groups too.ib_enabled = falsealso silences the keyboard (Enter no longer opens a chip menu, Ctrl+C no longer copies); Ctrl+C afterof_clear_layoutorof_resetno 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 (
Leftopens,Rightcloses). - Enter or Esc pressed in the component, when it does not use them, goes back to the window: the PowerBuilder
DefaultorCancelCommandButtonfires (the key was lost). - A disabled component (
ib_enabled = false) leaves the Tab order; enabled again (or afterof_reset), it takes its place back. - A language set by
PBT_SetLanguageapplies 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_modeandil_theme_accentread back the style and mode shown and the component's own accent (-1when 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_hoveroril_text_color_hoverof an item never coloured returns-1(the theme's colour), like the other item colours (it returned0, black).
Behavior changes #
of_set_data(ds)is renamedof_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, anof_set_value_filterat a position without a measure, anof_set_layoutthat is not JSON and anof_remove_calc_field/of_remove_calc_measureof an unknown name (they returned0). ad_valueofue_cell_double_clickedis the displayed value (0.8under "80.0 %", no longer the raw aggregate) andNULLfor an empty cell; an empty member isnullin the tuples.- The thousands separator of
of_set_value_formatapplies 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 everythingof_get_layoutrecords. - In the demo version, Ctrl+C is refused like an export, and the grid says so.
- A handle kept after
of_remove_calc_fieldorof_remove_calc_measureis released (IsValid()returnsfalse). - Ctrl+C on cells copies the headers with the figures by default;
ib_copy_headers = falsecopies the figures alone. ue_cell_double_clickedreceivesai_measure, the position of the double-clicked value in Values (from 1), beforead_value: with the two tuples, it is the addressof_get_cell_valuereads back.of_export_csvandof_export_xlsxwith a relative path write in the folder the application started in, not in the current folder of the moment (which aDirListor a file dialog may have moved);ue_csv_saved/ue_xlsx_savedgive 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 modesis_show(percentage of the row, the column or the grand total, running total, difference) and conditional formattingis_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_errorfor a formula that does not compile. - Number formats (
of_set_value_format: decimals, thousands, currency symbol before or after) andis_currency_symbolfor 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 handlen_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_propertyandof_component_name: drive a property by its name (settings screen, saved configuration).