See also: FAQ List.
The following database drivers are supported by Genero version 2.11:
Genero FGL 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.
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 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.
You can now remove line number information with -p noln when preprocessing sources to get a readable output:
fglcomp -E -p noln mymodule.4gl
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"
The ui.ComboBox class has been extended with new methods: getTextOf() and getIndexOf().
A new FGLPROFILE entry has been added to force the current row to be automatically shown 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.
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 FGL version was used to compile forms.
A new DIALOG instruction handles different parts of a form simultaneously. See also ui.Dialog class.
The TRY/CATCH pseudo statement can handle exceptions raised by the runtime system.
Instructs the DVM that an uncaught exception will be handled by the caller of the function. See Exceptions.
Support for SQL Server 2005 Native Client is now provided.
HBox and VBox containers can now have a splitter. See also Layout Tags.
With the new DOUBLECLICK table attribute, it is now possible to send a specific action when the user double-clicks on a row.
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.
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.
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.
The Channel class now provides a method to establish a client socket connection to a server, with the new openClientSocket() method.
For debugging purpose, you can now get the stack trace of the program with the Application.getStackTrace() method.
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.
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.
The -s option of fglrun now reports more information about sizes. See Optimization for more details.
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.
It is now possible to get an action event when the user modifies the value of a field, with the predefined dialogtouched action.
You can now use the validate="no" action default attribute to prevent data validation when executing an action.
It is now possible to define a minimum width and height for forms with the MINWIDTH, MINHEIGHT attributes.
With the new AUTO APPEND attribute, you can now avoid the automatic creation of a temporary row in INPUT ARRAY.
When a DISPLAY ARRAY or INPUT ARRAY is executed, the runtime system now creates two more implicit actions to navigate in the list: firstrow and lastrow. In previous versions, only nextrow and prevrow actions were created. You can now bind four buttons to these actions to get a typical list navigation toolbar. Note that the default action views are hidden for these navigation actions.
The parse() and toString() methods are now available for a DomNode object, and a DomDocument object can be created with createFromString().
The TEXT and BYTE data types now support the methods readFile(fileName) and writeFile(fileName).
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.
You can now share global variables between the FGL source and the C Extension, by using the -G option of fglcomp. See Global variables in C Extensions.
It is now possible to customize the runtime system error messages according to the current locale. See Localization for more details.
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.
You can now specify a TABINDEX of zero to exclude the form item from the tagging list. See TABINDEX for more details.
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.
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.
ESQL/C Compiler. See FESQLC compiler (V2).
Support of DB2 V9.x. See DB2 V9.x support.
Support of PostgreSQL 8.2.x. See PostgreSQL V 8.2.x support.
The layout tag syntax in grids has been extended to support an ending tag to get better control of form layout.
The fglcomp compiler now supports a negative form for warning arguments.
When using the RUN command, the ComSpec environment variable is now used under Windows platforms.
Runner now uses shared libraries; you no longer need to link a runner. See Dynamic Runner Architecture.
You can now define your own data type with records or arrays. See User defined types.
New widgets have been added: SLIDER, SPINEDIT, TIMEEDIT.
Database Schema files have been extended for Genero (FIELD item type). See Extended Schema Files.
File management function library provided as loadable extension. See File Management Functions.
Mathematical function library provided as loadable extension. See Math Functions.
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.
To declare a C extension module, you must now use the IMPORT instruction at the beginning of a module.
You can now specify the WIDTH and HEIGHT attributes for IMAGE form items, as a replacement for PIXELWIDTH / PIXELHEIGHT.
New commands have been added to the debugger (call, ignore).
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.
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) )
In X11 or Windowse TSE environments, you can now automatically start up the front-end with FGLPROFILE entries. See Dynamic User Interface for more details.
The Channel class now has an isEof() method to detect end of file.
It is now possible to ignore the CTRL_LOGOFF_EVENT events on Windows platforms.
The fglcomp compiler has new warning flags: See fglcomp for more details.
You can now define a fourth accelerator for an action in actions defaults or in the form files.
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.
A new built-in function has been added to set an environment variable: FGL_SETENV().
The XML reader and writer classes have been extended to properly support markup language entities (like HTML's ).
The fgldbsch tool can now extract database tables with LVARCHAR columns. The LVARCHAR type is converted to VARCHAR2(n>255) in the .sch file.
A class to serialize program variables. See TypeInfo class.
A generic ODBC database driver is now available (code is odc). See Generic ODBC support.
Genero DB version 3.4 is now supported. See Genero DB support.
PostgreSQL version 8.1 is now supported. See PostgreSQL 8.1 support.
Microsoft SQL Server 2005 is now supported. See SQL Server 2005 support.
New license manager supporting strict licensing. See New license manager.
The base.Channel class now supports a binary mode with the 'b' option, to control CR/LF translation when using DOS files.
Distribution of Datetime.h, Interval.h, loc_t.h header files in FGLDIR/include/f2c.
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.
You can now define a third accelerator for an action in actions defaults or in the form files.
PostgreSQL version 8.0 is now supported (8.0.2 and higher). See PostgreSQL 8.0 support.
Get/Put functions to transfer files from/to the front-end. See File transfer functions.
New debugger commands (watch with condition, whatis).
The preprocessor is now part of the compilers and is always enabled. Preprocessing directives start with an ampersand character (&).
MySQL version 4.1.x is now supported, 3.23 is de-supported. See MySQL 4.1.x support.
Oracle version 10g is now supported. See Oracle 10g support.
The FGL_WIDTH built-in function computes the number of print columns needed to represent a single or multi-byte character.
Interruption handling with SSH port forwarding - only supported with GDC 1.31!
New method ui.Form.setFieldStyle() to set a style for a field.
Improved front-end identification when connecting to GUI client.
Integrated preprocessor allows use of #include and #define/#ifdef macros. See Preprocessor.
New layout rules and form item attributes provide better control of form design. See Layout Enhancements.
Decoration attribute can be defined in a style file to set fonts and colors. See Presentation Styles.
Localization Support (multi-byte character sets). See Localization Support.
Action defaults can be specified in forms. See Action defaults in forms.
New drivers to connect to Sybase Adaptive Server Anywhere V7 and V8. See Sybase ASA Support
Support for PostgreSQL 7.4 with parameterized queries. See PostgreSQL 7.4 support.
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
A MySQL 3.23 driver is now provided for Windows platforms (was previously only provided on Linux).
COMBOBOX fields now support UPSHIFT and DOWNSHIFT attributes, to force character case when QUERYEDITABLE is used.
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.
New BREAKPOINT instruction to stop a program at a given position when using the debugger. It is ignored when not running in debug mode.
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.
New method base.Array.appendElement(), to append an element at the end of a dynamic array.
Compiled Localized String files now have the .42s extension. Previous extension was .4ls.
New assignment operator := has been added
to the language. You can now assign variables in expressions:
IF ( i := (j+1) ) == 2 THEN
The fglcomp compiler now has a new option to
detect non-standard SQL syntax:
fglcomp -W stdsql module.4gl
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.
The new method ui.Dialog.SetCellAttributes() lets you define colors for each cell of a table.
The ui.Window class provides new methods to create or get a form object.
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"...
New methods to read/write complete lines in Channel built-in class: readLine() and writeLine().
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.
The new form field attribute TITLE can be used to specify a table column label with a localized string.
The FGLLDPATH variable is now used during link
New class method ui.Dialog.setDefaultUnbuffered() to set the default for the UNBUFFERED mode.
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.
The DATEEDIT field type now supports DBDATE/CENTURY settings and the FORMAT attribute.
New default action 'close' to control Window closing. You can now write the following to control window closing:
ON ACTION closeSee Windows and Forms.
INPUT ARRAY using TABLE container now needs FIELD ORDER FORM attribute to keep tabbing order consistent with visual order of columns.
If enabled, the preprocessor now raises an error when # comments are used in the source. You must replace all # comments by -- comments before using the preprocessor.
New instructions ACCEPT INPUT / ACCEPT CONSTRUCT / ACCEPT DISPLAY to validate a dialog by program.
ON ACTION doit ACCEPT INPUT
New dialog attribute ACCEPT / CANCEL to avoid creation of default actions
'accept' and 'cancel'.
See Record Input control
instructions.
The Preprocessor is now disabled by default; there are no FGLPP / FGLPPOPTIONS environment variables, you must use the -p option of fglcomp/fglform.
New default action 'append' in INPUT ARRAY. Allows you to add a row at the end of the list.
The linker option -O (optimize) is de-supported (was ignored before). You now get a warning if you use this option.
New method ui.Window.createForm() to create an empty form object in order to build forms from scratch at runtime.
TopMenu definition in forms now allows attributes in parenthesis.
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.
User interface protocol is now controlled with a version number, to check compatibility between the front end and runtime system.
New integrated preprocessor: The form and source compiler now integrates a preprocessor! You can use macros as in C, such as #include, #define, #ifdef, etc.
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.
Layout GRID now accepts HBox tags to group items horizontally.
RADIOGROUP fields now support the attribute ORIENTATION = { VERTICAL | HORIZONTAL }.
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"
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'.
New ui.Interface.loadTopMenu() method to load a global topmenu.
The ON CHANGE block is now fired when the user clicks on a checkbox, radiogroup, or changes the item in a combobox.
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)
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
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 are now passed by reference to functions. You can change a dynamic array in a function when it is passed as an argument.
New methods are provided in ui.Interface to control the MDI children.
In INPUT ARRAY, CANCEL INSERT now supported in AFTER INSERT, to remove the new added line when needed.
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()!
New keyword for NEXT FIELD: NEXT FIELD CURRENT. Gives control back to the dialog instruction without moving to another field.
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.
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.
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.
Centralize default attributes for actions in Action Defaults files.
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.
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.
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.
Image and labels now support the UNHIDABLE attribute for table columns.
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.
SQL Server driver now supports the TINYINT data type.
You can now define Toolbars in form specification files.
You can now define Topmenus in form specification files.
The FGL_GETVERSION() function returns the internal version number of the runtime system.
The FGL_GETHELP() function returns the message text for a give help number.
The FGL_SET_ARR_CURR() function changes the current row in DISPLAY ARRAY or INPUT ARRAY.
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.
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.
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 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.
Arrays can be passed as parameters, all elements are expanded.
You can now write static SQL statements using ANSI outer joins:
SELECT .. FROM a LEFT OUTER JOIN b ON a.key=b.key
New methods for StringBuffer class: base.StringBuffer.replaceAt() and base.StringBuffer.insertAt().
For COMBOBOX form items, a default ITEMS list is created by fglform when an INCLUDE list is used.
The ON IDLE clause can be used to execute a block of instructions after a timeout.
New logical order of execution for INPUT ARRAY triggers:
New ui.ComboBox class has been added, to configure COMBOBOX fields at runtime.
DISPLAY ARRAY and INPUT ARRAY instructions now automatically use two predefined actions nextrow and prevrow, which allow binding action views for navigation.
FOREACH that raises an error no longer loops infinitely.
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 field trigger in INPUT and INPUT ARRAY. Same as AFTER FIELD, but only fired if the value has changed.
New image attribute in UserInterface node, for the program icon. Can be set with ui.Interface.setImage().
New option -W for fglform to show warnings.
LABELs can now have a FORMAT attribute.
New SQLSTATE and SQLERRMESSAGE operators, to give SQL execution information.
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 to handle forms.
New TABINDEX field attribute to define the tabbing order in forms.
New LSTR operator to get a localized string by name:
DISPLAY LSTR("custno_comment")
New SFMT operator to format strings with parameters:
DISPLAY SFMT("Could not find %1 in %2.",filename,dirname)
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.
The StringTokenizer class can be used to parse strings for tokens.
Linker is now faster when having program modules with a huge number of functions.
CONSTANTs can now be defined as GLOBALs.
MENU instruction now supports ON ACTION clause, to write abstract menus as simple action handlers.
The base.Application class provides an interface to the program properties.
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")
New 'help' predefined action, to start help viewer for HELP clauses in dialog instructions.
INPUT BY NAME .... HELP 12423 -- Creates action 'help'
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.
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.
The language supports now built-in classes, a new object-oriented way to program in BDL. See Built-in Classes.
It is now possible to define constants, as in other languages. See Constant Definitions.
You can now define complex layouts with the extended PER files. See Extended Form Files.
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.
A set of XML Utilities are provided in the runtime library as built-in classes.
A new STRING data type is now available, to simplify utility function coding.
Defining Window Containers (MDI) is a simple way to group programs.
The new SCHEMA instruction allows you to specific a database schema without having an implicit connection when the program executes.