Manual 4JS
Manual 4JS
Development
Language User Guide
Version 3.10
This product and related documentation is protected by copyright and distributed under licenses restricting its use,
copying, distribution and decompilation. No part of this product or related documentation may be reproduced in any form
by any means without prior written authorization of Four J’s Development Tools Ltd. and its licensors, if any.
Four J’s Buisiness Development Language and Dynamic Virtual Machine are trademarks or registered trademarks of
Four J’s Development Tools, Ltd.
Informix and Dynamic 4GL are registered trademarks of Informix Software, Inc. Motif, X Window System and UNIX
are registered trademarks of The Open Group in the US and other countries.
Java and all Java based trademarks and logos are trademarks or registered trademarks of Sun Microsystems, Inc.
Microsoft, Windows and Windows NT and/or other Microsoft products referenced herein are either trademarks or
registered trademarks of Microsoft Corporation.
All other product names mentioned herein are the trademarks of their respective owners.
Table of Contents
Introduction
In This Introduction . . . . . . . . . . . . . . . . . . . 3
About This Guide . . . . . . . . . . . . . . . . . . . . 3
Organization of This Guide . . . . . . . . . . . . . . . 3
Audience . . . . . . . . . . . . . . . . . . . . . 5
Software Dependencies . . . . . . . . . . . . . . . . . 5
Documentation Conventions . . . . . . . . . . . . . . . . 5
Typographical Conventions . . . . . . . . . . . . . . . 6
Icon Conventions . . . . . . . . . . . . . . . . . . 7
Additional Documentation . . . . . . . . . . . . . . . . . 7
Four J’s Welcomes Your Comments . . . . . . . . . . . . . . 8
Product Description
In This Chapter . . . . . . . . . . . . . . . . . . . . 1-3
Introducing Four J’s Business Development Language . . . . . . . . 1-3
Windows Interface . . . . . . . . . . . . . . . . . . 1-3
Web Interface . . . . . . . . . . . . . . . . . . . . 1-3
Text Interface . . . . . . . . . . . . . . . . . . . . 1-4
GLS Support . . . . . . . . . . . . . . . . . . . . 1-4
Three-Tier Client/Server Architecture . . . . . . . . . . . . 1-5
Client Example . . . . . . . . . . . . . . . . . . 1-6
Architecture . . . . . . . . . . . . . . . . . . . 1-6
Differences Between Four J’s Business Development Language and 4GL . . 1-7
Features Summary . . . . . . . . . . . . . . . . . . . . 1-12
Installation
In This Chapter . . . . . . . . . . . . . . . . . . . . . 2-3
Before Installing Four J’s Business Development Language. . . . . . . 2-3
Release Notes . . . . . . . . . . . . . . . . . . . . . 2-3
Hardware requirements . . . . . . . . . . . . . . . . . . 2-3
Disk Space Requirement . . . . . . . . . . . . . . . . 2-3
Software requirements . . . . . . . . . . . . . . . . . . 2-4
Licensing the Product . . . . . . . . . . . . . . . . . . . 2-4
Supported Operating Systems . . . . . . . . . . . . . . . . 2-5
Upgrading Four J's BDL . . . . . . . . . . . . . . . . . . 2-6
Product Information Viewer . . . . . . . . . . . . . . . . . 2-6
Product Directory Structure . . . . . . . . . . . . . . . . . 2-7
Post Installation Tasks . . . . . . . . . . . . . . . . . . 2-8
UNIX installation . . . . . . . . . . . . . . . . . . . . 2-8
Installation Program Requirements . . . . . . . . . . . . . 2-8
TCP/IP Requirements . . . . . . . . . . . . . . . . . 2-8
C/C++ Compiler Requirements . . . . . . . . . . . . . . 2-9
Informix Prerequisites . . . . . . . . . . . . . . . . . 2-9
Prerequisites for GLS . . . . . . . . . . . . . . . . 2-9
Start the Installation on Unix . . . . . . . . . . . . . . . 2-9
Windows installation . . . . . . . . . . . . . . . . . . . 2-10
TCP/IP Requirements . . . . . . . . . . . . . . . . . 2-10
C/C++ Compiler Requirements . . . . . . . . . . . . . . 2-11
Using Windows Front End on the same machine . . . . . . . . . 2-11
Informix Prerequisites . . . . . . . . . . . . . . . . . 2-11
Start the Installation on Windows. . . . . . . . . . . . . . 2-11
First Steps
Table of contents v
fglform . . . . . . . . . . . . . . . . . . . . 4-35
fglschema . . . . . . . . . . . . . . . . . . . . 4-36
fgldbsch . . . . . . . . . . . . . . . . . . . . 4-36
fglmkmsg . . . . . . . . . . . . . . . . . . . . 4-37
ar42o . . . . . . . . . . . . . . . . . . . . . 4-38
findlib.sh . . . . . . . . . . . . . . . . . . . . 4-39
Configuration Tools . . . . . . . . . . . . . . . . . . 4-41
fglmode . . . . . . . . . . . . . . . . . . . . 4-42
licencef4gl . . . . . . . . . . . . . . . . . . . 4-44
fglfontsel, fglfontsel.42e . . . . . . . . . . . . . . . 4-45
Miscellaneous Programs and Scripts . . . . . . . . . . . . . 4-46
rtsinstall, fglinstall . . . . . . . . . . . . . . . . . 4-47
fglpager, pager.42e . . . . . . . . . . . . . . . . . 4-47
fglX11d . . . . . . . . . . . . . . . . . . . . 4-48
fglWrt . . . . . . . . . . . . . . . . . . . . . 4-48
Language Extensions
In This Chapter . . . . . . . . . . . . . . . . . . . . . 5-5
Integer Expressions as Character Subscripts . . . . . . . . . . . . 5-6
Integer Expressions as Array Indexes . . . . . . . . . . . . . . 5-6
Channel Extensions . . . . . . . . . . . . . . . . . . . 5-6
Initializing Channel Extensions . . . . . . . . . . . . . . 5-7
Opening a File. . . . . . . . . . . . . . . . . . . . 5-7
Opening a Pipe . . . . . . . . . . . . . . . . . . . 5-8
Setting the Default Separator . . . . . . . . . . . . . . . 5-9
Reading Data from an Opened Channel . . . . . . . . . . . . 5-9
Writing Data to a Pipe or Stream . . . . . . . . . . . . . . 5-10
Closing the Channel . . . . . . . . . . . . . . . . 5-11
Channel Error Codes. . . . . . . . . . . . . . . . . . 5-11
Sharing Information Using DDE . . . . . . . . . . . . . . . 5-11
Supported Windows Applications . . . . . . . . . . . . . 5-12
Using DDE Extensions . . . . . . . . . . . . . . . . . 5-12
Transmitting Values to a Windows Program . . . . . . . . . . 5-14
Getting Values from a Windows Program . . . . . . . . . . . 5-15
Closing a DDE Connection . . . . . . . . . . . . . . . 5-15
Closing all DDE Connections . . . . . . . . . . . . . . . 5-16
Extending the DISPLAY ARRAY Statement . . . . . . . . . . . 5-17
Returning Key Code Values . . . . . . . . . . . . . . . . . 5-18
Returning Key Codes from P Code . . . . . . . . . . . . . 5-19
Form Extensions
In This Chapter . . . . . . . . . . . . . . . . . . . . . 6-3
List Boxes . . . . . . . . . . . . . . . . . . . . . . 6-4
Buttons . . . . . . . . . . . . . . . . . . . . . . . 6-6
Bitmaps . . . . . . . . . . . . . . . . . . . . . . . 6-11
Check Boxes . . . . . . . . . . . . . . . . . . . . . 6-12
Radio Buttons . . . . . . . . . . . . . . . . . . . . . 6-14
Button Fields . . . . . . . . . . . . . . . . . . . . . 6-15
Combo Box Fields. . . . . . . . . . . . . . . . . . . . 6-16
Scrolling Fields. . . . . . . . . . . . . . . . . . . . . 6-17
Folder Tabs . . . . . . . . . . . . . . . . . . . . . . 6-17
Form Labels. . . . . . . . . . . . . . . . . . . . . . 6-19
Password Fields . . . . . . . . . . . . . . . . . . . . 6-21
Graphical Extensions
In This Chapter . . . . . . . . . . . . . . . . . . . . . 7-3
Display Extensions . . . . . . . . . . . . . . . . . . . 7-3
Four J’s Business Development Language Library Initialization . . . . 7-3
Check User Interface Type . . . . . . . . . . . . . . . . 7-3
Checking for Graphical User Interface usage . . . . . . . . . . 7-5
Checking for Windows Client Mode . . . . . . . . . . . . . 7-6
Window-Management Functions . . . . . . . . . . . . . . . 7-8
Setting the Size of the Application Container . . . . . . . . . . 7-8
Setting the Title of the Application Container . . . . . . . . . . 7-8
Retrieving Information from a Field . . . . . . . . . . . . . 7-9
Retrieving Application Window Properties. . . . . . . . . . . 7-10
Setting the Current Window . . . . . . . . . . . . . . . 7-11
Table of contents ix
Program Configuration File . . . . . . . . . . . . . . . 8-5
General Configuration . . . . . . . . . . . . . . . . . . 8-6
Runtime Configuration . . . . . . . . . . . . . . . . . . 8-6
General . . . . . . . . . . . . . . . . . . . . . . 8-6
UNIX . . . . . . . . . . . . . . . . . . . . . . 8-9
Microsoft Windows . . . . . . . . . . . . . . . . . . 8-10
License Configuration . . . . . . . . . . . . . . . . . . 8-13
General . . . . . . . . . . . . . . . . . . . . . . 8-13
UNIX . . . . . . . . . . . . . . . . . . . . . . 8-16
Graphical User Interface . . . . . . . . . . . . . . . . . . 8-17
General . . . . . . . . . . . . . . . . . . . . . . 8-17
fglrun.interface . . . . . . . . . . . . . . . . . . 8-17
Graphical Daemon Autostart . . . . . . . . . . . . . . . 8-19
Menu . . . . . . . . . . . . . . . . . . . . . . 8-20
Screen GUI Settings . . . . . . . . . . . . . . . . . . 8-21
Key GUI Settings. . . . . . . . . . . . . . . . . . . 8-24
Windows GUI Settings . . . . . . . . . . . . . . . . . 8-30
Local Editing Settings . . . . . . . . . . . . . . . . . 8-31
Cut, Copy, and Paste Feature Settings . . . . . . . . . . . . 8-32
Memory Mapping Settings . . . . . . . . . . . . . . . . . 8-34
The Debugger
In This Chapter . . . . . . . . . . . . . . . . . . . . . 9-3
Requirements . . . . . . . . . . . . . . . . . . . . . 9-3
Installation . . . . . . . . . . . . . . . . . . . . . . 9-3
Starting the Debugger. . . . . . . . . . . . . . . . . . . 9-4
Invoking debug mode on running applications . . . . . . . . . . . 9-4
UNIX platforms . . . . . . . . . . . . . . . . . . . 9-4
Microsoft Windows Platforms. . . . . . . . . . . . . . . 9-5
Debugger Commands . . . . . . . . . . . . . . . . . . . 9-5
Environment Variables
Introduction
In This Introduction . . . . . . . . . . . . . . . . . . . 3
About This Guide . . . . . . . . . . . . . . . . . . . . 3
Organization of This Guide . . . . . . . . . . . . . . . 3
Audience . . . . . . . . . . . . . . . . . . . . . 5
Software Dependencies . . . . . . . . . . . . . . . . . 5
Documentation Conventions . . . . . . . . . . . . . . . . 5
Typographical Conventions . . . . . . . . . . . . . . . 6
Icon Conventions . . . . . . . . . . . . . . . . . . 7
Additional Documentation . . . . . . . . . . . . . . . . . 7
Four J’s Welcomes Your Comments . . . . . . . . . . . . . . 8
2 Four J’s Business Development Language User Guide
In This Introduction
This introduction provides an overview of the information in this guide and describes
the conventions used.
This guide assumes that you already have a complete set of INFORMIX-4GL manuals,
such as the INFORMIX-4GL Reference and the appropriate SQL manuals. This guide
should be used in addition to the 4GL manuals.
Introduction 3
Organization of This Guide
• Chapter 6, “Form Extensions,” describes the added features that extend the
functionality of 4GL forms.
• Chapter 7, “Graphical Extensions,” describes the added features that extend
the functionality of 4GL. These features affect the graphical user interface
(GUI).
• Chapter 8, “The Configuration File,” describes how to edit the fglprofile
file to change the behavior of the Four J’s BDL compiler .
• Chapter 9, “The Debugger,” describes how to use the Four J’s BDL
Debugger.
• Appendix A, “Environment Variables,” describes the environment
variables needed to use Four J’s BDL.
• Appendix B, “Hints, Tips and Workarounds,” provides workarounds for
common problems that may be encountered.
• Appendix C, “Global Language Support,” describes how to use GLS
features with Four J’s BDL.
Audience
This guide is written for all Four J’s BDL users.
This guide is written with the assumption that you have the following background:
Software Dependencies
This guide is written with the assumption that you are using a supported database
server.
Documentation Conventions
This section describes the conventions that this guide uses.
• Typographical conventions
• Icon conventions
Introduction 5
Typographical Conventions
Typographical Conventions
This guide uses the following conventions to introduce new terms, illustrate screen
displays, describe command syntax, and so forth.
Convention Meaning
italics Within text, new terms and emphasized words appear in italics. Within
italics syntax and code examples, variable values that you are to specify
italics appear in italics.
monospace Information that the product displays and information that you enter
monospace appear in a monospace typeface.
KEYSTROKE Keys that you are to press appear in uppercase letters in a sans serif
font.
Icon Conventions
Comment icons identify three types of information, as the following table describes.
This information always appears in italics.
Additional Documentation
Four J’s BDL documentation is provided in a variety of formats:
Introduction 7
Four J’s Welcomes Your Comments
• The name and version of the guide that you are using
• Any comments that you have about the guide
• Your name, address, and phone number
Product Description
1
In This Chapter . . . . . . . . . . . . . . . . . . . . 1-3
Introducing Four J’s Business Development Language . . . . . . . . 1-3
Windows Interface . . . . . . . . . . . . . . . . . . 1-3
Web Interface . . . . . . . . . . . . . . . . . . . . 1-4
Text Interface . . . . . . . . . . . . . . . . . . . . 1-4
GLS Support . . . . . . . . . . . . . . . . . . . . 1-4
Three-Tier Client/Server Architecture . . . . . . . . . . . . 1-5
Client Example . . . . . . . . . . . . . . . . . . 1-6
Architecture . . . . . . . . . . . . . . . . . . . 1-6
Differences Between Four J’s Business Development Language and 4GL . . 1-7
Features Summary . . . . . . . . . . . . . . . . . . . 1-12
1-2 Four J’s Business Development Language User Guide
In This Chapter
This chapter introduces the features of Four J’s BDL, including differences between
the standard 4GL compiler and the Four J’s BDL compiler.
In addition to standard 4GL routines, applications can be enhanced for display with a
GUI using Four J’s BDL extensions - for example check boxes or list boxes can be
added to your GUI by enhancing the current 4GL source code.
Windows Interface
The GUI is displayed by a graphics server running on the client. The graphics server
can be either X11 or a Windows version of the Tcl/Tk software, called WTK, which
is provided with the Four J’s BDL software.
Web Interface
You can also provide a GUI for Four J’s BDL applications through any compatible
Web browser. You can use either HTML or Java to do this. To use HTML, you run a
daemon provided with the Four J’s BDL software that converts the output of your
program to HTML. To use Java, you must have a Web server that supports servlets.
The 4GL source code does not need to be converted to use either method.
Introduction 1-3
Text Interface
Text Interface
Programs may also be executed in ASCII mode. This means that users access your
programs in the same way they would access standard 4GL programs, that is by
logging on to the same computer that runs the programs. The ease by which you can
change modes allows you to control the migration rate of your client computers.
GLS Support
Four J’s BDL supports Informix Global Language Support (GLS). The GLS feature
allows Informix database servers to handle different languages, cultural conventions,
and code sets.
While Four J’s BDL is fully compliant with Informix GLS, there are some restric-
tions. You cannot use GLS with the Four J’s BDL HTML or X11 Clients.
Introduction 1-5
Three-Tier Client/Server Architecture
Client Example
Figure 1-2 shows a 4GL application before and after it was converted to a Windows
client.
Figure 1-2
4GL Application Converted
to a Windows Client
4GL ASCII
Architecture
The application server can be a UNIX server or a Windows NT/2K computer. In a
typical installation, Four J’s BDL is installed on the application server (either the
development or runtime version) with the 4GL programs. The database server is
usually installed on this same computer, but this is not required.
The client computers can be X11 compliant interfaces or Windows computers. Each
client has its own Four J’s BDL daemon that handles the GUI aspects of 4GL
applications.
The following list summarizes the differences between Four J’s BDL and 4GL:
Introduction 1-7
Differences Between Four J’s Business Development Language and 4GL
• PROMPT. In Four J’s BDL, the 4GL PROMPT statement waits for an answer
in the graphical window at the prompt line if the graphical window is
opened first. If no graphical window is open before the PROMPT statement
is executed, the prompt is made in the ASCII terminal, for example:
MAIN
DEFINE C CHAR (1)
DISPLAY "Hello"
PROMPT "Press any key" FOR CHAR C
END MAIN
•• In the previous example, PROMPT is executed in the terminal and in
terminal mode even if you are in graphical mod
•• The following example shows how to execute PROMPT in graphical
mode:
MAIN
DEFINE C CHAR (1)
DISPLAY "Hello" AT 5,5
PROMPT "Press any key" FOR CHAR C
END MAIN
Introduction 1-9
Differences Between Four J’s Business Development Language and 4GL
• Informix Universal Server BOOLEAN. 4GL uses the INTEGER data type
for boolean expressions. INFORMIX Universal Server introduces a new
BOOLEAN data type which actually is a CHAR(1) where the "t" and "f"
values represent the TRUE and FALSE boolean values. These
"BOOLEAN" values cannot be used directly in 4GL boolean expressions.
Here is an example of 4GL code that raises a data type conversion error :
# Prerequisite : The database holds a table defined as :
# CREATE TABLE tab1 ( col1 BOOLEAN )
#
DATABASE stores
MAIN
DEFINE vbool INTEGER
LET vbool = ( 1 = 0 )
INSERT INTO tab1 VALUES( vbool )
END MAIN
Introduction 1-11
Features Summary
Features Summary
The following list summarizes the features that have been added to the standard 4GL
language:
Introduction 1-13
Features Summary
The fglpager command has the same functionality as pager.42e except that:
•• you can only scroll 10 pages backwards.
•• you can see all pages, but you must specify a database name as
parameter -d dbname because the page uses temporary tables.
Reports in 4GL programs can also use temporary tables. Because they
use a lot of space, you must first call the function
fgl_report_use_temptable() to enable them. Otherwise, you can see
only 10 pages backwards.
•• If you execute the report with FGLGUI=0, the pager will display all the
report without stopping after each page.
• Toolbars. A toolbar can be added to the top of the screen to represent
frequently used commands.
• Status bar. Allows the status of certain keys to be displayed on the status
bar.
• Folder Tabs. Allows multiple screen forms to be displayed using folder
tabs (appear similar to Windows folder tabs) enabling the user to easily
navigate between multiple screens. .
• Splash screen. Allows a splash screen to be displayed after starting an
application. .
• Local Editing. Enables the client to wait until an entire value has been
entered into a field before submitting the information to the application
server. .
• Cut and Paste. Enables standard cut and paste functionality within the
Windows Client or X11 Client. .
• Screen record without size. With fglform (.per compiler), you are not
required to specify the screen record size, but if you do not specify the size,
you will not have a scrollbar.
• Terminate handler. Allows a standard close window option to appear in
the upper-right corner of a GUI window. Alt+F4 will also close the window.
• Terminate signal. Allows a 4GL application to send a terminate signal
(available only for UNIX).
• Character filter. You can define conversion files to be used for characters
on the GUI.
For more information, see the INFORMIX-4GL Reference Manual. 4GL 7.3
Installation
2
In This Chapter . . . . . . . . . . . . . . . . . . . . 2-3
Before Installing Four J’s Business Development Language . . . . . . 2-3
Release Notes . . . . . . . . . . . . . . . . . . . . . 2-3
Hardware requirements . . . . . . . . . . . . . . . . . . 2-3
Disk Space Requirement . . . . . . . . . . . . . . . . 2-3
In This Chapter
This chapter describes how to install the Four J’s BDL product. This chapter includes
instructions for installing the application server on either UNIX or Windows NT.
Release Notes
After installation, the Four J’s BDL release notes will be found in $FGLDIR/release
on Unix systems or %FGLDIR%/release on Windows systems. This file contains
important information such as machine specific notes, enhancements and bug
corrections.
Hardware requirements
A network card is required to license a Four J’s BDL installation.
Software requirements
An ANSI compatible C/C++ compiler and linker is required. Common system
modules and libraries such as TCP/IP are also a requirement.
A database server or database client software must be installed along with the C
development kit. If the product is to be licensed via the Four J’s web site, a Web
browser and internet connection will be needed.
See “UNIX installation” on page 2-8 or “Windows installation” on page 2-10 for
more details about required software.
To perform a full licensing, you will be prompted for the license number and license
number key and an installation number will be generated. Go to the www.4js.com
web site to get the installation number key (contact your local support if you fail to
get the key from the web site). Finally, enter the installation number key to complete
licensing.
You have 30 days to enter the installation number key. If you cannot get the instal-
lation number key, you will have to complete the licensing manually by using the
following command:
$ fglwrt -k installation_number_key
When upgrading Four J's BDL by installing on an existing FGLDIR with a valid
license, you do not have to re-enter the license keys.
Note: Neither the serial number nor the installation number will ever contain the
letter O, only the digit 0 (zero).
HP/UX 10.01
SCO Open Server 5.0.x
Dynix/Ptx 4.4.2
Note: When upgrading, all running programs must be stopped, especially the license
server if it is used. If the database development kit has changed, unset the FGLDBS,
FGLLIBSQL and FGLLIBSYS environment variables.
Path Description
• Search the system and database libraries with findlib.sh and create the
environment file.
• Create a P-Code runner with fglmkrun.
• Create the P-Code libraries with rtsinstall.
• Create the C-Code libraries with fglinstall.
UNIX installation
This section describes how to install Four J's BDL on Unix platforms.
TCP/IP Requirements
A development version of TCP/IP must exist on the development server. Check your
operating system manuals to be sure this module is installed. For example, on SCO
UNIX System 3.2, the library libsocket.a must be present.
Informix Prerequisites
Four J's recommends the latest ESQL/C software when using Informix. You can
download Informix Client SDK from the Informix Web site:
http://www.informix.com
The installation program needs options. You can display the installation program
options using the -h option:
$ /bin/sh fjs-f4gl-3.10.2a-aix0430.sh -h
The installation program determines the operating system and checks that all the
system requirements are met before starting to copy the product files to your disk.
If you are using Informix, you will be prompted to install Four J's BDL with GLS
enhancements during the installation, . You should only install the GLS enhancement
if you are planning on using the GLS features. The GLS enhancement will install
additional files - for more information on GLS, see Appendix C, “Global Language
Support.”
Warning: You must have the Client SDK 2.01 (or later) installed and the database
server running to install the GLS features.
Windows installation
This section describes how to install Four J's BDL on Microsoft Windows platforms.
TCP/IP Requirements
Warning: Only the Microsoft TCP/IP stack is supported. Problems may occur with
other TCP/IP stacks.
Informix Prerequisites
You must have at least an ESQL/C development package installed to create P-Code
runners for Informix. The Informix ESQL/C package must be compatible with the
Informix database you want to access.
Warning: Four J's strongly recommends to use Informix ESQL/C Version 7.20.TE1
or higher as Version 7.20.TD1 may cause system instability on Windows NT 4.0. You
can download the latest Informix Client SDK without charge from the Informix web
site. For more information, see the Informix web site.
First Steps
3
In This Chapter . . . . . . . . . . . . . . . . . . . . 3-3
Setting the Environment Variables . . . . . . . . . . . . . . 3-3
Compiling a Simple Program . . . . . . . . . . . . . . . . 3-4
Writing the Source Code . . . . . . . . . . . . . . . . 3-5
Compiling the Source Code . . . . . . . . . . . . . . . 3-6
Compiling to P Code . . . . . . . . . . . . . . . . 3-6
Compiling to C Code . . . . . . . . . . . . . . . . 3-6
Compiling the Form-Specification File . . . . . . . . . . . . 3-7
Viewing the Four J’s Business Development Language Application . . . 3-8
3-2 Four J’s Business Development Language User Guide
In This Chapter
This chapter explains how to set environment variables and compile a simple
program in Four J’s BDL.
The first task is to set up correct environment variables. To do this, execute the
envcomp script located in the $FGLDIR directory. For instance, if the compiler is
installed in the /usr/fgl2c directory, type the following Bourne shell commands:
$ cd /usr/fgl2c
$ . ./envcomp
Variable Description
FGLDIR The directory specified during the installation for Four J’s BDL
FGLDBS Tells the compiler which version of the Informix interface you
installed on your computer
Variable Description
PATH Search path for required files and components. The script adds
the $FGLDIR/bin directory to your PATH
FGLSHELL External shell for linking system tools (CC, GCC), or Informix
tools (ESQL, C4GL) to compile a P-code runner
After you compile the program, you compile the form-specification file.
Message[f02]
ATTRIBUTES
f01 = formonly.f01;
f02 = formonly.f02;
bt1 = formonly.bt1,widget="RADIO", default="info",
config="info Info exclamation Exclamation question
Question stop Stop";
All the strings between the double quotes are case sensitive.
Compiling to P Code
P code has many advantages over C code. The main advantages of using P code are:
• you compile it once and then you can run the same compiled modules on
every computer on which a Four J’s BDL runtime package is installed.
• all the new 4GL features are implemented in P code only.
To compile ex1-1 to P code, change to the directory where you created the ex1-1.4gl
and ex1-1.per files. Check that your environment variable is correctly set:
$ echo $FGLDIR
This statement should return the directory where you installed Four J’s BDL. Also
check if the $FGLDIR/bin directory is included in the PATH variable:
$ echo $PATH
Now compile the .4gl source-code files into modules with the .42m extension. Use
the fgl2p script calling the fglcomp program:
$ fgl2p ex1-1.4gl
$ fgl2p ex1-2.4gl
After compiling, you must link the two .42m modules together into a file with the
.42r extension. Use the fgl2p script again, but this time it calls the fgllink program:
$ fgl2p -o ex1.42r ex1-1.42m ex1-2.42m
The resulting ex1.42r file does not contain any executable code. This file is a hash
table that contains calls to the functions included in the .42m modules. It is absolutely
necessary to keep these modules accessible at runtime.
Compiling to C Code
You can compile the sample program to C code. However, C code is only available
for UNIX platforms. To compile to C code, use fgl2c instead of fgl2p.
In addition, you need the following: a C compiler, a linker, and two environment
variables (FGLLIBSYS and FGLLIBSQL). These two environment variables are
defined at install time in the envcomp file located in the $FGLDIR directory.
These two commands should return a list of system libraries and Informix libraries.
To compile the .4gl source-code files into object files with the .42o extension, the .4gl
files are first compiled into .42c files by the fglcomp program and then are compiled
by your C compiler into .42o object files:
$ fgl2c -c ex1-1.4gl
$ fgl2c -c ex1-2.4gl
Next, link the object files, your system libraries, the Four J’s BDL libraries, and the
Informix libraries together into a single executable file with the .42e extension:
$ fgl2c -o ex1.42e ex1-1.42o ex1-2.42o
The result of the compilation is a .42f file. In this case, you get the file ex1-1.42f.
In This Chapter
This chapter contains all the syntax needed for compiling 4GL programs into Four J’s
BDL programs using P code or C code. It also explains how to add calls from 4GL
programs to C programs and how to make calls from C programs to 4GL programs.
For instance, if the compiler is installed in the /usr/fgl2c directory, type the following
Bourne shell commands:
$ cd /usr/fgl2c
$ . ./envcomp
Important: You should include a call to this shell script in your session startup file
(.login or .profile on most UNIX platforms).
You can control the behavior of the Four J’s BDL compiler with configuration files.
For more information, see Chapter 8, “The Configuration File.”
The tool to compile forms is fglform. The extension of the compiled .per files is .42f.
The compilation syntax is as follows:
$ fglform formname{.per}
Important: Because you might need to recompile forms on a computer other than
your development computer, the fglform compiler is installed with theFour J’s BDL
runtime package.
The following command decompiles the file and the output is written to the standard
output:
$ fglmkmsg -r compiled_file
The file database_name.sch is generated. If needed, two other files are generated:
databasename.att and databasename.val. These files contain informations from the
syscolatt and syscolval tables.
The FGLDBPATH environment variable can be used to define the path to the direc-
tories containing database schema files.
Important: While no changes are required to the database before using Four J’s
BDL, a schema file must be generated each time that the database structure changes.
Compiling to P Code
This section describes how to compile a sample 4GL program to linkable modules
and how to link those modules together to create an executable program. It also
describes how to use C functions in your applications.
Before executing this program, you need to compile the code and then link the needed
modules and the P-code runner. Figure 4-1 shows the complete compilation schema.
Figure 4-1
4GL
fgl2p -c P-code module
P-Code
Source Compilation
fgl2p -o Schema
Main p-code module
4GL +
+
Source fgl2p -c P-code module P-code
runner P-code modules
4GL
Source fgl2p -c P-code module
C
Source fglmkrun P-code runner
The name of the Four J’s BDL P-code compiler is fgl2p. This tool compiles 4GL
sources into P-code executables or libraries.
The syntax for the first step of the compilation, compiling 4GL source code into
linkable modules is:
$ fgl2p 4gl_source_code.4gl
For example:
$ fgl2p example.4gl
This line compiles the 4GL source-code file example.4gl to the module
example.42m.
This line links the compiled modules module1.42m and module2.42m into the
executable.42r. The following line links the compiled modules module1.42m and
module2.42m into the library library.42x:
$ fgl2p –o library.42x module1.42m [module2.42m] …
This library can be used as an object module file when linking applications that use
calls to functions defined in the library.
The .42m modules are linked together into the .42r hash table that contains cross-
references to all functions and variables used in the 4GL application. Thus, all
unresolved or faulty references (for instance, missing functions, or function calls with
an incorrect number of parameters or return values) are detected at link time instead
of at runtime.
At runtime, only the .42r and .42m modules that contain the MAIN section are loaded
into memory. All other .42m modules are loaded when needed. Every module and all
library modules appear only once in the application. This can lead to a significant
reduction in the size of the P-code modules constructing the application.
In both cases, try to reduce calls to C functions and system commands to reduce the
risk of problems when porting to other platforms.
Four J’s BDL contains extra functions and features that allow calls to most of the C
functions and calls to system features to be avoided. For a description of the new
extensions to the 4GL language, see Chapter 5, “Language Extensions.”
Where:
For example:
$ fglrun -z
sum -1 1
cos 1 1
sin 1 1
Store this list in a file. The file will be used by the compiler with the -z option, to
check all the C function calls:
$ fglrun -z > myfuncs.out
$ fgl2p -z myfuncs.out -o myprog.42r module.4gl
The fglmkrun shell script allows you to generate a specific runner with your own C
functions. For more information, you can view the output of fglmkrun. Different
options are provided, run fglmkrun -h for more details
To view the P-code runner output, execute fglmkrun. The following information
appears:
The runner was successfully linked with the following options:
Runner name : /usr/fgl2c/bin/fglrun
Language Support Library : ASCII
Compiler : esql
Additional flags/libs : None
Informix dir : /informix
Database interface : ix914 (/usr/fgl2c/lib/libix914.a)
Memory mapping : System built in
User extensions : None
Options
-vb Verbose mode displays the compilation line used and fglmkrun output.
-sh prog External shell for linking (esql, c4gl, and so on). The fglmkrun script can
use the system tools (cc, gcc) or Informix tools (esql, c4gl) to compile a
P-code runner. For system tools, the required Informix libraries and
system libraries have to be set with the findlib.sh script. For Informix
tools, the Informix tools automatically find the libraries. Default value is
CC.
-add "other" Add other system libraries or flags to link. The -add flag sends the
specified parameter to the compiler building the runner. The argument
will not be interpreted by the fglmkrun script.
ext List of user extension modules. This can be anything else that is to be
compiled and linked with the runner such as libraries, C files, object files,
and so forth.
-gls Set this option is you want to use the GLS language support library. To
create a runner with GLS support, you need the Client SDK 2.01 (or later)
database interface. If the -gls flag is not specified, a runner handling only
the ASCII charset is created.
You must specify the -d ix711 option if programs are to run with Informix 7.x
database servers. Alternatively, you can set the environment variable FGLDBS to
ix711.
The two arrays usrData and usrFunctions must always be present in the file. The
last record of each array must be a line with all the elements set to 0. The usrData
array contains the name of the global variables modified by your C programs, and
usrFunctions contains the name of the C functions called from the 4GL modules.
You can copy the file $FGLDIR/lib/fglExt.c and adapt it to your own needs.
Example
This first example is a simple call to a C function in a 4GL module.
Before any modification, copy fglExt.c into your working directory to make it
available for all users. Then edit fglExt.c and update it with the following definitions:
#include "f2c/fglExt.h"
UsrData usrData[]={
{ 0, 0 }
};
int fncc1(int n);
UsrFunction usrFunctions[]={
{"fncc1",fncc1,0,0},
{0,0,0,0 }
};
This command builds a runner (the link between the Informix libraries, system
libraries, Four J’s BDL libraries, and the file example.o) named newrunner. This
runner is for 4.x Informix databases.
Do not give your new runner the same name as one of the files located in the current
directory. When you have created the new runner, you can create the 4GL example
(example.4gl) with the following lines:
MAIN
CALL fncc1()
END MAIN
And link your object file example.42m to example.42r with the following
commands:
$ FGLRUN=newrunner
$ export FGLRUN
$ fgl2p -o example.42r example.42m
The shell script fgl2p uses the value of the FGLRUN environment variable to
determine which runner to link with. If you do not set the FGLRUN environment
variable before you link your 4GL program, the compiler will generate an error
because the fncc1 function was undefined.
Now you can execute your P-code executable with the following command:
$ newrunner example.42r
where funcname is the name of the 4GL function to call (CHAR), and nbparam is the
number of parameters (INTEGER). This function returns the number of return values
(INTEGER).
The parameters must be pushed on the stack before the call, and the return values
must be popped from the stack after returning. The 4GL function must be declared
external in the C-extension file. Update the C file as follows:
#include <stdio.h>
#include <f2c/fglExt.h>
int fncc1(int n)
{
fgl_call( fnc2,0);
return 0;
}
Then build the new runner with the following command line:
$ fglmkrun -o newrunner example.o fglMyExt.c
The global 4GL variables are internally redefined, so you have to use the CNAME
macro to reference them in your C files that contain your C functions.
Furthermore, every variable must be defined as external to the C module with its
corresponding type. Use the following syntax:
#define variable_name_in_4gl CNAME(variable_name_in_4gl)
The following example shows a file that contains the C functions called from 4GL:
#include <stdio.h>
#include "f2c/fglExt.h"
#define var CNAME(var)
#define res CNAME(res)
extern int var;
extern char res[101];
int fncc1(int n)
{
printf("%s %d\n", res, var);
return 0;
}
UsrData usrData[]={
GLOB(var),
GLOB(res),
{ 0, 0 }
};
int fncc1(int n);
UsrFunction usrFunctions[]={
{ "fncc1",fncc1,0,0 },
{0,0,0,0 }
};
CHAR GLOB_CHAR
GLOB_VARCHAR
SMALLINT GLOB_SMALLINT
INTEGER GLOB_INT
SMALLFLOAT GLOB_SMALLFLOAT
FLOAT GLOB_FLOAT
DECIMAL GLOB_DECIMAL
MONEY GLOB_MONEY
DATE GLOB_DATE
The list of supported data types can also be found in the file
$FGLDIR/include/f2c/fglExt.h.
Compiling to C Code
While Four J’s BDL allows you to compile 4GL programs to C code, consider
compiling to P code rather than C code. With C-code compilation, you must
recompile the whole program whenever you change the execution platform, whereas
with P code, you only need to rebuild your runner. In addition, P code does not
execute significantly slower than C code.
Before you execute this program, you first need to compile it and then link all the
needed modules. Figure 4-2 shows the complete compilation schema.
Figure 4-2
4GL C-Code
Source fgl2c -c C code module Compilation
Schema
4GL fgl2c -o
Source fgl2c -c C code module Executable
4GL
Source fgl2c -c C code module
C
Source $FGLCC -c C object files
System Libraries
+
Informix Libraries
The name of the Four J’s BDL C-code compiler is fgl2c. This tool compiles the 4GL
source code into C-code executables or into libraries.
The following syntax is the first step of the compilation, which compiles 4GL source
code into linkable modules:
$ fgl2c –c 4gl_source_code.4gl
For example:
$ fgl2c –c example.4gl
This line compiles the 4GL source-code file example.4gl to the module
example.42o.
This line links the compiled modules module1.42o and module2.42o into the
executable.42e.
The procedure to create C-code libraries is a little different from that for creating
P-code libraries. To build the C-code libraries, you must use the ar42o tool. The
syntax of ar42o is:
$ ar42o -rv libname.a module1.42o module2.42o
This line uses the UNIX ar command to create the library named libname.a made of
the compiled modules module1.42o and module2.42o. This library can be used as
an object module file when linking applications that use calls to functions defined in
the library. For more information on ar, read the ar man page on your UNIX system.
With C code, in order to call a C function from a 4GL application, you do not need a
C-extension file to create the relationship between the name of the C function and the
name of the 4GL function. But you have to call a macro named CFACE defined in the
f2c/r_c.h header file. You will also have to include the f2c/r_c.h header file at the
beginning of your C files. Use the following syntax to call the macro:
CFACE (C_function_name,
param_count,
returned_count)
Element Description
Use this macro for all C functions called from 4GL applications. Include the f2c/r_c.h
header file in all the C files that call this macro.
If you want to use the same source files to compile your applications, either with Four
J’s BDL or with the 4GL compilers, use conditional compiling, as in the following
example:
#ifdef fourjs
#include <f2c/r_c.h>
#endif
The following example shows a 4GL application that calls a C function named mainc.
The 4GL source-code file is named exCCode.4gl and contains the following code:
MAIN
CALL mainc()
END MAIN
The C source file is named exc.c and contains the following code:
#ifdef fourjs
#include <f2c/r_c.h>/* This is the header file defining the CFACE macro */
#endif
#include <stdio.h>
int mainc(int n)
{
printf ("hello from C !!");
return 0;
}
CFACE(mainc,0,0) /* Macro needed for every function call from 4GL */
Now compile the two previous files with the following commands:
$ cc –c exc.o exc.c –D Informix –I$FGLDIR/include
$ fgl2c –c exCCode.42o exCCode.4gl
Next, link the compiled modules, the system libraries, and the Informix development
libraries together with the fgl2c shell script:
$ fgl2c –o exc.42e exc.o exCCode.42o
To call 4GL functions from a C function, use the fgl_call macro. This macro is also
defined in the f2c/r_c.h header file. The syntax is as follows:
fgl_call(4GL_function_namee,param_count )
Element Description
The following example shows a 4GL function that calls a C function, which, in turn,
calls another 4GL function. This example is made of two 4GL modules and one C file.
The C statements popquote, pushquote, pop[…] and push[…] are working exactly
as with INFORMIX-4GL compilers.
Link the three object modules, the system libraries, and the Informix libraries
together:
$ fgl2c –o exCCode.42e exCCode.42o fnCCode.42o exc.o
The next step is to share global variables between C functions and 4GL functions. The
definition process for global variables is exactly the same as when you compile your
program in C code or in P code, except that no
C-extension file is needed. The syntax of the CNAME macro is:
#define variable_name_in_4gl CNAME(variable_name_in_4gl
To illustrate this macro with C-code compilation, you simply modify the previous
example to use a global variable instead of a parameter to exchange the data between
the 4GL functions and the C function.
Next, link the three object modules, the system libraries, and the Informix libraries
together:
$ fgl2c -o exCCode.42e exCCode.42o fnCCode.42o exc.o
Compilation Tools
All the tools you need in order to compile 4GL programs to P code or C code are
located in the /bin subdirectory. These tools are described in the following sections.
Filename Description
findlib.sh Script to find all the libraries needed on your system to create P-code
runners or C-code executables
fgl2p
To see all available options for this command, execute with the -h argument.
The fgl2p command reads source.4gl files and creates a compiled version of each,
with the name source.42m. You can specify any number of source files, in any order.
You can also link the source files together after compilation to create a P-code
executable.
Warning: Some UNIX systems limit the maximum command line length and can
create unexpected errors with very long command lines.
If an error or warning occurs during compilation, the compiler creates a file called
source.err. Look in source.err to find where the error or warning occurred in your
code. If you specify the -M option, errors and warning messages will be sent to the
screen instead of in a file.
You can use the -W with unused, return or all. When using the -W unused option, a
warning will be displayed for every definition of an unused variable in source.4gl
file. Check your code to remove such variables. The flag -W return forces the
compiler to check the number of returned parameters for every 4GL functions used
in the source.4gl file. If a function is called twice with a different number of param-
eters, a warning will be issued. Using the -W all turns both unused and return on.
Use -o out.42r to instruct the compiler to call the linker after compilation of all the
source.4gl files to create the P-code executable named out.42r.
To display the version number of the software, specify the -V option. After
displaying this information the program exits without compiling.
The -E option list the 4GL libraries used when linking the compiled source.4gl to the
P-code executable out.42r. After displaying this information the program exits
without compiling.
When using the -O (letter O) option, the compiler will optimize the size of the
resulting P-code executable. Use this option only if you are using the -o out.42r flag.
When enabling this optimization, the compiler removes unused 4GL functions from
the resulting .42r file. This behavior may lead to the following error at execution
time, when the call to the 4GL function is issued by a C function:
ERROR(-1338):The function '<name>' has not been defined in any
module in the program.
To prevent the 4GL P code linker removing functions only called in C functions and
not from 4GL modules, you can add a dummy 4GL function containing calls to the
4gl functions used by the C modules.
Examples
The following command compiles the file source.4gl into the object module
source.42m:
fgl2p source.4gl
fgl2c
To see all available options for this command, execute with the -h argument.
The fgl2c command reads source.4gl files and creates a compiled version of each,
with the name source.42o. You can specify any number of source files, in any order.
You can also link the source files together after compilation to create a C-code
executable.
Warning: Some UNIX systems limit the maximum command line length and can
create unexpected errors with very long command lines.
If an error or warning occurs during compilation, the compiler creates a file called
source.err. Look in source.err to find where the error or warning occurred in your
code. If you specify the -M option, errors and warning messages will be sent to the
screen instead of in a file.
You can use the -W option with wopt in unused, return or all. When using the -W
unused flag with the compiler, a warning will be displayed for every definition of an
unused variable in source.4gl file. Check your code to remove such variables. The
flag -W return forces the compiler to check the number of returned parameters for
every 4GL functions used in the source.4gl file. If a function is called twice with a
different number of parameters, a warning will be issued. Using the -W all option
turns both unused and return on.
Use -o out.42e to instruct the compiler to call the linker after compilation of all the
source.4gl files to create the c-code executable named out.42e.
To display the version number of the software, specify the -V option. After
displaying this information the program exits without compiling.
The -E option lists the 4GL libraries used when linking the compiled source.4gl to
the C-code executable out.42e. After displaying this information the program exits
without compiling.
You can specify the type of the database interface library used to communicate with
your database server with the -d dblib option. dblib usually corresponds to the
version of Informix-ESQL/C installed. The -d dblib option is set by default to work
with Informix 4.10 libraries. The possible values for dblib are:
If you set in your environment the variable FGLDBS to one of these values you do
not need to use the -d dblib option. However, the -d dblib flag will override the
environment variable if it is used in the command line.
You can choose the external linker used to link the compiled source.4gl files together
to the C-code executable, with the -sh program option. You can use either the
Informix-Esql/C compiler or the Informix-C4GL compiler. It is strongly recom-
mended to use the latest Informix-Esql/C compiler available from Informi-Client
SDK. For example to use the esql compiler specify the option -sh esql.
You can also send extra option flags required by the linker used to create the c-code
executable. To tell to the compiler to ignore these options and to only send them to
the linker use the -add other with other as the list of options. As an example, to create
a statically linked c-code executable use:
-add static
To only preprocess the file source.4gl in order to get only the resulting C language
source file named source.42c without compiling it, use the -p option.
To preprocess and compile the file source.4gl use the -c option. Compiling the file
source.4gl creates an object file named source.42o.
If the Informix-Client SDK 2.01 (or later) is used to link the 4GL source files, you
can enable the Global Language Support (see Appendix C, “Global Language
Support”) using the -gls option.
To display the name of the default tool used to link the compiled modules, the list of
the default flags sent to this tool and the list of the linked libraries with the modules
to create the C-code executable, use the option -E.
Examples
The following command compiles the file source.4gl into the object module
source.42o:
fgl2c -c source.4gl
fglcomp
The command fglcomp is the basic 4GL source compiler. This compiler is used by
the fgl2c and fgl2p tools.
To see all available options for this command, execute with the -h argument.
The compiler can generate both C code and P code from a 4GL source file. Default
is P code generation. Use the -C option to create C code.
Warning: This option will no longer be supported in version 4 of the Four J’s BDL
Compiler.
To display the version number of the software, specify the -V option. After
displaying this information the program exits without compiling.
fgllink
To see all available options for this command, execute with the -h argument.
This command may be used to link P-code object modules resulting from the compi-
lation of 4GL modules with fgl2p or fglcomp. You can either create a P-code library
or a P-code program (if one of the module includes the definition of the MAIN
function). A P-code library has a .42x file name extension, as a P-code program has
a .42r extension. You may prefer to use the fgl2p wrapper with the option -o instead
of using fgllink.
To specify the name of the P-code program or library, use the -o option. This option
must be followed by the name of the program or library to create.
You must give the list of .42m P-code modules you want to link together to create
the program or the library.
When using the -O (letter O) option, the compiler will optimize the size of the
resulting P-code executable. When enabling this optimization, the compiler removes
unused 4GL functions from the resulting .42r file. This behavior may lead to the
following error at execution time, when the call to the 4GL function was issued by a
C function:
ERROR(-1338):The function '<name>' has not been defined in any
module in the program.
To prevent the 4GL P code linker from removing functions only called in C functions
and not from 4GL modules, you can add a dummy 4GL function containing calls to
the 4gl functions used by the C modules.
To display the version number of the software, specify the -V option. After
displaying this information, the program exits without linking.
Example
The following command links the two compiled modules mod1.42m and mod2.42m
and the library lib1.42x to create the myprog.42r program.
fgllink -o myprog.42r mod1.42m mod2.42m lib1.42x
The following command creates a P-code library from two compiled P-code
modules:
fgllink -o mylib.42x mod1.42m mod2.42m
fglform
To see all available options for this command, execute with the -h argument.
The fglform command reads source.per form specification files and creates a
compiled form file called source.42f.
where form-name is the name of the form specification file with or without the .per
extension. If the compilation is successful, fglform creates a compiled form file
called form-name.42f. If not, fglform instead creates a file named form-name.err.
Look in form-name.err to discover the compilation errors. Make corrections in the
file form-name.per and recompile.
To display the version number of the software, specify the -V option. After
displaying this information, the program exits without compiling.
When compiling a form, fglform sends the following message to the error output:
'form-name.per' form compilation was successful.
If you are using references to database fields in a form specification file, you need the
database schema file. Use the fglschema tool to generate this file.
fglschema
To see all available options for this command, execute with the -h argument.
The fglschema utility extracts schema information from your database and generates
ASCII schema files. The column types are stored in dbname.sch, the validation rules
are in dbname.val and the attributes in dbname.att. These schema files are required
when you want to compile form specification files that include references to database
fields or 4GL modules containing statements as DEFINE ... LIKE and VALIDATE.
Attributes and validations rules are defined with the Informix upscol utility. These
attributes and validations are stored in the dbname.att and dbname.val files.
The FGLDBPATH environment variable can be used to define the path to the direc-
tories containing database schema files.
To create the schema files, run fglschema followed by the name of your development
database.
To display the version number of the software, specify the -V option. After
displaying this information the program exits without creating schema files .
• When using fglschema with the -c option BOOLEAN, INT8 and SERIAL8
are converted to CHAR(1) and DECIMAL(19,0) respectively.
• ROW, LIST, MULTISET and SET types are not supported. When
fglschema detects an unsupported data type, a warning is displayed and by
default the table definition is not written to the schema file. This would
result in compilation errors when using instructions as “DEFINE r
RECORD LIKE table.*”. However, you can use the "-r" flag to force
fglschema to write the table definition without the columns created with
unsupported data types.
fgldbsch
The fgldbsch utility is the equivalent to fglshema except that fgldbsh supports
various database servers such as Oracle, DB2, SQL Server. Refer to fglschema
description for generated files.
To see all available options for this command, execute with the -h argument.
fglmkmsg
The fglmkmsg utility converts ASCII source files that contain user messages into a
format that 4GL programs can use at runtime.
The format of the ASCII source file must be the same as the one used by the
Informix-4GL mkmessage tool. The structure of the message source file is as
follows:
.num
message-text
where .num is a period followed by an integer and message-text is the text of the
message, one or more lines. This file can contain as many messages as you need.
Each help message should be preceded by a line with nothing on it but a period (in
the first column) and a unique integer num. This number will be used to identify the
help message in your 4GL programs. The messsage-text starts on the next line and
continues until he next number line. Each line must end in a RETURN.
Lines beginning with # are considered comment lines, and are ignored by fglmkmsg.
Where input-file is an ASCII message source file and output-file is the pathname of
the compiled message file.
The 4GL program looks for the appropriate help message in the help file that you
specify in an OPTIONS statements, using the HELP FILE potion. You can have
several help files, but only one can be in effect at a time.
ar42o
This tool creates C-code archives from 4GL modules compiled into C-code. After
you compiled a 4GL module source.4gl into C-code you get the compiled module
source.42o. If you have more than one module, you may then create an archive and
use it as a library holding commonly needed subroutines. To be able to use ar42o
your development system must have the ar tool installed.
This tool can pass options to the ar library archiver, refer to the ar man page of your
system.
To display the version number of the software, specify the -V option. After
displaying this information, the program exits without linking.
findlib.sh
This script searches for Informix software configurations in order to create two shell
scripts ( one in Bourne shell and one in C shell syntax ) that setup the environment
variables needed to compile 4GL applications into P-code or C-code and to create a
P-code runner.
Tip: It is often easier to use the tool fglmkrun with the option -sh esql, if you have a
recent version of Informix Esql/C or Informix CSDK than to use findlib.sh.
The option -V returns the version number of the findlib.sh tool and exits.
With option -l, findlib.sh searches for the needed libraries, tools and options to create
a P-code runner or to compile 4GL applications in C-code. This is the default
behavior.
Additionally you can specify the option -o runner to create a default P-code runner.
The name of the created P-code runner will be the one specified after the -o option.
By default the findlib.sh tool uses the Informix c4gl, esql or cfglgo tools to create P-
code runners or to compile 4GL applications into C-code. You can force the
findlib.sh to use another tool with the option -sh. The name of the tool should be
specified just after the -sh option. Findlib.sh can bypass the call of these tools with
the option -max. In this case findlib.sh will try all possible combinations of the
libraries to create a P-code runner or a C-code application.
When you ask for the creation of a runner with the -o option, you may also force the
use of static libraries or shared libraries if they are available. To use static libraries,
use the -tl static option. If you want to create a P-code runner using shared libraries
use the option -tl shared. You can use the -tl option only if the Informix-Esql/C 7.x
(or later) is installed on the development system. You can also ask the findlib.sh tool
to pass optional parameters that are used by the fglmkrun script. All given param-
eters should be between double quotes (“). Without -sh, findlib.sh find and try to
create a p-code runner with the different tools available. For example, if you want to
create a P-code runner with GLS:
findlib.sh -optrun "-gls"
The two shell scripts created are named envcomp ( for Bourne Shell) and
envcomp.csh (for C Shell). You need to execute one of them in your current shell. For
example, with a Bourne Shell use the following Unix command line:
$ . ./envcomp
Note that it is a period followed by a blank character, another period, a slash and the
name of the shell script that need to be executed. The shell script should be in the
current directory when you issue this command.
The answer of this command should be the directory where the compiler is installed.
SCO Open Server users may also use the -bElf flag to force the use of “-b elf” by the
C compiler. This can create troubles at compilation time and at runtime. You are
strongly advised not to use this option, unless you really know what you are doing.
Configuration Tools
The following table lists tools that aid in configuration.
Filename Description
fglmode Tools mode selector (ASCII/GLS) and tools version number checker.
fglmode
This shell allows the developer to switch between the GLS enabled version of the
compiler and the ASCII only version. For more about GLS refer to the Appendix C,
“Global Language Support”.
The files, either from the gls directory or from the ascii directory, will be linked in
the $FGLDIR/bin directory by the fglmode tool. It can also link a P-code runner if
any. The p code runners are assumed to be named as specified by the $FGLRUN
environment variable, with fglrun as default. If no P-code runner is found, a warning
message will be displayed explaining how to build it.
This shell will only be installed when the gls and ascii directories do exist in
$FGLDIR/bin. That means that it will only be installed if the system supports the
GLS enhancements. In fact, if the INFORMIX libraries featuring the GLS exits for
the platform.
• The -v option will list the version number of all other Four J’s tools
installed.
• If this command is executed without a parameter, the currently used version
will be displayed, and you will be asked if you want to switch to another
one.
• The integrity of the links will be checked before updating to prevent having
links to gls and to ascii at the same time (for example, fgllink pointing to gls
and fglcomp to ascii)
• The existence of all the executables will be checked in both directories gls
and ascii
• If you type fglmode --mode GLS, or fglmode --mode ASCII, then the
switch will be made.
•• --mode GLS means that the GLS version is expected
•• --mode ASCII means that the ASCII is expected
If the runner is not built, the switch will be made anyway, but you will be
asked to build it with the relevant shell and libraries.
• If you type fglmode --mode GLS (or ASCII) and it is already in GLS (or
ASCII) mode, you will be told that you are already in the chosen mode
• If the integrity of the links is not valid, you will be informed and the changes
will be made (if possible) as expected.
• If the integrity of the existing links is not valid, and it is not possible to
repair, an error will occur (in the same way as when something is missing in
the expected version).
licencef4gl
The tool licencef4gl is used for an easy installation and reinstallation of the license.
A license defines the number of allowed simultaneous users and whether compilation
of 4GL modules is allowed or not.
This tool must be run by the owner of the files located in the $FGLDIR directory.
If the installation number key was not entered during the installation process, this can
be entered using the option -k key where key is the installation number key received
from your reseller. This procedure must be done during the 30 days following the
original installation
$ licencef4gl -k XXXXXXXXXXXX
To stop all running 4GL applications you canuse the -i option. Using the -i option
removes all internal data located in the$FGLDIR/lock directory and resets the
number of currently connected users to 0.
fglfontsel, fglfontsel.42e
fglfontsel is a 4GL application selecting the font for the X11 graphical front-end.
This application is provided in a P-code and a C-code version. To start it using P-
code, run the fglfontsel shell script , to run it using C-code execute fglfontsel.42e.
You can either execute it in graphical or ASCII mode. To execute it in ASCII mode
set the environment variable FGLGUI to 0 (zero) before running the command.
$ FGLGUI=0
$ export FGLGUI
$ fglfontsel
The application will list all available fonts on the system. It will then save your choice
in a file named .fgl2crc and store this file in the home directory of the current user.
Now 4GL applications started in graphical mode using the X11 frontend by this user
will use the selected font.
Filename Description
rtsinstall P code environment setup program (compiles libs and tools to P code)
fglinstall C code environment setup program (compiles libs and tools to C code)
fglpager Script to start the graphical editor used to display reports (P-code version)
rtsinstall, fglinstall
The rtsinstall and fglinstall shell scripts are only available in the development
version of the compiler. Both can be automatically executed by the installation
program, if required by the user. These tools compile all messages files, 4GL libraries
and additional tools like fglpager and fglfontsel. rtsinstall prepares a P-code
environment and fglinstall prepares a C-code environment. The 4GL source code of
the libraries and tools are located in the $FGLDIR/src and the message files are stored
in the $FGLDIR/msg subdirectories. If you change one of these files, you can easily
recompile everything with either the rtsinstall or the fglinstall command depending
on whether your applications are to be compiled in P-code or C-code
fglpager, pager.42e
The fglpager and the pager.42e are 4GL applications provided to scroll forwards and
backwards in report output redirected to the screen. Reports using more than 80
columns can be scrolled horizontally. The correct sizing of the vertical scrollbar
requires a PAGE TRAILER. To manage interruption of the display, the int_flag has to
be tested after every OUTPUT TO REPORT instruction. The pager.42e command
starts the graphical editor used to display reports in C-code. The fglpager command
starts the graphical editor used to display reports in P code.
The pager can be used from the UNIX prompt for the C version:
$ pager.42e [filename]
The fglpager command has the same functionality as pager.42e except that:
• If you do not allow the pager to use a database, the user can only scroll 10
pages backwards. To have unlimitted scrolling, the pager needs a database
name as parameter -d dbname to create temporary tables. Additionally, you
must call fgl_report_use_temptable() in the 4GL program before starting
the report. Otherwise, you can see only 10 pages backwards.
• If you execute the report with FGLGUI=0 ( i.e.: In ASCII mode ), the pager
will display all the report without stopping after each page.
To close the pager window, you have to click the STOP button. Pressing the STOP
button will not send the interruption signal but will set the int_flag variable to true.
This is for backward compatibility with older version of the pager.
fglX11d
This is the command to start the graphical deamon of the X11 front-end.
fglWrt
The fglWrt tool is called by the licencef4gl program when installing or updating a
license. Normally you should use the licencef4gl tool instead of using fglWrt.
To display the license currently installed on a product, use the fglwrt -a see
command.
Sometimes, because a 4GL application was not stopped cleanly, the compiler may
think that the application is still running. This may prevent users starting a new 4GL
application if the maximum user count has been reached. To reset the number of users
currently connected without stopping the currently running 4GL application, use the
command fglwrt -u.
Language Extensions
5
In This Chapter . . . . . . . . . . . . . . . . . . . . 5-5
Integer Expressions as Character Subscripts . . . . . . . . . . . 5-6
Integer Expressions as Array Indexes. . . . . . . . . . . . . . 5-6
Channel Extensions . . . . . . . . . . . . . . . . . . . 5-6
Initializing Channel Extensions . . . . . . . . . . . . . . 5-7
Opening a File . . . . . . . . . . . . . . . . . . . 5-7
Opening a Pipe . . . . . . . . . . . . . . . . . . . 5-8
Setting the Default Separator . . . . . . . . . . . . . . . 5-9
Reading Data from an Opened Channel. . . . . . . . . . . . 5-9
Writing Data to a Pipe or Stream . . . . . . . . . . . . . . 5-10
Closing the Channel . . . . . . . . . . . . . . . . 5-11
Channel Error Codes . . . . . . . . . . . . . . . . . 5-11
For example:
MAIN
DEFINE s CHAR(10)
LET s=”My String”
LET s=s[1,LENGTH(s)-1]
DISPLAY s CLIPPED
END MAIN
For example:
MAIN
DEFINE a ARRAY[10,50] OF CHAR(10)
DEFINE x INTEGER
DEFINE y INTEGER
LET x=2
LET y=15
LET a[x+1,y+3] = “aaaa”
DISPLAY a[x+1,y+3]
END MAIN
Channel Extensions
Channel extensions provide access to the system, files and processes, without using
the RUN statement. With channel functions rather than the RUN statement, the appli-
cation requires fewer resources and allows communication through pipes with other
applications.
All the functions, except USE channel, are prefixed by channel:: to indicate that they
belong to the channel class.
In the section “Sharing Information Using DDE” on page 5-9, there are examples that
illustrate the use of the Dynamic Data Exchange (DDE) functions.
Returns None
This statement must be located before the MAIN clause in the source code. For
example:
USE channel
MAIN
…
END MAIN
Opening a File
The following function opens the file specified by filename and prepares the file
for reading or writing, as specified by oflag:
Returns None
The filename is assigned to the handle that will be called for the different operations
on the opened channel. For example:
CALL channel::open_file("stream", "fglprofile", "r")
Opening a Pipe
The following function opens the pipe specified by command and prepares the pipe
for reading or writing, as specified by oflag:
w Write mode
Returns None
The command is assigned to the handle called for the different operations on the
opened channel. For example:
CALL channel::open_pipe("pipe", "ls -l", "r")
Because channel read/write functions are the same as those used by LOAD/UNLOAD
functions, the default separator is defined by the DBDELIMITER environment
variable. The default value is the | (pipe) character. If delimiter="" (empty
string), no delimiter is used. For example:
CALL channel::set_delimiter("pipe",",")
buffer-list List of variables, if you use more than one variable, you
must enclose the list in brackets ([ ])
Returns SMALLINT TRUE if data has been read from handle; FALSE if an
error occurs
The following examples show this function. The first example shows a read function
return value in a variable buffer.
DEFINE buffer CHAR(128)
CALL channel::read("pipe_handle", buffer) RETURNING ret
The second example shows a read function returning data in a simple array:
DEFINE buffer ARRAY[1024] of CHAR(128)
DEFINE I INTEGER
LET I = 1
WHILE channel::read("pipe_handle", buffer[I])
LET I = I + 1
END WHILE
Returns None
The storage buffer can be a single variable, a simple array, a record, or a string
between double quotes (“). For example:
CALL channel::write("handle", "hello world")
Syntax channel::close(handle)
Returns None
With this new extension, you can invoke a Windows application and send or receive
data to or from it. To use this new functionality, the program must be executed on a
Windows PC or on a UNIX workstation but only from the Windows Client.
Important: The tcp communication channel (socket) between the 4GL application
and the graphical server must be established with a display (OPEN WINDOW,
MENU, DISPLAY AT) before using the DDE functions.
1. The 4GL application sends to the Windows Front End the DDE order using
the TCP/IP channel.
2. The Windows Front End executes the DDE order using the Tcl/Tk functions
and sends the data to the Windows application through the DDE communi-
cation process.
3. The Windows application executes the command and sends the result,
which can be data or an error code, to the Windows Front End.
4. The Windows Front End sends the result to the 4GL application using the
TCP/IP channel.
Figure 5-1 illustrates this process.
Figure 5-1
DDE 4GL Process
Windows Application
To start a Windows application on the client side, use the winexec function.
Returns TRUE if the command has been successfully executed; FALSE if the
command has encountered an error (You see the error using the DDE-
Geterror function.)
This program can be a macro or any other command available in the calling program.
For example:
LET command = "EXECUTE(\\\"macro1.xlm!Save1\\\";FALSE)"
CALL DDEExecute("EXCEL", "Document1", command ) RETURNING ret
For example:
LET val="12\\t13\\t14"
CALL DDEPoke("EXECEL", "Document1", "R1C1: R2C2", val) RETURNING ret
Each value retrieved by the function is separated by the tabulation character. The
newline character is changed to the ASCII 13 character. For example:
CALL DDEPeek("EXCEL", "Document1", "R1C1:R2C2") RETURNING ret
For example:
CALL DDEFinish("EXCEL", "Document1") RETURNING ret
Important: All DDE functions described above must always be called with the
program name and the document name. Those names define the DDE connection.
Syntax DDEFinishAll()
For example:
CALL DDEFinshAll() RETURNING ret
Syntax DDEGeterror()
Returns Error message for the current error or NULL for no error
For example:
CALL DDEGeterror() RETURNING mess
Important: The trigger BEFORE ROW is executed before BEFORE DISPLAY, whereas
AFTER ROW is executed before AFTER DISPLAY.
Syntax fgl_getkey()
--#CALL fgl_init4js()
--#LET key = fgl_getkey ()
IF key = 116 THEN
--#CALL fgl_winmessage("fgl_winmessage", "You have pressed T", "info")
END IF
END MAIN
If you press T, you receive the message that Figure 5-2 shows.
Figure 5-2
fgl_winmessage
Window
This function can be used in association with the fgl_keyval() function of 4GL. The
following table shows the values returned by the fgl_getkey function.
2000 Up Arrow
(1 of 2)
2008 Help
2011 Interrupt
2012 Home
2013 End
2016 Accept
4003 DEL
(2 of 2)
Syntax uiInkey()
The filter source files contain two sections, an output section and an input section.
The output section contains the conversion table for the characters going to the output
device (the screen). The input section contains the conversion table for the characters
coming from the input device (the keyboard).
In this syntax, command is a string or variable that contains the commands to be run.
The UNIX terminal will be raised and activated and then lowered later, when the
parent program finishes.
Running this function correctly requires the termcap entries hp (for raising the
terminal) and rp (for lowering the terminal). For the Windows front end terminal
emulation, the entries should have the values:
:hp=\E[0y:rp=\E[1y:\
where
Example:
LET var = WinExec("C:\\\\EXCEL\\\\EXCEL.EXE")
This line starts excel.exe on the Windows PC running the front end.
Four back slashes are needed as escape characters to transmit one to the client
computer.
Important: The tcp communication channel (socket) between the 4GL application
and the graphical server must be established with a display (OPEN WINDOW,
MENU, DISPLAY AT) before using the WinExec function.
Syntax fgl_buffertouched()
The following source code tests if an update must be made after an input only on the
last field. If something has changed during the input, a dialog box will be displayed
that asks you if you want to accept the input. If not, a message appears informing you
that nothing has to be done.
MAIN
DEFINE answer, CHAR(100),
inst RECORD
c1, c2, c3, c4, c5, c6, c7, c8, c9, c10 CHAR(100)
END RECORD
--#CALL fgl_init4js()
OPEN WINDOW w1 AT 1,1 WITH FORM "demo"
LET answer = "no"
The first screen displays the form with ***** as the default value, as Figure 5-3
illustrates.
Figure 5-3
Default Value
Screen
If you exit the input without updating the row, the dialog box that Figure 5-4 shows
appears and informs you that no changes to the row have been made.
Figure 5-4
Exiting Without
Update Screen
If something has changed during the input, the dialog box that Figure 5-5 shows
appears.
Figure 5-5
Prompt for
Accepting
Changes
Syntax fgl_dialog_getfieldname()
Syntax fgl_dialog_getbuffer()
Syntax fgl_dialog_setbuffer(var)
var Value or variable containing the value to be set in the current field
Returns None
The following example creates a display array with two on key options. When you
press F4, the 100th row of the program record is displayed at the fifth line of the
screen array, and when you press F5, the 400th row of the program record is displayed
at the first line of the screen array.
MAIN
DEFINE a ARRAY[500] OF RECORD
c1 CHAR(10),
c2 CHAR(12),
c3 char(10)
END RECORD
DEFINE i INTEGER
--#CALL fgl_init4js()
FOR i = 1 TO 500
LET a[i].c1 = i CLIPPED
LET a[i].c2 = "555-666-" CLIPPED, a[i].c1
LET a[i].c3 = "Washington"
END FOR
OPEN WINDOW w1 AT 1,1 WITH FORM "demo"
CALL SET_COUNT(i)
DISPLAY ARRAY a TO scr.*
--#ON KEY(f4)
--#CALL fgl_dialog_setcurrline(5,100)
--#ON KEY(f5)
--#CALL fgl_dialog_setcurrline(1, 400)
END DISPLAY
CLOSE WINDOW w1
END MAIN
After executing the program, an array appears with four buttons on the right side of
the dialog box, as Figure 5-6 shows. Accept and Interrupt are created automatically
by the program due to the fglprofile configuration.
Figure 5-6
setcrline Dialog
Box
If you press F4 or click the 100th button, the screen array that Figure 5-7 shows is
displayed with the fifth row being current in the screen record displaying the 100th
row from the program array.
Figure 5-7
setcrline Dialog
Box
Now press F5 or click the 400th button. The form is displayed with the first row being
current and containing the 400th row of the program array.
Returns None
If this option is not used, the application displays a warning message when then user
is trying to close the application window.
Terminating Applications
This option defines the function that must be called when the application receives the
SIGTERM signal.
Returns None
If this statement is not called, the program is stopped with the exit value of SIGTERM
(15).
• the console window that the 4GL program was started from is closed
• the current user session is terminated (i.e. the user logs off)
• the system is shut down
Tip: You can stop the program in a clean manner using ROLLBACK WORK. However,
this does not have any user interaction.
Syntax:
RUN command [IN (FORM|LINE) MODE] [RETURNING variable]
[WITHOUT WAITING]
The terminal mode may be controlled with the FORM/LINE MODE option of the
RUN command when running programs that may or may not be interactive.
In FORM MODE, the terminal is in raw mode, so each character is available to the
program as it is read, rather than becoming available when the newline character is
typed (cooked mode).
After a RUN with FORM MODE option, the program remains in FORM MODE if
it is currently in FORM MODE, but it does not enter FORM MODE if it is currently
in LINE MODE.
After a RUN with specified LINE MODE option, the program remains in LINE
MODE if it is currently in LINE MODE, and it switches to LINE MODE if it is
currently in FORM MODE.
After a RUN with specified FORM MODE option, the program suppresses the
raising of the window which contains the current application. Normally, this raise is
done when user interaction is requested.
After a RUN with specified LINE MODE option, the program raises the window
which contains the current application.
Syntax:
OPTIONS RUN IN ( FORM | LINE ) MODE
Complete example:
MAIN
DISPLAY "something" AT 1,1 -- switch to form mode
RUN "foo" -- switch to line mode: the default
is LINE
DISPLAY "something" AT 1,1 -- switch to form mode
RUN "foo" IN FORM MODE -- keep form mode
RUN "foo" IN LINE MODE -- switch to line mode
OPTIONS RUN IN FORM MODE -- set the default mode to FORM
DISPLAY "something" AT 1,1 -- switch to form mode
RUN "foo" -- keep form mode: the default is
FORM
RUN "foo" IN FORM MODE -- keep form mode
RUN "foo" IN LINE MODE -- switch to line mode
OPTIONS RUN IN LINE MODE -- set the default mode to LINE
(initial value)
END MAIN
• CONNECT
• CREATE PROCEDURE FROM
• DISCONNECT
• EXECUTE IMMEDIATE
• SET CONNECTION
4GL 7.30 also supports the following additional SQL syntax features:
• EXECUTE
The EXECUTE statement now supports the INTO and USING clauses in both
orders:
{ { [INTO varlist1] [USING varlist2] } |
{ [USING varlist1] [INTO varlist2] } }
• FOREACH
The FOREACH statement now supports the WITH REOPTIMIZATION
clause:
{ [USING varlist1] WITH REOPTIMIZATION [INTO varlist2] }
• OPEN
The OPEN statement now supports the WITH REOPTIMIZATION clause:
{ [USING varlist] WITH REOPTIMIZATION }
The non-keyword terms in these SQL statements can be specified as quoted strings or
as character variables.
These SQL statements require an Informix database that recognizes them. When Four
J’s BDL accesses an Informix database earlier than Version 7.x, for example, the
WITH REOPTIMIZATION clause has no effect.
Only a single preparable SQL statement can appear in each SQL block. If you delimit
a preparable SQL statement by the keyword SQL before the SQL statement, and by the
keywords END SQL after the SQL statement, then 4GL 7.30 prepares, executes, and
frees the specified SQL statement when its SQL block is encountered, as in this
example:
SQL
BEGIN WORK
END SQL
Any 4GL variables that appear within an SQL block must be prefixed by the $ symbol.
One or more whitespace characters, such as blank spaces, can appear between $ and
the name of the host variable.
SQL
UPDATE SomeTable
SET (Col2, Col3, ... ColN) = ($rec.col1 THRU $rec.colN)
WHERE CURRENT OF somecursor
END SQL
In the declaration of a database cursor, the following syntax that includes an SQL
statement block within a DECLARE statement is valid:
DECLARE curs CURSOR
SQL
... -- define the SELECT, UPDATE, or INSERT cursor
END SQL
SQL blocks of 4GL 7.30 (and Four J’s BDL 3.0) support both singleton EXECUTE
PROCEDURE statements that return values and singleton SELECT statements that
return values, as in the following examples:
SQL
EXECUTE PROCEDURE someproc(1, $invar) INTO $var1, $var2
END SQL
SQL
SELECT Col1, Col2 INTO $var1, $var2
FROM SomeTable WHERE PKey = $var3
END SQL
Question-mark place-holders (?) in SQL blocks can appear in strings that are
prepared, but not in other contexts. Thus, the following code generates a syntax error:
DECLARE cname CURSOR FOR
SQL
SELECT * FROM SomeWhere
WHERE SomeColumn BETWEEN ? AND ? -- Invalid!!!
END SQL
Trailing semicolon (;) symbols are valid after the SQL statement, but have no effect.
Semicolons that separate two statements within the SQL block cause a syntax
violation error message to be issued by the compiler. This causes the compilation to
fail.
Optimizer directives and comments within delimited SQL statement blocks are
passed to the database server, if you use the standard notation for these features in
Version 7.30 and later Informix database servers. Such directives can immediately
follow the DELETE, SELECT, or UPDATE keywords in SQL data manipulation state-
ments. The plus ( + ) sign must be the first character following the comment indicator
that begins an optimizer directive. The sharp ( # ) symbol is not a valid comment
indicator in this context, but braces ( { } ) or double-hyphen ( -- ) comment indicators
are valid within an SQL block.
Examples of statements of SQL and other 4GL statements and operators that can
specify abbreviated year values include the following:
SELECT * FROM customer_name WHERE call_dtime
BETWEEN (98-01 01) YEAR TO DAY AND DATETIME (04-12 31) YEAR TO DAY
INSERT INTO newtable SELECT dates FROM oldtable WHERE date1 "01/05/24"
PREPARE up_sel FROM 'SELECT * FROM customer WHERE cust_date < "01/01/00"'
DATE()
DEFINE d DATE
LET d = DATE ("02/29/00") ---- default DATE format
LET d = DATE ("00-29-02") ---- format Y2MMDD-
EXTEND()
DEFINE d1 DATETIME YEAR TO MINUTE
LET d1 = EXTEND("02/28/00" YEAR TO MINUTE)
UNITS
DEFINE d1 INTERVAL DAY TO DAY
LET d1 = (DATE("03/01/00") - DATE("02/28/00")) UNITS DAY
WEEKDAY()
DEFINE d1 INT
LET d1 = WEEKDAY("02/28/00")
YEAR()
DEFINE d1 INT
LET d1 = YEAR ("02/28/00")
The CONSTRUCT, INPUT, and INPUT ARRAY statements can assign to variables the
values that the user enters into the fields of the screen form.
You can set DBCENTURY as you would any other environment variable. The valid
settings (and the expansion rule that each specifies) are listed here:
R Prefix the entered value with the first two digits of the current year (from the
system clock-calendar at runtime).
C Prefix the entered value with the first two digits of the past, current, or future
year that gives a date that is closest to the current date (from the system clock-
calendar).
P Prefix the entered value with the first two digits of the past (or current) year
that gives the most recent date in the past.
F Prefix the entered value with the first two digits of a future (or current) year
that gives the earliest date in the future.
For example, on UNIX systems that use the C shell, the specification
setenv DBCENTURY=C
Unless you override DBCENTURY (as described in the next section), 4GL applies the
DBCENTURY value that was in effect when program execution began to all year
values (in DATE or DATETIME fields only) that have fewer than 3 digits; as with
other environment variables, changing the DBCENTURY setting after program
execution commences has no effect on any currently executing 4GL program. The
results of using DBCENTURY are sensitive to the time of program execution and to
the accuracy of the system clock-calendar.
DBCENTURY has no effect on fields that are not of the DATE or DATETIME data
types, nor on DATETIME values that do not include YEAR as its first time unit, nor
on year values that are not abbreviated. It can also affect data-type conversion of
properly-formatted character strings that you assign to DATE or DATETIME
variables.
To avoid expansion of years in the remote past that have only one or two digits, you
must pad such values on the left with leading zeros, so that they have at least 3 digits.
and
field-tag = ship_date, CENTURY = "c"
If CENTURY and DBCENTURY have different settings, then CENTURY takes prece-
dence in the DATE and DATETIME fields that have this attribute.
Just as with DBCENTURY, the results of using CENTURY are sensitive to the time of
program execution and the accuracy of the system clock-calendar.
CENTURY has no effect on fields that are not DATE or DATETIME data types, nor on
DATETIME values that do not include YEAR as the first time unit, nor on unabbre-
viated year values. CENTURY can also affect conversion of properly-formatted
character strings to DATE or DATETIME variables.
CENTURY is not needed for fields that display data from the database (as distinct
from fields in which users enter data), because DATE columns of the database (and
DATETIME columns that include the YEAR time unit) store only 4-digit years, even
if a display field of the 4GL application is designed to show only trailing digits of
YEAR values from the database.
The value that follows the = symbol must appear within quotation marks, like the
setting of the CENTURY field attribute.
Important: Four J’s BDL requires Client SDK 2.30 to support the CENTURY
attribute.This attribute does not run on NT with GLS functionality.
The syntax for the BEFORE INSERT control block of INPUT ARRAY statements is:
INPUT ARRAY ...
BEFORE INSERT statement... { CANCEL INSERT }
Here statement is any statement of 4GL that is valid within a BEFORE INSERT control
block of INPUT ARRAY.
If CANCEL INSERT is specified, the user is prevented from entering rows by using
the Insert key. This feature also prevents the user from entering rows by moving the
screen cursor past the last initialized row by using an ARROW key, TAB key, RETURN
key, or (in Four J’s BDL) the ENTER key.
This example disables the Insert key for the third row only.
Suppose that it contains five rows filled with data. If the cursor comes to the
third (populated) row and F1 is pressed, a new row is not inserted, because
CANCEL INSERT prevents any Insert operation for this row.Case 2: Only
some of the rows are filled with data.
Suppose that only two of a possible five rows contain data. In this case, the
user cannot move to the third row using the ARROW, TAB or RETURN key,
because CANCEL INSERT prevents any Insert operation for this row.
For more information about CANCEL INSERT, see “CANCEL DELETE
Keywords” on page 5-38.
The syntax for the BEFORE DELETE control block of INPUT ARRAY statements is:
INPUT ARRAY ...
BEFORE DELETE statement... { CANCEL DELETE }
Here statement is any statement of 4GL that is valid within a BEFORE DELETE
control block of INPUT ARRAY.
As an example, the programmer might want to implement a system where the user is
allowed to delete all but one of the rows, but once a row is deleted, a replacement row
cannot be inserted in its place. The following code implements this design:
DEFINE n_rows INTEGER
DEFINE arrayname ARRAY[100] OF RECORD
...
BEFORE INSERT
CANCEL INSERT
BEFORE DELETE
LET n_rows = n_rows - 1
IF n_rows <= 0 THEN
CANCEL DELETE
END IF
END INPUT
When INSERT ROW = FALSE is specified, the user cannot perform any Insert actions
within the INPUT ARRAY statement.
For additional information about the INSERT ROW attribute in INPUT ARRAY state-
ments, see “DELETE ROW Attribute” on page 5-39.
When DELETE ROW = FALSE is specified, the user cannot perform any DELETE
actions within the INPUT ARRAY statement.
When INSERT ROW = TRUE or DELETE ROW = TRUE is specified, then the user is
not prevented from performing the action for which TRUE is specified.
The default in both cases is TRUE, which corresponds to the legacy behavior of
previous 4GL releases.
Here var is a variable that contain a Boolean value. If the value of var is zero or
FALSE or NULL, then the value of the attribute is FALSE. For other values of var (or
by default, if no value is specified) the value of the attribute is TRUE.
The following example disables Insert and Delete operations on rows of the screen
array:
INPUT ARRAY arrayname WITHOUT DEFAULTS FROM s_array.*
ATTRIBUTE(INSERT ROW = FALSE, DELETE ROW = FALSE)
For both DISPLAY ARRAY and INPUT ARRAY, the ATTRIBUTE clause can include
the following syntax:
CURRENT ROW DISPLAY = "string"
Here string is a comma-separated list of screen attributes. The string can include zero
or more intensity attributes from among the following:
• REVERSE
• UNDERLINE
• BOLD
• BLINK
The string can also include one or none of the color attributes from among the
following:
• BLACK
• BLUE
• CYAN
• GREEN
• MAGENTA
• RED
• WHITE
• YELLOW
These attributes are applied to the current row of the screen array. The content of
string is not case-sensitive.
The rows other than the current row in this array are displayed in bold and underlined,
but the current row is displayed in red and in reverse video. If there is only one row
in the screen array, then the current row is the only one that is displayed.
COUNT Attribute
The COUNT attribute can specify the number of records within a program array that
contain data. It can appear within the ATTRIBUTE clause of the INPUT ARRAY
statement.
COUNT = { n | var }
Both of these specifications declare the initial/actual number of rows in the program
array to the INPUT/DISPLAY ARRAY instruction.
MAXCOUNT Attribute
The MAXCOUNT attribute can specify the dynamic size of a screen array. This can
be less than the declared size that the INSTRUCTIONS section of the .per file specifies
for the screen array. MAXCOUNT is valid only within the ATTRIBUTE clause of the
INPUT ARRAY statement.
MAXCOUNT = { n | var }
Here x and y are literal integers or integer variables. In this example, y is the number
of records that contain data within the program array. The MAXCOUNT value of x
determines the dynamic size of the screen array that displays the program array.
If MAXCOUNT is specified as less than one or greater than the declared program
array size, then the original program array size is used as the MAXCOUNT value.
Both COUNT and MAXCOUNT can be specified in the same ATTRIBUTE clause:
CALL SET_COUNT(5)
INPUT ARRAY prog_array WITHOUT DEFAULTS
FROM scr_array.* ATTRIBUTE(MAXCOUNT = 10, COUNT = 6)
In this case, the COUNT attribute overrides the SET_COUNT value. The number of
rows displayed will be 6.
where array is the name of the screen array, as declared in the INSTRUCTIONS
section of the form specification. This can appear in the function call as an identifier
enclosed between quotation marks, or as a character variable containing the name of
the screen array.
The following form-specification file (called file.per) declares a screen array that the
subsequent 4GL code example references:
DATABASE FORMONLY
SCREEN
{
[f1 ] [f2 ]
[f1 ] [f2 ]
[f1 ] [f2 ]
[f3 ] [f4 ]
[f3 ] [f4 ]
[f5 ]
}
ATTRIBUTES
f1 = FORMONLY.a ;
f2 = FORMONLY.b ;
f3 = FORMONLY.c ;
f4 = FORMONLY.d ;
f5 = FORMONLY.e ;
INSTRUCTIONS
DELIMITERS ""
SCREEN RECORD s_rec1[3] (a,b)
SCREEN RECORD s_rec2 (c,d)
LET ch = "s_rec2"
CALL fgl_scr_size(ch) RETURNING n2
LET n2 = fgl_scr_size(ch) -- Can also be called
-- in a LET statement
DISPLAY "n2 = ", n2
CLOSE WINDOW w1
END MAIN
The proper value is returned, even though the array dimension is not specified.
An error is returned if no form is open, or if the specified screen array is not in the
current open form.
START REPORT
The START REPORT statement, enables you to redefine all the values of the
OUTPUT section of a report so that the destination and dimensions of output from
the report can be specified at runtime.
If you do not use START REPORT to specify these parameters, then the OUTPUT
section values (or default values, if the OUTPUT section omits any specification)
remain in effect, as in previous releases. The syntax of START REPORT is:
START REPORT report
[TO {
SCREEN |
PRINTER |
FILE {"file"|var} |
{"file"|var} |
PIPE [ IN {FORM|LINE} MODE] {"program"|var} |
OUTPUT {"out"|var} [DESTINATION {"trg"|var}]
}
]
[WITH {
TOP OF PAGE = "string" |
PAGE LENGTH = n |
TOP MARGIN = n |
BOTTOM MARGIN = n |
LEFT MARGIN = n |
RIGHT MARGIN = n |
[,...]
}
]
Here n is an integer expression, and each instance of var is a 4GL program variable
whose logical content is the string at the left of the preceding pipe (|) symbol.
Here trg is the name of a file or program to receive the report output from a pipe. If
out has the value SCREEN or PRINTER, then the DESTINATION clause is not needed
(and is ignored, if specified).
The WITH clause supports the TOP OF PAGE = "string" option, which substitutes a
page-eject string for repeated Linefeeds to complete the current page of report output
and begin the next page. See your printer documentation for the appropriate string
value. Only the first character in the string is passed to the printer. (This feature can
reduce the time required to print long reports.)
Example:
START REPORT repname TO OUTPUT string1 DESTINATION string2
WITH TOP MARGIN = 2, TOP OF PAGE = "^L", PAGE LENGTH = 66
Here the caret (^) symbol specifies the CONTROL key; this is in contrast with other
4GL features (for example, the ON KEY clause) that use "CONTROL-" as the notation
to reference the CONTROL key.
If the WITH clause appears, its values override any corresponding parameter that
were explicitly stated in the OUTPUT section of the REPORT definition, or any default
values.
An implication of this feature is that any report can now use either top-of-page
character string processing or repeated blank lines to space to the page, depending on
what was specified when the report is started.
In the right-hand side of the LET statement, or in the argument list of a function call,
the concatenation operator can join two values of any simple data type. It associates
its operands from left to right. Thus, ( a || b || c ) and ((a || b) || c ) are equivalent. Prece-
dence of this operator is higher than LIKE, MATCHES, or relational operators, but
lower than the arithmetic operators.
If either operand is a NULL string, then the returned value is NULL, represented as a
string of zero length. This is in contrast to how LET ignores NULL values within
comma-separated lists, unless every value in the list is NULL. (The NULL and LET
returns from a comma-separated list of NULL values is represented as a single blank
space.)
In LET statements, you can choose between these two methods of treating NULL
values in concatenation by substituting || for comma if you want a NULL string
returned from any concatenation that includes a NULL operand.
is not equivalent to
CALL myfunct (a, b, c)
4GL supports "==" as a synonym for "=" (just as earlier releases have supported "!="
as a synonym for the "<>" operator.
are equivalent.
Four J’s BDL enables you to conserve display space within a 4GL window by hiding
the Comment line. The new syntax that can appear within the ATTRIBUTE clause of
the OPEN WINDOW statement is:
COMMENT LINE OFF
This is supported by both 4GL 7.30 and by Four J’s BDL 3.0. If this is specified, then
the Comment line is hidden for that 4GL window and cannot display messages from
the form specification, even if some fields of a form that this window displays have
the COMMENT attribute.
4GL does not, however, support languages that use right-to-left or bidirectional text
(such as Arabic, Farsi, Hebrew, or Urdu).
Additional details about GLS can be found in the Informix Guide to GLS
Functionality.
The following environment variables can be set to support non-default character sets,
and cultural conventions for the display of numeric, date, and currency data values:
• CLIENT_LOCALE
• DBAPICODE
• DB_LOCALE
• DBNLS
• GL_DATE
• GL_DATETIME
• LANG
• SERVER_LOCALE
SQL identifiers that include non-ASCII characters that the locale of the database
supports can appear within SQL statements in 4GL source code, provided that the
locale of the 4GL client system also supports these non-ASCII characters in its
codeset.
4GL identifiers, data strings, and the values of CHAR, VARCHAR, and TEXT
variables, formal arguments, and returned values can include non-ASCII characters
that the current locale supports.
4GL forms can include locale-dependent characters as text, and fields can support
such characters in data entry and data display operations. For East-Asian locales that
support multibyte characters, this feature is new in Four J’s BDL. If a multibyte string
requires more bytes of storage than the declared size of a 4GL form field, or more than
a segment of a field, then the string is truncated from the right. Any partial character
that might be created by this truncation is replaced by whitespace.
When using a multibyte character set, the storage length (in bytes) can be longer than
the display length of the field in a form. For example, a form field that is declared
LIKE a CHAR(16) database column can hold a string of 16 multibyte characters which
actually occupies at least 32 bytes in the database.
In locales whose codesets include multibyte characters, 4GL does not create partial
characters. In 4GL or SQL operations that attempt to divide a string within a multibyte
logical character, whitespace is substituted for any partial character. Examples of
operations in which whitespace automatically replaces any partial characters include
4GL expressions that include the substring ( [ ] ) operator, truncation of data strings
when they are stored in variables, and data entry into fields of 4GL forms in which
the length (in bytes) of the field is smaller than the length (in bytes) of the data string.
The following built-in functions and operators of 4GL can accept or return locale-
supported non-ASCII (and multibyte) characters, or can process multibyte characters
without creating partial characters:
• CLIPPED operator
• DOWNSHIFT( )
• LENGTH( )
• Substring ( [ ] ) operator
• UPSHIFT( )
• WORDWRAP operator
In Japanese locales, WORDWRAP fields in 4GL forms and in output from reports
perform single-pass kinsoku processing, for characters that the locale file lists as
prohibited from appearing at the beginning or end of a line. If a character that is
prohibited from ending a line appears at the end of a line, it is moved down to the
beginning of the next line. A character that precedes another that is prohibited from
beginning a line can similarly be moved down to the next line. (By single pass is
meant that each line is tested only once. Even if this process results in a line ending
in a forbidden character, no further kinsoku processing is performed.) The locale files
must identify the characters that are prohibited from beginning a line or prohibited
from ending a line.
Important: Four J’s BDL requires Client SDK 2.30 to support these GLS features.
The Four J’s BDL compiler treats the '--#' as whitespace and ignores it, compiling a
call to the fgl_init4js( ) function. 4GL sees the '--' as a comment indicator and treats
the rest of the line as a comment.
4GL 7.30 introduces an analog to this Four J’s BDL feature, providing a notation that
4GL treats as whitespace and ignores, compiling what follows as ordinary code, but
Four J’s BDL sees the line as a comment.
The previous two lines are the logical equivalent to the following logic:
--# IF TRUE THEN
--# OPTIONS HELP FILE "d4gl_help.42h"
--# ELSE
OPTIONS HELP FILE "i4gl_help.iem"
--# END IF
This is much more verbose and makes less clear what is intended.
Conditional comments are supported both in source (.4gl) files and in form specifi-
cation (.per) files. The following example shows a fragment of a form specification
that uses one attribute for the 4GL form compiler, and another for the Four J’s BDL
form compiler:
ATTRIBUTES
f0 = FORMONLY.name, --#char_var ;
--@REVERSE ;
They are also valid within SQL statement blocks but not within the text of a PREPARE
statement.
These symbols are called conditional comment indicators because their effect
depends on whether you compile with the 4GL or Four J’s BDL compiler. Just as with
other comment indicators, they have no special significance within a quoted string.
Conditional comment indicators are treated as whitespace if the compiler does not
treat them as beginning a comment, so the previous example always generates a
compile-time syntax error, because neither 'CALL abc' (using 4GL) nor 'CALL abc
procedure()' (using Four J’s BDL) is valid code. When a conditional comment
indicator is interpreted as beginning a comment, the comment marker '--#' or '--@'
terminates the previous keyword or symbol.
Because "--@" is a new syntax feature of 4GL 7.30, it is treated as a comment symbol
by all previous releases of the 4GL (and Four J’s BDL) compilers, just as "--#" is
treated as a comment symbol in all 4GL releases.
Here is an example of 4GL code that raises a data type conversion error :
# Prerequisite : The database holds a table defined as :
# CREATE TABLE tab1 ( col1 BOOLEAN )
#
DATABASE stores
MAIN
DEFINE vbool INTEGER
LET vbool = ( 1 = 0 )
INSERT INTO tab1 VALUES( vbool )
END MAIN
• fgl_charbool_to_intbool
Converts an Informix Universal Server BOOLEAN value ("t", "f") to a
4GL INTEGER value (TRUE, FALSE). The function returns NULL If
the given value does not match "T", "t", "F" or "f".
• fgl_intbool_to_charbool
Converts a 4GL INTEGER value to a CHAR(1) value to be stored in a
BOOLEAN column of an Informix Universal Server table. The func-
tion returns NULL if the given value is NULL.
On the other hand, when you retrieve a BOOLEAN values from the database, you can
convert that value with the fgl_charbool_to_intbool( ) as in the following example :
# Prerequisite : The database holds a table defined as :
# CREATE TABLE tab1 ( col1 BOOLEAN )
# and fglschema has been executed with the "-c" flag.
#
DATABASE stores
MAIN
DEFINE rtab1 RECORD LIKE tab1.*
SELECT * INTO rtab1.* FROM tab1
IF fgl_charbool_to_intbool( rtab1.col1 ) THEN
DISPLAY "TRUE"
ELSE
DISPLAY "FALSE"
END IF
END MAIN
Warning: If the entry is not defined in fglprofile, the function returns NULL rather
than the default entry.
Example:
DEFINE def CHAR(100)
LET def = fgl_getresource ( "fglrun.defaults")
Warning: Users are free to add custom fglprofile entries but must take care when
choosing the resource names so as not to conflict with standard entries. It is strongly
recommended that custom fglprofile entries start with “custom.*”.
Syntax fgl_getpid()
Form Extensions
6
In This Chapter . . . . . . . . . . . . . . . . . . . . 6-3
List Boxes . . . . . . . . . . . . . . . . . . . . . . 6-4
Buttons . . . . . . . . . . . . . . . . . . . . . . . 6-6
Bitmaps . . . . . . . . . . . . . . . . . . . . . . . 6-11
Check Boxes . . . . . . . . . . . . . . . . . . . . . 6-12
Radio Buttons . . . . . . . . . . . . . . . . . . . . . 6-14
Button Fields . . . . . . . . . . . . . . . . . . . . . 6-15
Combo Box Fields . . . . . . . . . . . . . . . . . . . 6-16
Scrolling Fields . . . . . . . . . . . . . . . . . . . . 6-17
Folder Tabs . . . . . . . . . . . . . . . . . . . . . . 6-17
Form Labels . . . . . . . . . . . . . . . . . . . . . 6-19
Password Fields . . . . . . . . . . . . . . . . . . . . 6-21
6-2 Four J’s Business Development User Guide
In This Chapter
This chapter describes the 4GL language extensions that Four J’s BDL has added to
the form-specification files. Many widgets such as buttons, combo boxes and check
boxes are supported so forms can be displayed with a friendly, graphical user
interface.
List Boxes
Screen arrays in graphical mode are displayed with list box objects. The following
code generates output in graphical mode, as Figure 6-8 shows:
DATABASE formonly
SCREEN {
[f01 ] [f02 ]
[f01 ] [f02 ]
[f01 ] [f02 ]
[f01 ] [f02 ]
[f01 ] [f02 ]
[f01 ] [f02 ]
[f01 ] [f02 ]
[f01 ] [f02 ]
[f01 ] [f02 ]
[f01 ] [f02 ]
}
ATTRIBUTES
f01 = formonly.f01 type char;
f02 = formonly.f02 type char;
INSTRUCTIONS
SCREEN RECORD s_rec[10] (f01,f02)
Figure 6-8
Graphical Mode
Output
If you want the fields to appear on individual lines, add the following string in the
attribute section of your fields in the form-specification file:
options="-nolist"
to match these:
f01 = formonly.f01 type char, options="-nolist";
f02 = formonly.f02 type char, options="-nolist";
You can also make fields appear on individual lines by including the following
setting in your fglprofile file:
gui.workSpaceFrame.nolist=1
This feature can be useful to keep the alignment of fields on forms. The list box
display type does not allow you to configure the colors of the object. The nolist
display type lets you control the color parameters.
Buttons
This section discusses extensions for menu buttons, hot-key buttons, and in-form
buttons.
Menu Buttons
The menu buttons created with the 4GL statements MENU … END MENU are
displayed as rows or columns of buttons. You can access these buttons by using
keyboard shortcuts, as with ASCII 4GL applications, or by clicking them.
To choose the positioning of the button on the screen, use the Menu.style resource
in the fglprofile configuration file, as follows:
For more information about the fglprofile, see Chapter 5, “Language Extensions,”
and Appendix B, “Hints, Tips and Workarounds.”
Hot-Key Buttons
Hot keys that you define in COMMAND KEY or ON KEY statements are displayed in
a separate frame located on the right side of the application. These buttons automat-
ically appear when activated.
To access hot keys, press the corresponding key with the ASCII version of the appli-
cation or click the button with the mouse.
To edit the labels of hot-key buttons, use the following order of precedence, listed
from highest to lowest:
1. The KEY attributes in a field of a .per file. (You cannot change a label with
fgl_dialog_setkeylabel() if the same key attributes are present for a special
key.)
2. The fgl_dialog_setkeylabel() function
3. The KEYS section in a .per file
4. The fgl_setkeylabel function
5. The fglprofile file
Editing fglprofile
The $FGLDIR/etc/fglprofile configuration file contains a section where you can
define the label for each hot key. The name of this resource is:
key."key".text = label
where key is the name of the key (F1, CONTROL-V, …) and label is the label to use on
the button.
For example, the following entry in fglprofile changes the default label of the hot key
F7to the word Zoom:
key.f7.text = "Zoom"
The order of appearance of the hot key in the right frame is defined by the
key."key_name".order resource in fglprofile.
The --# pattern is optional, but if specified, guarantees the compatibility of your
source code with INFORMIX-4GL.
In this example, when the cursor is in the field corresponding to the tag f001 of the
form, the labels of the F10 and F11 hot key buttons will be SEARCH and CLEAR.
• Functions that execute during a dialog with the user; for example, during
INPUT, INPUT ARRAY, or CONSTRUCT.
• Functions that are not specific to the current user dialog.
To retrieve the text associated with a given hot-key for the current open form, use the
fgl_dialog_getkeylabel () function.
If you want to change a label for a specific user dialog, use the
fgl_dialog_setkeylabel() function. Use the following syntax:
fgl_dialog_setkeylabel("key", "label")
To retrieve the text associated with a given hot-key as a global setting, use the
fgl_getkeylabel () function.
If you want to change the label outside a specific user dialog, you must do so before
the beginning of the dialog statement. Use the following syntax:
fgl_setkeylabel(hot_key_name, new_label)
The names of the keys are case sensitive. The names of the keyboard function keys
are in lowercase: f1, f2, f3, and so on. For example:
...
BEFORE INPUT
CALL FGL_SETKEYLABEL ("f4", "About")
INPUT BY NAME f01,f02
ON KEY (f4)
CALL DISPLAY_ABOUT( )
END INPUT
...
The label of the f4 hot-key button displayed by the ON KEY statement will be About.
The user can click the About button displayed on the right side of the application
window or press F4 to execute the DISPLAY_ABOUT function (undefined in this
example).
With these methods, if you set the label to the empty string " ", the buttons will
either disappear from the application window or leave an empty button in the key
frame, depending on a resource in fglprofile.
An empty button does not react to mouse clicks. This behavior is defined in the
fglprofile configuration file with the following resource:
gui.empty.button.visible = 1 The button remains visible but does not
react to mouse clicks. This is the default
value.
gui.empty.button.visible = 0 The button becomes invisible and disap-
pears.
This feature does not influence the behavior of the application, however. Even if a
hot-key button does not appear, the user can execute the action defined by an ON KEY
statement by pressing the corresponding key on the keyboard.
With this example, during the INPUT statement, you can click the two buttons. The
first one will send the CONTROL-A key. This key toggles the insert and overwrite
modes. The second button sends the F1 key.
Bitmaps
To add a picture to a form, create a field tag in the screen section of a form and add
the widget and config string to the attribute definition of the tag. In this case, the
widget parameter must be set to BMP and the config parameter must be set to the
name of the bitmap file to be displayed and to the name of the key to send to the appli-
cation when the bitmap is clicked.
The width of the field tag in the screen section of the form must be at least as wide as
the name of the bitmaps that will be used, or it will not be possible to change them
with the DISPLAY TO statement.
Check Boxes
Check boxes are used for making binary choices. Each check box controls a single
variable. Check boxes in a group are not mutually exclusive options.
In ASCII mode (with the FGLGUI environment variable set to 0), check boxes are
displayed as normal input fields.
Syntax
In form-specification files, check boxes are defined in the same manner as plain
fields but the attribute definition of the field has more options. In the following
example, two check boxes are displayed.
CheckBox 1: CheckBox 2:
[chk01 ] [chk02 ]
}
ATTRIBUTES
chk01 = formonly.chk01, default="str_on"
--# , widget="CHECK", config="str_on str_off str_lab"
;
chk02 = formonly.chk02, default="No"
--# , widget="CHECK", config="Yes No acknowledge"
;
end
The --# sequences are optional and are only designed to preserve compatibility with
INFORMIX-4GL.
In the attribute section of the file, set the widget option to CHECK to use check
boxes.
The config option contains three parameters. The first parameter is the value returned
by the check box when it is activated, the second when it is deactivated and the third
is the label displayed to the right side of the check box.
If you do not specify a default value, the check box is set to a null string.
Important: The length of the string returned by an active check box must be at least
as long as the one returned when it is set to be inactive or the check box will behave
unpredictably. In the example above, the strings for chk02 are “Yes” and “No”, if
these were changed to “Ja” and “Nein” the check box will not work as “Ja” is a
shorter string than “Nein”.
In this example, the field f05 will send key F1 when activated and F6 when
deactivated.
You can also activate or deactivate check boxes in 4GL programs, but only the one
from the key class. In order to activate a check box, use the following statement
(replacing myButton with the name of a check box in the current form):
DISPLAY "!" TO myButton
If you activate a default class check box type outside of an input statement, it will
appear checked but you will be unable to use it.
Radio Buttons
Radio buttons provide a way to select one of several mutually exclusive options. Sev-
eral radio buttons work together to control a single variable.
In ASCII mode (with the FGLGUI environment variable set to 0), the radio buttons
and are displayed as standard Informix fields.
Syntax
The definition of radio buttons uses the same options as that of check boxes. The
following example displays frames that include three radio buttons.
radiobutton:
[rad001 ]
}
attributes
To use radio buttons, set the widget attribute to RADIO. The config option is built in
the following way; the str_one string is returned if the first radio button of the frame
is selected, the str_two string is the value returned for the second button, the lab_one
string is the string used for the label of the first button and lab_two for the second
button.
The value returned by the radio button is a null string if no button is selected in the
frame. It is possible to define a default value for the radio button group.
}
ATTRIBUTES
f08=formonly.f08, class="key", widget="RADIO",
config="F11 {Radio #1} F12 {Radio #2}
F13 {Radio #3}";
In this example, the three choices of the radio button f08 will send F11, F12, or F13.
You can also activate or deactivate radio buttons in 4GL programs, but only the one
from the key class. To activate a radio button, use the following statement (replacing
myButton with the name of a radio button in the current form):
DISPLAY "!" TO myButton
If you activate a default class radio button type outside of an input statement, it will
appear checked but you will be unable to use it.
Button Fields
The button field object is an association between a classical field and a bitmap (bmp
field) on its left side. It is possible to give a value to the field or to click the bitmap
to send a specified key. The bmp fields do not require any changes to the 4GL source
code to be added.
The field definition has two more attribute parameters: widget and config.
The widget parameter should be set to FIELD_BMP to indicate the type of field.
The config string is the name of the bitmap file with a .bmp extension and the name
of the key sent to the application when the bitmap is clicked. The bitmap file must be
in $FGLDIR/bmp or in $FGLDIR/toolbars. The default values are
$FGLDIR/toolbars/combo.bmp for the bitmap file name and F1 for the key. The size
of the bitmap is constant, so a large bitmap will be truncated. For example:
DATABASE formonly
screen {
[bmf001 ]
}
attributes
bmf001 = formonly.bmp_field, widget="FIELD_BMP", config="combo.bmp
Control-q";
The following example defines three fields on a form - the first a normal field, the
second a normal field with an include and the third a Combo Box field.
database formonly
screen {
Normal field : [f001 ]
Normal field with include : [f002 ]
Combo field : [f003 ]
}
attributes
f001 = formonly.field1;
f002 = formonly.field2,
include=("AAA","BBB","CCC","DDD");
f003 = formonly.field3, widget="COMBO",
include=("AAA","BBB","CCC","DDD");
Scrolling Fields
A field shorter than the corresponding program variable can be scrolled during input
if the scroll attribute has been added to its definition in the form file. For example:
This would allow scrolling within the field up to the full length of the variable.
Folder Tabs
Folder tabs allow you to create tabs that display different parts of a form. For
example, you might divide a form for entering information into three subforms that
you can display by clicking a folder tab.
The following example shows how to create folder tabs with two files, demo1.per
and demo1.4gl. The “input” and “input array” options display a form as three
subforms. The input is done through three fields on the first two subforms and the
input array is done on the third subform.
File demo1.per :
DATABASE formonly
SCREEN TITLE "screen 1/3"
{
field 1 [f01 ]
field 2 [f02 ]
}
SCREEN TITLE "Screen 2/3"
{
field 3 [f03 ]
}
SCREEN TITLE "Screen 3/3"
{
Array row 1 [a01 ]
Array row 2 [a01 ]
Array row 3 [a01 ]
Array row 4 [a01 ]
}
ATTRIBUTES
f01 = formonly.f01;
f02 = formonly.f02;
f03 = formonly.f03;
a01 = formonly.a01;
INSTRUCTIONS
screen record scr_arr[4] (a01)
File demo1.4gl:
MAIN
COMMAND "Input"
OPEN WINDOW w1 AT 3,1 WITH 25 rows, 80 columns
DISPLAY FORM frm1
INPUT BY NAME f01, f02, f03
CLOSE FORM frm1
CLOSE WINDOW w1
COMMAND "Exit"
EXIT MENU
END MENU
END MAIN
Form Labels
Form Labels allow you to internationalize 4GL forms by displaying strings dynami-
cally from the 4GL program, with the DISPLAY TO or DISPLAY BY NAME
instructions.
Form Labels are defined by using the same syntax as form fields, with the
WIDGET="LABEL" option in the attribute list.
Example
END MAIN
The following code modifies this example to set the "Last Name" and "First Name"
strings from the 4GL program according to a menu selection.
MENU "Names"
COMMAND "English"
LET L01="First Name"
LET L02="Last Name"
EXIT MENU
COMMAND "Francais"
LET L01="Prenom"
LET L02="Nom"
EXIT MENU
END MENU
END MAIN
Password Fields
Password fields in a form allow entered input to be masked with “*” characters. This
would normally be used to hide the entry of a password from a Windows dialog.
Graphical Extensions
7
In This Chapter . . . . . . . . . . . . . . . . . . . . 7-3
Display Extensions . . . . . . . . . . . . . . . . . . . 7-3
Four J’s Business Development Language Library Initialization . . . . 7-3
Check User Interface Type. . . . . . . . . . . . . . . . 7-4
Checking for Graphical User Interface usage . . . . . . . . . . 7-5
Checking for Windows Client Mode . . . . . . . . . . . . 7-6
Display Extensions
This section describes an initialization function and other functions that relate to
display environments.
Syntax fgl_init4js()
For example:
--#CALL fgl_init4js()
Syntax fgl_getuitype()
For some GUI types, the function performs a network round trip. To improve perfor-
mance, it is NOT recommended that this function is performed inside a loop .
For Example:
DEFINE uitype CHAR(5)
DEFINE i INTEGER
LET uitype = fgl_getuitype()
FOR i=1 TO 100
IF uitype = “CHAR” THEN
...
ELSE
...
END IF
END FOR
Syntax fgl_fglgui()
For example:
MAIN
--#CALL fgl_init4js()
IF fgl_fglgui() = 1 THEN
CALL fgl_winmessage ("Welcome from server to WTK",
"nice to meet you!!", "info")
ELSE
OPEN WINDOW w1 AT 1,1 WITH 5 ROWS, 50 COLUMNS ATTRIBUTE (BORDER)
DISPLAY "Welcome from server to ASCII " AT 2, 5
SLEEP 3
CLOSE WINDOW w1
END IF
END MAIN
Compile this program with the Four J’s BDL compiler and execute it. Figure 7-1
shows the message that appears if you are in ASCII mode for UNIX.
Figure 7-1
Welcome
Message
in ASCII Mode
Tip: If you execute this program with UNIX, be sure to put a SLEEP statement after
DISPLAY so that you can see the message.
Figure 7-2 shows the message that appears if you are in graphical mode.
Figure 7-2
Welcome
Message
in Graphical Mode
Syntax fgl_wtkclient()
The following program tests whether you are using the GUI and, if so, whether you
are using Windows:
MAIN
--#CALL fgl_init4js()
IF fgl_fglgui() = 1 THEN
IF fgl_wtkclient() = 1 THEN
ELSE
END IF
ELSE
END IF
END MAIN
After compiling and executing the program, you have the two windows as in the
fgl_fglgui examples. Figure 7-3 shows the message that you see if you are using an
X-Windows client.
Figure 7-3
Welcome
Message
in Windows Client
Mode
Window-Management Functions
This section describes the extensions that help you manage application windowing.
Example:
…
IF answer = "yes" THEN
IF reduce_flag THEN
--#CALL fgl_setsize(25,80) #normal size
ELSE
--#CALL fgl_setsize(10,50) #reduced size
LET reduce_flag = TRUE #reduced size
END IF
END IF
…
The default title is the program name. To change this title, use the fgl_settitle
function.
Example:
MAIN
DEFINE title CHAR(100),
flag SMALLINT
--#CALL fgl_init4js()
--#CALL fgl_settitle("hello world")
LET flag = TRUE
WHILE flag
PROMPT "Give the new title: " FOR title
--#CALL fgl_settitle(title)
IF TITLE = "#" THEN
LET flag = FALSE
END IF
END WHILE
END MAIN
With this example, enter the new title of the window into the title field and then press
ENTER. To quit this program, press the interrupt key.
Example:
…
INPUT by name f01
BEFORE INPUT
LET LGT = fgl_formfield_getoption("length")
MESSAGE "No more than ",LGT," charaters"
END INPUT
…
var The variable that contains the return value of the function
Example:
MAIN
DEFINE VAR CHAR(20)
CALL fgl_init4js()
OPEN WINDOW hello AT 2,2 WITH 20 ROWS, 50 COLUMNS
ATTRIBUTES(BORDER)
LET var = fgl_window_getoption("name")
DISPLAY "You are in window ",var AT 5,5
SLEEP 3
CLOSE WINDOW hello
END MAIN
Syntax fgl_window_current("name")
Example:
Call fgl_window_current("hello")
Syntax fgl_window_close("winname")
Example:
CALL fgl_window_close("winname")
The following function clears the window called winname even if it is not the current
window:
Example:
CALL fgl_window_clear("winname")
Dialog Boxes
This section describes the extensions that affect dialog boxes.
Figure 7-4
Possible Configuration Message Icons
danger Number of the warning item: a skull with crossbones will appear
each time the pointer enters the corresponding button (on X11 only)
You can put anything in the definition of a button, subject to the following rules:
• If you declare a button with a sentence as the label, you cannot put spaces
between each word, otherwise one button will be created for each word.
• You can declare a maximum of 7 buttons with 10 characters each per call.
Figure 7-5
Message Values
Possible Configuration
Ok or “” Ok or “” Ok or “”
danger Number of the warning item: a skull with crossbones will appear each time
the pointer enters the corresponding button (on X11 only)
The following program shows you how to use the fgl_winquestion function:
MAIN
DEFINE answer CHAR(100)
--#CALL fgl_init4js()
--#LET answer = fgl_winquestion ("Title of the dialog box",
"Question Text", "Yes", "Yes|No|Cancel", "question",1 )
END MAIN
This code produces the dialog box that Figure 7-6 shows.
Figure 7-6
Dialog Box
This code produces the message box that Figure 7-7 shows.
Figure 7-7
Message Box
This code produces the dialog box that Figure 7-8 shows.
Figure 7-8
Dialog Box with
Entry Field
MDI Configuration.
Each 4GL program defines which MDI container it is to be displayed in through
fglprofile settings. Several MDI containers may be created to group 4GL programs.
where “id” is the user defined name for the MDI. If gui.containerName is undefined
or defined as “default”, the 4GL application will be displayed in a Single Document
Interface (SDI) container. By this method, each MDI window is identified by a
unique name.
By default, the toolbar and statusbar configuration is taken from the SDI settings
(gui.toolbar.* and gui.statusbar.*). For more information on these settings see
“Toolbars” on page 7-19 and “Statusbars” on page 7-24.
Specific settings can be defined for each MDI window using the following entries:
gui.mdi.<id>.window.title = “<title>”
This defines whether the container should be closed automatically after the last appli-
cation window has been closed. Default = true.
Toolbars
You can add a toolbar at the top of the screen that contains icons representing hot
keys or menu options. When the buttons are clicked with the mouse, the hot key or
menu option is actioned. A help tip appears when the mouse pointer is positioned
over an icon.
To define the root path to the images used on the toolbar buttons, use the
gui.directory.images entry in fglprofile.
gui.directory.images = “path”
Entry Description
gui.directory.images defines where the images for the toolbar are stored.
Defaults are:
$WTKDIR\images\ for the Windows client
$FGLDIR\images\ for the X11 client
Following this line, add any or all of the following toolbar configuration entries:
gui.toolbar.size = {“small”|“medium”|“large”}
gui.toolbar.button.width = <integer>
gui.toolbar.style = {“relief”|“flat”}
gui.toolbar.showTexts = {true|false}
These entries define the toolbar itself and are defined as follows:
Entry Description
gui.toolbar.size Defines the size of the toolbar buttons and the subdirectory where
the images are to be found.
“small” = 16X16 pixels, images are found in
gui.directory.images/small
“medium” = 32X32 pixels images are found in
gui.directory.images/medium
“large” = 48X48 pixels images are found in
gui.directory.images/large
Default is “small”
gui.toolbar.style Defines the style of the toolbar. Options are “relief” or “flat”
Default is “relief”
gui.toolbar.showtexts Indicates whether button labels are visible. Options are True or
False.
Default is False
After the toolbar configuration entries, add the entries to configure the individual
buttons on the toolbar. All these entries are in the format:
gui.toolbar.<n>.*
(The following two entries are mutually exclusive - coding both will give unpre-
dictable results).
gui.toolbar.<n>.text = “<menuoption>”
gui.toolbar.<n>.key = “<hotkey>”
Element Description
.label = "string" Defines the text which is shown below the image
on the toolbar button. If this is not defined, the
default label is the text of the .text or the .key
option.
When setting the text, key or bmp properties to fglSeparator, a space will be
displayed at the given position. fglSeparator allows you to group toolbar buttons.
The following example shows a fglprofile configuration file for a Windows client:
gui.directory.images = “c:/wtkhome/my_pictures”
gui.toolbar.visible = true
gui.toolbar.size = “medium”
gui.toolbar.1.text = "add"
gui.toolbar.1.image.file = "adduser.bmp"
gui.toolbar.1.hidebutton = true
gui.toolbar.2.key = "interrupt"
gui.toolbar.2.image.file = "stop.bmp"
gui.toolbar.2.hidebutton = true
gui.toolbar.3.text = "fglSeparator"
gui.toolbar.3.image.file = "fglSeparator"
gui.toolbar.4.text = "help"
gui.toolbar.4.image.file = "ques.bmp"
gui.toolbar.4.hidebutton = true
This configuration file generates a toolbar with three icons. The first icon activates
the “add” option on the menu. The second icon sends an interrupt signal to the appli-
cation. The third icon, separated slightly from the others, activates the help function.
Statusbars
This section describes how to create a statusbar within an application.
Application and MDI status bars cannot be mixed. When a 4GL application is
displayed in an MDI, no application statusbar is shown, only the MDI statusbar is
visible.
Configuration:
Statusbars are defined in fglprofile. If there are no statusbar entries no statusbar is
displayed - there is no default configuration within the client.
where <pid> is the statusbar panel identifier used by output redirection entries and
position defines the relative location of the panel within the statusbar. Positions start
at 1 from the left and -1 from the right. For instance:
gui.statusbar.panel.p1.position = 1
gui.statusbar.panel.p2.position = 2
gui.statusbar.panel.p3.position = -1
gui.statusbar.panel.p4.position = -2
gui.statusbar.panel.<pid>.width = <integer>
Where “width” is the size of the panel in characters. A zero width causes automatic
sizing.
gui.statusbar.panel.<pid>.bordered = {true|false}
To display information in the statusbar, redirect the 4gl output or the keyboard status
to the panels using the gui.display.* entries. See “Dialog Boxes” on page 7-13
Output redirection.
To redirect the output from a 4GL statement or the keyboard status, use the
gui.display.* fglprofile entries.
gui.display.<source>.destination = “<destination>”
gui.display.<source>.color = “<color>”
gui.display.<source>.image = “<image>”
gui.display.<source>.beep = “{true|false}”
gui.display.<source>.texton = “<texton>”
gui.display.<source>.textoff = “<textoff>”
gui.display.<source>.boxtitle = “<boxtitle>”
gui.display.<source>.boxicon = “<boxicon>”
<source> defines the source of the redirection. Values can be one of:
error ERROR instruction
default Default redirection, e.g. for ERROR it would be the standard 4GL
error line
The following attributes are dependent on <source>. For example, “error” redirection
can use the “beep” attribute but “kbnumlock” cannot.
“color” defines the text color, for instance errors may be displayed in red.
“texton” defines the text for “on” status (especially for keyboard states) e.g. :
“CAPS”, “NUM”, “OVR”
“boxicon” defines the icon displayed in the message box. Values can be one of the
following:
“iconasterisk”
“iconexclamation”
“iconhand”
“iconinformation”
“iconquestion”
“iconstop”
gui.display.formcomment.destination = “statusbar.p2”
gui.display.keycomment.destination = “statusbar.p2”
gui.display.kbcapslock.destination = “statusbar.p3”
gui.display.kbcapslock.texton = “CAPS”
gui.display.kbnumlock.destination = “statusbar.p4”
gui.display.kbnumlock.texton = “NUM”
gui.display.kboverwrite.destination = “statusbar.p5”
gui.display.kboverwrite.texton = “OVR”
gui.display.kboverwrite.textoff = “INS”
gui.display.menucomment.destination = “tooltip”
gui.display.message.destination = “messagebox”
gui.display.message.color = “yellow”
gui.display.message.image = “warning.bmp”
gui.display.message.beep = true
Drawing Extensions
A set of new functions allows you to draw simple shapes. You will be able to insert
lines, rectangles, ovals, circles, texts, arcs, and polygons in a defined area. You will
also be able to bind a keystroke with the right or left click of the mouse on any of the
items in the drawing.
Mouse-Management Functions
Before you begin drawing, you might want to specify the behavior of your mouse. To
manage mouse behavior, use the following functions.
obj_no INTEGER Item number returned by the function creating the object.
key CHAR(xx) The name of the key to be returned when you click an item with
the left mouse button.
Returns None
This function defines a key to be returned when you click the specified item with the
left mouse button. For example:
CALL drawbuttonleft(num_item,"F4")
obj_no INTEGER Item number returned by the function creating the object
key CHAR(xx) The name of the key to be returned when you click an item with
the right mouse button
Returns None
For example:
CALL drawbuttonright(num_item, "Control-c")
Syntax: drawclearbutton(obj_no)
obj_no INTEGER Item number returned by the function creating the object
Returns None
For example:
CALL drawclearbutton(num_item)
}
ATTRIBUTES
f01 = formonly.blue;
c01 = formonly.draw,widget="Canvas";
The only difference is in the attributes section of the form. You must add the option
widget="Canvas" (the "Canvas" string is case sensitive).
Syntax drawinit()
Returns None
To use drawings in a 4GL program, insert the following line at the beginning of your
program, before the first display open statement:
CALL drawinit()
This function loads the graphical add-on to your client computer. If you call this
function after you open the form that contains the canvas, calls to the canvas
functions will produce no results the first time that you run your application after
starting the client daemon.
Syntax drawselect(field_name)
Returns None
After a window that contains a form with one or more drawing areas is opened, select
the area in which you want to draw. All the drawing areas have fixed resolutions of
1000 by 1000 points. The 0,0 coordinate of the area is at the lower left corner, and
the 1000,1000 coordinate is at the upper right corner. For example:
CALL drawselect("draw")
Important: Before version 3.00.1e of the compiler the canvas drawing area was
referenced by the tag name specified in the form specification file. Since version
3.00.1e, the field name should be used to reference the canvas area. In order to keep
the same 4GL code, just modify the form specification files by using the same name
for the field and the field tag.
Example:
DATABASE FORMONLY
SCREEN {
[c01 ]
[c01 ]
[c01 ]
[c01 ]
[c01 ]
[c01 ]
}
ATTRIBUTES
c01 = formonly.mycanvas,widget="Canvas";
becomes:
c01 = formonly.c01,widget="Canvas";
Syntax drawfillcolor(color)
Returns None
This function sets the fill color for all drawings. This function must be set before the
drawing function. The color will remain active until another color is chosen. The
color name list is located in the file named rgb.txt, located in the $FGLDIR/desi/etc/
directory on UNIX and in the desi\etc\ subdirectory of the Windows front-end instal-
lation directory. For example:
CALL drawfillcolor("red")
Syntax drawanchor(pos)
Returns None
Use drawAnchor() to specify the origin point for the text before using the function
drawtext. For example:
CALL drawanchor("n")
Syntax disablecolorlines(colorLines)
By default, the lines take the color defined by the DrawFillColor function.
Example:
CALL disablecolorlines(1)
Syntax drawlinewitdth(width)
Returns None
You can set the width of the line before using the DrawLine function. For example:
CALL drawlinewidth(2)
Syntax drawclear()
Returns None
This function clears the drawing area specified by the drawselect function. For
example:
CALL drawclear()
Drawing Rectangles
The following function draws a rectangle by specifying the lower left corner and the
length:
Syntax drawrectangle(x,y,h,w)
The rectangle is filled with the color set using the function drawfillcolor.
For example:
CALL drawrectangle (500,400,120,110) RETURNING ret
Drawing an Oval
The following function draws an oval:
Syntax drawoval(y,x,dy,dx)
h,w INTEGER Height and width of the rectangle that contains the
oval
This function draws an oval in a bounding rectangle. The rectangle is defined in the
same way as with the drawrectangle function. The oval is filled with the color set
using the function drawfillcolor. For example:
CALL drawoval(500,400,150,100) RETURNING ret
Drawing a Circle
The following function draws a circle:
Syntax drawcircle(x,y,r)
x,y INTEGER The lower left corner of the bounding square that con-
tains the circle
This function draws a circle in a bounding square, specifying the lower left corner of
the square and the border length. The circle is filled with the color set using the
function drawfillcolor. For example:
CALL drawcircle(500,400,65) RETURNING ret
Drawing a Line
The following function draws a line:
Syntax drawline(y,x,dy,dx)
This function draws a line from start point to end point using the
drawlinewidth function. The line is filled with the color set using the function
drawfillcolor. For example:
CALL drawline(500,400,300,500) RETURNING ret
Drawing Text
The following function draws text: This function draws the specified string from the
Syntax drawtext(y,x,t)
specified coordinate. By default, the origin point will be the centre point of the text.
Use the drawanchor function to justify the text. For example:
CALL drawtext(500,400, "Hello world!!!") RETURNING ret
Drawing an Arc
The following function draws an arc:
Syntax drawarc(x,y,d,start,arc)
This function draws an arc of a circle bounded by a square. You can specify the lower
left corner of the square, its border length, the start angle of the arc in degrees, and
the span of the arc in degrees. The line is filled with the color set using the function
drawfillcolor. For example:
CALL drawarc(500,400,100,12,25) RETURNING ret
Drawing a Polygon
The following function draws a polygon:
Syntax drawpolygon(list)
This function draws a filled polygon defined by the list of points. The list must
contain at least three points. To separate points, use spaces rather than commas. For
example:
CALL drawpolygon("120 150 200 150 400 430") RETURNING ret
In This Chapter
This chapter describes all the settings available in the configuration file. For each
setting, this chapter provides a description, possible values, and an example of the
syntax. The configuration file has the following sections:
General Configuration
This section describes the settings for the general section of the configuration file.
fglrun.defaults
Description Specifies from which directory the program-specific configuration
files will be searched for.
Default $FGLDIR/defaults
Syntax fglrun.defaults="$FGLDIR/defaults/"
Runtime Configuration
This section describes the settings that affect runtime configuration.
General
This section describes the general settings for the runtime section of the configuration
file.
fglrun.arrayIgnoreRangeError
Description Ignores range control in arrays. When this variable is set to 1,
if x is an array, x[-1] gives no error but returns NULL. If this
variable is set to 0, x[-1] gives error –1326.
Value 0 or 1
Default 0
Syntax fglrun.arrayIgnoreRangeError=1
Recommendation Set to 1
dialog.fieldOrder
Description Determines whether the intermediate event triggers (AFTER/BEFORE
FIELD/ROWS) are to be executed or not when moving from one field
to another using the mouse. If set to 1, the intermediate event triggers
are executed. If set to 0, the intermediate event triggers are not exe-
cuted.
Value 0 or 1
Default 1
Syntax dialog.fieldorder=0
report.aggregateZero
Description Determines the value to be returned by report aggregate functions
(avg, sum, ...) when the result is NULL.
Default 0
Syntax report.aggregateZero=0
gui.chartable
Description Defines a conversion file to be used for characters under GUI. It will
be searched for in the $FGLDIR/etc/ directory. You can create a file
with the mkchartab utility (see Appendix C).
Value The path from the $FGLDIR directory to the filter file
Default None
Syntax gui.chartable="iso/ansinogr"
fglrun.cursor.global
Description With a 7.x Informix database, you can choose the scope range for cur-
sors at runtime. By default, the scope is local to the module (as in
INFORMIX-4GL 4.x).
Default 0
Syntax fglrun.cursor.global=0
fglrun.ix6
Description Commands the P-code runner (fglrun) to act like INFORMIX-4GL 6.x.
For more information, see Chapter 6, “Form Extensions.”
Default 0
Syntax fglrun.ix6=0
UNIX
This section describes the settings specific to UNIX configurations.
fglrun.signalOOB
Description To send the interrupt signal to the server from the client, OOB data is
sent over the network. On some UNIX systems, the number of the OOB
data might be different from the default used by Four J’s BDL. In this
case, you can use this resource to test the signal number and then,
when identified, to specify it.
Value 0 receive the default signal when an OOB signal is sent to the pro-
gram
-1 test the signal received when an OOB signal is sent to the program
Default 0
Syntax fglrun.signalOOB=0
Microsoft Windows
This section describes the settings specific to Windows configurations.
fglrun.cmd.winnt
Description Specifies the shell command to run for the RUN WITHOUT WAITING
statement on Windows NT.
Default cmd /c
fglrun.cmd.win95
Description Shell command to perform the RUN WITHOUT WAITING command
on Windows 9x.
Default start /m
fglrun.remote.envvar
Description In Windows, specifies the name of the variable used to distinguish a
remote connection from a network drive solution. If the runner finds
this variable on Windows NT, it will export the following two envi-
ronment variables to the database:
Default REMOTEADDRESS
Syntax fglrun.remote.envvar="REMOTEADDRESS"
fglrun.database.listvar
Description This variable must be set on Windows NT computers using
Informix database servers 7.2x and higher. It contains the list of all
Informix variables. On Windows NT, those variables will be exported
to the database environment, not to the process environment and not
to the child processes.
• DBDATE
• DB_LOCALE
• DBCENTURY
• DBMONEY
• DBFORMAT
• CLIENT_LOCALE
• INFORMIXDIR
• SERVER_LOCALE
Instead of setting those variables in the fglprofile file, please set them
directly in the environment using the command 'set':
c:\> set INFORMIXDIR=c:\informix
fglrun.setenv.x
Description Sets an environment variable to a specific value even if the variable is
already defined. For each environment variable, increment the value
of x by 1, to create distinct resource names.
Default None
Syntax fglrun.setenv.0="INFORMIXDIR=c:\informix"
fglrun.defaultenv.x
Description Specifies the default value of an environment variable. If a variable is
not found in the environment, this value will be exported. You need to
define at least INFORMIXDIR, INFORMIXSQLHOSTS, INFORMIX-
SERVER, and INFORMIXHOST (name of computer on which the
Informix database server runs) to use a remote session on
Windows NT. Increment the value of x by 1 to create distinct resource
names.
Default None
Syntax fglrun.defaultenv.0="INFORMIXSQLHOSTS=\\IXSERVER"
License Configuration
This section describes the settings that affect licensing.
General
This section describes the general settings for the license section of the configuration
file.
fgllic.server
Description Name of the computer that runs the license service program. You
must set this value to use the license server.
Default None
Syntax fgllic.server="ixserver"
fgllic.service
Description Service port number to use for communication between the client and
the license server.
Default 6399
Syntax fgllic.service="7000"
fgllic.local
Description How the license data will be managed.
Default 0
Syntax fgllic.local=0
fgllic.ping
Description Time limit for the ping to detect the license server computer by a cli-
ent. If you use a distant network (by RTC or ISDN), you must increase
this value.
Default 3000
Syntax fgllic.ping=5000
UNIX
This section describes settings that are specific to licensing on UNIX systems.
fgllic.check
Description Number of license verifications between two controls of the active
user list. Only used on UNIX systems.
Syntax fgllic.check="10"
fgllic.ps
Description Command giving the list of processes running on the computer. The
FGLPS environment variable has a higher priority.
Value Command name and flag for listing all processes that run on a com-
puter
Default ps -ae
General
This section describes general GUI configuration settings.
fglrun.interface
Description Specifies which interface configuration file the graphical daemon
should use. This file must be located in the $FGLDIR/etc/ directory.
Default fgl2c.res
Syntax fglrun.interface="fgl2c.res"
fglrun.scriptname
Description Specifies which Tcl/Tk script is loaded when you execute the first
4GL program after the graphical daemon is started. It will search in the
$FGLDIR/etc/ directory.
Default fgl2c.tcl
Syntax fglrun.scriptname="fgl2c.tcl"
gui.useOOB.interrupt
Description Enables or disables the OOB signal mechanism. If the TCP/IP stack of
the client computer (especially Windows computers) does not support
the OOB mechanism you must disable it. In this case, a second,
slightly more time-consuming method is used.
Value 0 disables the OOB signal on the TCP stack. No interruption signal
can be sent from the client machine to the 4gl application.
1 enables the OOB signal on the TCP stack
Default 1
Syntax gui.useOOB.interrupt = 1
Sleep.minTime
Description Specifies the minimum time (in seconds) before the interrupt button
appears when you use the SLEEP statement.
Default 3
Syntax Sleep.minTime = 5
gui.key.radiocheck.invokeexit
Description Specifies the name of a key that, if pressed when the focus is on a
radio button or a check box, invokes the currently selected control and
then immediately goes to the next field. It can also be set to empty
string ("").
Default "Return"
fglrun.server.cmd
Description Specifies the command used to start the GUI daemon (fglX11d).
Syntax fglrun.server.cmd="fglsserv"
fglrun.server.number
Description Specifies the maximum number of graphical servers to autostart.
Default 100
Syntax fglrun.server.number=50
fglrun.server.x
Description With X11 , Citrix Winframe, and Microsoft Terminal Server client
computers, it is possible to autostart the graphical daemon on the
server when a 4GL program is executed.
Default None
Menu
This section describes the menu settings in the GUI section of the configuration file.
Menu.style
Description Specifies the display style for the menu.
Default 0
Syntax Menu.style=0
gui.menu.timer
Description Time (in milliseconds) before the menu is disabled. Useful when you
switch between windows.
Default 100
Syntax gui.menu.timer=100
gui.screen.size.x
Description Width of the screen in characters.
gui.screen.size.y
Description Height of the screen in characters.
Syntax gui.screen.size.y = 40
gui.screen.x
Description X position of an application window.
Value incr An incremented position (In this case, you have to set
gui.screen.incrx).
center Centers the window in the screen
number An absolute position, in characters
Default incr
gui.screen.incrx
Description Specifies the increment for the display of the application windows (in
number characters) on the horizontal axis.
Default 3
Syntax gui.screen.incrx = 3
gui.screen.y
Description Y position of an application window.
Value incr An incremented position (In this case, you have to set
gui.screen.incry.)
center Centers the window in the screen
number An absolute position, in characters
Default: incr
gui.screen.incry
Description Specifies the increment for the display of the application windows.
Default 2
Syntax gui.screen.incry = 3
gui.screen.withwm
Description Specifies if the window can be managed by the user.
Value 0 The main window will be ignored by the window manager. The
user will not be able to manipulate the window using the normal
window manager mechanisms like move and resize.
1 Normal mode
Default 1
Syntax gui.screen.withwm = 0
gui.key.add_function
Description Specifies the offset for the code sent by SHIFT-F1. If the specified
value is 12, the code sent for SHIFT-F1 is F13. If the specified value is
10, the code sent for SHIFT-F1 is F11.
Default 12
Syntax gui.key.add_function=12
gui.key.interrupt
Description Specifies the key to be used to send the interrupt event to the 4GL
application.
Default "Control-c"
gui.key.doubleClick.left
Description Specifies the key code sent to the program when the left mouse button
is double-clicked.
Default "KEY_accept"
gui.key.click.right
Description Specifies the key code sent to the program when the right mouse but-
ton is clicked.
Default "F36"
gui.key.0.translate
Description Allows you to map one key to another. If a key is remapped to an
empty string, this disables the key. Use the file key.tcl to test your
keys.
Default None
For the X11 Client, start the $FGLDIR/etc/key.tcl script with the following UNIX
statement:
$ owish -f key.tcl
After you start the key.tcl script, type the key or key combinations. Their ASCII value
and name are displayed in the debug window or in the terminal.
For example:
owish -f $FGLDIR/etc/key.tcl
Control_L 66
Control-c 56
Up 91
Down 92
Right 97
Left 87
Delete 84
KP_Enter 116
KP_3 111
KP_Decimal 112
Shift_R 65
Shift-exclam 10
key."key_name".text
Description The label, rather than the value, of a hot key to be displayed in the
right button frame.
Key Description
Key Description
key."key_name".order
Description Specifies an order of appearance for keys. Each key has a unique pri-
ority number. The key with the lowest priority number is displayed on
the top of the right key button frame.
accept 101
interrupt 102
insert 103
delete 104
return 105
f1 106
f2 107
. .
. .
. .
f69 174
control-a 175
control-b 176
. .
. .
. .
control-z 200
escape 202
"action_name".defKeys
Description Specifies the list of the buttons displayed in the right key button frame
of dialog boxes. Each key name must be separated by a comma.
InputArray.defKeys = "accept,inter-
rupt,insert,delete"
Displa- = "accept,interrupt"
yArray.defKeys
Input.defKeys = "accept,interrupt"
Construct.defKeys = "accept,interrupt"
Prompt.defKeys = "return"
Sleep.defKeys = "interrupt"
Getkey.defKeys = ""
gui.mswindow.button
Description Specifies whether the buttons should look like Windows buttons or
like X11 buttons. For Windows clients only.
Default 0
Syntax gui.mswindow.button=0
gui.mswindow.scrollbar
Description Specifies if the scrollbars should look like Windows scrollbars or like
X11 scrollbars. For Windows clients only.
Default 0
Syntax gui.mswindow.scrollbar=0
gui.user.font.choice
Description Restricts the end user from changing the fonts of the application with
the Windows front-end menu at runtime.
Default 1
Syntax gui.user.font.choice=1
gui.local.edit
Description Enables or disables local editing.
Default 1
Syntax gui.local.edit = 1
To enable this feature, edit the fglprofile file. The local editing feature should be
enabled with:
gui.local.edit = 1
Then you can choose the short cut keys for cut, copy, and paste with:
gui.key.copy = "Control-c" (default value is Control-Insert)
gui.key.paste= "Control-v" (default value is Shift-Insert)
gui.key.cut= "Control-x" (default value is Delete)
You can also define the message displayed when the user tries to use a local editing
feature in a not allowed field with:
gui.local.edit.error = "error string"
Example
The following code sample creates a 4GL application with two fields.
File demo.per:
database formonly
screen {
[f01 ]
[f02 ]
}
attributes
f01=formonly.f01;
f02=formonly.f02;
File demo.4gl:
MAIN
DEFINE f01, f02 CHAR(20)
OPEN WINDOW w1 AT 1,1 WITH FORM "demo"
MENU "Cut&Paste"
COMMAND "Input"
INPUT BY NAME f01, f02
COMMAND "Exit"
EXIT MENU
END MENU
END MAIN
With the X11 client, you can copy and paste between applications running the same
graphical daemon (that is, applications running with the same FGLSERVER value)
exactly the same as with the Windows client. However, to copy a string to another
X11 application (that is any Four J’s BDL application running with a different
FGLSERVER value), you have to perform the following steps:
• Select the place where you want to paste the string and press the Paste key.
The reason for this is that X11 does not offer a Windows-type clipboard. Instead,
Four J’s BDL implements something similar to a Windows Clipboard for each appli-
cation running the same FGLSERVER value. When you paste a string into a 4GL
application, you need to put the string in the corresponding clipboard for the
application.
The fglmkrun shell script output tells you if the runners have been built with or
without the memory mapping emulation.
Tip: Some systems do not support memory mapping. In this instance, an emulation
of this feature is provided. For Windows NT, an emulation is always used.
fglrun.mmapDisable
Description Enables or disables memory mapping.
Value 1 Disable memory mapping
Default 1
Syntax fglrun.mmapDisable = 1
The Debugger
9
In This Chapter . . . . . . . . . . . . . . . . . . . . 9-3
Requirements . . . . . . . . . . . . . . . . . . . . . 9-3
Installation . . . . . . . . . . . . . . . . . . . . . . 9-3
Starting the Debugger . . . . . . . . . . . . . . . . . . 9-4
Invoking debug mode on running applications . . . . . . . . . . . 9-4
UNIX platforms . . . . . . . . . . . . . . . . . . . 9-4
Microsoft Windows Platforms . . . . . . . . . . . . . . 9-5
• Requirements
• Installation
• Starting the debugger
• Invoking debug mode on running applications
• Debugger commands
Requirements
To run the Four J’s BDL Debugger requires a valid development or runtime licence.
A temporary or demo licence may not be used.
Installation
The Four J’s BDL Debugger is included in the Dynamic Virtual Machine (DVM). No
additional software is required to debug 4GL applications.
For more information on the installation of the compiler and the Dynamic Virtual
Machine see Chapter 2, “Installing Four J’s Business Development Language.”
If a file extension is not specified, the DVM looks for a file called program.42r.
When debug mode is enabled, debug commands can be executed from the terminal
(UNIX) or command window (Windows NT/WIN2K).
A debug command file may be used to execute a set of commands. This command
file is specified with the -f option as in the following example:
fglrun -f cmdfile -d program
If a command file is not specified when using the -f option, the debugger will look
for, and use, a file with the same name as the executed 4GL program and an extension
of .4db
When the DVM is started with the -d option, a prompt for the entry of debugger
commands will be displayed at the command line.
To start the application, execute the “RUN” command on the debugger prompt.
UNIX platforms
To activate debug mode on a 4GL application running on a Unix system, send the
TRAP signal to the DVM. To do this, ascertain the process number of the DVM and
send the TRAP command to the process - for example:
On first terminal:
$ fglrun program.42r
On second terminal:
$ ps | grep fglrun
15966 pts/8 0:00 fglrun -d program.42r
$ kill -TRAP 15966
As this procedure requires that the process be attached to a terminal (for debugger
commands to be entered) it cannot be used if the DVM has been started in
background.
To stop the debugger, either leave the 4GL application or execute the “EXIT” debug
command.
To stop the debugger, either leave the 4GL application or execute the “EXIT” debug
command.
Debugger Commands
An online help is provided within the debugger. To display the help, execute the
HELP command at the debugger prompt. You can specify the command name for
help on a particular command, for instance:
HELP RUN
To obtain help for key commands, prefix the name of the command with an under-
score. Supported key names are _ESCAPE _INTERRUPT _REDRAW _SCREEN
and _TOGGLE
Key commands
_ESCAPE
The _ESCAPE command is used to send a command to the operating system. It is
invoked by using the ! (exclamation point) character.
Syntax !command
This feature can be used to invoke an interactive program, such as a text editor, that
requires keyboard input. When the command terminates, you are prompted to return
to the debugger. Pressing the [RETURN} key restores the command window and the
cursor returns to the window from which you escaped.
Note: Your system must have enough RAM to support the command entered while the
debugger is running.
Example:
!csh
will create a new UNIX C-shell. You can work at this shell and then return to the
debugger by using the UNIX “exit” command and pressing the {RETURN} key.
Related commands:
HELP
_INTERRUPT
Pressing the _INTERRUPT key from an application screen will make the Command
window the current window. If the 4GL program is running, program execution is
suspended at the current 4GL statement.
On Unix platforms, where FGLGUI is set to 0 (for text mode), the _INTERRUPT key
is that specified by the stty command (usually CTRL+C or DEL). On Unix platforms
where FGLGUI is set to 1 and for Windows platforms, the _INTERRUPT key is
CTRL+C by default but this value can be changed by the use of the fglprofile entry
gui.key.interrupt. For more information see “Key GUI Settings” on page 8-24
and“Interruption Signal” on page B-7
If the application screen is your current screen, pressing the _INTERRUPT key
restores the debugger screen and the command window becomes your current
window.
Related commands:
_REDRAW
The _REDRAW key will redraw the Command window or the Application screen
Syntax CTRL+R
If you are using a second terminal to display the output of the application program,
_REDRAW will redraw both screens.
Related commands:
_SCREEN
Syntax CTRL+P
Pressing CTRL+P will save the current display of the Application screen to a disk
file. This facility enables you to record the screens of a 4GL program. In combination
with other Debugger commands to display information, this can simplify the task of
documenting debugging sessions.
If the current window is the Application screen, pressing _SCREEN will save the
current screen display in a file called fglapscr. If this file already exists, the Debugger
will append the current display to the file.
Related commands:
APPLICATION DEVICE
_TOGGLE
The _TOGGLE key will switch the screen display from the Debugger screen to the
Application screen and vice versa.
Syntax CTRL+T
Note:
Unless you use the _TOGGLE key or an APPLICATION DEVICE command, the
application screen will only appear when the 4GL program produces screen output or
requires keyboard input. The _TOGGLE command simply displays the application
screen, no input may be entered.
If the 4GL program does not produce an output screen, the _TOGGLE key has no
effect.
If the APPLCATION DEVICE command has been used to display output from the
4GL application, the _TOGGLE key has no effect.
Related commands:
Keyword commands
ALIAS
ALIAS assigns a name or function key to a command string.
On some terminal types a function key name , such as f1 for [F1], may be used as an
alias. Function key names must be defined in the file specified by the termcap
environment variable.
If terminal Setup keys have been used to program the function keys, the Debugger
may not recognize them.
The command string that is assigned to an alias can be the first part of a command or
it can group several commands enclosed by a single pair of braces ( {} ). Use a semi-
colon ( ; ) to separate commands.
The name specification may not be the complete name of another Debugger
command.
Entering the alias or pressing the function key will send the command string to the
Debugger. The Command window echoes the alias and then displays the expanded
command, substituting command strings for the alias, before executing the
command.
An alias persists until another ALIAS command reassigns the same name or
functions key or until an EXIT command ends the debugging session. If the
Programmer’s Environment is exited and debugging is resumed on the same 4GL
program without returning to the operating system the aliases are restored, otherwise
they are replaced by the initial default aliases.
Examples:
displays the default aliases that are defined for the first nine function keys:
ALIAS f1 = HELP
ALIAS f2 = STEP
ALIAS f3 = STEP INTO
ALIAS f4 = CONTINUE
ALIAS f5 = RUN
ALIAS f6 = LIST BREAK TRACE
ALIAS f7 = LIST
ALIAS f8 = DUMP
ALIAS f9 = EXIT
The command will now be executed by pressing the [F9] key or entering f9.
Related Commands
WRITE
APPLICATION DEVICE
APPLICATION DEVICE is used to redirect screen output from the 4GL application
to a second video terminal.
This command enables continuous monitoring of the Application screen and can be
useful when working in a multi-user system with access to two terminals that can
support identical TERMCAP entries. The terminal specified in this command uses
the TERMCAP entry of the terminal that invoked the Debugger.
To find the terminal pathname of any logged in terminal, enter the command tty.
The second terminal is only used for output and its keyboard is not enabled until the
EXIT command is invoked from the terminal that is running the Debugger. If the
application program requires input, this must be entered from the keyboard of the
terminal that invoked the Debugger.
Warning: If you invoke the APPLICATION DEVICE command you must specify a
different terminal to that which invoked the Debugger or you will have difficulty
reading screen output and the keyboard may lock up.
The _INTERRUPT key will switch keyboard input to the command window if the
application requests input.
Related commands:
BREAK
BREAK is used to set a breakpoint in program execution.
Default is 1.
line-no the line number within the module to set the breakpoint
function the name of a function that causes a break in program execution when
the function is executed
The name option allows an optional name to be assigned to a breakpoint. The name
must start with a letter and it must appear in the command line within single or double
quotes.
If count is specified, it must be prefixed by a minus sign (-). Once a program reaches
an enabled breakpoint count times, execution stops whenever that breakpoint is
reached (that is the Debugger does not wait another count times before stopping but
stops every time thereafter). After a breakpoint is reached, CONTINUE or STEP can
be used to resume execution without resetting count. If RUN is invoked after a break-
point, the Debugger will reset count to its original value and execution will be
resumed.
If (function) is specified, the function name overrides the current function in deter-
mining the scope of reference of any variable in a variable specification. If the
module is omitted, line-no refers to the current module. When (function) is specified,
execution stops whenever the function is entered.
The scope of reference of any variable in the commands list is determined by its
qualifiers and by the function that is current when the breakpoint takes effect. The
Debugger disregards whatever function was current when the BREAK command was
issued and ignores the (function) option in identifying the scope of any variables in
commands.
If line-no is not an executable statement, the Debugger places the breakpoint at the
start of the next executable program statement or at the last statement in the function
whichever is first. Variable definition statements, blank lines and comments are not
executable statements. If the module contains no executable statements an error
message is displayed. If line-no is not the first line of a program statement, the break-
point stops execution at the first line of the program statement.
When both (function) and count are specified, the breakpoint is reached count times
before execution stops at the function entry point.
The line number of a 4GL statement that calls a C or 4GL library function may be
specified but a function that is not itself a programmer-defined 4GL function may
not.
If both a count and an IF condition are specified, the count is only reduced if the
condition is TRUE.
Tip: There is no limit to the number of breakpoints that can be set at any one time but
if many breakpoints are simultaneously active it can be helpful to include a
distinctive PRINT message as a command option to identify which breakpoint
stopped execution.
The Debugger assigns a unique reference number to each breakpoint. When a new
breakpoint is established, its reference and number is displayed at the Command
window along with other specifications, such as name, line number, function,
module, commands to execute and scope, depending on the arguments of the
BREAK command.
Setting a breakpoint with the BREAK command also enables the breakpoint unless
the asterisk (*) symbol is included. The asterisk symbol is used to create a breakpoint
without enabling it - the breakpoint is specified but disabled as if it had been set and
then been deactivated using the DISABLE command.
Examples:
BREAK 10
This command will set an unnamed breakpoint at the tenth line of the current module.
When the breakpoint is reached the Command window will display its reference
number, the word BREAK, the function, line number, module and scope of reference.
BREAK main.100
The Debugger will first search for a function named x. If x is a function within the
current program, this breakpoint will suspend execution after a statement that calls x.
If no function named x is found, the Debugger will search for a variable named x. If
found, the Command window displays the reference number of the new breakpoint,
the word BREAK and the name of the variable. The next line will display its scope
of reference. Program execution will stop when the value of x changes. If both a
function and a variable have the name x and the variable is required, the variable must
be prefixed with appropriate qualifiers in the BREAK command.
If neither a function nor a variable is found named x, the Command window displays
the error message:
-16351: Variable [x] could not be located
BREAK x[i]
When the above command is entered, the Debugger will immediately evaluate array
member x[i] and return an error if i does not contain a value.
BREAK global.flag
The above command causes a breakpoint when the value of global variable flag
changes.
BREAK “x” -2 20 if global.flag = 3 {print “Flag=3”}
The above statement sets a breakpoint at line 20 in the current module. The break-
point causes execution to stop if the breakpoint is reached twice and the global
variable “flag” is equal to 3 each time. When execution stops, the PRINT statement
is executed.
Related commands:
CALL
The CALL function is used to execute a function and display returned values.
The function name must be followed by left and right parentheses even if the function
has no arguments. Multiple arguments must be separated by a comma (,) and any
4GL program variables that are specified as arguments must be active.
Any output from the function is displayed on the Application screen, returned values
are displayed in the Command window.
A function may be CALLed before a RUN command has started program execution
but if it includes SQL statements referencing a database which is not the current
database, the database must be specified before the function is CALLed. The
database may be specified by a DATABASE command or by a RUN command to
start the current program if that program includes an appropriate DATABASE
statement.
Examples:
CALL main()
CALL find_cust (50,0)
CALL err_get (-408)
The first example will execute the main section of the current program.
The second command will execute a function names “find_cust” with arguments of
50 and 0.
The third command will execute a built-in 4GL function and display the 4GL error
message -408 in the command window.
Related commands:
CLEANUP
The CLEANUP command initializes all variables, closes all open windows and
forms and, optionally, closes the current database.
The CLEANUP command can be helpful when a function executed with the CALL
command has not reached a normal termination but it is necessary to CALL it again.
In some debugging situations this command is necessary before a CALL command
can be executed to restart a function that terminated abnormally.
After a CLEANUP command, a RUN or CALL command must be issued before the
CONTINUE or STEP commands are used.
Related commands:
CONTINUE
The CONTINUE command is used to resume execution of a program or to send an
Interrupt or Quit signal to a currently running 4GL program.
A CONTINUE without any options resumes execution at the first 4GL statement
after an interrupt or breakpoint. If execution has not begun, or has terminated, or if
CLEANUP followed the last RUN or CALL command, an error message will be
displayed at the Command window.
The Debugger traps all Interrupt signals. The INTERRUPT and QUIT options send
an INTERRUPT or QUIT signal to the program to test signal handling code. Whether
or not the INTERRUPT or QUIT option interrupts or terminates program execution
depends on how the program handles these signals. On systems that cannot generate
a Quit signal, the QUIT option has no effect.
Related commands:
DATABASE
The DATABASE command is used to specify the required current database.
If no database has been selected, a DATABASE command selects and opens one. If
a database has been selected and is correct, DATABASE closes it and replaces it with
database-name.
Invoking the RUN command reopens the database specified in the 4GL program. To
use a different database, set a breakpoint at the first line in the main program block
and invoke the DATABASE command to select a new database when that breakpoint
is encountered. CONTINUE may then be used to continue execution.
The following example shows a sequence of commands that set a breakpoint at the
beginning of main, begins running the program, selects a new database called
“stereos” and resumes program execution using the new database.
BREAK main
RUN 9 5
DATABASE stereos
CONTINUE
Related commands:
DISABLE
The DISABLE command is used to turn off a breakpoint or tracepoint.
The ALL option disables all breakpoints and tracepoints within the current 4GL
program.
The function option disables all breakpoints and tracepoints within the specified
function.
If a breakpoint or tracepoint is enabled and has the same name as a function, only the
breakpoint or tracepoint called name is disabled. If that breakpoint or tracepoint is
already disabled, all breakpoints and tracepoints within the function called name are
disabled.
DUMP
The DUMP command will write the names and values of variables in the current
function to the Command window or an ASCII file.
The current function as used by this command is the most recently executed function.
After a fatal error or other action causes a 4GL program to terminate abnormally,
DUMP will evaluate the variables from the function where execution ceased.
If neither GLOBALS nor ALL is specified, only the variables in the current function
are evaluated. If GLOBALS is specified, only the global variables are evaluated.
If a file called filename already exists, the Debugger will append the names and
values to that file. If the file does not exist, the Debugger will create it. By default,
the file will be created in the current directory. If the file is to be created outside the
current directory, the full path must be specified.
An error message is displayed if no 4GL function is active. DUMP may not be used
to evaluate variables that exist only in C or -INFORMIX-ESQL/C- functions.
Related commands:
ENABLE
The ENABLE command is used to activate a breakpoint or tracepoint.
The ALL option enables all breakpoints and tracepoints within the current 4GL
program.
The function option enables all breakpoints and tracepoints within the specified
function.
If a breakpoint or tracepoint is enabled and has the same name as a function, only the
breakpoint or tracepoint called name is enabled. If that breakpoint or tracepoint is
already enabled, all breakpoints and tracepoints within the function called name are
enabled.
If a breakpoint or tracepoint named ALL is enabled, the ENABLE ALL command will
enable that breakpoint or tracepoint only, rather than enabling all of them.
Related commands:
EXIT
The EXIT command is used to terminate a debugging session.
Syntax EXIT
If the debugger was invoked directly from the system prompt, EXIT will return
control to that prompt. If the debugger was invoked from the Programmer’s
Environment, enter EXIT and press [RETURN] to return to a menu.
If you are at the Application screen with program waiting for input or producing
output, the _INTERRUPT key must first be pressed before it is possible to EXIT.
Related commands:
_INTERRUPT
FUNCTIONS
The FUNCTIONS command is used to list all programmer-defined functions in the
current application.
Where no search patterns follow the FUNCTIONS keyword, the names of all
functions within the current application are displayed in the Command window.
The search pattern specification may include a function name or any combination of
characters, blanks and the following special characters:
If a search pattern is specified, FUNCTIONS will display every function that matches
the pattern. If no function names match the pattern, the Command window returns to
the $ prompt and no additional message appears.
Examples:
FUNCTIONS
This will return the names of all programmer-defined functions in the current
application
FUNCTIONS add_cust
This will search the source files for a function called add_cust. If the function is
found, its name is displayed in the command window.
FUNCTIONS add*
This specifies a “wildcard” pattern that will match the previous example as well as
any other function that starts with “add”.
FUNCTIONS *ust[n-w]*
This command will list the names of all functions whose names contain the pattern
“ust” followed by any lower case letter from n to w inclusive.
Related commands:
HELP
The HELP command is used to find instructions for using Debugger commands.
As well as the debugger command keywords, the HELP command recognizes the
five key commands _ESCAPE, _INTERRUPT, _SCREEN, _REDRAW and
_TOGGLE which represent the Debugger commands controlled by special non-
alphabetic characters. Each of these key commands must be prefixed by the under-
score (_) character.
LET
The LET command is used to assign an expression to a variable
Should a 4GL program assign to a variable a value which is different to that intended,
the LET command will allow the substitution of the correct value so that the
debugging session may be continued without modifying and recompiling the
program. It should be noted, however, that the LET command has no effect on the
source code - this will have to be corrected after the debugging session is complete.
The value that a LET statement assigns to a variable should be consistent with the
data type declaration of that variable. If the two are different, the Debugger attempts
to convert the value which may result in truncation. If the conversion fails an error
message is displayed.
The syntax of the LET command closely resembles that of the 4GL LET statement.
An expression can be qualified, contain a substring of a character array but cannot
include function calls, variables from multiple functions or variables from functions
not currently active. Character expressions must be enclosed in quotation marks.
If a LET command is followed by a RUN command, the RUN command will reini-
tialize all the program variables, restoring their initial values. To avoid the LET
command being undone in this way, set a breakpoint before a 4GL statement that
uses a variable whose value is incorrect and issue the LET command when the break-
point halts execution. Invoke the CONTINUE command to resume execution with the
corrected value.
Examples:
LET answer = “y”
The above statement will divide the variable called x, which was defined in the main
program block, by 23 and assign the resulting value to the global variable rfrsh_flg.
If the data type of global.rfrsh_flg is INTEGER, the decimal portion of the value is
discarded.
LET x[101,101] = y
The above statement replaces the current value of the 101st character of variable ‘x’
with the value of the variable ‘y’.
Related Commands:
LIST
The LIST command is used to display the current breakpoints and tracepoints.
NOBREAK
The NOBREAK command is used to remove (rather than simply disable) a
breakpoint.
The LIST BREAK command displays the current reference numbers and names that
may be used for the refno and name options of the NOBREAK command.
The ALL option removes all breakpoints in the program unless a breakpoint called
ALL exists, in this case only that breakpoint will be deleted rather than all of them.
If a function is specified, the Debugger will remove all breakpoints within that
function except where a function and a breakpoint have the same name. In that case
only the named breakpoint will be removed. To remove ambiguity, a breakpoint
name may be enclosed in single or double quotes.
For example:
NOBREAK fnbr
If this command is entered, the Debugger will first look for a breakpoint called
“fnbr”. If it exists it will be removed, if it does not the Debugger will look for a
function named “fnbr” and remove all the breakpoints within that function.
NOBREAK “fnbr”
This command will only look for, and remove, a breakpoint named “fnbr”.
NOBREAK 4
The above command will remove the breakpoint with a reference number of 4.
Related commands:
NOTRACE
The NOTRACE command is used to remove (rather than simply disable) a
tracepoint.
The LIST TRACE command displays the current reference numbers and names that
may be used for the refno and name options of the NOTRACE command.
The ALL option removes all tracepoints in the program unless a tracepoint called
ALL exists, in this case only that tracepoint will be deleted rather than all of them.
If a function is specified, the Debugger will remove all tracepoints within that
function except where a function and a tracepoint have the same name. In that case
only the named tracepoint will be removed. To remove ambiguity, a tracepoint name
may be enclosed in single or double quotes.
For example:
NOTRACE fnbr
If this command is entered, the Debugger will first look for a tracepoint called “fnbr”.
If it exists it will be removed, if it does not the Debugger will look for a function
named “fnbr” and remove all the tracepoints within that function.
NOTRACE “fnbr”
The above command will remove the tracepoint with a reference number of 4.
Related commands:
PRINT
The PRINT command is used to display the value of an expression or to save it to a
file or to pass it to an external program.
progname the name of the external program to which the BLOB variable is
being passed
PRINT can be used to display the current values of an entire record or array by speci-
fying its name as the expression. PRINT can also be used like a calculator during
debugger sessions to perform arithmetic operations.
The PROGRAM option can only be used when printing BLOB variables. The
debugger first copies the BLOB to a temporary work area and then calls progname
with the work file name as an argument.
Filename may include a full path if values are to be saved to a file outside the current
directory. If output is redirected to a file that already exists, the Debugger will append
the output to that file, otherwise the file is created. If no filename is specified, the
returned vales are displayed in the Command window,
Examples:
PRINT x
the above command will display the value of variable called x. This can be a simple
variable or a record or an array.
PRINT 365/7
the above command will divide 365 by 7 and display the result in the Command
Window.
PRINT SQLCA
the above command will display an entire SQLCA record on the screen.
PRINT global.sqlca.sqlcode >> glbstatus
the above command will copy, to a disk file called glbstatus, the current value of
sqlcode.
PRINT wrtschz[1,20]
the above command will display the first 20 characters of the CHARACTER variable
wrtschz.
PRINT blobvar PROGRAM = “vi”
the above command will copy the contents of the BLOB variable blobvar to a
temporary file and then call the vi editor with the temporary filename as an argument.
The vi commands may then be used to view the entire BLOB value.
Related Commands:
READ
The READ command is used to execute Debugger commands from a file
The READ command enables the execution of Debugger commands that are
specified in an ASCII file. These commands are executed and their output displayed
at the Command window.
Tip: If you use the WRITE command to save features of a debugging session, you can
use a subsequent READ command to reestablish those features.
The required extension of filename is .4db although this need not be specified in the
READ command. The command file may created with an editor or with a WRITE
statement and subsequently modified with an editor. If the .4db command file is
outside the current directory, the full path must be supplied.
READ commands may be included in a .4db command file but an error message will
be generated if there are more than 10 levels of nested READ commands or if an
attempt is made to READ a file that is currently being processed by another READ
command.
READ cannot be used to execute the following commands or control characters that
are not based on keywords:
Command Function
Related Commands:
WRITE
RUN
The RUN command is used to start or restart execution of an application during a
debugging session.
If RUN is executed more than once during a debugging session, the same arguments
are reused. The arguments may be changed by specifying new ones in the RUN
command.
Related Commands:
STEP
The STEP command is used to execute one or more individual program statements.
When NOBREAK is specified, breakpoints have no effect while the STEP command
is executing. The breakpoints are not removed or disabled, simply ignored for the
duration of the STEP command.
Before the STEP command can be invoked, program execution must be initiated with
the CALL or RUN command and then suspended with a breakpoint or interrupt
command. An error message will be displayed if program execution terminates or a
CLEANUP command is encountered while a STEP command is being processed.
Examples:
STEP
The above command will execute the next line as one statement even if it includes a
function call.
STEP 12
The above command will execute the next 12 statements, not counting the statements
within a function call as steps. Execution will stop at an enabled breakpoint or at the
call of a function that contains an enabled breakpoint.
STEP 10 INTO
The above statement will execute the next 10 program statements. If a function call
is encountered, executable statements within the function are counted as individual
steps. If an enabled breakpoint is encountered before the 10 statements are executed,
execution will stop at that breakpoint.
STEP 5 INTO NOBREAK
The above command will execute the next 5 statements, counting statements within
functions as steps. If a breakpoint is encountered it will be ignored and execution will
not stop.
Including or not including the INTO or NOBREAK options will produce very
different results when STEPping though a program that calls a function containing a
breakpoint. With the following source code as an example, assume there is an
enabled breakpoint at line 8 and program execution is currently suspended at line 2:
1 MAIN
2 CALL a()
3 END MAIN
4
5 FUNCTION a()
6 DEFINE i INTEGER
7 LET i = 7
8 DISPLAY i
9 DISPLAY “DONE”
10 END FUNCTION
For this example, the following STEP commands respectively stop executing at the
line listed on the right:
STEP 8
STEP INTO 7
STEP NOBREAK 3
STEP INTO NOBREAK 7
STEP 3 8
STEP 3 INTO 8
STEP 3 INTO NOBREAK 9
Related commands:
TRACE
TRACE is used to show when a statement or function executes, of when the value of
a program variable changes.
line-no the line number (within the module) that will be displayed when it
executes
variable the name of the variable that will be displayed when its value changes
function the name of the function to display when its execution begins and
when it returns
The Debugger assigns a unique reference number to each tracepoint and when a
TRACE is executed, the reference number and other specifications of the tracepoint
are displayed at the Command window. These specifications can include its name,
line number, function, module, output file, commands to execute and scope. There is
no restriction on the number of tracepoints that can be set at any time.
Setting a tracepoint with the TRACE command also enables it, unless the asterisk (*)
symbol is included. If the asterisk is specified, the tracepoint is defined but disabled,
as if it had been set and a DISABLE command issued.
If line-no is not an executable statement, the tracepoint is set at the next executable
statement following line-no.
When a tracepoint is set on a variable, the variable name and its contents are
displayed at the Command window every time the value of the variable changes.
When a tracepoint is set on a function, the function name and parameters are
displayed when the function is entered and the function name and returned values are
displayed when execution of the function is complete. Any function that the current
program calls may be specified including C functions, SQL functions and library
functions. If commands are specified while tracing a function, the commands are
only executed when the function is entered. The commands list must be enclosed
within braces ({}) and semi-colons (;) are used to separate commands. A commands
list may not include a CALL, CONTINUE, STEP or RUN command.
The scope of reference of any variables in the commands list is determined by their
qualifiers and by any function that is current when the tracepoint takes effect. The
Debugger disregards whatever function was current when the TRACE command was
issued and also ignores the (function) option in identifying the scope of any variable
in a command. Variables may be optionally qualified.
Examples:
TRACE 15
The above command establishes a tracepoint with no name at line 15 of the current
module. The reference number, module and scope of reference of the tracepoint is
displayed at the Command window:
TRACE main:15 [r_main.4gl]
scope function: main
TRACE x
When the above command is entered, the Debugger will search for a function of the
current program called x. If function x is found, the display at the Command window
will show its name and parameters when the function is entered and its name and
returned values after the function returns. If no function called x is found, the
Debugger searches for a variable called x, applying the scope of reference rules. If
variable x is found, its name and value are displayed at the Command window
whenever its value changes.
If both a function and a variable have the name x, the variable must be prefixed with
appropriate qualifiers in a TRACE command to set a tracepoint on the variable.
The above command displays the name and value of the internal variable SQLCODE
whenever it changes. As SQLCODE is set to zero after each successfully executed
SQL statement, this tracepoint will identify queries that return no rows and unsuc-
cessfully executed statements.
TRACE * “vestige” CMENU.12 {VA ALL} >> vestigial
The above command specifies (but does not enable) a tracepoint called “vestige” at
the 12th line of the module called CMENU. If this tracepoint is later enabled and the
statement on this line is executed, the Debugger executes a VARIABLE ALL
command when the tracepoint is reached and saves the output to a file called
vestigial.
TRACE (funca) reca.b
The above command sets a tracepoint on member b of the record named reca in
function funca. The Debugger will display the name and value of reca.b whenever it
changes but will ignore any variable called reca.b in any other function. The
(function) specification requires fewer keystrokes than using qualifiers, as in the
equivalent command:
TRACE function.funca.reca.b
Related commands:
DISABLE, ENABLE, LIST, NOTRACE, WRITE
USE
USE is used to specify or display the source file search path
= an optional symbol to replace the current search path with a new path
Entering the USE command without any arguments will display the current directory
search path at the Command window.
If any source files are in directories outside the current search path, the USE
command enables the addition of other directories. If multiple directories are listed
in the USE command, directories will be search in the order they were specified.
If the equal sign (=) is included in the USE command, the new pathname(s) replace
the current search path, if the equal sign is omitted , the pathname(s) take precedence
in the search order, ahead of the following directories:
The modified search directory order established by the USE command persists for the
duration of the current debugging session or until the next USE command.
Related commands:
WRITE
VARIABLE
The VARIABLE command is used to display the declaration of a variable, including
the scope of reference and data type specification, or to save it in a file.
If none of variable, GLOBALS or ALL is specified, the type of each variable in the
current function is displayed but global variables outside the current function are
ignored. If GLOBALS is specified, only the types of the global variables are
returned. If ALL is specified, the Debugger returns the data types of all global
variables in the application and all the local variables in the current function.
If variable is a record, the name and data type of each component variable are
displayed.
The scope of reference of a variable may be qualified by prefixing the variable with
a qualifier. Possible qualifiers include:
Qualifier Scope
The VARIABLE command can only return the declarations of variables in program
functions. If a C or SQL function is the current function, only the ALL or GLOBALS
options return data type information. Both options declare the global variables but no
local variables.
If an output file is specified, the display is redirected to that file. If the file already
exists, output is appended to it.
Examples:
VARIABLE FUNCTION.add_order.num_cust
The above function will display the declaration of the variable num_cost in a function
called add_ord.
VARIABLE ALL >> snapshot
The above function will save the declarations of all global variables in the program
plus any other variables of the current function to a file in the current directory called
“snapshot”. This output is not displayed at the command window.
Related Commands:
VIEW
VIEW is used to display a specific 4GL function or module in the Command window.
If the VIEW command is entered without additional options, the first ten lines of the
source code for the current module are displayed at the Command window. Subse-
quent VIEW commands will display the next ten lines in sequence and so on. If a line
number is specified, lines (line-no -5) to (line-no +4) are displayed.
If a module and function have the same name, the function is displayed.
The VIEW command cannot display a C function, a 4GL library function or an SQL
function.
Related commands:
WHERE
The WHERE command is used to display the name and argument of each 4GL
function that was called to reach the current 4GL statement, or to redirect this infor-
mation to a file.
The WHERE command will display a list of functions that have been called before
the current 4GL statement has executed, but have not yet returned. The line and
source module from where the function call was made is also displayed along with
any parameters that were passed to it.
Related commands:
WRITE
The WRITE command is used to save in a file the commands to establish break-
points, tracepoints, aliases, directory search path specifications and terminal display
parameters.
Write can be used to save in a file the commands to establish any or all of the current
debugging environment. The resulting output files can then be used as an initial-
ization file or, with a subsequent READ command, to reestablish the current
debugging session.
If the >> symbols are included with a filename, the WRITE command assigns a name
to the output file by appending the extension .4db. If no filename is specified, WRITE
assigns a default name to the output file by appending the extension .4db to the
filename of the .42r or .42m file that is currently being debugged. If a .4db file with
the same name as the output file already exists, WRITE will append to it.
To save the output file to a directory other than the current directory, the filename
must be prefixed with a complete pathname.
The output from a WRITE command is plain text and may be subsequently amended
using an appropriate text editor. Additional commands may be included with the
exception of the non-keyword commands such as Interrupt, Screen or Toggle.
The output file may be edited to include READ commands that specify other .4db
input files up to a nesting level of 10. If READ commands are nested more than 10
deep, or if nested READ commands attempt to access each other, an error message
is displayed.
The >> symbols are optional and may be omitted wherever the name of the output
file cannot be confused with one of the options. For instance if a file called TRACE
is required, omitting the >> symbols will cause the debugger to interpret TRACE as
a command rather than a file name. Care should be taken with abbreviations, the
debugger will interpret T as an abbreviation for TRACE.
Examples:
WRITE >> strtdbg
The above command will save commands in the file strtdbg.4db in the current
working directory. Since no restriction is included, the output file will include all the
current breakpoints, tracepoints and aliases.
Related commands:
Environment Variables
A
This appendix provides a complete list of all environment variables for
use with Four J’s Business Development Language.
FGLGUI
Description This environment variable determines if the Four J’s Business
Development Language programs will run with a character-based
ASCII user interface or a graphical user interface (GUI).
Default 0 on UNIX
1 on Windows
FGLDBPATH
Description This environment variable contains the paths to the schema files
of the databases used, separated by colons. The compiler does not
use the schema tables directly, but rather its own schema file gen-
erated by fglschema.
FGLDIR
Description This environment variable contains the path to the installation
directory. This environment variable is required when you use
either the development package or the runtime package of Four
J’s Business Development Language.
Windows: C:\usr\fgl2c
PATH
Description This system variable contains the path to the binary programs.
Add the path to the Four J’s Business Development Language
binary program.
FGLCC
Description Available only on UNIX. This environment variable must be set
when you want to compile a new runner.
FGLRUN
Description This environment variable must be set to the name of the specific
P-code runner when linking P-code modules using fgl2p –o. Use
this environment variable for modules calling C functions that
have been linked to this runner by the fglmkrun utility.
Default FGLRUN=fglrun
FGLLDPATH
Description This environment variable provides the P-code runner with the
correct search path for P-code object files, which are dynamically
linked into an executable P-code program.
FGLLIBSQL
Description Available only on UNIX. This environment variable specifies the
complete path to the SQL library, to link with the P-code runner or the
C-code programs that contain the interface functions to the database
server.
Default $INFORMIXDIR/lib/libfesql.a
FGLLIBSYS
Description Available only on UNIX. This environment variable specifies the list
of system libraries and flags needed to compile a P-code runner or C-
code programs.
FGLSQLDEBUG
Description If set to 1, this environment variable sends to the standard output
debugging information about your current SQL commands in a run-
ning 4GL program.
Default 0
FGLDEBUGON
Description Available only on UNIX. This environment variable allows you to run
the X11 graphical server (fglX11d) in debug mode. Each operation
is redirected to the standard output. This option is not used for debug-
ging 4GL applications.
Default None
CC
Description Available only on UNIX. This environment variable is set to
the name of the default compiler to use when compiling
C-language files.
C shell $ setenv CC cc
GCC
Description Available only on UNIX. This environment variable specifies the
name of the GNU C Compiler.
GCCDIR
Description Available only on UNIX. This environment variable specifies the
directory in which the GNU C compiler is installed. This environment
variable is used only by Four J’s Business Development Language
GCC_EXEC_PREFIX
Description Available only on UNIX. This environment variable specifies the
path of the installation directory of the GCC compiler.
PATH
Description Available only on UNIX. This environment variable specifies the list
of directories where the operating system looks for a needed execut-
able file.
TCLDIR
Description Available only on UNIX. This environment variable is used only with
the Tcl/Tk package included in Four J’s Business Development Lan-
guage. This environment variable specifies the full path to the instal-
lation directory of the Tcl/Tk .
TK_LIBRARY
Description Available only on UNIX. This environment variable specifies the full
path to the TK library subdirectory.
TCL_LIBRARY
Description Available only on UNIX. This environment variable specifies the full
path to the TCL library subdirectory.
PATH
Description Available only on UNIX. This environment variable specifies the list
of directories where the operating system looks for a needed execut-
able file.
Files with the extension .tgz are compressed archive files. To uncompress this kind
of file, you must first run gzip and then tar with the following commands:
$ gzip -d filename.tgz
$ tar xvf filename.tar
Before uncompressing the file with tar, you can view its contents with the following
command:
$ tar tvf filename.tar
On the distribution CD, you will find all the necessary files in the /OS/UNIX/your OS
name directory.
This archive file contains a complete directory tree, which can be installed anywhere.
where installdir is the path to the installation directory. The following examples illus-
trate how to do both a new installation and an update.
This will start the license installation process, as described in “Licensing the Product”
on page 2-4.
Post-Installation Tasks
If you are doing a manual installation, you need to complete the following procedures
by hand before you can use Four J’s BDL. If you are performing an automatic instal-
lation, these tasks are done for you.
The C Compiler
During this phase, you might need a C compiler. It is required if you plan to create a
new runner or if you want to compile your 4GL programs to C code. But it is not used
afterward for P-code compilation. You can use either the native C compiler of the
computer or the C compiler of the GNU tools, included on the distribution media.
If there is no usable native C compiler on your computer, the GNU tools must be
installed. However, you still need to have your UNIX system libraries installed.
To install the GNU C compiler from the Four J’s BDL CD, go into the OS/UNIX/
directory and run the following command:
$ /bin/sh ./insttgcc –i
This shell script installs the package GCC.TGZ located in the directory
/OS/UNIX/your_OS_name/GNUC.
If you cannot mount the CD directly on UNIX, you can copy the file gnuc.sh, located
in the directory /OS/UNIX/your_OS_name/SELFEXTR, to a temporary directory on
UNIX. Use binary transfer mode because this shell script contains all the files of the
GNU C compiler. Then run the following command to start the installation:
$ /bin/sh ./GNUC.SH -i
During the installation process, you will be prompted for the installation directory of
the GNU C compiler. A shell script named envgcc will also be generated during the
installation. You must execute this shell script to set all the environment variables
needed for compiling and linking C programs.
Tip: This distribution does not contain the system libraries you need to compile C
sources. To obtain those libraries, contact your operating-system reseller.
If you plan to link a runner without any C functions, you only need to install a linker
and not an ANSI-C compliant compiler.
If you are not using the default C compiler (normally cc), make sure that you have
set the INFORMIXC environment variable to the compiler you are using (such as gcc
for the GNU C compiler,) as well as the documented FGLCC and CC variables. For
example:
INFORMIXC=gcc
export INFORMIXC
This script generates a file called envcomp in the local directory. This shell script sets
all the environment variables necessary to create the P-code runner and the 4GL
libraries, which allow you to compile to C code and to execute 4GL programs.
Execute this Bourne shell script with the following command:
$ ./envcomp
The runner is the result of linking your Informix libraries, your UNIX system
libraries, and the Four J’s BDL libraries. Each time that one of these three compo-
nents changes, you must create a new runner. If you have C functions, you must also
include them in the runner. For more information about using C functions with 4GL,
see “Using C Functions in 4GL Applications” on page 4-9.
Important: Creating the P-code runner for your computer requires a C compiler
and the INFORMIX-ESQL/C development libraries.
This command creates the default P-code runner, called fglrun, in the $FGLDIR/bin
directory.
If you need your own, statically-linked runner, use the syntax in the following
example (assume your runner is named myrun, you are using Informix Client SDK
version 2.10, and using a C function file named file.c):
$ fglmkrun -d ix914 -add -static $FGLDIR/lib/fglExt.c
file.c -o myrun
After you have successfully created the P-code runner, run the rtsinstall command
to create the P-code libraries and tools:
$ rtsinstall
For details about fglmkrun, see “Details About fglmkrun” on page 4-13.
SCO Systems
With SCO systems, the use of fglmkrun during a manual installation might cause the
following error message:
Symbol not found
First referenced in file
fileno .../lib/libf2c.a
The solution is to first create a file named fileno.c that contains the following code:
#include stdio.h
#undef fileno
int fileno(f)
FILE *f ;
{
return(f->__file) ;
}
Then run the fglinstall program in order to compile the C-code libraries and tools:
$ fglinstall
Interruption Signal
When you press the interrupt key or the Interrupt button, your client computer inter-
cepts this and sends it to the server. It is not possible to send an interrupt signal over
the network, so Four J’s BDL sends an MSG_OOB (out of band) message through the
connected socket, which is the real interrupt message for network operations.
Usually, the application server receives this signal and stops the application.
Problems can occur in the following situations:
• The client TCP/IP stack does not support the OOB message. This is often
the case with the TUN TCP/IP stack from ESKER. In this case, you must
disable the OOB functionality. The compiler will then send a whole
command over the network to the server computer to stop the application.
Add the following line in your fglprofile file:
gui.useOOB.interrupt=0
• The application server TCP/IP stack does not handle OOB signals. In this
case you must also disable the OOB mechanism and use the following
setting in the fglprofile:
gui.useOOB.interrupt=0
• The application server uses a different code number for the OOB
message. Some systems use different signals to code the OOB message. For
example, the signal number changed between SCO OPEN SERVER 5.02 and
SCO OPEN SERVER 5.04. To determine the received signal that your system
uses, add the following line in your fglprofile:
fglrun.signalOOB= -1
Then execute a 4GL program and press the interrupt key multiple times. You
will see messages similar to the following message on your terminal:
Enable trappings of signal
Received signal is 18
(18 is subject to change depending on systems)
Hit your interrupt key twice:
Received signal is xx
Received signal is xx
The value xx is returned by your operating system when an OOB message is
received on a socket. You can specify this number in the fglprofile file with
the entry:
fglrun.signalOOB= xx
This gives you the compile statement with all the libraries used on the standard
output. For example:
cc -I/usr1/informix7.11/incl/esql t.c -L /usr1/informix7.11/lib -L
/usr1/informix7.11/lib/esql -L /usr1/informix7.11/lib/esql
/usr1/informix7.11/lib/esql/libsqlshr.a -L
/usr1/informix7.11/lib/esql /usr1/informix7.11/lib/esql/libosshr.a
-L /usr1/informix7.11/lib /usr1/informix7.11/lib/libasfshr.a -L
/usr1/informix7.11/lib/esql
/usr1/informix7.11/lib/esql/libgenshr.a -L
/usr1/informix7.11/lib/esql /usr1/informix7.11/lib/esql/libosshr.a
-L /usr1/informix7.11/lib/esql
/usr1/informix7.11/lib/esql/libgenshr.a -ltli -L
/usr1/informix7.11/lib /usr1/informix7.11/lib/libnetstubshr.a -lc
-lmsaa -lbsd
In this case, you would have to set your environment variable FGLLIBSQL like this:
$ export FGLLIBSQL"$INFORMIXDIR/lib/esql/libsqlshr.a
$INFORMIXDIR/lib/esql/libosshr.a
$INFORMIXDIR/lib/libasfshr.a
$INFORMIXDIR/lib/esql/libgenshr.a
$INFORMIXDIR/lib/esql/libosshr.a
$INFORMIXDIR/lib/esql/libgenshr.a
/usr/lib/libtli.a
$INFORMIXDIR/lib/libnetstubshr.a
/usr/lib/libc.a
/usr/lib/libmsaa.a
/usr/lib/libbsd.a "
If you do not have ESQL/C development but only 4GL development on your system,
the way to proceed is similar to that with ESQL/C, except that you will copy and
modify the script $INFORMIXDIR/bin/c4gl and use the copy to compile a 4GL
example, but then you must remove the libraries from the list that are specific to
INFORMIX-4GL.
Given a missing function named funcname, execute the following UNIX shell
command:
$ for i in /lib/*.a /usr/lib/*.a
>do
> echo $i
>nm $i | grep funcname
>done | pg
and the first number is greater than zero (here it is 1640), the library libname.a must
be added to the list of the system libraries needed to create a P-code runner or a C-
code application. This list is specified by the FGLLIBSYS environment variable and
is built in the same way as FGLLIBSQL.
When you create the database, you must set the environment variable DB_LOCALE.
If it is not set, the database will be installed with U.S. English locale (en_US.859-1.)
You can view the current configuration with the following SQL statement:
SELECT * FROM systables WHERE tabid IN (90,91).
If the database is not created with the correct configuration, it must be unloaded with
dbexport, dropped, and imported with the dbimport command and with the
DB_LOCALE environment variable set to the proper value (for example,
de_de.8859-1 for German).
This command will create the file lcll.txt in which you see the supported versions.
This failure occurs because the process table of UNIX systems is used to retrieve
internal information. This information is stored in the $FGLDIR/lock directory. To
view this table, use the UNIX command ps –ae.
Normally, this gives the complete list of processes. But on some operating systems
(such as SCO), you see only the processes of the current user if you are not the
superuser.
If you receive the error message, check your UNIX documentation for a command
that gives the complete list of processes and then set the environment variable FGLPS
to this value. For example:
FGLPS="ps -aefx"
export FGLPS
If there is no command that allows a non-superuser to view the whole process list on
the operating system, you can use the following procedure (you need a C compiler
installed on your computer):
• Log in as root:
$ cd $FGLDIR/src
• Edit the file psall.c and change the «ps -ae» command if needed:
$ cc -o psall psall.c
$ cp psall $FGLDIR/bin
$ cd $FGLDIR/bin
$ chown root psall
$ chgrp root psall
$ chmod 0755 psall
$ chmod a+s psall
It is also possible that the file system is full and the 4GL application cannot create the
internal data files in the $FGLDIR/lock directory. Use the command df to check
whether you have enough free space on the file system where Four J’s BDL is
installed.
To check if the stream size is large enough, log in as root, use the «crash» command
and the «strstat» command. The values in the FAIL column must always be zero.
For example:
# crash (
dumpfile = /dev/mem, namelist = /unix, outfile = stdout
> strstat (
ITEM CONFIGALLOC FREE TOTAL MAX FAIL
streams 512 52 460 75 53 0
queues 1424 240 1184 172 244 0
message blocks 6258 124 6134 3673 269 0
data block totals 5007 124 4883 3103 198 0
data block size4 512 21 491 207 29 0
data block size16 512 3 509 428 67 0
data block size64 512 31 481 2115 40 0
data block size1282048 54 1994 242 57 0
data block size2561024 15 1009 55 17 0
data block size512256 0 256 28 1 0
data block size102452 0 52 9 1 0
data block size204850 0 50 14 1 0
data block size409641 0 41 5 1 0
To test, call wish or tclsh, and try expr 3.4 + 3 or expr 3,4 + 3. One of them must
run. Our syntax uses the dot. Here is an example:
LANG=german
in /usr/lib/lang/german/germany/*/numeric.
You cannot make the modification directly with a text editor. You have to look at the
file with od -c numeric. For example, if you get:
00000000 002 , . \0 \0 \0
00000005
Make sure you save the original version. You should then see the file as:
00000000 002 . , \0 \0 \0
00000005
This occurs because with Windows you have a 25-line terminal. To fix this problem,
in xterm termcap, change the definition from li#24 to li#25. On some systems, you
can also export the LINES environment variable set to 25.
The graphical daemon must be running when you try this command.
Normally, a standard Four J's BDL configuration follows the "thin client" archi-
tecture: The 4gl programs are executed on an application server and the workstations
are only in charge of the user interface, using the Windows Front End.
However, in order to distribute the work on all the machines, you can run the 4gl
applications on the workstations without installing the Four J's BDL runtime on each
machine. Only the database client software must be installed and configured on each
workstation, to let 4gl application connect directly to the database server.
3. Install the Four J's BDL product on the FS under the Four J's directory, for
example into C:\FOURJS\F4GL. You must install the product with a license
server. The license server is mandatory to check the license from the
machines where 4gl applications will be executed.
4. On the FS machine, set the following FGLPROFILE entry to define where
the license server is running:
fgllic.server = "FS"
This entry will be used by the 4gl programs to find the license server
on the network. Additional configuration parameters can be set to
customize the licensing service, like tcp service, timeout or local data
storage. See the FGLPROFILE configuration file for more details
5. Make sure the license server is running on the FS machine. Run the license
manager utility to see the current status.
6. To read the BDL files from the workstations on the file server FS, create a
network share (i.e. \\FS\FJS) to the Four J's installation directory
(C:\FOURJS). Make sure you are using a correct user policy (i.e. with
domain users) to give access to the files.
7. On the FS machine, create a network share (i.e. \\FS\APP) to your 4gl
programs in order to access these file from the workstations for execution.
8. Select a Windows machine to act as a workstation. We will assume this
machine is identified by the hostname "WS".
9. Install the Windows Front End on the WS workstation. See the Windows
Front End documentation for more details.
10. To access the Four J's BDL files from the WS, use the file explorer to map
the \\FS\FJS network drive. We will assume this mapping to be identified as
a drive with the letter "F".
11. To access your 4gl program files, use the file explorer to map the \\FS\APP
network drive. We will assume this mapping to be identified as a drive with
the letter "G".
12. To execute 4gl applications on the WS, set following environment
variables:
set FGLDIR=F:\F4GL
set PATH=%FGLDIR%\bin;%PATH%
set FGLLDPATH=G:\
set FGLGUI=1
set FGLSERVER=WS:0
13. Make sure you have a database server available on your network. In this
example we call the database server DS. Usually the file server (FS) and the
database server (DS) are the same machine.
14. Install the Database Client Software on each workstation.
Informix example: Install Informix Connect corresponding to the
Informix server you want to access. See Informix documentation for
details.
Informix example:
Define the Informix environment in the first folder. You must define
INFORMIXDIR and INFORMIXSERVER. INFORMIXSQL-
HOSTS defines the Windows machine where the Informix server
definitions can be found (SQLHOSTS).
Warning : Check the following prerequisites before installing Four J's BDL.
Informix-ESQL/C Version:
The INFORMIX-ESQL/C version supported is version 9.30.FC1 or higher. The
version of esql can be checked with the -V option :
$ esql -V
INFORMIX-ESQL Version 9.30.FC1
Software Serial Number XXX#Z123456
$ file es
In order to use the GNU compiler with the esql tool provided by INFORMIX, the
script must be modified as it was not designed to work with gcc.
Before doing any modification, make a copy of esql (found in the $INFOR-
MIXDIR/bin directory).
Edit the esql script and modify the lines defining the C compiler and the compilation
options :
CC=${INFORMIXC=cc}
becomes
CC=${INFORMIXC=gcc}
and
COPTS="-Wp,-H400000 +Ofastaccess +DS2.0 +DA2.0W"
becomes
COPTS="-Wp,-H400000"
Options +Ofastaccess +DS2.0 +DA2.0W are not gcc options, but are specific to the
native HP C compiler.
Global Language
Support C
This appendix describes the Global Language Support (GLS) feature
available in Four J’s BDL. The GLS feature allows Informix database
servers to handle different languages, cultural conventions, and code
sets.
This appendix describes the GLS features unique to Four J’s BDL. You
should be familiar with using GLS features and GLS behaviors before
using this appendix.
All manuals listed on the Web site are stored in Adobe Acrobat (.pdf)
format.
Software Requirements
Software Requirements
You do not need 4GL installed to install Four J’s BDL. However, the Client SDK,
Version2.x or later, must be installed.
The Client SDK installs the latest version of GLS. To use the GLS feature in Four J’s
BDL, you must be using Informix GLS 3.07 (or later).
• Windows Client
• Text (ASCII) Client
• Java Client
The Four J’s BDL clients that do not support all languages are:
• X11 Client
• HTML client
To use the GLS features of Four J’s BDL, any database or connectivity products must
support the Informix GLS library, Version 3.07 or higher. Figure C-1 summarizes the
relationships of Four J’s BDL to the UNIX-based Informix database servers that are
supported.
Figure C-1
Database
7.x GLS OnLine/SE Servers that are
supported
by Four J’s BDL
7.x English OnLine/SE
Four J’s BDL
(with NLS)
Informix 7.2 and later GLS servers can store and retrieve data values that are
compliant with single-byte and multibyte locales. GLS functionality requires the GLS
version of INFORMIX-NET PC.
Four J’s BDL is also compatible with Informix 5.x and 7.1 database servers, which
can be English or non-English based.
Four J’s BDL also supports older (ALS-based) Informix servers. The functionality
differences are server-version based; applications may behave differently when
connected to different servers.
Creating a Runner
To create a GLS runner, add the -gls flag when running the fglmkrun script.
For example:
fglmkrun -o myrunner -gls
By default, the runner will be created in the $FGLDIR/bin/gls directory and linked to
an alias in the $FGLDIR/bin directory.
If the application is to run with Informix 7.3 database servers or higher, set the -d
fglmkrun flag to ix914 in order to use the Informix Esql/C 9.1x database interface.
Alternatively, you can set the FGLDBS environment variable to this value.
If you do not specify the -gls flag when running the fglmkrun script, an ASCII runner
(supporting only 8 bits ISO 8859-1 character set) will be created in the
$FGLDIR/bin/ascii directory and linked to an alias in the $FGLDIR/bin directory.
To create a GLS P code runner on NT with the winrunr.mk makefile, you must set
the USE_GLS variable to YES.
For example:
nmake %FGLDIR%\lib\winrunr.mk RUNNER_IX9=myrun.exe
RUNNERS_TO_MAKE=myrun.exe USE_GLS=YES
A runner without GLS support enabled and using only ASCII characters will display:
$ fglrun -V
Four J’s Business Development Language Runner Version 3.00
Built June 30 1999 15:36:04
(c) 1989-1998 Four J's Development Tools
Language support library: standard ASCII (ISO8859-1)
Database front end : INFORMIX-ESQL VERSION 9.14
Before:
key.help.text=”help”
After:
key.help.text= [msg -6900 “help”]
software that customizes the Tcl/Tk for GUIs on Windows. The following WTK
character sets can be used with Four J’s BDL and are fully supported by Microsoft.
Important: You should refer to the Four J’s BDL Release Notes for any changes to
the supported WTK character sets.
Microsoft Code
Code Set Character Set Name or Alias Page ID
Microsoft Code
Code Set Character Set Name or Alias Page ID
Microsoft Code
Code Set Character Set Name or Alias Page ID
For example:
fr_ca.1252
The Code Set column in the following table lists the synonyms that can be used in the
CLIENT_LOCALE variable.
The default value on a UNIX computer is iso8859-1. This character set is not fully
supported. You should set CLIENT_LOCALE to en_us.1252 if you want complete
support for this character set.
For example:
CLIENT_LOCALE=en_us.1252
unset DB_LOCALE
(default value)
CLIENT_LOCALE=cs_cz.cp1250
DB_LOCALE=cs_cz.8859-2
CLIENT_LOCALE=ja_jp.sjis-s
DB_LOCALE=ja_jp.ujis
CLIENT_LOCALE=ko_kr.ksc
DB_LOCALE=ko_kr.ksc
CLIENT_LOCALE=ja_jp.sjis-s
DB_LOCALE=ja_jp.unicode
An internationalized application must support the use of extended ASCII code sets.
The default environment for 4GL is based on the ASCII code set of 128 characters.
Each of these encoded values (or code points) requires seven bits of a byte to store
each of the values 0 through 127, representing the letters, digits, punctuation, and
other logical characters of ASCII. Because each ASCII character can be stored within
a single byte, ASCII is called a single-byte character set. All other character sets that
4GL can support must include ASCII as a subset.
Localization usually involves setting the appropriate number, time, and currency
formats for the intended country, as well as creating a translation of the runtime user
interface (including help and error messages, prompts, menus, and reports).
You can reduce the cost and effort of localization if the application is designed with
international requirements in mind. This release of 4GL supports localization in
several areas:
For basic GLS concepts and for details of how Informix database servers and the
INFORMIX-ESQL/C product implement GLS, see the Informix Guide to GLS
Functionality.
Code sets are based on logical characters, independent of the font that a display
device uses to represent a given character. The size or font in which 4GL displays a
given character is determined by factors independent of the code set. (But if you
select, for example, a font that includes no representation of the Chinese character for
star, then only whitespace will be displayed for that character until you specify a font
that supports it.)
Collation Order
Collation order is the sequence in which character strings are sorted. Database
servers can support collation in either code-set order (the sequence of code points) or
localized order (some other predefined sequence). See the Informix Guide to GLS
Functionality for details of localized collation.
4GL supports only code-set order. The database server, rather than 4GL, must do the
sorting if you require localized collation of data values in NCHAR or NVARCHAR
columns of the database. (You can write collation functions, but 4GL relational
operators always use the code-set order.)
Locales
For 4GL (and for Informix database servers and connectivity products), a locale is a
set of files that specify the linguistic and cultural conventions that the user expects to
see when the application runs. A locale can specify:
The Informix Guide to GLS Functionality provides details of formats for number,
currency, and time values. If no locale is specified, then default values are for U.S.
English, which is the en_us.8859-1 locale on UNIX systems, or Windows code page
1252. For deployment, 4GL is also delivered with the locale en_us.1252@dict,
which corresponds to that Windows code page.
The locale en_us.1252@dict allows you to compile and run programs that contain
non-English characters from any single-byte language, but the default data formats
are those of U.S. English. Alternatively, you can use the Setnet32 utility to specify
some nondefault locale, such as one of those listed in “Locales Supported by 4GL”
on page C-21.
The following GLS- enabled built-in functions or operators have been modified to
provide support for non-English locales. Some can accept multibyte characters
as arguments or operands, or can return values that include multibyte characters.
• CLIPPED operator
• DOWNSHIFT( )
• FGL_GETENV( )
• FGL_KEYVAL( )
• LENGTH( )
• Substring ( [ ] ) operator
• UPSHIFT( )
• WORDWRAP operator
See the INFORMIX-4GL Reference Manual for the syntax and semantics of these built-
in functions and operators. (Besides these, certain other built-in functions and
operators of 4GL can also process or return multibyte values.)
4GL supports Informix NLS servers at the implicit level of compliance, through
INFORMIX-NET and through INFORMIX-ESQL/C. The 4GL language does not
recognize NCHAR or NVARCHAR data types, but such values from the database
server are automatically converted to CHAR and VARCHAR values, and 4GL can use
CHAR and VARCHAR values to update NCHAR and NVARCHAR columns, provided
that an operating-system locale exists in the GLS directory for the NLS locale.
The DBNLS value that is set on the client system running 4GL is passed to the
database server, but any LC_COLLATE value from the client is ignored. (Collation
by the 4GL application is based on the code-set order, not on LC_COLLATE, but the
database server can perform localized collation of NCHAR or NVARCHAR column
values, based on the LC_COLLATE setting.)
The absence of GLS does not imply that these features are unavailable in non-English
locales. It does imply, however, a restriction to locales that require only single-byte
code sets and left-to-right text processing.
Figure C-2
*.cv Directory
cv9 Structure of GLS
Products
*.cvo
*.cm
gls cm3
*.cm
*.lc
en_us
lc11
*.lco
---
en_us 0333 *.iem
msg
---
$INFORMIXDIR etc (similar to msg
en_us 0333 *
sql
demo
---
---
• The targeted hardware platform and operating system need to support the
desired language and country combination.
The operating-system environment on both the client platform and the
server platform might require special versions to support the entry, manip-
ulation, and display of non-English data.
• The Informix products need to support the language. Informix products are
8-bit clean and allow entry, manipulation, and display of most European and
Asian language data.
• Error messages generated by 4GL and the database server should be
available in a localized version, so that only local languages appear in the
runtime environment.
• All parts of the user interface created by the application developer (such as
menus, prompts, error messages, and help) should be translated into the
target language.
In many cases, the last three of these four requirements can be met by using an
Informix language supplement. Your Informix sales representative can advise you
regarding the availability of language supplements, of localized versions of
Windows, and of database servers that are compatible with 4GL.
Language Supplements
Use of 4GL with some non-English languages might require an Informix language
supplement specific to the conventions of the country or language. Language supple-
ments are currently required, for example, for Informix database servers to support
each of the following East Asian languages.
Language supplements for these East Asian languages include locale files,
translated message files, and translated menu files. Localized versions of 4GL for
East Asian locales (for example, Japanese 4GL) will include the relevant files. See the
release notes for additional information.
When 4GL is installed, the locale files must also be installed. Contact your Informix
sales office for information regarding current support for specific locales.
Code sets that WTK 4GL supports include those listed in the following table.
Greek 1253
Turkish 1254
Here Latin in reference to Windows code pages 1250 and 1252 denotes what is also
called the Roman alphabet in U.S. English. In any locale, 4GL requires at least one
font that supports the code set, if the application needs to produce output to the screen
or to a report.
4GL provides limited support for the Thai language through code set th_th.thai620,
with Language Supplement TH 7.20, for non-composite Thai characters. ( 4GL does
not support composite Thai characters.)
See the Informix Guide to GLS Functionality for an example of non-English locale
files.
• Within comments
• Within 4GL identifiers
• Within certain SQL identifiers (as listed in the table in “SQL and 4GL
Identifiers” on page C-25)
• Within expressions where character-string literals are valid
Non-English characters in other contexts, or characters that the client locale does not
support, will generally cause compilation errors.
At runtime, the user can enter, edit, and display valid characters from the code set of
the client locale. Whether a given character from a non-English code set is printable
or nonprintable depends on the client locale.
Values that include non-English characters can be passed between a 4GL application
and the database server, if the client and server systems have the same locale. If the
locales are different, data can still be transferred between the 4GL client and the
database server, provided that the client locale includes appropriate code-set
conversion tables. See “Configuring the Language Environment” on page C-36 or the
Informix Guide to GLS Functionality for information about establishing a locale and
about code-set conversion between locales. See also “Handling Code-Set
Conversion” on page C-49.
Non-English Characters
The following features of the 4GL compiler are GLS-enabled to support non-English
characters that are valid in the client locale:
• Names of identifiers
• Values of CHAR and VARCHAR variables and formal arguments
• Characters within TEXT blobs
• Message text, quoted strings, and values returned by functions
• Text within comments, forms, menus, and output from reports
Named 4GL program entities include variables, functions, cursors, formal arguments,
labels, reports, and prepared objects. 4GL has a limit of 50 bytes on the lengths of
these names.
The user interface of the 4GL compiler is in English. If edit fields contain multibyte
characters, there is no checking, and the results might be unpredictable. Embedded
SQL statements can include valid non-English identifiers for some database
entities.The following tables summarize the instances where non-English characters
are valid as identifiers within 4GL source code modules. The first table lists SQL
identifiers.
Synonym Yes
Filename or pathname No
Input and output filenames for the 4GL compiler cannot be localized. Only ASCII
characters are valid in input and output pathnames or filenames. (If support for
uppercase ASCII letters is required, specify en_us.1252@dict as the locale at compile
time. Uppercase letters are not defined in en_us.1252.)
Collation Sequence
The collation (sorting) sequence in 4GL statements is implied by the code-set order
in the files that define the client locale. (Any collating that is specified by the
LC_COLLATE value of the client locale is ignored.) Collation in SQL operations
(where the database server uses its own collation sequence) depends on the data type
and on the server locale (which can specify a localized order of collation). It is
possible for the 4GL application and the database server to use a different collating
sequence, or for a 4GL application to connect to two or more servers that use different
collating sequences. The collation sequence can affect the value of Boolean expres-
sions that use relational operators and the sorted order of rows in queries and in
reports.
Locale Restrictions
The compiler requires the en_us.0333 locale. It accepts as input any source file
containing data values in the format of the client locale. The compiler can generate
binaries or P-code files with client-locale text strings. The runtime locale of a 4GL
program must be the same as its compile-time locale.
As a convenience to the developer, 4GL adds a field in P-code header files to specify
the locale in which the files were compiled but does not compare these locales.
On-Line Help
Help for 4GL applications in non-English locales requires the native Windows Help
facility.
This version of 4GL does not support composite characters, such as are required in
code sets that support the Thai language.
4GL comments and character string values can include multibyte characters that are
supported by the client locale in contexts like these:
Multibyte characters can also appear in 4GL source code (or in user-defined query
criteria) that specifies the SQL identifier of any of the database objects listed in the
table on “SQL and 4GL Identifiers” on page C-25. 4GL does not, however, support
multibyte characters as currency symbols or as separators in display formats that
DBDATE or DBFORMAT specifies.
Logical Characters
Within a single-byte locale, every character of data within character-string values
requires only a single byte of memory storage, and a single character position for
display by a character-mode device.
In locales that support multibyte characters, some built-in functions and operators
that process string values operate on logical characters, rather than on bytes. For code
sets that use multibyte characters, this modifies the byte-based behavior of several
features in 4GL. A single logical character can occupy one or more character
positions in a screen display or in output of a report, and requires at least one byte of
storage, and possibly more than one.
Declaring the CHAR or VARCHAR data types of variables, formal arguments, and
returned values is byte-based. Runtime processing of some character strings,
however, is done on a logical character basis in multibyte locales.
Partial Characters
The most important motivation for distinguishing between logical characters and
their component bytes is the need to avoid partial characters. These are fragments of
multibyte characters. Entering partial characters into the database implies corruption
of the database, and risks malfunction of the database server.
• Substring operations
• INSERT and UPDATE operations of SQL
• Word wrapping in reports and screen displays
• Buffer to buffer copy
4GL does not allow partial characters and handles them as follows:
retrieved three data values from col1 (where col1 is a CHAR, NCHAR, NVARCHAR,
or VARCHAR column); here the first line is not a data value but indicates the
alignment of bytes within the substrings:
AA2BB2AA becomes "s1Bs1"
ABA2C2AA becomes "A2s1"
A2B2CABC becomes "B2C"
Here the notation s1 denotes a single-byte whitespace. Any uppercase letter followed
by a superscript ( 2 ) means an East Asian character with multibyte storage width; for
simplicity, this example assumes a 2-byte storage requirement for the multibyte
characters. In the first example, the A2 would become a partial character in the
substring, so it is replaced by a single-byte whitespace. In the same substring, the B2
would lose its trailing byte, so a similar replacement takes place.
General Guidelines
This section lists the issues that you need to consider when writing and translating
applications.
Internationalization Guidelines
To make a 4GL application world-ready, keep the following guidelines in mind:
• Make sure that all screens, menus, user messages, reports, help facilities,
and application parameters (such as holidays, bank years, formulas) that
were developed with Informix tools for the application are either table-
driven or are controlled by text files or environment variables that are easy
to modify. This issue is discussed later in this appendix.
• Avoid embedding any messages, prompts, or elements of the user interface
into the source code of the program. Ideally, all user interface elements can
be switched dynamically by referencing a different set of translated files.
• Consider different keyboard layouts. A character (such as “/”) that is easily
accessible on an ASCII keyboard might require several keystrokes in the
standard keyboard of some other country.
• Consider creating a configuration utility to deal with different font types.
Some applications that will be deployed in several different countries might
need to load different fonts to accommodate specific national characters.
Because these fonts are often supplied by third parties, you might not be able
to predict the font names when you develop the application. In this case, you
can use the default font names and provide a configuration utility that allows
the user to specify the font name before running the application.
• Consider differences in paper size when designing reports. Most countries
outside the U.S. use the ISO Standard A4 paper size, which is 21 by 29.7
centimeters, slightly longer and narrower than the American standard 8.5 by
11 inches.
• Avoid fragmentation of messages or potentially ambiguous key
or command words. Avoid determining variable portions of a message at
runtime; for example, the differing syntax of other languages can make the
order in which your functions return parameters an obstacle to correct
translation.
• Wherever possible, avoid abbreviations, acronyms, contractions, and slang.
• Place comments around any string pertaining to the user interface
to facilitate localization.
• Use localized error messages and help files. The message compiler utility
that is provided with 4GL enables you to create customized help files as well
as a localized version of the 4GL runtime message file. (This is the
4glusr.msg file in the msg directory.) Internationalizing messages is further
discussed in “Localizing Prompts and Messages” on page C-47.
• You can handle reports (which are 4GL programs) in the same way that you
internationalize the rest of your 4GL source code.
If your database server and ESQL/C API are Version 6.0 or later, you might be able
to take advantage of Native Language Support (NLS) functionality, even though 4GL
provides only implicit support for NLS. For more information, see the Informix Guide
to SQL: Reference.
Localization Guidelines
Localization refers to the actual process of adapting the application to the cultural
environment of end users. This process often involves translation of the user interface
and user documentation and can be quite time consuming and costly. Here are some
guidelines to follow:
• Create a mechanism that allows a glossary to drive the definition of the user
interface.
This can be particularly useful if you expect to localize the application often.
A translator can edit the glossary without having to understand the source
code of the application. Your tool can then create the user interface from the
translated glossary, and the translator can focus on making cosmetic
enhancements to the translation (such as positioning the messages appropri-
ately) and correcting minor errors.
• Consider creating a checklist of those user interface elements in your appli-
cation that should be externalized into text files from the source code, and
therefore from the compiled portion of the program. These text files can
then be modified even after the program is compiled. Externalize the
following elements:
•• Menus
•• Forms
•• Messages
•• Labels
•• Help (.msg) text
•• Numeric, date, time, and money formats
•• Report names
• Consider retaining a professional translator for some or all of this process.
A faulty translation is costly. You can spend a great deal of time and money
correcting errors in your localized product. And if you do not correct the
problems, your users will be dissatisfied with your application.
For many of the application elements discussed in this section, the two methods of
localization are the table-based approach and the file-based approach. The table-
based approach involves obtaining translation information from a database using
SQL queries. The file-based approach involves retrieving the values of the variables
from a text file.
Informix Translation
Informix provides error message translation for a variety of languages. You can use
the DBLANG environment variable to point to a message directory containing trans-
lated messages. Contact your local Informix sales office for a list of available
language translations.
Code-Set Conversion
The method available depends on whether you are using UNIX or Windows:
• The English servers create English databases with ASCII data. For these, the
4GL program must access the servers with DB_LOCALE set to en_us.8859-
1.
• The 5.x ALS versions of Informix servers can use variables such
as DBCODESET and DBCSOVERRIDE as substitutes for DB_LOCALE and
DBCONNECT, respectively. These environment variables need to be set by
using Setnet32.
• The 5.x ALS versions use DBASCIIBC to emulate the 4.x ASCII servers.
This environment variable should be set in the registry, if such behavior
is desired.
• The SERVER_LOCALE environment variable is set on the database server,
not on the 4GL client. This specifies the locale that the database server uses
to read or write operating-system files. If this is not set, the default is U.S.
English (en_us.8859-1).
If no setting is specified, the 4GL application uses an English locale. But the registry
sets everything to the local language, code set, or locale, so the practical default is for
applications to use the local locale.
The non-internationalized portions of the product are initialized with the default
(U.S. English) locale. That is, both CLIENT_LOCALE (en_us.1252) and
DB_LOCALE (en_us.8859-1) are set to English. This initialization is necessary
because many common functions are shared between the internationalized and non-
internationalized components.
Important: Except for DBFORMAT, all the environment variables that are
described in the sections that follow apply to Informix database servers.
When connecting to a GLS, NLS, or ALS (Asian Language Support) database, the
DB_LOCALE code set should match the DB_LOCALE code set of the database.
Otherwise, data corruption can occur, because no validation of code-set compatibility
is performed by the server. An ALS server can refuse the connection when the code
sets do not match, but an NLS server cannot.
Four J’s Uninersal 4GL also supports the following GLS environment variables:
4GL does not use DB_LOCALE directly; this variable, as well as DBLANG, is used
by the GLS version of INFORMIX-NET PC. See the Informix Guide to GLS Function-
ality for details on how DBLANG, DB_LOCALE, GL_DATE, are set.
Compatibility Issues
In order for 4GL to work with older Informix database servers (such as 5.x ALS), it is
necessary for these environment variables to be set in the Windows registry. This is
done by the GLS version of INFORMIX-NET PC. When the 4GL application accesses
an NLS database, appropriate NLS environment variables must be set in the registry
if NLS functionality is desired.
DBAPICODE
This environment variable specifies the name of a mapping file for peripheral devices
(for example, a keyboard, a display terminal, or a printer) whose character set is
different from that of the database server.
DB_LOCALE
This environment variable specifies the locale of the database to which the 4GL
component or application is connected. The only Informix databases that currently
support non-English languages exist in UNIX. Therefore, when the locales are non-
English, the localized 4GL application can only connect to these databases. The
format for setting DB_LOCALE is DB_LOCALE=<locale>.
• If the application uses this value to access a database, the locale of that
database must match the value specified in DB_LOCALE. If it does not
match, the database connection might be refused (unless DBCSOVERRIDE
is set to 1), depending on the server version.
• If a database is created, then this new database has the value specified by
DB_LOCALE.
• If DB_LOCALE is invalid, either because of wrong formatting or specifying
a locale that does not exist, then an error is issued.
• If the code set implied by DB_LOCALE cannot be converted to what
CLIENT_LOCALE implies, or vice versa, an error is issued.
CLIENT_LOCALE
This environment variable specifies the locale of the (input) source code and the
compiled code (to be generated). This is also the locale of the error files (if any) and
the intermediate files. The format of CLIENT_LOCALE is the same as that of
DB_LOCALE:
• The characters that reach the user interface (the non-ASCII characters) must
be in the CLIENT_LOCALE.
• If DB_LOCALE is invalid, either because of wrong formatting or specifying
a locale that does not exist, an error is issued.
• The DB_LOCALE and CLIENT_LOCALE settings need to be compatible,
meaning there should be proper code-set conversion tables between them.
Otherwise, an error is issued.
• If CLIENT_LOCALE is not set in the Windows client, then Windows code
page 1252 is the default.
• The CLIENT_LOCALE must match the environment of the user interface
(meaning that it should be compatible with the local version of Windows).
Otherwise, an error is issued.
• Collation by the 4GL application follows the code-set order
of CLIENT_LOCALE, except in SQL statements (where the database server
uses its own collation sequence). Any LC_COLLATE specification is
ignored.
DBLANG
The value of DBLANG is used to complete the pathname to the directories that
contain the required message, help, and demo files. The format of DBLANG is the
same as that of DB_LOCALE:
See also the description of DBLANG in the Informix Guide to GLS Functionality.
DBDATE
The DBDATE environment variable has been modified to support era-based dates
(Japanese and Taiwanese). The days of the week and months of the year (in local
form) are stored in the locale files. If this environment variable is set, it might
override other means of specifying date formats.
DBMONEY
This environment variable has been modified to accept multibyte currency symbols.
4GL components that read the value of DBMONEY (or DBFORMAT) must be able to
correctly process multibyte characters as currency symbols. If DBMONEY is set, its
value might override other means of specifying currency formats.
DBFORMAT
This environment variable has been modified to accept multibyte currency symbols.
Unlike the version of DBFORMAT for English products, display of the decimal point
is optional, rather than mandatory, in 4GL. (Use of a comma as the DBFORMAT
decimal separator can produce errors or unpredictable results in SQL statements in
which 4GL variables are expanded to number values that are formatted with commas
as the decimal separator.)
If DBFORMAT is set, its value can override other means of specifying number or
monetary formats.
The glfiles utility is described in the Informix Guide to GLS Functionality and is
packaged with INFORMIX-4GL and INFORMIX-SQL products. This utility allows you
to generate lists of the following files:
The following table shows the values assumed by 4GL when you define only some of
the required values of locales.
CL DL
Defined CL Value Defined DL Value CL Value DL Value
No -- No -- en_us.8859 en_us.8859
If you do not set the DBLANG environment variable, it is set to the value of
CLIENT_LOCALE.
Some of the language codes that Windows currently supports are listed in
the following table.
FRA French
You can develop your own language variable scheme. For example, the fol-
lowing three-letter codes identify a unique subdirectory that contains the
translation files appropriate for a particular language.
Subdirectory Language
eng English
fre French
ita Italian
spa Spanish
You might want to use this or the next approach if you need to control your
application’s language setting separately from that of other Windows
applications.
• Create your own .ini file and language variable, and have your application
read this file for the language setting.
To query programmatically for the language value, you can use the built-in
FGL_GETENV( ) function:
FGL_GETENV("LANG")
For more information about the LANG environment variable, see the Informix Guide
to SQL: Reference.
File-Based Localization
You can store the translations of localized information in disk files and access them
at runtime as needed.
You can use subdirectories to store language-sensitive files so they can easily be
switched to create a new runtime environment. In the following example, the
filename is composed by reading the value of an environment variable (created by the
programmer) that specifies a Windows language subdirectory:
LET file001 = FGL_GETENV("LANGUAGE"), "\", "trans.4gl"
# Evaluates to "eng\trans.4gl" if LANGUAGE is "eng"
# Program reads the eng directory for copy of translation
#
# Evaluates to "ger\trans.4gl" if LANGUAGE is "ger"
# Program reads the ger directory for copy of translation
#
LET tranfile = file001
In the preceding example, change the backslash character to a forward slash (/) for
UNIX systems.
Table-Based Localization
Localization information can also be stored in database tables. This information can
be used when you initialize or run the application to change the value of variables that
define titles, menus, and other language or culturally sensitive elements of the user
interface. An advantage of the table-based approach is that it is highly portable
between systems.
Setting Up a Table
The following example shows one way that you might set up a table to store menu
options:
CREATE TABLE menu_elements(
option_language CHAR(3), #language ID code
option_number SMALLINT, # identifying number
option_text CHAR(80), # text
option_maxlen SMALLINT # maximum length of string
)
Example data:
ENG150Cold Beer
FRE150Bière froide
GER150Kaltes Bier
SPA150Cerveza fría
ENG151Iced Tea
...
1. With a text editor that can create flat files, create a source (.msg) file with
the following format:
.message-number
message-text
.message-number
message-text
For example:
.1000
Part not found.
.1001
Price must be a positive number.
.1002
Invalid format for phone number.
To translate the messages into another language, simply provide translated
versions for the message text, using the same format.
2. At the system prompt, invoke the message compiler utility
(fglmkmsg) by using a command of the following form:
fglmkmsg filename
The message compiler processes filename.msg and produces a compiled
message file that has the name filename.iem.
If you want the compiled message file to have a different name from the
source file, specify that filename as a final argument:
fglmkmsg source output
To supply new versions of the messages, you need only provide a new source file and
compile it with the message compiler. The function calls in your application remain
the same.
Figure C-3
Processes and Their Locales
CLIENT_LOCALE DB_LOCALE
The code sets in the CLIENT_LOCALE can differ from those in DB_LOCALE. In the
CLIENT_LOCALE, the code sets (which are specified in locales) use code points that
are pre-defined by Microsoft standards. The code sets that are used in the
DB_LOCALE tend to use characters that are based on UNIX conventions, if the appli-
cation is designed to access legacy data.
Code-set conversion is done by way of a code-set conversion file. Files for code-set
conversion between CLIENT_LOCALE and DB_LOCALE need to be present on the
client. For conversion to take place, conversion files need to be present in the
%informixdir%\gls\cv directory.
For details of converting between client and server code sets, see the sections that
follow. For more information, see the Informix Guide to GLS Functionality.
If the encoding for a-circumflex on the Windows system is sent unchanged to the IBM
system, it will be printed as the Greek character gamma. This happens because, on
the IBM system, gamma is encoded as 0xE2.
This means character data strings that are passed between two computers using
different character set encodings must be converted between the two different
encodings. Otherwise, character data originating from one computer will not be
correctly displayed or processed on the other computer.
This appendix uses the term code set in the same way the Windows documentation
uses the terms character set and code page.
Converting character data from one encoding schema to another is called code-set
conversion. If a code-set conversion is required from computer A to computer B, it
is also required from computer B to computer A. You must explicitly enable code-set
conversion; no conversion is done by default. (Details on enabling code-set
conversion appear in “Enabling Code-Set Conversion for Windows” on page C-52.)
Code-set conversion does not create a character in the target code set if the character
exists only in the source code set. For example, if the character a-circumflex is being
passed to a computer whose code set does not contain an a-circumflex character, the
target computer will never be able to exactly process or print the a-circumflex
character. This situation is described in more detail in “Mismatch Processing” on
page C-51.
Sorting data by using the ORDER BY statement or retrieving data by using a LIKE or
MATCHES clause, however, will probably produce erroneous results if the data
strings are not converted before they are stored.
Mismatch Processing
If both code sets encode exactly the same characters, then mismatch handling is
unnecessary. If the source code set contains any characters that are not contained in
the target code set, however, the conversion must define how the mismatched
characters are to be mapped to the target code set.
The four ways code-set conversions handle mismatch processing are as follows:
For INFORMIX-NET to work correctly, all keyboard input, terminal output, and file
input and output must use the same code set on the client computer. All databases to
which your application connects during a single connection must also use the same
code set.
Follow these steps to establish code-set conversion. Each step is described in more
detail in the paragraphs that follow.
You must modify applications that write blobs to a database to set loc_loctype (in the
locator structure loc_t) to SQLBYTE or SQLTEXT. Setting this enables INFORMIX-
NET to determine if you are writing a binary blob (SQLBYTE) that should not be
converted, or a text blob (SQLTEXT) that should be converted. You do not need to set
this parameter for reading blob data.
Your system administrator should also know which code set is being used by the
database.
The object file for each conversion has the suffix .cvo. The corresponding source file
for each conversion has the suffix .cv. You need two object files for each conversion,
one for the client-to-server direction and one for the server-to-client direction. The
following table lists a few examples of code-set conversion files that are currently
available.
The names are defined in the Informix code-set name registry file. This file is named
registry and is located in the directory %informixdir%\gls\cm.
For example:
CLIENT_LOCALE=1252
DB_LOCALE=ISO8859-1
If your application must run in more than one locale with different code sets, it is
better to set the entries programmatically in the InetLogin structure, rather than
setting the entries with the Setnet32 utility (for Windows 9x and Windows NT appli-
cations) or in the informix.ini file (for Windows 3.1 applications).
You can also set these and other database environment variables through the
Setnet32 program: start Setnet32, and click MORE to display the second page of
options.
Your system administrator should also know which code set is being used by the
database.
Numerics
4gluser.msg file C-32
4GL functions, using 6-8
7.x libraries, finding B-8
A
a-circumflex character, coding C-50
Alphanumeric characters C-25
ALS (Asian language support) C-3, C-36
Application Container, setting default size 7-8
Application Container, setting title 7-8
Applications
Windows, starting 5-22
ar42o 4-38
ar42o script 4-26
Architecture, Four J’s BDL 1-5
Arcs, drawing 7-37
Arrays
differences from 4GL 1-7
displaying a row 5-26
Asian Language Support (ALS) C-3, C-38
Asian languages C-4, C-15, C-28
B
Bidirectional text processing C-17
Big-5 code page C-21
Binary blob C-53
Bitmaps, implementing 6-11
Blobs, text C-25
Index i
Button Fields 6-15
Buttons 6-6
adding to a form 6-10
implementing hot-key 6-6
implementing menu 6-6
No Key B-14
Byte-based string operations C-29
C
C code
compiling to 4-19
example 4-19
C compiler, GNU A-8
C functions
returning key codes from 5-20
using in 4GL applications 4-9
C language A-7
Canadian French language code C-44
Castilian Spanish language code C-44
CC environment variable A-7
Channel
closing 5-11
error codes 5-11
extensions 5-6
opening a file 5-7
opening a pipe 5-8
reading data 5-9
setting default separator 5-9
writing data 5-10
CHAR data type C-16
Character filter, creating 5-21
Character set C-12, C-50
Character string printable characters C-24
Characters, special B-10
D
Danish language code C-44
Data types
CHAR C-16
NCHAR C-14, C-16, C-17
NVARCHAR C-14, C-16, C-17
VARCHAR C-16
Database name C-26
Datetime 1-7
DB_LOCALE environment variable C-36, C-39, C-55
DBAPICODE environment variable C-36
DBASCIIBC environment variable C-36
DBCODESET environment variable C-36
DBCONNECT environment variable C-36
DBCSOVERRIDE environment variable C-36
DBDATE environment variable C-35, C-41
DBFORMAT environment variable C-35, C-41
DBLANG environment variable C-41
DBMONEY environment variable C-35, C-41
DBNLS environment variable C-17
DDE
using 5-11
Debugger C-23
Decimal point C-41
Deployment C-5, C-23
Diacritical marks C-13
Dialog boxes, creating 7-13
Differences from 4GL 1-7
E
East Asian languages C-28
Eight-bit clean C-12
Emulator, UNIX, starting 5-22
en_us.1252@dict C-15, C-17
en_us.1252@dict locale C-27
en_us.8859-1 C-17
envfcomp file 3-3
Environment settings C-22
Environment variables
CC A-7
CLIENT_LOCALE C-24, C-36, C-40, C-55
COLLCHAR C-17
DB_LOCALE C-39
DBAPICODE C-36
DBDATE C-29, C-35
DBFORMAT C-29, C-35, C-41
DBLANG C-41
DBMONEY C-35, C-41
DBNLS C-17
DISPLAY 8-19
FGLCC 3-3, A-4
FGLDBPATH A-2
FGLDBS 3-3
Index v
FGLDEBUGON A-7
FGLDIR 3-3, A-3
FGLGUI 1-14, 3-4, 7-5, A-2
FGLLDPATH A-4
FGLLIBSQL 3-3, A-5, B-9, B-10
FGLLIBSYS 3-4, A-6, B-10
FGLRUN A-4
FGLSERVER 8-19
FGLSHELL 3-4
FGLSQLDEBUG A-6
GCC A-8
GCC_EXEC_PREFIX A-8
GCCDIR A-8
INFORMIXDIR 3-3
INFORMIXHOST 8-13
INFORMIXPROTOCOL 8-11
INFORMIXSERVER 8-13
INFORMIXSERVICE 8-11
INFORMIXSQLHOSTS 8-13
LANG C-45
LC_COLLATE C-17, C-27
LD_LIBRARY_PATH 3-4
PATH 3-4, A-3, A-9, A-10
returning the value C-44
SERVER_LOCALE C-36
setting 3-3
setting for the compiler 4-4
setting in Windows Registry C-22
setting through Setnet32 C-44
TCL_LIBRARY A-10
TCLDIR A-9
TK_LIBRARY A-10
Windows system language variables C-43
WINSTATIONNAME 8-19
Error messages and internationalization C-35
F
FGL_GETENV( ) function C-44, C-45
fgl2c 4-26, 4-29, 8-17, A-3, B-14
fgl2p 4-26, 4-27, A-4
FGLCC environment variable 3-3, A-4
fglcomp 4-32
fglcomp program 4-26
FGLDBPATH environment variable A-2
FGLDBS environment variable 3-3
FGLDEBUGON environment variable A-7
FGLDIR environment variable 3-3, A-3
fglfontsel program 4-41
fglfontsel, fglfontsel.42e 4-45
fglfontsel.42e program 4-41
fglform 4-35
fglform compiler 1-14, 4-26
FGLGUI environment variable 1-14, 3-4, 7-5, A-2
fglinstall 4-47
fglinstall script 4-46
FGLLDPATH environment variable A-4
FGLLIBSQL environment variable 3-3, A-5, B-9, B-10
FGLLIBSYS environment variable 3-4, A-6, B-10
fgllink 4-33
fgllink program 4-26
fglmkmsg 4-37
fglmkmsg program 4-26
fglmkmsg utility C-4, C-7
fglmkrun script 4-13
fglmode 4-42
Index vii
fglpager 1-13, 4-47
fglpager command 1-13
fglpager script 4-46
fglprofile file
editing for buttons 6-7
FGLRUN environment variable A-4
fglschema 4-36, A-2
fglschema script 4-26
FGLSERVER environment variable 8-19
FGLSHELL environment variable 3-4
FGLSQLDEBUG environment variable A-6
fglWrt 4-48
fglWrt program 4-46
fglX11d 4-48, 8-19, A-7
fglX11d daemon 4-46
Field names, returning 5-25
Field values
returning 5-26
setting 5-26
Fields
retrieving information from 7-9
returning a value after modification 5-23
File extensions
.cv C-54
.cvo C-54
.iem C-48
.ini C-43, C-45
.msg C-32
File, opening with channels 5-7
Filename C-26
Filter, creating a custom character 5-21
findlib.sh 4-39
findlib.sh script 4-26
Finnish language code C-44
Font requirements C-13
G
GB 2312-80 code page C-21
GCC A-8
GCC compiler, and SCO B-13
GCC environment variable A-8
GCC_EXEC_PREFIX environment variable A-8
GCCDIR environment variable A-8
German language C-33
German language code C-44
GL_DATE environment variable C-35
Glossary of localization terms, keeping C-33
GLS
servers C-3
GNU C compiler A-8
Graphical replacement conversion C-52
Greek characters C-50
Greek language C-21
GUI configuration settings 8-17
H
Help messages
compiling 4-5
translating C-28
High-order bit C-12
Index ix
I
Icelandic language code C-44
Icon modification C-28
Identifiers C-25
Index name C-26
InetLogin structure C-53, C-55
informix.ini file C-55
INFORMIXDIR environment variable 3-3
INFORMIX-ESQL/C C-13
INFORMIXHOST environment variable 8-13
INFORMIX-NET C-49, C-55
INFORMIX-NET PC C-3
INFORMIXPROTOCOL environment variable 8-11
INFORMIX-SE database server C-3
INFORMIXSERVER environment variable 8-13
INFORMIXSERVICE environment variable 8-11
INFORMIXSQLHOSTS environment variable 8-13
Installation 2-3
Internal data file corrupted error, troubleshooting B-11
International Language Supplement C-20
Internationalization
codeset conversion C-49
enabling for UNIX C-56
enabling for Windows C-52
definition C-12
fonts C-32
keyboard layouts C-32
measurement systems C-31
messages C-47
overview of methodologies C-34
paper size C-32
reports C-32
translation checklist C-33
ISO 8859 C-12
J
JA 7.20 supplement C-20
Japanese language C-4, C-15, C-20, C-21, C-33
K
KEY 1-8
Key binding, removing 7-30
Key code values, returning 5-18
KEY Field attribute, setting 6-8
Kinsoku processing C-28
KO 7.20 supplement C-20
Korean language C-4, C-20, C-21
KSC 5601 code page C-21
L
LANG environment variable C-45
Language codes C-44
Language-sensitive files C-46
Language supplement C-20
Language variable C-43
Latin alphabet C-21
LC_COLLATE environment variable C-17, C-27
LD_LIBRARY_PATH environment variable 3-4
Length of identifiers C-25
Libraries, 7.x, finding B-8
Libraries, system, finding B-10
licencef4gl 4-44
licencef4gl script 4-41
License configuration 8-13
Line width, setting 7-34
Index xi
Line, drawing 7-36
Linking modules 4-8, 4-20
List boxes 6-4
Locale ID C-43
Locale variables C-45
Locales
client C-22, C-36, C-40, C-55
server C-22, C-36, C-39, C-55
Localization
defined C-12
guidelines C-33
Localized collation order C-14
Logfile names C-25, C-26
Logical characters C-13, C-29
Logical-character-based operations C-29
login.h file C-53
M
Mapping files C-56
Memory fault, troubleshooting B-15
Menus
default keys 8-30
differences from 4GL 1-8
in multibyte locales C-28
style configuration 8-20
Message box, creating 7-13
Message Compiler C-4, C-7, C-23
Microsoft Windows Programmer’s Reference C-33
Mismatch handling C-51
Modern Spanish language code C-44
Modifying fields and returning a value 5-23
Mouse management functions 7-29
Mouse usage 1-8
Multibyte locale C-29
O
Opening a file with channels 5-7
Opening a pipe with channels 5-8
Ovals, drawing 7-35
P
P code
compiling to 4-7
example 4-7
returning key codes from 5-19
pager.42e 4-47
pager.42e command 1-13
pager.42e script 4-46
Paper size C-32
Partial characters C-29
Partitioned application C-22
PATH environment variable 3-4, A-3, A-9, A-10
Pathname C-26
People’s Republic of China C-20, C-21
Index xiii
Pipe
opening 5-8
writing data to 5-10
Polygons, drawing 7-38
Portuguese language code C-44
Prepared statement name C-26
Printable characters C-24
PROMPT statement
differences from 4GL 1-9
Q
Quoted string C-25
R
Radio Buttons, implementing 6-14
Reading data from opened channel 5-9
Rectangles, drawing 7-35
Registry file C-54
Registry, setting environment variables in C-22
Relational operators C-14, C-27
Remove key binding 7-30
Report name C-26
Report pager 1-13
Reports, differences from 4GL 1-8
Retrieving information from a field 7-9
Retrieving information from a window 7-10
Returning a field value 5-26
Returning field names 5-25
Returning key code values 5-18
Returning value of an environment variable C-44
Returning values after changes 5-23
Returning values after mouse click 7-29
Round-trip conversion C-52
rtsinstall 4-47
S
Schema file, generating 4-6
SCO Open Server 5, and GCC compiler B-13
Screen array, displaying a row 5-26
Screen GUI
configuration settings 8-21
Screen record without size 1-14
Scrolling fields, implementing 6-17
Separator, setting default with channels 5-9
Server compatibility C-3
Server locale C-22
SERVER_LOCALE environment variable C-36
Setnet32 utility C-22, C-44, C-55
Setting compiler environment variables 4-4
Setting field values 5-26
Shift-JIS code page C-21
Single-byte locale C-29
Size, setting default for application container 7-8
Sorting data
in a query C-27
in a report C-27
Spanish language C-33
Special characters B-10
SQL identifiers C-25
SQL_TRANSLATE_DLL parameter C-55
SQL_TRANSLATE_OPTION parameter C-55
SQLBYTE data type C-53
sqlexit statement 1-8
SQLTEXT data type C-53
Starting a Windows program from UNIX B-16
Index xv
Statement label C-26
Statically linked runner, building 4-12
Stored procedure C-26
Streams
troubleshooting B-12
writing data to 5-10
Strings
character C-24
quoted C-25
Substitution conversion C-52
Substrings C-30
Swedish language code C-44
Synonym, SQL identifier C-26
System libraries, finding B-10
T
Table name C-26
Table-based localization C-46
Taiwanese C-20, C-21
TCL/TK interpreter A-9
Tcl/Tk interpreter A-9
TCL_LIBRARY environment variable A-10
TCLDIR environment variable A-9
TCP/IP 8-18, B-7
Text blobs C-25, C-53
Text geometry C-28
Text insertion point, specifying 7-33
Text labels C-28
Text, drawing 7-37
TH 7.20 supplement C-20
th_th.thai620 C-4, C-21
Thai language C-4, C-21, C-28
Title, setting for Application Container 7-8
TK_LIBRARY environment variable A-10
U
U.K. English language code C-44
U.S. English language code C-13, C-44
Underscore ( _ ) symbol C-25
UNIX system language variables C-45
UNIX-based servers C-3, C-49
Uppercase letters C-27
V
VARCHAR data type C-16
Variable name C-26
View name C-26
W
Western European languages C-21
White-space characters C-13, C-25, C-30
Window, closing 7-12
Window, retrieving information from 7-10
Window, setting active 7-11
Windows applications, starting 5-22
Windows Front End
checking for 7-6
Windows help facility C-4, C-23, C-28
Windows program, starting from UNIX server B-16
WINSTATIONNAME environment variable 8-19
Word length C-31
Index xvii
Workarounds for common problems B-1
X
X/Open C-21
X11 8-19, 8-30, 8-31, A-7
Z
ZHCN 7.20 supplement C-20
ZHTW 7.20 supplement C-20