Back to Contents


New Features of the Language

See also: FAQ List.


Version 2.41

See also Upgrade Notes.

HTML5 style attributes

Attributes for Edit (dataTypeHint) and CheckBox (nativeLook) have been added. They are supported for applications displayed using GWC for HTML5.


Version 2.40

See also Upgrade Notes.

DISPLAY ARRAY list modification triggers

New ON INSERT, ON APPEND, ON UPDATE and ON DELETE interaction blocks are now allowed in DISPLAY ARRAY dialogs to implement list modification, as an alternative to the traditional INPUT ARRAY dialog. These new triggers simplify the programming of modifiable record lists.

Built-in find in DISPLAY ARRAY and INPUT ARRAY

The new find and findnext actions of DISPLAY ARRAY and INPUT ARRAY can be used by the user to search rows where a field value matches the value entered in the find dialog box. 

Built-in seek in DISPLAY ARRAY

The DISPLAY ARRAY dialog supports now built-in seek feature, to quickly find rows where a field value starts with the character typed by the user.

AGGREGATE fields for TABLE summary line

It is now possible to define a summary line for TABLEs by using AGGREGATE form fields. Values can be automatically computed or can be calculated and displayed by program.

See Aggregate Fields for more details.

The NVL() operator

The NVL() allows you to write the equivalent of an IF expr IS NOT NULL THEN RETURN expr ELSE RETURN default END IF statement in a single scalar expression. 

The IIF() operator

The IIF() allows you to write the equivalent of an IF bool-expr THEN RETURN true-value ELSE RETURN false-value END IF statement in a single scalar expression.

New database drivers

Genero 2.40 provides the following new database drivers :

New database server support:

New drivers for latest database engine versions:

SQL ... END SQL blocks

The fglcomp compiler now supports SQL ... END SQL blocks for compliance with IBM Informix 4GL.

SELECT projection clause options FIRST, LIMIT, SKIP, MIDDLE

The Static SQL syntax has been extended to allow the FIRST, LIMIT, SKIP and MIDDLE SELECT projection clause options. These new IDS SELECT options can be used to return a subset of the complete result set. This can for example be used to replace a scroll cursor in a paged DISPLAY ARRAY. Note that the offset and row count parameters of these options can be SQL parameters (i.e. program variables), thus you can prepare such SELECT statement for subsequent execution with different offset and row count values.

CASE expressions in SQL statements

The CASE operator is now allowed in Static SQL statements. The syntax of this operator is portable and can be used with most database engines.

IF EXISTS and IF NOT EXISTS clauses in SQL DDL statements

The syntax of DDL (Data Definition Language) statements in Static SQL now allows the IF NOT EXISTS and IF EXISTS clauses. These IDS clauses can respectively be used in CREATE and DROP statements, to avoid SQL errors if the database object exists already (CREATE) or does not exist (DROP). 

Transaction Savepoints

The transaction instruction set has been completed with SAVEPOINT and ROLLBACK WORK TO SAVEPOINT. Note that most database servers support now transaction savepoints, however you should pay attention with some minor differences.

Control shadow column extraction with fgldbsch

Starting with IBM Informix IDS version 11.50.xC1, you can create shadow columns on tables, which must not be extracted by the fgldbsch tool.
You must use the -sc option to force the extraction of shadow columns.

Control ORACLE DATE fetch into CHAR/VARCHAR variables

By default ORACLE DATE values are fetched into CHAR/VARCHAR with time information and are formatted with the ISO style (YYYY-MM-DD hh:mm:ss), but some legacy code can expect to get a DBDATE formatted date in the target variable. A new FGLPROFILE entry parameter has been added to control this conversion:

dbi.database.<dbname>.ora.date.ifxfetch = true/false

You can set this parameter to true, if you need to get the INFORMIX behavior, to fetch DATEs only with the YMD part following the DBDATE environment variable. Note that if you use DATE or DATETIME variables to hold ORACLE DATE values, there is no reason to set this parameter.

See the ORACLE ODI Guide for more details.

Short-circuit evaluation option

A new global program option has been added, OPTIONS SHORT CIRCUIT, to instruct the runtime system to evaluate Boolean expressions by using the short-circuit evaluation (also called minimal evaluation) method. This feature can improve performances and simplify programming.

Support for terminfo capability database

In prior versions, Genero runtime system supported termcap only. If your UNIX operating system has the ncurses library installed, you can set the INFORMIXTERM environment variable to the value terminfo and use the terminfo database for text terminal mode (FGLGUI=0).

See Configuring your text terminal for more details.

Support for the ROWVERSION data type of SQL Server (2008 and +)

With Genero 2.40 you can now use columns defined with the ROWVERSION data type. Note however that in SQL Server 2005, the CONVERT() function does not properly transform the hexadecimal string to a binary value. Therefore, you should only use ROWVERSION starting with SQL Server 2008.


Version 2.32

See also Upgrade Notes.

In this Genero BDL version does not include new features. The development team focused on stability and defects correction.


Version 2.30

See also Upgrade Notes.

Drag & Drop

The major new feature of Genero BDL 2.30 is the ability to implement Drag & Drop in DISPLAY ARRAY for tables or treeviews.

The WEB Component

A new form item type called WEBCOMPONENT is provided to integrate external Java-Script-based widgets in your forms.

New database drivers

Genero 2.30 provides the following new database drivers for latest database engine versions:

Support for Mac OS/X platform

Genero BDL is now available on Mac OS/X. You need at least Mac OS/X version 10.5.
The Operating System code for Mac OS/X 10.5 64b is m64x105.

Command line tools display platform identifier with -V option

When using the -V option to display version information with FGL command-line tools, you get now also the platform identifier:

$ fglrun -V
...
Target lnxlc23
...

The "Target" line helps to identify the operating system the binary was compiled for. This information can be useful on systems where you can mix 32b and 64b binaries. 

Oracle BINARY_FLOAT / BINARY_DOUBLE

Informix SMALLFLOAT and FLOAT can now be stored in Oracle native BINARY_FLOAT / BINARY_DOUBLE types.
See Oracle Adaptation Guide for more details.

Multiple configuration file specification with FGLPROFILE

The FGLPROFILE environment variable now accepts multiple file specification with an operating-system-specific path separator:

FGLPROFILE="/opt/app/etc/license.prf:/opt/app/etc/gui.prf:myprofile.prf"

Show a specific field of a form

A new method was added to the ui.Form built-in class, to make a specific form field visible, showing the parent containers automatically.
This method can also be used to bring a given folder page to the front, even if the field is not active (i.e. not driven by a dialog).

STYLE attribute for ERROR and MESSAGE instructions

The ERROR and MESSAGE instructions get an additional STYLE attribute, to reference a presentation style and define the rendering with font, color, and position. 

STYLE attribute for TOOLBAR and TOPMENU elements

You can now define a style for TOOLBAR and TOPMENU elements. See Front-End documentation for more details about possible decoration attributes.

RADIOGROUP items are filled with INCLUDE list

As with COMBOBOX, the items of a RADIOGROUP are now filled with the values of the INCLUDE attribute, if specified.

CSV (Comma Separated Value) format for LOAD/UNLOAD/Channel

The LOAD/UNLOAD SQL instructions and the base.Channel class now support the "CSV" delimiter specification to read/write files in Comma Separated Value format.

Identifying the last clicked canvas item

Before version 2.30, the only way to identify what CANVAS item was clicked was to bind a specific function key to the item, from F1 to F255. You can now identify the last clicked item with the drawGetClickedItemId() function of fgldraw.4gl.

Checking the touched flag of all fields used by the dialog

The FIELD_TOUCHED() operator and ui.Dialog.getFieldTouched() method accept now a simple star as parameter, in order to check all fields used by the dialog.

Getting the type of the current database driver

In order to identify the target database type, you can use the fgl_db_driver_type() built-in function. This function returns the 3-letter code of the database driver (ifx, ora, ads, db2, ...). See also the db_get_database_type() function in FGLDIR/src/fgldbutil.4gl, this function maps the driver type to a database code.

Table column header alignment

The JUSTIFY attribute is now supported for all form item types, in order to let you specify both the data justification in the field/cell and the alignment of the table column header. 

FGLSQLDEBUG displays shared object load error

In order to identify the reason why a database driver cannot be loaded, when setting FGLSQLDEBUG you now get an additional debug message that contains the operating system error message (dlerror())

Schema extractor supports now SQLite

With 2.30 the fgldbsch tool can now extract database schema from SQLite. However, pay attention to the data types used in SQLite (V 3.6): This database supports some standard type names in the SQL syntax but in reality the types used to store data are very limited. For example, a DATE will be stored as an integer or string (i.e. there is no native DATE type). See SQLite documentation for more details.

The fgldbsch tool will extract the schema according to the original type names used to create the table.

DIALOG.setFieldActive accepts now a list of fields

The ui.Dialog.setFieldActive() method is now accepting a list of fields as parameter, with the "dot-asterisk" notation, like the setFieldTouched() method:

   CALL DIALOG.setFieldActive("customner.*", FALSE)
   CALL DIALOG.setFieldActive("customner.cust_name", TRUE)

Warning: If all fields of the dialog are disabled, the dialog stops.

New DIALOG methods to manipulate trees

This new feature is part of the fix for bug #18224.

When modifying a tree during the dialog execution (for example, when implementing dynamic trees with ON EXPAND / ON COLLAPSE triggers), if you use the ui.Dialog.insertRow(), ui.Dialog.deleteRow() or ui.Dialog.deleteAllRows() methods to modify the node list, the internal tree structure was corrupted. You could safely modify directly the program array with array methods, but multi-range selection flags and cell attributes are not synchronized when doing this. Starting with 2.30.02, you can now use the ui.Dialog.insertNode(), ui.Dialog.appendNode() and ui.Dialog.deleteNode() methods to manipulate the node list and get secondary data information synchronized.

New FGLPROFILE entry fglrun.arrayIgnoreRangeError

Version 2.30.04 re-enables the fglrun.arrayIgnoreRangeError FGLPROFILE entry which was supported by Four Js BDS. This entry can be set to true to force the runtime system to return the first element of an array when the array index is out of bounds. See Arrays for more details.

New FGLPROFILE entry fglrun.mapAnyErrorToError

The version 2.30.04 introduces the new fglrun.mapAnyErrorToError FGLPROFILE entry. This configuration parameter can be set to true to map the default action of the WHENEVER ANY ERROR exceptions to the action defined for the WHENEVER ERROR exception type. See Exceptions for more details.


Version 2.21

Modules

The major new feature of Genero BDL 2.21 is the support of the 42m module specification with the IMPORT instruction.

Please refer to the following links for more details:

SPINEDIT gets VALUEMIN, VALUEMAX

The SPINEDIT widget gets two new attributes to define the range of possible values: VALUEMIN, VALUEMAX.

New database drivers

The following database drivers are supported by Genero version 2.21:

New Genero db 3.81 driver

A new driver for Genero db 3.81 is available in version 2.21; the name is dbmads381. This driver no longer scans SQL text for translation, as most common Informix syntax is now supported in Genero db 3.81 when using COMPATIBILITY_MODE=INFORMIX. Skipping the SQL text scanning will improve the performance of your programs.

For more details, see the ODI Adaptation Guide.

This driver is also back-ported in 2.20 versions (starting with 2.20.07).

New EasySoft driver to connect from Unix to SQL Server

Version 2.21.00 introduces a new set of database drivers based on the EasySoft SQL Server ODBC client. See the ODI Adaptation Guide for SQL Server for more details about configuration settings.

This driver is also back-ported in 2.20 versions (starting with 2.20.08).

New PostgreSQL 8.4 driver with INTERVAL support

Version 2.21.00 provides PostgreSQL 8.4 support with the new dbmpgs84x driver. This driver converts Informix-style INTERVALs to native PostgreSQL INTERVALs. See the ODI Adaptation Guide for more details.

This driver is also back-ported in 2.20 versions (starting with 2.20.07).

New presentation styles

The following new style attributes were added in version 2.21:

Numeric keypad decimal separator

With Genero 2.21, the decimal separator key of the numeric keypad does not follow the application settings for numeric data formatting defined by DBMONEY or DBFORMAT. The decimal separator defined by one of these environment variables will be used when pressing the dot key of the numeric keypad.

Automatic display of BYTE images

Image data contained in a BYTE variable can now be displayed automatically by Genero when using a simple DISPLAY BY NAME, DISPLAY TO or when the BYTE variable is used by a dialog instruction. See the ImageList demo, for example, in FGLDIR/demo/Widgets.

Note that the BYTE data must be located in a file (LOCATE IN FILE "path") or temp file (LOCATE IN FILE)

For more details about image fields, see IMAGE field types.

Paged DISPLAY ARRAY supports undefined initial row count

Before 2.21, when using a Paged DISPLAY ARRAY, it was mandatory to provide the total number of rows in the result set, which required a SELECT COUNT(*) before executing the dialog instruction. The dialog now supports an undefined number of rows, with value -1 in the COUNT dialog attribute.

For more details, see Paged DISPLAY ARRAY.

Static SQL column definition supports DEFAULT clause

Starting with 2.21 the syntax of the CREATE TABLE and ALTER TABLE Static SQL statements allows the DEFAULT clause in column definitions.

CREATE TABLE item ( num SERIAL, name VARCHAR(50) DEFAULT '<undefined>' NOT NULL )

PostgreSQL supports TEXT/BYTE

With 2.21 it is now possible to use TEXT/BYTE data with PostgreSQL with the dbmpgs drivers.

Define the initial size of the MDI container

Genero BDL 2.21 provides a new ui.Interface method to let you define the initial size of the MDI container window:

CALL ui.Interface.setSize( "600px", "1000px" )

New INSERT syntax to avoid SERIAL column usage

Version 2.21 supports a new Static SQL syntax for the INSERT statement, which removes the record member defined as SERIAL, SERIAL8 or BIGSERIAL in the schema file:

SCHEMA mydb
DEFINE record RECORD LIKE table.*
...
INSERT INTO table VALUES record.*

For more details, see Static SQL.

Support for C1 Ming Guo date format modifier

You can enable the digit-based Ming Guo date format by adding the C1 modifier at the end of the value set for the DBDATE environment variable:

$ DBDATE="Y3MD/C1"
$ export DBDATE

Notes:

For more details, see Ming Guo date format.

New SQL debug message when LOAD fails with error -846

The LOAD statement can fail with error -846 when the input file has a corrupted line (missing or invalid field separator, invalid character set, UNIX/DOS line terminators). Before 2.21.00, you had to check every line of the input file to find the problem. With this new version you can now easily find the invalid line by setting the FGLSQLDEBUG environment variable. The runtime system will display such debug messages with the line number:

| DBI: LOAD: Corrupted data file, check line #12345.

ODBC Character type control with SNC driver

Starting with version 2.21.02, you can instruct the SNC driver to use simple char or wide-char character strings for ODBC, with the following FGLPROFILE entry:

dbi.database.<dbname>.snc.widechar = true/false

See ODI Adaptation Guide for SQL Server for more details.

New Presentation Style attribute for Windows: formScroll

The formScroll Presentation Style attribute can be set for Windows to control scrollbars display when the Window is larger as the screen.


Version 2.20

See also Upgrade Notes.

The Java Interface

The major new feature of Genero BDL 2.20 is the Java Interface. This allows you to instantiate and use Java classes from FGL.

Tree-view containers

Genero BDL 2.20 introduces typical Tree-View widgets with the new TREE container.
See Tree Views for more details.

The traditional user interface mode

To simplify migration from Informix 4GL or Four Js BDS, you can now run applications in traditional mode to render windows as simple boxes, as in the WTK front-end. For more details, see Traditional GUI mode. See also the new I4GL migration guide and BDS migration guide

Phantom fields

Genero BDL 2.20 introduces a new sort of form field with the PHANTOM keyword. Phantom fields are used to define the screen-record or screen-array, but are not used in the LAYOUT section of the form. Phantom fields are especially useful when implementing a TREE container.
See Phantom Fields for more details.

Multi-row selection in lists

DISPLAY ARRAY can now handle multi-row selection.

New built-in data types

Version 2.20 introduces three new built-in data types:

Built-in sort works in INPUT ARRAY

Before version 2.20, built-in sort was only available in DISPLAY ARRAY. Now the rows can be sorted during an INPUT ARRAY.

New database drivers

The following database drivers are supported by Genero version 2.20:

New contextMenu action default attribute

A new Action Defaults attribute named "contextMenu" has been added to allow you to specify whether the menu option is visible in the default context menu. The default value is "yes" - the option is visible whenever the action is visible.

Private functions

It is now possible to hide a function (or report) to the other modules with the new PRIVATE keyword.

Automatic source documentation generator

The fglcomp compiler has been extended with a new --build-doc option for generating 4gl source documentation.

MAN pages for Genero BDL commands

On UNIX platforms, you can now use man pages for Genero BDL tools like fglcomp and fglform:

$ man fglcomp

Note that on some platforms, you must set the MANPATH environment variable to $FGLDIR/man.

New Presentation styles

Presentation Styles have been extended:

New Front-End Calls

Frond-End Functions have been extended:

MySQL Driver supports TEXT/BYTE

It is now possible to use TEXT/BYTE data with MySQL with the dbmmys drivers.

Adding a timestamp to 42m modules

fglcomp has a new option (fglcomp --timestamp) to write the compilation timestamp to the generated 42m p-code module. If present, the timestamp will be printed when using fglrun -b. Use compilation timestamps only if really needed; every new compiled .42m module will be different, even if the source code has not changed.

Disabling Front-End protocol compression

Front-End protocol compression can now be disabled with a new FGLPROFILE entry. This is especially useful in fast networks to save processor time. See Front-End Protocol for more details.

New environment variable for program resource files

To work around conflicts with the Informix database path specification in DBPATH, you can now use the FGLRESOURCEPATH environment variable to specify search paths for program resource files like forms.

New built-in functions to handle text selection

New built-in functions are now available to control the part of the text that is selected in the current field:

FGL_DIALOG_GETSELECTIONEND()
FGL_DIALOG_SETSELECTION()

New IMAGE attribute in form LAYOUT element

The LAYOUT element of a form definition can now use the IMAGE attribute to define the icon to be used for the parent Window. This is especially useful in a Container-based application, to distinguish child programs inside the container.

INFIELD clause in ON ACTION interactive block

The ON ACTION interactive block has been extended with a new INFIELD field-name clause, to automatically enable/disable the action when entering/leaving the specified field.

New high-precision math functions for DECIMALs

Following built-in functions have been added for precision math computing with DECIMALs:

Database user authentication callback function

When using the DATABASE instruction, you can now define an FGLPROFILE entry specifying a callback function which returns a username and password to be used for the database connection.

Getting the current active dialog

A new class method is now available to get the current active dialog: ui.Dialog.getCurrent().

SAX Document Handler specification in START REPORT

The START REPORT instruction now supports a new clause to specify the XML SAX Document Handler to process XML output with the TO XML HANDLER syntax.

Automatic Code Completion with VIM

If you have vim 7 installed, you can now use .per and .4gl code completion within your preferred editor. 

Report definition file generation

With fglcomp 2.20 you can use the --build-rdd option to generate a data definition file (.rdd)

Improved FGLSQLDEBUG output

When setting the FGLSQLDEBUG environment variable, you get now the SQL command header with SQL command name and 4GL source/line information before executing the underlying ODI driver code. If the driver code crashes or stops the process with an assertion, you can easily identify the last SQL instruction that was executed. Before version 2.20, SQL debug output was printed after the execution of the ODI driver code. If the ODI driver encountered a problem, you could not find what SQL instruction was the reason for the crash.


Version 2.11

New database drivers

The following database drivers are supported by Genero version 2.11:

Static SQL syntax extension

Derived tables and derived column list

Genero BDL static SQL syntax now supports derived tables and derived column lists in the FROM clause, for example:

   SELECT * FROM (SELECT * FROM customers ORDER BY cust_num) AS t(c1,c2,c3,...)

See database server documentation for more details about this SQL feature. Note that Informix 11 does not support the full ANSI SQL 92 specification for derived columns, while other databases like DB2 do. For this reason, fglcomp allows the ANSI standard syntax.

New transaction isolation levels of Informix 11

The SET ISOLATION statement now supports the new Informix 11 clauses for the COMMITTED READ option:

   SET ISOLATION TO COMMITTED READ [LAST COMMITTED] [RETAIN UPDATE LOCKS]

When connecting to a non-Informix database, the LAST COMMITTED and RETAIN UPDATE LOCKS are ignored; other databases do not support these options, and have the same behavior as when these options are used with Informix 11.

The CAST operator

The CAST operator can now be used in static SQL statements:

   CAST ( expression AS sql-data-type ) 

Note that only Informix data types are supported after the AS keyword.

New preprocessor option to remove line number information

You can now remove line number information with -p noln when preprocessing sources to get a readable output:

   fglcomp -E -p noln mymodule.4gl

Connecting to Oracle as SYSDBA or SYSOPER

In order to execute database administration tasks, you can now connect to Oracle as SYSDBA or SYSOPER with the CONNECT instruction:

   CONNECT TO "dbname" USER "scott/SYSDBA" USING "tiger"

New methods for ui.ComboBox

The ui.ComboBox class has been extended with new methods: getTextOf() and getIndexOf().

Make current row visible after sort in lists

A new FGLPROFILE entry has been added to force the current row to be shown automatically after a sort in a table:

   Dialog.currentRowVisibleAfterSort = 1

By default, the offset does not change and the current row may disappear from the window. When this new parameter is used, the current row will always be visible. For more details, see Runtime Configuration.

Reading pcode build information of older versions

The -b option of fglrun has been extended to recognize headers of pcode modules compiled with older versions of FGL. For more details, see Compiling Programs. Additionally, fglform now writes build information in the 42f files, to identify on the production site what Genero BDL version was used to compile forms.


Version 2.10

See also Upgrade Notes.

Multiple Dialogs

A new DIALOG instruction handles different parts of a form simultaneously.  See also ui.Dialog class.

TRY/CATCH pseudo statement

The TRY/CATCH pseudo statement can handle exceptions raised by the runtime system.

WHENEVER .... RAISE

Instructs the DVM that an uncaught exception will be handled by the caller of the function. See Exceptions.

SQL Server Native Client driver

Support for SQL Server 2005 Native Client is now provided.

Support for SPLITTER attribute

HBox and VBox containers can now have a splitter.  See also Layout Tags.

Double-click in tables

With the new DOUBLECLICK table attribute, it is now possible to send a specific action when the user double-clicks on a row.

New X conversion code in fgldbsch

The fgldbsch tool now supports the X conversion code to ignore table columns of a specific type. This is useful for ROWID-like columns such as SQL Server's uniqueidentifier columns.

SQL Interruption in database drivers

Before version 2.10, SQL interruption was not supported well for Oracle, SQL Server, DB2 and Genero db databases. SQL interruption is now available with all databases providing an API to cancel a long-running query.

For more details, see SQL Programming.

NULL pointer exceptions can be trapped

Error -8083 will be raised if you try to call an object method with a variable that does not reference an object (that contains NULL):

DEFINE x ui.Dialog
-- x is NULL
CALL x.setFieldActive("fieldname",FALSE)  -- raises -8083

In previous versions, this raised a fatal NULL pointer error. This exception can now be trapped with  WHENEVER ERROR.

Client socket interface in Channels

The Channel class now provides a method to establish a client socket connection to a server, with the new openClientSocket() method.

Stack trace

For debugging purpose, you can now get the stack trace of the program with the Application.getStackTrace() method.

GUI Connection Timeout

It is now possible to define a timeout delay for front-end connections with the following FGLPROFILE entry:

gui.connection.timeout = seconds

See Dynamic User Interface for more details.

Assigning a value to a TEXT variable 

Before version 2.10, it was only possible to assign a TEXT to a TEXT variable. Now you can assign STRING, CHAR and VARCHAR values to a TEXT variable. For more details about data type conversions, see the Data Conversion Table.

New Presentation styles

Presentation Styles have been extended:

fglrun -s option now displays more information

The -s option of fglrun now reports more information about sizes. See Optimization for more details.

fglrun -e option takes list of extensions

The fglrun -e option now supports a comma-separated list of extensions, and -e can be specified multiple times:

fglrun -e ext1,ext2,ext3 -e ext4,ext5 myprogram

See C Extensions for more details.

Detecting data changes immediately

It is now possible to get an action event when the user modifies the value of a field, with the predefined dialogtouched action.

Controlling data validation for actions

You can now use the validate="no" action default attribute to prevent data validation when executing an action.

New MINWIDTH, MINHEIGHT attributes in forms

It is now possible to define a minimum width and height for forms with the MINWIDTH, MINHEIGHT attributes.

Avoid automatic temporary row in INPUT ARRAY

With the new AUTO APPEND attribute, you can now avoid the automatic creation of a temporary row in INPUT ARRAY.

New DOM methods to serialize or parse strings

The parse() and toString() methods are now available for a DomNode object, and a DomDocument object can be created with createFromString().

New I/O methods to read/write TEXT or BYTE from/to files

The TEXT and BYTE data types now support the methods readFile(fileName) and writeFile(fileName). 

Back to the top


Version 2.02

New Static SQL Commands

Some common SQL statements have been added to the static SQL syntax, such as TRUNCATE TABLE, RENAME INDEX, CREATE / ALTER / DROP / RENAME SEQUENCE. See Static SQL Commands.

Global Variables in C Extensions

You can now share global variables between the Genero BDL source and the C Extension, by using the -G option of fglcomp. See Global variables in C Extensions.

Localization of runtime system error messages

It is now possible to customize the runtime system error messages according to the current locale. See Localization for more details.

Debugger enhancement

New debugger commands (ptype).

You can now avoid switching into debug mode with SIGTRAP (Unix) or CTRL-Break (Windows) with the new fglrun.ignoreDebuggerEvent FGLPROFILE entry.

Tab index can be zero

You can now specify a TABINDEX of zero to exclude the form item from the tagging list. See TABINDEX for more details.

New FGLPROFILE entry for Oracle driver

It is now possible to specify the SELECT statement producing the unique session identifier which is used for temporary table names.
See Database vendor specific parameters for more details.

New FGLPROFILE entry to define temporary table emulation type

To emulate Informix temporary tables, you can now set the temptables.emulation parameter to use GLOBAL TEMPORARY TABLES instead of permanent tables.
See temporary table emulation for more details.

Back to the top


Version 2.01

FESQLC compiler (V2)

ESQL/C Compiler.

Warning: Since version 2.32, fesqlc is no longer part of Genero BDL package and is shipped as a separate product.

DB2 V9.x support

Support of DB2 V9.x. See DB2 V9.x support.

PostgreSQL V 8.2.x support

Support of PostgreSQL 8.2.x. See PostgreSQL V 8.2.x support.

Extension of the form layout tag syntax

The layout tag syntax in grids has been extended to support an ending tag to get better control of form layout.

Negative form of warning flags in fglcomp

The fglcomp compiler now supports a negative form for warning arguments.

Run supports ComSpec variable on Windows

When using the RUN command, the ComSpec environment variable is now used under Windows platforms.

Back to the top


Version 2.00

See also Upgrade Notes.

Dynamic Runner Architecture

Runner now uses shared libraries; you no longer need to link a runner. See Dynamic Runner Architecture.

User defined types

You can now define your own data type with records or arrays. See User defined types.

New Widgets

New widgets have been added: SLIDER, SPINEDIT, TIMEEDIT.

Extended Schema Files

Database Schema files have been extended for Genero (FIELD item type). See Extended Schema Files.

File Management Functions

File management function library provided as loadable extension. See File Management Functions.

Math Functions

Mathematical function library provided as loadable extension. See Math Functions.

Stored procedure calls

It is now possible to call stored procedures with output parameters. See Stored procedure calls.

Informix-like C API library

C extension support has been extended with Informix-like C API functions. See Informix-like C API library.

Memory usage optimization

The runtime system now shares several static elements among all processes, reducing the memory usage. The shared elements are: Data type definitions, string constants and debug information. For example, when a program defines a string containing a long SQL statement, all Genero processes will share the same string, which is allocated only once.

The IMPORT instruction

To declare a C extension module, you must now use the IMPORT instruction at the beginning of a module.

WIDTH and HEIGHT attributes in Images

You can now specify the WIDTH and HEIGHT attributes for IMAGE form items, as a replacement for PIXELWIDTH / PIXELHEIGHT.

New debugger commands

New commands have been added to the debugger (call, ignore).

Improved Presentation Styles

You can now specify pseudo selectors such as focus, active, inactive, input, display for fields and odd / even states for table rows.

Some new style attributes were added:

For more details, see Presentation Styles.

Compiler supports constraints in CREATE TABLE

It is now possible to specify primary key, foreign key and check constraints in static CREATE TABLE statements:

  CREATE TABLE t1 (
     col1 INTEGER PRIMARY KEY,
     col2 CHAR(2),
     col3 DATE,
     FOREIGN KEY (col2) REFERENCES t2(col1)
  )

Automatic front-end startup

In X11 or Windows TSE environments, you can now automatically start up the front-end with FGLPROFILE entries. See Dynamic User Interface for more details.

New channel function to detect EOF

The Channel class now has an isEof() method to detect end of file.

Responding to CTRL_LOGOFF_EVENT on Windows

It is now possible to ignore the CTRL_LOGOFF_EVENT events on Windows platforms.

New compiler warning options

The fglcomp compiler has new warning flags: See fglcomp for more details.

Fourth accelerator definition

You can now define a fourth accelerator for an action in actions defaults or in the form files.

Conditional TTY attributes for all widgets

It is now possible to specify TTY attributes (COLOR, REVERSE) and conditional TTY attributes (COLOR WHERE) for all type of fields.
See Form Specification Files and COLOR WHERE attribute for more details.

New FGL_SETENV() built-in function

A new built-in function has been added to set an environment variable: FGL_SETENV().

Support for entities in XML reader and writer

The XML reader and writer classes have been extended to properly support markup language entities (like HTML's &nbsp; ).

Schema extractor supports now Informix LVARCHAR

The fgldbsch tool can now extract database tables with LVARCHAR columns. The LVARCHAR type is converted to VARCHAR2(n>255) in the .sch file.

Back to the top


Version 1.33

TypeInfo class

A class to serialize program variables. See TypeInfo class.

Generic ODBC support

A generic ODBC database driver is now available (code is odc). See Generic ODBC support.

MySQL 5 support

MySQL version 5 is now supported. See MySQL 5. support.

Genero db 3.4 support

Genero db version 3.4 is now supported. See Genero db support.

PostgreSQL 8.1 support

PostgreSQL version 8.1 is now supported. See PostgreSQL 8.1 support.

SQL Server 2005 support

Microsoft SQL Server 2005 is now supported. See SQL Server 2005 support.

New license manager

New license manager supporting strict licensing. See New license manager.

FESQLC compiler (V1)

ESQL/C compiler.

Binary mode in Channel class

The base.Channel class now supports a binary mode with the 'b' option, to control CR/LF translation when using DOS files.

New header files for C extensions

Distribution of Datetime.h, Interval.h, loc_t.h header files in FGLDIR/include/f2c.

Block fetch with SQL Server

You can now pre-fetch rows by block with SQL Server to get better performance. Use the following FGLPROFILE entry to specify the maximum number of rows the driver can pre-fetch:

dbi.database.<dbname>.msv.prefetch.rows = <count>

See "Database vendor specific parameters" in Connections for more details.

Third accelerator definition

You can now define a third accelerator for an action in actions defaults or in the form files.

Back to the top


Version 1.32

PostgreSQL 8.0 support

PostgreSQL version 8.0 is now supported (8.0.2 and higher). See PostgreSQL 8.0 support.

File transfer functions

Get/Put functions to transfer files from/to the front-end. See File transfer functions.

Debugger enhancement

New debugger commands (watch with condition, whatis).

Preprocessor is now integrated in compilers

The preprocessor is now part of the compilers and is always enabled. Preprocessing directives start with an ampersand character (&).

Back to the top


Version 1.31

Front-end Protocol Compression

Faster user interface communication. See Front-end Protocol Compression.

MySQL 4.1.x support

MySQL version 4.1.x is now supported, 3.23 is de-supported. See MySQL 4.1.x support.

Oracle 10g support

Oracle version 10g is now supported. See Oracle 10g support.

Dynamic C extensions

C extensions can be loaded dynamically, no need to re-link runner. See Dynamic C extensions.

New built-in functions

The FGL_WIDTH built-in function computes the number of print columns needed to represent a single or multi-byte character.

Interruption handling

Interruption handling with SSH port forwarding - only supported with GDC 1.31!

New Dialog method

New method ui.Form.setFieldStyle() to set a style for a field.

Front-end identification

Improved front-end identification when connecting to GUI client.

Back to the top


Version 1.30

See also Upgrade Notes.

Preprocessor

Integrated preprocessor allows use of #include and #define/#ifdef macros. See Preprocessor.

Layout Enhancements

New layout rules and form item attributes provide better control of form design. See Layout Enhancements.

Presentation Styles

Decoration attribute can be defined in a style file to set fonts and colors. See Presentation Styles.

Localization Support

Localization Support (multi-byte character sets). See Localization Support.

Action defaults in forms

Action defaults can be specified in forms. See Action defaults in forms.

Dialog Control

Dialog built-in class to provide better control over interactive instructions. See Dialog Control.

Sybase ASA Support

New drivers to connect to Sybase Adaptive Server Anywhere V7 and V8. 

PostgreSQL 7.4 support

Support for PostgreSQL 7.4 with parameterized queries. See PostgreSQL 7.4 support.

Build information in 42m modules

The fglcomp compiler now adds build information in 42m modules. Compiler version of a 42m module can be checked on site by using the fglrun with the -b option:

$ fglrun -b module.42m
2004-05-17 10:42:05 1.30.2a-620.10 /devel/tests/module.4gl

MySQL 3.23 support for Windows platforms

A MySQL 3.23 driver is now provided for Windows platforms (was previously only provided on Linux).

Upshift/Downshift in Comboboxes

COMBOBOX fields now support UPSHIFT and DOWNSHIFT attributes, to force character case when QUERYEDITABLE is used.

Message compiler does not require output file any longer

The fglmkmsg tool now has the same behavior as other tools like fglcomp and fglform: If you give only the source file, the message compiler uses the same file name for the compiled output file, adding the .iem extension.

Breakpoint in source code

New BREAKPOINT instruction to stop a program at a given position when using the debugger. It is ignored when not running in debug mode.

Row highlighting in tables

New TABLE presentation style attribute highlightCurrentRow, to indicate if the current row must be highlighted in a specific mode. By default, the current row is highlighted during a DISPLAY ARRAY.

Method base.Array.appendElement()

New method base.Array.appendElement(), to append an element at the end of a dynamic array.

Compiled Localized String file extension = 42s

Compiled Localized String files now have the .42s extension. Previous extension was .4ls.

Assignment Operator

New assignment operator := has been added to the language. You can now assign variables in expressions:
IF ( i := (j+1) ) == 2 THEN

New fglcomp option for SQL

The fglcomp compiler now has a new option to detect non-standard SQL syntax:
fglcomp -W stdsql module.4gl

Compiler generates standard UPDATE syntax

The fglcomp compiler now converts static SQL updates like:

UPDATE tab SET (c1,c2)=(v1,c2) ...

to a standard syntax:

UPDATE tab SET c1=v1, c2=v2 ...

See also SQL Programming.

Defining color attributes for each table cell

The new method ui.Dialog.SetCellAttributes() lets you define colors for each cell of a table.

Form methods in ui.Window 

The ui.Window class provides new methods to create or get a form object.

Method base.StringBuffer.replace()

New method base.StringBuffer.replace(), to replace a sub-string in a string:

CALL s.replace("old","new",2)
Replaces two occurrences of "old" with "new"...

Methods base.Channel.readLine() and base.Channel.writeLine()

New methods to read/write complete lines in Channel built-in class: readLine() and writeLine().

Dynamic arrays used as data model in INPUT ARRAY / DISPLAY ARRAY

When using a dynamic array in INPUT ARRAY or DISPLAY ARRAY, the number of rows is defined by the size of the dynamic array. The SET_COUNT() or COUNT attributes are ignored.

TITLE attribute for fields

The new form field attribute TITLE can be used to specify a table column label with a localized string.

FGLLDPATH used during link

The FGLLDPATH variable is now used during link

Method ui.Dialog.setDefaultUnbuffered()

New class method ui.Dialog.setDefaultUnbuffered() to set the default for the UNBUFFERED mode.

Action Defaults applied by DVM

Action Defaults now applied at element creation by the runtime system. In previous versions this was done dynamically by the front-end. Now, changing an action default node at runtime has no effect on existing elements.

DATEEDIT supports DBDATE & FORMAT

The DATEEDIT field type now supports DBDATE/CENTURY settings and the FORMAT attribute.

New predefined action 'close'

New default action 'close' to control Window closing. You can now write the following to control window closing:

  ON ACTION close
See Windows and Forms.

Tabbing order in TABLEs during INPUT ARRAY

INPUT ARRAY using TABLE container now needs FIELD ORDER FORM attribute to keep tabbing order consistent with visual order of columns.

ACCEPT xx instruction

New instructions ACCEPT INPUT / ACCEPT CONSTRUCT / ACCEPT DISPLAY to validate a dialog by program.

ON ACTION doit
   ACCEPT INPUT

ACCEPT / CANCEL dialog attribute

New dialog attribute ACCEPT / CANCEL to avoid creation of default actions 'accept' and 'cancel'.
See Record Input control instructions.

INPUT ARRAY now has default 'append' action

New default action 'append' in INPUT ARRAY. Allows you to add a row at the end of the list.

Linker option -O removed

The linker option -O (optimize) is de-supported (was ignored before). You now get a warning if you use this option.

Method ui.Window.createForm()

New method ui.Window.createForm() to create an empty form object in order to build forms from scratch at runtime.

TopMenu attributes in .per

TopMenu definition in forms now allows attributes in parenthesis.

Specifying real field size in forms

The form layout syntax now allows you to specify the real width of form items. By default, BUTTONEDIT, COMBOBOX and DATEEDIT get a real width as follows:

  if nbchars>2 : width = nbchars - 2; otherwise width = nbchars
(Here nbchars is the number of characters used in the layout definition.)

Now you can specify the real width by using a dash '-' in the tag:

 1234567
[f01  - ]      width = 5, grid cells used = 7

This works also in hbox tags and screen arrays.

Version number in UI protocol

User interface protocol is now controlled with a version number, to check compatibility between the front end and runtime system.

MENU node available in BEFORE MENU

Important remark: Before build 530 the MENU has attached the WINDOW when returning from the BEFORE MENU actions. Since build 530 the WINDOW must exist before the MENU statement. So now the MENU node is available in the BEFORE MENU block, but a WINDOW opened or made CURRENT in the BEFORE MENU block will NOT be used.

New HBox tags

Layout GRID now accepts HBox tags to group items horizontally.

Form layout extensions

New Table definition attributes

New ORIENTATION attribute for RADIOGROUPs

RADIOGROUP fields now support the attribute ORIENTATION = { VERTICAL | HORIZONTAL }.

Reviewed fglrun.setenv environment variables handling in FGLPROFILE

Now, on Windows platforms only, the ix drivers automatically set standard Informix environment variables with ifx_putenv(). Values are taken from the console environment with getenv(). Additional variables can be specified with:

dbi.stdifx.environment.count = n
dbi.stdifx.environment.xx = "variable"

MENU COMMAND generates lowercase action name

The MENU COMMAND clause now generates action names in lowercase. This means, when you define COMMAND "Open", it will bind to all actions views defined with the name 'open'.

Method ui.Interface.loadTopMenu()

New ui.Interface.loadTopMenu() method to load a global topmenu.

ON CHANGE invoked on click

The ON CHANGE block is now invoked when the user clicks on a checkbox, radiogroup, or changes the item in a combobox.

New ui.Dialog built-in class

New ui.Dialog built-in class available with the DIALOG keyword in all interactive instructions. You can now activate/deactivate fields and actions during a dialog:

INPUT ...
     AFTER FIELD field1
     CALL DIALOG.setFieldActive("field2",rec.field1 IS NOT NULL)
     CALL DIALOG.setActionActive("check",rec.field1 IS NOT NULL)

New ui.Form methods

The ui.Form built-in class has new methods to handle form elements. The hidden attribute is now also managed at the model level, this allows you to hide form fields by name, instead of using the decoration node.

CALL myform.setElementHidden("formonly.field1",2)
CALL myform.setFieldHidden("field1",2) -- prefix is optional

Array sub-script operator now returns the sub-array

The [] array sub-script operator now returns the sub-array:

DEFINE a2 DYNAMIC ARRAY WITH DIMENSION 2 OF INTEGER
LET a2[5,10] = 123
DISPLAY a2.getLength() -- displays 5
DISPLAY a2[5].getLength() -- displays 10

Dynamic arrays passed by reference to functions

Dynamic arrays are now passed by reference to functions. You can change a dynamic array in a function when it is passed as an argument.

Control MDI children with ui.Interface

New methods are provided in ui.Interface to control the MDI children.

CANCEL INSERT in AFTER INSERT

In INPUT ARRAY, CANCEL INSERT now supported in AFTER INSERT, to remove the new added line when needed.

Toolbar and Topmenu now have the hidden attribute

Toolbar and Topmenu elements now have the hidden attribute so you can create them and hide the options the user is not supposed to see.

Warning: Hiding a toolbar or topmenu option does not prevent the use of the accelerator of the action. Use ui.Dialog.setActionActive()!

NEXT FIELD CURRENT

New keyword for NEXT FIELD: NEXT FIELD CURRENT. Gives control back to the dialog instruction without moving to another field.

Back to the top


Version 1.20

Debugger

Integrated debugger with gdb syntax to interface with graphical tools like ddd. See Debugger.

Program Profiler

The Program Profiler can be used to generate statistics of program execution, to find the bottlenecks in the source code.

Localized Strings

Internationalizes your application in different languages with localized strings.

Localized Strings are now supported. You can identify strings to be localized, with the % notation:

 LAYOUT ( TEXT= %"custlist" )

See Localized Strings.

Unbuffered Dialogs

Interactive instructions support the UNBUFFERED mode, to synchronise data model and view automatically.  Dialogs can now use the UNBUFFERED attribute, that simplifies INPUT, DISPLAY ARRAY and INPUT ARRAY coding; input/display buffer is no longer used. When you set a variable, the value is automatically displayed to the field. See Unbuffered Dialogs.

Paged Display Array

DISPLAY ARRAY can now work in buffered mode, to avoid loading a big array when you have a lot of rows to display. The DISPLAY ARRAY instruction now has a new ON FILL BUFFER block that can be used with dynamic arrays to feed the dialog with data rows on demand. See Paged Display Array.

Action Defaults

Centralize default attributes for actions in Action Defaults files.

Client side settings saved for each program

Client side settings are now saved in registry according to the 'name' attribute of UserInterface, which can be set with ui.Interface.setName() method. By default UserInterface.name is not set to the name of the program.

APPEND ROW dialog attribute

New attribute APPEND ROW = TRUE/FALSE for INPUT ARRAY instruction. Defines if the user is allowed to add rows at the end of the list.

KEEP CURRENT ROW dialog attribute

New attribute KEEP CURRENT ROW = TRUE/FALSE for DISPLAY ARRAY and INPUT ARRAY instructions. Defines if the current row must remain highlighted when leaving the dialog. The default is FALSE.

UNHIDABLE attribute for image and labels

Image and labels now support the UNHIDABLE attribute for table columns.

TERMINATE REPORT / EXIT REPORT

New report instructions TERMINATE REPORT / EXIT REPORT. Use the EXIT REPORT statement to terminate a report within a REPORT definition. Both statements have the following effects:
- Terminate the processing of the current report.
- Delete any intermediate files or temporary tables that were created while processing the report.

TINYINT data type with SQL Server

SQL Server driver now supports the TINYINT data type.

Toolbars can be defined in forms

You can now define Toolbars in form specification files.

Topmenus can be defined in forms

You can now define Topmenus in form specification files.

Build version number

The FGL_GETVERSION() function returns the internal version number of the runtime system.

Get a help message text

The FGL_GETHELP() function returns the message text for a give help number.

Set the current row

The FGL_SET_ARR_CURR() function changes the current row in DISPLAY ARRAY or INPUT ARRAY.

Interruption handling

Users can now send an interruption request from the client to the program, to stop long running queries, reports and other BDL procedures, by testing the int_flag variable. The client is using an OOB signal.

StatusBar definition with style attribute

There is now a new window style attribute for statusbar layout specification. You can now set statusBarType attribute in the 4st style file for Windows, in order to control the display of status bars.

Field order form

New OPTIONS clause FIELD ORDER FORM provided to use the TABINDEX attribute to define the field tabbing order. FIELD ORDER FORM can also be used at the dialog level as dialog attribute.

Runtime system re-written in C

Runtime system has been re-written in pure C language, g++ 3.2 and corresponding gnu libs (libstdc++, libsupc++, ...) are no longer needed; a runner can be linked with a native cc compiler. See Installation and Setup.

Passing arrays as function parameter

Arrays can be passed as parameters, all elements are expanded.

Compiler supports now ANSI outer joins

You can now write static SQL statements using ANSI outer joins:

   SELECT .. FROM a LEFT OUTER JOIN b ON a.key=b.key

Methods for StringBuffer

New methods for StringBuffer class: base.StringBuffer.replaceAt() and base.StringBuffer.insertAt().

Default items created for COMBOBOX

For COMBOBOX form items, a default ITEMS list is created by fglform when an INCLUDE list is used.

ON IDLE clause in dialogs

The ON IDLE clause can be used to execute a block of instructions after a timeout.

Order of INPUT ARRAY trigger execution

New logical order of execution for INPUT ARRAY triggers:

  1. BEFORE INPUT
  2. BEFORE ROW
  3. BEFORE INSERT
  4. BEFORE FIELD

New ui.ComboBox class

New ui.ComboBox class has been added, to configure COMBOBOX fields at runtime.

Predefined actions in lists: nextrow / prevrow

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

FOREACH infinite loop

FOREACH that raises an error no longer loops infinitely.

Record comparison

Operators equal (= or ==) and not equal (<> or !=) now can be used with records. All members will be compared. If two members are NULL the result of this member comparison results in TRUE.

ON CHANGE trigger

ON CHANGE field trigger in INPUT and INPUT ARRAY. Same as AFTER FIELD, but only invoked if the value has changed.

Program icon

New image attribute in UserInterface node, for the program icon. Can be set with ui.Interface.setImage().

Form compilation warnings

New option -W for fglform to show warnings.

FORMAT attribute in LABELs

LABELs can now have a FORMAT attribute.

SQLSTATE and SQLERRMESSAGE

New SQLSTATE and SQLERRMESSAGE operators, to give SQL execution information.

Front End Function calls

You can now call predefined functions in the front-end, by using the ui.Interface.frontCall()method.
See also Front End Functions.

New ui.Form built-in class

New ui.Form built-in class to handle forms.

TABINDEX for tabbing order

New TABINDEX field attribute to define the tabbing order in forms.

LSTR operator

New LSTR operator to get a localized string by name:

  DISPLAY LSTR("custno_comment")

SFMT operator

New SFMT operator to format strings with parameters:

  DISPLAY SFMT("Could not find %1 in %2.",filename,dirname)

ON ROW CHANGE trigger

New ON ROW CHANGE clause in INPUT ARRAY. This trigger will be executed if at least one value in the row has been modified. The ON ROW CHANGE code is be executed just before the AFTER ROW clause.

New StringTokenizer class

The StringTokenizer class can be used to parse strings for tokens.

Faster linker

Linker is now faster when having program modules with a huge number of functions.

Global constants

CONSTANTs can now be defined as GLOBALs.

ON ACTION in MENUs

MENU instruction now supports ON ACTION clause, to write abstract menus as simple action handlers.

New Application class

The base.Application class provides an interface to the program properties.

New Channel class

New definition of the interface for Channels, now based on objects:

 DEFINE c base.Channel
 LET c = base.Channel.create()
 CALL c.openFile("data.txt","r")

Predefined 'help' action

New 'help' predefined action, to start help viewer for HELP clauses in dialog instructions.

 INPUT BY NAME .... HELP 12423 -- Creates action 'help'

Back to the top


Version 1.10

Dynamic User Interface

The Dynamic User Interface is the major new concept in Genero. It is the basement for the new graphical user interface. See Dynamic User Interface.

Interactive Instruction Extensions

Classical interactive instructions such as INPUT, INPUT ARRAY, DISPLAY ARRAY, CONSTRUCT have been extended with new control blocks and control instructions. See Interactive Instruction Extensions.

Built-in Classes

The language supports now built-in classes, a new object-oriented way to program in BDL. See Built-in Classes.

Constant Definitions

It is now possible to define constants, as in other languages. See Constant Definitions.

Extended Form Files

You can now define complex layouts with the extended PER files. See Extended Form Files.

Dynamic Arrays

The language now supports dynamic arrays with automatic memory allocation. DISPLAY ARRAY can now work in buffered mode, to avoid to load a big array when you have a lot of rows to display. See Dynamic Arrays.

XML utilities

A set of XML Utilities are provided in the runtime library as built-in classes.

STRING data type

A new STRING data type is now available, to simplify utility function coding.

Defining MDI containers

Defining Window Containers (MDI) is a simple way to group programs.

SCHEMA instruction

The new SCHEMA instruction allows you to specific a database schema without having an implicit connection when the program executes.

Back to the top