BDL 1.20 new features

Features added in 1.20 releases of the Genero Business Development Language.

Important: This page covers only those new features introduced with the Genero BDL version specified in the page title. Check prior new features pages if you migrate from an earlier version. Make sure to also read the upgrade guide corresponding to this Genero version.

Corresponding upgrade guide: BDL 1.20 upgrade guide.

Table 1. Core language
Overview Reference
Integrated debugger with gdb syntax to interface with graphical tools like ddd. See Integrated debugger.
The program profiler can be used to generate statistics of program execution, to find the bottlenecks in the source code. See Program profiler.

Internationalize your application in different languages with localized strings, by using the %"string" notation.

See Localized strings.
The TERMINATE REPORT and EXIT REPORT can be used in reports to respectively stop a report from outside of the REPORT routine, or stop the report from inside the REPORT routine. See TERMINATE REPORT, EXIT REPORT
The fgl_getversion() function returns the version number of the runtime system. See fgl_getversion().
Static arrays can be passed as parameters: all elements are expanded. See Static arrays.
New methods for StringBuffer class: base.StringBuffer.replaceAt() and base.StringBuffer.insertAt(). See The StringBuffer class.
Operators equal (= or ==) and not equal (<> or !=) now can be used with records: All record members will be compared. If two members are NULL the result of this member comparison results in TRUE. See RECORD.
New -W option for fglform to show warnings. See fglform.
LSTR() operator, to get a localized string by name. Useful when the localized string identifier is known at runtime only. See LSTR().
SFMT() operator, to format strings with parameter placeholders. Useful to localize application messages with parameters. See SFMT().
The base.StringTokenizer class can be used to parse strings for tokens. See The StringTokenizer class.
CONSTANT language elements can now be defined as GLOBALs. See Constants.
The base.Application class provides an interface to the program properties. See The Application class.
Review of the definition of base.Channel class, now based on objects. See The Channel class.
Table 2. User interface
Overview Reference
Interactive instructions support the UNBUFFERED mode, to synchronise data model and view automatically: When you set a variable, the value is automatically displayed to the field, and when the user fires and action, the field value is automatically assigned to the corresponding program variable. See The buffered and unbuffered modes.
DISPLAY ARRAY can now work in paged mode, to avoid loading a large array of rows, with the ON FILL BUFFER clause. See Paged mode of DISPLAY ARRAY.
Centralize default attributes for actions in ACTION DEFAULTS. See Configuring actions.
Client side settings can now be saved by application name, with a specific API. By default it is the name of the program. See ui.Interface.setName.
New attribute APPEND ROW = TRUE/FALSE attribute for the INPUT ARRAY instruction, to control the creation of the default append action. See INPUT ARRAY row modifications.
New attribute KEEP CURRENT ROW = TRUE/FALSE for the DISPLAY ARRAY and INPUT ARRAY instructions, to defines if the current row must remain highlighted when leaving the dialog. The default is FALSE. See Handling the current row.
You can now define a TOOLBAR in form specification files. See TOOLBAR section.
You can now define a TOPMENU in form specification files. See TOPMENU section.
The fgl_gethelp() function returns the help text for the given help number. See fgl_gethelp().
The fgl_set_arr_curr() function changes the current row in DISPLAY ARRAY or INPUT ARRAY. See Handling the current row.
Users can now send an interruption event to the program,to stop long running SQL queries, processing loops and reports. See User interruption handling.
The statusBarType window style attribute to define the statusbar layout. See Window style attributes: Miscellaneous.
The new FIELD ORDER FORM option can be used to follow the new TABINDEX attribute, to define the field tabbing order. FIELD ORDER FORM can also be used at the dialog level as dialog attribute. See Defining the tabbing order.
For COMBOBOX form items, a default ITEMS list is created by fglform when an INCLUDE attribute is used. See COMBOBOX item type.
The ON IDLE clause can be used to execute a block of instructions after a timeout. See Get program control if user is inactive.

New logical order of execution for INPUT ARRAY triggers:

See Editable record list (INPUT ARRAY).
New ui.ComboBox class to configure COMBOBOX fields at runtime. See The ComboBox class.

DISPLAY ARRAY and INPUT ARRAY instructions now automatically use two predefined actions nextrow and prevrow, which allow binding action views for navigation.

See Predefined actions.
ON CHANGE field trigger can be used to detect field modification. Useful for fields such as CHECKBOX and COMBOBOX. See Reacting to field value changes.
Program icon definition with ui.Interface.setImage(). See ui.Interface.setImage.
LABEL fields can now have a FORMAT attribute. See LABEL item type.
Front-end function calls allow to execut code on the front-end side with the ui.Interface.frontCall() method. See Front calls.
New ui.Form built-in class to handle forms. See The Form class.
New ON ROW CHANGE clause in INPUT ARRAY, executed when if at least one value in the row has been modified, and the user moves to another row or validates the dialog. The ON ROW CHANGE block is executed before the AFTER ROW block. See ON ROW CHANGE block.
MENU instruction now supports ON ACTION clause, to write abstract menus as simple action handlers. See Ring menus (MENU).
New 'help' predefined action, to start help viewer for HELP clauses in dialog instructions. See Predefined actions.
Table 3. SQL databases
Overview Reference
SQL Server driver now supports the TINYINT data type. See Numeric data types.

The fglcomp compiler supports now ANSI outer join syntax in SQL statements (LEFT OUTER JOIN), to replace the Informix specific OUTER() syntax.

FOREACH that raises an error no longer loops infinitely. See FOREACH (result set cursor).
New SQLSTATE and SQLERRMESSAGE registers, to give SQL execution information. See SQL error identification.