4D Language
4D Language
______________________________________________________________________________________________________________________________________
Language Reference
Windows / Mac OS ® ®
4th Dimension®
© 4D SAS / 4D Inc. 1995-2007. All rights reserved.
__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The Software described in this manual is governed by the grant of license in the 4D
Product Line License Agreement provided with the Software in this package. The
Software, this manual, and all documentation included with the Software are
copyrighted and may not be reproduced in whole or in part except for in accordance
with the 4D Product Line License Agreement.
4th Dimension, 4D, the 4D logo, 4D Server are registered trademarks of 4D, Inc.
All other referenced trade names are trademarks or registered trademarks of their
respective holders.
Contents
1. Introduction.............................. 39
Preface................................................................................................. 41
Introduction.........................................................................................43
Building a 4D Application.....................................................................53
2. Language Definition..................67
Introduction to the 4D Language......................................................... 69
Data Types........................................................................................... 74
Constants.............................................................................................79
Variables.............................................................................................. 83
System Variables...................................................................................88
Pointers................................................................................................90
Identifiers........................................................................................... 100
Control Flow...................................................................................... 111
If...Else...End if....................................................................................113
Case of...Else...End case......................................................................115
While...End while............................................................................... 119
Repeat...Until..................................................................................... 121
For...End for....................................................................................... 122
Methods............................................................................................ 128
Project Methods.................................................................................134
3. 4D Environment...................... 143
Application type.................................................................................145
Version type....................................................................................... 146
Application version.............................................................................147
Compiled application......................................................................... 149
Application file................................................................................... 150
Structure file.......................................................................................151
Data file............................................................................................. 153
Is data file locked................................................................................155
Get 4D folder..................................................................................... 156
4. Arrays.......................................177
Arrays.................................................................................................179
Creating Arrays.................................................................................. 180
Arrays and Form Objects.................................................................... 183
Grouped Scrollable Areas....................................................................192
Arrays and the 4D Language.............................................................. 195
Arrays and Pointers.............................................................................197
Using the element zero of an array.....................................................200
Two-dimensional Arrays..................................................................... 203
Arrays and Memory............................................................................205
ARRAY INTEGER..................................................................................207
ARRAY LONGINT................................................................................209
ARRAY REAL........................................................................................211
ARRAY STRING................................................................................... 213
ARRAY TEXT....................................................................................... 215
ARRAY DATE.......................................................................................217
ARRAY BOOLEAN............................................................................... 219
ARRAY PICTURE..................................................................................221
ARRAY POINTER................................................................................. 223
Size of array....................................................................................... 225
SORT ARRAY.......................................................................................226
MULTI SORT ARRAY............................................................................228
Find in array....................................................................................... 231
Count in array.................................................................................... 233
INSERT ELEMENT............................................................................... 234
DELETE ELEMENT............................................................................... 235
5. Backup..................................... 253
BACKUP............................................................................................. 255
GET BACKUP INFORMATION............................................................. 256
CHECK LOG FILE................................................................................ 257
RESTORE............................................................................................ 259
GET RESTORE INFORMATION.............................................................261
SELECT LOG FILE................................................................................262
Log File.............................................................................................. 263
On Backup Startup Database Method.................................................264
On Backup Shutdown Database Method............................................265
New log file........................................................................................266
INTEGRATE LOG FILE..........................................................................267
6. BLOB........................................ 269
BLOB Commands...............................................................................271
SET BLOB SIZE....................................................................................275
BLOB size........................................................................................... 276
COMPRESS BLOB............................................................................... 277
EXPAND BLOB................................................................................... 279
BLOB PROPERTIES.............................................................................. 281
DOCUMENT TO BLOB....................................................................... 283
BLOB TO DOCUMENT....................................................................... 285
VARIABLE TO BLOB............................................................................ 287
7. Boolean....................................327
Boolean Commands...........................................................................329
True................................................................................................... 330
False...................................................................................................331
Not.................................................................................................... 332
8. Clipboard................................. 333
APPEND TO CLIPBOARD.................................................................... 335
CLEAR CLIPBOARD............................................................................. 342
GET CLIPBOARD.................................................................................343
GET PICTURE FROM CLIPBOARD........................................................345
Get text from clipboard......................................................................346
SET PICTURE TO CLIPBOARD..............................................................348
SET TEXT TO CLIPBOARD...................................................................349
Test clipboard.................................................................................... 350
33. On a Series.............................977
On a Series.........................................................................................979
Sum................................................................................................... 980
Average..............................................................................................981
Min.................................................................................................... 982
Max................................................................................................... 984
Std deviation......................................................................................985
Variance............................................................................................. 986
Sum squares.......................................................................................987
35. Printing................................1015
PRINT LABEL.....................................................................................1017
PRINT SELECTION............................................................................ 1020
Print form.........................................................................................1022
PAGE BREAK..................................................................................... 1025
PRINT RECORD................................................................................ 1027
Printing page................................................................................... 1029
PRINTERS LIST..................................................................................1030
SET CURRENT PRINTER.....................................................................1032
Get current printer........................................................................... 1033
BREAK LEVEL.................................................................................... 1034
SET PRINT OPTION.......................................................................... 1035
GET PRINT OPTION..........................................................................1038
PRINT OPTION VALUES.................................................................... 1040
ACCUMULATE..................................................................................1042
Subtotal........................................................................................... 1043
Level................................................................................................ 1046
PAGE SETUP..................................................................................... 1048
Get print marker.............................................................................. 1050
PRINT SETTINGS.............................................................................. 1051
SET PRINT PREVIEW..........................................................................1052
SET PRINT MARKER.......................................................................... 1053
GET PRINTABLE MARGIN..................................................................1059
45. Resources.............................1321
Resources......................................................................................... 1323
Resources and 4D Insider: an Example..............................................1331
Open resource file............................................................................ 1337
Create resource file...........................................................................1340
CLOSE RESOURCE FILE..................................................................... 1343
RESOURCE TYPE LIST........................................................................1344
RESOURCE LIST................................................................................ 1346
66. Windows..............................1961
Managing Windows......................................................................... 1963
Window Types................................................................................. 1966
Open window.................................................................................. 1974
Open external window.....................................................................1978
CLOSE WINDOW............................................................................. 1980
ERASE WINDOW.............................................................................. 1981
REDRAW WINDOW.......................................................................... 1982
DRAG WINDOW...............................................................................1983
HIDE WINDOW................................................................................ 1985
SHOW WINDOW..............................................................................1987
MAXIMIZE WINDOW....................................................................... 1988
MINIMIZE WINDOW........................................................................1990
Get window title.............................................................................. 1992
Constants...................................2147
4D Environment...............................................................................2149
ASCII Codes..................................................................................... 2150
Backup and Restore..........................................................................2152
BLOB................................................................................................2153
Clipboard.........................................................................................2154
Colors.............................................................................................. 2155
Communications..............................................................................2156
Database Engine.............................................................................. 2157
Database Events............................................................................... 2158
Database Parameters........................................................................2159
Date Display Formats....................................................................... 2161
Days and Months............................................................................. 2162
Dictionaries...................................................................................... 2163
Euro currencies.................................................................................2164
Events (Modifiers).............................................................................2165
Command Index........................2219
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
4th Dimension has its own programming language. This built-in language, consisting of over
500 commands, makes 4th Dimension a powerful development tool for database applications
on desktop computers. You can use the 4th Dimension language for many different tasks—
from performing simple calculations to creating complex custom user interfaces. For example,
you can:
• Programmatically access any of the editors available to the user in the User environment,
• Create and print complex reports and labels with the information from the database,
• Communicate with other devices,
• Manage documents,
• Import and export data between 4th Dimension databases and other applications,
• Incorporate procedures written in other languages into the 4th Dimension programming
language.
The flexibility and power of the 4th Dimension programming language make it the ideal tool
for all levels of users and developers to accomplish a complete range of information
management tasks. Novice users can quickly perform calculations. Experienced users without
programming experience can customize their databases. Experienced developers can use this
powerful programming language to add sophisticated features and capabilities to their
databases, including file transfer and communications. Developers with programming
experience in other languages can add their own commands to the 4th Dimension language.
The 4th Dimension programming language is expanded when any of the 4th Dimension
modules are added to the application. Each module includes language commands that are
specific to the capabilities they provide.
• The Language Reference is a guide to using the 4th Dimension language. Use this manual to
learn how to customize your database by incorporating 4th Dimension commands and
functions.
• The Design Reference provides detailed descriptions of the operations you can perform in the
Design environment to create forms for managing data.
Writing conventions
In this manual, several writing conventions are used:
• Following the example of the 4th Dimension Method editor, commands are written in all
caps using special characters, e.g.: OPEN DOCUMENT. Functions (commands that return a
value) start with a capital letter and continue in lower case, e.g.: Change string.
• In the command syntax, the { } characters (braces) indicate optional parameters. For example,
SET DEFAULT CENTURY (century{; pivotYear}) means that the pivotYear parameter may be
omitted when calling the command.
• In the command syntax, the | character indicates an alternative. For example, Table
(tableNum | aPtr) indicates that the function accepts either a table number or a pointer as
parameter.
• In certain examples in this documentation, a line of code may be continued onto the
following line(s) due to lack of space. However, you should type these examples as a single line
of code without using carriage returns.
This topic introduces you to the 4th Dimension programming language. The following topics
are discussed:
• What the language is and what it can do for you,
• How you will use methods,
• How to develop an application with 4th Dimension.
These topics are covered here in general terms; they are covered in greater detail in other
sections.
What is a Language?
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The 4th Dimension language is not very different from the spoken language we use every day.
It is a form of communication used to express ideas, inform, and instruct. Like a spoken
language, 4th Dimension has its own vocabulary, grammar, and syntax; you use it to tell 4th
Dimension how to manage your database and data.
You do not need to know everything in the language in order to work effectively with
4th Dimension. In order to speak, you do not need to know the entire English language; in
fact, you can have a small vocabulary and still be quite eloquent. The 4th Dimension language
is much the same—you only need to know a small part of the language to become productive,
and you can learn the rest as the need arises.
At first it may seem that there is little need for a programming language in 4th Dimension.
The Design and User environments provide flexible tools, which require no programming to
perform a wide variety of data management tasks. Fundamental tasks, such as data entry,
queries, sorting, and reporting are handled with ease. In fact, many extra capabilities are
available, such as data validation, data entry aids, graphing, and label generation.
Then why do we need a 4th Dimension language? Here are some of its uses:
• Automate repetitive tasks: These tasks include data modification, generation of complex
reports, and unattended completion of long series of operations.
• Control the user interface: You can manage windows and menus, and control forms and
interface objects.
The 4th Dimension language lets you take complete control of your data in a powerful and
elegant manner. The language is easy enough for a beginner, and sophisticated enough for an
experienced application developer. It provides smooth transitions from built-in database
functions to a completely customized database.
The commands in the 4th Dimension language provide access to the User environment
editors, with which you are already familiar. For example, when you use the QUERY command,
you are presented with the Query Editor. Using this language command is almost as easy as
choosing the Query command from the Queries menu, but the QUERY command is even more
useful. You can tell the QUERY command to search for explicitly described data. For example,
QUERY ([People];[People]Last Name="Smith") will find all the people named Smith in your
database.
The 4th Dimension language is very powerful—one command often replaces hundreds or even
thousands of lines of code written in traditional computer languages. Surprisingly enough,
with this power comes simplicity—commands have plain English names. For example, to
perform a query, you use the QUERY command; to add a new record, you use the ADD RECORD
command.
The language is designed for you to easily accomplish almost any task. Adding a record,
sorting records, searching for data, and similar operations are specified with simple and direct
commands. But the language can also control the serial ports, read disk documents, control
sophisticated transaction processing, and much more.
The 4th Dimension language accomplishes even the most sophisticated tasks with relative
simplicity. Performing these tasks without using the language would be unimaginable for
many.
If you are familiar with traditional computer languages, this section may be of interest. If not,
you may want to skip it.
The 4th Dimension language is not a traditional computer language. It is one of the most
innovative and flexible languages available on a computer today. It is designed to work the
way you do, and not the other way around.
To use traditional languages, you must do extensive planning. In fact, planning is one of the
major steps in development. 4th Dimension allows you to start using the language at any time
and in any part of your database. You may start by adding a method to a form, then later add
a few more methods. As your database becomes more sophisticated, you might add a project
method controlled by a menu. You can use as little or as much of the language as you want. It
is not “all or nothing,” as is the case with many other databases.
Traditional languages force you to define and pre-declare objects in formal syntactic terms. In
4th Dimension, you simply create an object, such as a button, and use it. 4th Dimension
automatically manages the object for you. For example, to use a button, you draw it on a form
and name it. When the user clicks the button, the language automatically notifies your
methods.
Traditional languages are often rigid and inflexible, requiring commands to be entered in a
very formal and restrictive style. The 4th Dimension language breaks with tradition, and the
benefits are yours.
A method is a series of instructions that causes 4th Dimension to perform a task. Each line of
instruction in a method is called a statement. Each statement is composed of parts of the
language.
Because you have already worked through the Quickstart tutorials (you did go through
Quickstart, didn’t you?), you have already written and used methods.
The following sections introduce each of these method types and give you a feel for how you
can use them to automate your database.
You can also build forms with multiple graphic controls, such as this one:
Whatever your style in building forms, all active objects have built-in aids, like range checking
and entry filters for data entry areas, and automatic actions for controls, menus, and buttons.
Always use these aids before adding object methods. The built-in aids are similar to methods
in that they remain associated with the active object and are active only when the active
object is being used. You will typically use a combination of built-in aids and object methods
to control the user interface.
An object method associated with an active object used for data entry typically performs a
data-management task specific to the field or variable. The method can perform data
validation, data formatting, or calculations. It may even get related information from other
files. Some of these tasks can, of course, also be performed with the built-in data entry aids for
objects. Use object methods when the task is too complex for the built-in data entry aids to
manage. For more information about the built-in data entry aids, refer to the 4th Dimension
Design Reference.
As you become more proficient with scripts, you will find that you can create libraries of
objects with associated methods. You can copy and paste these objects and their methods
between forms, tables, and databases. You can even keep them in the Clipbook (Windows) or
Scrapbook (Macintosh), ready to be used when you need them.
As forms are used in so many different ways, it is informative to monitor what is happening
while your form is in use. You use the various form events for this purpose. They tell you what
is currently happening with the form. Each type of event (i.e., clicks, double-clicks,
keystrokes...) enables or disables the execution of the form method as well as the object
method of each object of the form.
For more information about form, objects, events and methods, see the section Form event.
There is one other way to use project methods—associating them with menu commands.
When you associate a project method with a menu command, the method is executed when
the menu is chosen. You can think of the menu command as calling the project method.
For more information about Database Methods, see the section Database Methods.
Development is the process of customizing a database using the language and other built-in
tools.
By simply creating a database, you have already taken the first steps to using the language. All
the parts of your database—the tables and fields, the forms and their objects, and the menus—
are tied to the language. The 4th Dimension language “knows” about all of these parts of your
database.
Perhaps your first use of the language is to add a method to a form object in order to control
data entry. Later, you might add a form method to control the display of your form. As the
database becomes more complex, you can add a menu bar with project methods to completely
customize your database.
As with other aspects of 4th Dimension, development is a very flexible process. There is no
formal path to take during development—you can develop in a manner with which you are
comfortable. There are, of course, some general patterns in the process.
• Implementation: Implement your design in the Design environment.
• Testing: You try out the design in the User environment and perhaps stay there to use your
customized database.
• Usage: When your database is fully customized, you use it in the Custom Menus
environment.
• Corrections: If you find errors, you return to the Design environment to fix them.
Special development support tools, hidden until needed, are built into 4th Dimension. As you
use the language more frequently, you will find that these tools facilitate the development
process. For example, the Method Editor catches typing errors and formats your work; the
Interpreter (the engine that runs the language) catches errors in syntax and shows you where
and what they are; and the Debugger lets you monitor the execution of your methods to catch
errors in design.
Building Applications
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
By now you are familiar with the general uses of a database—data entry, searching, sorting,
and reporting. You have performed these tasks in the User environment, using the built-in
menus and editors.
Applications have custom menus and perform tasks that are specific to the needs of the person
using your database. An application is composed of all the pieces of your database: the
structure, the forms, the object, form and project methods, the menus, and the passwords.
You can compile your databases and create stand-alone Windows and Macintosh applications.
Compiling databases increases the execution speed of the language, protects your databases,
and allows you to create applications that are completely independent. The integrated
compiler also checks the syntax and the types of variables in methods for consistency.
An application can be as simple as a single menu that lets you enter people’s names and print
a report, or as complex as an invoicing, inventory, and control system. There are no limits to
the uses of database applications. Typically, an application grows from a database used in the
User environment to a database controlled completely by custom menus.
An application is a database designed to fill a specific need. It has a user interface designed
specifically to facilitate its use. The tasks that an application performs are limited to those
appropriate for its purpose. Creating applications with 4th Dimension is smoother and easier
than with traditional programming. 4th Dimension can be used to create a variety of
applications, including:
• An invoice system
• An inventory control system
• An accounting system
• A payroll system
• A personnel system
• A customer tracking system
• A database shared over the Internet or an Intranet
It is possible that a single application could even contain all of these systems. Applications like
these are typical uses of databases. In addition, the tools in 4th Dimension allow you to create
innovative applications, such as:
• A document tracking system
• A graphic image management system
• A catalog publishing application
• A serial device control and monitoring system
• An electronic mail system (E-mail)
• A multi-user scheduling system
• A list such as a menu list, video collection, or music collection
An application typically starts as a database used in the User environment. The database
“evolves” into an application as it is customized. What differentiates an application is that the
systems required to manage the database are hidden from the user. Database management is
automated, and users use menus to perform specific tasks.
When you use a 4th Dimension database in the User environment, you must know the steps
to take to achieve a result. In an application, you use the Custom Menus environment, in
which you need to manage all the aspects that are automatic in the User Environment. These
include:
•Table Navigation: The Choose Table/Form dialog box and List of Tables window are not
available to the user. You can use menu commands and methods to control navigation
between tables.
Custom Menus are the primary interface in an application. They make it easier for users to
learn and use a database. Creating custom menus is very simple—you associate methods or
automatic actions with each menu command (also called menu items) in the Menu editor.
“The User's Perspective” section describes what happens when the user chooses a menu
command. Next, “Behind the Scenes” describes the design work that made it happen.
Although the example is simple, it should be apparent how custom menus make the database
easier to use and learn. Rather than the “generic” tools and menu commands in the User
environment, the user sees only things that are appropriate to his or her needs.
The user enters the person’s first name and then tabs to the next field.
The user tabs to the next field: the last name is converted to uppercase.
Another blank record appears, and the user clicks the Cancel button (the one with the “X”) to
terminate the “data entry loop.” The user is returned to the menu bar.
When the user chooses this menu item, the New Person method executes:
Repeat
ADD RECORD([People])
Until (OK=0)
The Repeat...Until loop with an ADD RECORD command within the loop acts just like the New
Record menu item in the User environment. It displays the input form to the user, so that he
or she can add a new record. When the user saves the record, another new blank record
appears. This ADD RECORD loop continues to execute until the user clicks the Cancel button.
After a record has been entered, when the user clicks the Cancel button for the next one, the
OK variable is set to zero, thus ending the execution of the ADD RECORD loop.
Comparing an Automated Task with the Actions to be performed in the User environment
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Let’s compare the way a task is performed in the User environment and the way the same task
is performed using the language. The task is a common one:
• Find a group of records
• Sort them
• Print a report
The next section, “Using a Database in the User Environment,” displays the tasks performed in
the User environment.
The following section, “Using the Built-in Editors within the Custom Menus environment,”
displays the same tasks performed in an application.
Note that although both methods perform the same task, the steps in the second section are
automated using the language.
The user enters the criteria and clicks the Query button. The search is performed.
The user enters the criteria and clicks the Sort button. The sort is performed.
Even at this point, using an application is easier for the users—they did not need to know that
querying is the first step!
QUERY ([People])
ORDER BY ([People])
OUTPUT FORM ([People]; "Report")
PRINT SELECTION ([People])
QUERY ([People])
The user enters the criteria and clicks the Query button. The query is performed.
ORDER BY ([People])
Note that the user did not need to know that ordering the records was the next step.
The user enters the criteria and clicks the Sort button. The sort is performed.
Once again, the user did not need to know what to do next; the method takes care of that.
The Printing dialog boxes are displayed. The User chooses the settings, and the report is
printed.
The same commands used in the previous example can be used to further automate the
database.
The user chooses Report from the People menu. A method called My Report2 is attached to the
menu command. It looks like this:
QUERY([People];[People]Company="Acme")
ORDER BY([People]; [People]Last Name;>;[People]First Name;>)
OUTPUT FORM([People];"Report")
PRINT SELECTION([People];*)
QUERY([People];[People]Company="Acme")
The Query editor is not displayed. Instead, the query is specified and performed by the QUERY
command. The user does not need to do anything.
The Order By editor is not displayed, and the sort is immediately performed. Once again, no
user actions are required.
The Printing dialog boxes are not displayed. The PRINT SELECTION command accepts an
optional asterisk (*) parameter that instructs the command to use the print settings that were
in effect when the report form was created. The report is printed.
This additional automation saved the user from having to enter options in three dialog boxes.
Here are the benefits :
• The query is automatically performed: users may select wrong criteria when making a query.
• The sort is automatically performed: users may select wrong criteria when defining a sort.
• The printing is automatically performed: users may select the wrong form to print.
As you develop a 4D application, you will discover many capabilities that you did not notice
when you started. You can even augment the standard version of 4D by adding other tools
and plug-ins to your 4D development environment.
• 4D Insider allows you to cross-reference your 4th Dimension databases. You can use it to
view and print methods, variables, commands, externals, structures, lists, and forms. The cross-
referencing utility tells you where each of these objects is used throughout your database. It
also helps you to move objects like tables, forms, methods, menu bars, lists, packages, and
styles from one database to another.
• 4D Write: Word-processor
• 4D Draw: Graphical drawing program
• 4D View: Spreadsheet and list editor
• 4D Internet Commands (built-in): Communication utilities via Internet.
For more information, contact 4D or its Partners. Visit our Web Sites:
USA & International:
http://www.4d.com
France:
http://www.4d.fr
http://forums.4D.fr
The 4D community offers access to tips and tricks, solutions, information, and additional
tools that will save you time and energy, and increase your productivity.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The 4th Dimension language is made up of various components that help you perform tasks
and manage your data.
• Data types: Classifications of data in a database. See discussion in this section as well as the
detailed discussion in the section Data Types.
• Variables: Temporary storage places for data in memory. See detailed discussion in the
section Variables.
• Operators: Symbols that perform a calculation between two values. See discussion in this
section as well as the detailed discussion in the section Operators and its subsections.
• Expressions: Combinations of other components that result in a value. See discussion in this
section.
• Commands: Built-in instructions to perform an action. All 4D commands, such as ADD
RECORD, are described in this manual, grouped by theme; when necessary, the theme is
preceded by an introductory section. You can use 4D Plug-ins to add new commands to your
4D development environment. For example, once you have added the 4D Write Plug-in to
your 4D system, the 4D Write commands become available for creating and manipulating
word-processing documents.
• Methods: Instructions that you write using all parts of the language listed here. See
discussion in the section Methods and its subsections.
This section introduces Data Types, Operators, and Expressions. For the other components, refer
to the sections cited above.
In addition:
• Language components, such as variables, have names called Identifiers. For a detailed
discussion about identifiers and the rules for naming objects, refer to the section Identifiers.
• To learn more about array variables, refer to the section Arrays.
• To learn more about BLOB variables, refer to the section BLOB commands.
• If you plan to compile your database, refer to the section Compiler Commands as well as the
Design Reference manual of 4th Dimension.
In the language, the various types of data that can be stored in a 4th Dimension database are
referred to as data types. There are seven basic data types: string, numeric, date, time, Boolean,
picture, and pointer.
• String: A series of characters, such as “Hello there”. Alpha and Text fields, and string and
text variables, are of the string data type.
• Numeric: Numbers, such as 2 or 1,000.67. Integer, Long Integer, and Real fields and variables
are of the numeric data type.
• Date: Calendar dates, such as 1/20/89. Date fields and variables are of the date data type.
• Time: Times, including hours, minutes, and seconds, such as 1:00:00 or 4:35:30 PM. Time
fields and variables are of the time data type.
• Boolean: Logical values of TRUE or FALSE. Boolean fields and variables are of the Boolean
data type.
• Picture: Picture fields and variables are of the picture data type.
• Pointer: A special type of data used in advanced programming. Pointer variables are of the
pointer data type. There is no corresponding field type.
Note that in the list of data types, the string and numeric data types are associated with more
than one type of field. When data is put into a field, the language automatically converts the
data to the correct type for the field. For example, if an integer field is used, its data is
automatically treated as numeric. In other words, you need not worry about mixing similar
field types when using the language; it will manage them for you.
However, when using the language it is important that you do not mix different data types. In
the same way that it makes no sense to store “ABC” in a Date field, it makes no sense to put
“ABC” in a variable used for dates. In most cases, 4th Dimension is very tolerant and will try
to make sense of what you are doing. For example, if you add a number to a date, 4th
Dimension will assume that you want to add that number of days to the date, but if you try to
add a string to a date, 4th Dimension will tell you that the operation cannot work.
There are cases in which you need to store data as one type and use it as another type. The
language contains a full complement of commands that let you convert from one data type to
another. For example, you may need to create a part number that starts with a number and
ends with characters such as “abc”. In this case, you might write:
[Products]Part Number:=String(Number)+"abc"
If Number is 17, then [Products]Part Number will get the string “17abc”.
The data types are fully defined in the section Data Types.
When you use the language, it is rare that you will simply want a piece of data. It is more
likely that you will want to do something to or with that data. You perform such calculations
with operators. Operators, in general, take two pieces of data and perform an operation on
them that results in a new piece of data. You are already familiar with many operators. For
example, 1 + 2 uses the addition (or plus sign) operator to add two numbers together, and the
result is 3. This table shows some familiar numeric operators:
Numeric operators are just one type of operator available to you. 4th Dimension supports
many different types of data, such as numbers, text, dates, and pictures, so there are operators
that perform operations on these different data types.
The same symbols are often used for different operations, depending on the data type. For
example, the plus sign (+) performs different operations with different data:
The operators are fully defined in the section Operators and its subsections.
Expressions
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Simply put, expressions return a value. In fact, when using the 4th Dimension language, you
use expressions all the time and tend to think of them only in terms of the value they
represent. Expressions are also sometimes referred to as formulas.
Expressions are made up of almost all the other parts of the language: commands, operators,
variables, and fields. You use expressions to build statements (lines of code), which in turn are
used to build methods. The language uses expressions wherever it needs a piece of data.
An expression can simply be a constant, such as the number 4 or the string “Hello.” As the
name implies, a constant’s value never changes. It is when operators are introduced that
expressions start to get interesting. In preceding sections you have already seen expressions
that use operators. For example, 4 + 2 is an expression that uses the addition operator to add
two numbers together and return the result 6.
You refer to an expression by the data type it returns. There are seven expression types:
• String expression
• Numeric expression (also referred to as number)
• Date expression
• Time expression
• Boolean expression
• Picture expression
• Pointer expression
The following table gives examples of each of the seven types of expressions.
See Also
Arrays, Constants, Data Types, Methods, Operators, Pointers, Variables.
4th Dimension fields, variables, and expressions can be of the following data types:
Notes
1. String includes alphanumeric field, fixed length variable, and text field or variable.
2. Number includes Real, Integer, and Long Integer field and variable.
3. BLOB is an acronym for Binary Large OBject. For more information about BLOBs, see the
section BLOB Commands.
4. Array includes all types of arrays. For more information, see the section Arrays.
String
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
A string is composed of characters. Each character can be any of the 256 ASCII codes. For more
information about ASCII codes and how 4D handles them in a cross-platform environment,
see the section ASCII Codes.
You can assign a string to a text field and vice-versa; 4D does the conversion, truncating if
necessary. You can mix string and text in an expression.
Note: In the 4D Language Reference, both string and text parameters in command descriptions
are denoted as String, except when marked otherwise.
Number
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The range for the Real data type is ±1.7e±308 (15 digits)
The range for the Integer data type (2-byte Integer) is -32,768..32,767 (2^15..(2^15)-1)
The range for the Long Integer data type (4-byte Integer) is -2^31..(2^31)-1
You can assign any Number data type to another; 4D does the conversion, truncating or
rounding if necessary. However, when values are out of range, the conversion will not return a
valid value. You can mix Number data types in expressions.
Note: In the 4D Language Reference, no matter the actual data type, the Real, Integer, and Long
Integer parameters in command descriptions are denoted as Number, except when marked
otherwise.
Date
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Note: In the 4D Language Reference, Date parameters in command descriptions are denoted as
Date, except when marked otherwise.
Note: In the 4D Language Reference, Time parameters in command descriptions are denoted as
Time, except when marked otherwise.
Boolean
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Note: In the 4D Language Reference, Boolean parameters in command descriptions are denoted
as Boolean, except when marked otherwise.
Picture
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
A Picture field, variable or expression can be any Windows or Macintosh picture. In general,
this includes any picture that can be put on the Clipboard or read from the disk using 4D or
Plug-In commands.
Note: In the 4D Language Reference, Picture parameters in command descriptions are denoted
as Picture, except when marked otherwise.
Pointer
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
A Pointer variable or expression is a reference to another variable (including arrays and array
elements), table, or field. There is no field of type Pointer.
Note: In the 4D Language Reference, Pointer parameters in command descriptions are denoted
as Pointer except when marked otherwise.
A BLOB field or variable is a series of bytes (from 0 to 2 GB in length) that you can address
individually or by using the BLOB Commands. There is no expression of type BLOB.
Note: In the 4D Language Reference, BLOB parameters in command descriptions are denoted as
BLOB.
Array
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Array is not actually a data type. The various types of arrays (such as Integer Array, Text Array,
and so on) are grouped under this title. Arrays are variables—there is no field of type Array,
and there is no expression of type Array. For more information about arrays, see the section
Arrays.
Note: In the 4D Language Reference, Array parameters in command descriptions are denoted as
Array, except when marked otherwise (i.e., String Array, Numeric Array, ...).
Subtable
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Subtable is not actually a data type. Only fields can be of type Subtable. There is no variable or
expression of type Subtable. For more information about subtables, see the 4th Dimension
Design Reference manual as well as the commands regrouped under the Subrecords theme.
Undefined
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Undefined is not actually a data type. It denotes a variable that has not yet been defined. A
function (a project method that returns a result) can return an undefined value if, within the
method, the function result ($0) is assigned an undefined expression (an expression calculated
with at least one undefined variable). A field cannot be undefined.
The 4D language contains operators and commands to convert between data types, where
such conversions are meaningful. The 4D language enforces data type checking. For example,
you cannot write: "abc"+0.5+!12/25/96!-?00:30:45?. This will generate syntax errors.
Note: In addition to the data conversions listed inthis table, more sophisticated data
conversions can be obtained by combining operators and other commands.
See Also
Arrays, Constants, Control Flow, Identifiers, Methods, Operators, Pointers, Type, Variables.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
A constant is an expression that has a fixed value. There are two types of constants:
predefined constants that you select by name, and literal constants for which you type the
actual value.
Predefined Constants
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Version 6 of 4th Dimension introduces predefined constants. These constants are listed in the
Explorer Window:
The predefined constants are listed by theme. To use a predefined constant in a Method editor
window:
• Drag and drop the constant from the Explorer window to the Method Editor window.
• Directly type its name in the Method Editor window.
Tip: If you directly enter the name of a predefined constant, you can use the @ symbol (at
sign) to avoid typing the entire constant name. For example, if you type “No such da@”, 4D
will fill the line with the constant “No such data in clipboard” when you press Return or Enter
to validate the line of code.
Note: The predefined constants (about 500) are listed by theme in this manual. See the section
About this manual for more information. When appropriate, predefined constants are also
listed in the command descriptions.
Predefined constants appeared underlined by default within the Method Editor and Debugger
windows:
Literal Constants
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
String Constants
A string constant is enclosed in double, straight quotation marks ("…"). Here are some
examples of string constants:
"Add Records"
"No records found."
"Invoice"
An empty string is specified by two quotation marks with nothing between them ("").
27
123.76
0.0076
Negative numbers are specified with the minus sign(–). For example:
–27
–123.76
–0.0076
Date Constants
A date constant is enclosed by exclamation marks (!…!). In the US English version of 4D, a
date is ordered month/day/year, with a slash (/) setting off each part. Here are some examples
of date constants:
!1/1/76!
!4/4/04!
!12/25/96!
Tip: The Method Editor includes a shortcut for entering a null date. To type a null date, enter
the exclamation (!) character and press Enter.
Note: A two-digit year is assumed to be in the 1900’s. Unless this default setting has been
changed using the command SET DEFAULT CENTURY.
Time Constants
A time constant is enclosed by question marks (?...?).
Note: This syntax can be used on both Windows and Macintosh. On Macintosh, you can also
use the Dagger symbol (Option-T on a US keyboard).
In the US English version of 4D, a time constant is ordered hour:minute:second, with a colon
(:) setting off each part. Times are specified in 24-hour format.
?00:00:00? ` midnight
?09:30:00? ` 9:30 am
?13:01:59? ` 1 pm, 1 minute, and 59 seconds
Tip: The Method Editor includes a shortcut for entering a null time. To type a null time, enter
the question mark (?) character and press Enter.
See Also
Control Flow, Data Types, Identifiers, Methods, Operators, Pointers, Variables.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Data in 4th Dimension is stored in two fundamentally different ways. Fields store data
permanently on disk; variables store data temporarily in memory.
When you set up your 4th Dimension database, you specify the names and types of fields that
you want to use. Variables are much the same—you also give them names and different types.
You can display variables (except Pointer and BLOB) on the screen, enter data into them, and
print them in reports. In these ways, enterable and non-enterable area variables act just like
fields, and the same built-in controls are available when you create them:
• Display formats
• Data validation, such entry filters and default values
• Character filters
• Choice lists (hierarchical lists)
• Enterable or non-enterable values
You create variables simply by using them; you do not need to formally define them as you do
with fields. For example, if you want a variable that will hold the current date plus 30 days,
you write:
MyDate:=Current date+30
4th Dimension creates MyDate and holds the date you need. The line of code reads “MyDate
gets the current date plus 30 days.” You could now use MyDate wherever you need it in your
database. For example, you might need to store the date variable in a field of same type:
[MyTable]MyField:=MyDate
Sometimes you may want a variable to be explicitly defined as a certain type. For more
information about typing variables for a database that you intend to compile, see the section
Compiler Commands.
Data can be put into and copied out of variables. Putting data into a variable is called
assigning the data to the variable and is done with the assignment operator (:=). The
assignment operator is also used to assign data to fields.
The assignment operator is the primary way to create a variable and to put data into it. You
write the name of the variable that you want to create on the left side of the assignment
operator. For example:
MyNumber:=3
creates the variable MyNumber and puts the number 3 into it. If MyNumber already exists,
then the number 3 is just put into it.
Of course, variables would not be very useful if you could not get data out of them. Once
again, you use the assignment operator. If you need to put the value of MyNumber in a field
called [Products]Size, you would write MyNumber on the right side of the assignment operator:
[Products]Size:=MyNumber
Important: Be careful not to confuse the assignment operator (:=) with the comparison
operator, equal (=). Assignment and comparison are very different operations. For more
information about the comparison operators, see the section Operators.
You can create three types of variables: local variables, process variables, and interprocess
variables. The difference between the three types of variables is their scope, or the objects to
which they are available.
Local variables
A local variable is, as its name implies, local to a method—accessible only within the method
in which it was created and not accessible outside of that method. Being local to a method is
formally referred to as being “local in scope.” Local variables are used to restrict a variable so
that it works only within the method.
You may want to use a local variable to:
• Avoid conflicts with the names of other variables
• Use data temporarily
• Reduce the number of process variables
The name of a local variable always starts with a dollar sign ($) and can contain up to 31
additional characters. If you enter a longer name, 4th Dimension truncates it to the
appropriate length.
When you are working in a database with many methods and variables, you often find that
you need to use a variable only within the method on which you are working. You can create
and use a local variable in the method without worrying about whether you have used the
same variable name somewhere else.
Frequently, in a database, small pieces of information are needed from the user. The Request
command can obtain this information. It displays a dialog box with a message prompting the
user for a response. When the user enters the response, the command returns the information
the user entered. You usually do not need to keep this information in your methods for very
long. This is a typical way to use a local variable. Here is an example:
Process variables
A process variable is available only within a process. It is accessible to the process method and
any other method called from within the process.
A process variable does not have a prefix before its name. A process variable name can contain
up to 31 characters.
In interpreted mode, variables are maintained dynamically, they are created and erased from
memory “on the fly.” In compiled mode, all processes you create (user processes) share the
same definition of process variables, but each process has a different instance for each variable.
For example, the variable myVar is one variable in the process P_1 and another one in the
process P_2.
Starting with version 6, a process can “peek and poke” process variables from another process
using the commands GET PROCESS VARIABLE and SET PROCESS VARIABLE. It is good
programming practice to restrict the use of these commands to the situation for which they
were added to 4D:
• Interprocess communication at specific places or your code
• Handling of interprocess drag and drop
• In Client/Server, communication between processes on client machines and the stored
procedures running on the server machines
For more information, see the section Processes and the description of these commands.
Interprocess variables
Interprocess variables are available throughout the database and are shared by all processes.
They are primarily used to share information between processes.
The name of an interprocess variable always begins with the symbols (<>) — a “less than” sign
followed by a “greater than” sign— followed by 31 characters.
Note: This syntax can be used on both Windows and Macintosh. In addition, on Macintosh
only, you can use the diamond (Option-Shift-V on US keyboard).
In Client/Server, each machine (Client machines and Server machine) share the same
definition of interprocess variables, but each machine has a different instance for each variable.
In the Form editor, naming an active object—button, radio button, check box, scrollable area,
meter bar, and so on—automatically creates a variable with the same name. For example, if
you create a button named MyButton, a variable named MyButton is also created. Note that
this variable name is not the label for the button, but is the name of the button.
The form object variables allow you to control and monitor the objects. For example, when a
button is clicked, its variable is set to 1; at all other times, it is 0. The variable associated with a
meter or dial lets you read and change the current setting. For example, if you drag a meter to
a new setting, the value of the variable changes to reflect the new setting. Similarly, if a
method changes the value of the variable, the meter is redrawn to show the new value.
For more information about variables and forms, see the 4th Dimension Design Reference
Manual as well as the section Form event.
System Variables
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
4th Dimension maintains a number of variables called system variables. These variables let
you monitor many operations. System variables are all process variables, accessible only from
within a process.
The most important system variable is the OK system variable. As its name implies, it tells you
if everything is OK in the particular process. Was the record saved? Has the importing
operation been completed? Did the user click the OK button? The OK system variable is set to
1 when a task is completed successfully, and to 0 when it is not.
For more information about system variables, see the section System Variables.
See Also
Arrays, Constants, Control Flow, Data Types, Identifiers, Methods, Operators, Pointers.
4th Dimension manages system variables, which allow you to control the execution of
different operations. All system variables are process variables that can only be accessed
within one process. This section describes 4th Dimension system variables.
OK
This is the most commonly used system variable. Usually it is set to 1 when an operation is
successfully executed. It is set to 0 when the operation fails. Most of the 4D commands
modify the value of the OK system variable. Refer to the description of each command to
find out whether it affects this system variable.
Document
Document contains either the "long name" (access path+name) or the name (depending on
the value passed as parameter) of the last file opened or created using the following
commands:
FldDelimit
FldDelimit contains the ASCII code that will be used as a field separator when importing or
exporting text. By default, this value is set to 9, which is the ASCII code for the Tab key. To
use a different field separator, assign a new value to FldDelimit.
RecDelimit
RecDelimit contains the ASCII code that will be used as a record separator when importing
or exporting text. By default, this value is set to 13, which is the ASCII code for the Carriage
Return key. To use a different record separator, assign a new value to RecDelimit.
See Also
Sets, Variables.
When you use the language, you access various objects—in particular, tables, fields, variables,
and arrays—by simply using their names. However, it is often useful to refer to these elements
and access them without knowing their names. This is what pointers let you do.
The concept behind pointers is not that uncommon in everyday life. You often refer to
something without knowing its exact identity. For example, you might say to a friend, “Let’s
go for a ride in your car” instead of “Let’s go for a ride in the car with license plate 123ABD.”
In this case, you are referencing the car with license plate 123ABD by using the phrase “your
car.” The phrase “car with license plate 123ABD” is like the name of an object, and using the
phrase “your car” is like using a pointer to reference the object.
Being able to refer to something without knowing its exact identity is very useful. In fact, your
friend could get a new car, and the phrase “your car” would still be accurate—it would still be
a car and you could still take a ride in it. Pointers work the same way. For example, a pointer
could at one time refer to a numeric field called Age, and later refer to a numeric variable
called Old Age. In both cases, the pointer references numeric data that could be used in a
calculation.
You can use pointers to reference tables, fields, variables, arrays, and array elements. The
following table gives an example of each data type:
It is easiest to explain the use of pointers through an example. This example shows how to
access a variable through a pointer. We start by creating a variable:
MyVar:="Hello"
MyVar is now a variable containing the string “Hello.” We can now create a pointer to MyVar:
MyPointer:=->MyVar
The -> symbol means “get a pointer to.” This symbol is formed by a dash followed by a
“greater than” sign. In this case, it gets the pointer that references or “points to” MyVar. This
pointer is assigned to MyPointer with the assignment operator.
MyPointer is now a variable that contains a pointer to MyVar. MyPointer does not contain
“Hello”, which is the value in MyVar, but you can use MyPointer to get this value. The
following expression returns the value in MyVar:
MyPointer->
In this case, it returns the string “Hello”. The -> symbol, when it follows a pointer, references
the object pointed to. This is called dereferencing.
It is important to understand that you can use a pointer followed by the -> symbol anywhere
that you could have used the object that the pointer points to. This means that you could use
the expression MyPointer-> anywhere that you could use the original MyVar variable.
For example, the following line displays an alert box with the word Hello in it:
ALERT(MyPointer->)
You can also use MyPointer to change the data in MyVar. For example, the following statement
stores the string "Goodbye" in the variable MyVar:
MyPointer->:="Goodbye"
If you examine the two uses of the expression MyPointer->, you will see that it acts just as if
you had used MyVar instead. In summary, the following two lines perform the same action—
both display an alert box containing the current value in the variable MyVar:
ALERT(MyPointer->)
ALERT(MyVar)
MyPointer->:="Goodbye"
MyVar:="Goodbye"
This section describes how to use a pointer to reference a button. A button is (from the
language point of view) nothing more than a variable. Although the examples in this section
use pointers to reference buttons, the concepts presented here apply to the use of all types of
objects that can be referenced by a pointer.
Let’s say that you have a number of buttons in your forms that need to be enabled or disabled.
Each button has a condition associated with it that is TRUE or FALSE. The condition says
whether to disable or enable the button. You could use a test like this each time you need to
enable or disable the button:
` ...
SET BUTTON (->bValidate;True)
` ...
SET BUTTON (->bValidate;False)
` ...
SET BUTTON (->bValidate;([Employee]Last Name#"")
` ...
For ($vlRadioButton;1;20)
$vpRadioButton:=Get pointer("r"+String($vlRadioButton))
SET BUTTON ($vpRadioButton;False)
End for
Anywhere that the language expects to see a table, you can use a dereferenced pointer to the
table.
You create a pointer to a table by using a line like this:
TablePtr:=->[anyTable]
You can also get a pointer to a table by using the Table command. For example:
TablePtr:=Table(20)
DEFAULT TABLE(TablePtr->)
Anywhere that the language expects to see a field, you can use a dereferenced pointer to
reference the field. You create a pointer to a field by using a line like this:
FieldPtr:=->[aTable]ThisField
You can also get a pointer to a field by using the Field command. For example:
FieldPtr:=Field(1; 2)
FONT(FieldPtr->; "Arial")
The example at the beginning of this section illustrates the use of a pointer to a variable:
MyVar:="Hello"
MyPointer:=->MyVar
You can use pointers to interprocess, process and, starting with version 2004.1, local variables.
When you use pointers to process or local variables, you must be sure that the variable pointed
to is already set when the pointer is used. Keep in mind that local variables are deleted when
the method that created them has completed its execution and process variables are deleted at
the end of the process that created them. When a pointer calls a variable that no longer exists,
this causes a syntax error in interpreted mode (variable not defined) but it can generate a more
serious error in compiled mode.
Note about local variables: Pointers to local variables allow you to save process variables in
many cases. Pointers to local variables can only be used within the same process.
In the debugger, when you display a pointer to a local variable that has been declared in
another method, the original method name is indicated in parentheses, after the pointer. For
example, if you write in Method1:
$MyVar:="Hello world"
Method2(->$MyVar)
You can create a pointer to an array element. For example, the following lines create an array
and assign a pointer to the first array element to a variable called ElemPtr:
ElemPtr->:=8
You can create a pointer to an array. For example, the following lines create an array and
assign a pointer to the array to a variable called ArrPtr:
ArrPtr->{4} := 84
It is often useful to have an array of pointers that reference a group of related objects.
One example of such a group of objects is a grid of variables in a form. Each variable in the
grid is sequentially numbered, for example: Var1,Var2,…, Var10. You often need to reference
these variables indirectly with a number. If you create an array of pointers, and initialize the
pointers to point to each variable, you can then easily reference the variables. For example, to
create an array and initialize each element, you could use the following lines:
To reference any of the variables, you use the array elements. For example, to fill the variables
with the next ten dates (assuming they are variables of the date type), you could use the
following lines:
If you have a group of related radio buttons in a form, you often need to set them quickly. It is
inefficient to directly reference each one of them by name. Let’s say you have a group of radio
buttons named Button1, Button2,…, Button5.
In a group of radio buttons, only one radio button is on. The number of the radio button that
is on can be stored in a numeric field. For example, if the field called [Preferences]Setting
contains 3, then Button3 is selected. In your form method, you could use the following code to
set the button:
Case of
:(Form event=On Load)
` ...
Case of
: ([Preferences]Setting = 1)
Button1:=1
: ([Preferences]Setting = 2)
Button2:=1
: ([Preferences]Setting = 3)
Button3:=1
: ([Preferences]Setting = 4)
Button4:=1
: ([Preferences]Setting = 5)
Button5:=1
End case
` ...
End case
Case of
:(Form event=On Load)
` ...
$vpRadio:=Get pointer("Button"+String([Preferences]Setting))
$vpRadio->:=1
` ...
End case
The number of the set radio button must be stored in the field called [Preferences]Setting. You
can do so in the form method for the On Clicked event:
[Preferences]Setting:=Button1+(Button2*2)+(Button3*3)+(Button4*4)+(Button5*5)
You can pass a pointer as a parameter to a method. Inside the method, you can modify the
object referenced by the pointer. For example, the following method, TAKE TWO, takes two
parameters that are pointers. It changes the object referenced by the first parameter to
uppercase characters, and the object referenced by the second parameter to lowercase
characters. Here is the method:
The following line uses the TAKE TWO method to change a field to uppercase characters and to
change a variable to lowercase characters:
If the field [My Table]My Field contained the string "jones", it would be changed to the string
"JONES". If the variable MyVar contained the string "HELLO", it would be changed to the string
"hello".
Pointers to Pointers
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
If you really like to complicate things, you can use pointers to reference other pointers.
Consider this example:
MyVar := "Hello"
PointerOne := ->MyVar
PointerTwo := ->PointerOne
(PointerTwo->)-> := "Goodbye"
ALERT((Point Two->)->)
• MyVar:="Hello"
→ This line puts the string "Hello" into the variable MyVar.
• PointerOne:=->MyVar
→ PointerOne now contains a pointer to MyVar.
• PointerTwo:=->PointerOne
→ PointerTwo (a new variable) contains a pointer to PointerOne, which in turn points to MyVar.
• (PointerTwo->)->:="Goodbye"
→ PointerTwo-> references the contents of PointerOne, which in turn references MyVar.
Therefore (PointerTwo->)-> references the contents of MyVar. So in this case, MyVar is assigned
"Goodbye".
• ALERT ((PointerTwo->)->)
→ Same thing: PointerTwo-> references the contents of PointerOne, which in turn references
MyVar. Therefore (PointerTwo->)-> references the contents of MyVar. So in this case, the alert
box displays the contents of myVar.
(PointerTwo->)->:="Hello"
NewVar:=(PointerTwo->)->
See Also
Arrays, Arrays and Pointers, Constants, Control Flow, Data Types, Identifiers, Methods, Operators,
Variables.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
This section describes the conventions for naming various objects in the 4th Dimension
language. The names for all objects follow these rules:
• A name must begin with an alphabetic character.
• Thereafter, the name can include alphabetic characters, numeric characters, the space
character, and the underscore character.
• Periods, slashes, and colons are not allowed.
• Characters reserved for use as operators, such as * and +, are not allowed.
• 4th Dimension ignores any trailing spaces.
Tables
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
You denote a table by placing its name between brackets: [...]. A table name can contain up to
31 characters.
Examples
DEFAULT TABLE ([Orders])
INPUT FORM ([Clients]; "Entry")
ADD RECORD ([Letters])
Fields
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
You denote a field by first specifying the table to which the field belongs. The field name
immediately follows the table name. A field name can contain up to 31 characters.
Do not start a field name with the underscore character (_). The underscore character is
reserved for plug-ins. When 4th Dimension encounters this character at the beginning of a
field in the Method editor, it removes the underscore.
Examples
[Orders]Total:=Sum([Line]Amount)
QUERY([Clients];[Clients]Name="Smith")
[Letters]Text:=Capitalize text ([Letters]Text)
Subtables
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
You denote a subtable by first specifying the parent table to which the subtable belongs. The
subtable name immediately follows the table name. A subtable name can contain up to 31
characters.
Examples
ALL SUBRECORDS ([People]Children)
ADD SUBRECORD ([Clients]Phones;"Add One")
NEXT SUBRECORD ([Letters]Keywords)
A subtable is treated as a type of field; therefore, it follows the same rules as a field when used
in a form. If you are specifying a subtable in the table, form, or object method of the parent
table, you do not need to specify the parent table name. However, it is a good programming
technique to specify the name of the table before the subtable name.
Subfields
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
You denote a subfield in the same way as a field. You denote the subfield by first specifying
the subtable to which the subfield belongs. The subfield name follows, and is separated from
the subtable name by, an apostrophe ('). A subfield name can contain up to 31 characters.
Examples
[People]Children'First Name:=Uppercase([People]Children'First Name)
[Clients]Phones'Number:="408 555–1212"
[Letters]Keywords'Word:=Capitalize text ([Letters]Keywords'Word)
If you are specifying a subfield in a subtable, form, or object method of the subfile, you do not
need to specify the subtable name. However it is a good programming technique to specify the
table name and the subtable name before the name of the subfield.
You denote an interprocess variable by preceding the name of the variable with the symbols
(<>) — a “less than” sign followed by a “greater than” sign.
Note: This syntax can be used on both Windows and Macintosh. In addition, on Macintosh
only, you can use the diamond (Option-Shift-V on US keyboard).
An interprocess variable can have up to 31 characters, not including the <> symbols.
Examples
<>vlProcessID:=Current process
<>vsKey:=Char(KeyCode)
If (<>vtName#"")
Process Variables
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
You denote a process variable by using its name (which cannot start with the <> symbols nor
the dollar sign $). A process variable name can contain up to 31 characters.
Examples
<>vrGrandTotal:=Sum([Accounts]Amount)
If (bValidate=1)
vsCurrentName:=""
Local Variables
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
You denote a local variable with a dollar sign ($) followed by its name. A local variable name
can contain up to 31 characters, not including the dollar sign.
Examples
For ($vlRecord; 1; 100)
If ($vsTempVar="No")
$vsMyString:="Hello there"
You denote an array by using its name, which is the name you passed to the array declaration
(such as ARRAY LONGINT) when you created the array. Arrays are variables, and from the scope
point of view, like variables, there are three different types of arrays:
• Interprocess arrays,
• Process arrays,
• Local arrays.
Interprocess Arrays
The name of an interprocess array is preceded by the symbols (<>) — a “less than” sign
followed by a “greater than” sign.
Note: This syntax can be used on both Windows and Macintosh. In addition, on Macintosh
only, you can use the diamond (Option-Shift-V on US keyboard).
An interprocess array name can contain up to 31 characters, not including the <> symbols.
Examples
Process Arrays
You denote a process array by using its name (which cannot start with the <> symbols nor the
dollar sign $). A process array name can contain up to 31 characters.
Examples
Local Arrays
The name of a local array is preceded by the dollar sign ($). An local array name can contain
up to 31 characters, not including the dollar sign.
Elements of arrays
You reference an element of an interprocess, process or local array by using the curly
braces({…}). The element referenced is denoted by a numeric expression.
Examples
` Addressing an element of an interprocess array
If (<>asKeywords{1}="Stop")
<>atSubjects{$vlElem}:=[Topics]Subject
$viNextValue:=<>aiBigArray{Size of array(<>aiBigArray)}
Examples
` Addressing an element of a two-dimensional interprocess array
If (<>asKeywords{$vlNextRow}{1}="Stop")
<>atSubjects{10}{$vlElem}:=[Topics]Subject
$viNextValue:=<>aiBigArray{$vlSet}{Size of array(<>aiBigArray{$vlSet})}
` Addressing an element of a two-dimensional process array
If (asKeywords{$vlNextRow}{1}="Stop")
atSubjects{10}{$vlElem}:=[Topics]Subject
$viNextValue:=aiBigArray{$vlSet}{Size of array(aiBigArray{$vlSet})}
Forms
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
You denote a form by using a string expression that represents its name. A form name can
contain up to 31 characters.
Examples
INPUT FORM([People];"Input")
OUTPUT FORM([People]; "Output")
DIALOG([Storage];"Note box"+String($vlStage))
Methods
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
You denote a method (procedure and function) by using its name. A method name can
contain up to 31 characters.
Note: A method that does not return a result is also called a procedure. A method that returns
a result is also called a function.
Examples
If (New client)
DELETE DUPLICATED VALUES
APPLY TO SELECTION ([Employees];INCREASE SALARIES)
Tip: It is a good programming technique to adopt the same naming convention as the one
used by 4D for built-in commands. Use uppercase characters for naming your methods;
however if a method is a function, capitalize the first character of its name. By doing so, when
you reopen a database for maintenance after a few months, you will already know if a method
returns a result by simply looking at its name in the Explorer window.
Note: When you call a method, you just type its name. However, some 4D built-in commands,
such as ON EVENT CALL, as well as all the Plug-In commands, expect the name of a method as
a string when a method parameter is passed. Example:
Methods can accept parameters (arguments). The parameters are passed to the method in
parentheses, following the name of the method. Each parameter is separated from the next by
a semicolon (;). The parameters are available within the called method as consecutively
numbered local variables: $1, $2,…, $n. In addition, multiple consecutive (and last) parameters
can be addressed with the syntax ${n}where n, numeric expression, is the number of the
parameter.
Examples
` Within DROP SPACES $1 is a pointer to the field [People]Name
DROP SPACES (->[People]Name)
` Within Dump:
` - The three parameters are text or string
` - They can be addressed as $1, $2 or $3
` - They can also be addressed as, for instance, ${$vlParam} where $vlParam is 1, 2 or 3
` - The result value is assigned to $0
vtClone:=Dump ("is"; "the"; "it")
You denote a plug-in command by using its name as defined by the plug-in. A plug-in
command name can contain up to 31 characters.
Examples
WR BACKSPACE (wrArea; 0)
$pvNewArea:=PV New offscreen area
Sets
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
From the scope point of view, there are two types of sets:
• Interprocess sets
• Process sets.
4D Server also includes:
• Client sets.
Interprocess Sets
A set is an interprocess set if the name of the set is preceded by the symbols (<>) — a “less
than” sign followed by a “greater than” sign.
Note: This syntax can be used on both Windows and Macintosh. In addition, on Macintosh
only, you can use the diamond (Option-Shift-V on US keyboard).
An interprocess set name can contain up to 80 characters, not including the <> symbols.
Process Sets
You denote a process set by using a string expression that represents its name (which cannot
start with the <> symbols or the dollar sign $). A set name can contain up to 80 characters.
Client Sets
The name of a client set is preceded by the dollar sign ($). A client set name can contain up to
80 characters, not including the dollar sign.
Note: In 4D Client/Server up to version 6, a set was maintained on the Client machine where
it was created. Starting with version 6, sets are maintained on the Server machine. In certain
cases, for efficiency or special purposes, you may need to work with sets locally on the Client
machine. To do so, you use Client sets.
Named Selections
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
From the scope point of view, there are two types of named selections:
• Interprocess named selections
• Process named selections.
Note: This syntax can be used on both Windows and Macintosh. In addition, on Macintosh
only, you can use the diamond (Option-Shift-V on US keyboard).
An interprocess named selection name can contain up to 80 characters, not including the <>
symbols.
Examples
` Interprocess Named Selection
USE NAMED SELECTION([Customers];"<>ByZipcode")
` Process Named Selection
USE NAMED SELECTION([Customers];"<>ByZipcode")
In the single-user version, or in Client/Server on the Client side, there are two types of
processes:
• Global processes
• Local processes.
Global Processes
You denote a global process by using a string expression that represents its name (which
cannot start with the dollar sign $). A process name can contain up to 31 characters.
Local Processes
You denote a local process if the name of the process is preceded by a dollar ($) sign. The
process name can contain up to 31 characters, not including the dollar sign.
Example
` Starting the global process "Add Customers"
$vlProcessID:=New process("P_ADD_CUSTOMERS";48*1024;"Add Customers")
` Starting the local process "$Follow Mouse Moves"
$vlProcessID:=New process("P_MOUSE_SNIFFER";16*1024;"$Follow Mouse Moves")
If a particular object has the same name as another object of a different type (for example, if a
field is named Person and a variable is also named Person), 4th Dimension uses a priority
system to identify the object. It is up to you to ensure that you use unique names for the parts
of your database.
1. Fields
2. Commands
3. Methods
4. Plug-in routines
5. Predefined constants
6. Variables.
For example, 4th Dimension has a built-in command called Date. If you named a method
Date, 4th Dimension would recognize it as the built-in Date command, and not as your
method. This would prevent you from calling your method. If, however, you named a field
“Date”, 4th Dimension would try to use your field instead of the Date command.
See Also
Arrays, Constants, Data Types, Methods, Operators, Pointers, Variables.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Regardless of the simplicity or complexity of a method, you will always use one or more of
three types of programming structures. Programming structures control the flow of execution,
whether and in what order statements are executed within a method. There are three types of
structures:
• Sequential
• Branching
• Looping
The 4th Dimension language contains statements that control each of these structures.
Sequential structure
The sequential structure is a simple, linear structure. A sequence is a series of statements that
4th Dimension executes one after the other, from first to last. For example:
A one-line routine, frequently used for object methods, is the simplest case of a sequential
structure. For example:
Branching structures
A branching structure allows methods to test a condition and take alternative paths,
depending on the result. The condition is a Boolean expression, an expression that evaluates
TRUE or FALSE. One branching structure is the If...Else...End if structure, which directs program
flow along one of two paths. The other branching structure is the Case of...Else...End case
structure, which directs program flow to one of many paths.
• While...End while
• Repeat...Until
• For...End for
The loops are controlled in two ways: either they loop until a condition is met, or they loop a
specified number of times. Each looping structure can be used in either way, but While loops
and Repeat loops are more appropriate for repeating until a condition is met, and For loops are
more appropriate for looping a specified number of times.
See Also
Logical Operators, Methods.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
If (Boolean_Expression)
statements(s)
Else
statement(s)
End if
If (Boolean_Expression)
statements(s)
End if
The If...Else...End if structure lets your method choose between two actions, depending on
whether a test (a Boolean expression) is TRUE or FALSE.
When the Boolean expression is TRUE, the statements immediately following the test are
executed. If the Boolean expression is FALSE, the statements following the Else statement are
executed. The Else statement is optional; if you omit Else, execution continues with the first
statement (if any) following the End if.
Example
` Ask the user to enter the name
$Find:=Request(“Type a name:”)
If (OK=1)
QUERY([People]; [People]LastName=$Find)
Else
ALERT("You did not enter a name.")
End if
Tip: Branching can be performed without statements to be executed in one case or the other.
If (Boolean_Expression)
Else
statement(s)
End if
or:
If (Boolean_Expression)
statements(s)
Else
End if
See Also
Case of...Else...End case, Control Flow, For...End for, Repeat...Until, While...End while.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The formal syntax of the Case of...Else...End case control flow structure is:
Case of
: (Boolean_Expression)
statement(s)
: (Boolean_Expression)
statement(s)
.
.
.
: (Boolean_Expression)
statement(s)
Else
statement(s)
End case
Case of
: (Boolean_Expression)
statement(s)
: (Boolean_Expression)
statement(s)
.
.
.
: (Boolean_Expression)
statement(s)
End case
As with the If...Else...End if structure, the Case of...Else...End case structure also lets your method
choose between alternative actions. Unlike the If...Else...End if structure, the Case of...Else...End
case structure can test a reasonable unlimited number of Boolean expressions and take action
depending on which one is TRUE.
: (bValidate=1)
Only the statements following the first TRUE case (and up to the next case) will be executed. If
none of the cases are TRUE, none of the statements will be executed (if no Else part is
included).
You can include an Else statement after the last case. If all of the cases are FALSE, the
statements following the Else will be executed.
Example
This example tests a numeric variable and displays an alert box with a word in it:
Case of
: (vResult = 1) ` Test if the number is 1
ALERT("One.") ` If it is 1, display an alert
: (vResult = 2) ` Test if the number is 2
ALERT("Two.") ` If it is 2, display an alert
: (vResult = 3) ` Test if the number is 3
ALERT("Three.") ` If it is 3, display an alert
Else ` If it is not 1, 2, or 3, display an alert
ALERT("It was not one, two, or three.")
End case
Consequently, when you want to implement hierarchical tests, you should make sure the
condition statements that are lower in the hierarchical scheme appear first in the test
sequence. For example, the test for the presence of condition1 covers the test for the presence
of condition1&condition2 and should therefore be located last in the test sequence. For
example, the following code will never see its last condition detected:
Case of
: (vResult = 1)
... `statement(s)
: ((vResult = 1) & (vCondition#2)) `this case will never be detected
... `statement(s)
End case
.
In the code above, the presence of the second condition is not detected since the test
"vResult=1" branches off the code before any further testing. For the code to operate properly,
you can write it as follows:
Case of
: ((vResult = 1) & (vCondition#2)) `this case will be detected first
... `statement(s)
: (vResult = 1)
... `statement(s)
End case
.
Also, if you want to implement hierarchical testing, you may consider using hierarchical code.
Tip: Branching can be performed without statements to be executed in one case or another.
Case of
: (Boolean_Expression)
: (Boolean_Expression)
.
.
.
: (Boolean_Expression)
statement(s)
Else
statement(s)
End case
or:
Case of
: (Boolean_Expression)
: (Boolean_Expression)
statement(s)
.
.
.
: (Boolean_Expression)
statement(s)
Else
End case
or:
Case of
Else
statement(s)
End case
See Also
Control Flow, For...End for, If...Else...End if, Repeat...Until, While...End while.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The formal syntax of the While...End while control flow structure is:
While (Boolean_Expression)
statement(s)
End while
A While...End while loop executes the statements inside the loop as long as the Boolean
expression is TRUE. It tests the Boolean expression at the beginning of the loop and does not
enter the loop at all if the expression is FALSE.
It is common to initialize the value tested in the Boolean expression immediately before
entering the While...End while loop. Initializing the value means setting it to something
appropriate, usually so that the Boolean expression will be TRUE and While...End while
executes the loop.
The Boolean expression must be set by something inside the loop or else the loop will
continue forever. The following loop continues forever because NeverStop is always TRUE:
NeverStop:=True
While (NeverStop)
End while
If you find yourself in such a situation, where a method is executing uncontrolled, you can
use the trace facilities to stop the loop and track down the problem. For more information
about tracing a method, see the section Debugging.
Example
See Also
Case of...Else...End case, Control Flow, For...End for, If...Else...End if, Repeat...Until.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Repeat
statement(s)
Until (Boolean_Expression)
A Repeat...Until loop is similar to a While...End while loop, except that it tests the Boolean
expression after the loop rather than before. Thus, a Repeat...Until loop always executes the
loop once, whereas if the Boolean expression is initially False, a While...End while loop does not
execute the loop at all.
The other difference with a Repeat...Until loop is that the loop continues until the Boolean
expression is TRUE.
Example
Compare the following example with the example for the While...End while loop. Note that the
Boolean expression does not need to be initialized—there is no CONFIRM command to
initialize the OK variable.
Repeat
ADD RECORD([aTable])
Until (OK=0)
See Also
Case of...Else...End case, Control Flow, For...End for, If...Else...End if, While...End while.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The formal syntax of the For...End for control flow structure is:
• The counter variable Counter_Variable is a numeric variable (Real, Integer, or Long Integer)
that the For...End for loop initializes to the value specified by Start_Expression.
• Each time the loop is executed, the counter variable is incremented by the value specified in
the optional value Increment_Expression. If you do not specify Increment_Expression, the
counter variable is incremented by one (1), which is the default.
• When the counter variable passes the End_Expression value, the loop stops.
Tip: However, for special purposes, you can change the value of the counter variable
Counter_Variable within the loop; this will affect the loop.
Basic Examples
1. The following example executes 100 iterations:
For (vCounter;1;100)
` Do something
End for
3. The following example goes through all the characters of the text vtSomeText:
For ($vlChar;1;Length(vtSomeText))
` Do something with the character if it is a TAB
If (Ascii(vtSomeText[[$vlChar]])=Char(Tab))
` ...
End if
End for
4. The following example goes through the selected records for the table [aTable]:
FIRST RECORD([aTable])
For ($vlRecord;1;Records in selection([aTable]))
` Do something with the record
SEND RECORD([aTable])
` ...
` Go to the next record
NEXT RECORD([aTable])
End for
Most of the For...End for loops you will write in your databases will look like the ones listed in
these examples.
For (vCounter;100;1;-1)
` Do something
End for
6. The following example goes through all elements of the array anArray:
7. The following example goes through all the characters of the text vtSomeText:
For ($vlChar;Length(vtSomeText);1;-1)
` Do something with the character if it is a TAB
If (Ascii(vtSomeText[[$vlChar]])=Char(Tab))
` ...
End if
End for
8. The following example goes through the selected records for the table [aTable]:
LAST RECORD([aTable])
For ($vlRecord;Records in selection([aTable]);1;-1)
` Do something with the record
SEND RECORD([aTable])
` ...
` Go to the previous record
PREVIOUS RECORD([aTable])
End for
10. In the following example, a selection of the records is browsed until this is actually done
or until the interprocess variable <>vbWeStop, intially set to FALSE, becomes TRUE. This
variable is handled by an ON EVENT CALL project method that allows you to interrupt the
operation:
<>vbWeStop:=False
ON EVENT CALL ("HANDLE STOP")
` HANDLE STOP sets <>vbWeStop to True if Ctrl-period (Windows)
` or Cmd-Period (Macintosh) is pressed
$vlNbRecords:=Records in selection([aTable])
FIRST RECORD([aTable])
For ($vlRecord;1;$vlNbRecords)
` Do something with the record
SEND RECORD([aTable])
` ...
` Go to the next record
If (<>vbWeStop)
$vlRecord:=$vlNbRecords+1 ` Force the counter variable to get out of the loop
Else
NEXT RECORD([aTable])
End if
End for
ON EVENT CALL("")
If (<>vbWeStop)
ALERT("The operation has been interrupted.")
Else
ALERT("The operation has been successfully completed.")
End if
For (vCounter;1;100)
` Do something
End for
It is interesting to see how the While...End while loop and Repeat...Until loop would perform the
same action.
Tip: The For...End for loop is usually faster than the While...End while and Repeat...Until loops,
because 4th Dimension tests the condition internally for each cycle of the loop and
increments the counter. Therefore, use the For...End for loop whenever possible.
In order to make the commands, operators, and other parts of the language work, you put
them in methods. There are several kinds of methods: Object methods, Form methods, Table
methods (Triggers), Project methods, and Database methods. This section describes features
common to all types of methods.
A method is composed of statements; each statement consists of one line in the method. A
statement performs an action, and may be simple or complex. Although a statement is always
one line, that one line can be as long as needed (up to 32,000 characters, which is probably
enough for most tasks).
For example, the following line is a statement that will add a new record to the [People] table:
ADD RECORD([People])
A method also contains tests and loops that control the flow of the execution. For a detailed
discussion about the control flow programming structures, see the section Control Flow.
Note: The maximum size of a method is limited to 2 GB of text or 32 000 lines of command.
Beyond these limits, a warning message appears, indicating that the extra lines will not be
displayed.
Types of Methods
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
• Form methods: A form method is a property of a form. You can use a form method to
manage data and objects, but it is generally simpler and more efficient to use an object
method for these purposes. You do not call a form method—4D calls it automatically when an
event involves the form to which the form method is attached.
For more information about Object methods and Form methods, see the 4th Dimension Design
Reference Manual as well as the section Form event.
For detailed information about Project methods, see the section Project Methods.
• Database methods: In the same way that object and form methods are called when events
occur in a form, there are methods associated with the database that are called when a
working session event occurs. These are the database methods. For example, each time you
open a database, you may want to initialize some variables that will be used during the whole
working session. To do so, you use the On Startup Database Method, automatically executed by
4D when you open the database.
For more information about Database Methods, see the section Database Methods.
1. Version 6 introduces many new object and form events (such as On Double Clicked, On
Getting Focus, and so on) that replace the execution cycles from the previous versions. If you
have converted a version 3 database to version 6, your forms have been converted in order to
preserve the “expected behavior” of your forms and objects. If you want to take advantage of
the new events for forms and objects created with a previous version of 4D, you must enable
the new events in the Property List window for the forms and the objects.
2. Table methods, also called triggers, are a new type of method introduced in version 6. In
previous versions of 4th Dimension, table methods (called file procedures) were executed by
4D only when a form for a table was used for data entry, display, or printing. They were rarely
used. Note that triggers execute at a much lower level that the old file procedures. No matter
what you do to a record via user actions (like data entry) or programmatically (like a call to
SAVE RECORD), the trigger of a table will be called by 4D. Triggers are truly quite different from
the old file procedures. If you have converted a version 3 database to version 6, and if you
want to take advantage of the new Trigger capability, you must deselect the Use V3.x.x File
Procedure Scheme property in the Preferences dialog box (shown in this section).
3. Database methods are a new type of method introduced in version 6. In previous versions of
4th Dimension, there was only one method (procedure) that 4D automatically executed when
you opened a database. This procedure had to be called STARTUP (US English INTL version) or
DEBUT (French version) in order to be invoked. If you have converted a version 3 database to
version 6, and if you want to take advantage of the new On Startup Database Method
capability, you must deselect the Use V3.x.x Startup Method Scheme property in the
Preferences dialog box (shown in this section). This property only affects the STARTUP/On
Startup Database Method alternative. If you do not deselect this property and add, for instance,
an On Exit Database Method, this latter will be called by 4D.
All methods are fundamentally the same—they start at the first line and work their way
through each statement until they reach the last line (i.e., they execute sequentially). Here is
an example project method:
The first element in the line, QUERY, is a command. A command is part of the 4th Dimension
language—it performs a task. In this case, QUERY displays the Query editor. This is similar to
choosing Query from the Records menu in the User environment.
The second element in the line, specified between parantheses, is an argument to the QUERY
command. An argument (or parameter) is data required by a command in order to complete
its task. In this case, [People] is the name of a table. Table names are always specified inside
square brackets ([…]). In our example, the People table is an argument to the QUERY
command. A command can accept several parameters.
The third element is a comment at the end of the line. A comment tells you (and anyone else
who might read your code) what is happening in the code. It is indicated by the reverse
apostrophe (`). Anything (on the line) following the comment mark will be ignored when the
code is run. A comment can be put on a line by itself, or you can put comments to the right of
the code, as in the example. Use comments generously throughout your code; this makes it
easier for you and others to read and understand the code.
The next line of the method checks to see if any records were found:
Note: Notice that only the first letter of the function name is capitalized. This is the naming
convention for 4th Dimension functions.
You should already know what the current selection is—it is the group of records you are
working on at any given time. If the number of records is equal to 0 (in other words, if no
records were found), then the following line is executed:
The End if statement concludes the If statement’s section of control. Whenever there is a
control-of-flow statement, you need to have a corresponding statement telling the language
where the control stops.
Be sure you feel comfortable with the concepts in this section. If they are all new, you may
want to review them until they are clear to you.
See Also
Arrays, Constants, Control Flow, Data Types, Database Methods, Identifiers, Operators, Pointers,
Triggers, Variables.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Project methods are aptly named. Whereas form and object methods are bound to forms and
objects, a project method is available anywhere; it is not specifically attached to any particular
object of the database. A project method can have one of the following roles, depending on
how it is executed and used:
• Menu method
• Subroutine and function
• Process method
• Event catching method
• Error catching method
These terms do not distinguish project methods by what they are, but by what they do.
A menu method is a project method called from a custom menu. It directs the flow of your
application. The menu method takes control—branching where needed, presenting forms,
generating reports, and generally managing your database.
The subroutine is a project method that can be thought of as a servant. It performs those tasks
that other methods request it to perform. A function is a subroutine that returns a value to the
method that called it.
A process method is a project method that is called when a process is started. The process lasts
only as long as the process method continues to execute. For more information about
processes, see the section Processes. Note that a menu method attached to a menu command
whose property Start a New Process is selected, is also the process method for the newly
started process.
An event catching method runs in a separate process as the process method for catching
events. Usually, you let 4D do most of the event handling for you. For example, during data
entry, 4D detects keystrokes and clicks, then calls the correct object and form methods so you
can respond appropriately to the events from within these methods. In other circumstances,
you may want to handle events directly. For example, if you run a lengthy operation (such as
For...End For loop browsing records), you may want to be able to interrupt the operation by
typing Ctrl-Period (Windows) or Cmd-Period (Macintosh). In this case, you should use an
event catching method to do so. For more information, see the description of the command
ON EVENT CALL.
Menu Methods
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
A menu method is invoked in the Custom Menus environment when you select the custom
menu command to which it is attached. You assign the method to the menu command using
the Menu editor. The menu executes when the menu command is chosen. This process is one
of the major aspects of customizing a database. By creating custom menus with menu
methods that perform specific actions, you personalize your database. Refer to the 4th
Dimension Design Reference manual for more information about the Menu editor.
Custom menu commands can cause one or more activities to take place. For example, a menu
command for entering records might call a method that performs two tasks: displaying the
appropriate input form, and calling the ADD RECORD command until the user cancels the data
entry activity.
Subroutines
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
When you create a project method, it becomes part of the language of the database in which
you create it. You can then call the project method in the same way that you call 4th
Dimension’s built-in commands. A project method used in this way is called a subroutine.
If you do not use subroutines, you will have to write the code each time you want to modify a
customer’s record. If there are ten places in your custom database where you need to do this,
you will have to write the code ten times. If you use subroutines, you will only have to write it
once. This is the first advantage of subroutines—to reduce the amount of code.
If the previously described code was a method called MODIFY CUSTOMER, you would execute
it simply by using the name of the method in another method. For example, to modify a
customer’s record and then print the record, you would write this method:
MODIFY CUSTOMER
PRINT SELECTION([Customers])
This capability simplifies your methods dramatically. In the example, you do not need to
know how the MODIFY CUSTOMER method works, just what it does. This is the second reason
for using subroutines—to clarify your methods. In this way, your methods become extensions
to the 4th Dimension language.
If you need to change your method of finding customers in this example database, you will
need to change only one method, not ten. This is the next reason to use subroutines—to
facilitate changes to your methods.
Using subroutines, you make your code modular. This simply means dividing your code into
modules (subroutines), each of which performs a logical task. Consider the following code
from a checking account database:
Even for someone who doesn’t know the database, it is clear what this code does. It is not
necessary to examine each subroutine. Each subroutine might be many lines long and perform
some complex operations, but here it is only important that it performs its task.
You’ll often find that you need to pass data to your methods. This is easily done with
parameters.
Parameters (or arguments) are pieces of data that a method needs in order to perform its task.
The terms parameter and argument are used interchangeably throughout this manual.
Parameters are also passed to built-in 4th Dimension commands. In this example, the string
“Hello” is an argument to the ALERT command:
ALERT("Hello")
Parameters are passed to methods in the same way. For example, if a method named DO
SOMETHING accepted three parameters, a call to the method might look like this:
DO SOMETHING(WithThis;AndThat;ThisWay)
In the subroutine (the method that is called), the value of each parameter is automatically
copied into sequentially numbered local variables: $1, $2, $3, and so on. The numbering of
the local variables represents the order of the parameters.
The local variables/parameters are not the actual fields, variables, or expressions passed by the
calling method; they only contain the values that have been passed.
Within the subroutine, you can use the parameters $1, $2... in the same way you would use
any other local variable.
Since they are local variables, they are available only within the subroutine and are cleared at
the end of the subroutine. For this reason, a subroutine cannot change the value of the actual
fields or variables passed as parameters at the calling method level. For example:
There are two ways to make the method DO SOMETHING change the value of the field:
1. Rather than passing the field to the method, you pass a pointer to it, so you would write:
Here the parameter is not the field, but a pointer to it. Therefore, within the DO SOMETHING
method, $1 is no longer the value of the field but a pointer to the field. The object referenced
by $1 ($1-> in the code above) is the actual field. Consequently, changing the referenced
object goes beyond the scope of the subroutine, and the actual field is affected. In this
example, both alert boxes will read “WILLIAMS”.
2. Rather than having the method DO SOMETHING “doing something,” you can rewrite the
method so it returns a value. Thus you would write:
This second technique of returning a value by a subroutine is called “using a function.” This is
described in the next paragraphs.
Data can be returned from methods. A method that returns a value is called a function.
For example, the following line is a statement that uses the built-in function, Length, to return
the length of a string. The statement puts the value returned by Length in a variable called
MyLength. Here is the statement:
Any subroutine can return a value. The value to be returned is put into the local variable $0.
For example, the following function, called Uppercase4, returns a string with the first four
characters of the string passed to it in uppercase:
$0:=Uppercase(Substring($1; 1; 4))+Substring($1; 5)
For this example, we assume the values in the fields are unique (there are no two persons with
the same name). Given a name, you want to build the sentence “A friend of mine, John who is
the child of Paul who is the child of Jane who is the child of Robert who is the child of
Eleanor, does this for a living!”:
$0:=$1
QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$1)
If (Records in selection([Friends and Relatives])>0)
$0:=$0+" who is the child of "+Genealogy of ([Friends and Relatives]Name)
End if
The first way is an iterative algorithm. The second way is a recursive algorithm.
When implementing code for cases like the previous example, it is important to note that you
can always write methods using iteration or recursion. Typically, recursion provides more
concise, readable, and maintainable code, but using it is not mandatory.
Important: Recursive calls should always end at some point. In the example, the method
Genealogy of stops calling itself when the query returns no records. Without this condition
test, the method would call itself indefinitely; eventually, 4D would return a “Stack Full” error
becuase it would no longer have space to “pile up” the calls (as well as parameters and local
variables used in the method).
See Also
Control Flow, Database Methods, Methods.
Function result Long Integer ← Numeric value denoting the type of the application
Description
The Application type command returns a numeric value that denotes the type of 4D
environment that you are running. 4D provides the following predefined constants:
Constant Type Value
4th Dimension Long Integer 0
4D Runtime Volume License Long Integer 1
4D Runtime Interpreted Long Integer 2
4D Runtime Single User Long Integer 3
4D Client Long Integer 4
4D Server Long Integer 5
4D First Long Integer 6
Example
Somewhere in your code, other than in the On Server Startup database method, you need to
check if you are running 4D Server. You can write:
If (Application type=4D Server)
` Perform appropriate actions
End if
See Also
Application version, Version type.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Version type command returns a numeric value that denotes the type of 4D environment
version that you are running. 4D provides the following predefined constants:
Constant Type Value
Full Version Long Integer 0
Demo Version Long Integer 1
Example
Your 4D application includes some features that are not available when a demo version of the
4D environment is used. Surround these features with a test that calls Version type:
If (Version type=Full Version)
` Perform appropriate operations
Else
ALERT("This feature is not available in the Demo version of"+
" Super Management Systems™.")
End if
See Also
Application type, Application version.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Application version command returns an encoded string value that expresses the version
number of the 4D environment you are running.
• If you do not pass the optional * parameter, a 4-character string is returned, formatted as
follows:
Characters Description
1-2 Version number
3 Update number
4 Revision number
Example: The string "0600" stands for version 6.0.0.
• If you pass the optional * parameter, an 8-character string is returned, formatted as follows:
Characters Description
1 "F" denotes a final version
"B" denotes a beta version
Other characters denote an 4D internal version
2-3-4 Internal 4D compilation number
5-6 Version number
7 Update number
8 Revision number
Example: The string "B0120602" would stand for the Beta 12 of version 6.0.2.
2. This example tests to verify that you are using a final version:
If(Substring(Application version(*);1;1)#"F")
ALERT("Please make sure you are using a Final Production version of 4D with this
database!")
QUIT 4D
End if
See Also
Application type, Version type.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Compiled application tests whether you are running in compiled mode (True) or interpreted
mode (False).
Example
In one of your routines, you include debugging code useful only when you are running in
interpreted mode, so surround this debugging code with a test that calls Compiled application:
` ...
If (Not(Compiled application))
` Include debugging code here
End if
` ...
See Also
IDLE, Undefined.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Application file command returns the long name of the 4D executable file or application
you are running.
On Windows
If, for example, you are running 4th Dimension located at \4DWIN600\PROGRAM on the
volume E, the command returns E:\4DWIN600\PROGRAM\4D.EXE.
On Macintosh
If, for example, you are running 4th Dimension in the folder 4th Dimension® 6.0ƒ on the
disk Macintosh HD, the command returns Macintosh HD:4th Dimension® 6.0ƒ:4th
Dimension® 6.0.
Example
At startup on Windows, you need to check if a DLL Library is correctly located at the same
level as the 4D executable file. In the On Startup database method of your application you can
write:
If (On Windows & (Application type#4D Server))
If (Test path name (Long name to path name (Application file)+"XRAYCAPT.DLL")
#Is a document)
` Display a dialog box explaining that the library XRAYCAPT.DLL
` is missing. Therefore, the X-ray capture capability will not be available.
End if
End if
Note: The project methods On Windows and Long name to path name are listed in the section
System Documents.
See Also
Data file, DATA SEGMENT LIST, Structure file.
Description
The Structure file command returns the long name of the structure file for the database with
which you are currently working.
On Windows
If, for example, you are working with the database MyCDs located in \DOCS\MyCDs on the
volume G, the command returns G:\DOCS\MyCDs\MyCDs.4DB.
On Macintosh
If, for example, you are are working with the database located in the folder
Documents:MyCDsƒ: on the disk Macintosh HD, the command returns Macintosh
HD:Documents:MyCDsƒ:MyCDs.
Note: In the particular case of a database that has been compiled and merged with 4D
Runtime, this command returns the pathname of the application file (executable application)
under Windows and Mac OS. Under Mac OS, this file is located inside the software package, in
the [Contents:Mac OS] folder. This stems from a former mechanism and is kept for
compatibility reasons. If you want to get the full name of the software package itself, it is
preferable to use the Application file command. The technique consists of testing the
application using the Application type command, then executing Structure file or Application file
depending on the context.
WARNING: If you call this command while running 4D Client, only the name of the structure
file is returned; the long name is not returned.
Note: The project methods Long name to file name and Long name to path name are listed in
the section System Documents.
See Also
Application file, Data file, DATA SEGMENT LIST.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Function result String ← Long name of the data file for the database
Description
The Data file command returns the long name of the data file or one data segment for the
database with which you are currently working.
If you do not pass the segment parameter, it returns the long name of the data file or the first
segment (if the database is segmented). If you pass the segment parameter, it returns the long
name of the corresponding data segment. If you pass a segment number greater than the
number of data segments, it returns an empty string.
On Windows
If, for example, you are working with the database MyCDs located at \DOCS\MyCDs on the
volume G, a call to Data file returns G:\DOCS\MyCDs\MyCDs.4DD (provided that you
accepted the default location and name proposed by 4D when you created the database).
On Macintosh
If, for example, you are working with the database located in the folder Documents:MyCDsƒ:
on the disk Macintosh HD, a call to Data file returns Macintosh
HD:Documents:MyCDsƒ:MyCDs.data (provided that you accepted the default location and
name proposed by 4D when you created the database).
WARNING: If you call this command while running 4D Client, only the name of the data file
or the first data segment is returned, not the long name. In addition, even though the
database is segmented, the command returns an empty string for the other data segments. If
you need (for adminstrative purposes) to display a list of the data segments on a 4D Client
station, use a Stored Procedure to build the data segment list and store it in a variable on the
server machine, then get the contents of this variable using the GET PROCESS VARIABLE
command.
See Also
Application file, DATA SEGMENT LIST, Structure file.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Is data file locked command returns True if the data file of the open database or at least
one of its segments is locked — i.e. write protected.
Placed, for instance, in the On Startup Database Method, this command enables the
prevention of any risk of accidental opening of a locked data file.
Example
This method will prevent the opening of the database if the data file is locked:
Description
The Get 4D folder command returns the pathname to the active 4D folder of the current
application, or to the 4D environment folder specified by the folder parameter, if passed. This
command allows you to get the actual pathname of the folders used by the 4D application. By
using this command, you ensure that your code will work on any platform running any
localized system.
In folder, you can pass one of the following constants, which are located in the “4D
Environment” theme:
Constant Type Value
Active 4D Folder Longint 0 (default)
Licenses Folder Longint 1
Extras Folder Longint 2
4D Client Database Folder Longint 3
Database Folder Longint 4
Database Folder Unix Syntax Longint 5
Active 4D Folder
The 4D environment uses the 4D folder to store the following information:
• User registration files
• Preferences files used by the 4D environment applications, tools, and utility programs
With the 4D Client application or if the All Users folder is locked, the active 4D folder is
created at the following location:
• Under Windows: {Disk}:\Documents and Settings\User\Application Data\4D
• Under Mac OS: {Disk}:Users:User:Library:Application Support:4D
Licenses Folder
Folder containing the Licenses files of the machine.
The Licenses folder is placed at the following location:
• On Windows: {Disk}:\Documents and Settings\All Users\Application Data\
4D\Licenses
• On Mac OS : {Disk}:Library:Application Support:4D:Licenses
Extras Folder
Folder with customized contents downloaded to each 4D Client machine.
You use this folder for transferring custom items from the server to the client machines
(resources file, text documents, XML preferences files, etc.). The original hierarchy of the
folder is reconstructed on each client machine.
4D Server automatically manages the modifications made to this folder and only transfers
what is necessary. Moreover, the contents of the folder is compressed in order to optimize
network copying time.
On the 4D Server or 4th Dimension single-user side, the original Extras folder should be
placed next to the database structure file.
On the 4D Client side, the Extras folder is downloaded to the following location on each
client machine, i.e.:
• On Windows: {Disk}:\Documents and Settings\Current user\Application
Data\4D\DatabaseName_Address\Extras
• On Mac OS: {Disk}:Users:User:Library:Application Support:4D:DatabaseName_Address:Extras
Database Folder
Folder containing the database structure file. The pathname is expressed using the standard
syntax of the current platform.
With the 4D Client application, this constant is strictly equivalent to the previous 4D Client
Database Folder constant: the command returns the pathname of the folder created locally.
Examples
1. During the startup of a single-user database, you want to load (or create) your own settings
in a file located in the 4D folder. To do so, in the On Startup Database Method, you can write
code similar to this:
MAP FILE TYPES("PREF";"PRF";"Preferences file")
` Map PREF Mac OS file type to .PRF Windows file extension
$vsPrefDocName:=Get 4D folder+"MyPrefs" ` Build pathname to the Preferences file
` Check if the file exists
If (Test path name($vsPrefDocName+(".PRF"*Num(On Windows)))#Is a document)
$vtPrefDocRef:=Create document($vsPrefDocName;"PREF") ` If not, create it
Else
$vtPrefDocRef:=Open document($vsPrefDocName;"PREF") ` If so, open it
End if
If (OK=1)
` Process document contents
CLOSE DOCUMENT($vtPrefDocRef)
Else
` Handle error
End if
Note: Under Mac OS, it is necessary to put pathnames in quotes when they contain the names
of files or folders with spaces in them. The escape sequence "\" can be used to insert the
quotation mark character into the string. You can also use the statement Char(Double quote).
See Also
System folder, Temporary folder, Test path name.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
DATA SEGMENT LIST populates the segments array with the long names of the data segments
for the database with which you are currently working.
WARNING: This command does nothing if executed on 4D Client. If you need (for
administrative purposes) to display a list of the data segments on a 4D Client station, use a
Stored Procedure to build the data segment list and store it in a variable on the server
machine, then get the contents of this variable using the GET PROCESS VARIABLE command.
Examples
1. In the Data Segments Information form for the [Dialogs] table, you want to display a drop-
down list populated with the names of the data segments. To do so, write:
` [Dialogs];"Data Segments Information" form method
Case of
: (Form event=On Load )
` ...
ARRAY STRING(255;asDataSegName;0)
DATA SEGMENT LIST(asDataSegName)
` ...
End case
See Also
Application file, Data file, Structure file.
Description
The ADD DATA SEGMENT command displays the data segment management dialog box shown
here:
If the user clicks the OK button to validate the dialog box, the OK variable is set to 1. If the
user clicks the Cancel button, OK is set to 0.
When all data segments are full, 4th Dimension or 4D Server automatically creates a new
segment if the Create new data segments as needed option is checked in the application
Preferences (“Database/Data Management” page). Each automatic segment has a maximum
size of 2 GB and is stored next to the last segment created or the data file.
If this option is not checked, the error -9999 is generated. An error message is displayed,
stating that the disk is full.
If you are using 4D Server, you can display an alert stating that the Database Administrator
must add a new data segment from the server machine.
See Also
ON ERR CALL.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
FLUSH BUFFERS
Description
The FLUSH BUFFERS command immediately saves the data buffers to disk. All changes that
have been made to the database are stored on disk.
You usually do not need to call this command, as 4D saves data modification on a regular
basis. The database property Flush Data Buffers (in the Design environment), which specifies
how often to save, is typically used to control buffer flushing.
Note: 4D integrates a built-in data cache scheme for accelerating I/O operations. The fact that
data modifications are, for some time, present in the data cache and not on the disk is
transparent to your coding. For example, if you issue a QUERY call, the 4D database engine
integrates the data cache in the query operation.
version 6.8
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The OPEN DATA FILE command allows changing the data file opened by the 4D application on-
the-fly.
Pass the name or the full access path of the data file to open in the accessPath parameter. If
you pass only the file name, it must be placed next to the structure file of the database.
If the access path sets a valid data file, 4D quits the database in progress and re-opens it with
the specified data file. The On Exit Database Method and the On Startup Database Method are
successively called.
Warning: Since this command causes the application to quit before re-opening with the
specified data file, it is not possible to use it in the On Startup Database Method or in a method
called by this database method.
The command is executed in an asynchronous manner: after its call, 4D continues executing
the rest of the method. Then, the application behaves as if the Quit command was selected in
the File menu: open dialog boxes are cancelled, any open processes have 10 seconds to finish
before being terminated, etc.
Before launching the operation, the command checks the validity of the specified data file: it
must have the “.4dd” extension under Windows or have the “dat5” type under Mac OS. Also,
if the file was already open, the command verifies that it corresponds to the current structure.
If you pass an empty string in accessPath, the command will re-open the database without
changing the data file.
See Also
CREATE DATA FILE.
version 6.8
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The CREATE DATA FILE command allows creating a new data file to disk and to replace the data
file opened by the 4D application on-the-fly.
The general functioning of this command is identical to that of the OPEN DATA FILE
command; the only difference is that the new data file set by the accessPath parameter is
created just after the structure is re-opened.
Before launching the operation, the command verifies that the specified access path does not
correspond to an existing file.
See Also
OPEN DATA FILE.
QUIT 4D {(time)}
Description
The QUIT 4D command exits 4th Dimension/4D Client or 4D Server and returns to the
Desktop.
• If there is an On Exit Database Method, 4D starts executing this method within a newly
created local process. For example, you can use this database method to inform other
processes, via interprocess communication, that they must close (data entry) or stop the
execution of operations started by the On Startup Database Method (connection from 4D to
another database server). Note that 4D will eventually quit; the On Exit Database Method can
perform all the cleanup or closing operations you wish, but cannot refuse the quit and will at
some point end.
• If there is no On Exit Database Method, 4D aborts each running process one by one, without
distinction.
If the user is performing data entry, the records will be cancelled and not saved.
If you want to let the user save data entry modifications made in the current open windows,
you can use interprocess communication to signal all the other user processes that the
database is going to be exited. To do so, you can adopt two strategies:
• Perform these operations from within the current process before calling QUIT 4D
• Handle these operations from within the On Exit Database Method.
Note: The time parameter cannot be used with 4th Dimension or 4D Client.
If there is an On Server Stop Database Method, it is executed after the delay set by the time
parameter, or after all clients have disconnected, depending on your parameters.
The action of the QUIT 4D command used in a stored procedure is the same as the one for the
Quit command of the 4D Server File menu: it causes a dialog box to appear on each client
machine indicating that the server is about to quit.
Example
The project method listed here is associated with the Quit or Exit menu item in the File menu.
See Also
On Exit Database Method, On Server Shutdown Database Method.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET SERIAL INFORMATION command returns various information about the 4D current
version serialization.
Note: The last two parameters always return 1 for 4D single user except in demonstration
versions (0 is then returned).
GET SERIAL INFORMATION is part of the general component protection scheme implemented
in 4D starting from version 6.7 (for more information about components, refer to 4D Insider
documentation). Component developers can associate a copy of their product to a given
installed 4D application, in order to avoid any illegal copies.
The serialization works as follows: a user who wants to get a component sends his unique key
generated through the GET SERIAL INFORMATION command to the developer. This can be done
through an Order form included in a demo version of the component. The generated key is
unique and is associated to a specific 4D application.
Note: Plug-ins developers can use this protection scheme too. For more information, refer to
the 4D Plugin API Reference.
See Also
Get component resource ID.
Description
The Is license available command enables you to know the availability of a plug-in. It is useful,
for instance, for displaying or hiding functions requiring the presence of a plug-in.
• The license parameter is omitted: in this case, the command returns False if the 4D
application is in demonstration mode.
• You pass one of the constants of the “Is license available” theme in the license parameter:
Constant Type Value
4D Draw License Longint 808464694
4D For OCI License Longint 808465208
4D View License Longint 808465207
4D Web License Longint 808464945
4D Write License Longint 808464697
4D Client Web License Longint 808465209
4D Client SOAP License Longint 808465465
4D SOAP License Longint 808465464
4D ODBC Pro License Longint 808464946
4D for ADO License Longint 808465714
4D for MySQL License Longint 808465712
4D for PostgreSQL License Longint 808465713
4D for Sybase License Longint 808465715
In this case, the command returns True if the corresponding plug-in has a license available.
The command takes into account any licenses attributed in Design mode or via the SET
PLUGIN ACCESS command.
• You pass the ID number of the plug-in “4BNX” resource directly in the license parameter. In
this case, the command behaves as described above.
See Also
Get plugin access, GET PLUGIN LIST, SET PLUGIN ACCESS.
Description
The OPEN 4D PREFERENCES command provokes the display of the Preferences dialog box of
the current 4th Dimension application and the display of the theme or page corresponding
to the key passed in selector.
The selector parameter must contain one or more “keys” indicating a theme, page or group
of parameters in the Preferences dialog box. The list of keys that can be used is provided
below.
You can pass either a fixed access path or the name of a single element in selector:
• Fixed access path: The selector parameter is put together in the following manner:
/Theme{/Page{/Parameter group}}.
The string must start with the / character and each level must be separated with a /.
For example, to set the Compiler page of the Design Mode theme, selector must contain
"/Design Mode/Compiler".
• Name (relative path): In this case, the selector parameter cannot start with the / character.
Simply pass the name of the desired element and 4th Dimension will open the first
corresponding element in the following search order: parameter group -> page-> theme.
For example, if you pass “Progress Indicator” in selector, 4th Dimension will open the
Options page of the Application theme.
To open the dialog box directly on the first page, simply pass “/” in selector.
The command opens the Preferences page on the element specified in selector; however, all
other themes and pages remain accessible. It is up to the developer to make sure that user
access to Preferences does not hinder the application. To control user actions, it is
recommended that you enable the user access management system.
OPEN 4D PREFERENCES("/")
OPEN 4D PREFERENCES("/Application/Shortcuts")
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
An array is an ordered series of variables of the same type. Each variable is called an element of
the array. The size of an array is the number of elements it holds. An array is given its size
when it is created; you can then resize it as many times as needed by adding, inserting, or
deleting elements, or by resizing the array using the same command used to create it.
You create an array with one of the array declaration commands. For details, see the section
Creating Arrays.
Elements are numbered from 1 to N, where N is the size of the array. An array always has an
element zero that you can access just like any other element of the array, but this element is
not shown when an array is present in a form. Although the element zero is not shown when
an array supports a form object, there is no restriction in using it with the language. For more
information about the element zero, see the section Using the element zero of an array.
Arrays are 4D variables. Like any variable, an array has a scope and follows the rules of the 4D
language, though with some unique differences. For more information, see the sections Arrays
and the 4D Language and Arrays and Pointers.
Arrays are language objects; you can create and use arrays that will never appear on the screen.
Arrays are also user interface objects. For more information about the interaction between
arrays and form objects, see the sections Arrays and Form Objects and Grouped Scrollable Areas.
Arrays are designed to hold reasonable amounts of data for a short period of time. However,
because arrays are held in memory, they are easy to handle and quick to manipulate. For
details, see the section Arrays and Memory.
You create an array with one of the array declaration commands described in this chapter. The
following table lists the array declaration commands:
(*) Longint arrays allows you to manipulate data of Time type. To display a Time array in a
form, apply to the associated form object the display format &/x, in which x represents the
number of the format in the Time formats list (by order of appearance). For example, &/4 will
display the Hour Min format.
(**) The difference between Text arrays and String arrays lies in the nature of their elements. In
both types of array, elements can hold text values (characters). However:
• In a Text array, each element is of variable length and stores its characters in a separate part
of memory.
• In a String array, all elements have the same fixed length (the length passed when the array
was created). All elements are stored one after the other in the same part of memory, no
matter what the contents.
Due to this structural difference, string arrays act faster than text arrays. Note, however, that
an element of a String array can only hold up to 255 characters.
Note the syntax atNames{$vlElem}. Rather than specifying a numeric literal such as atNames{3},
you can use a numeric variable to indicate which element of an array you are addressing.
Using the iteration provided by a loop structure (For...End for, Repeat...Until or While...End
while), compact pieces of code can address all or part of the elements in an array.
• To work with arrays and selection of records, use the commands SELECTION RANGE TO
ARRAY, SELECTION TO ARRAY, ARRAY TO SELECTION and DISTINCT VALUES.
• Objects of the List box type are based on arrays; several commands of the “List box” theme
work with arrays, for instance INSERT LISTBOX ROW.
• You can create graphs and charts on series of values stored in tables, subtables, and arrays.
For more information, see the GRAPH command.
• Many commands can build arrays in one call, for example: FONT LIST, WINDOW LIST,
VOLUME LIST, FOLDER LIST, DOCUMENT LIST, GET SERIAL PORT MAPPING, SAX GET XML
ELEMENT, etc.
See Also
ARRAY BOOLEAN, ARRAY DATE, ARRAY INTEGER, ARRAY LONGINT, ARRAY PICTURE, ARRAY
POINTER, ARRAY REAL, ARRAY STRING, ARRAY TEXT, Arrays, Two-dimensional Arrays.
Arrays are language objects—you can create and use arrays that will never appear on the
screen. However, arrays are also user interface objects. The following types of Form Objects are
supported by arrays:
• Pop-up/Drop-down List
• Combo Box
• Scrollable Area
• Tab Control
• List box
While you can predefine these objects in the Design Environment Form Editor using the
Default Values button of the Property List window (except for the List box) , you can also
define them programmatically using the arrays commands. In both cases, the form object is
supported by an array created by you or 4D.
When using these objects, you can detect which item within the object has been selected (or
clicked) by testing the array for its selected element. Conversely, you can select a particular
item within the object by setting the selected element for the array.
When an array is used to support a form object, it has then a dual nature; it is both a language
object and a user interface object. For example, when designing a form, you create a scrollable
area:
Notes:
• You cannot display two-dimensional arays or pointer arrays.
• The management of List box type objects (which may contain several arrays) entails many
specific aspects. These particularities are covered in the Management of List Box objects section.
The following example shows how to fill an array and display it in a drop-down list. An array
arSalaries is created using the ARRAY REAL command. It contains all the standard salaries paid
to people in a company. When the user chooses an element from the drop-down list, the
[Employees]Salary field is assigned the value chosen in the User or Custom Menus environment.
Click the Object Method button and create the method, as follows:
ARRAY REAL(arSalaries;10)
For($vlElem;1;10)
arSalaries{$vlElem}:=2000+($vlElem*500)
End for
create the numeric array 2500, 3000... 7000, corresponding to the annual salaries $30,000 up
to $84,000, before tax.
The lines:
arSalaries:=Find in array(arSalaries;[Employees]Salary)
If (arSalaries=-1)
arSalaries:=0
End if
handle both the creation of a new record or the modification of existing record.
• If you create a new record, the field [Employees]Salary is initially equal to zero. In this case,
Find in array does not find the value in the array and returns -1. The test If (arSalaries=-1) resets
arSalaries to zero, indicating that no element is selected in the drop-down list.
• If you modify an existing record, Find in array retrieves the value in the array and sets the
selected element of the drop-down list to the current value of the field. If the value for a
particular employee is not in the list, the test If (arSalaries=-1) deselects any element in the list.
Note: For more information about the array selected element, read the next section.
Reporting the selected value to the [Employees]Salary field
To report the value selected from the drop-down list arSalaries, you just need to handle the On
Clicked event to the object. The element number of the selected element is the value of the
array arSalaries itself. Therefore, the expression arSalaries{arSalaries} returns the value chosen in
the drop-down list.
Case of
: (Form event=On Load)
ARRAY REAL(arSalaries;10)
For($vlElem;1;10)
arSalaries{$vlElem}:=2000+($vlElem*500)
End for
In the User or Custom Menus environment, the drop-down list looks like this:
The following section describes the common and basic operations you will perform on arrays
while using them as form objects.
You can obtain the current size of the array by using the Size of array command. Using the
previous example, the following line of code would display 5:
You can reorder the elements of the array using the SORT ARRAY command or of several arrays
using the MULTI SORT ARRAY command. Using the previous example, and provided the array is
shown as a scrollable area:
a. Initially, the area would look like the list on the left.
b. After the execution of the following line of code:
SORT ARRAY(atNames;>)
the area would look like the list in the middle.
c. After the execution of the following line of code:
SORT ARRAY(atNames;<)
the area would look like the list on the right.
You can add, insert, or delete elements using the commands APPEND TO ARRAY, INSERT
ELEMENT and DELETE ELEMENT.
Using the previous example, and provided the array is shown as a scrollable area, you can
handle clicks in this area as follows:
While the syntax atNames{$vlElem} allows you to work with a particular element of the array,
the syntax atNames returns the element number of the selected element within the array.
Thus, the syntax atNames{atNames} means “the value of the selected element in the array
atNames.” If no element is selected, atNames is equal to 0 (zero), so the test If (atNames#0)
detects whether or not an element is actually selected.
In a similar fashion, you can programmatically change the selected element by assigning a
value to the array.
Examples
If (1<atNames)
` If possible, selects the previous element to the selected element
atNames:=atNames-1
End if
The Find in array command searches for a particular value within an array. Using the previous
example, the following code will select the element whose value is “Richard,” if that is what is
entered in the request dialog box:
Note: To create and use tab controls with icons and enabled and disabled tabs, you must use a
hierarchical list as the supporting object for the tab control. For more information, see the
example for the New list command.
While you can handle pop-up menus, drop-down lists, scrollable areas, and tab controls with
the algorithms described in the previous section, you must handle combo boxes differently.
With combo boxes, there is never a selected element. Each time the user selects one of the
values attached to the area, that value is put into the element zero of the array. Then, if the
user edits the text, the value modified by the user is also put into that element zero.
Example
See Also
Arrays, Grouped Scrollable Areas.
Compatibility note: Grouped scrollable areas can still be used in 4th Dimension; however,
starting with version 2004 they can be replaced by List box type objects. For more information
about this, refer to the Overview of List boxes section.
You can group scrollable areas for display in a form. When several scrollable areas are grouped,
they act as one scrollable area. Each scrollable area can have its own font and style; however,
we recommend that you use the same font height (which depends on the font and font size)
for each column. When displayed during data entry, only the frontmost scrollable area
displays a scroll bar. Following are three scrollable areas grouped together in the Design
environment:
ALL RECORDS(Employees)
SELECTION TO ARRAY([Employees]Last
Name;asName;[Employees]Title;asTitle;[Departments]Name;asDepartment)
DIALOG([Departments];"Example Grouped SA")
This method uses the data in the fields of the [People] table and the [Departments] table.
These tables are shown here:
Note: The [Departments] table can be used, provided that there is an automatic relation from
[People] to [Departments].
The resulting display:
The arrays can be sorted with the command SORT ARRAY. For example:
SORT ARRAY(asTitle;asName;asDepartment;>)
The following is the result of the sort:
Note that the arrays were sorted based on the first argument to the SORT ARRAY command; the
other two arrays were specified in order to keep the rows synchronized. The command SORT
ARRAY always sorts the arrays (if several are specified) on the values of the first array and keeps
the additional arrays synchronized.
Note: SORT ARRAY does not perform a multi-level sort on arrays. To show a table similar to the
one above and also perform multi-level sorts (i.e., by department, then by title, then by
name), use a subform in which you display the table, and then use ORDER BY.
See Also
Arrays, Arrays and Form Objects.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Arrays are 4D variables. Like any variable, an array has a scope and follows the rules of the 4D
language, though with some unique differences.
You can create and work with local, process, and interprocess arrays. Examples:
ARRAY INTEGER ($aiCodes;100) ` Creates local array of 100 2-byte Integer values
ARRAY INTEGER (aiCodes;100) ` Creates process array of 100 2-byte Integer values
ARRAY INTEGER (<>aiCodes;100) ` Creates interprocess array of 100 2-byte Integer values
The scope of these arrays is identical to the scope of other local, process, and interprocess
variables:
Local arrays
A local array is declared when the name of the array starts with a dollar sign ($).
The scope of a local array is the method in which it is created. The array is cleared when the
method ends. Local arrays with the same name in two different methods can have different
types, because they are actually two different variables with different scopes.
When you create a local array within a form method, within an object method, within or a
project method called as subroutine by the two previous type of method, the array is created
and cleared each time the form or object method is invoked. In other words, the array is
created and cleared for each form event. Consequently, you cannot use local arrays in forms,
neither for display nor printing.
As with local variables, it is a good idea to use local arrays whenever possible. In doing so, you
tend to minimize the amount of memory necessary for running your application.
Process arrays
A process array is declared when the name of the array starts with a letter.
The scope of a process array is the process in which it is created. The array is cleared when the
process ends or is aborted. A process array automatically has one instance created per process.
Therefore, the array is of the same type throughout the processes. However, its contents are
particular to each process.
Tip: When you know in advance that an interprocess array will be accessed by several
processes that could possible conflict, protect the access to that array with a semaphore. For
more information, see the example for the Semaphore command.
Note: You can use process and interprocess arrays in forms to create form objects such as
scrollable areas, drop-down lists, and so on.
You can pass an array as parameter to a 4D command or to the routine of a 4D Plug-in. On the
other hand, you cannot pass an array as parameter to a user method. The alternative is to pass
a pointer to the array as parameter to the method. For details, see the section Arrays and
Pointers.
Unlike text or string variables, you cannot assign one array to another. To copy (assign) an
array to another one, use COPY ARRAY.
See Also
Arrays, Arrays and Pointers.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
You can pass an array as parameter to a 4D command or to the routine of a 4D Plug-in. On the
other hand, you cannot pass an array as parameter to a user method. The alternative is to pass
a pointer to the array as parameter to the method.
Note: You can pass process and interprocess arrays as parameters, but not local arrays.
If ((0<atNames)&(atNames<Size of array(atNames))
` If possible, selects the next element to the selected element
atNames:=atNames+1
End if
If you need to do the same thing for 50 different arrays in various forms, you can avoid
writing the same thing 50 times, by using the following project method:
C_POINTER ($1)
If ((0<$1->)&($1-><Size of array($1->))
$1->:=$1->+1 ` If possible, selects the next element to the selected element
End if
` Array sum
` Array sum ( Pointer )
` Array sum ( -> Array )
C_REAL ($0)
$0:=0
For ($vlElem;1;Size of array($1->))
$0:=$0+$1->{$vlElem}
End for
• The following project method capitalizes of all the elements of a string or text array:
` CAPITALIZE ARRAY
` CAPITALIZE ARRAY ( Pointer )
` CAPITALIZE ARRAY ( -> Array )
See Also
Arrays, Arrays and the 4D Language.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
An array always has an element zero. While element zero is not shown when an array supports
a form object, there is no restriction in using it with the language.
One example of the use of element zero is the case of the combo box discussed in the section
Arrays and Form Objects.
1. If you want to execute an action only when you click on an element other than the
previously selected element, you must keep track of each selected element. One way to do this
is to use a process variable in which you maintain the element number of the selected
element. Another way is to use the element zero of the array:
In certain cases, you might want to fully control the way ASCII codes are translated. One way
to do this is to use an Integer array of 255 elements, where the Nth element is set to the
translated ASCII code for the character whose source ASCII code is N. For example, if the ASCII
code #187 must be translated as #156, you would write <>aiCustomOutMap{187}:=156 and
<>aiCustomInMap{156}:=187 in the method that initializes the interprocess arrays used
everywhere in the database. You can then send a stream of characters with the following
custom project method:
See Also
Arrays.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Each of the array declaration commands can create or resize one-dimensional or two-
dimensional arrays. Example:
ARRAY TEXT (atTopics;100;50) ` Creates a text array composed of 100 rows of 50 columns
Two-dimensional arrays are essentially language objects; you can neither display nor print
them.
In the following example, a pointer to each field of each table in the database is stored in a
two-dimensional array:
` Get the pointers to the fields for the table currently displayed at the screen:
COPY ARRAY (<>apFields{Table(Current form table)};$apTheFieldsIamWorkingOn)
` Initialize Boolean and Date fields
For ($vlElem;1;Size of array($apTheFieldsIamWorkingOn))
Case of
: (Type($apTheFieldsIamWorkingOn{$vlElem}->)=Is Date)
$apTheFieldsIamWorkingOn{$vlElem}->:=Current date
: (Type($apTheFieldsIamWorkingOn{$vlElem}->)=Is Boolean)
$apTheFieldsIamWorkingOn{$vlElem}->:=True
End case
End for
Note: As this example suggests, rows of a two-dimensional arrays can be the same size or
different sizes.
See Also
Arrays.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Unlike the data you store on disk using tables and records, an array is always held in memory
in its entirety.
For example, if all US zip codes were entered in the [Zip Codes] table, it would contain about
100,000 records. In addition, that table would include several fields: the zip code itself and the
corresponding city, county, and state. If you select only the zip codes from California, the 4D
database engine creates the corresponding selection of records within the [Zip Codes] table,
and then loads the records only when they are needed (i.e., when they are displayed or
printed). In order words, you work with an ordered series of values (of the same type for each
field) that is partially loaded from the disk into the memory by the database engine of 4D.
Doing the same thing with arrays would be prohibitive for the following reasons:
• In order to maintain the four information types (zip code, city, county, state), you would
have to maintain four large arrays in memory.
• Because an array is always held in memory in its entirety, you would have to keep all the zip
codes information in memory throughout the whole working session, even though the data is
not always in use.
• Again, because an array is always held in memory in its entirety, each time the database is
started and then quit, the four arrays would have to be loaded and then saved on the disk,
even though the data is not used or modified during the working session.
Conclusion: Arrays are intended to hold reasonable amounts of data for a short period of time.
On the other hand, because arrays are held in memory, they are easy to handle and quick to
manipulate.
However, in some circumstances, you may need to work with arrays holding hundreds or
thousands of elements. The following table lists the formulas used to calculate the amount of
memory used for each array type:
Note: A few additional bytes are required to keep track of the selected element, the number of
elements, and the array itself.
When working with very large arrays, the best way to handle full memory situations is to
surround the creation of the arrays with an ON ERR CALL project method. Example:
See Also
Arrays, ON ERR CALL.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ARRAY INTEGER command creates and/or resizes an array of 2-byte Integer elements in
memory.
Examples
1. This example creates a process array of 100 2-byte Integer elements:
2. This example creates a local array of 100 rows of 50 2-byte Integer elements:
See Also
ARRAY LONGINT, ARRAY REAL.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ARRAY LONGINT command creates and/or resizes an array of 4-byte Long Integer elements
in memory.
Examples
1. This example creates a process array of 100 4-byte Long Integer elements:
2. This example creates a local array of 100 rows of 50 4-byte Long Integer elements:
See Also
ARRAY INTEGER, ARRAY REAL.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ARRAY REAL command creates and/or resizes an array of Real elements in memory.
Examples
1. This example creates a process array of 100 Real elements:
See Also
ARRAY INTEGER, ARRAY LONGINT.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ARRAY STRING command creates and/or resizes an array of String elements in memory.
• The strLen parameter specifies the maximum number of characters that can be contained in
each array element in a string array. The length can be from 1 to 255 characters.
• The arrayName parameter is the name of the array.
• The size parameter is the number of elements in the array.
• The size2 parameter is optional; if size2 is specified, the command creates a two-dimensional
array. In this case, size specifies the number of rows and size2 specifies the number of columns
in each array. Each row in a two-dimensional array can be treated as both an element and an
array. This means that while working with the first dimension of the array, you can use other
array commands to insert and delete entire arrays in a two-dimensional array.
Examples
1. This example creates a process array of 100 31-character String elements:
2. This example creates a local array of 100 rows of 50 63-character String elements:
See Also
ARRAY TEXT.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ARRAY TEXT command creates and/or resizes an array of Text elements in memory.
Examples
1. This example creates a process array of 100 Text elements:
See Also
ARRAY STRING.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ARRAY DATE command creates and/or resizes an array of Date elements in memory.
Examples
1. This example creates a process array of 100 Date elements:
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ARRAY BOOLEAN command creates and/or resizes an array of Boolean elements in memory.
Tip: In some contexts, an alternative to using Boolean arrays is using an Integer array where
each element “means true” if different from zero and “means false” if equal to zero.
Examples
1. This example creates a process array of 100 Boolean elements:
See Also
ARRAY INTEGER.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ARRAY PICTURE command creates and/or resizes an array of Picture elements in memory.
Examples
1. This example creates a process array of 100 Picture elements:
RESOURCE LIST("PICT";$aiResIDs;$asResNames)
ARRAY PICTURE (<>agValues;Size of array($aiResIDs))
$vlPictElem:=0
For ($vlElem;1;Size of array(<>agValues))
If ($asResNames="User Intf/@")
$vlPictElem:=vlPictElem+1
GET PICTURE RESOURCE("PICT";$aiResIDs{$vlElem};$vgPicture)
<>agValues{$vlPictElem}:=$vgPicture
End if
End for
ARRAY PICTURE (<>agValues;$vlPictElem)
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ARRAY POINTER command creates or resizes an array of Pointer elements in memory.
Examples
1. This example creates a process array of 100 Pointer elements:
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Size of array command returns the number of elements in array.
Example
1. The following example returns the size of the array anArray:
3. The following example returns the number of columns for a row in a two-dimensional array:
See Also
DELETE ELEMENT, INSERT ELEMENT.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SORT ARRAY command sorts one or more arrays into ascending or descending order.
Note: You cannot sort Pointer or Picture arrays. You can sort the elements of a two-
dimensional array (i.e., a2DArray{$vlThisElem}) but you cannot sort the two-dimensional array
itself (i.e., a2DArray).
The last parameter specifies whether to sort array in ascending or descending order. The
“greater than” symbol (>) indicates an ascending sort; the “less than” symbol (<) indicates a
descending sort. If you do not specify the sorting order, then the sort is ascending.
If more than one array is specified, the arrays are sorted following the sort order of the first
array; no multi-level sorting is performed here. This feature is especially useful with grouped
scrollable areas in a form; SORT ARRAY maintains the synchronicity of the arrays that sustain
the scrollable areas.
Examples
1. The following example creates two arrays and then sorts them by company:
2. You display the names from a [People] table in a floating window. When you click on
buttons present in the window, you can sort this list of names from A to Z or from Z to A. As
several people may have the same name, you also can use a [People]ID number field, which is
indexed unique. When you click in the list of names, you will retrieve the record for the name
you clicked. By maintaing a synchronized and hidden array of ID numbers, you are sure to
access the record corresponding to the name you clicked:
See Also
MULTI SORT ARRAY, ORDER BY, SELECTION TO ARRAY.
MULTI SORT ARRAY (array{; sort}{; array2; sort2; ...; arrayN; sortN})
Description
The MULTI SORT ARRAY command enables you to carry out a multi-level sort on a set of
arrays. This function is particularly useful in the context of grouped scrolling areas in
forms.
• First syntax: MULTI SORT ARRAY (array{; sort}{; array2; sort2; ...; arrayN; sortN})
This syntax is the simplest; it lets you directly pass the names of the synchronized arrays
where you want to apply a multi-criteria sort.
You can pass an unlimited number of pairs (array;> or <) and/or only arrays. All the arrays
passed as parameters are sorted in a synchronized manner.
You can pass arrays of any type except for Pointer or Picture arrays. You can sort an
element of a two-dimensional array (i.e. a2DArray{$vlThisElement}), but you cannot sort the
2D array itself (i.e. a2DArray).
Note: Keep in mind that at least one sort criterion must be passed in order for the
command to work. If no sort criterion is set, an error is generated.
The sort levels are determined by the order in which the arrays are passed to the command:
the position of an array with a sort criterion in the syntax determines its sort level.
The ptrArrayName parameter contains the name of an array of array pointers; each element
of this array is a pointer designating an array to be sorted. The sorts are performed in the
order of the array pointers defined by ptrArrayName. Warning: all the arrays pointed to by
ptrArrayName must have the same number of elements.
The sortArrayName parameter contains the name of an array in which each element
indicates the sorting order (-1, 0 or 1) of the element of the corresponding array of pointers:
-1 = Sort by decreasing order.
0 = The array is not used as a sorting criterion but must be sorted according to the other
sorts.
1 = Sort by increasing order.
Note: You cannot sort arrays of the Pointer or Picture type. You can sort an element of a
two-dimensional array (i.e. a2DArray{$vlThisElement}), but you cannot sort the 2D array
itself (i.e. a2DArray).
For each element of the ptrArrayName array, there must be a corresponding element of the
sortArrayName array. Both arrays must therefore have exactly the same number of elements.
ALL RECORDS([Employees])
SELECTION TO ARRAY([Employees]City;cities;[Employees]Salary;salaries;
[Employees]Name;names;[Employees]TelNum;telNums)
MULTI SORT ARRAY (cities;>;salaries;<;names;telNums)
If you want for the names array to be used as the third sort criteria, just add > or < after the
names_array parameter.
Note that the syntax:
MULTI SORT ARRAY (cities;>;;salaries;names;telNums)
is equivalent to:
SORT ARRAY(cities;salaries;names;telNums;>)
2. The following example uses the second syntax: it creates four arrays and sorts them by
city (increasing order) and company (decreasing order); the last two arrays, names_Array
and telNum_Array, being synchronized according to previous sort criteria:
ALL RECORDS([Employees])
SELECTION TO ARRAY([Employees]City;cities;[Employees]Company;companies;
[Employees]Name;names;[Employees]TelNum;telNums)
ARRAY POINTER(pointers_Array;4)
ARRAY LONGINT(sorts_Array;4)
pointers_Array{1}:=->cities
sorts_Array{1}:=1
pointers_Array{2}:=->companies
sorts_Array{2}:=-1
pointers_Array{3}:=->names
sorts_Array{3}:=0
pointers_Array{4}:=->telNums
sorts_Array{4}:=0
MULTI SORT ARRAY (pointers_Array;sorts_Array)
If you want the array of names be used as a third sort criterion, you need to assign the
value 1 to the sorts_Array{3} element. Or else, if you want the arrays to be sorted only by
the city criterion, assign the value 0 to the sorts_Array{2}, sorts_Array{3} and sorts_Array{4}
elements. In this way, you obtain an identical result to SORT
ARRAY(cities;companies;names;telNums;>).
See Also
ORDER BY, SELECTION TO ARRAY, SORT ARRAY.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Find in array command returns the number of the first element in array that matches value.
Find in array can be used with Text, String, Numeric, Date, Pointer, and Boolean arrays. The
array and value parameters must be of the same type.
If no match is found, Find in array returns –1.
If start is specified, the command starts searching at the element number specified by start. If
start is not specified, the command starts searching at element 1.
Examples
1. The following project method deletes all empty elements from the string or text array
whose pointer is passed as parameter:
C_POINTER ($1)
Repeat
$vlElem:=Find in array ($1->;"")
If ($vlElem>0)
DELETE ELEMENT ($1->;$vlElem)
End if
Until ($vlElem<0)
2. The following project method selects the first element of an array whose pointer is passed as
the first parameter that matches the value of the variable or field whose pointer is passed as
parameter:
End case
See Also
DELETE ELEMENT, INSERT ELEMENT, Size of array.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Count in array command returns the number of times value is found in array.
This command can be used with the following array types: Text, Alpha, number, Date,
Pointer and Boolean. The array and value parameters must be the same type or compatible.
Example
The following example allows displaying the number of selected lines in a list box:
See Also
Find in array.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The INSERT ELEMENT command inserts one or more elements into the array array. The new
elements are inserted before the element specified by where, and are initialized to the empty
value for the array type. All elements beyond where are consequently moved within the array
by an offset of one or the value you pass in howMany.
If where is greater than the size of the array, the elements are added to the end of the array.
The howMany parameter is the number of elements to insert. If howMany is not specified, then
one element is inserted. The size of the array grows by howMany.
Examples
1. The following example inserts five new elements, starting at element 10:
$vlElem:=Size of array(anArray)+1
INSERT ELEMENT (anArray;$vlElem)
anArray{$vlElem}:=...
See Also
DELETE ELEMENT, Size of array.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DELETE ELEMENT command deletes one or more elements from array. Elements are deleted
starting at the element specified by where.
The howMany parameter is the number of elements to delete. If howMany is not specified,
then one element is deleted. The size of the array shrinks by howMany.
Examples
1. The following example deletes three elements, starting at element 5:
2. The following example deletes the last element from an array, if it exists:
$vlElem:=Size of array(anArray)
If ($vlElem>0)
DELETE ELEMENT (anArray;$vlElem)
End if
See Also
INSERT ELEMENT, Size of array.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The APPEND TO ARRAY command adds a new element at the end of array and assigns value
to the element. In interpreted mode, if array does not exist, the command creates it with
regard to the type of value.
This command works with all kind of arrays: string, number, Boolean, date, pointer and
picture.
The type of value must match the array type, otherwise the syntax error 54 “Argument
types are incompatible” is generated. The following values will, however, be accepted:
• a string array (Text or String) accepts any value of the Text or String type.
• a number array (Integer, Longint or Real) accepts any value of the Integer, Longint, Real or
Time type.
Example
The following code:
APPEND TO ARRAY($myarray;$myvalue)
See Also
DELETE ELEMENT, INSERT ELEMENT.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The COPY ARRAY command creates or overwrites the destination array destination with the
exact contents, size, and type of the source array source.
The source and destination arrays can be local, process, or interprocess arrays. When copying
arrays, the scope of the array does not matter.
Example
The following example fills the array named C. It then creates a new array, named D, of the
same size as C and with the same contents:
version 3
Compatibility Note
Due to the new implementation of Choice Lists, compatibility for this command could not be
fully maintained. Also, starting with version 6, we recommend that you start using the
command Load list to work with the hierarchical lists defined in the Design environment List
Editor.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The LIST TO ARRAY command creates or overrides the array array with the first level items of
the list list.
The optional itemRefs parameter (a numeric array) returns the list item reference numbers.
Compatibility Note: In the previous version of 4D, this array was filled with the names of any
linked lists. If an element of the list had a linked list, the name of the linked list was put into
the array element with the same number as the list element. If there was no linked list, then
the element was the empty string. The second array was set to the same size as array. You
could use the names in this array to access the linked lists.
You can continue to use LIST TO ARRAY to build an array based on the first level items of a
hierarchical list. However, this command does not provide you with the child items, if any. To
work with hierarchical lists, use the new Hierarchical Lists commands introduced in version 6.
See Also
ARRAY TO LIST, Load list, SAVE LIST.
version 3
Compatibility Note
Due to the new implementation of Choice Lists, compatibility for this command could not be
fully maintained. Also, starting with version 6, we recommend that you use the command
SAVE LIST to work with the hierarchical lists defined in the Design environment List Editor.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ARRAY TO LIST command creates or replaces the list list (as defined in the Design
environment List Editor) using the elements of the array array.
This command allows you to define only the first level items of the list.
The optional itemRefs parameter, if specified, must be a numeric array synchronized with the
array array. Each element, then, indicates the list item reference number for the corresponding
element in array. If you omit this parameter, 4D automatically sets the list item reference
numbers to 1, 2... N.
Compatibility Note: In the previous version of 4D, this parameter was used to link other lists
to each element in array. If an element of the links array was the name of an existing list, then
that list was attached to the corresponding item.
You can continue to use ARRAY TO LIST to build a list based on the elements of an array.
However, this command does not provide a means of working with the child items. To work
with hierarchical lists, use the new Hierarchical Lists commands introduced in version 6.
See Also
LIST TO ARRAY, Load list, ON ERR CALL, SAVE LIST.
Error Handling
An error -9957 is generated when ARRAY TO LIST is applied to a list that is currently being
edited in the Design environment List Editor. You can catch this error using an ON ERR CALL
project method.
version 3
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
SELECTION TO ARRAY (field | table; array{; field2 | table2; array2; ...; fieldN | tableN; arrayN})
Description
The SELECTION TO ARRAY command creates one or more arrays and copies data in the fields
or record numbers from the current selection into the arrays.
The command SELECTION TO ARRAY applies to the selection for the table specified in the first
parameter. SELECTION TO ARRAY, can perform the following:
• Load values from one or several fields.
• Load Record numbers using the syntax ...;[table];Array;...
• Load values from related fields, provided that there is a Many to One automatic relation
between the tables or provided that you have previously called SET AUTOMATIC RELATIONS to
make manual Many to One relations automatic. In both cases, values are loaded from tables
through several levels of Many to One relations.
Each array is typed according to the field type. There are two exceptions:
• If a Text field is copied into a String array, the array will remain a String array.
• A Time field is copied into a Long Integer array.
If you load record numbers, they are copied into a Long Integer array.
4D Server: The SELECTION TO ARRAY command is optimized for 4D Server. Each array is
created on the server and then sent, in its entirety, to the client machine.
Note: After a call to SELECTION TO ARRAY, the current selection and current record remain
the same, but the current record is no longer loaded. If you need to use the values of the
fields in the current record, use the LOAD RECORD command after the SELECTION TO ARRAY
command.
Examples
1. In the following example, the [People] table has an automatic relation to the [Company]
table. The two arrays asLastName and asCompanyAddr are sized according to the number of
records selected in the [People] table and will contain information from both tables:
2. The following example returns the [Clients] record numbers in the array alRecordNumbers
and the [Clients]Names field values in the array asNames:
See Also
ARRAY TO SELECTION, MULTI SORT ARRAY, ON ERR CALL, SELECTION RANGE TO ARRAY, SET
AUTOMATIC RELATIONS.
version 3.5.3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
SELECTION RANGE TO ARRAY (start; end; field | table; array{; field2 | table2; array2; ...;
fieldN | tableN; arrayN})
Description
SELECTION RANGE TO ARRAY creates one or more arrays and copies data from the fields or
record numbers from the current selection into the arrays.
Unlike SELECTION TO ARRAY, which applies to the current selection in its entirety, SELECTION
RANGE TO ARRAY only applies to the range of selected records specified by the parameters start
and end.
The command expects you to pass in start and end the selected record numbers complying
with the formula 1 <= start <= end <= Records in selection ([...]).
If you pass 1 <= start = end < Records in selection ([...]), you will load fields or get the record
number from the record whose selected record is start = end.
If you pass incorrect selected record numbers, the command does the following:
• If end > Records in selection ([...]), it returns values from the selected record specified by start
to the last selected record.
• If start > end, it returns values from the record whose selected record is start only.
• If both parameters are inconsistent with the size of the selection, it returns empty arrays.
Like SELECTION TO ARRAY, the SELECTION RANGE TO ARRAY command applies to the selection
for the table specified in the first parameter.
Each array is typed according to the field type. There are two exceptions:
• If a Text field is copied into a String array. In this case, the array will remain a String array.
• A Time field is copied into a Long Integer array.
If you load record numbers, they are copied into a Long Integer array.
4D Server: SELECTION RANGE TO ARRAY is optimized for 4D Server. Each array is created on the
server and then sent, in its entirety, to the client machine.
WARNING: SELECTION RANGE TO ARRAY can create large arrays, depending on the range you
specify in start and end, and on the type and size of the data you are loading. Arrays reside in
memory, so it is a good idea to test the result after the command is completed. To do so, test
the size of each resulting array or cover the call to the command, using an ON ERR CALL
project method.
If the command is successful, the size of each resulting array is equal to (end-start)+1, except if
the end parameter exceeded the number of records in the selection. In such a case, each
resulting array contains (Records in selection([...])-start)+1 elements.
Examples
1. The following code addresses the first 50 records from the current selection for the [Invoices]
table. It loads the values from the [Invoices]Invoice ID field and the [Customers]Customer ID
related field.
3. The following code process, in sequential “chunks”of 1000 records, a large selection that
could not be downloaded in its entirety into arrays:
lMaxPage := 1000
lSelSize := Records in selection ([Phone Directory])
For ($lPage ; 1; 1+((lSelSize-1)\lMaxPage) )
` Load the values and/or record numbers
SELECTION RANGE TO ARRAY (1+(lMaxPage*($lPage-1));lMaxPage*$lPage;...;...;...;...;
...;...)
` Do something with the arrays
End for
See Also
ON ERR CALL, SELECTION TO ARRAY, SET AUTOMATIC RELATIONS.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ARRAY TO SELECTION command copies one or more arrays into a selection of records. All
fields listed must belong to the same table.
If a selection exists at the time of the call, the elements of the array are put into the records,
based on the order of the array and the order of the records. If there are more elements than
records, new records are created. The records, whether new or existing, are automatically saved.
If the arrays are of different sizes, the first array is used to determine how many elements to
copy. Any additional arrays are moved into the field that follows each array name.
This command does the reverse of SELECTION TO ARRAY. However, the ARRAY TO SELECTION
command does not allow fields from different tables, including related tables, even when an
automatic relation exists.
4D Server: The command is optimized for 4D Server. Arrays are sent by the client machine to
the server, and the records are modified or created on the server machine. As such a request is
handled synchronously, the client machine must wait for the operation to be completed
successfully. In the multi-user or multi-process environment, any records that are locked will
not be overwritten.
See Also
SELECTION TO ARRAY.
Description
The DISTINCT VALUES command creates and populates the array array with non-repeated
(unique) values coming from the field field for the current selection of the table to which the
field or subfield belongs.
You can pass to DISTINCT VALUES any indexable field or subfield, that is, whose type supports
indexing without necessarily being indexed.
However, executing this command on unindexed fields will be slower. Also note that, in this
case, the command looses the current record.
Note: As this command now functions with indexed and unindexed fields, its execution mode
can now be set by using the SET DATABASE PARAMETER command.
If you pass the field of a table, DISTINCT VALUES browses and retains the non-repeated values
present only in the currently selected records. However, if you pass a subfield, DISTINCT
VALUES browses all the subrecords present in each currently selected record.
Note: Starting from 4D 6.5, when the DISTINCT VALUES command is called during a
transaction (that has not yet finished), it will take into account records created during that
transaction.
If you create the array prior to the call, DISTINCT VALUES expects an array type compatible
with the field or subfield you pass. Otherwise, in interpreted mode, DISTINCT VALUES will
create an array of the proper type. However, if the field or subfield is of type Time, the
command expects or creates a LongInt array.
WARNING: DISTINCT VALUES can create large arrays depending on the size of the selection and
the number of different values in the records. Arrays reside in memory, therefore it is a good
idea to test the result after the completion of the command. To do so, test the size of the
resulting array or cover the call to the command, using an ON ERR CALL project method.
4D Server: The command is optimized for 4D Server. The array is created and the values are
calculated on the server machine; the array is then sent, in its entirety, to the client.
Examples
1. The following example creates a list of cities from the current selection and tells the user the
number of cities in which the firm has stores:
2. The following example returns in asKeywords all the keywords that are attached (using a
subtable) to the 4D Write documents stored in the table [Documentation] and whose theme is
“Economy”:
QUERY ([Documentation];[Documentation]Theme="Economy")
DISTINCT VALUES([Documentation]Keywords'Keyword;asKeywords)
After this array has been built, you can reuse it to quickly locate all the documents associated
with the selected keyword:
QUERY ([Documentation];[Documentation]Keywords'Keyword=asKeywords{asKeywords})
SELECTION TO ARRAY ([Documentation]Subject;asSubjects)
` ...
See Also
ON ERR CALL, SELECTION RANGE TO ARRAY, SELECTION TO ARRAY, SET DATABASE PARAMETER.
Description
The LONGINT ARRAY FROM SELECTION command fills the recordArray array with the (absolute)
record numbers that are in selection.
If you do not pass the selection parameter, the command will use the current selection of table.
See Also
CREATE SELECTION FROM ARRAY.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The BOOLEAN ARRAY FROM SET command fills an array of booleans indicating if each record
in the table is or is not in set.
The elements in the array are ordered in the order in which the records are created in the table
(absolute record numbers). If N is the number of records in the table, element 0 of the array
corresponds to record number 0, element 1 of the array corresponds to record number 1, etc.
Warning: The total number of elements in the booleanArr array is not significant. For
structural reasons, this number can be different from the number of records actually present in
the table. Possible extra elements are set to False.
If you don’t pass the set parameter, the command will use UserSet in the current process.
See Also
CREATE SET FROM ARRAY.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
BACKUP
Description
The BACKUP command starts the backup of the database using the current backup settings.
No confirmation dialog is displayed; however, a progress bar appears on screen.
Backup settings are set in the application Preferences. They are also stored in the
Backup.XML file located in the subfolder Preferences/Backup of the database.
The BACKUP command calls the On Backup Startup database method at the beginning of its
execution and the On Backup Shutdown database method at the end of its execution.
Because of this mechanism, the command should not be called from one of these database
methods.
4D Server: When called from a client machine, BACKUP is considered as a stored procedure;
it is still executed on the server.
See Also
GET BACKUP INFORMATION, On Backup Startup Database Method, RESTORE.
Error Handling
In case of any incidents, an error is generated which you can intercept by means of an error-
handling method installed using the ON ERR CALL command.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET BACKUP INFORMATION command allows getting information related to the last
backup performed on the database data.
Pass the type of information to get in selector. You can use one of the following constants,
placed in the “Backup and Restore” theme:
Constant Type Value
Last Backup Date Longint 0
Last Backup Status Longint 2
Next Backup Date Longint 4
The type and content of the info1 and info2 parameters depend on the value of selector.
• If selector = 0 (Last Backup Date), info1 returns the date and info2 the time of the last
backup.
• If selector = 2 (Last Backup Status), info1 returns the number and info2 the text of the
status of the last backup.
• If selector = 4 (Next Backup Date), info1 returns the date and info2 the time of the next
scheduled backup.
See Also
RESTORE.
version 2004.4
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The CHECK LOG FILE command has the same effect as the Check Log File... command of the
File menu of 4th Dimension in User mode: it displays the dialog box for viewing the
current log file of the database:
This dialog box includes the Rollback button that can be used to cancel operations carried
out on the data of the database. For more infromation about this dialog box, please refer to
the User Reference manual of 4th Dimension.
Note: Since the rollback function is relatively powerful, it is recommended that access to
the CHECK LOG FILE command be restricted to the database administrators.
This command can only be used in the context of single-user applications. More
particularly, it allows access to the rollback function from 4D Runtime applications
(applications with no User mode). If it is called within a client/server application, the
command has no effect and the error 1421 is returned.
Note: The Check Log File... menu command is always available on the server machine.
Error Handling
• If this command is executed in a database operating without a log file, it does nothing
and the error 1403 is returned.
• If this command is executed in a client/server database, it does nothing and the error
1421 is returned.
• If this command is called when a transaction or indexing operation is underway in one of
the active processes, its execution will be delayed for a period set on the Backup/Backup
page of the application Preferences. If, at the end of this waiting period, the operation is
still not terminated, the execution of this command is cancelled and the error 1422 is
returned.
You can intercept these errors using an error-handling method installed with the ON ERR
CALL command.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
RESTORE
Description
The RESTORE command provokes the display of the Restore page of the 4D Welcome dialog
box:
Note: In a 4D application that is compiled and merged with 4D Runtime Volume License, the
RESTORE command causes the display of a standard open file dialog box that lists by default
any files having the “4BK” extension.
See Also
BACKUP, GET RESTORE INFORMATION.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET RESTORE INFORMATION command allows getting information related to the last
automatic database restore.
Pass the type of information to get in selector. You can use one of the following constants,
placed in the “Backup and Restore” theme:
Constant Type Value
Last Restore Date Longint 0
Last Restore Status Longint 2
The type and content of the info1 and info2 parameters depend on the value of selector.
• If selector = 0 (Last Restore Date), info1 returns the date and info2 the time of the last
automatic database restore.
• If selector = 2 (Last Restore Status), info1 returns the number and info2 the text of the
status of the last automatic database restore.
Note: This command does not take manual database restores into account.
See Also
RESTORE.
Description
The SELECT LOG FILE command opens, creates, or closes the Log File according to the value
you pass in logFile.
Note: Calling SELECT LOG FILE is the same as selecting/deselecting the Use Log File option on
the Backup/Configuration page of the application Preferences.
In logFile, pass the name or the full pathname of the log file to be opened or created. If you
only pass a name, the file will be searched for or created next to the database structure file.
If you pass an empty string in logFile, SELECT LOG FILE presents an Open File dialog box,
allowing the user to open a log file or to create a new one. If the user clicks the Open button
and the file is opened correctly, the OK variable is set to 1. Otherwise, if the user clicks Cancel
or if the Log File could not be opened or created, OK is set to 0.
If you pass "*" in logFile, SELECT LOG FILE closes the current Log File for the database. The OK
variable is set to 1 when the log file is closed.
If you use SELECT LOG FILE to create or open a Log File when a full backup has not yet been
performed and the data file already contains records, 4D then generates an error -4447, which
you can intercept with an ON ERR CALL method.
See Also
ON ERR CALL.
Error Handling
An error -4447 is generated if the operation cannot be performed because the database needs
to be backed up. You can intercept the error with an ON ERR CALL method.
version 2004.3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Log File command returns the long name (i.e. the complete pathname of the file,
including its name) of the current log file of the open database.
If the database is operating without a log file, the command returns an empty string and
the system variable OK is set to 0.
If the database operates with a log file, the system variable OK is set to 1. The pathname
returned by the command is expressed with the syntax of the current platform.
WARNING: If you execute this command from a 4D Client machine, only the log file name
is returned, not the long name
See Also
SELECT LOG FILE.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The On Backup Startup Database Method is called every time a database backup is about to
start (manual backup, scheduled automatic backup, or using the BACKUP command).
This concerns all 4D environments: 4th Dimension, 4D Server, 4D Client, 4D Runtime and
databases merged with 4D Runtime Volume Licence.
The On Backup Startup Database Method allows verifying that the backup started. In this
method, you should return a value that authorizes or refuses the backup in the $0
parameter:
• If $0 = 0, the backup can be launched.
• If $0 # 0, the backup is not authorized. The operation is cancelled and an error is
returned. You can get the error using the GET BACKUP INFORMATION command.
You can use this database method to verify backup execution conditions (user, date of the
last backup, etc.).
Note: You must declare the $0 parameter (longint) in the database method:
C_LONGINT($0).
See Also
BACKUP, On Backup Shutdown Database Method.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The On Backup Shutdown Database Method is called every time a database backup ends. The
reasons for the stoppage of a backup can be the end of the copy, user interruption or an
error.
This concerns all 4D environments: 4th Dimension, 4D Server, 4D Client, 4D Runtime and
databases merged with 4D Runtime Volume License.
The On Backup Shutdown Database Method allows verifying that the backup was executed
correctly. It receives, in the $1 parameter, a value representing the status of the backup
once completed:
• If the backup was executed correctly, $1 equals 0.
• If the backup was interrupted by the user or following an error, $1 is different from 0. If
the backup was stopped by the On Backup Startup database method ($0 # 0), $1 gets the
value actually returned in the $0 parameter. This allows you to implement a customized
error management system.
In any case, you can get information about the error using the GET BACKUP INFORMATION
command.
Note: You must declare the $1 parameter (longint) in the database method:
C_LONGINT($1)
See Also
BACKUP, On Backup Startup Database Method.
version 2004.3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Preliminary note: This command only works with 4D Server. It can only be executed via the
Execute on server command or in a stored procedure.
Description
The New log file command closes the current log file, renames it and creates a new one with
the same name in the same location as the previous one. This command is meant to be
used for setting up a backup system using a logical mirror (see the section “Setting up a
logical mirror” in the 4D Server Reference Manual).
The command returns the full pathname (access path + name) of the log file being closed
(called the “segment”). This file is stored in the same location as the current log file
(specified on the Configuration page in the Backup theme of the Preferences). The
command does not carry out any processing (compression, segmentation) on the saved file.
No dialog box appears.
The file is renamed with the current backup numbers of the database and of the log file, as
shown in the following example: DatabaseName[BackupNum-LogBackupNum].4DL. For
instance:
• If the MyDatabase.4DD database has been saved 4 times, the last backup file will be
named MyDatabase[0004].4BK. The name of the first “segment” of the log file will therefore
be MyDatabase[0004-0000].4DL.
• If the MyDatabase.4DD database has been saved 3 times and the log file has been saved 5
times since, the name of the 6th backup of the log file will be MyDatabase[0003-0005].4DL.
Before performing this operation, 4D Server checks that no other critical operation
(transaction or indexing) is underway. If a critical operation is underway, 4D Server respects
the waiting times set on the Backup page in the Backup theme of the Preferences.
See Also
INTEGRATE LOG FILE.
Error Handling
In the event of an error, the command generates a code that can be intercepted using the
ON ERR CALL command.
version 2004.3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Preliminary note: This command only works with 4D Server. It can only be executed via the
Execute on server command or in a stored procedure.
Description
The INTEGRATE LOG FILE command integrates the log file, whose name or pathname was
passed in the pathName parameter, into the current database. Afterwards, the file that was
integrated becomes the new current log file of the database. This command is meant to be
used for setting up a backup system using a logical mirror (see the section “Setting up a
logical mirror” in the 4D Server Reference manual).
Only log files that are not filed (extension .4DL) can be integrated using this command. No
dialog box appears; but a progress bar is displayed on screen.
In the pathName parameter, you can pass an absolute pathname or one that is relative to
the database folder. If you pass an empty string in this parameter, a standard open file
dialog box will be displayed to allow you to indicate the file to be integrated. If this dialog
box is cancelled, no file will be integrated and the system variable OK is set to 0.
• Install the mirror database on the mirror machine and make sure that the data file will
not be modified other than by the integration of the log file using the INTEGRATE LOG FILE
command. In order to detect whether it is the mirror version of the database, it is possible
to place a file in the 4D Extensions folder or database folder and to test for its presence for
instance during the On Startup database method. If the file is present, the mirror mode is
activated.
• Set up a communication system between the operational database and the mirror
database in order to organize the sending and receiving of the log file segments. To do this,
it is possible to use a Web service, the 4D Open for 4D plug-in or the 4D Internet
Commands.
See Also
New log file.
Error Handling
In the event of an error, the command generates a code that can be intercepted using the
ON ERR CALL command. If there are any locked records in the database, the command does
nothing and the error 1420 is generated.
Definition
4th Dimension supports the BLOB (Binary Large OBjects) data type.
Within 4th Dimension, a BLOB is a contiguous series of variable length bytes, which can be
treated as one whole object or whose bytes can be addressed individually. A BLOB can be
empty (null length) or can contain up to 2147483647 bytes (2 GB).
Like the other field types that can retain a large amount of data (Picture and subtable field
types), BLOB fields are not duplicated in memory when you modify a record. Consequently,
the result returned by the commands Old and Modified is not significant when applied to a
BLOB field.
Displaying BLOBs
A BLOB can retain any type of data, so it has no default representation on the screen. If you
display a BLOB field or variable in a form, it will always appear blank, whatever its contents.
BLOB fields
You can use BLOB fields to store any kind of data, up to 2 GB. You cannot index a BLOB field,
so you must use a formula in order to search records on values stored in a BLOB field.
Note for Plug-in developers: A BLOB parameter is declared as “&O” (the letter “O”, not the
digit “0”).
Assignment
You can assign BLOBs to each other.
Example:
` Declare two variables of type BLOB
C_BLOB (vBlobA;vBlobB)
` Set the size of the first BLOB to 10K
SET BLOB SIZE (vBlobA;10*1024)
` Assign the first BLOB to the second one
vBlobB:=vBlobA
Because you can address all the bytes of a BLOB individually, you can actually store whatever
you want in a BLOB field or variable.
In addition:
• C_BLOB declares a variable of type BLOB. Refer to the Compiler chapter for more
information.
• GET CLIPBOARD and APPEND TO CLIPBOARD enable you to deal with any data type stored in
the Clipboard. Refer to the Clipboard chapter for more information.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SET BLOB SIZE resizes the BLOB blob according to the value passed in size.
If you want to allocate new bytes to a BLOB and want to have those bytes initialized to a
specific value, pass the value (0..255) into the filler optional parameter.
Examples
1. When you are through with a large process or interprocess BLOB, it is good idea to free the
memory it occupies. To do so, write:
SET BLOB SIZE(aProcessBLOB;0)
SET BLOB SIZE(<>anInterprocessBLOB;0)
See Also
BLOB size.
Error Handling
If you cannot resize a BLOB due to insufficient memory, the error -108 is generated. You can
trap this error using an ON ERR CALL interruption method.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
BLOB size returns the size of blob expressed in bytes.
Examples
The line of code adds 100 bytes to the BLOB myBlob:
SET BLOB SIZE (BLOB size(myBlob)+100)
See Also
SET BLOB SIZE.
Description
The COMPRESS BLOB command compresses the BLOB blob using the internal 4th Dimension
compression algorithm. This command only compresses BLOB whose size is over 255 bytes.
The optional compression parameter allows to set the way the BLOB will be compressed:
• If you pass 1, the BLOB is compressed as much as possible, at the expanse of the speed of
compression and decompression operations.
• If you pass 2, the BLOB is compressed as fast as possible (and will be decompressed as fast as
possible), at the expense of the compression ratio (the compressed BLOB will be bigger).
• If you pass another value or if you omit the parameter, the BLOB is compressed as much as
possible, using the compression mode 1.
After the call, the OK variable is set to 1 if the BLOB has been successfully compressed. If the
compression could not be performed, the OK variable is set to 0. If the compression could not
be performed because of a lack of memory or because the actual size of the blob is less than
255 bytes, no error is generated and the method resumes its execution.
In any other cases (i.e. the BLOB is damaged), the error -10600 is generated. This error can be
trapped using the ON ERR CALL command.
After a BLOB has been compressed, you can expand it using the EXPAND BLOB command.
WARNING: A compressed BLOB is still a BLOB, so there is nothing to stop you from modifying
its contents. However, if you do so, the EXPAND BLOB command will not be able to
decompress the BLOB properly.
Examples
1. This example tests if the BLOB vxMyBlob is compressed, and, if it is not, compresses it:
BLOB PROPERTIES (vxMyBlob;$vlCompressed;$vlExpandedSize;$vlCurrentSize)
If ($vlCompressed=Is not compressed)
COMPRESS BLOB (vxMyBlob)
End if
Note however, that if you apply COMPRESS BLOB to an already compressed BLOB, the
command detects it and does nothing.
2. This example allows you to select a document and then compress it:
$vhDocRef := Open document ("")
If (OK=1)
CLOSE DOCUMENT ($vhDocRef)
DOCUMENT TO BLOB (Document;vxBlob)
If (OK=1)
COMPRESS BLOB (vxBlob)
If (OK=1)
BLOB TO DOCUMENT (Document;vxBlob)
End if
End if
End if
See Also
BLOB PROPERTIES, EXPAND BLOB.
Description
The EXPAND BLOB command expands the BLOB blob that was previously compressed using
the COMPRESS BLOB command.
After the call, the OK variable is set to 1 if the BLOB has been expanded. If the expansion
could not be performed, the OK variable is set to 0.
If the expansion could not be performed because of a lack of memory, no error is generated
and the method resumes its execution.
In any other case (i.e. the BLOB has not been compressed or is damaged), the error -10600 is
generated. This error can be trapped using the ON ERR CALL command.
To check if a BLOB has been compressed, use the BLOB PROPERTIES command.
Examples
1. This example tests if the BLOB vxMyBlob is compressed and, if so, expands it:
BLOB PROPERTIES (vxMyBlob;$vlCompressed;$vlExpandedSize;$vlCurrentSize)
If ($vlCompressed#Is not compressed)
EXPAND BLOB (vxMyBlob)
End if
See Also
BLOB PROPERTIES, COMPRESS BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The BLOB PROPERTIES command returns information about the BLOB blob.
• The compressed parameter tells whether or not the BLOB is compressed, and returns one of
the following values. Note: 4th Dimension provides the predefined constants.
• Whatever the compression status of the BLOB, the expandedSize parameter returns the size
of the BLOB when it is not compressed.
• The parameter currentSize returns the current size of the BLOB. If the BLOB is compressed,
you will usually obtain currentSize less than expandedSize. If the BLOB is not compressed, you
will always obtain currentSize equal to expandedSize.
Examples
1. See examples for the commands COMPRESS BLOB and EXPAND BLOB.
C_POINTER ($1;$2)
C_LONGINT ($0;$vlCompressed;$vlExpandedSize;$vlCurrentSize)
After this method has been added to your application, you can use it this way:
` ...
COMPRESS BLOB (vxBlob)
$vlPercent:=Space saved by compression (->vxBlob;->vlBlobSize)
ALERT ("The compression saved "+String (vlBlobSize)+" bytes, so "+String ($vlPercent;
"#0%")+" of space.")
See Also
COMPRESS BLOB, EXPAND BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
DOCUMENT TO BLOB loads the whole contents of document into blob. You must pass the
name of an existing document that is not already open, otherwise an error will be generated.
To let the user choose the document to be loaded into the BLOB, use the command Open
document and the process variable document (see Example).
Note regarding Macintosh: Macintosh documents can be composed of two forks: the Data fork
and the Resource fork. By default, the command DOCUMENT TO BLOB loads the Data fork of
the document. To load the Resource fork of the document instead, pass the optional *
parameter. On Windows, the optional * parameter is ignored. Note that the 4D environment
provides the equivalent of Mac OS resource forks on Windows. For example, the data fork of a
4D database is stored in a file with the file extension .4DB; the resource fork is stored in a file
with the same name and the file extension .RSR. On Windows, if you write a 4D application
with the data fork and resource fork stored in BLOBs, you just need to access the file
corresponding to the fork with which you want to work.
See Also
BLOB TO DOCUMENT, Open document.
System Variables
OK is set to 1 if the document is correctly loaded, otherwise OK is set to 0 and an error is
generated.
Error Handling
• If you try to load (into a BLOB) a document that does not exist or that is already open by
another process or application, the appropriate File Manager error is generated.
• An I/O error can occur if the document is locked, located on a locked volume, or if there is
problem in reading the document.
• If there is not enough memory to load the document, an error -108 is generated.
In each case, you can trap the error using an ON ERR CALL interruption method.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
BLOB TO DOCUMENT rewrites the whole contents of document using the data stored in blob.
You can pass the name of a document in document. If the document does not exist, the
command creates it. If you pass the name of an existing document, make sure that it is not
already open, otherwise an error is generated. If you want to let the user choose the document,
use the commands Open document or Create document and use the process variable document
(see example).
Note regarding Macintosh: Macintosh documents can be composed of two forks: the Data fork
and the Resource fork. By default, the command BLOB TO DOCUMENT rewrites the Data fork
of the document. To rewrite the Resource fork of the document instead, pass the optional *
parameter. On Windows, the optional * parameter is ignored. Note that the 4D environment
provides the equivalent of Mac OS resource forks on Windows. For example, the data fork of a
4D database is stored in a file with the file extension .4DB; the resource fork is stored in a file
with the same name and the file extension .RSR. On Windows, if you write a 4D application
with the data fork and resource fork stored in BLOBs, you just need to access the file
corresponding to the fork with which you want to work.
See Also
Create document, DOCUMENT TO BLOB, Open document.
System Variables
OK is set to 1 if the document is correctly written, otherwise OK is set to 0 and an error is
generated.
Error Handling
• If you try to rewrite a document that does not exist or that is already open by another
process or application, the appropriate File Manager error is generated.
• The disk space may be insufficient for writing the new contents of the document.
• I/O errors can occur while writing the document.
In all cases, you can trap the error using an ON ERR CALL interruption method.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The VARIABLE TO BLOB command stores the variable variable in the BLOB blob.
If you specify the * optional parameter, the variable is appended to the BLOB and the size of
the BLOB is extended accordingly. Using the * optional parameter, you can sequentially store
any number of variables or lists (see other BLOB commands) in a BLOB, as long as the BLOB
fits into memory.
If you do not specify the * optional parameter or the offset variable parameter, the variable is
stored at the beginning of the BLOB, overriding its previous contents; the size of the BLOB is
adjusted accordingly.
If you pass the offset variable parameter, the variable is written at the offset (starting from
zero) within the BLOB. No matter where you write the variable, the size of the BLOB is
increased according to the location you passed (plus the size of the variable, if necessary).
Newly allocated bytes, other than the ones you are writing, are initialized to zero.
After the call, the offset variable parameter is returned, incremented by the number of bytes
that have been written. Therefore, you can reuse that same variable with another BLOB
writing command to write another variable or list.
VARIABLE TO BLOB accepts any type of variable (including other BLOBs), except the following:
• Pointer
• Array of pointers
• Two-dimensional arrays
WARNING: If you use a BLOB for storing variables, you must later use the command
BLOB TO VARIABLE for reading back the contents of the BLOB, because variables are stored in
BLOBs using a 4D internal format.
After the call, if the variable has been successfully stored, the OK variable is set to 1. If the
operation could not be performed, the OK variable is set to 0; for example, there was not
enough memory.
Note regarding Platform Independence: VARIABLE TO BLOB and BLOB TO VARIABLE use a 4D
internal format for handling variables stored in BLOBs. As a benefit, you do not need to worry
about byte swapping between platforms while using these two commands. In other words, a
BLOB created on Windows using either of these commands can be reused on Macintosh, and
vice-versa.
Examples
1. The two following project methods allow you to quickly store and retrieve arrays into and
from documents on disk:
` SAVE ARRAY project method
` SAVE ARRAY ( String ; Pointer )
` SAVE ARRAY ( Document ; -> Array )
C_STRING (255;$1)
C_POINTER ($2)
C_BLOB ($vxArrayData)
VARIABLE TO BLOB ($2->;$vxArrayData) ` Store the array into the BLOB
COMPRESS BLOB ($vxArrayData) ` Compress the BLOB
BLOB TO DOCUMENT ($1;$vxArrayData) ` Save the BLOB on disk
2. The two following project methods allow you to quickly store and retrieve any set of
variables into and from a BLOB:
` STORE VARIABLES INTO BLOB project method
` STORE VARIABLES INTO BLOB ( Pointer { ; Pointer ... { ; Pointer } } )
` STORE VARIABLES INTO BLOB ( BLOB { ; Var1 ... { ; Var2 } } )
C_POINTER (${1})
C_LONGINT ($vlParam)
$vlOffset:=0
For ($vlParam;2;Count parameters)
BLOB TO VARIABLE ($1->;${$vlParam}->;$vlOffset)
End for
After these methods have been added to your application, you can write:
STORE VARIABLES INTO BLOB ( ->vxBLOB;->vgPicture;->asAnArray;->alAnotherArray)
` ...
RETRIEVE VARIABLES FROM BLOB ( ->vxBLOB;->vgPicture;->asAnArray;->alAnotherArray)
See Also
BLOB to list, BLOB TO VARIABLE, LIST TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The BLOB TO VARIABLE command rewrites the variable variable with the data stored within the
BLOB blob at the byte offset (starting at zero) specified by offset.
The BLOB data must be consistent with the destination variable. Typically, you will use BLOBs
that you previously filled out using the command VARIABLE TO BLOB.
If you do not specify the optional offset parameter, the variable data is read starting from the
beginning of the BLOB. If you deal with a BLOB in which several variables have been stored,
you must pass the offset parameter and, in addition, you must pass a numeric variable. Before
the call, set this numeric variable to the appropriate offset. After the call, that same numeric
variable returns the offset of the next variable stored within the BLOB.
After the call, if the variable has been successfully rewritten, the OK variable is set to 1. If the
operation could not be performed, the OK variable is set to 0; for example, if there was not
enough memory.
Note regarding Platform Independence: BLOB TO VARIABLE and VARIABLE TO BLOB use a 4D
internal format for handling variables stored in BLOBs. As a benefit, you do not need to worry
about byte swapping between platforms while using these two commands. In other words, a
BLOB created on Windows using either of these commands can be reused on Macintosh, and
vice-versa.
See Also
VARIABLE TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The LIST TO BLOB command stores the hierarchical list list in the BLOB blob.
If you specify the * optional parameter, the hierarchical list is appended to the BLOB and the
size of the BLOB is extended accordingly. Using the * optional parameter, you can sequentially
store any number of variables or lists (see other BLOB commands) in a BLOB, as long as the
BLOB fits into memory.
If you do not specify the * optional parameter, the hierarchical list is stored at the beginning
of the BLOB, overriding its previous contents; the size of the BLOB is adjusted accordingly.
Wherever the hierarchical list is stored, the size of the BLOB will be increased if necessary
according to the specified location (plus up to the size of the list if necessary). Modified bytes
(other than the ones you set) are reset to 0 (zero).
WARNING: If you use a BLOB for storing lists, you must later use the command BLOB to list for
reading back the contents of the BLOB, because lists are stored in BLOBs using a 4D internal
format.
After the call, if the list has been successfully stored, the OK variable is set to 1. If the
operation could not be performed, the OK variable is set to 0; for example, if there was not
enough memory.
Note regarding Platform Independence: LIST TO BLOB and BLOB to list use a 4D internal
format for handling lists stored in BLOBs. As a benefit, you do not need to worry about byte
swapping between platforms when using these two commands. In other words, a BLOB
created on Windows using those commands can be reused on Macintosh, and vice-versa.
See Also
BLOB to list, BLOB TO VARIABLE, SAVE LIST, VARIABLE TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The BLOB to list command creates a new hierarchical list with the data stored within the BLOB
blob at the byte offset (starting at zero) specified by offset and returns a List Reference number
for that new list.
The BLOB data must be consistent with the command. Typically, you will use BLOBs that you
previously filled out using the command LIST TO BLOB.
If you do not specify the optional offset parameter, the list data is read starting from the
beginning of the BLOB. If you deal with a BLOB in which several variables or lists have been
stored, you must pass the offset parameter and, in addition, you must pass a numeric variable.
Before the call, set this numeric variable to the appropriate offset. After the call, that same
numeric variable returns the offset of the next variable stored within the BLOB.
After the call, if the hierarchical list has been successfully created, the OK variable is set to 1. If
the operation could not be performed, the OK variable is set to 0; for example, if there was not
enough memory.
Note regarding Platform Independence: BLOB to list and LIST TO BLOB use a 4D internal
format for handling lists stored in BLOBs. As a benefit, you do not need to worry about byte
swapping between platforms when using these two commands. In other words, a BLOB
created on Windows using those two commands can be reused on Macintosh and vice-versa.
Case of
: (bValidate=1)
LIST TO BLOB(hList;[Things To Do]Other Crazy Ideas)
End case
See Also
LIST TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The INTEGER TO BLOB command writes the 2-byte Integer value integer into the BLOB blob.
The byteOrder parameter fixes the byte ordering of the 2-byte Integer value to be written. You
pass one of the following predefined constants provided by 4th Dimension:
Note regarding Platform Independence: If you exchange BLOBs between the Macintosh and
PC platforms, it is up to you to manage byte swapping issues when using this command.
If you specify the * optional parameter, the 2-byte Integer value is appended to the BLOB and
the size of the BLOB is extended accordingly. Using the * optional parameter, you can
sequentially store any number of Integer, Long Integer, Real or Text values (see other BLOB
commands) in a BLOB, as long as the BLOB fits into memory.
If you do not specify the * optional parameter or the offset variable parameter, the 2-byte
Integer value is stored at the beginning of the BLOB, overriding its previous contents; the size
of the BLOB is adjusted accordingly.
Examples
1. After executing this code:
INTEGER TO BLOB (0x0206;vxBlob;Native byte ordering)
See Also
BLOB to integer, BLOB to longint, BLOB to real, BLOB to text, LONGINT TO BLOB, REAL TO BLOB,
TEXT TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The LONGINT TO BLOB command writes the 4-byte Long Integer value integer into the BLOB
blob.
The byteOrder parameter fixes the byte ordering of the 4-byte Long Integer value to be written.
You pass one of the following predefined constants provided by 4th Dimension:
Note regarding Platform Independence: If you exchange BLOBs between Macintosh and PC
platforms, it is up to you to manage byte swapping issues while using this command.
If you specify the * optional parameter, the 4-byte Long Integer value is appended to the BLOB
and the size of the BLOB is extended accordingly. Using the * optional parameter, you can
sequentially store any number of Integer, Long Integer, Real or Text values (see other BLOB
commands) in a BLOB, as long as the BLOB fits into memory.
If you pass the offset variable parameter, the 4-byte Long Integer value is written at the offset
(starting from zero) within the BLOB. No matter where you write the 4-byte Long Integer
value, the size of the BLOB is increased according to the location you passed (plus up to 4
bytes, if necessary). New allocated bytes, other than the ones you are writing, are initialized to
zero.
After the call, the offset variable parameter is returned, incremented by the number of bytes
that have been written. Therefore, you can reuse that same variable with another BLOB
writing command to write another value.
Examples
1. After executing this code:
LONGINT TO BLOB (0x01020304;vxBlob;Native byte ordering)
See Also
BLOB to integer, BLOB to longint, BLOB to real, BLOB to text, INTEGER TO BLOB, REAL TO BLOB,
TEXT TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The REAL TO BLOB command writes the Real value real into the BLOB blob.
The realFormat parameter fixes the internal format and byte ordering of the Real value to be
written. You pass one of the following predefined constants provided by 4th Dimension:
Platform Independence Note: If you exchange BLOBs between Macintosh and PC platforms, it
is up to you to manage real formats and byte swapping issues when using this command.
If you specify the * optional parameter, the Real value is appended to the BLOB; the size of the
BLOB is extended accordingly. Using the * optional parameter, you can sequentially store any
number of Integer, Long Integer, Real or Text values (see other BLOB commands) in a BLOB, as
long as the BLOB fits into memory.
If you pass the offset variable parameter, the Real value is written at the offset (starting from
zero) within the BLOB. No matter where you write the Real value, the size of the BLOB is
increased according to the location you passed (plus up to 8 or 10 bytes, if necessary). New
allocated bytes, other than the ones you are writing, are initialized to zero.
After the call, the offset variable parameter is returned, incremented by the number of bytes
that have been written. Therefore, you can reuse that same variable with another BLOB
writing command to write another value.
Examples
1. After executing this code:
C_REAL (vrValue)
vrValue := ...
REAL TO BLOB (vrValue;vxBlob;Native real format)
See Also
BLOB to integer, BLOB to longint, BLOB to real, BLOB to text, INTEGER TO BLOB, LONGINT TO
BLOB, TEXT TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The TEXT TO BLOB command writes the Text value text into the BLOB blob.
The textFormat parameter fixes the internal format of the text value to be written. You pass
one of the following predefined constants provided by 4th Dimension:
Note: The command accepts both Text (declared with C_TEXT) and String (declared with
C_STRING) expressions. Remember that a Text variable can contain up to 32,000 characters
and a String variable can contain up to the number of characters in its declaration, with a
maximum of 255 characters.
If you specify the * optional parameter, the Text value is appended to the BLOB; the size of the
BLOB is extended accordingly. Using the * optional parameter, you can sequentially store any
number of Integer, Long Integer, Real or Text values (see other BLOB commands) in a BLOB, as
long as the BLOB fits into memory.
If you do not specify the * optional parameter nor the offset variable parameter, the Text value
is stored at the beginning of the BLOB, overriding its previous contents; the size of the BLOB is
adjusted accordingly.
If you pass the offset variable parameter, the Text value is written at the offset (starting from
zero) within the BLOB. No matter where you write the Text value, the size of the BLOB is,
increased according to the location you passed (plus up to the size of the text, if necessary).
New allocated bytes, other than the ones you are writing, are initialized to zero.
After the call, the offset variable parameter is returned, incremented by the number of bytes
that have been written. Therfore, you can reuse that same variable with another BLOB writing
command to write another value.
See Also
BLOB to integer, BLOB to longint, BLOB to real, BLOB to text, INTEGER TO BLOB, LONGINT TO
BLOB, REAL TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The BLOB to integer command returns a 2-byte Integer value read from the BLOB blob.
The byteOrder parameter fixes the byte ordering of the 2-byte Integer value to be read. You
pass one of the following predefined constants provided by 4th Dimension:
Note regarding Platform Independence: If you exchange BLOBs between Macintosh and PC
platforms, it is up to you to manage byte swapping issues when using this command.
If you specify the optional offset variable parameter, the 2-byte Integer value is read at the
offset (starting from zero) within the BLOB. If you do not specify the optional offset variable
parameter, the first two bytes of the BLOB are read.
Note: You should pass an offset (in bytes) value between 0 (zero) and the size of the BLOB
minus 2. If you do not do so, an error -111 is generated.
After the call, the variable is incremented by the number of bytes read, Therefore, you can
reuse that same variable with another BLOB reading command to read another value.
$vlOffset:=0x200
For ($viLoop;0;19)
$viValue:=BLOB to integer(vxSomeBlob;PC byte ordering;$vlOffset)
` Do something with $viValue
End for
See Also
BLOB to longint, BLOB to real, BLOB to text, INTEGER TO BLOB, LONGINT TO BLOB, REAL TO
BLOB, TEXT TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The BLOB to longint command returns a 4-byte Long Integer value read from the BLOB blob.
The byteOrder parameter fixes the byte ordering of the 4-byte Long Integer value to be read.
You pass one of the following predefined constants provided by 4th Dimension:
Note regarding Platform Independence: If you exchange BLOBs between Macintosh and PC
platforms, it is up to you to manage byte swapping issues while using this command.
If you specify the optional offset variable parameter, the 4-byte Long Integer is read at the
offset (starting from zero) within the BLOB. If you do not specify the optional offset variable
parameter, the first four bytes of the BLOB are read.
Note: You should pass an offset value between 0 (zero) and the size of the BLOB minus 4. If
you do not do so, an error -111 is generated.
After the call, the variable is incremented by the number of bytes read. Therefore, you can
reuse that same variable with another BLOB reading command to read another value.
$vlOffset:=0x200
For ($viLoop;0;19)
$vlValue:=BLOB to longint(vxSomeBlob;PC byte ordering;$vlOffset)
` Do something with $vlValue
End for
See Also
BLOB to integer, BLOB to real, BLOB to text, INTEGER TO BLOB, LONGINT TO BLOB, REAL TO
BLOB, TEXT TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The BLOB to real command returns a Real value read from the BLOB blob.
The realFormat parameter fixes the internal format and byte ordering of the Real value to be
read. You pass one of the following predefined constants provided by 4th Dimension:
Note regarding Platform Independence: If you exchange BLOBs between Macintosh and PC
platforms, it is up to you to manage real formats and byte swapping issues while using this
command.
If you specify the optional offset variable parameter, the Read value is read at the offset
(starting from zero) within the BLOB. If you do not specify the optional offset variable
parameter, the first 8 or 10 bytes of the BLOB are read.
Note: You should pass an offset value between 0 (zero) and the size of the BLOB minus 8 or
10. If you do not do so, an error -111 is generated.
Example
The following example reads 20 Real values from a BLOB, starting at the offset 0x200:
$vlOffset:=0x200
For ($viLoop;0;19)
$vrValue:=BLOB to real(vxSomeBlob;PC byte ordering;$vlOffset)
` Do something with $vrValue
End for
See Also
BLOB to integer, BLOB to longint, BLOB to text, INTEGER TO BLOB, LONGINT TO BLOB, REAL TO
BLOB, TEXT TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The BLOB to text command returns a Text value read from the BLOB blob.
The textFormat parameter fixes the internal format of the text value to be read. You pass one
of the following predefined constants provided by 4th Dimension:
Remember that a Text variable can contain up to 32,000 characters and a String variable can
contain up to the number of characters in its declaration, with a maximum of 255 characters.
If you try to read more data than a variable can hold, 4D will truncate the result of the
command when placing it into the variable.
If you specify the optional offset variable parameter, the Text value is read at the offset
(starting from zero) within the BLOB. If you do not specify the optional offset variable
parameter, the beginning of the BLOB is read according to the value you pass in textFormat.
Note that you must pass the offset variable parameter when you are reading text without
length.
Note: You should pass an offset value between 0 (zero) and the size of the BLOB minus the
size of the text to be read. If you do not do so, the function result is unpredictable.
After the call, the variable is incremented by the number of bytes read. Therefore, you can
reuse that same variable with another BLOB reading command to read another value.
See Also
BLOB to integer, BLOB to longint, BLOB to real, INTEGER TO BLOB, LONGINT TO BLOB, REAL TO
BLOB, TEXT TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The INSERT IN BLOB command inserts the number of bytes specified by len into the BLOB blob
at the position specified by offset. The BLOB then becomes len bytes larger.
If you do not specify the optional filler parameter, the bytes inserted into the BLOB are set to
0x00. Otherwise, the bytes are set to the value you pass in filler (modulo 256 — 0..255).
Before the call, you pass in the offset variable parameter the position of the insertion relative
to the beginning of the BLOB.
See Also
DELETE FROM BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DELETE FROM BLOB command deletes the number of bytes specified by len from the BLOB
blob at the position specified by offset (expressed relative to the beginning of the BLOB). The
BLOB then becomes len bytes smaller.
See Also
INSERT IN BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The COPY BLOB command copies the number of bytes specified by len from the BLOB srcBLOB
to the BLOB dstBLOB.
The copy starts at the position (expressed relative to the beginning of the source BLOB)
specified by srcOffset and takes place at the position (expressed relative to the beginning of the
destination BLOB) specified by dstOffset.
See Also
DELETE FROM BLOB, INSERT IN BLOB.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ENCRYPT BLOB command encrypts the content of the toEncrypt BLOB with the sender’s
private key sendPrivKey, as well as optionally the recipient’s public key recipPubKey. These keys
should be generated by the command GENERATE ENCRYPTION KEYPAIR (within the “Secured
Protocol” theme).
Note: This command uses the SSL protocol algorithm and encryption features. To be able to
use this command, make sure that the components necessary to the SSL protocol are installed
properly on your machine — even though you do not want to use SSL for 4D Web server
connections. For detailed information on this protocol, please refer to section Web Services,
Using SSL Protocol.
• If one key is used for the encryption (the sender’s private key), only people in possession of
the public key will be able to read the information. This system guarantees that the sender
himself has encrypted the information.
• The simultaneous use of the sender’s private key and recipient’s public key guarantees that
only one recipient will be able to read the information.
The BLOB containing the keys has a PKCS internal format. This standard cross platform
format allows exchanging or handling keys simply by copy-pasting in an Email or a text file.
Once the command has been run, the toEncrypt BLOB contains the encrypted data that will be
decrypted only with the DECRYPT BLOB command, with the sender’s public key passed as
parameter.
Moreover, if the optional recipient’s public key has been used to encrypt the information, the
recipient’s private key will also be necessary for decrypting.
Note: The cipher contains a checksum functionality in order to avoid any BLOB content
modification (deliberately or not). Consequently, an encrypted BLOB should not be modified
otherwise it might not be decrypted.
1. The company generates a pair of keys with the command GENERATE ENCRYPTION KEYPAIR:
`Method GENERATE_KEYS_TXT
C_BLOB($BPublicKey; $BPrivateKey)
GENERATE ENCRYPTION KEYPAIR($BPrivateKey; $BPublicKey)
BLOB TO DOCUMENT("PublicKey.txt"; $BPublicKey)
BLOB TO DOCUMENT("PrivateKey.txt"; $BPrivateKey)
2. The company keeps the private key and sends a copy of the document containing the
public key to each subsidiary. For maximum security, the key should be copied on a disk
handed over to the subsidiaries.
3. Then the company copies the private information (stored in the text field, for example) in
BLOBs which will be encrypted with the private key:
`Method ENCRYPT_INFO
C_BLOB($vbEncrypted;$vbPrivateKey)
C_TEXT($vtEncrypted)
$vtEncrypted:=[Private]Info
VARIABLE TO BLOB ($vtEncrypted;$vbEncrypted)
DOCUMENT TO BLOB("PrivateKey.txt"; $vbPrivateKey)
If(OK=1)
ENCRYPT BLOB ($vbEncrypted; $vbPrivateKey)
BLOB TO DOCUMENT ("Update.txt";$vbEncrypted)
End if
4. The update files can be sent to the subsidiaries (though a non-secured channel such as the
Internet). If a third person gets hold of the encrypted file, he will not be able to decrypt it
without the public key.
`Method DECRYPT_INFO
C_BLOB($vbEncrypted;$vbPublicKey)
C_TEXT($vtDecrytped)
C_TIME ($vtDocRef)
• Using keypairs
A company wants to use the Internet to exchange information. Each subsidiary receives
private information and also sends information to the corporate office. Consequently there are
two requirements:
- The recipient only should be able to read the message,
- The recipient must have proof that the message was sent by the sender himself.
1. The corporate office and each subsidiary generate their own key pairs (with the
GENERATE_KEYS_TXT method).
2. The private key is kept secret by both sides. Each subsidiary sends its public key to the
corporate office who, in its turn, sends its public key too. This key transfer does not need to be
done through a secured channel as the public key is not enough to decrypt the message.
`Method ENCRYPT_INFO_2
C_BLOB($vbEncrypted;$vbPrivateKey;$vbPublicKey)
C_TEXT($vtEncrypt)
C_TIME ($vtDocRef)
$vtEncrypt:= [Private]Info
VARIABLE TO BLOB ($vtEncrypt;$vbEncrypted)
` Your own private key is loaded...
DOCUMENT TO BLOB("PrivateKey.txt"; $vbPrivateKey)
If (OK=1)
` ...and the recipient’s public key
ALERT ("Please select the recipient’s public key.")
$vhDocRef:=Open document("") `Public key to load
If (OK=1)
CLOSE DOCUMENT($vtDocRef)
DOCUMENT TO BLOB(Document;$vbPublicKey)
`BLOB encryption with the two keys as parameters
ENCRYPT BLOB ($vbEncrypted; $vbPrivateKey; $vbPublicKey)
BLOB TO DOCUMENT ("Update.txt";$vbEncrypted)
End if
End if
4. The encrypted file can then be sent to the recipient via the Internet. If a third person gets
hold of it, he or she will not be able to decrypt the message, even if he or she has the public
keys as the recipient’s private key will also be required.
5. Each recipient can decrypt the document by using his/her own private key and the sender’s
public key:
`Method DECRYPT_INFO_2
C_BLOB($vbEncrypted;$vbPublicKey;$vbPrivateKey)
C_TEXT($vtDecrypted)
C_TIME ($vhDocRef)
See Also
DECRYPT BLOB, GENERATE ENCRYPTION KEYPAIR.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DECRYPT BLOB command decrypts the content of the BLOB toDecrypt using the sender’s
public key sendPubKey and, optionally, the recipient’s private key recipPrivKey.
The BLOB containing the sender’s public key is passed in the sendPubKey parameter. This key
has been generated by the sender using the GENERATE ENCRYPTION KEYPAIR command and it
has to be sent to the recipient.
The BLOB containing the recipient’s private key can be passed in the optional parameter
recipPrivKey. In this case, the recipient has to generate a pair of encryption keys with the
GENERATE ENCRYPTION KEYPAIR command and has to send his/her public key to the sender.
The keypair-based encryption system guarantees that the message has been encrypted by the
sender only and it can be decrypted by the recipient only. For more information about the
keypair-based encryption system, refer to the routine ENCRYPT BLOB.
The command DECRYPT BLOB offers a checksum functionality in order to avoid any BLOB
content modification (deliberate or not). If the encrypted BLOB is damaged or modified, the
command will do nothing and an error will be returned.
Example
Refer to the examples given for the ENCRYPT BLOB command.
See Also
ENCRYPT BLOB, GENERATE ENCRYPTION KEYPAIR.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
True
False
Not
Example
This example sets a Boolean variable based on the value of a button. It returns True in
myBoolean if the myButton button was clicked and False if the button was not clicked. When a
button is clicked, the button variable is set to 1.
myBoolean:=(myButton=1)
See Also
False, Logical Operators, Not, True.
In addition, the following 4D commands return a Boolean result: Activated, After, Before,
Before selection, Before subselection, Caps lock down, Compiled application, Deactivated, During,
End selection, End subselection, In break, In footer, In header, In transaction, Is a list, Is a variable, Is
in set, Is user deleted, Locked, Macintosh command down, Macintosh control down, Macintosh
option down, Modified, Modified record, Nil, Outside call, Read only state, Semaphore, Shift down,
True, Undefined, User in group, Windows Alt down, Windows Ctrl down.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
True → Boolean
Description
True returns the Boolean value True.
Example
The following example sets the variable vbOptions to True:
vbOptions:=True
See Also
False, Not.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
False → Boolean
Description
False returns the Boolean value False.
Example
The following example sets the variable vbOptions to False:
vbOptions:=False
See Also
Not, True.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Not function returns the negation of boolean, changing True to False or False to True.
Example
This example first assigns True to a variable, then changes the variable value to False, and then
back to True.
vResult:=True ` vResult is set to True
vResult:=Not(vResult) ` vResult is set to False
vResult:=Not(vResult) ` vResult is set to True
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The APPEND TO CLIPBOARD command appends to the Clipboard the data contained in the
BLOB data under the data type specified in dataType.
WARNING: The value you pass in dataType is case sensitive, i.e., “abcd” is not equal to “ABCD.”
If the BLOB data is correctly appended to the Clipboard, the OK variable is set to 1. Otherwise
the OK variable is set to 0 and an error may be generated.
Usually, you will use the APPEND TO CLIPBOARD command to append multiple instances of
the same data to the Clipboard or to append data that is not of type TEXT or PICT. To append
new data to the Clipboard, you must first clear the Clipboard using the CLEAR CLIPBOARD
command.
However, note that if a BLOB actually contains some text or a picture, you can use the APPEND
TO CLIPBOARD command to append a text or a picture to the Clipboard.
C_LONGINT($1;$vlField;$vlFieldType)
C_POINTER($vpTable;$vpField)
C_STRING(255;$vsDocName)
C_TEXT($vtRecordData;$vtFieldData)
C_BLOB($vxRecordData)
` Clear the Clipboard (it will stay empty if there is no current record)
CLEAR CLIPBOARD
` Get a pointer to the table whose number is passed as parameter
$vpTable:=Table($1) ` If there is a current record for that table
If ((Record number($vpTable->)>=0) | (Is new record($vpTable->)))
` Initialize the text variable that will hold the text image of the record
$vtRecordData:=""
` For each field of the record:
For ($vlField;1;Count fields($1))
` Get the type of the field
GET FIELD PROPERTIES($1;$vlField;$vlFieldType)
` Get a pointer to the field
$vpField:=Field($1;$vlField)
` Depending on the type of the field, copy (or not) its data
` in the appropriate manner
Case of
: (($vlFieldType=Is Alpha field ) | ($vlFieldType=Is Text ))
$vtFieldData:=$vpField->
: (($vlFieldType=Is Real ) | ($vlFieldType=Is Integer ) | ($vlFieldType=Is LongInt )
| ($vlFieldType=Is Date ) | ($vlFieldType=Is Time ))
$vtFieldData:=String($vpField->)
: ($vlFieldType=Is Boolean )
$vtFieldData:=String(Num($vpField->);"Yes;;No")
Else
If you apply the method SET RECORD TO CLIPBOARD to the [Employees] table, the Clipboard
will contain the text image of the record, as shown, and also the whole image of the record.
See Also
CLEAR CLIPBOARD, SET PICTURE TO CLIPBOARD, SET TEXT TO CLIPBOARD.
System Variables
If the BLOB data is correctly appended to the clipboard, OK is set to 1; otherwise OK is set to 0
and an error may be generated.
Error Handling
If there is not enough memory to append the BLOB data to the clipboard, an error -108 is
generated.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
CLEAR CLIPBOARD
Description
The CLEAR CLIPBOARD command clears the Clipboard of its contents. If the Clipboard
contains multiple instances of the same data, all instances are cleared. After a call to CLEAR
CLIPBOARD, the Clipboard becomes empty.
You must call CLEAR CLIPBOARD once before appending new data to the Clipboard using the
command APPEND TO CLIPBOARD, because this latter command does not clear the Clipboard
before appending the new data.
Calling CLEAR CLIPBOARD once and then calling APPEND TO CLIPBOARD several times enables
you to Cut or Copy the same data under different formats.
On the other hand, the commands SET TEXT TO CLIPBOARD and SET PICTURE TO CLIPBOARD
automatically clear the Clipboard before appending the TEXT or PICT data to it.
Examples
1. The following code clears and then appends data to the clipboard:
See Also
APPEND TO CLIPBOARD.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET CLIPBOARD command returns into the BLOB field or into the variable data the data
present in the Clipboard and whose type you pass in dataType.
WARNING: The value you pass in dataType is case sensitive, i.e., “abcd” is not equal to “ABCD.”
If the data is correctly extracted from the clipboard, the command sets the OK variable to 1. If
the Clipboard is empty or does not contains any data of the specified type, the command
returns an empty BLOB, sets the OK variable to 0 and generates an error -102. If there is not
enough memory to extract the data from the clipboard,the command sets the OK variable to 0
and generates an error -108.
Example
The following object methods for two buttons copy from and paste data to the array asOptions
(pop-up menu, drop-downlist,...) located in a form:
See Also
APPEND TO CLIPBOARD, GET PICTURE FROM CLIPBOARD, Get text from clipboard.
System Variables
If the data is correctly extracted, OK is set to 1; otherwise OK is set to 0 and an error is
generated.
Error Handling
• If there is not enough memory to extract the data, an error -108 is generated.
• If there is no data of the requested type in the clipboard, an error -102 is generated.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
GET PICTURE FROM CLIPBOARD returns the picture present in the Clipboard into the picture
field or variable picture.
If the picture is correctly extracted from the Clipboard, the command sets the OK variable to
1. If the Clipboard is empty or does not contain a picture, the command returns an empty
picture, sets the OK variable to 0, and generates an error -102. If there is not enough memory
to extract the picture from the Clipboard, the command sets the OK variable to 0 and
generates an error -108.
Example
The following button’s object method assigns the picture present in the Clipboard (if any) to
the field [Employees]Photo:
See Also
GET CLIPBOARD, Get text from clipboard, Test clipboard.
System Variables
If the picture is correctly extracted, OK is set to 1; otherwise OK is set to 0 and an error is
generated.
Error Handling
• If there is not enough memory to extract the picture, an error -108 is generated.
• If there is no picture in the Clipboard, an error -102 is generated.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Function result String ← Returns the text (if any) present in the Clipboard
Description
Get text from clipboard returns the text present in the clipboard.
If the text is correctly extracted from the Clipboard, the command sets the OK variable to 1. If
the Clipboard is empty or does not contain any text, the command returns an empty string,
sets the OK variable to 0, and generates an error -102. If there is not enough memory to
extract the text from the Clipboard, the command sets the OK variable to 0 and generates an
error -108.
4th Dimension text fields and variables can contain up to 32,000 characters. If there are more
than 32,000 characters in the Clipboard, the result returned by Get text from clipboard will be
truncated when placed into the field or variable receiving the value. To handle very large
Clipboard text contents, first test the size of the data using the command Test clipboard. Then,
if the text exceeds 32,000 characters, use the command GET CLIPBOARD instead of Get text
from clipboard.
Example
The following example tests the for the presence of text in the Clipboard, then, depending on
the size of the data, extracts the text from the Clipboard as text or as a BLOB:
See Also
GET CLIPBOARD, GET PICTURE FROM CLIPBOARD, Test clipboard.
System Variables
If the text is correctly extracted, OK is set to 1; otherwise OK is set to 0 and an error is
generated.
Error Handling
• If there is not enough memory to extract the text, an error -108 is generated.
• If there is no text in the Clipboard, an error -102 is generated.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SET PICTURE TO CLIPBOARD clears the Clipboard and puts a copy of the picture you passed in
picture into the Clipboard.
After you have put a picture into the Clipboard, you can retrieve it using the command
GET PICTURE FROM CLIPBOARD or by calling GET CLIPBOARD ("PICT";...).
If the picture is correctly put in the Clipboard, the OK variable is set to 1. If there is not
enough memory to put a copy of the picture into the Clipboard, the OK variable is set to 0,
but no error is generated.
Example
Using a floating window, you display a form that contains the array asEmployeeName, which
lists the names of the employees from an [Employees] table. Each time you click on a name,
you want to copy the employee's picture to the Clipboard. In the object method for the array,
you write:
If (asEmployeeName#0)
QUERY ([Employees];[Employees]Last name=asEmployeeName{asEmployeeName})
If (Picture size ([Employees]Photo)>0)
SET PICTURE TO CLIPBOARD ([Employees]Photo) ` Copy the employee's photo
Else
CLEAR CLIPBOARD ` No photo or no record found
End if
End if
See Also
APPEND TO CLIPBOARD, GET PICTURE FROM CLIPBOARD.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SET TEXT TO CLIPBOARD clears the clipboard and then puts a copy of the text you passed in
text into the Clipboard.
After you have put some text into the Clipboard, you can retrieve it using the Get text from
clipboard command or by calling GET CLIPBOARD ("TEXT";...).
If the text is correctly put in the Clipboard, the OK variable is set to 1. If there is not enough
memory to put a copy of the text into the Clipboard, the OK variable is set to 0, but no error is
generated.
4th Dimension text expressions can contain up to 32,000 characters. To copy larger text
values, accumulate the text into a BLOB, call CLEAR CLIPBOARD, then call APPEND TO
CLIPBOARD ("TEXT";...).
Example
See the example for the APPEND TO CLIPBOARD command.
See Also
APPEND TO CLIPBOARD, Get text from clipboard.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Test clipboard command allows you to test if there is data of the type you passed in
dataType present in the Clipboard.
WARNING: The value you pass in dataType is case sensitive, i.e., “abcd” is not equal to “ABCD.”
If the Clipboard is empty or does not contain any data of the specified type, the command
returns an error -102 (see the table of predefined constants). If the Clipboard contains data of
the specified type, the command returns the size of this data, expressed in bytes.
After you have detected that the Clipboard contains data of the type in which you are
interested, you can extract that data from the Clipboard using one the following commands:
• If the Clipboard contains type TEXT data, you can obtain that data using the
Get text from clipboard command, which returns a text value, or the GET CLIPBOARD
command, which returns the text into a BLOB.
• If the Clipboard contains type PICT data, you can obtain that data using the
GET PICTURE FROM CLIPBOARD command, which returns the picture into a picture field or
variable, or the GET CLIPBOARD command, which returns the picture into a BLOB.
• For any other data type, use the GET CLIPBOARD command, which returns the data into a
BLOB.
2. Usually, applications cut and copy data of type TEXT or PICT into the Clipboard, because
most applications recognize two standard data types. However, an application can append to
the Clipboard several instances of the same data in different formats. For example, each time
you cut or copy a part of a spreadsheet, the spreadsheet application could append the data
under the hypothetical ‘SPSH’ format, as well as in SYLK and TEXT formats. The ‘SPSH’
instance would contain the data formatted using the application’s data structure. The SYLK
form would contain the same data, but using the SYLK format recognized by most of the other
spreadsheet programs. Finally, the TEXT format would contain the same data, without the
extra information included in the SYLK or the hypothetical ‘SPSH’ format. At this point, while
writing Cut/Copy/Paste routines between 4th Dimension and that hypothetical spreadsheet
application, assuming you know the description of the ‘SPSH’ format and that you are ready to
parse SYLK data, you could write something like:
Case of
` First, check whether the clipboard contains data
`from the hypothetical spreadsheet application
: (Test clipboard ('SPSH') > 0)
` ...
` Second, check whether the clipboard contains Sylk data
: (Test clipboard ('SYLK') > 0)
` ...
` Finally check whether the clipboard contains Text data
: (Test clipboard ('TEXT') > 0)
` ...
End case
In other words, you try to extract from the Clipboard the instance of the data that carries most
of the original information.
See Also
GET CLIPBOARD, GET PICTURE FROM CLIPBOARD, Get text from clipboard.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET CHANNEL command opens a serial port or a document. You can open only one serial
port or one document at a time with this command. To close an opened serial port, pass SET
CHANNEL (11).
Historical Note: This command was originally the first 4D command used for working with
serial ports and documents on disks. Since that time, new commands have been added. Today,
you will typically work with documents on disk using the commands Open document, Create
document and Append document. With these commands, you can read and write characters to
and from documents using SEND PACKET or RECEIVE PACKET (these commands work with SET
CHANNEL, too). However, if you want to use the commands SEND VARIABLE, RECEIVE VARIABLE,
SEND RECORD and RECEIVE RECORD, you must use SET CHANNEL to access the document on
disk.
The first form of the SET CHANNEL command opens a serial port, setting the protocol and
other port information. Data can be sent with SEND PACKET, SEND RECORD or SEND VARIABLE,
and received with RECEIVE BUFFER, RECEIVE PACKET, RECEIVE RECORD or RECEIVE VARIABLE.
Important: The value you pass in port must refer to an existing serial COM port recognized by
the operating system. For example, in order to be able to use the values 101, 103 and 125, the
serial ports COM1, COM3 and COM25 must have been set up correctly.
Examples
1. If you want to use the printer/COM2 port with no protocol, you can use one of the
following syntaxes:
3. If you want to use the COM 25 port with the RTS/CTS protocol, you need to use the
following syntax:
Tip: The various numeric values to be accumulated and passed in port and settings (but not
including the values for COM1...COM99) are available as predefined constants in the theme
Communications within the Design environment Explorer windows. For COM1...COM99, use
numeric literals.
The second form of the SET CHANNEL command allows you to create, open, and close a
document. Unlike the System documents commands, it can open only one document at a
time. The document can be read from or written to.
The operation parameter specifies the operation to be performed on the document specified by
document. The following table lists the values of operation and the resulting operation with
different values for document. The first column lists the allowed values for operation. The
second column lists the allowed values for document. The third column lists the resulting
operation.
For example, to display an Open File dialog box to open a text file, you would use the
following line:
Examples
See examples for the commands RECEIVE BUFFER, SET TIMEOUT and RECEIVE RECORD.
See Also
Append document, Create document, GET SERIAL PORT MAPPING, Open document, RECEIVE
BUFFER, RECEIVE PACKET, RECEIVE RECORD, RECEIVE VARIABLE, SEND PACKET, SEND RECORD,
SEND VARIABLE, SET TIMEOUT.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SET TIMEOUT specifies how much time a serial port command has to complete. If the serial
port command does not complete within the specified time, seconds, the serial port command
is canceled, an error -9990 is generated, and the OK system variable is set to 0. You can catch
the error with an error-handling method installed using ON ERR CALL.
Note that the time is the total time allowed for the command to execute, not the time
between characters received. To cancel a previous setting and stop monitoring serial port
communication, use a setting of 0 for seconds.
Example
The following example sets the serial port to receive data. It then sets a time-out. The data is
read with RECEIVE PACKET. If the data is not received in time, an error occurs:
SET CHANNEL (MacOS Serial Port; Speed 9600 + Data Bits 8 + Stop Bits One +
Parity None)
` Open Serial Port
SET TIMEOUT (10) ` Set the timeout for 10 seconds
ON ERR CALL ("CATCH COM ERRORS") ` Do not let the method being interrupted
RECEIVE PACKET (vtBuffer; Char (13)) ` Read until a carriage return is met
See Also
ON ERR CALL, RECEIVE BUFFER, RECEIVE PACKET, RECEIVE RECORD, RECEIVE VARIABLE.
Description
USE ASCII MAP has two forms. The first form loads the ASCII map named map from disk and
uses that ASCII map. If mapInOut is 0, the map is loaded as the output map. If mapInOut is 1,
the map is loaded as the input map.
The ASCII map must have been previously created using the Web/Options page of the 4D
Preferences. After an ASCII map is loaded, 4th Dimension uses the map during transfer of data
between the database and a document or a serial port. Transfer operations include the import
and export of text (ASCII), DIF, and SYLK files. An ASCII map also works on data transferred
with SEND PACKET, RECEIVE PACKET, and RECEIVE BUFFER. It has no effect on transfers of data
done with SEND RECORD, SEND VARIABLE, RECEIVE RECORD, and RECEIVE VARIABLE.
If you give an empty string for map, USE ASCII MAP displays a standard Open File dialog box so
that the user can specify an ASCII map document. Whenever you execute USE ASCII MAP, the
OK system variable is set to 1 if the map is successfully loaded, and to 0 if it is not.
The second form of USE ASCII MAP, with the asterisk (*) parameter instead of map, restores the
default ASCII map. If mapInOut is 0, the map is reset for output. If mapInOut is 1, the map is
reset for input. The default ASCII map has no translation between characters.
See Also
EXPORT DIF, EXPORT SYLK, EXPORT TEXT, IMPORT DIF, IMPORT SYLK, IMPORT TEXT, Mac to Win,
RECEIVE BUFFER, RECEIVE PACKET, SEND PACKET, Win to Mac.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET SERIAL PORT MAPPING command returns two arrays, numArray and nameArray,
containing the serial port numbers and the serial port names of the current machine.
This command is useful under Mac OS X, where the operating system dynamically allocates
the port number when using a USB serial adapter. You can address any extended serial port
using its name (static), regardless of its actual number.
Note: This command does not return meaningful values with standard ports. If you want
to address a standard port, you must pass its value (0 or 1) directly using the SET CHANNEL
command (former operation of 4D).
Example
This project method can be used to address the same serial port (without protocol),
regardless of the number that has been assigned to it:
ARRAY TEXT($arrPortNames;0)
ARRAY LONGINT($arrPortNums;0)
C_LONGINT($vPortNum;$vFinalPortNum)
`Find out the current numbers of the serial ports
GET SERIAL PORT MAPPING($arrPortNums;$arrPortNames)
$vPortNum:=Find in array($arrPortNames;vPortName)
` vPortName contains the name of the port to be used; it may come from
` a dialog box, a value stored in a field, etc.
If(arrPortNums{$vPortNum}=0)
$vFinalPortNum:=0 `special case under Mac OS X
Else
$vFinalPortNum:=arrPortNums{$vPortNum}+100
End if
`params contains the communication parameters
SET CHANNEL($vFinalPortNum;params)
... `Carry out the desired operations
SET CHANNEL(11) `Closing of port
See Also
SET CHANNEL.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SEND PACKET sends a packet to a serial port or to a document. If docRef is specified, the packet
is written to the document referenced by docRef. If docRef is not specified, the packet is
written to the serial port or document previously opened by the SET CHANNEL command. A
packet is just a piece of data, generally a string of characters.
Before you use SEND PACKET, you must open a serial port or a document with SET CHANNEL,
or open a document with one of the document commands.
When writing to a document, the first SEND PACKET begins writing at the beginning of the
document unless the document was opened with Append document. Until the document is
closed, each subsequent packet is appended to any previously sent packets.
Version 6 Note: This command is still useful for a document opened with SET CHANNEL. On
the other hand, for a document opened with Open document, Create document and Append
document, you can now use the new commands Get document position and SET DOCUMENT
POSITION to get and change the location in the document where the next writing (SEND
PACKET) or reading (RECEIVE PACKET) will occur.
Important: SEND PACKET writes Mac OS ASCII data on both Windows and Macintosh
platforms. Mac OS ASCII data uses eight bits. Standard ASCII uses only the lower seven bits.
Many devices do not use the eighth bit in the same way as does Windows/Macintosh. If the
string to be sent contains data that uses the eighth bit, be sure to create an ASCII map to
translate the ASCII characters, and execute USE ASCII MAP before using SEND PACKET. You can
also use the Mac to Win function (for more information, refer to the example for this
function). Protocols like XON/XOFF use some low ASCII codes to establish communication
between machines. Be careful to not send such ASCII codes, as this may interfere with the
protocol or even break communication.
See Also
Get document position, RECEIVE PACKET, SET DOCUMENT POSITION.
Description
RECEIVE PACKET reads characters from a serial port or from a document.
If docRef is specified, this command reads characters from a document opened using Open
document, Create document or Append document. If docRef is omitted, this command reads
characters from the serial port or the document opened using SET CHANNEL.
Whatever the source, the characters read are returned in receiveVar, which must be a Text or
String variable. Remember that String variables accept up to 255 characters and have a fixed
size whereas Text variables do not have a set size and can accept up to 32,000 characters.
To read a particular number of characters, pass this number in numChars. You can read up to
32,000 characters in a single call if the receiveVar variable is of the Text type. To specify the
maximum number of characters, you can pass the MAXTEXTLEN constant in numChars.
When reading a document, the first RECEIVE PACKET begins reading at the beginning of the
document. The reading of each subsequent packet begins at the character following the last
character read.
Note: This command is useful for document opened with SET CHANNEL. On the other hand,
for a document opened with Open document, Create document and Append document, you can
use the Get document position and SET DOCUMENT POSITION commands to get and change
the location in the document where the next writing (SEND PACKET) or reading (RECEIVE
PACKET) will occur.
When attempting to read past the end of a file, RECEIVE PACKET will return with the data read
up to that point and the variable OK will be set to 1. Then, the next RECEIVE PACKET will
return an empty string and set the OK variable to zero.
Note: When you use the RECEIVE PACKET command to read characters from a Windows
document and do not want to use ASCII maps to convert Windows characters into Mac OS
characters, you can use the Win to Mac function.
Examples
1. The following example reads 20 characters from a serial port into the variable getTwenty:
2. The following example reads data from the document referenced by the variable myDoc into
the variable vData. It reads until it encounters a carriage return:
3. The following example reads data from the document referenced by the variable myDoc into
the variable vData. It reads until it encounters the </TD> (end of table cell) HTML tag:
The spaces at the end of the data are stripped by the following method, called Strip:
For ($i; Length ($1); 1; -1) ` Loop from end of string to start
If ($1[[$i]] # " ") ` If it is not a space…
$i := -$i ` Force the loop to end
End if
End for
$0 := Delete string ($1; -$i; Length ($1)) ` Delete the spaces
See Also
Get document position, RECEIVE PACKET, SEND PACKET, SET DOCUMENT POSITION, SET
TIMEOUT.
Description
RECEIVE BUFFER reads the serial port that was previously opened with SET CHANNEL. The serial
port has a buffer that fills with characters until a command reads from the buffer. RECEIVE
BUFFER gets the characters from the serial buffer, put them into receiveVar then clears the
buffer. If there are no characters in the buffer, then receiveVar will contain nothing.
On Windows
The Windows serial port buffer is limited in size to 10 Kbytes. This means that the buffer can
overflow. When it is full and new characters are received, the new characters replace the oldest
characters. The old characters are lost; therefore, it is essential that the buffer is read quickly
when new characters are received.
On Mac OS
The Mac OS 9.x serial port buffer is limited in size to 10 Kbytes. Under Mac OS X, its capacity
is, in theory, unlimited (depending on the available memory). If the buffer is full and new
characters are received, the new characters replace the oldest characters. The old characters are
lost; therefore, it is essential that the buffer is read quickly when new characters are received.
Note: There are 4D plug-ins that enable you to increase the size of the serial buffer.
RECEIVE BUFFER is different from RECEIVE PACKET in that it takes whatever is in the buffer and
then immediately returns. RECEIVE PACKET waits until it finds a specific character or until a
given number of characters are in the buffer.
During the execution of RECEIVE BUFFER, the user can interrupt the reception by pressing Ctrl-
Alt-Shift (Windows) or Command-Option-Shift (Macintosh). This interruption generates an
error -9994 that you can catch with an error-handling method installed using ON ERR CALL.
At this point, any other process can read the interprocess <>vtBuffer to work with the data
coming from the serial port.
Note that access to the interprocess <>vtBuffer variable should be protected by a semaphore, so
that processes will not conflict. See the command Semaphore for more information.
See Also
ON ERR CALL, RECEIVE PACKET, Semaphore, SET CHANNEL, Variables.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SEND VARIABLE sends variable to the document or serial port previously opened by SET
CHANNEL. The variable is sent with a special internal format that can be read only by RECEIVE
VARIABLE. SEND VARIABLE sends the complete variable (including its type and value).
Notes
1. If you send a variable to a document using this command, the document must have been
opened using the SET CHANNEL command. You cannot use SEND VARIABLE with a document
opened with Open document, Append document or Create document.
2. This command does not support array variables. If you want to send and receive arrays from
a document or over a serial port, use the new BLOB commands introduced in version 6.
Example
See example for the command RECEIVE RECORD.
See Also
RECEIVE RECORD, RECEIVE VARIABLE, SEND RECORD, SET CHANNEL.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
RECEIVE VARIABLE receives variable, which was previously sent by SEND VARIABLE from the
document or serial port previously opened by SET CHANNEL.
In interpreted mode, if the variable does not exist prior to the call to RECEIVE VARIABLE, the
variable is created, typed and assigned according to what has been received. In compiled
mode, the variable must be of the same type as what is received. In both cases, the contents of
the variable are replaced with what is received.
Notes
1. If you receive a variable from a document using this command, the document must have
been opened using the SET CHANNEL command. You cannot use RECEIVE VARIABLE with a
document opened with Open document, Append document or Create document.
2. This command does not support array variables. If you want to send and receive arrays from
a document or over a serial port, use the new BLOB commands introduced in version 6.
3. During the execution of RECEIVE VARIABLE, the user can interrupt the reception by pressing
Ctrl-Alt-Shift (Windows) or Command-Option-Shift (Macintosh). This interruption generates
an error -9994 that you can catch with an error-handling method installed using ON ERR CALL.
Usually, you only need to handle the interruption of a reception while communicating over a
serial port.
Example
See example for the RECEIVE RECORD command.
See Also
ON ERR CALL, RECEIVE RECORD, SEND RECORD, SEND VARIABLE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SEND RECORD sends the current record of table to the serial port or document opened by the
SET CHANNEL command. The record is sent with a special internal format that can be read
only by RECEIVE RECORD. If no current record exists, SEND RECORD has no effect.
The complete record is sent. This means that all subrecords, pictures and BLOBs stored in the
record are also sent.
Important: When records are being sent and received using SEND RECORD and RECEIVE
RECORD, the source table structure and the destination table structure must be compatible. If
they are not, 4D will convert values according to the table definitions when RECEIVE RECORD
is executed.
Note: If you send a record to a document using this command, the document must have been
opened using the SET CHANNEL command. You cannot use SEND RECORD with a document
opened with Open document, Append document or Create document.
Example
See example for the command RECEIVE RECORD.
See Also
RECEIVE RECORD, RECEIVE VARIABLE, SEND VARIABLE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
RECEIVE RECORD receives a record into table from the serial port or document opened by the
SET CHANNEL command. The record must have been sent with SEND RECORD. When you
execute RECEIVE RECORD, a new record is automatically created for table. If the record is
received correctly, you must then use SAVE RECORD to save the new record.
The complete record is received. This means that all subrecords, pictures and BLOBs stored in
the record are also received.
Important: When records are being sent and received using SEND RECORD and RECEIVE
RECORD, the source table structure and the destination table structure must be compatible. If
they are not, 4D will convert values according to the table definitions when RECEIVE RECORD
is executed.
Notes
1. If you receive a record from a document using this command, the document must have
been opened using the SET CHANNEL command. You cannot use RECEIVE RECORD with a
document opened with Open document, Append document or Create document.
2. During the execution of RECEIVE RECORD, the user can interrupt the reception by pressing
Ctrl-Alt-Shift (Windows) or Command-Option-Shift (Macintosh). This interruption generates
an error -9994 that you can catch with an error-handling method installed using ON ERR CALL.
Usually, you only need to handle the interruption of a reception while communicating over a
serial port.
For instance, the documentation you are currently reading has been created using 4D and
4D Write. Because several writers in different locations wordwide were working on it, we
needed a simple way to exchange data between the different databases. Here is a simplified
view of the database structure:
The table [Commands] contains the description of each command or topic. The tables [CM US
Params] and [CM FR Params] respectivily contain the parameter list for each command in
English and in French. The table [CM See Also] contains the commands listed as reference (See
Also section) for each command. Exchanging documentation between databases therefore
consists in sending the [Commands] records and their related records. To do so, we use SEND
RECORD and RECEIVE RECORD. In addition, we use SEND VARIABLE and RECEIVE VARIABLE in
order to mark the import/export document with tags.
Note that we do not test the OK variable while receiving the data nor try to catch the errors.
However, because we stored variables in the document that describes the document itself, if
these variables, once received, made sense, the probability for an error is very low. If for
instance a user opens a wrong document, the first test stops the operation right away.
See Also
RECEIVE VARIABLE, SEND RECORD, SEND VARIABLE.
The integrated compiler of 4th Dimension translates your database applications into assembly
level instructions. The advantages of the compiler are:
• Code checking: Your database application is scanned for the consistency of code. Both
logical and syntactical conflicts are detected.
• Protection: once your database is compiled, you can delete the interpreted code, Then, the
compiled database is functionally identical to the original, except that the structure and
procedures cannot be viewed or modified, deliberately or inadvertently.
For a description of the operation of the 4th Dimension compiler, refer to the Design Reference
manual.
The commands in this theme relate to the use of the compiler. They enable you to normalize
data types throughout your database. The IDLE command is specifically used in compiled
databases.
These commands, except IDLE, declare variables and cast them as a specified data type.
Declaring variables resolves ambiguities concerning a variable’s data type. If a variable is not
declared with one of these commands, the compiler attempts to determine a variable’s data
type. The data type of a variable used in a form is often difficult for the compiler to determine.
Therefore, it is especially important that you use these commands to declare a variable used in
a form.
Note: To save time, you can use the option for generating and updating typing methods
(called “Compiler methods”) found in the compiler window. This option automatically creates
typing methods that take stock of and assign a type to all of the variables used in the database.
• Variable indirection as used in 4th Dimension version 1 is not allowed. You cannot use
alpha indirection, with the section symbol (§), to indirectly reference variables. Nor can you
use numeric indirection, with the curly braces ({...}), for this purpose. Curly braces can only be
used when accessing specific elements of an array that has been declared. However, you can
use parameter indirection.
• You can’t change the data type of any variable or array.
• You can’t change a one-dimensional array to a two-dimensional array, or change a two-
dimensional array to a one-dimensional array.
• You can’t change the length of string variables or of elements in string arrays.
• Although the compiler will type the variable for you, you should specify the data type of a
variable by using compiler directives where the data type is ambiguous, such as in a form.
• Another reason to explicitly type your variables is to optimize your code. This rule applies
especially to any variable used as a counter. Use variables of a long integer data type for
maximum performance.
• To clear a variable (initialize it to null), use CLEAR VARIABLE with the name of the variable.
Do not use a string to represent the name of the variable in the CLEAR VARIABLE command.
• The Undefined function will always return False. Variables are always defined.
• Numeric operations on long integer and integer variables are usually much faster than
operations on the default numeric type (real).
` ...
3. In the following example, the project method Capitalize accepts a string parameter and
returns a string result:
` Capitalize Project Method
` Capitalize ( String ) -> String
` Capitalize ( Source string ) -> Capitalized string
C_STRING(255;$0;$1)
$0:=Uppercase(Substring($1;1;1))+Lowercase(Substring($1;2))
C_TIME ($1)
C_TEXT (${2})
C_LONGINT ($vlPacket)
See Also
C_BLOB, C_BOOLEAN, C_DATE, C_GRAPH, C_INTEGER, C_LONGINT, C_PICTURE, C_POINTER,
C_REAL, C_STRING, C_TEXT, C_TIME, IDLE.
For more information about this point, refer to the Variables section. Process and
interprocess variables are structurally the same for the compiler.
Since the compiler cannot determine the process in which the variable will be used, process
variables should be used with more care than interprocess variables. All process variables
are systematically duplicated when a new process begins. A process variable can have a
different value in each process, but it has the same type for the entire database.
Variable types
All variables have a type. As described in the Data Types section, there are 12 different types
of variables:
Boolean
Fixed string
Date
Integer
Longint
Graph
Time
Picture
Number (or Real)
Pointer
Text
BLOB
If the compiler comes across the same variable name and two different data types, it has no
reason to favor any particular one. In other words, in order to type an object and give it a
memory address, the compiler must know the precise identity of that object (i.e., its name
and its data type). The compiler determines its size from the data type. For every compiled
database, the compiler creates a map that lists, for each variable, its name (or identifier), its
location (or memory address), and the space it occupies (indicated by its data type). This
map is called the symbol table. An option in the Preferences lets you choose whether to
generate this table in the form of a file during compilation.
This map is also used for the automatic generation of compiler methods.
Typing variables
The compiler must respect the identification criteria of the variables.
There are two possibilities:
• If the variables are not typed, the compiler can do it for you automatically. Whenever
possible––as long as there is no ambiguity––the compiler determines a variable's type from
the way it is used. For example, if you write:
V1 := True
The compiler is also capable of establishing the data type of a variable in less
straightforward situations:
V3:= V1 `V3 is of the same type as V1
V4:= 2*V2 `V4 is of the same type as V2
When the compiler determines the data type by inference, unless indicated otherwise in
the Preferences, it never assigns the limiting data types: Integer, Longint or String. The
default type assigned by the compiler is always the widest possible. For example, if you
write:
Number:=4
the compiler assigns the Real data type to Number, even though 4 happens to be an integer.
In other words, the compiler does not rule out the possibility that, under other
circumstances, the variable's value might be 4.5.
If it is appropriate to type a variable as Integer, Longint or String, you can do so using a
compiler directive. It is to your advantage to do so, because these data types occupy less
memory and performing operations on them is faster.
If you have already typed your variables and are sure that your typing is coherent and
complete, you may explicitly ask the compiler not to redo this work, using the compilation
Preferences. In case your typing was not complete and exhaustive, at the time of
compilation, the compiler will return errors requesting you to make the necessary
modifications.
• The compiler directive commands enable you to explicitly declare the variables used in
your databases.
They are used in the following manner:
C_BOOLEAN(Var)
Through such directives, you inform the compiler to create a variable Var that will be a
Boolean.
Whenever an application includes compiler directives, the compiler detects them and thus
avoids guesswork.
A compiler directive has priority over deductions made from assignments or use.
Variables declared with the compiler directive C_INTEGER are actually the same as those
declared by the directive C_LONGINT. They are, in fact, long integers between –2147483648
and +2147483647.
in method A,
Variable:=True
in method B,
Variable:="The moon is green"
- Pointers
A pointer cannot be expected to return a data type other than its own.
Consider the following sequence:
Var1:=5.2 (1)
Pointer:=->Var1 (2)
Var2:=Pointer-> (3)
Although (2) defines the type of variable pointed to by Pointer, the type of Var2 is not
determined. During compilation, the compiler can recognize a pointer, but it has no way of
knowing what type of variable it is pointing to. Therefore it cannot deduce the data type of
Var2. A compiler directive is needed, for example C_REAL(Var2).
- Multi-syntax commands
When you use a variable associated with the function Year of, the variable can only be of
the data type Date, considering the nature of this function. However, things are not always
so simple. Here is an example:
The GET FIELD PROPERTIES command accepts two syntaxes:
GET FIELD PROPERTIES(tableNo;fieldNo;type;length;index)
GET FIELD PROPERTIES(fieldPointer;type;length;index)
When you use a multi-syntax command, the compiler cannot guess which syntax and
parameters you have selected. You must use compiler directives to type variables passed to
the command, if they are not typed according to their use elsewhere in the database.
Optimizing code
You can speed up your methods by using compiler directives. For more details on this
subject, refer to the Optimization Hints section. To give a simple example, suppose you need
to increment a counter using a local variable. If you do not declare the variable, the
compiler assumes that is a Real. If you declare it as a Longint, the compiled database will
perform more efficiently. On a PC, for instance, a Real takes 8 bytes, but if you type the
counter as a Longint, it only uses 4 bytes. Incrementing an 8-byte counter obviously takes
longer than incrementing a 4-byte one.
Compiler directives can be handled in two different ways, depending on whether or not
you want the compiler to type your variables.
Particular parameters
• Parameters received by database methods
If these parameters have not been explicitly declared, they are typed by the compiler.
Nevertheless, if you declare them, the declaration must be done inside the database
methods.
This parameter declaration cannot be written in a Compiler method.
Example: On Web Connection Database Method receives six parameters, $1 to $6, of the
data type Text. At the beginning of the database method, you must write:
C_TEXT($1;$2;$3;$4;$5;$6)
• Triggers
The $0 parameter (Longint), which is the result of a trigger, is typed by the compiler if the
parameter has not been explicitly declared. Nevertheless, if you want to declare it, you
must do so in the trigger itself.
This parameter declaration cannot be written in a Compiler method.
Note: The compiler does not initialize the $0 parameter. So, as soon as you use the On Drag
Over form event, you must initialize $0. For example:
C_LONGINT($0)
If (Form event=On Drag Over)
$0:=0
...
If ($DataType=Is Picture)
$0:=-1
End if
...
End if
Since C_STRING types fixed-length strings, you specify the maximum length of such
strings. In a compiled database, you must specify the length of the string with a constant
rather than with a variable.
In an interpreted database, the following sequence is acceptable:
TheLength:=15
C_STRING(TheLength;TheString)
4th Dimension interprets TheLength, then replaces TheLength with its value in the
C_STRING compiler directive.
However, the compiler uses this command when typing variables with no specific
assignment in mind. Thus, it is not in a position to know that TheLength equals 15. Not
knowing the string's length, the compiler cannot keep a space for it in the symbol table.
Therefore, with compilation in mind, use a constant to specify the length of the declared
character string. For example, use a statement such as this:
C_STRING(15;TheString)
The same rule applies to declaring fixed string arrays, which are typed with the command:
ARRAY STRING(length;arrayName;size)
The parameter that indicates string lengths in the array must be a constant.
Note: The syntax of this command allows you to declare several variables of the same
length in a single line. If you want to declare several strings of different lengths, do so on
separate lines.
The compiler does not regard it as a data type conflict that will prevent compilation;
instead, the compiler simply rounds off to the closest integer value (3 instead of 2.5).
Similarly, if you declare a string that is shorter than the one you are dealing with, the
compiler will only take the number of characters declared in the directives. Therefore, in
the following sequence:
C_STRING(10;MyString)
MyString:="It is a beautiful day"
the compiler takes the first ten characters of the constant, i.e. “It is a be”.
See Also
Error messages, Optimization Hints, Syntax Details, Typing Guide.
This section describes the main causes of typing conflicts on variables, as well as ways to
avoid them.
Using variables of different data types in one expression creates inconsistencies. The
compiler points out incompatibilities. Here is a simple example:
vBool:=True `The compiler infers that vBoolean is data type Boolean
C_INTEGER(<>vInteger) `Declaration of an Integer by a compiler directive
<>vInteger:=3 `Command compatible with the compiler directive
Var:= <>vInteger+vBool `Operation containing variables with incompatible data types
In this example, you create a type conflict in the third line. The solution consists in
controlling the behavior of the variable. In some cases, you must create an intermediate
variable that uses a different name. In other cases, such as this, your method can be
structured differently:
IdentNo:=Num(Request("Identification Number")) `IdentNo is data type Real
If(Ok=1)
QUERY([Contacts]Id=IdentNo)
End if
Keep in mind that a data type conflict can arise concerning the use of C_STRING if you
modify the maximum string length. Thus, if you write:
C_STRING(5;MyString)
MyString:="Hello"
C_STRING(7;MyString)
MyString:="Flowers"
the compiler identifies a conflict because it must provide an adequately-sized location
when declaring String variables.
The solution is to use a compiler directive that gives the maximum length, since, by
default, the compiler will accept a shorter length. You can write:
C_STRING(7;String)
String:="Flowers"
String:="Hello"
Conflicts in arrays
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Conflicts concerning an array are never size-related. As in uncompiled databases, arrays are
managed dynamically. The size of an array can vary throughout methods, and you do not
have to declare a maximum size for an array.
Therefore, you can size an array to null, add or remove elements, or delete the contents.
You should follow these guidelines when writing a database intended for compilation:
• Do not change data types of array elements,
• Do not change the number of dimensions of an array,
• For a String array, do not change character-string length.
Note: A two-dimensional array is, in fact, a set of several one-dimensional arrays. For more
information, refer to the Two-dimensional Arrays section.
Implicit retyping
When using commands such as COPY ARRAY, LIST TO ARRAY, ARRAY TO LIST, SELECTION TO
ARRAY, SELECTION RANGE TO ARRAY, ARRAY TO SELECTION, or DISTINCT VALUES, you may
change, voluntarily or not, the data types of elements, the number of dimensions, or, in a
String array, the string length. You will thus find yourself in one of the three situations
previously mentioned.
The compiler generates an error message; the required correction is usually quite obvious.
Examples of implicit array retyping are provided in the Syntax Details section.
Local arrays
If you want to compile a database that uses local arrays (arrays only visible by the methods
that created them), you must explicitly declare them in 4th Dimension before using them.
Explicitly declaring an array means using a command of the type ARRAY REAL, ARRAY
INTEGER, etc.
For example, if a method creates a local integer array of 10 elements, you should have the
following line in your method:
ARRAY INTEGER($MyArray;10)
Variables created in a form (e.g., buttons, drop-down list boxes, and so forth) are always
process or interprocess variables.
In an interpreted database, the data type of such variables is not important. However, in
compiled applications, it may have to be taken into consideration. The rules are,
nevertheless, quite clear:
• You can type form variables using compiler directives, or
• The compiler assigns it a default type that can be set in the compilation Preferences (see
the Design Reference manual).
Note: The Ruler, Dial and Thermometer form variables are always typed as Reals, even if
you choose Long integer as the Default Button Type in the Preferences.
For one of these variables, the only data type conflict that could arise would be if the name
of a variable were identical to that of another one located elsewhere in the database. In this
case, rename the second variable.
Graph variable
A graph area is automatically data type Graph (Longint). This variable never creates a data
type conflict. For a Graph type variable, the only possible data type conflict that could arise
would be if the name of a variable were identical to that of another one located elsewhere
in the database. In this case, rename the second variable.
• Simple variables
Their default data type is Text. When used in methods or object methods, they are assigned
the data type selected by you. There is no danger of conflict other than one resulting from
assigning the same name to another variable.
• Display variables
Some variables are used to display arrays in forms. If default values have been entered in
the Form editor, you must explicitly declare the corresponding variables using the Array
Declaration commands (ARRAY STRING, ARRAY TEXT...).
Pointers
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
When you use pointers in your database, you take advantage of a powerful and versatile
4th Dimension tool. The compiler preserves all the benefits of pointers.
A pointer can point to variables of different data types. Do not create a conflict by
assigning different data types to a variable. Be careful not to change the data type of a
variable to which a pointer refers.
Here is an example of this problem:
Variable:=5.3
Pointer:=-> Variable
Pointer->:=6.4
Pointer->:=False
If you need to use pointers for different purposes in the same method, make sure that your
pointers are defined:
Variable:=5.3
Pointer:=-> Variable
Pointer->:=6.4
Bool:=True
Pointer:=->Bool
Pointer->:=False
A pointer is always defined in relation to the object to which it refers. That is why the
compiler cannot detect data type conflicts created by pointers. In case of a conflict, you will
get no error message while you are in the typing phase or in the compilation phase.
This does not mean that the compiler has no way to detect conflicts involving pointers.
The compiler can verify your use of pointers when you check the Range Checking option in
the compilation Preferences (see the Design Reference manual).
Plug-in Commands
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
General points
During compilation, the compiler analyzes the definitions of the plug-in commands used
in the database, i.e. the number and type of parameters of these commands. There is no
danger of confusion at the typing level if your calls are consistent with the declaration of
the method.
Make sure that your plug-ins are installed in the PlugIns folder, in one of the locations
authorized by 4th Dimension: next to the database structure file or next to the executable
application (Windows) / in the software package (Mac OS). For compatibility reasons, it is
still possible to use the Win4DX or Mac4DX folder next to the structure file. For more
information, refer to the Installation Guide of 4th Dimension.
The compiler does not duplicate these files, but analyzes them to determine the proper
declaration of their routines.
If your plug-ins are located elsewhere, the compiler will ask you to locate them during
typing, via an Open file dialog box.
For the compiler to take these parameters into account, you must make sure that they have
been typed, either by a compiler directive, or by their usage in the method. If they have
been used procedurally, the usage has to be explicit enough to be able to deduce the type
clearly.
4D components
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The handling of local variables follows all the rules that have already been stated. As with
all other variables, their data types cannot be altered while the method executes. In this
section, we examine two instances that could lead to data type conflicts:
• When you actually require retyping. The use of pointers helps avoid data type conflicts.
• When you need to address parameters by indirection.
In the above method, the data type of $0 changes according to the value of $1; therefore, it
is not compatible with the compiler.
$Size:=Size of array($1->)
$Type:=Type($1->)
VarNum:=0
Case of
:($Type=Real array)
VarNum:=8+($Size*10) ` VarNum is a Real
:($Type=Integer array)
VarNum:=8+($Size*2)
:($Type=LongInt array)
VarNum:=8+($Size*4)
:($Type=Date array)
VarNum:=8+($Size*6)
:($Type=Text array)
VarText:=String(8+($Size*4))+("+Sum of text lengths")
:($Type=Picture array)
VarText:=String(8+($Size*4))+("+Sum of picture sizes")
:($Type=Pointer array)
VarNum:=8+($Size*16)
:($Type=Boolean array)
VarNum:=8+($Size/8)
End case
If (VarNum#0)
$0:=->VarNum
Else
$0:=->VarText
End if
Parameter indirection
The compiler manages the power and versatility of parameter indirection. In interpreted
mode, 4th Dimension gives you a free hand with numbers and data types of parameters.
You retain this freedom in compiled mode, provided that you do not introduce data type
conflicts and that you do not use more parameters than you passed in the calling method.
To prevent possible conflicts, parameters addressed by indirection must all be of the same
data type.
This indirection is best managed if you respect the following convention: if only some of
the parameters are addressed by indirection, they should be passed after the others.
Within the method, an indirection address is formatted: ${$i}, where $i is a numeric
variable. ${$i} is called a generic parameter.
In this case, the calling method will get the string “182.70”, which is the sum of the
numbers, formatted as specified. The function's parameters must be passed in the correct
order: first the format and then the values.
As with other local variables, it is not necessary to declare generic parameters by compiler
directive. When required (in cases of ambiguity or for optimization), it is done using the
following syntax:
C_INTEGER(${4})
This command means that all parameters starting from the fourth (included) will be
addressed by indirection and will be of the data type Integer. $1, $2 and $3 can be of any
data type. However, if you use $2 by indirection, the data type used will be the generic
type. Thus, it will be of the data type Integer, even if for you it was, for instance, of the data
type Real.
Note: The compiler uses this command in the typing phase. The number in the declaration
has to be a constant and not a variable.
Some 4th Dimension variables and constants are assigned a data type and an identity by
the compiler. Therefore, you cannot create a new variable, method, function or plug-in
command using any of these variables or constant names. You can test their values and use
them as you do in interpreted mode.
4D predefined constants
A complete list of the predefined constants in 4th Dimension can be found in this manual.
4D constants are also displayed in the Explorer, in Design mode.
See Also
Error messages, Optimization Hints, Syntax Details, Using Compiler Directives.
The compiler expects that the usual syntactic rules for 4th Dimension commands are
followed. It does not require any special modifications for databases that will be compiled.
Strings
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Ascii (character)
For commands operating on strings, only the Ascii function requires special attention. In
interpreted mode, you can pass either a non-empty string or an empty string to this
function.
In compiled mode, you cannot pass an empty string.
If you pass an empty string, and if the argument passed to Ascii is a variable, the compiler
will not be able to detect an error in compilation.
Communications
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
SEND VARIABLE(variable)
RECEIVE VARIABLE(variable)
These two commands are used for writing and receiving variables sent to disk. Variables are
passed as parameters to these commands.
The parameter you pass must always be of the same data type. Suppose you want to send a
list of variables to a file. To eliminate the risk of changing data types inadvertently, we
recommend that you specify the data type of the variables being sent at the head of the list.
This way, when you receive these variables, you will always begin by getting an indicator.
Then, when you call RECEIVE VARIABLE, the transfer is managed by a Case of statement.
Structure access
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Documents
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Keep in mind that the document references returned by the Open document, Append
document and Create document functions are of the data type Time.
Mod (value;divider)
The expression “25 modulo 3” can be written in two different ways in 4th Dimension:
Variable:=Mod(25;3)
or
Variable:=25%3
The compiler sees a difference between the two: Mod applies to all numerics, while the
operator % applies only to Integers and Long Integers. If the operand of the % operator
exceeds the range of the Long Integer data type, the returned result is likely to be wrong.
Exceptions
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
IDLE
ON EVENT CALL (Method{; ProcessName})
ABORT
ON EVENT CALL
The IDLE command has been added to 4th Dimension language to manage exceptions. This
command should be used whenever you use the ON EVENT CALL command.
On the other hand, when 4th Dimension is waiting passively for an event––for example, in
a waiting loop––it is clear that there will be no call.
`Wait Method
<>vTest:=False
ON EVENT CALL("MouseClick")
While(<>vTest=False)
`Event's waiting loop
End while
ON EVENT CALL("")
ABORT
Use this command only in error-handling project methods. It works exactly as it does in
4th Dimension, except in a method that has been called by one of the following
commands: EXECUTE, APPLY TO SELECTION and APPLY TO SUBSELECTION. Try to avoid this
situation.
Arrays
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Seven 4th Dimension commands are used by the compiler to determine the data type of an
array. They are:
COPY ARRAY(source;destination)
SELECTION TO ARRAY(field;array)
ARRAY TO SELECTION(array;field)
SELECTION RANGE TO ARRAY(start;end;field;array)
LIST TO ARRAY(list;array{; itemRefs})
ARRAY TO LIST(array;list{; itemRefs})
DISTINCT VALUES(field;array)
COPY ARRAY
The COPY ARRAY command accepts two array type parameters. If one of the array
parameters is not declared elsewhere, the compiler determines the data type of the
undeclared array from the data type of the declared one.
This deduction is performed in the two following cases:
• The array typed is the first parameter. The compiler assigns the data type of the first array
to the second array.
• The declared array is the second parameter. Here, the compiler assigns the data type of
the second array to the first array.
Since the compiler is strict about data types, COPY ARRAY can be performed only from an
array of a certain data type to an array of the same type.
Consequently, if you want to copy an array of elements whose data types are similar, i.e.,
Integers, Long Integers and Reals, or Texts and Strings, or Strings with different lengths,
you have to copy the elements one by one.
Remember that you cannot change the number of dimensions of an array during the
process. If you copy a one-dimensional array into a two-dimensional array, the compiler
generates an error message.
If the array has been declared, make sure that the field is of the same data type. Although
Integer, Longint and Real are similar types, they are not equivalent.
On the other hand, in the case of Text and String data types, you have a little more
latitude. By default, if an array was not previously declared and you apply a command that
includes a String type field as a parameter, the default data type assigned to the array is
Text. If the array was previously declared as String or Text, these commands will follow
your directives.
The same is true for Text type fields––your directives have priority.
Remember that the SELECTION TO ARRAY, SELECTION RANGE TO ARRAY, ARRAY TO
SELECTION and DISTINCT VALUES commands can only be used with a one-dimensional
array.
Local arrays
If your database uses local arrays (arrays recognized only in the method in which they were
created), it is necessary to declare them explicitly in 4th Dimension before using them.
To declare a local array, use one of the array commands such as ARRAY REAL, ARRAY
INTEGER, etc.
For example, if a method creates a local Integer array with 10 elements, you need to declare
the array before using it. Use the command:
ARRAY INTEGER($MyArray;10)
Language
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Get pointer(varName)
Type (object)
EXECUTE(statement)
TRACE
NO TRACE
Get pointer
Get pointer is a function that returns a pointer to the parameter that you passed to it.
Suppose you want to initialize an array of pointers. Each element in that array points to a
given variable. Suppose there are twelve such variables named V1, V2, …V12. You could
write:
ARRAY POINTER(Arr;12)
Arr{1}:=->V1
Arr{2}:=->V2
…
Arr{12}:=->V12
At the end of this operation, you get an array of pointers where each element points to a
variable Vi.
These two sequences can be compiled. However, if the variables V1 to V12 are not used
explicitly elsewhere in the database, the compiler cannot type them. Therefore, they must
be used or declared explicitly elsewhere.
Such explicit declaration may be performed in two ways:
• By declaring V1, V2, …V12 through a compiler directive:
C_LONGINT(V1;V2;V3;V4;V5;V6;V7;V8;V9;V10;V11;V12)
• By assigning these variables in a method:
V1:=0
V2:=0
…
V12:=0
Type (object)
Since each variable in a compiled database has only one data type, this function may seem
to be of no use. However, it can be useful when you work with pointers. For example, you
may need to know the data type of the variable to which a pointer refers; due to the
flexibility of pointers, one cannot always be sure to what object it points.
EXECUTE
This command offers benefits in interpreted mode that are not carried over to compiled
mode.
In compiled mode, a method name passed as a parameter to this command is interpreted.
Therefore, you miss some of the advantages provided by the compiler, and your parameter's
syntax cannot be checked.
Moreover, you cannot pass local variables as parameters to it.
EXECUTE can be replaced by a series of statements. Two examples are given below.
The EXECUTE command can always be replaced. Since the method to be executed is chosen
from the list of the database's project methods or the 4th Dimension commands, there is a
finite number of methods. Consequently, it is always possible to replace EXECUTE with
either Case of or with another command. Furthermore, your code will execute faster.
TRACE, NO TRACE
These two commands are used in the debugging process. They serve no purpose in a
compiled database. However, you can keep them in your methods; they will simply be
ignored by the compiler.
Variables
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Undefined(variable)
SAVE VARIABLES(document;variable1{; variable2…})
LOAD VARIABLES(document;variable1{; variable2…})
CLEAR VARIABLE(variable)
Undefined
Considering the typing process carried out by the compiler, a variable can never be
undefined in compiled mode. In fact, all the variables have been defined by the time
compilation has been completed. The Undefined function therefore always returns False,
whatever parameter it is passed.
Note: To know if your application is running in compiled mode, call the Compiled
application command.
CLEAR VARIABLE
This routine uses two different syntaxes in interpreted mode:
CLEAR VARIABLE(variable)
CLEAR VARIABLE("a")
In compiled mode, the first syntax of CLEAR VARIABLE(variable) reinitializes the variable (set
to null for a numeric; empty string for a character string or a text, etc.), since no variable
can be undefined in compiled mode.
Consequently, CLEAR VARIABLE does not free any memory in compiled mode, except in four
cases: Text, Picture, BLOB and Array type variables.
For an array, CLEAR VARIABLE has the same effect as a new array declaration where the size
is set to null.
For an array MyArray whose elements are of the Integer type, CLEAR VARIABLE(MyArray) has
the same effect as one of the following expressions:
ARRAY INTEGER(MyArray;0)
`if it as a one-dimensional array
ARRAY INTEGER(MyArray;0;0)
`if it is a two-dimensional array
The second syntax, CLEAR VARIABLE("a"), is incompatible with the compiler, since compilers
access variables by address, not by name.
The following commands have one common feature: they accept an optional first
parameter [Table], and the second parameter can be a pointer.
ADD TO SET LOAD SET
APPLY TO SELECTION LOCKED ATTRIBUTES
COPY NAMED SELECTION ORDER BY
CREATE EMPTY SET ORDER BY FORMULA
CREATE SET OUTPUT FORM
CUT NAMED SELECTION PAGE SETUP
DIALOG Print form
EXPORT DIF PRINT LABEL
EXPORT SYLK QR REPORT
EXPORT TEXT QUERY
GOTO RECORD QUERY BY FORMULA
GOTO SELECTED RECORD QUERY SELECTION
GRAPH TABLE QUERY SELECTION BY FORMULA
IMPORT DIF REDUCE SELECTION
IMPORT SYLK RELATE MANY
IMPORT TEXT REMOVE FROM SET
INPUT FORM
In compiled mode, it is easy to return the optional [Table] parameter. However, when the
first parameter passed to one of these commands is a pointer, the compiler does not know
to what the pointer is referring; the compiler treats it as a table pointer.
If you create your own 4DK# resources (constants), make sure that numerics are declared as
Longints (L) or Reals (R) and character strings as Strings (S). Any other type will generate a
warning.
See Also
Error messages, Optimization Hints, Typing Guide, Using Compiler Directives.
Certain programming techniques may make your code less readable both for yourself or
another person at a later time. Because of this, we encourage you to comment your
methods with a lot of detail. In fact, while excessive comments have a tendency to slow
down interpreted databases, they have absolutely no influence on the execution time in a
compiled database.
Compiler directives can help you speed up your code considerably. When typing variables
on the basis of their use, the compiler uses the data type with the largest scope possible so
as not to penalize you. For example, if you do not type the variable defined by the
statement: Var:= 5, the compiler will type it as Real, even if it could be declared an Integer.
Numeric Variables
The compiler gives numeric variables (not typed by compiler directives) the default data
type Real if the Preferences are not set to anything else. But calculations performed on a
Real are slower than on a Longint. If you know that a numeric variable will always be an
integer, it is to your advantage to declare it through the compiler directives C_INTEGER or
C_LONGINT.
For example, it is good practice to declare your loop counters as Integers.
Here is a simple example of a function that returns a random value with a given range:
$0:=Mod(Random;($2-$1+1))+$1
It will always return an integer. Written this way, the compiler will type $0 as Real rather
than Integer or Longint. It is preferable, therefore, to include a compiler directive in the
method:
C_LONGINT($0)
$0:=Mod(Random;($2-$1+1))+$1
The parameter returned by the method will take less space in memory and will be much
faster.
Note: Be careful with the computation mode in 4th Dimension. In compiled mode, it is
not the data type of the variable that receives the calculation which determines the
computation mode, but rather the data types of the operands.
• In the following example, the calculation is based on long integers:
C_REAL($var3)
C_LONGINT($var1;$var2)
$var1:=2147483647
$var2:=1
$var3:=$var1+$var2
$var3 is equal to –2147483648 in both compiled mode and interpreted mode.
• However, in this example:
C_REAL($var3)
C_LONGINT($var1)
$var1:=2147483647
$var3:=$var1+1
for optimization reasons, the compiler considers the value 1 as an integer. In compiled
mode, $var3 is equal to –2147483648 because the calculation is based on Longints. In
interpreted mode, $var3 is equal to 2147483648 because the calculation is based on Reals.
If you want to test the value of a character, make the comparison on its Ascii value rather
than on the character itself. The regular character comparison procedure considers all of
the character's alternatives, such as diacritical marks.
Various observations
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Two-dimensional arrays
The processing of two-dimensional arrays is better managed if the second dimension is
larger than the first.
Fields
Whenever you need to perform several calculations on a field, you can improve
performance by storing the value of that field in a variable and performing your
calculations on the variable rather than the field. Consider the following method:
Case of
: ([Client]Dest="New York City")
Transport:="Messenger"
: ([Client]Dest="Puerto Rico")
Transport:="Air mail"
: ([Client]Dest="Overseas")
Transport:="Express mail service"
Else
Transport:="Regular mail service"
End case
Pointers
As is the case with fields, it is faster to work with variables than with dereferenced pointers.
Whenever you need to perform several calculations on a variable referenced by a pointer,
you can save time by storing the dereferenced pointer in a variable.
For example, suppose you use a pointer, MyPtr, to refer to a field or to a variable. Then, you
want to perform a set of tests on the value referenced by MyPtr. You could write:
Case of
: (MyPtr-> = 1)
Sequence 1
: (MyPtr-> = 2)
Sequence 2
…
End case
Local variables
Use local variables wherever possible to structure you code. Using local variables has the
following advantages:
• Local variables take less space when used in a database. They are created when the
method in which they are used is entered, and they are destroyed when the method
finishes executing.
See Also
Error messages, Syntax Details, Typing Guide, Using Compiler Directives.
This section describes the different messages generated by the compiler. These messages are
of several different types:
• warnings, that help you avoid common pitfalls;
• errors, that it is up to you to correct;
• range checking messages, generated within 4th Dimension.
Warnings
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
These messages are generated throughout the compilation process. Each message is
accompanied here with an example of the problem and, when necessary, an additional
explanation.
An automatic action button does not have a name in the MyForm form on page X.
All of your buttons should have names to avoid conflicts.
Error messages
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
These messages are generated throughout the compilation process. It is up to you to correct
these errors in order to for the compiler to be able to generate a compiled database. Each
message is accompanied here with an example of the problem and, when necessary, an
additional explanation.
The messages are grouped by the following topics: Typing, Syntax, Parameters, Operators,
Plug-in Commands and General Errors.
• Typing
The type of the variable is not compatible with the operator. Cannot make an assignment with
those types.
MyReal:=12.3
MyBoolean:=True
MyReal:=MyBoolean
Variable expected.
COPY ARRAY(MyArray;"")
The type of Variable is unknown. This variable is used in the method M1.
The type of Variable cannot be determined. A compiler directive is necessary.
The types of the variables used in this expression are not compatible.
Integer:=MyDate*Text
Changing the type of the variable $i from type Fixed string to type Real.
$i:="3"
$($i):=5
Retyping the variable Variable from type Text to an array of type Text.
C_TEXT(Variable)
COPY ARRAY(TextArray;Variable)
Retyping the array MyBoolean from array of type Boolean to variable of type Real.
Variable:=MyBoolean
Retyping the array IntArray from array of type Integer to array of type Text.
ARRAY TEXT(IntArray;12)
if IntArray was declared elsewhere as an Integer array.
• Syntax
Syntax error.
If(Boolean)
End for
Field expected.
If(Modified(Variable))
Variable expected.
C_INTEGER([MyTable]MyField)
Semicolon ; expected.
COPY ARRAY(Array1 Array2)
• Mac OS:
Too many opening character reference symbols.
MyString[[3:="a"
Too many closing character reference symbols.
MyString3]]:="a"
• Windows:
Too many opening character reference symbols.
MyString[[3:="a"
Too many closing character reference symbols.
MyString 3]]:="a"
Unknown field.
Your method, possibly copied from another database, contains •???• instead of a field
name.
Unknown table.
Your method, possibly copied from another database, contains •???• instead of a table
name.
• Parameters
The result of this function cannot be passed as a parameter to this method or command.
MyMethod(Num(MyString))
if MyMethod expects a Boolean expression.
The type of the parameter $1 is different in the calling and in the called method.
Calculate("3+2")
with the directive C_INTEGER($1) in Calculate.
• Operators
• Plug-in Commands
• General Errors
The variable Variable could not be typed. This variable is used in the method M1.
The Variable type cannot be determined. A compiler directive is necessary.
Unknown 4D command.
The method is damaged.
The name of the function Name is also the name of a variable in the form.
Rename either the function or the variable.
Range-checking messages
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
These messages are generated in 4th Dimension while the compiled database is running.
They are displayed in a specific error window.
Division by zero.
Var1:=0
Var2:=2
Var3:=Var2 / Var1
Modulo by zero.
Var1:=0
Var2:=2
Var3:=Var2 % Var1
See Also
Optimization Hints, Syntax Details, Typing Guide, Using Compiler Directives.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
C_BLOB casts each specified variable as a BLOB variable.
The first form of the command, in which the optional method parameter is NOT passed, is
used to declare and type any process, interprocess, or local variable.
The second form of the command, in which the optional method parameter IS passed, is used
to predeclare to the compiler the result and/or the parameters ($0, $1, $2 etc) for a method.
Use this form of the command in order to skip the Typing variables phase while compiling a
database, saving compilation time.
WARNING: The second form cannot be executed in interpreted mode. For this reason, if you
are using this syntax, keep it in a method that is not executed in interpreted mode. The name
of this method must start with “COMPILER.”
Advanced Tip: The syntax C_BLOB(${...}) allows you to declare a variable number of parameters
of the same type, under the condition that these are the last parameters for the method. For
example, the declaration C_BLOB(${5}) tells 4D and the compiler that starting with the fifth
parameter, the method can receive a variable number of parameters of that type. For more
information, see the Count parameters command.
Examples
See examples in the section Compiler Commands.
See Also
Compiler Commands.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The C_BOOLEAN command casts each specified variable as a Boolean variable.
The first form of the command, in which the optional method parameter is NOT passed, is
used to declare and type any process, interprocess, or local variable.
The second form of the command, in which the optional method parameter IS passed, is used
to predeclare to the compiler the result and/or the parameters ($0, $1, $2 etc) for a method.
Use this form of the command in order to skip the Typing variables phase while compiling a
database, saving compilation time.
WARNING: The second form cannot be executed in interpreted mode. For this reason, if you
are using this syntax, keep it in a method that is not executed in interpreted mode. The name
of this method must start with “COMPILER.”
Advanced Tip: The syntax C_BOOLEAN(${...}) allows you to declare a variable number of
parameters of the same type, under the condition that these are the last parameters for the
method. For example, the declaration C_BOOLEAN(${5}) tells 4D and the compiler that
starting with the fifth parameter, the method can receive a variable number of parameters of
that type. For more information, see the Count parameters command.
Examples
See examples in the section Compiler Commands.
See Also
Compiler Commands, Count parameters.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The C_DATE command casts each specified variable as a Date variable.
The first form of the command, in which the optional method parameter is NOT passed, is
used to declare and type any process, interprocess, or local variable.
The second form of the command, in which the optional method parameter IS passed, is used
to predeclare to the compiler the result and/or the parameters ($0, $1, $2 etc) for a method.
Use this form of the command in order to skip the Typing variables phase while compiling a
database, saving compilation time.
WARNING: The second form cannot be executed in interpreted mode. For this reason, if you
are using this syntax, keep it in a method that is not executed in interpreted mode. The name
of this method must start with “COMPILER.”
Advanced Tip: The syntax C_DATE(${...}) allows you to declare a variable number of parameters
of the same type, under the condition that these are the last parameters for the method. For
example, the declaration C_DATE(${5}) tells 4D and the compiler that starting with the fifth
parameter, the method can receive a variable number of parameters of that type. For more
information, see the Count parameters command.
Examples
See examples in the section Compiler Commands.
See Also
Compiler Commands, Count parameters.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The C_GRAPH command casts each specified variable as a Graph variable.
The first form of the command, in which the optional method parameter is NOT passed, is
used to declare and type any process, interprocess, or local variable.
The second form of the command, in which the optional method parameter IS passed, is used
to predeclare to the compiler the result and/or the parameters ($0, $1, $2 etc) for a method.
Use this form of the command in order to skip the Typing variables phase while compiling a
database, saving compilation time.
WARNING: The second form cannot be executed in interpreted mode. For this reason, if you
are using this syntax, keep it in a method that is not executed in interpreted mode. The name
of this method must start with “COMPILER.”
Advanced Tip: The syntax C_GRAPH(${...}) allows you to declare a variable number of
parameters of the same type, under the condition that these are the last parameters for the
method. For example, the declaration C_GRAPH(${5}) tells 4D and the compiler that starting
with the fifth parameter, the method can receive a variable number of parameters of that type.
For more information, see the Count parameters command.
Examples
See examples in the section Compiler Commands.
See Also
Compiler Commands.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Note: This command is still present in 4th Dimension for compatibility with old databases. In
fact, 4D and the compiler retype Integers into Longints internally. For example :
C_INTEGER($MyVar)
$TheType:=Type($MyVar) `$TheType = 9 (Is Longint)
Description
The C_INTEGER command casts each specified variable as an Integer variable.
The first form of the command, in which the optional method parameter is NOT passed, is
used to declare and type any process, interprocess, or local variable.
The second form of the command, in which the optional method parameter IS passed, is used
to predeclare to the compiler the result and/or the parameters ($0, $1, $2 etc) for a method.
Use this form of the command in order to skip the Typing variables phase while compiling a
database, saving compilation time.
WARNING: The second form cannot be executed in interpreted mode. For this reason, if you
are using this syntax, keep it in a method that is not executed in interpreted mode. The name
of this method must start with “COMPILER.”
Advanced Tip: The syntax C_INTEGER(${...}) allows you to declare a variable number of
parameters of the same type, under the condition that these are the last parameters for the
method. For example, the declaration C_INTEGER(${5}) tells 4D and the compiler that starting
with the fifth parameter, the method can receive a variable number of parameters of that type.
For more information, see the Count parameters command.
See Also
Compiler Commands, Count parameters, C_LONGINT, C_REAL.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The C_LONGINT command casts each specified variable as a Long Integer variable.
The first form of the command, in which the optional method parameter is NOT passed, is
used to declare and type any process, interprocess or local variable.
The second form of the command, in which the optional method parameter IS passed, is used
to predeclare to the compiler the result and/or the parameters ($0, $1, $2 etc) for a method.
Use this form of the command in order to skip the Typing variables phase while compiling a
database, saving compilation time.
WARNING: The second form cannot be executed in interpreted mode. For this reason, if you
are using this syntax, keep it in a method that is not executed in interpreted mode. The name
of this method must start with “COMPILER.”
Advanced Tip: The syntax C_LONGINT(${...}) allows you to declare a variable number of
parameters of the same type, under the condition that these are the last parameters for the
method. For example, the declaration C_LONGINT(${5}) tells 4D and the compiler that starting
with the fifth parameter, the method can receive a variable number of parameters of that type.
For more information, see the Count parameters command.
Examples
See examples in the section Compiler Commands.
See Also
Compiler Commands, Count parameters, C_INTEGER, C_REAL.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The C_PICTURE command casts each specified variable as a Picture variable.
The first form of the command, in which the optional method parameter is NOT passed, is
used to declare and type any process, interprocess or local variable.
The second form of the command, in which the optional method parameter IS passed, is used
to predeclare to the compiler the result and/or the parameters ($0, $1, $2 etc) for a method.
Use this form of the command in order to skip the Typing variables phase while compiling a
database, saving compilation time.
WARNING: The second form cannot be executed in interpreted mode. For this reason, if you
are using this syntax, keep it in a method that is not executed in interpreted mode. The name
of this method must start with “COMPILER.”
Advanced Tip: The syntax C_PICTURE(${...}) allows you to declare a variable number of
parameters of the same type, under the condition that these are the last parameters for the
method. For example, the declaration C_PICTURE(${5}) tells 4D and the compiler that starting
with the fifth parameter, the method can receive a variable number of parameters of that type.
For more information, see the Count parameters command.
Examples
See examples in the section Compiler Commands.
See Also
Compiler Commands, Count parameters.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The C_POINTER command casts each specified variable as a Pointer variable.
The first form of the command, in which the optional method parameter is NOT passed, is
used to declare and type any process, interprocess, or local variable.
The second form of the command, in which the optional method parameter IS passed, is used
to predeclare to the compiler the result and/or the parameters ($0, $1, $2 etc) for a method.
Use this form of the command in order to skip the Typing variables phase while compiling a
database, saving compilation time.
WARNING: The second form cannot be executed in interpreted mode. For this reason, if you
are using this syntax, keep it in a method that is not executed in interpreted mode. The name
of this method must start with “COMPILER.”
Advanced Tip: The syntax C_POINTER(${...}) allows you to declare a variable number of
parameters of the same type, under the condition that these are the last parameters for the
method. For example, the declaration C_POINTER(${5}) tells 4D and the compiler that starting
with the fifth parameter, the method can receive a variable number of parameters of that type.
For more information, see the Count parameters command.
Examples
See examples in the section Compiler Commands.
See Also
Compiler Commands, Count parameters.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The C_REAL command casts each specified variable as a Real variable.
The first form of the command, in which the optional method parameter is NOT passed, is
used to declare and type any process, interprocess or local variable.
The second form of the command, in which the optional method parameter IS passed, is used
to predeclare to the compiler the result and/or the parameters ($0, $1, $2 etc) for a method.
Use this form of the command in order to skip the Typing variables phase while compiling a
database, saving compilation time.
WARNING: The second form cannot be executed in interpreted mode. For this reason, if you
are using this syntax, keep it in a method that is not executed in interpreted mode. The name
of this method must start with “COMPILER.”
Advanced Tip: The syntax C_REAL(${...}) allows you to declare a variable number of parameters
of the same type, under the condition that these are the last parameters for the method. For
example, the declaration C_REAL(${5}) tells 4D and the compiler that starting with the fifth
parameter, the method can receive a variable number of parameters of that type. For more
information, see the Count parameters command.
Examples
See examples in the section Compiler Commands.
See Also
Compiler Commands, Count parameters, C_INTEGER, C_LONGINT.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The C_STRING command casts each specified variable as a String variable.
The size parameter specifies the maximum length of the strings that the variable can contain.
Strings are limited to 255 characters. If speed is a concern, use string variables rather than text
variables wherever possible.
The first form of the command, in which the optional method parameter is NOT passed, is
used to declare and type any process, interprocess, or local variable.
The second form of the command, in which the optional method parameter IS passed, is used
to predeclare to the compiler the result and/or the parameters ($0, $1, $2 etc) for a method.
Use this form of the command in order to skip the Typing variables phase while compiling a
database, saving compilation time.
WARNING: The second form cannot be executed in interpreted mode. For this reason, if you
are using this syntax, keep it in a method that is not executed in interpreted mode. The name
of this method must start with “COMPILER.”
Advanced Tip: The syntax C_STRING(...;${...}) allows you to declare a variable number of
parameters of the same type, under the condition that these are the last parameters for the
method. For example, the declaration C_STRING(...;${5}) tells 4D and the compiler that
starting with the fifth parameter, the method can receive a variable number of parameters of
that type. For more information, see the Count parameters command.
See Also
Compiler Commands, Count parameters, C_TEXT.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The C_TEXT command casts each specified variable as a Text variable.
The first form of the command, in which the optional method parameter is NOT passed, is
used to declare and type any process, interprocess or local variable.
The second form of the command, in which the optional method parameter IS passed, is used
to predeclare to the compiler the result and/or the parameters ($0, $1, $2 etc) for a method.
Use this form of the command in order to skip the Typing variables phase while compiling a
database, saving compilation time.
WARNING: The second form cannot be executed in interpreted mode. For this reason, if you
are using this syntax, keep it in a method that is not executed in interpreted mode. The name
of this method must start with “COMPILER.”
Advanced Tip: The syntax C_TEXT(${...}) allows you to declare a variable number of parameters
of the same type, under the condition that these are the last parameters for the method. For
example, the declaration C_TEXT(${5}) tells 4D and the compiler that starting with the fifth
parameter, the method can receive a variable number of parameters of that type. For more
information, see the Count parameters command.
Examples
See examples in the section Compiler Commands.
See Also
Compiler Commands, Count parameters, C_STRING.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The C_TIME command casts each specified variable as a Time variable.
The first form of the command, in which the optional method parameter is NOT passed, is
used to declare and type any process, interprocess, or local variable.
The second form of the command, in which the optional method parameter IS passed, is used
to predeclare to the compiler the result and/or the parameters ($0, $1, $2 etc) for a method.
Use this form of the command in order to skip the Typing variables phase while compiling a
database, saving compilation time.
WARNING: The second form cannot be executed in interpreted mode. For this reason, if you
are using this syntax, keep it in a method that is not executed in interpreted mode. The name
of this method must start with “COMPILER.”
Advanced Tip: The syntax C_TIME(${...}) allows you to declare a variable number of parameters
of the same type, under the condition that these are the last parameters for the method. For
example, the declaration C_TIME(${5}) tells 4D and the compiler that starting with the fifth
parameter, the method can receive a variable number of parameters of that type. For more
information, see the Count parameters command.
Examples
See examples in the section Compiler Commands.
See Also
Compiler Commands, Count parameters.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
IDLE
Description
The IDLE command is designed only for use with the compiler. This command is only used in
compiled databases in which user-defined methods are written so that no calls are made back
to the 4th Dimension engine. For example, if a method has a For loop in which no 4th
Dimension commands are executed, the loop could not be interrupted by a process installed
with ON EVENT CALL, nor could a user switch to another application. In this case, you should
insert IDLE to allow 4th Dimension to trap events. If you do not want any interruptions, omit
IDLE.
Example
In the following example, the loop would never terminate in a compiled database without the
call to IDLE:
` Do Something Project Method
ON EVENT CALL ("EVENT METHOD")
<>vbWeStop:=False
MESSAGE ("Processing..."+Char(13)+"Type any key to interrupt...")
Repeat
` Do some processing that doesn’t involve a 4D command
IDLE
Until (<>vbWeStop)
ON EVENT CALL ("")
with:
See Also
Compiler Commands, ON EVENT CALL.
Database methods are methods that are automatically executed by 4th Dimension when a
general session event occurs.
You edit a database method in the same way as any other method.
For detailed information about each of the database methods, see the following sections:
• On Startup Database Method
• On Exit Database Method
• On Web Authentication Database Method
• On Web Connection Database Method
• On Backup Startup Database Method
• On Backup Shutdown Database Method
• On Server Startup Database Method (4D Server Reference manual)
• On Server Shutdown Database Method (4D Server Reference manual)
• On Server Open Connection Database Method (4D Server Reference manual)
• On Server Close Connection Database Method (4D Server Reference manual)
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The On Startup Database Method is called once when you open a database.
The On Startup Database Method is automatically invoked by 4D; unlike project methods, you
cannot call this database method yourself. To call and perform tasks from within the On
Startup Database Method, as well as from project methods later on, use subroutines.
See Also
Database Methods, Methods, On Exit Database Method, QUIT 4D.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The On Exit Database Method is called once when you quit a database.
The On Exit Database Method is automatically invoked by 4D; unlike project methods, you
cannot call this database method yourself. To call and perform tasks from within the On Exit
Database Method, as well as from project methods, use subroutines.
No matter how the exit from the database was initiated, 4D performs the following actions:
• If there is no On Exit Database Method, 4D aborts each running process one by one, without
distinction. If the user is performing data entry, the records will be cancelled and not saved.
• If there is an On Exit Database Method, 4D starts executing this method within a newly
created local process. You can therefore use this database method to inform other processes,
via interprocess communication, that they must close (data entry) or stop executing. Note that
4D will eventually quit—the On Exit Database Method can perform all the cleanup or closing
operations you want, but it cannot refuse the quit, and will at some point end.
Note: Don’t forget that the On Exit Database Method is a local/client process, so it cannot
access the data file. Thus, if the On Exit Database Method performs a query or a sort, a 4D
Client that is about to quit will "freeze" and actually will not quit. If you need to access data
when a client quits the application, create a new global process from within the On Exit
Database Method, which will be able to access the data file. In this case, be sure that the new
process will terminate correctly before the end of the On Exit Database Method execution (by
using interprocess variables, by example).
Example
The following example covers all the methods used in a database that tracks the significant
events that occur during a working session and writes a description in a text document called
“Journal.”
• The On Startup Database Method initializes the interprocess variable <>vbQuit4D, which tells
all the use processes whether or not the database is being exited. It also creates the journal file,
if it does not already exist.
• The project method WRITE JOURNAL, used as subroutine by the other methods, writes the
information it receives, in the journal file:
• The M_QUIT project method is executed when Quit is chosen from the File menu in the
Custom Menus environment:
The method uses a trick. When QUIT 4D is called, the command has an immediate effect.
Therefore, the process from which the call is issued is in “stop mode” until the database is
actually exited. Since this process can be one of the processes in which data entry occurs, the
call to QUIT 4D is made in a local process that is started only for this purpose. Here is the
DO_QUIT method:
• Finally, here is the On Exit Database Method which tells all open user processes “It's time to
get out of here!” It sets <>vbQuit4D to True and sends interprocess messages to the user
processes that are performing data entry:
Note: Processes that have names beginning with "ML_..." or "M_..." are started by menu
commands for which the Start a New Process property has been selected. In this example,
these are the processes started when the menu command Add record was chosen.
The test (Current time-$vhStart)>=?00:01:00? allows the database method to get out of the
“waiting the other process” Repeat loop if the other process does not act immediately.
• The following is a typical example of the Journal file produced by the database:
Note: The name $xx is the name of the local process started by 4D in order to execute the On
Exit Database Method.
See Also
On Startup Database Method, QUIT 4D.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ADD RECORD command lets the user add a new record to the database for the table table
or for the default table, if you omit the table parameter.
ADD RECORD creates a new record, makes the new record the current record for the current
process, and displays the current input form. In the Custom Menus environment, after the
user has accepted the new record, the new record is the only record in the current selection.
The form is displayed in the frontmost window of the process. The window has scroll bars and
a size box. Specifying the optional * parameter causes the window to be drawn without scroll
bars or a size box.
The record is saved (accepted) if the user clicks an Accept button or presses the Enter key
(numeric keypad), or if the ACCEPT command is executed.
The record is not saved (canceled) if the user clicks a Cancel button or presses the cancel key
combination (Ctrl-Period on Windows, Command-Period on Macintosh), or if the CANCEL
command is executed.
After a call to ADD RECORD, OK is set to 1 if the record is accepted, to 0 if canceled.
Note: Even when canceled, the record remains in memory and can be saved if SAVE RECORD is
executed before the current record pointer is changed.
Examples
1. The following example is a loop commonly used to add new records to a database:
INPUT FORM ([Customers];"Std Input") ` Set input form for [Customers] table
Repeat ` Loop until the user cancels
ADD RECORD ([Customers];*) ` Add a record to the [Customers] table
Until (OK=0) ` Until the user cancels
2. The following example queries the database for a customer. Depending on the results of the
search, one of two things may happen. If no customer is found, then the user is allowed to
add a new customer with ADD RECORD. If at least one customer is found, the user is presented
with the first record found, which can be modified with MODIFY RECORD:
READ WRITE([Customers])
INPUT FORM([Customers];"Input") ` Set the input form
vlCustNum:=Num(Request ("Enter Customer Number:")) ` Get the customer number
If (OK=1)
QUERY ([Customers];[Customers]CustNo=vlCustNum) ` Look for the customer
If (Records in selection([Customers])=0) ` If no customer is found…
ADD RECORD([Customers]) ` Add a new customer
Else
See Also
ACCEPT, CANCEL, CREATE RECORD, MODIFY RECORD, SAVE RECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The MODIFY RECORD command lets the user modifies the current record for the table table or
for the default table if you omit the table parameter. MODIFY RECORD loads the record, if it is
not already loaded for the current process, and displays the current input form. If there is no
current record, then MODIFY RECORD does nothing. MODIFY RECORD does not affect the
current selection.
The form is displayed in the frontmost window of the process. The window has scroll bars and
a size box. Specifying the optional * parameter causes the window to be drawn without scroll
bars or a size box.
To use MODIFY RECORD, the current record must have read-write access and should not be
locked.
If the form contains buttons for moving within the selection of records, MODIFY RECORD lets
the user click the buttons to modify records and move to other records.
The record is saved (accepted) if the user clicks an Accept button or presses the Enter key
(numeric key pad), or if the ACCEPT command is executed.
The record is not saved (canceled) if the user clicks a Cancel button or presses the cancel key
combination (Ctrl-Period on Windows, Command-Period on Macintosh), or if the CANCEL
command is executed. Even when canceled, the record remains in memory and can be saved
if SAVE RECORD is executed before the current record pointer is changed.
Note: Even when canceled, the record remains in memory and can be saved if SAVE RECORD is
executed before the current record pointer is changed.
Example
See example for the command ADD RECORD.
See Also
ADD RECORD, Locked, Modified record, READ WRITE, UNLOAD RECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ADD SUBRECORD command lets the user add a new subrecord to subtable, using the form
form. ADD SUBRECORD creates a new subrecord in memory, makes it the current subrecord,
and displays form. A current record for the parent table must exist. If a current parent record
does not exist for the process, ADD SUBRECORD has no effect. The form must belong to
subtable.
The subrecord is kept in memory (accepted) if the user clicks an Accept button or presses the
Enter key (numeric pad), or if the ACCEPT command is executed. After the subrecord has been
added, the parent record must be explicitly saved in order for the subrecord to be saved.
The subrecord is not saved if the user clicks a Cancel button or presses the cancel key
combination (Ctrl-Period on Windows, Command-Period on Macintosh), or if the CANCEL
command is executed.
The form is displayed in the frontmost window of the process. The window has scroll bars and
a size box. Specifying the optional * parameter causes the window to be drawn without scroll
bars or a size box.
See Also
ACCEPT, CANCEL, CREATE SUBRECORD, DELETE SUBRECORD, MODIFY SUBRECORD, SAVE
RECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The MODIFY SUBRECORD command displays the current subrecord of subtable for modification
using the form form. The form must belong to subtable.
A current record for the parent table must exist. If a current parent record does not exist for
the process, MODIFY SUBRECORD has no effect. In addition, if there is no current subrecord,
then MODIFY SUBRECORD does nothing.
Any modifications made to the subrecord will actually only be saved if the parent record itself
is saved.
After a call to MODIFY SUBRECORD, OK is set to 1 if the subrecord modifications are accepted,
to 0 if canceled.
The form is displayed in the frontmost window of the process. The window has scroll bars and
a size box. Specifying the optional * parameter causes the window to be drawn without scroll
bars or a size box.
See Also
ACCEPT, ADD SUBRECORD, CANCEL, SAVE RECORD.
Description
The DIALOG command presents the form form to the user. This command is often used to get
information from the user through the use of variables, or to present information to the user,
such as options for performing an operation.
It is common to display the form inside a modal window created with the Open window
command.
Use DIALOG instead of ALERT, CONFIRM, or Request when the information that must be
presented or gathered is more complex than those commands can manage.
Note: It is possible to prohibit data entry in fields of dialog boxes (and thus limit data entry to
variables only) using an option in the Preferences of 4th Dimension (Compatibility page). This
restriction corresponds to the operation of former versions of 4th Dimension.
The dialog is accepted if the user clicks an Accept button or presses the Enter key (numeric key
pad), or if the ACCEPT command is executed.
Keep in mind that validation does not cause saving: if the dialog includes fields, you must
explicitly call the SAVE RECORD command to save any data that has been modified.
The dialog is canceled if the user clicks a Cancel button or presses the cancel key combination
(Ctrl-Period on Windows, Command-Period on Macintosh), or if the CANCEL command is
executed.
Example
The following example shows the use of DIALOG to specify search criteria. A custom form
containing the variables vName and vState is displayed so the user can enter the search criteria.
See Also
ACCEPT, ADD RECORD, CANCEL, Open window.
Function result Boolean ← True if the field has been assigned a new value,
otherwise False
Description
Modified returns True if field has been programmatically assigned a value or has been edited
during data entry. The Modified command must only be used in a form method (or a
subroutine called by a form method).
Be careful, this command only returns a significant value within the same execution cycle. It
is more particularly set to False for all the form events that correspond to the former During
execution cycle.
During data entry, a field is considered modified if the user has edited the field (whether or
not the original value is changed) and then left it by going to another field or by clicking on a
control. Note that just tabbing out of a field does not set Modified to True. The field must have
been edited in order for Modified to be True.
When executing a method, a field is considered to be modified if it has been assigned a value
(different or not).
Note: Modified always returns True after the execution of the PUSH RECORD and POP RECORD
commands.
Note: Although Modified can be applied to any type of field, if you use it in combination with
the Old command, be aware of the restrictions that apply to the Old command. For details, see
the description of the Old command.
During data entry, it is usually easier to perform operations in object methods than to use
Modified in form methods. Since an object method is sent an On Data Change event whenever
a field is modified, the use of an object method is equivalent to using Modified in a form
method.
Note: To operate properly, the Modified command is to be used only in a form method or in a
method called by a form method.
Examples
1. The following example tests whether either the [Orders]Quantity field or the [Orders]Price
field has changed. If either has been changed, then the [Orders]Total field is recalculated.
2. You select a record for the table [anyTable], then you call multiple subroutines that may
modify the field [anyTable]Important field, but do not save the record. At the end of the main
method, you can use the Modified command to detect whether you must save the record:
See Also
Form event, Old.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Old command returns the value held in field before the field was programmatically
assigned a value or modified in data entry.
Each time you change the current record for a table, 4D creates and maintains in memory a
duplicated “image” of the new current record when it is loaded in memory. (For optimization,
4D disregards Text, Picture and BLOB fields.) When modifying a record, you work with the
actual image of the record, not this duplicated image. This image is then discarded when you
change the current record again.
Old returns the value from the duplicated image. In other words, for an existing record, it
returns the value of the field as it is stored on disk. If a record is new, Old returns the default
empty value for field according to its type. For example, if field is an Alpha field, Old returns an
empty string. If field is a numeric field, Old returns zero (0), and so on.
Old works on field whether the field has been modified by a method or by the user during data
entry.
Old cannot be applied to Text, Picture or BLOB fields. It can be applied to all other field types,
including subfields, but has no meaning when applied to a subtable field itself.
To restore the original value of a field, assign it the value returned by Old.
See Also
Modified.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Current date command returns the current date as kept by the system clock.
4D Server: If you use the asterisk (*) parameter when executing this function on a 4D Client
machine, it returns the current date from the server.
Examples
1. The following example displays an alert box containing the current date:
2. If you write an application for the international market, you may need to know if the
version of 4D that you run works with dates formatted as MM/DD/YYYY (US version) or
DD/MM/YYYY (French version). This is useful to know for customizing data entry fields.
C_STRING(31;$0;$vsDate;$vsMDY;$vsMonth;$vsDay;$vsYear)
C_LONGINT($1;$vlPos)
C_DATE($vdDate)
See Also
Date Operators, Day of, Month of, Year of.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Day of command returns the day of the month of date.
Note: Day of returns a value between 1 and 31. To get the day of the week for a date, use the
command Day number.
Examples
1. The following example illustrates the use of Day of. The results are assigned to the variable
vResult. The comments describe what is put in vResult:
vResult:= Day of (!12/25/92!) ` vResult gets 25
vResult:= Day of (Current date) ` vResult gets day of current date
See Also
Day number, Month of, Year of.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Month of command returns the month of date.
Note: Month of returns the number of the month, not the name (see Example 1).
Examples
1. The following example illustrates the use of Month of. The results are assigned to the
variable vResult. The comments describe what is put in vResult:
The following project method returns the name of the month for a date:
See Also
Day of, Year of.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Year of command returns the year of date.
Examples
1. The following example illustrates the use of Year of. The results are assigned to the variable
vResult.
See Also
Day of, Month of.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Day number command returns a number representing the weekday on which date falls.
Note: Day number of returns a value between 1 and 7. To get the day number within the
month for a date, use the command Day of.
See Also
Day of.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Add to date command adds years, months, and days to the date you pass in date, then
returns the result.
Although you can use the Date Operators to add days to a date, Add to date allows you to
quickly add months and years without having to deal with the number of days per month or
leap years (as you would when using the + date operator).
Example
` This line calculates the date in one year, same day
$vdInOneYear:=Add to date(Current date;1;0;0)
See Also
Date Operators.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Date command evaluates dateString and returns a date.
The dateString parameter must follow the normal rules for the date format.
In the US version of 4D, the date must be in the order MM/DD/YY (month, day, year). The
month and day can be one or two digits. The year can be two or four digits. If the year is two
digits, then Date adds 19 to the beginning of the year, unless you have change this default
using the command SET DEFAULT CENTURY. The following characters are valid date separators:
slash (/), space, period (.), and comma (,).
Date does not check whether or not dateString is a valid date. If an invalid date (such as
"13/35/94") is passed, Date will return the invalid date. However, if dateString could not
possibly be interpreted as a date (for example, "aa/12/94"), the null date value (!00/00/00!) is
returned.
Examples
1. The following example uses a request box to prompt the user for a date. The string entered
by the user is converted to a date and stored in the reqDate variable:
vdDate:=Date("12/12/94")
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Current time command returns the current time from the system clock.
The current time is always between 00:00:00 and 23:59:59. Use String or Time string to obtain
the string form of the time expression returned by Current time.
4D Server: If you use the asterisk (*) parameter when executing this function on a 4D Client
machine, it returns the current time from the server.
Examples
1. The following example shows you how to time the length of an operation. Here,
LongOperation is a method that needs to be timed:
2. The following example extracts the hours, minutes, and seconds from the current time:
$vhNow:=Current time
ALERT("Current hour is: "+String($vhNow\3600))
ALERT("Current minute is: "+String(($vhNow\60)%60))
ALERT("Current second is: "+String($vhNow%60))
See Also
Milliseconds, String, Tickcount, Time Operators.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Time string command returns the string form of the time expression you pass in seconds.
If you go beyond the number of seconds in a day (86,400), Time string continues to add hours,
minutes, and seconds. For example, Time string (86401) returns 24:00:01.
Note: If you need the string form of a time expression in a variety of formats, use String.
Example
The following example displays an alert box with the message, “46800 seconds is 13:00:00.”
See Also
String, Time.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Time command returns a time expression equivalent to the time specified as a string by
timeString.
The timeString parameter must contain a time expressed in one of the standard time formats of
4D corresponding to the language of your system (for more information, refer to the
description of the String command).
Example
The following example displays an alert box with the message “1:00 P.M. = 13 hours 0
minute”:
See Also
String, Time string.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Tickcount → Number
Description
Tickcount returns the number of ticks (60th of a second) elapsed since the machine was started.
Example
See example for the command Milliseconds.
See Also
Current time, Milliseconds.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Milliseconds → Longint
Description
Milliseconds returns the number of milliseconds (1000th of a second) elapsed since the
machine was started.
Example
The following code displays the “Chronometer” window for one minute:
Description
The SET DEFAULT CENTURY command allows you to specify the default century and the pivot
year used by 4D when you enter a date with only two digits for the year.
The pivot year value defines the way 4D will interpret data entry of a date with a two-digit
year:
• If the year is greater than or equal to the pivot year, 4D uses the current default century.
• If the year is less than the pivot year, 4D uses the next century (relative to the current
default).
By default, 4D sets the century to be the 20th century and uses 30 as pivot year. For example:
• 01/25/97 means January 25, 1997.
• 01/25/30 means January 25, 1930.
• 01/25/29 means January 25, 2029.
• 01/25/07 means January 25, 2007.
To change this default, execute the SET DEFAULT CENTURY command. The effect of the
command is immediate. You can pass a new default century only, or a new default century
and a pivot year.
If you pass only a new default century minus one in century, 4D will interpret data entry of a
date with a two-digit year as belonging to this century.
For example, after the call:
Note: This command only affects how 4D interprets dates entered with a two-digit year.
In all cases:
• 01/25/1997 means January 25, 1997
• 01/25/2097 means January 25, 2097
• 01/25/1907 means January 25, 1907
• 01/25/2007 means January 25, 2007
This command only affects data entry. It has no effect on date storage, computation, and so
on.
When developing and testing your methods, it is important that you find and fix the errors
they may contain.
There are several types of errors you can make when using the language: typing errors, syntax
errors, environmental errors, design or logic errors, and runtime errors.
Typing Errors
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Typing errors are detected by the Method editor and are marked with bullets (•) and a message
is displayed in the information area at the top of the method window. The following window
shows a typing error:
Note: The comments have been manually inserted for the purpose of this manual. 4D only
inserts the (•) at the location of the error.
Such typing errors usually cause syntax errors (in this case, the name of the table is unknown).
The information area displays a description of the error when you validate the line of code.
When this occurs, fix the typing error and type Enter (on the numeric pad) to validate the fix.
For more information about the Method editor, refer to the 4th Dimension Design Reference.
Some syntax errors can be caught only when you execute the method. The Syntax Error
window is displayed when a syntax error occurs. For example:
In this window, the error is that a table name is passed to the Uppercase command, which
expects a text expression. To learn about this window and its button, see the section Syntax
Error window.
Environmental Error
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Occasionally, there there may not be enough memory to create an array or a BLOB. When you
access a document on disk, the document may not exist or may already open by another
application. In such cases, the Error window appears, describing the error and the action that
could not be performed. For example:
These are generally the most difficult type of error to find—use the Debugger to detect them.
Note that, other than typing errors, all the previous error types are to a certain extent covered
by the expression “Design or logic error.” For example:
• A syntax error may occur because you try to use a variable that has not yet been initialized.
• An environmental error may occur because you try to open a document whose name is
received by a subroutine which does not get the right value in the parameter. Note that in this
example, the piece of code that actually “breaks” may be different than the code that is
actually the origin of the problem.
• A record is not properly updated because, while calling SAVE RECORD, you forgot to first test
whether or not the record was locked.
• A method does not do exactly what you expect, because the presence of an optional
parameter is not tested.
Runtime Error
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
In compiled mode, you can obtain errors that you never saw in interpreted mode. Here is an
example:
Errors are common. It would be unusual to write a substantial number of lines of code (let’s
say several hundred) without generating any errors. Conversely, treating and/or fixing errors is
normal, too!
With its multi-tasking environment, 4D enables you to quickly edit/run methods by simply
switching windows. You will discover how quickly you can fix mistakes and errors when you
do not have to rerun the whole thing each time. You will also discover how quickly you can
track errors if you use the Debugger.
A common beginner mistake in dealing with error detection is to click Abort in the Syntax
Error Window, go back to the Method Editor, and try to figure out what's going by looking at
the code. Do not do that! You will save plenty of time and energy by always using the
Debugger.
In 99% of the cases, the Debugger displays the information you need in order to understand
why an error occurred. Once you have this information, you know how to fix the error.
Tip: A few hours spent in learning and experimenting with the Debugger can save days and
weeks in the future when you have to track down errors.
Another reason to use the Debugger is for developing code. Sometimes you may write an
algorithm that is more complex than usual. Despite all feelings of accomplishment, you are
not totally sure that your coding is correct, even before trying it. Instead of running it “blind,”
use the TRACE command at the beginning of your code. Then, execute it step by step to
control what happens and to check whether your suspicion was correct or not. A purist may
dislike this method, but somethimes pragmatism pays off more quickly. Anyway... use the
Debugger.
General Conclusion
Use the Debugger.
See Also
Break List, Catching Commands, Debugger, Debugger Shortcuts, ON ERR CALL, Syntax Error
Window.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The Syntax Error Window is displayed when method execution is halted. Method execution can
be halted for either of two reasons:
• 4th Dimension halts execution because there is a syntax error preventing further method
execution.
• You generate a user interrupt by pressing Alt+Click (Windows) or Option+Click (Macintosh)
while a method is executing.
The upper text area of the Syntax Error window displays a message describing the error. The
lower text area shows the line that was executing when the error occurred; the area where the
error occurred is highlighted.
There are four option buttons at the bottom of the window: Abort, Trace, Continue, and Edit.
• Abort: The method is halted, and you return to where you were before you started executing
the method. If a form or object method is executing in response to an event, it is stopped and
you return to the form. If the method is executing from within the Custom Menu
environment, you return to the Custom Menu environment.
• Trace: You enter Trace/Debugger mode, and the Debugger window is displayed. If the
current line has been partially executed, you may have to click the Trace button several times.
Once the line finishes, you end up in the Debugger window.
See Also
Debugger, ON ERR CALL, Why a Debugger?.
The term Debugger comes from the term bug. A bug in a method is a mistake that you want to
eliminate. When an error has occurred, or when you need to monitor the execution of your
methods, you use the debugger. A debugger helps you find bugs by allowing you to slowly
step through your methods and examine method information. This process of stepping
through methods is called tracing.
You can cause the Debugger window to display and then trace the methods in the following
ways:
• Clicking the Trace button when a process is selected in the Process page of the Runtime
Explorer.
• Creating or editing a break point in the Method Editor window, or in the Break and Catch
pages of the Runtime Explorer.
Note: If a password system exists for the database, only the designer and users belonging to
the group that has structure access privileges can trace methods.
You can move the Debugger Window and/or resize any of its internal window panes as
necessary. Displaying a new debug window uses the same configuration (size and position of
the window, placing of the division lines and contents of the area that evaluates the
expressions) as the last window displayed in the same session.
4D is a multi-tasking environment. If you run several user processes, you can trace them
independently. You can have one debugger window open for each process.
Nine buttons are located in the Execution Control Tool Bar at the top of the Debugger
window:
Abort Button
The method is halted, and you return to where you were before you started executing the
method. If you were tracing a form or object method executing in response to an event, it is
stopped and you return to the form. If you were tracing a method executing from within the
Custom Menu environment, you return to the Custom Menu environment.
Tip: Use this button when you know which changes are required in your code and when these
changes are required to pursue the testing of your methods. After you are finished with the
changes, rerun the method.
Edit Button
Clicking the Edit button does the same as Clicking Abort and Edit button, but does not abort
the current execution. The method execution is paused at that point. If necessary, 4th
Dimension opens and brings the Design environment process to the front, then opens a
Method Editor window for the method that was executing at the time the Edit button was
clicked.
Important: You can modify this method; however, these modifications will not appear or
execute in the instance of the method currently being traced in the debugger window. After
the method has either aborted or completed successfully, the modifications will appear on the
next execution of this method. In other words, the method must be reloaded so its
modifications will be taken into account.
Tip: Use this button when you know which changes are required in your code and when they
do not interfere with the rest of the code to be executed or traced.
On the right side of the execution control tool bar, the debugger provides the following
information:
• The name of the method you are currently tracing (displayed in black)
• The problem caused the appearance of the Debugger window (displayed in red)
Using the example window shown above, the following information is displayed:
• The method DE_DebugDemo is the method being traced.
• The debugger window appeared because it detected a call to the command C_DATE and this
command was one of the commands to be caught.
Here are the possible reasons for the debugger to appear and for the message (displayed in red):
• TRACE Command: A call to TRACE has been issued.
• Break Point Reached: A temporary or persistent break point has been encountered.
• User Interrupt: You used Alt+Shift+Right click (Windows) or
Control+Option+Command+Click (Macintosh), or you clicked on the Trace button in the
Process page of the Design environment Runtime Explorer.
• Caught a call to: Name of the command: A call to a 4D command to be caught is on the
point of being performed.
• Stepping into a new process: You used the Step Into Process button and this message is
displayed by the Debugger window opened for the newly created process.
The Debugger window consists of the previously described Execution Control Tool Bar and
four resizable panes:
• Watch Pane
• Call Chain Pane
• Custom Watch Pane
• Source Code Pane
See Also
Break List, Call Chain Pane, Catching Commands, Custom Watch Pane, Debugger Shortcuts, ON
ERR CALL, Source Code Pane, Syntax Error Window, TRACE, Watch Pane, Why a Debugger?.
The Watch pane is displayed in the top left corner of the Debugger window, below the
Execution Control Tool Bar. Here is an example:
The Watch pane displays useful general information about the system, the 4D environment,
and the execution environment.
The Expression column displays the names of the objects or expressions. The Value column
displays the current value of corresponding the object or expression.
Clicking on any value on the right side of the pane allows you to modify the value of the
object, if this is permitted for that object.
The multi-level hierarchical lists are organized by theme at the main level. The themes are:
• Line Objects
• Variables
• Constants
• Fields
• Semaphores
• Sets
• Processes
• Named Selections
• Information
• Cache Statistics
At any point, you can drag and drop themes, theme sublists (if any), and theme items to the
Custom Watch pane.
Cache Statistics: Displays statistics regarding the use of tables, index pages, and named
selections that are loaded in 4D’s cache. The expressions from this theme cannot be modified.
Information: Displays general information, such the current Default Table (if any). The
expressions from this theme cannot be modified.
Named Selections: Lists the process named selections that are defined in the current process
(the one you’re currently tracing); it also lists the interprocess named selections. For each
named selection, the Value column displays the number of records and the table name. This
list may be empty if you do not use named selections. The expressions from this theme cannot
be modified.
Processes: Lists the processes started since the beginning of the working session. The value
column displays the time used and the current state for each process (i.e., Executing, Paused,
and so on). The expressions from this theme cannot be modified.
Sets: Lists the sets defined in the current process (the one you're currently tracing); it also lists
the interprocess sets. For each set, the Value column displays the number of records and the
table name. This list may be empty if you do not use sets. The expressions from this theme
cannot be modified.
Semaphores: Lists the local semaphores currently being set. For each semaphore, the Value
column provides the name of the process that sets the semaphore. This list may be empty if
you do not use semaphores. The expressions from this theme cannot be modified. Global
semaphores are not displayed.
Tables & Fields: This theme lists the tables and fields in the database; it does not list subfields.
For each Table item, the Value column displays the size of the current selection for the current
process as well as (if the Table item is expanded) the number of locked records. For each Field
item, the Value column displays the value of the field (except picture, subtable, and BLOB) for
the current record, if any. In this theme, the field values can be modified (there is no undo),
but the table information cannot.
Constants: Displays predefined constants provided by 4D. like the Constants page of the
Explorer window. The expressions from this theme cannot be modified.
Note: You can modifiy String, Text, Numeric, Date, and Time variables; in other words, you
can modify the variables whose value can be entered with the keyboard.
Arrays, like other variables, appear in the Interprocess, Process, and Locals subthemes,
depending on their scope. The debugger displays each array with an additional hierarchical
level; this enables you to obtain or change the values of the array elements, if any. The
debugger displays the first 100 elements, including the element zero. The Value column
displays the size of the array in regard to its name. After you have deployed the array, the first
sub-item displays the current selected element number, then the element zero, then the other
elements (up to 100). You can modifiy String, Text, Numeric, and Date arrays. You can modify
the selected element number, the element zero, and the other elements (up to 100). You
cannot modify the size of the array.
Reminder: At any time, you can drag and drop an item from the Watch pane to the Custom
Watch pane, including an individual array element.
Line Objects
This theme displays the values of the objects or expressions that are:
• used in the line of code to be executed (the one marked with the program counter—the
yellow arrow in the Source Code pane), or
• used in the previous line of code.
TRACE
a:=1
b:=a+1
c:=a+b
` ...
1. You enter the Debugger window with the Source Code pane program counter set to the line
a:=1. At this point the Line Objects theme displays:
a: Undefined
The a variable is shown because it is used in the line to be executed (but has not yet been
initialized).
2. You step one line. The program counter is now set to the line b:=a+1. At this point, the Line
Objects theme displays:
a: 1
b: Undefined
The a variable is shown because it is used in the line that was just executed and was assigned
the numeric value 1. It is also shown because it is used in the line to be executed as the
expression to be assigned to the variable b. The b variable is shown because it is used in the
line to be executed (but has not yet been initialized).
3. Again, you step one line. The program counter is now set to the line c:=a+b. At this point
the Line Objects theme displays:
c: Undefined
a: 1
b: 2
The c variable is shown because it is used in the line to be executed (but has not yet been
initialized). The a and b variables are shown because there were used in the previous line and
are used in the line to be executed. And so on...
Speed Menu
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Addtional options are provided by the Speed Menu of the Watch pane. To display this menu:
• On Windows, click anywhere in the Watch pane using the right mouse button.
• On Macintosh, Control-Click anywhere in the Watch pane.
• Show Types: Displays the object type for each object (when appropriate).
• Show Field and Table Numbers: Displays the number of each table or field of the Fields. If
you work with table or field numbers, or with pointers using the commands such as Table or
Field, this option is very useful.
• Show Icons: Displays an icon denoting the object type for each object. You can turn this
option off in order to speed up the display, or just because you prefer to use only the Show
Types option.
• Show Integers in Hexadecimal: Numbers are usually displayed in decimal notation. This
option displays them in hexadecimal notation. Note: To enter a numeric value in
hexadecimal, type 0x (zero + "x"), followed by the hexadecimal digits.
The following is a view of the Watch pane with all options selected:
See Also
Call Chain Pane, Custom Watch Pane, Debugger, Debugger Shortcuts, Source Code Pane.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
One method may call other methods, which may call other methods. For this reason, it is
very helpful to see the chain of methods, or Call Chain, during the debugging process. The
Call Chain pane, which provides this useful function, is the top right pane of the Debugger
window. This pane is displayed using a hierarchical list. Here is an example of the Call Chain
pane:
• Each main level item is a name of a method. The top item is the method you are currently
tracing, the next main level item is the name of the caller method (the method that called the
method you are currently tracing), the next one is the caller's caller method, and so on. In the
example above, the method M_BitTestDemo is being traced; it has been called by the method
DE_LInitialize, which has been called by DE_DebugDemo.
• Double-clicking the name of a method in the Call Chain pane “transports” you back to the
caller method, displaying its source code in the Source code pane. In doing so, you can quickly
see “how” the caller method made its call to the called method. You can examine any stage of
the call chain this way.
• Clicking the node next to a Method name expands or collapses the parameter ($1, $2...) and
the optional function result ($0) list for the method. The values appear on the right side of the
pane. Clicking on any value on the right side allows you to change the value of any
parameter or function result. In the figure above:
• After you have deployed the parameter list for a method, you can also drag and drop
parameters and function results to the Custom Watch pane.
See Also
Custom Watch Pane, Debugger, Debugger Shortcuts, Source Code Pane, Watch Pane.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Directly below the Call Chain pane is the Custom Watch pane. This pane is used to evaluate
expressions. Any type of expression can be evaluated, including fields, variables, pointers,
calculations, built-in functions, your own functions, and anything else that returns a value.
You can evaluate any expression that can be shown in text form. This does not cover picture
and BLOB fields or variables. On the other hand, the Debugger uses deployed hierarchical lists
to let you display arrays and pointers. To display BLOB contents, you can use BLOB
commands, such as BLOB to text.
In the following example, you can see several of these items: two variables, a field pointer
variable and the result of a built-in function, and a calculation.
You can add an expression to be evaluated in the Custom Watch pane in the following way:
• Drag and drop an object or expression from the Watch pane
• Drag and drop an object or expression from the Call Chain pane
• In the Source Code pane, click on an expression that can be evaluated
To create a blank expression, double-click somewhere in the empty space of the Custom
Watch pane. This adds an expression ` New expression and then goes into editing mode so you
can edit it. You can enter any 4D formula that returns a result.
After you have entered the formula, type Enter or Return (or click somewhere else in the
pane) to evaluate the expression.
To change the expression, click on it to select it, then click again (or press Enter —numeric key
pad) to go into editing mode.
Warning: Be careful when you evaluate a 4D expression modifying the value of one of the
system variables (for instance, the OK variable) because the execution of the rest of the method
may be altered.
To help you enter and edit an expression, the Custom Watch Pane’s Speed menu gives you
access the 4D formula editor. In fact, the speed menu also proposes additional options.
• New Expression: This inserts a new expression and displays the 4D Formula Editor (as
shown) so you can edit the new expression.
• Insert Command: This hierarchical menu item is a shortcut for inserting a command as a
new expression, without using the Formula Editor.
• Collapse All/Expand All: Collapses or Expands all the expressions whose evaluation is done
by the means of a hierarchical list (i.e., pointers, arrays,...)
• Show Types: Displays the object type for each object (when appropriate).
• Show Field and Table Numbers: Displays the number of each table or field of the Fields. If
you work with table or field number or pointers using the commands such as Table or Field,
this option is very useful.
• Show Icons: Displays an icon denoting the object type for each object. You can turn this
option off in order to speed up the display, or just because you prefer to use only the Show
Types option.
• Sorted Tables and Fields: Forces the table and fields to be displayed in alphabetical order,
within their respective lists.
See Also
Call Chain Pane, Debugger, Debugger Shortcuts, Source Code Pane, Watch Pane.
The Source Code pane shows the source code of the method being traced.
• If the method is too long to fit in the text area, you can scroll to view other parts of the
method.
• Moving the mouse pointer over any expression that can be evaluated (field, variable, pointer,
array,...) will cause a Tool Tip to display the current value of the object or expression and its
declared type.
Here is an example of the Source Code pane:
A tool tip is displayed because the mouse pointer was over the variable pTable which,
according to the tool tip, is a pointer to the table [Customers].
• You can also select a portion of the text in the area displaying the code being executed. In
this case, when the cursor is placed above the selected text, a tip displays the selected object’s
value:
Tip: It is possible to copy any selected expression (that can be evaluated) from the Source Code
pane to the Custom Watch pane. You can use one of the following ways:
• by simply dragging and dropping (click on the selected text, drag it and drop it in the
evaluation area).
• by clicking on the selected text while holding down the Ctrl (Windows) or Command (Mac
OS) key.
• by using the Ctrl+D (Windows) or Command+D (Mac OS) key combinations.
Program Counter
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
A yellow arrow in the left margin of the Source Code pane (see the figure above) marks the
next line that will be executed. This arrow is called the program counter. The program
counter always indicates the line that is about to be executed.
For debugging purposes, you can change the program counter for the method being on top of
the call chain (the method actually being executed). To do so, click and drag the yellow arrow
vertically, to the line you want.
Moving the program counter forward does NOT mean that the debugger is rapidly executing
the lines you skip. Similarily, moving the program counter backward does NOT mean that the
debugger is reversing the effect of the lines that has already been executed.
Moving the program counter simply tells the debugger to “pursue tracing or executing from
here.” All current settings, fields, variables, and so on are not affected by the move.
Here is an example of moving the program counter. Let’s say you are debugging the following
code:
` ...
If (This condition)
DO SOMETHING
Else
DO SOMETHING ELSE
End if
` ...
In the debugging process, you may need to skip the tracing of some parts of the code. The
debugger offers you several ways to execute code up to a certain point:
• While stepping, you can click on the Step Over button instead of Step Into button. This is
useful when you do not want to enter into possible subroutines or functions called in the
program counter line.
• If you mistakenly entered into a subroutine, you can execute it and directly go back to the
caller method by clicking on the Step Out button.
• If you have a TRACE call placed at some point, you can click the No Trace button, which
resumes the execution up to that TRACE call.
Now, let’s say you are executing the following code, with the program counter set to the line
ALL RECORDS([ThisTable]):
` ...
ALL RECORDS([ThisTable])
$vrResult:=0
For($vlRecord;1;Records in selection([ThisTable]))
$vrResult:=This Function([ThisTable]))
NEXT RECORD([ThisTable])
End for
If ($vrResult>=$vrLimitValue)
` ...
Your goal is to evaluate the value of $vrResult after the For loop has been completed. Since it
takes quite some execution time to reach this point in your code, you do not want to abort the
current execution, then edit the method in order to insert a TRACE call before the line If
($vrResult....
For example:
You click in the left margin of the Source Code pane at the level of the line If ($vrResult...:
This inserts a break point for the line. The break point is indicated by a red bullet. Then click
the No Trace button.
This resumes the normal execution up to the line marked with the break point. That line is
not executed itself—you are back to the trace mode. In this example, the whole loop has
consequently been executed normally. Then, when reaching the break point, you just need to
move the mouse button over $vrResult to evaluate its value at the exit point of the loop.
Setting a break point beyond the program counter and clicking the No Trace button allows
you to skip portions of the method being traced.
Note: You can also set break points directly in 4D's Method Editor. Please refer to the section
Break Points.
A red break point is a persistent break point. Once you created it, it “stays.” Even though you
quit the database, then reopen it later on, the break point will be there.
See Also
Break Points, Call Chain Pane, Custom Watch Pane, Debugger, Watch Pane.
As explained in the Source Code pane section, you set a break point by clicking in the left
margin of the Source Code pane or of the Method Editor window, at the same level as the line
of code on which you want to create the break.
Note: Since you can insert, modify or delete break points either in the debugger's Source Code
pane or directly in the Method Editor, there is a dynamic interaction between the Method
Editor and the debugger (as well as the Runtime Explorer) in regards to break points. However,
temporary break points can be defined in the debugger only (see below).
In the following figure, a break point has been set, in the debugger, on the line
If($vrResult>=$vrLimitValue):
If you click again on the red bullet, the break point is deleted.
Pressing Alt-click (Windows) or Option-click (Macintosh) in the left margin of the Source code
pane or of the Method Editor window for a line of code, gives you access to the Break Point
Properties window.
• If you click on an existing break point, the window is displayed for that break point.
• If you click on a line where no break point was set, the debugger creates one and displays the
window for the newly created break point.
Location: This tells you the name of the method and the line number where the break point is
set. You cannot change this information.
Type: By default, the debugger lets you create persistent break points, depicted by a red bullet
in the source code pane of the debugger window. To create a temporary break point, select the
Temporary option. A temporary break point is useful when you want to break just once in a
method. A temporary break point is identified by a green bullet in the source code pane of the
Debugger window. You can also set a temporary break point directly in the source code pane
by clicking in the left margin while pressing Alt+Shift (Windows) or Option+Shift (Macintosh).
Break when following expression is true: You can create conditional break points by entering a
4D formula that returns True or False. For example, if you want to break at a line only when
Records in selection([aTable])=0, enter this formula, and the break will occur only if there no
record selected for the table [aTable], when the debugger encounters the line with this break
point. If you are not sure about the syntax of your formula, click the Check Syntax button.
Number of times to skip before breaking: You can set a break point to a line of code located in
a loop structure (While, Repeat, or For) or located in subroutine or function called from within
a loop. For example, you know that the “problem” you are tracking does not occur before at
least the 200th iteration of the loop. Enter 200, and the break point will activate at the 201st
iteration.
You create and edit break point from within the Debugger or the Method Editor window. You
can also edit existing break points using the Break page of the Runtime Explorer. For more
information, see the section Break List window.
See Also
Break List, Catching Commands, Debugger, Source Code Pane.
The Break List is a page of the Runtime Explorer that enables you to manage the persistent
Break Points created in the Debugger Window or in the Method Editor.
However, you cannot add a new persistent break point from this window. Persistent break
points can only be created from within the Debugger window or the Method Editor.
2. If the entry is in edit mode, press Enter or Return to switch it to select mode.
3. Click on the Enable/Disable button or choose Disable from the speed menu.
Shortcut: Each entry in the list may be disabled/enabled by clicking directly on the bullet (•).
The bullet changes to a dash (–) when disabled.
2. If the entry is in edit mode, press Enter or Return to switch it to select mode.
Note: To delete all the break points, click on the Delete All button or choose Delete All in the
speed menu.
See Also
Break Points, Catching Commands, Debugger, Source Code Pane, Why a Debugger?.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The Caught Commands List is a page of the Runtime Explorer that enables you to add
additional breaks to your code by catching calls to 4D commands.
Catching a command enables you to start tracing the execution of any process as soon as a
command is called by that process. Unlike a break point, which is located in a particular
project method (and therefore triggers a trace exception only when it is reached), the scope of
catching a command includes all the processes that execute 4D code and call that command.
Catching a command is a convenient way to trace large portions of code without setting break
points at arbitrary locations. For example, if a record that should not be deleted is deleted after
you have executed one or several processes, you can try to reduce the field of your
investigation by catching commands such as DELETE RECORD and DELETE SELECTION. Each
time these commands are called, you can check if the record in question has been deleted, and
thus isolate the faulty part of the code.
With some experience, you can combine the use of Break points and command catching.
This page lists the commands to be caught during execution. It is composed of two columns:
• The left column displays the Enable/Disable status of the caught command, followed by the
name of the command.
• The right column displays the condition associated with the caught command, if any.
1. Click on the Add New Catch button (first button above the list).
OR
Double-click the left mouse button in the Caught Commands list.
In both cases, a new entry is added to the list with the ALERT command as default.
The entry is set to the edit mode.
OR
1. Press the right mouse button (Control+Click on Macintosh) to display the speed menu.
2. Select Add New Catch, then select the desired command from the command themes and
names submenus. A new entry is added with the command you selected.
2. To toggle an entry between edit mode and select mode, press Enter or Return.
3. Enter or modify the name of the command.
4. To validate your changes, press Enter or Return. If name you entered does not correspond to
an existing 4D command, the entry is set to its previous value. If the entry is a new one, it is
reset to ALERT.
Shortcut: Each entry in the list may be disabled/enabled by clicking on the bullet (•). The
bullet changes to a dash (–) when disabled.
Note: To delete all the caught commands, click on the Delete All button or chosse Delete All in
the speed menu.
Tips
• Adding conditions to caught commands slows the execution, because the condition has to
be evaluated each time an exception is met. On the other hand, adding conditions accelerates
the debugging process, because it automatically skips occurrences that do not match the
conditions.
See Also
Break List, Break Points, Debugger.
This section lists all the shortcuts provided by the Debugger window.
→ Shift+F5 or Shift+click on the No Trace button resumes execution. Also, they disable all the
next TRACE calls for the current process.
Watch Pane
→ Right mouse button click (Windows) or Control-Click (Macintosh) in the Watch pane pulls
down the Watch Speed menu.
→ Double-click on an item of the Watch pane copies the item to the Custom Watch pane.
Call Chain Pane
→ Double-Click on a method name in the Call chain pane displays the method in the Source
Code pane at the line corresponding to the call in the call chain.
All Panes
→ Ctrl+* (Windows) or Command+* (Mac OS) forces the updating of the Watch pane.
→ When no item is selected in any pane, typing Enter steps by one line.
→ When an item value is selected, use the arrows keys to navigate through the list.
→ When an item is being edited, use the arrow keys to move the cursor; use Ctrl-A/X/C/V
(Windows) or Command-A/X/C/V (Macintosh) as shortcuts to the Select All/Cut/Copy/Paste
menu commands of the Edit menu.
See Also
Call Chain Pane, Custom Watch Pane, Debugger, Source Code Pane, Watch Pane.
4th Dimension allows built-in drag and drop capability between objects in your forms. You
can drag and drop one object to another, in the same window or in another window. In other
words, drag and drop can be performed within a process or from one process to another.
4th Dimension does not include built-in drag and drop to and from the desktop or another
application. However, this functionality is provided using plug-ins developed by 4D Partners
or using the “system” drag and drop (for more information about this, refer to the end of this
section).
Note: As an introduction, we assume that a drag and drop action “transports” some data from
one point to another. Later, we will see that drag and drop can also be a metaphor for any type
of operation.
To drag and drop an object to another object, you must select the Draggable property for that
object in the Property List window. In a drag-and-drop operation, the object that you drag is
the source object.
To make an object the destination of a drag and drop operation, you must select the
Droppable property for that object in the Property List window. In a drag-and-drop operation,
the object that receives data is the destination object.
By default, newly created objects can be neither dragged nor dropped. It is up to you to set
these properties.
All objects in an input or dialog form can be made to be dragged and dropped. Individual
elements of an array (i.e., scrollable area), items of a hierarchical list or rows in a list box can
be dragged and dropped. Conversely, you can drag and drop an object onto an individual
element of an array or an item of a hierarchical list or a list box row. However, you cannot
drag and drop objects from the detail area of an output form.
You can easily create a drag-and-drop user interface, because 4D allows you to use any type of
active object (field or variable) as source or destination objects. For example, you can drag and
drop a button.
An object that is capable of being both dragged and dropped can also be dropped onto itself,
unless you reject the operation. For details, see the discussion below.
The following figure shows the Property List window with the Droppable and Draggable
properties set for the selected object:
4th Dimension ensures the user interface part of the drag-and-drop capability. If you click on a
draggable object and then drag the mouse, 4D drags the object; it reflects this operation on the
screen with a dotted rectangle that follows the movements of the mouse. In the following
figure, a hierarchical list item is being dragged over a text field:
In the Preferences dialog box, you can set the drag and drop highlight of the destination
object to be a frame or a pattern (or both):
The default highlight is Frame. It is a rectangular, gray, reverse highlight around the object. If
you use colored background or object frames, using this highlight may be confusing. You can
alternatively use the Pattern highlight, which fills the destination object with a diagonal lines
pattern, as shown.
Note: The highlight of the destination object “follows” elements or items when the
destination object is an array (scrollable area), a list box or a hierarchical list.
4th Dimension performs the user interface part of a drag and drop—it is up to you to perform
the programmatical part. To enable you to do so, 4D provides you with two form events:
On Drag Over and On Drop. Both events are sent to the destination object. During a drag-and-
drop operation, the object method of the source object is never involved.
On Drag Over
The On Drag Over event is repeatedly sent to the destination object when the mouse pointer is
moved over the object. In response to this event, you usually:
• Call the DRAG AND DROP PROPERTIES command, which informs you about the source object.
• Depending on the nature and type of both the destination object (whose object method is
currently being executed) and the source object, you accept or reject the drag and drop.
To accept the drag, the destination object method must return 0 (zero), so you write $0:=0.
To reject the drag, the object method must return -1 (minus one), so you write $0:=-1. In this
case, the object is not activated graphically. During an On Drag Over event, 4D treats the
object method as a function. If no result is returned, 4D assumes that the drag is accepted.
If you do not process the On Drag Over event for a droppable object, that object will be
highlighted for all drag over operations, no matter what the nature and type of the dragged
data.
The On Drag Over event is the means by which you control the first phase of a drag-and-drop
operation. Not only can you test whether the dragged data is of a type compatible with the
destination object, and then accept or reject the drag; you can simultaneously notify the user
of this fact, because 4D highlights (or not) the destination object, based on your decision.
The code handling an On Drag Over event should be short and execute quickly, because that
event is sent repeatedly to the current destination object, due to the movements of the mouse.
WARNING: If the drag and drop is an interprocess drag and drop, which means the source
object is located in a process (window) other than that of the destination object, the object
method of the destination object for an On Drag Over event is executed within the context of
the source process (the source object's process), and not in the process of the destination
object. This is the only case in which such an execution occurs. The advantages of this type of
execution are described at the end of this section.
On Drop
The On Drop event is sent once to the destination object when the mouse pointer is released
over the object. This event is the second phase of the drag-and-drop operation, in which you
perform an operation in response to the user action.
This event is not sent to the object if the drag was not accepted during the On Drag Over
events. If you process the On Drag Over event for an object and reject a drag, the On Drop
event does not occur. Thus, if during the On Drag Over event you have tested the data type
compatibility between the source and destination objects and have accepted a possible drop,
you do not need to re-test the data during the On Drop. You already know that the data is
suitable for the destination object.
So, the 4D drag-and-drop interface is a framework which enables you to implement any user
interface metaphor you may devise.
Drag-and-drop commands
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The Drop position command returns the element number of the item position of the target
element or list item, if the destination object is an array (i.e., scrollable area) or a hierarchical
list, as well as the column number if the object is a list box.
Commands like RESOLVE POINTER and Type are useful for testing the nature and type of the
source object.
When the drag-and-drop operation is intended to copy the dragged data, the functionality of
these commands depend on how many processes are involved:
• If the drag and drop is limited to one process, use these commands to perform the
appropriate actions (i.e., simply assigning the source object to the destination object).
• If the drag and drop is an interprocess drag and drop, you need to be careful while getting
access to the dragged data; you must access the data instance from the source process. If the
dragged data comes from a variable, use GET PROCESS VARIABLE to get the right value. If the
dragged data comes from a field, remember that the current record for a table is probably
different for the two processes, so you need to access the right record.
If the drag and drop is not intended to move data, but is instead a user interface metaphor for
a particular operation, you can perform whatever you want.
Text areas in native control (fields, variables and List boxes) allow the “system” drag and drop,
which is the movement or copy of a text selection from one area to another. It can be used in
the same 4D area, between two 4D areas, or between 4D and another application, for example
WordPad. This only works between two text areas that are both in native control.
When system drag and drop is used, the 4th Dimension drag-and-drop management
mechanisms described above are NOT used.
Consequently, the On Drag Over and On Drop form events are NOT generated and the drop
area is not activated as defined in the Preferences.
If you wish to “force” the use of the internal 4th Dimension drag and drop with areas in
native control, hold down the Alt (Windows) or Option (Mac OS) key before performing the
drag and drop.
See Also
DRAG AND DROP PROPERTIES, Drop position, Form event, GET PROCESS VARIABLE, Is a list,
RESOLVE POINTER, Type.
Description
The Drop position command can be used to find out the location, in a “complex” destination
object, where an object has been (dragged and) dropped.
Typically, you will use Drop position when handling a drag and drop event that occurred over
an array, a list box or a hierarchical list.
If you call Drop position when handling an event that is not a drag-and-drop event and that
occurred over an array or a hierarchical list, the command returns -1.
Important: A form object accepts dropped data if its Droppable property has been selected.
Also, its object method must be activated for On Drag Over and/or On Drop, in order to process
these events.
Examples
1. See the examples for the DRAG AND DROP PROPERTIES command.
Case of
:(Form event=On Drag Over)
DRAG AND DROP PROPERTIES($source;$arrayrow;$processnum)
If ($source=Get pointer("SA1")) `If the drop does come from the scrollable area
$0:=0
Else
$0:=-1 `The drop is refused
End if
:(Form event=On Drop)
DRAG AND DROP PROPERTIES($source;$arrayrow;$processnum)
$rownum:=Drop position($colnum)
If ($colnum=1)
BEEP
Else
Case of `Adding of dropped values
: ($colnum=2)
John{$rownum}:=John{$rownum}+SA1{$arrayrow}
: ($colnum=3)
Mark{$rownum}:=Mark{$rownum}+SA1{$arrayrow}
See Also
Drag and Drop, DRAG AND DROP PROPERTIES.
Description
The DRAG AND DROP PROPERTIES command enables you to obtain information about the
source object when an On Drag Over or On Drop event occurs for a “complex” object (array,
list box or hierarchical list).
Typically, you use DRAG AND DROP PROPERTIES from within the object method of the object
(or from one of the subroutines it calls) for which the On Drag Over or On Drop event occurs
(the destination object).
Important: A form object accepts dropped data if its Droppable property has been selected.
Also, its object method must be activated for On Drag Over and/or On Drop, in order to process
these events.
If you call DRAG AND DROP PROPERTIES when there is no drag and drop event, srcObject
returns a NIL pointer, srcElement returns -1 and srcProcess returns 0.
Tip: 4th Dimension automatically handles the graphical aspect of a drag and drop. You must
then respond to the event in the appropriate way. In the following examples, the response is
to copy the data that has been dragged. Alternatively, you can implement sophisticated user
interfaces where, for example, dragging and dropping an array element from a floating
window will fill in the destination window (the window where the destination object is
located) with structured data (i.e., several fields coming from a record uniquely identified by
the source array element).
You use DRAG AND DROP PROPERTIES during an On Drag Over event in order to decide
whether the destination object accepts the drag and drop operation, depending on the type
and/or the nature of the source object (or any other reason). If you accept the drag and drop,
the object method must return $0:=0. If you do not accept the drag and drop, the object
method must return $0:=-1. Accepting or refusing the drag and drop is reflected on the
screen—the object is or is not highlighted as the potential destination of the drag-and-drop
operation.
Examples
1. In several of your database forms, there are scrollable areas in which you want to manually
reorder the elements by simple drag and drop from one part of the scrollable area into another
within it. Rather than writing specific code for each case, you may implement a generic
project method that will handle any one of these scrollable areas. You could write something
like:
Case of
: (Form event=On Drag Over)
DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
If ($vpSrcObj=$1)
` Accept the drag and drop if it is from the array to itself
$0:=0
Else
$0:=-1
End if
: (Form event=On Drop)
` Get the information about the drag and drop source object
DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
` Get the destination element number
$vlDstElem:=Drop position
Once you have implemented this project method, you can use it in the following way:
Case of
`...
: (Form event=On Drag Over)
$0:=Handle self array drag and drop (Self)
: (Form event=On Drop)
Handle self array drag and drop (Self)
` ...
End case
Case of
` Use this event for accepting or rejecting the drag and drop
: (Form event=On Drag Over)
` Initialize $0 for rejecting
$0:=-1
` Get the information about the drag and drop source object
DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
` In this example, we do not allow drag and drop from an object to itself
If ($vpSrcObj # $1)
` Get the type of the data which is being dragged
$vlSrcType:=Type($vpSrcObj->)
Case of
: ($vlSrcType=Is Alpha Field)
` Alphanumeric Field is OK
$0:=0 ` Copy the value now into an IP variable
<>vtDraggedData:=$vpSrcObj->
: ($vlSrcType=Is Text)
` Text Field or Variable is OK
$0:=0
RESOLVE POINTER($vpSrcObj;$vsVarName;$vlTableNum;
$vlFieldNum)
` If it is a field
If (($vlTableNum>0) & ($vlFieldNum>0))
` Copy the value now into an IP variable
<>vtDraggedData:=$vpSrcObj->
End if
` Use this event for performing the actual drag and drop action
: (Form event=On Drop)
$vtDraggedData:=""
` Get the information about the drag and drop source object
DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
RESOLVE POINTER($vpSrcObj;$vsVarName;$vlTableNum;$vlFieldNum)
` If it is field
If (($vlTableNum>0) & ($vlFieldNum>0))
` Just grab the IP variable set during the On Drag Over event
$vtDraggedData:=<>vtDraggedData
Else
` Get the type of the variable which has been dragged
$vlSrcType:=Type($vpSrcObj->)
Case of
` If it is an array
: (($vlSrcType=String array) | ($vlSrcType=Text array))
If ($vlPID # Current process)
` Read the element from the source process instance
` of the variable
GET PROCESS VARIABLE($vlPID;$vpSrcObj->{$vlSrcElem};
$vtDraggedData)
Else
` Copy the array element
$vtDraggedData:=$vpSrcObj->{$vlSrcElem}
End if
End case
Case of
` ...
: (Form event=On Drag Over)
$0:=Handle dropping to text area (Self)
Case of
:(Form event=On Drag Over)
DRAG AND DROP PROPERTIES($source;$arrayrow;$processnum)
If ($source=Get pointer("list box1"))
$0:=0 `The drop is accepted
Else
$0:=-1 `The drag is refused
End if
:(Form event=On Drop)
DRAG AND DROP PROPERTIES($source;$arrayrow;$processnum)
QUERY([Members];[Members]LastName=arrNames{$arrayrow})
If (Records in selection([Members])#0)
label1:=[Members]FirstName+" "+[Members]LastName+Char(Carriage return)+
[Members]Address+Char(Carriage return)+[Members]City+","+" "+
[Members]State+" "+[Members]ZipCode
End if
End case
See Also
Drag and Drop, Drop position, Form event, GET PROCESS VARIABLE, Is a list, RESOLVE POINTER.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
ACCEPT
Description
The ACCEPT command is used in form or object methods (or in subroutines) to:
• accept a new or modified record or subrecord, for which data entry has been initiated using
ADD RECORD, MODIFY RECORD, ADD SUBRECORD, or MODIFY SUBRECORD.
• accept a form displayed with the DIALOG command.
• exit a form displaying a selection of records, using DISPLAY SELECTION or MODIFY
SELECTION.
ACCEPT performs the same action as if a user had pressed the Enter key. After the form is
accepted, the OK system variable is set to 1.
It is also often used in the optional close box method for the Open window command. If there
is a Control-menu box on a window, ACCEPT or CANCEL can be called, in the method to be
executed, when the Control-menu box is double-clicked or the Close menu command is
chosen.
ACCEPT cannot be queued up. In response to an event, executing two ACCEPT commands in a
row from within a method would have the same effect as executing one.
See Also
CANCEL.
CANCEL
Description
The CANCEL command is used in form or object methods (or in a subroutine) to:
• cancel a new or modified record or subrecord, for which data entry has been initiated using
ADD RECORD, MODIFY RECORD, ADD SUBRECORD, or MODIFY SUBRECORD.
• cancel a form displayed with the DIALOG command.
• exit a form displaying a selection of records, using DISPLAY SELECTION or MODIFY SELECTION.
• cancel the printing of a form that is about to be printed using the Print form command (see
below).
In the context of data entry, CANCEL performs the same action as if the user had pressed the
cancel key (Esc).
CANCEL is commonly executed as a result of a menu command being chosen. CANCEL is also
commonly used in the object method of a “no action” button.
It is also often used in the optional close box method for the Open window command. If there
is a Control-menu box on a window, ACCEPT or CANCEL can be called, in the method to be
executed, when the Control-menu box is double-clicked or the Close menu command is
chosen.
CANCEL cannot be queued up. Executing two CANCEL commands in a row from within a
method in response to an event would have the same effect as executing only one.
Finally, this command can be used in the On Printing Detail form event, when using the Print
form command. In this context, the CANCEL command suspends the printing of the form that
is about to be printed, then resumes it on the next page. This mechanism can be used to
manage form printing when there is a lack of space or if a page break is required.
Note: This operation differs from that of the PAGE BREAK(*) command that cancels ALL the
forms waiting to be printed.
See Also
ACCEPT, PAGE BREAK, Print form.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Keystroke → String
Description
Keystroke returns the character entered by the user into a field or an enterable area.
Usually, you will call Keystroke within a form or object method while handling an On Before
Keystroke event form. To detect keystroke events, use the command Form event.
To replace the character actually entered by the user with another character, use the command
FILTER KEYSTROKE.
IMPORTANT NOTE: If you want to perform some “on the fly” operations depending on the
current value of the enterable area being edited, as well as the new character to be entered,
remember that the text you see on screen is NOT YET the value of the data source field or
variable for the area being edited. The data source field or variable is assigned the entered
value after the data entry for the area is validated (e.g., tabulation to another area, click on a
button, and so on). It is therefore up to you to “shadow” the data entry into a variable and
then to work with this shadow value. You must do so if you need to know the current text
value for executing any particular actions. You can also use the function Get edited text.
Examples
1. See examples for the command FILTER KEYSTROKE.
C_POINTER ($1;$2)
C_TEXT ($vtNewValue)
After this project method is added to your application, you can use it as follows:
` myObject enterable area object method
Case of
: (Form event=On Load)
MyObject:=""
MyShadowObject:=""
See Also
FILTER KEYSTROKE, Form event, Get edited text.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
FILTER KEYSTROKE enables you to replace the character entered by the user into a field or an
enterable area with the first character of the string filteredChar you pass.
Usually, you will call FILTER KEYSTROKE within a form or object method while handling an On
Before Keystroke form event. To detect keystroke events, use the command Form event. To
obtain the actual keystroke, use the command Keystroke.
IMPORTANT NOTE: The command FILTER KEYSTROKE allows you to cancel or replace the
character entered by the user with another character. On the other hand, if you want to insert
more than one character for a specific keystroke, remember that the text you see on the screen
is NOT YET the value of the data source field or variable for the area being edited. The data
source field or variable is assigned the entered value after the data entry for the area is
validated. It is therefore up to you to “shadow” the data entry into a variable and then to work
with this shadow value and reassign the enterable area (see the example in this section).
WARNING: If you call the command Keystroke after calling FILTER KEYSTROKE, the character
you pass to this command is returned instead of the character actually entered.
All the digits entered in the area myObject are transformed into star characters.
2. This code implements the behavior of a Password enterable area in which all the entered
characters are replaced (on the screen) by random characters:
` vsPassword enterable area object method
Case of
: (Form event=On Load )
vsPassword:=""
vsActualPassword:=""
: (Form event=On Before Keystroke )
Handle keystroke (->vsPassword;->vsActualPassword)
If (Position(Keystroke;Char(Backspace )+Char(Left Arrow Key )+
Char(Right Arrow Key )+Char(Up Arrow Key )+Char(Down Arrow Key ))=0)
FILTER KEYSTROKE(Char(65+(Random%26)))
End if
End case
After the data entry is validated, you retrieve the actual password entered by the user in the
variable vsActualPassword. Note: The method Handle keystroke is listed in the Example section
for the command Keystroke.
3. In your application, you have some text areas into which you can enter a few sentences.
Your application also includes a dictionary table of terms commonly used throughout your
database. While editing your text areas, you would like to be able to quickly retrieve and insert
dictionary entries based on the selected characters in a text area. You have two ways to do this:
- Provide some buttons with associated keys, or
- Intercept special keystrokes during the editing of the text area
As explained above, during the editing of the text area, the data source for this area will be
assigned the entered value after you validate the data entry. In order to retrieve and insert
dictionary entries into the text area while this area is being edited, you therefore need to
shadow the data entry. You pass pointers to the enterable area and the shadow variable as the
first two parameters, and you pass a string of the “forbidden” characters as the third
parameter. No matter how the keystroke will be treated, the method returns the original
keystroke. The “forbidden” characters are those that you do not want to be inserted into the
enterable area and you want to treat as special characters.
The LOOKUP DICTIONARY project method is listed below. Its purpose is to use the shadow
variable for reassigning the enterable area being edited:
` LOOKUP DICTIONARY project method
` LOOKUP DICTIONARY ( Pointer ; Pointer )
` LOOKUP DICTIONARY ( -> Enterable Area ; ->ShadowVariable )
C_POINTER($1;$2)
C_LONGINT($vlStart;$vlEnd)
` Get the text selection range within the enterable area
GET HIGHLIGHT($1->;$vlStart;$vlEnd)
` Get the selected text or the word on the left of the text cursor
$vtHighlightedText:=Get highlighted text ($2->;$vlStart;$vlEnd)
` Is there something to look for?
If ($vtHighlightedText#"")
` If the text selection was the text cursor,
` the selection now starts at the word preceeding the text cursor
If ($vlStart=$vlEnd)
$vlStart:=$vlStart-Length($vtHighlightedText)
End if
See Also
Form event, Get edited text, Keystroke.
Description
The GOTO AREA command is used to select the data entry object object as the active area of the
form. It is equivalent to the user’s clicking on or tabbing into the field or variable.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, specify a
field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
Note: This command only functions in input forms. It has no effect on data entry areas
located in subform List forms.
Examples
1. The GOTO AREA command can be used in both ways:
See Also
REJECT.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
REJECT {(field)}
Description
REJECT has two forms. The first form has no parameters. It rejects the entire data entry and
forces the user to stay in the form. The second form rejects only the field and forces the user to
stay in the field.
Note: You should consider the built-in data validation tools before using this command.
The first form of REJECT prevents the user from accepting a record that is not complete. You
can achieve the same result without using REJECT—you associate the Enter key with a No
Action button and use the ACCEPT and CANCEL commands to accept or cancel the record,
after the fields have been entered correctly. It is recommended that you use this second
technique and do not use the first form of REJECT.
If you use the first form, you execute REJECT to prevent the user from accepting a record,
usually because the record is not complete or has inaccurate entries. If the user tries to accept
the record, executing REJECT prevents the record from being accepted; the record remains
displayed in the form. The user must continue with data entry until the record is acceptable,
or cancel the record.
The best place to put this form of REJECT is in the object method of an Accept button
associated with the Enter key. This way, validation occurs only when the record is accepted,
and the user cannot bypass the validation by pressing the Enter key.
The second form of REJECT is executed with the field parameter. The cursor stays in the field
area. This form of REJECT forces the user to enter a correct value. It must be used immediately
following a modification to the field. You can test for modification by using the Modified
function. You can also use REJECT in the object method for the data entry area. This command
has no effect on fields in subform areas.
You can use HIGHLIGHT TEXT to select the data in the field that is being rejected.
Examples
1. The following example is for a bank transaction record. It shows the first form of REJECT
being used in an Accept button object method. The Enter key is set as an equivalent for the
button. This means that even if the user presses the Enter key to accept the record, the
button’s object method will be executed. If the transaction is a check, then there must be a
check number. If there is no check number, the validation is rejected:
Case of
` If it is a check with no number...
: (([Operation]Transaction="Check") & ([Operation]Check Number = ""))
ALERT ("Please fill in the check number.") ` Alert the user
REJECT ` Reject the entry
GOTO AREA ([Operation]Check Number) ` Go to the check number field
End case
2. The following example is part of an object method for an [Employees]Salary field. The object
method tests the [Employees]Salary field and rejects the field if it is less than $10,000. You
could perform the same operation by specifying a minimum value for the field in the form
editor:
If ([Employees]Salary<10000)
ALERT ("Salary must be greater than $10,000")
REJECT ([Employees]Salary)
End if
See Also
ACCEPT, CANCEL, GOTO AREA.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The EDIT ITEM command allows you to edit the current item or the item number item in
the array or the list set in the object parameter.
This means that the selected item can be modified; entering a character entirely replaces
the item content.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (in this case, pass a string in object). If you do not pass the parameter, you indicate
that the object parameter is a table or a variable. In this case, you do not pass a string but a
table or a variable reference.
If the command is used with an enterable object that is not a list, it then acts the same as
the GOTO AREA command.
The command does nothing if the list or the array is empty or invisible. Also, if the list or
the array is not enterable, the command only selects the specified item without changing
to editing mode. Regarding list boxes, if the column does not allow text entry (entry by
check boxes or drop-down lists only), the specified element gets the focus.
The optional item parameter allows you to set the position of the item (hierarchical list) or
the row number (list box, list forms and subform in “multiple selection” mode) to change
to editing mode. If you do not pass this parameter, the command is applied to the current
item for object. If there is no current item, the first item of object changes to editing mode.
Examples
1. This command can be particularly useful when creating a new item in a hierarchical list.
When the command is called, the last item added or inserted in the list automatically
becomes editable without the user having to do anything.
The following code may be the method of a button that allows you to insert a new item in
an existing list. The default text “New_item” is automatically ready to be changed:
vlUniqueRef:=vlUniqueRef+1
INSERT LIST ITEM(hList;*;"New_item";vlUniqueRef)
EDIT ITEM(*;"MyList")
2. Given two columns in a list box whose variable names are “Array1” and “Array2”
respectively. The following example inserts a new item in the two arrays and passes the
new item of Array2 into editing mode:
$vlRowNum:=Size of array(Array1)+1
INSERT LISTBOX ROW(*;"MyListBox";$vlRowNum)
Array1{$vlRowNum}:="New value 1"
Array2{$vlRowNum}:="New value 2"
EDIT ITEM(Array2;$vlRowNum)
LAST SUBRECORD([Children])
EDIT ITEM(*;"Subform")
See Also
GOTO AREA, INSERT LIST ITEM, SET LIST ITEM.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Overview
This theme contains commands that allow 4th Dimension to access, via standard protocols,
data stored in other applications. In the current version of 4th Dimension, only ODBC
commands are available.
Note: 4th Dimension also allows data to be imported from and exported to an ODBC
source in User mode. For more information, please refer to the 4th Dimension User Reference
manual.
The high-level ODBC commands in the “External Data Source” theme of 4th Dimension
can be used to implement simple solutions allowing 4th Dimension applications to
communicate with ODBC data sources. If your applications require more extensive support
of ODBC standards, you will need to have the “low level” ODBC plug-in for 4D, 4D ODBC
Pro.
Direct association requires the 4D object to be used (variable, array or field) to be inserted
between the << and >> characters in the text of the request. For example:
INSERT INTO emp (empnum,ename) VALUES (<<vEmpnum>>,<<vEname>>)
In this example, the current values of the 4D vEmpnum and vEname variables will replace
the parameters when the request is executed. This solution also works with 4D fields and
arrays.
This easy-to-use syntax nevertheless has the drawback of not being compliant with the SQL
standard and of not allowing the use of output parameters. To remedy this, you can use the
ODBC SET PARAMETER command. This command can be used to set each 4D object to be
integrated into a request as well as its mode of use (input, output or both). The syntax
produced is thus standard. For more information, please refer to the description of the
ODBC SET PARAMETER command.
ARRAY TEXT(MyTextArray;10)
ARRAY LONGINT(MyLongintArray;10)
For(vCounter;1;Size of array(MyTextArray))
MyTextArray{vCounter}:="Text"+String(vCounter)
MyLongintArray{vCounter}:=vCounter
End for
ODBC LOGIN("mysql";"root";"")
SQLStmt:="insert into app_testTable (alpha_field, longint_field) VALUES
(<<MyTextArray>>, <<MyLongintArray>>)"
ODBC EXECUTE(SQLStmt)
2. This example can be used to execute an ODBC request that directly uses the associated
4D fields:
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ODBC LOGIN command allows you to connect to an external ODBC data source.
The dataEntry parameter contains the name of the data source as entered in the ODBC
driver manager.
userName contains the name of the user authorized to connect to the external data source.
For example, with Oracle®, the user name can be “Scott”.
password contains the password of the user authorized to connect to the external data
source. For example, with Oracle®, the password can be “tiger”.
These parameters are optional; if no parameters are passed, the command will bring up the
ODBC Manager dialog box that allows you to select the external data source:
Examples
1. This statement will bring up the ODBC Manager dialog box:
ODBC LOGIN
2. This statement will connect to the ODBC data source named “MyOracle” using
Scott/tiger as the name/password :
ODBC LOGIN("MyOracle";"Scott";"tiger")
See Also
ODBC LOGOUT.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
ODBC LOGOUT
Description
The ODBC LOGOUT command closes the connection of the current process (if applicable).
If there is no connection, the command does nothing.
See Also
ODBC LOGIN.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ODBC SET OPTION command is used to modify the value of the option passed in
option.
option can have one of the following values, located in the “External Data Source” theme:
Constant Description and possible values
OBDC Asynchronous (1) 0 = Synchronous connection (default value),
1 (or value other than 0) = Asynchronous connection
ODBC Max Rows (2) Maximum number of rows in resulting group
(used for previews)
ODBC Max Data Length (3) Maximum length of data returned
ODBC Query Time Out (4) Maximum timeout awaiting response when executing
the ODBC EXECUTE command.
Values: time in seconds
By default: no timeout
ODBC Connection Time Out (5) Maximum timeout awaiting response when executing
the ODBC LOGIN command.
This value must be set before opening the connection
in order to be taken into account
Possible values: time in seconds
By default: no timeout
See Also
ODBC GET OPTION.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ODBC GET OPTION command returns the current value of the option passed in option.
For more information on the different options and their associated values, refer to the
description of the ODBC SET OPTION command.
See Also
ODBC SET OPTION.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ODBC EXECUTE command is used to execute an SQL command and to bind the result
to 4D objects (arrays, variables or fields).
A valid connection is required in the current process in order to execute this command.
The sqlStatement parameter contains the SQL command to execute. boundObj receives the
results. Variables are bound in the column sequence order, which means that any
remaining remote columns are discarded.
If 4D fields are passed as parameters in boundObj, the command will create records and
save them automatically. 4D fields must come from the same table (a field from table 1 and
a field from table 2 cannot be passed in the same call). If fields from more than one table
are passed, an error is generated.
If you pass 4D arrays in the boundObj parameter(s), it is advisable to declare them before
calling the command in order to check the type of data processed. Arrays are automatically
resized when necessary.
With a 4D variable, one record is fetched at a time. The other results are ignored.
Examples
1. In this example, we will get the ename column of the emp table of the external data
source. The result is stored in the [Employee]Name 4D field. 4D records will be created
automatically:
ODBC LOGIN("mysql";"root";"")
SQLStmt:="SELECT alpha_field FROM app_testTable"
START TRANSACTION
ODBC EXECUTE(SQLStmt;[Table 2]Field1)
While(Not(ODBC End Selection))
ODBC LOAD RECORD
... `Place the data validation code here
End while
VALIDATE TRANSACTION `Validation of the transaction
3. In this example, we want to get the ename column of the emp table of the external data
source. The result will be stored in an aName array. We fetch records 10 at a time.
ARRAY STRING(30;aName;20)
SQLStmt:="SELECT ename FROM emp"
ODBC EXECUTE(SQLStmt;aName)
While(Not(ODBC End Selection))
ODBC LOAD RECORD(10)
End while
4. In this example, we want to get the ename and job of the emp table for a specific ID
(WHERE clause) of the external data source. The result will be stored in the vName and vJob
4D variables. Only the first record is fetched.
See Also
ODBC LOAD RECORD.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ODBC End selection command is used to determine if the boundaries of the result set
have been reached.
Example
The code below connects to an external data source (Oracle) using the following parameters:
C_TEXT(vName)
ODBC LOGIN("TestOracle";"scott";"tiger")
If (OK=1)
ODBC EXECUTE("SELECT ename FROM emp";vName)
While(Not(ODBC End selection))
ODBC LOAD RECORD
End while
ODBC LOGOUT
End if
This code will return in the 4D vName variable the emp names (ename) stored in the table
named emp.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ODBC LOAD RECORD command retrieves one or more record(s) in 4th Dimension
coming from the ODBC source open in the current connection.
The optional numRecords parameter is used to set the number of records to retrieve:
• If you omit this parameter, the command will retrieve the current record from the data
source. This principle corresponds to the retrieval of data in a loop where one record is
received at a time.
• If you pass an integer value in numRecords, the command will retrieve numRecords
records.
• If you pass the ODBC All Records constant (value -1), the command will retrieve all the
records of the table.
Note: These last two parameters are only meaningful if the data retrieved are associated
with arrays or with 4D fields.
See Also
ODBC CANCEL LOAD, ODBC EXECUTE.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ODBC CANCEL LOAD command ends the current SELECT request and initializes the
parameters.
This command is used to execute several SELECT requests within the same connection (i.e.
the same cursor) initiated by the ODBC LOGIN command.
Example
In this example, two requests are executed in the same connection:
C_BLOB(Myblob)
C_TEXT(MyText)
ODBC LOGIN("mysql";"root";"")
`Resetting of cursor
ODBC CANCEL LOAD
See Also
ODBC LOAD RECORD, ODBC LOGIN.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ODBC SET PARAMETER command allows the use of a 4D variable, array or field value in
ODBC requests.
Note: It is also possible to directly insert the name of a 4D object to be used (variable, array
or field) between the << and >> characters in the text of the request (see example 1). For
more information about this, please refer to the External Data Source Commands section.
- In the object parameter, pass the 4D object (variable, array or field) to be used in the
request.
- In the paramType parameter, pass the SQL type of the parameter. You can pass a value or
use one of the following constants, located in the “External Data Source” theme:
Constant Type Value
OBDC Param In Longint 1
OBDC Param In Out Longint 2
OBDC Param Out Longint 4
The value of the 4D object replaces the ? character in the SQL request (standard syntax).
If the request contains more than one ? character, several calls to ODBC SET PARAMETER will
be necessary. The values of the 4D objects will be assigned sequentially in the request, in
accordance with the execution order of the commands.
Examples
1. This example is used to execute an ODBC request which calls the associated 4D variables
directly:
C_TEXT(MyText)
C_LONGINT(MyLongint)
ODBC LOGIN("mysql";"root";"")
SQLStmt:="insert into app_testTable (alpha_field, longint_field) VALUES (<<MyText>>,
<<MyLongint>>)"
C_TEXT(MyText)
C_LONGINT(MyLongint)
ODBC LOGIN("mysql";"root";"")
SQLStmt:="insert into app_testTable (alpha_field, longint_field) VALUES (?,?)"
For (vCounter;1;10)
MyText:="Text"+String(vCounter)
MyLongint:=vCounter
ODBC SET PARAMETER(MyText;ODBC Param In)
ODBC SET PARAMETER(MyLongint;ODBC Param In)
ODBC EXECUTE(SQLStmt)
End for
3. This example is used to execute an ODBC request which uses the associated 4D arrays
directly:
ARRAY TEXT(MyTextArray;10)
ARRAY LONGINT(MyLongintArray;10)
For (vCounter;1;Size of array(MyTextArray))
MyTextArray{vCounter}:="Text"+String(vCounter)
MyLongintArray{vCounter}:=vCounter
End for
ODBC LOGIN("mysql";"root";"")
SQLStmt:="insert into app_testTable (alpha_field, longint_field) VALUES
(<<MyTextArray>>, <<MyLongintArray>>)"
ODBC EXECUTE(SQLStmt)
4. This example is used to execute an ODBC request which uses the associated 4D fields
directly:
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ODBC GET LAST ERROR command returns information related to the last error
encountered during the execution of an ODBC command. The error may come from the
4th Dimension application, the network, the ODBC source, etc.
The last two parameters are only filled when the error comes from the ODBC source;
otherwise, they are returned empty.
• The errODBC parameter returns the ODBC error code (SQL state).
• The errSQLServer parameter returns the SQL server native error code.
See Also
ON ERR CALL.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ODBC IMPORT command is used to import data from the sourceTable table of an
external ODBC source. The connection parameters (source name, user and password) are
included in the project BLOB.
Notes:
• The project contains all the import parameters, in particular the data source and target
tables and fields. You set these parameters in the ODBC import dialog box, then you can
save them in a file on disk if necessary. For more information, refer to the User Reference
manual.
• The projects generated in the ODBC import dialog box are not compatible with the
commands or the standard import dialog box of 4th Dimension.
If you do not pass the optional project parameter, ODBC IMPORT displays a dialog box for
selecting the ODBC data source:
Windows
Once you have selected the source, the 4th Dimension ODBC import dialog box appears,
allowing the user to configure the operation. If the user clicks Cancel in either of the two
dialog boxes, execution is stopped and the system variable OK is set to 0.
If you pass a BLOB containing a valid ODBC import project in the project parameter, the
import will be carried out directly, without any user intervention. To do this, you simply
need to load a project that has been saved on disk beforehand into the field or the BLOB
variable that you pass in the project parameter, using the DOCUMENT TO BLOB command.
You can also use the ODBC IMPORT command with an empty project parameter and the
optional * parameter, then store the project parameter in a BLOB field (see below). On the
one hand, this solution lets you store the project with the data file and, on the other, to
avoid the phase of loading it from the disk into a BLOB.
Note: Refer to the EXPORT DATA command for an example concerning the definition of an
empty project.
The optional * parameter, if it is set, displays the ODBC data import dialog box with the
settings defined in project (if any). This allows you to use a predefined project while still
being able to modify one or more parameters. Moreover, in this case, the project parameter
contains the parameters of the “new” project after the dialog box is closed. You can then
store it in a BLOB field, in a file on disk, etc.
See Also
ODBC EXPORT.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ODBC EXPORT command is used to export data in the sourceTable table of an external
ODBC source. The connection parameters (source name, user and password) are included in
the project BLOB.
Notes:
• The project contains all the export parameters, in particular the data source and the
exported tables and fields. You set these parameters in the ODBC export dialog box, then
you can save them in a file on disk if necessary. For more information, refer to the User
Reference manual.
• The projects generated in the ODBC export dialog box are not compatible with the
commands or the standard export dialog box of 4th Dimension.
If you do not pass the optional project parameter, ODBC EXPORT displays a dialog box for
selecting the ODBC data source:
Windows
Once you have selected the source, the 4th Dimension ODBC export dialog box appears,
allowing the user to configure the operation. If the user clicks Cancel in either of the two
dialog boxes, execution is stopped and the system variable OK is set to 0.
If you pass a BLOB containing a valid ODBC export project in the project parameter, the
export will be carried out directly, without any user intervention. To do this, you simply
need to load a project that has been saved on disk beforehand into the field or the BLOB
variable that you pass in the project parameter, using the DOCUMENT TO BLOB command.
You can also use the ODBC EXPORT command with an empty project parameter and the
optional * parameter, then store the project parameter in a BLOB field (see below). On the
one hand, this solution lets you store the project with the data file and, on the other, to
avoid the phase of loading it from the disk into a BLOB.
Note: Refer to the EXPORT DATA command for an example concerning the definition of an
empty project.
The optional * parameter, if it is set, displays the ODBC data export dialog box with the
settings defined in project (if any). This allows you to use a predefined project while still
being able to modify one or more parameters. Moreover, in this case, the project parameter
contains the parameters of the “new” project after the dialog box is closed. You can then
store it in a BLOB field, in a file on disk, etc.
See Also
ODBC IMPORT.
Description
Form event returns a numeric value identifying the type of form event that has just occurred.
Usually, you will use Form event from within a form or object method.
4th Dimension provides predefined constants (found in the “Form Events” theme) in order to
compare the values returned by the Form event command.
Certain events are generic (generated for any type of object) and others are specific to a
particular type of object.
Generic events
The following events can be generated for any form or object:
List box
The following events are only generated for List boxes:
Constant Value Description
On Before Data Entry 41 A list box cell is about to change to editing mode
On Column Moved 32 A list box column is moved by the user via drag and drop
On Row Moved 34 A list box row is moved by the user via drag and drop
On Column Resize 33 The width of a list box column is modified
On Header Click 42 A click occurs in a column header of the list box
On After Sort 30 A standard sort has just been carried out in a list box column
Hierarchical lists
The following events are only generated for hierarchical lists:
Constant Value Description
On Expand 43 An element of the hierarchical list has been expanded using a
click or a keystroke
On Collapse 44 An element of the hierarchical list has been collapsed using a click
or a keystroke
When a form event occurs, 4th Dimension performs the following actions:
• First, it browses the objects of the form and calls the object method for any object (involved
in the event) whose corresponding object event property has been selected.
• Second, it calls the form method if the corresponding form event property has been selected.
Do not assume that the object methods, if any, will be called in a particular order. The rule of
thumb is that the object methods are always called before the form method. If an object is a
subform, the object methods of the subform’s list form are called, then the form method of
the list form is called. 4D then continues to call the object methods of the parent form. In
other words, when an object is a subform, 4D uses the same rule of thumb for the object and
form methods within the subform object.
Except for the On Load and On Unload events, if the form event property is not selected for a
given event, this does not prevent calls to object methods for the objects whose same event
property is selected. In other words, enabling or disabling an event at the form level has no
effect on the object event properties.
The number of objects involved in an event depends on the nature of the event:
• On Load event - All the objects of the form (from any page) whose On Load object event
property is selected will have their object method called. Then, if the On Load form event
property is selected, the form will have its form method called.
WARNING: Unlike all other events, during an On Drag over event, the object method for an
object is executed in the context of the process of the drag and drop source object, not in the
context of the process of the drag and drop destination object. For more information, see the
DRAG AND DROP PROPERTIES and Drag and drop position commands.
• If the On Mouse Enter, On Mouse Move and On Mouse Leave events have been checked for
the form, they are generated for each form object. If they are checked for an object, they are
generated only for that object. When there are superimposed objects, the event is generated by
the first object capable of managing it that is found going in order from top level to bottom.
Objects that are made invisible using the SET VISIBLE command do not generate these events.
During object entry, other objects may receive these type of events depending on the position
of the mouse.
• Records in list: The sequence of calls to methods and form events in the list forms displayed
via MODIFY SELECTION / DISPLAY SELECTION and the subforms is as follows:
For each object in the header area:
Object method with On Header event
Form method with On Header event
For each record:
For each object in the detail area:
Object method with On Display Detail event
Form method with On Display Detail event
Calling a 4D command that displays a dialog box from the On Display Detail and On Header
events is not allowed and will cause a syntax error to occur.
More particularly, the commands concerned are: ALERT, DIALOG, CONFIRM, Request, ADD
RECORD, MODIFY RECORD, DISPLAY SELECTION and MODIFY SELECTION.
(*) For more infomation, see the "Events, Objects and Properties" section below.
(**) Only list box, hierarchical list and subform type objects support this event.
IMPORTANT: Always keep in mind that, for any event, the method of a form or an object is
called if the corresponding event property is selected for the form or objects. The benefit of
disabling events in the Design environment (using the Property List of the Form editor) is that
you can greatly reduce the number of calls to methods and therefore significantly optimize
the execution speed of your forms.
WARNING: The On Load and On Unload events are generated for objects if they are enabled for
both the objects and the form to which the objects belong. If the events are enabled for
objects only, they will not occur; these two events must also be enabled at the form level.
An object method is called if the event can actually occur for the object, depending on its
nature and properties. The following section details the events you will generally use to
handle the various types of objects.
Keep in mind that the Property List of the Form editor only displays the events compatible
with the selected object or the form.
Clickable Objects
Clickable objects are mainly handled using the mouse. They include:
• Boolean enterable fields or variables
• Buttons, default buttons, radio buttons, check boxes, button grids
• 3D Buttons, 3D radio buttons, 3D check boxes
• Pop-up menus, hierarchical pop-up menus, picture menus
• Drop-down lists, menus/drop-down lists
• Scrollable areas, hierarchical lists, list boxes
• Invisible buttons, highlight buttons, radio pictures
• Thermometers, rulers, dials (also known as slider objects)
• Tab controls
• Splitters.
After the On Clicked or On Double Clicked object event property is selected for one of these
objects, you can detect and handle the clicks within or on the object, using the Form event
command that returns On Clicked or On Double Clicked, depending on the case.
For all these objects, the On Clicked event occurs once the mouse button is released. However,
there are several exceptions:
• Invisible buttons - The On Clicked event occurs as soon as the click is made and does not
wait for the mouse button to be released.
• Slider objects (thermometers, rulers, and dials) - If the display format indicates that the
object method must be called while you are sliding the control, the On Clicked event occurs as
soon as the click is made.
Note: Some of these objects can be activated with the keyboard. For example, once a check
box gets the focus, it can be entered using the space bar. In such a case, an On Clicked event is
still generated.
WARNING: Combo boxes are not considered to be clickable objects. A combo box must be
treated as an enterable text area whose associated drop-down list provides default values.
Consequently, you handle data entry within a combo box through the On Before Keystroke,
On After Keystroke and On Data Change events.
Note: Even though they are “enterable” objects, hierarchical lists do not manage the On After
Edit, On Before Keystroke and On After Keystroke form events (see also the “Hierarchical lists”
paragraph below).
Note: Beginning with version 2004.2 of 4th Dimension, the On After Keystroke event can
generally be replaced by the On After Edit event (see below).
• On After Edit
When it is used, this event is generated after each change made to the contents of an enterable
object, regardless of the action that caused the change, i.e.:
- Standard editing actions which modify content like paste, cut, delete or cancel;
- Dropping a value (action similar to paste);
- Any keyboard entry made by the user; in this case, the On After Edit event is generated after
the On Before Keystroke and On After Keystroke events, if they are used.
- Any modification made using a language command that simulates a user action (i.e., POST
KEY).
Be aware that the following actions do NOT trigger this event:
- Editing actions that do not modify the contents of the area like copy or select all;
- Dragging a value (action similar to copy);
- Any modifications made to the contents by programming, except for the commands
simulating a user action.
This event can be used to control user actions in order, for example, to prevent the pasting in
of text that is too long, to block certain characters or to prevent a password field from being
cut.
Modifiable Objects
Modifiable objects have a data source whose value can be changed using the mouse or the
keyboard; they are not truly considered as user interface controls handled through the On
Clicked event. They include:
• All enterable field objects (except subtables and BLOBs)
• All enterable variables (except BLOBs, pointers, and arrays)
• Combo boxes
• External objects (for which full data entry is accepted by the plug-in)
• Hierarchical lists
• List boxes.
Tabbable Objects
Tabbable objects get the focus when you use the Tab key to reach them and/or click on them.
The object having the focus receives the characters (typed on the keyboard) that are not
accelerators (Windows) or shortcuts (Mac OS) to a menu item or to an object such as a button.
All objects are tabbable, EXCEPT the following:
• Non-enterable fields or variables
• Button grids
• 3D buttons, 3D radio buttons, 3D check boxes
• Pop-up menus, hierarchical pop-up menus
• Menus/drop-down lists
• Picture menus
• Scrollable areas
• Invisible buttons, highlight buttons, radio picture buttons
• Graphs
• External objects (for which full data entry is accepted by the 4D plug-in)
• Tab controls
• Splitters.
After the On Getting Focus and/or On losing Focus object event properties are selected for a
tabbable object, you can detect and handle the change of focus, using the Form event
command that will return On Getting Focus or On losing Focus, depending on the case.
3D buttons
3D buttons let you set up advanced graphic interfaces (for a description of 3D buttons, refer to
the Design Reference manual). In addition to generic events, two specific events can be used to
manage these buttons:
• On Long Click: This event is generated when a 3D button receives a click and the mouse
button is held for a certain length of time. In theory, the length of time for which this event is
generated is equal to the maximum length of time separating a double-click, as defined in the
system preferences.
This event can be generated for all styles of 3D buttons, 3D radio buttons and 3D check boxes,
with the exception of “previous generation” 3D buttons (i.e. background offset style) and
arrow areas of 3D buttons with a pop-up menu (see below).
The following 3D button, 3D radio button and 3D check box styles accept the “With pop-up
menu” property: None, Toolbar button, Bevel, Rounded bevel and Office XP.
List boxes
Seven form events can be used to manage various specific features of list boxes:
• On Before Data Entry: This event is generated just before a cell in the list box is edited (before
the entry cursor is displayed). This event allows the developer, for example, to display a
different text depending on whether the user is in the display or edit mode.
• On Selection Change: This event is generated each time the current selection of rows or
columns of the list box is modified. This event is also generated for lists of records and
hierarchical lists.
• On Column Moved: This event is generated when a column of the list box is moved by the
user using drag and drop. It is not generated if the column is dragged and then dropped in its
initial location. The MOVED LISTBOX COLUMN NUMBER command returns the new position of
the column.
Hierarchical lists
In addition to generic events, three specific events can be used to handle user actions
performed on hierarchical lists:
• On Selection Change: This event is generated every time the selection in the hierarchical list
is modified after a mouse click or keystroke.
This event is also generated in list box objects and record lists.
• On Expand: This event is generated every time an element of the hierarchical list is expanded
with a mouse click or keystroke.
• On Collapse: This event is generated every time an element of the hierarchical list is
collapsed with a mouse click or keystroke.
These events are not mutually exclusive. They can be generated one after another for a
hierarchical list:
- Following a keystroke (in order):
Event Context
On Data Change Element was edited
On Expand/On Collapse Opening/Closing of a sublist using the -> or <-
arrow keys
Examples
In all the examples discussed here, it is assumed that the event properties of the forms and
objects have been selected appropriately.
1. This example sorts a selection of subrecords for the subtable [Parents]Children before a form
for the [Parents] table is displayed on the screen:
2. This example shows the On Validate event being used to automatically assign (to a field) the
date that the record is modified:
` Method of a form
Case of
` ...
: (Form event=On Validate)
[aTable]Last Modified On:=Current date
End case
4. This example shows how, in an object method, to accept and later handle a drag and drop
operation for a field object that only accepts picture values.
Note: For other examples showing how to handle On Drag Over and On Drop events, see the
examples of the DRAG AND DROP PROPERTIES command.
5. This example is a template for a form method. It shows each of the possible events that can
occur when a summary report uses a form as an output form:
` Method of a form being used as output form for a summary report
$vpFormTable:=Current form table
Case of
` ...
: (Form event=On Header)
` A header area is about to be printed
Case of
: (Before selection($vpFormTable->))
` Code for the first break header goes here
: (Level = 1)
` Code for a break header level 1 goes here
: (Level = 2)
` Code for a break header level 2 goes here
` ...
End case
: (Form event=On Printing Detail)
` A record is about to be printed
` Code for each record goes here
: (Form event=On Printing Break)
` A break area is about to be printed
Case of
: (Level = 0)
` Code for a break level 0 goes here
: (Level = 1)
` Code for a break level 1 goes here
` ...
End case
6. This example shows the template of a form method that handles the events that can occur
for a form displayed using the DISPLAY SELECTION or MODIFY SELECTION commands. For
didactic purposes, it displays the nature of the event in the title bar of the form window.
` A form method
Case of
: (Form event=On Load)
$vsTheEvent:="The form is about to be displayed"
: (Form event=On Unload)
$vsTheEvent:="The output form has been exited and is about to disappear from the
screen"
: (Form event=On Display Detail)
$vsTheEvent:="Displaying record #"+String(Selected record number([TheTable]))
: (Form event=On Menu Selected)
$vsTheEvent:="A menu item has been selected"
: (Form event=On Header")
$vsTheEvent:="The header area is about to be drawn"
: (Form event=On Clicked")
$vsTheEvent:="A record has been clicked"
: (Form event=On Double Clicked")
$vsTheEvent:="A record has been double clicked"
: (Form event=On Open Detail)
$vsTheEvent:="The record #"+String(Selected record number([TheTable]))+
" is double-clicked"
: (Form event=On Close Detail)
$vsTheEvent:="Going back to the output form"
: (Form event=On Activate)
$vsTheEvent:="The form's window has just become the frontmost window"
: (Form event=On Deactivate)
$vsTheEvent:="The form's window is no longer the frontmost window"
: (Form event=On Menu Selected)
$vsTheEvent:="A menu item has been chosen"
7. For examples on how to handle On Before Keystroke and On After Keystroke events, see
examples for the Get edited text, Keystroke and FILTER KEYSTROKE commands.
8. This example shows how to treat clicks and double clicks in the same way in a scrollable
area:
9. This example shows how to treat clicks and double clicks using a different response. Note
the use of the element zero for keeping track of the selected element:
` asChoices scrollable area object method
Case of
: (Form event=On Load)
ARRAY STRING (...;asChoices;...)
` ...
asChoices:=0
asChoices{0}:="0"
10. This example shows how to maintain a status text information area from within a form
method, using the On Getting Focus and On losing Focus events:
` [Contacts];"Data Entry" form method
Case of
: (Form Event=On Load)
C_TEXT(vtStatusArea)
vtStatusArea:=""
: (Form Event=On Getting Focus)
RESOLVE POINTER (Focus object;$vsVarName;$vlTableNum;$vlFieldNum)
If (($vlTableNum#0) & ($vlFieldNum#0))
Case of
: ($vlFieldNum=1) ` Last name field
vtStatusArea:="Enter the Last name of the Contact; it will be capitalized
automatically"
` ...
: ($vlFieldNum=10) ` Zip Code field
vtStatusArea:="Enter a 5-digit zip code; it will be checked and validated
automatically"
` ...
End case
End if
11. This example shows how to respond to a close window event with a form used for record
data entry:
` Method for an input form
$vpFormTable:=Current form table
Case of
` ...
: (Form Event=On Close Box)
If (Modified record($vpFormTable->))
CONFIRM ("This record has been modified. Save Changes?")
If (OK=1)
ACCEPT
Else
CANCEL
End if
Else
CANCEL
End if
` ...
End case
12. This example shows how to capitalize a text or alphanumeric field each time its data
source value is modified:
` [Contacts]First Name Object method
Case of
` ...
: (Form event=On Data Change)
[Contacts]First Name:= Uppercase(Substring([Contacts]First Name;1;1))+
Lowercase(Substring([Contacts]First Name;2))
` ...
End case
See Also
CALL PROCESS, Current form table, DRAG AND DROP PROPERTIES, FILTER KEYSTROKE, Get edited
text, Keystroke, SET TIMER.
version 3
Compatibility Note
This command has been kept in 4D for compatibility reasons. Starting with version 6, you
should consider using the command Form event and checking if it returns an On Load event.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Before → Boolean
Description
In order for the Before execution cycle to be generated, make sure that the On Load event
property for the form and/or the objecs has been selected in the Design environment.
See Also
Form event.
version 3
Compatibility Note
This command has been kept for compatibility reasons. Starting with version 6, you should
consider using the command Form event and checking if it returns an event such as On Clicked.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
During → Boolean
Description
In order for the During execution cycle to be generated, make sure that the appropriate event
properties, such as On Clicked, for the form and/or the objects have been selected in the
Design environment.
See Also
Form event.
version 3
Compatibility Note
This command has been kept for compatibility reasons. Starting with version 6, you should
consider using the command Form event and checking if it returns an On Validate event.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
After → Boolean
Description
In order for the After execution cycle to be generated, make sure that the On Validate event
property for the form and/or the objects has been selected in the Design environment.
See Also
Form event.
version 3
Compatibility Note
This command has been kept for compatibility reasons. Starting with version 6, you should
consider using the command Form event and checking if it returns an On Header event.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
In header → Boolean
Description
In order for the In header execution cycle to be generated, make sure that the On Header event
property for the form and/or the objects has been selected in the Design environment.
See Also
During, In break, In footer.
version 3
Compatibility Note
This command has been kept for compatibility reasons. Starting with version 6, you should
consider using the command Form event and checking if it returns an On Printing Break event.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
In break → Boolean
Description
In order for the In break execution cycle to be generated, make sure that the On Printing Break
event property for the form and/or the objects has been selected in the Design environment.
See Also
During, In footer, In header.
version 3
Compatibility Note
This command has been kept for compatibility reason. Starting with version 6, you may want
to start using the command Form event and check if it returns an On Printing Footer event.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
In footer → Boolean
Description
In order for the In footer execution cycle to be generated, make sure that the On Printing footer
event property for the form and/or the objects has been selected in the Design environment.
See Also
During, In break, In header.
version 3
Compatibility Note
This command has been kept for compatibility reasons. Starting with version 6, you should
consider using the command Form event and checking if it returns an On Activate event.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Activated → Boolean
Description
The Activated command returns TRUE in a form method when the window containing the
form becomes the frontmost window of the frontmost process.
WARNING: Do not place a command such as TRACE or ALERT in the Activated phase of the
form, as this will cause an endless loop.
Note: In order for the Activated execution cycle to be generated (for compatibility with V3
databases), make sure that the On Activate event property of the form has been selected in the
Design environment. This is done automatically when a database is converted.
See Also
Deactivated, Form event.
version 3
Compatibility Note
This command has been kept for compatibility reasons. Starting with version 6, you should
consider using the command Form event and checking if it returns an On Deactivate event.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Deactivated → Boolean
Description
The Deactivated command returns TRUE in a form or object method when the frontmost
window of the frontmost process, containing the form, moves to the back.
In order for the Deactivated execution cycle to be generated, make sure that the On Deactivate
event property of the form and/or the objects has been selected in Design environment.
See Also
Activated, Form event.
version 3
Compatibility Note
This command has been kept for compatibility reasons. Starting with version 6, you should
consider using the command Form event and checking if it returns an On Outside call event.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
In order for the Outside call execution cycle to be generated, make sure that the On Outside call
event property for the form and/or the objects has been selected in the Design environment.
See Also
CALL PROCESS, Form event.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get edited text command is mainly to be used with the form event On After Keystroke to
retrieve the text as it is being entered. It can also be used with the On Before Keystroke form
event. For more information about those form events, please refer to the description of the
command Form event.
Note: To be in accordance with the new form event On After Keystroke (introduced in version
6.5 of 4D), the existing event On Keystroke has been renamed, and is now called On Before
Keystroke.
When used in a context other than text entry in a form object, this function returns an empty
string.
Examples
1. The following method automatically puts the characters being entered in capitals:
Note: This example is not comprehensive because we have assumed that words are separated
uniquely by spaces (Char (32)). For a complete solution you will need to add other filters to
extract all the words (delimited by commas, semi-colons, apostrophes, etc.).
See Also
Form event.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET TIMER command allows you to activate the On Timer form event and to set, for the
current process, the number of ticks elapsed between each On Timer form event.
Note: For more information about this new form event, please refer to the description of the
command Form event.
If this command is called in a context in which it is not displaying a form, it will have no
effect.
4D’s Web server can take advantage of this command as well as the On Timer form event to
resend 4D forms. This feature allows you to obtain HTML pages updated in “real time” while
saving bandwidth. Actually, updating a form in this case is not automatic; you must call the
REDRAW command. You can then optimize the system by calling REDRAW only when the data
has been modified.
Only browsers that interpret JavaScript allow you to automatically redraw pages. The laps
defined by SET TIMER will be used by the browser and by the timeout of the Web process. The
laps must be a few seconds (5 being a practical value). For more information, please refer to
the second example shown below.
To procedurally disable the triggering of the On Timer form event, call SET TIMER again and
pass 0 in tickCount.
Examples
1. Let’s imagine that you want, when a form is displayed on screen, the computer to beep
every three seconds. To do so, write the following form method:
2. Let us imagine that you want your Web server to update a 4D form displayed on the Web
browser every five seconds. To do so, write the following form method:
See Also
Form event, REDRAW.
version 6.8.1
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Function result Boolean ← True if a right click was detected, otherwise False
Description
The Right click command returns True if the right button of the mouse has been clicked.
This command should be used only in the context of the On clicked form event. It is therefore
necessary to verify in Structure mode that the event has been properly selected in the Form
properties and/or in the specific object.
Note: This command only operates under Windows and Mac OS X. It will always return the
value False under Mac OS 9.
See Also
Contextual click, Form event.
version 6.8.1
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Contextual click command returns True if a contextual click has been made:
• Under Windows and Mac OS, contextual clicks are made using the right button of the
mouse.
• Under Mac OS, contextual clicks can also be made using a Control+click combination.
This command should be used only in the context of the On clicked form event. It is therefore
necessary to verify in Structure mode that the event has been properly selected in the Form
properties and/or in the specific object.
Example
This method, combined with a scrollable area, enables you to change the value of an array
element using a contextual menu:
If(Contextual click)
If (Pop up menu("True;False")=1)
myArray{myArray}:="True"
Else
myArray{myArray}:="False"
End if
End if
See Also
Form event, Right click.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
GET FORM PROPERTIES ({table; }formName; width; height{; numPages{; fixedWidth{; fixedHeight{;
title}}}})
Description
The GET FORM PROPERTIES command returns the properties of the form formName.
The width and height parameters return the form’s width and height in pixels. These values are
determined from the form’s Default window size properties:
• If the form’s size is automatic, its width and height are calculated so that all the form’s
objects are visible, by taking into consideration the horizontal and vertical margins that were
defined.
• If the form’s size is set, its width and height are those manually entered in the
corresponding areas.
• If the form’s size is based on an object, its width and height are calculated in relation to this
object’s position.
The numPages parameter returns the number of pages in the form, excluding page 0 (zero).
The fixedWidth and fixedHeight parameters indicate if the length and width of the form are
resizable (the parameter returns False) or set (the parameter returns True).
The title parameter returns the title of the form's window as it was defined. If no name was
defined, the title parameter returns an empty string.
See Also
GET FORM OBJECTS, Open form window, SET FORM SIZE.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET FORM SIZE command allows you to change the size of the current form by
programming. The new size is defined for the current process; it is not saved with the form.
As in the Design environment, you can use this command to set the form size in three
ways:
• Automatically — 4th Dimension determines the size of the form based on the notion that
all objects must be visible — and possibly adding a horizontal and vertical margin,
• On the place where a form object is found, where a horizontal and vertical margin may
be added,
• By entering “fixed” sizes (width and height).
For more information on resizing forms, refer to the 4th Dimension Design Reference
manual.
• Automatic size
If you want the size of the form to be set automatically, you must use the following syntax:
In this case, you must pass the margins (in pixels) that you want to add to the right and
bottom of the form in horizontal and vertical.
In this case, you must pass the margins (in pixels) that you want to add to the right and
bottom of the object in horizontal and vertical.
• Fixed size
In you want to have a fixed form size, you must use the following syntax:
In this case, you must pass the width and height (in pixels) of the form in horizontal and
vertical.
The SET FORM SIZE command changes the size of the form, but also takes into account the
resizing properties. For example, if the minimum width of a form is 500 pixels and if the
command sets a width of 400 pixels, the new form width will be 500 pixels.
Also note that this command does not change the size of the form window (you can resize
a form without changing the size of the window and vice versa). To change the size of the
form window, refer to the RESIZE FORM WINDOW command.
Example
The following example shows how an Explorer type window is set up. The following form
is created in the Design environment :
Case of
: (Form event=On load)
C_BOOLEAN(b1;<>collapsed)
C_LONGINT(margin)
margin:=15
b1:=<>collapsed
If (<>collapsed)
SET FORM HORIZONTAL RESIZING(False)
SET FORM SIZE("b1";margin;margin)
Else
SET FORM HORIZONTAL RESIZING(True)
SET FORM SIZE("tab";margin;margin)
End if
: (Form event=On click)
<>collapsed:=b1
If (b1)
`collapsed
GET OBJECT RECT(*;"b1";$l;$t;$r;$b)
GET WINDOW RECT($lf;$tf;$rf;$bf;Current form window)
SET WINDOW RECT($lf;$tf;$lf+$r+margin;$tf+$b+margin;
Current form window)
SET FORM HORIZONTAL RESIZING(False)
SET FORM SIZE("b1";margin;margin)
Else
End case
See Also
SET FORM HORIZONTAL RESIZING, SET FORM VERTICAL RESIZING.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET FORM HORIZONTAL RESIZING command allows you to change the horizontal
resizing properties of the current form through programming. By default, these properties
are set in the Design environment.Form editor. New properties are set for the current
process; they are not stored with the form.
The resize parameter lets you set whether the form can be resized horizontally; in other
words, if the width can be changed (manually by the user or through programming).
If you pass True, the form width can be modified by the user; 4th Dimension uses values
passed in minWidth and maxWidth as markers.
If you pass False, the current form width cannot be changed; in this case, there is no need
to pass values in the minWidth and maxWidth parameters.
If you passed True in the first parameter, you can pass new minimum and maximum
widths (in pixels) in the optional minWidth and maxWidth parameters. If you leave these
parameters out, the values set in the Design environment (if any) are used.
Example
Refer to the example of the SET FORM SIZE command.
See Also
SET FORM SIZE, SET FORM VERTICAL RESIZING.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET FORM VERTICAL RESIZING command allows you to change the vertical resizing
properties of the current form through programming. By default, these properties are set in
the Design environment Form editor. New properties are set for the current process; they
are not stored with the form.
The resize parameter lets you set whether the form can be resized vertically; in other words,
if the height can be changed (manually by the user or through programming).
If you pass True, the form height can be modified by the user; 4th Dimension uses values
passed in minHeight and maxHeight as markers.
If you pass False, the current form height cannot be changed; in this case, there is no need
to pass values in the minHeight and maxHeight parameters.
If you passed True in the first parameter, you can pass new minimum and maximum
heights (in pixels) in the optional minHeight and maxHeight parameters. If you leave these
parameters out, the values set in the Design environment (if any) are used.
Example
Refer to the example of the SET FORM SIZE command.
See Also
SET FORM HORIZONTAL RESIZING, SET FORM SIZE.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET FORM OBJECTS command returns the list of all objects present in the current form
of the current table in the form of (an) array(s). This list can be restricted to the current
form page. The command can be used with both input and output forms.
If an array passed as a parameter is not previously declared, the command creates it and
automatically sets its size. However, in the interest of compiling the application, we
recommend that you explicitly declare each array.
Pass the name of the string array that will contain object names (each object name is
unique within a form) in objectsArray. The order in which objects appear in the array is not
significant.
The other arrays optionally filled by the command are synchronized with the first array.
Pass the name of the pointer array that already contains pointers to variables or fields
associated with objects in the optional variablesArray parameter. If an object does not have
an associated variable, the pointer Nil is returned. If there is a “subform” type object, a
pointer to the table of the subform is returned.
The third array (optional), pagesArray, is filled with the form page numbers. Each line of
this array contains the page number of the corresponding object.
Objects coming from an inherited form are considered as belonging to page 0 of the
current page.
The optional * parameter allows you to reduce the list of objects returned to the current
page of the form. When this parameter is passed, only objects of the current page, page 0
and inherited pages are returned by the command. In other words, all the objects present
in the current page of the form (visible or not) are processed by the command.
See Also
GET FORM PROPERTIES.
version 2004.4
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET FORM PARAMETER command can be used to get the current value of a parameter of
the form indicated by table and form.
selector indicates the parameter of the form whose value you want to find out. You can use
the following constant, found in the “Form Parameters” theme:
When you use the NonInverted Objects constant as selector, the command returns, in value,
the actual display mode of the form in Custom Menus mode under Windows. This
parameter is used when applications are displayed using "right-to-left" languages. For more
information about the support of right-to-left languages, please refer to the Design Reference
manual of 4th Dimension.
• If value returns 0, the form objects are inverted,
• If value returns 1, the form objects are not inverted.
If the command is not called within the context of the Custom Menus mode under
Windows, it always returns 1.
Keep in mind that the actual inversion of form objects will depend on a combination of
several parameters: the values of the “Inversion of objects in Custom Menus mode”
preference, the value of the “Do not invert objects” form option and the system on which
the database is running.
(1) This preference can also be set or read using the SET DATABASE PARAMETER and Get
database parameter commands.
See Also
Get database parameter, GET FORM PROPERTIES, SET DATABASE PARAMETER.
Description
GOTO PAGE changes the currently displayed form page to the form page specified by
pageNumber.
If no form is displayed or if pageNumber corresponds to the current page of the form, GOTO
PAGE does nothing. If pageNumber is greater than the number of pages, the last page is
displayed. If pageNumber is less than one, the first page is displayed.
Use the Current form page command to find out which page is being displayed.
Note: When designing a form, you can work with pages 1 through X, as well as with page 0,
in which you put objects that will appear in all of the pages. When using a form, and therefore
when calling page commands, you work with pages 1 through X; page 0 is automatically
combined with the page being displayed.
Example
The following example is an object method for a button. It displays a specific page, page 3:
See Also
Current form page, FIRST PAGE, LAST PAGE, NEXT PAGE, PREVIOUS PAGE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
FIRST PAGE
Description
FIRST PAGE changes the currently displayed form page to the first form page. If a form is not
being displayed, or if the first form page is already displayed, FIRST PAGE does nothing.
Example
The following example is a one-line method called from a menu command. It displays the first
form page:
FIRST PAGE
See Also
Current form page, GOTO PAGE, LAST PAGE, NEXT PAGE, PREVIOUS PAGE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
LAST PAGE
Description
LAST PAGE changes the currently displayed form page to the last form page. If a form is not
being displayed, or if the last form page is already displayed, LAST PAGE does nothing.
Example
The following example is a one-line method called from a menu command. It displays the last
form page:
LAST PAGE
See Also
Current form page, FIRST PAGE, GOTO PAGE, NEXT PAGE, PREVIOUS PAGE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
NEXT PAGE
Description
NEXT PAGE changes the currently displayed form page to the next form page. If a form is not
being displayed, or if the last form page is already displayed, NEXT PAGE does nothing.
Example
The following example is a one-line method called from a menu command. It displays the
form page that follows the one currently displayed:
NEXT PAGE
See Also
Current form page, FIRST PAGE, GOTO PAGE, LAST PAGE, PREVIOUS PAGE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
PREVIOUS PAGE
Description
PREVIOUS PAGE changes the currently displayed form page to the previous form page. If a form
is not being displayed, or if the first form page is already displayed, PREVIOUS PAGE does
nothing.
Example
The following example is a one-line method called from a menu command. It displays the
form page that precedes the one currently displayed:
PREVIOUS PAGE
See Also
Current form page, FIRST PAGE, GOTO PAGE, LAST PAGE, NEXT PAGE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Current form page command returns the number of the currently displayed form page.
Example
In a form, when you select a menu item from the menu bar or when the form receives a call
from another process, you can perform different actions depending on the form page currently
displayed. In this example, you write:
See Also
FIRST PAGE, GOTO PAGE, LAST PAGE, NEXT PAGE, PREVIOUS PAGE.
Description
The INPUT FORM command sets the current input form for table to form or userForm. The form
must belong to table.
The scope of this command is the current process. Each table has its own input form in each
process.
INPUT FORM does not display the form; it just designates which form is used for data entry,
import, or operation by another command. For information about creating forms, see the
4th Dimension Design Reference..
The default input form is defined in the Design environment Explorer window for each table.
This default input form is used if the INPUT FORM command is not used to specify an input
form, or if you specify a form that does not exist.
The optional userForm parameter lets you specify a user form (coming from form) as the
default input form. If you pass a valid user form name, this form will be used by default
instead of the input form in the current process. This allows you to have several different
custom user forms simultaneously (generated using the CREATE USER FORM command) and to
use the one that suits according to the context.
For more information about user forms, refer to the Overview of user forms section.
Input forms are displayed by a number of commands, which are generally used to allow the
user to enter new data or modify old data. The following commands display an input form for
data entry or query purposes:
• ADD RECORD
• DISPLAY RECORD
The DISPLAY SELECTION and MODIFY SELECTION commands display a list of records using the
output form. The user can double-click on a record in the list, which displays the input form.
The import commands IMPORT TEXT, IMPORT SYLK and IMPORT DIF use the current input form
for importing records.
The optional * parameter is used in conjunction with the form properties you set in the
Design environment Form Properties window and the command Open window. Specifying the
* parameter tells 4D to use the form properties to automatically resize the window for the next
use of the form (as an input form or as a dialog box). See Open window for more information.
Note: Whether or not you pass the optional * parameter, INPUT FORM changes the input form
for the table.
Examples
1. The following example shows a typical use of INPUT FORM:
INPUT FORM ([Companies]; "New Comp") ` Form for adding new companies
ADD RECORD ([Companies]) ` Add a new company
Case of
: (company="4D SA")
INPUT FORM([Invoices];"Input";"4D_SA")
: (company="4D Inc")
INPUT FORM([Invoices];"Input";"4D_Inc")
: (company="Acme")
INPUT FORM([Invoices];"Input";"ACME")
End case
ADD RECORD([Factures])
See Also
ADD RECORD, CREATE USER FORM, DISPLAY RECORD, DISPLAY SELECTION, IMPORT DIF, IMPORT
SYLK, IMPORT TEXT, MODIFY RECORD, MODIFY SELECTION, Open window, OUTPUT FORM,
QUERY BY EXAMPLE.
Description
The OUTPUT FORM command sets the current output form for table to form or userForm. The
form must belong to table.
The scope of this command is the current process. Each table has its own output form in each
process.
OUTPUT FORM does not display the form; it just designates which form is printed, displayed,
or used by another command. For information about creating forms, see the 4th Dimension
Design Reference.
The default output form is defined in the Design environment Explorer window for each table.
This default output form is used if the OUTPUT FORM command is not used to specify an
output form, or if you specify a form that does not exist.
The optional userForm parameter lets you specify a user form (coming from form) as the
default output form. If you pass a valid user form name, this form will be used by default
instead of the output form in the current process. This allows you to have several different
custom user forms simultaneously (generated using the CREATE USER FORM command) and to
use the one that suits according to the context.
For more information about user forms, refer to the Overview of user forms section.
Example
The following example shows a typical use of OUTPUT FORM. Note that although the OUTPUT
FORM command appears immediately before the output form is used, this is not required. In
fact, the command may be executed in a completely different method, as long as it is executed
prior to this method:
See Also
CREATE USER FORM, DISPLAY SELECTION, EXPORT DIF, EXPORT SYLK, EXPORT TEXT, INPUT
FORM, MODIFY SELECTION, PRINT LABEL, PRINT SELECTION.
Version 6 Note: Starting with version 6, graphs are now supported by the 4D Chart Plug-in,
which is integrated within 4th Dimension. The Graph commands from the previous version of
4D are transparently redirected to 4D Chart. In addition, to use the additional 4D Chart
commands for customizing a Graph Area located in a form, use the graphArea parameter
(described in this command) as an external area reference for the 4D Chart commands. For
detailed information about the 4D Chart commands, refer to the 4D Chart Reference manual.
The GRAPH command is designed to be used with a graph area created in a 4D form. It must be
used in a form method or in an object method of one of the form's objects. It can also be used
in a method called by one of these methods.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
GRAPH draws a graph for a Graph area located in a form. The data can come from either arrays
or subfields.
The graphArea parameter is the name of the Graph area that displays the graph. The Graph
area is created in the Form editor, using the graph object type. The graph name is the name
entered for the variable name. For information about creating a Graph area, see the
4th Dimension Design Reference.
The graphNum parameter defines the type of graph that will be drawn. It must be a number
from 1 to 8. The graph types are described in Example 1. After a graph has been drawn, you
can change the type by changing graphNum and executing the GRAPH command again.
The data specified by yElements is the data to graph. The data must be numeric. Up to eight
data sets can be graphed. Pie charts graph only the first yElements.
Examples
1. The following example shows how to use arrays to create a graph. The code would be
inserted in a form method or object method. It is not intended to be realistic, since the data is
constant:
2. The following example graphs the sales in dollars for sales people in a subtable. The
subtable has three fields: Name, LastYearTot, and ThisYearTot. The graph will show the sales
for each of the sales people for the last two years:
GRAPH (vGraph;1;[Employees]Sales'Name;[Employees]Sales'LastYearTot;
[Employees]Sales'ThisYearTot)
See Also
CT Chart arrays, CT Chart data, CT Chart selection, GRAPH SETTINGS, GRAPH TABLE.
Version 6 Note: Starting with version 6, graphs are now supported by the 4D Chart Plug-in,
which is integrated within 4th Dimension. The Graph commands from the previous version of
4D are transparently redirected to 4D Chart. In addition, to use the additional 4D Chart
commands for customizing a Graph Area located in a form, use the graph parameter (described
in this command) as an external area reference for the 4D Chart commands. For detailed
information about the 4D Chart commands, refer to the 4D Chart Reference manual.
The GRAPH command is designed to be used with a graph area created in a 4D form. It must be
used in a form method or in an object method of one of the form's objects. It can also be used
in a method called by one of these methods.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
GRAPH SETTINGS (graph; xmin; xmax; ymin; ymax; xprop; xgrid; ygrid; title{; title2; ...; titleN})
Description
GRAPH SETTINGS changes the graph settings for graph displayed in a form. The graph must
have already been displayed with the GRAPH command. GRAPH SETTINGS has no effect on a
pie chart.
The xgrid and ygrid parameters display or hide grid lines. A grid for the x-axis will be displayed
only when the plot is a proportional scatter or line graph.
Example
See example for the command GRAPH.
See Also
GRAPH, GRAPH TABLE.
Version 6 Note: Starting with version 6, graphs are now supported by the 4D Chart Plug-in,
which is integrated within 4th Dimension. The Graph commands from the previous version of
4D are transparently redirected to 4D Chart. For detailed information about the 4D Chart
commands, refer to the 4D Chart Reference manual.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
or:
Description
GRAPH TABLE has two forms. The first form displays the Chart Wizard and allows the user to
select the fields to be graphed. The second form specifies the fields to be graphed and does not
display the Chart Wizard.
GRAPH TABLE graphs data from a table’s fields. Only data from the current selection of the
current process is graphed.
Using the first form is equivalent to choosing Charts from the Tools menu in the User
environment. The following figure shows the Chart Wizard, which allows the user to define
the graph.
The graphType parameter defines the type of graph that will be drawn. It must be a number
from 1 to 8. See the graph types listed in the example for the command Graph.
The x field defines the labels that will be used to label the x-axis (the bottom of the graph). The
field type can be Alpha, Integer, Long integer, Real or Date.
The y field is the data to graph. The field type must be Integer, Long integer or Real. Up to
eight y fields can be graphed, each set off by a semicolon.
In either form, GRAPH TABLE opens a Chart window for working with the newly created graph.
For more information about using the Chart window, see the 4th Dimension User Reference
manual.
Note: You can also use the Quick Report editor to generate graphs from field data, by using
the Print Destination menu.
QUERY ([People])
If (OK=1)
ORDER BY ([People])
If (OK=1)
GRAPH TABLE([People])
End if
End if
2. The following example illustrates the use of the second form of GRAPH TABLE. It first queries
and orders records from the [People] table. It then graphs the salaries of the people:
QUERY([People];[People]Title="Manager")
ORDER BY([People];[People]Salary;>)
GRAPH TABLE([People];1;[People]Last Name;[People]Salary)
See Also
CT Chart selection, GRAPH.
Description
The SET ALLOWED METHODS command allows you to define methods that are displayed in
the Formula editor for the current session. The designated methods will appear at the end
of the list of commands and can be used in formulas. By default (if this command is not
used), no methods are visible in the Formula editor. If a formula uses an unauthorized
method name, a syntax error is generated and the formula cannot be validated.
Pass the name of an array containing the list of methods to offer in the Formula editor in
the methodsArray parameter. The array must have been set previously.
You can use the wildcard character (@) in method names to define one or more authorized
method groups.
If you would like the user to be able to call 4D commands that are unauthorized by default
or plug-in commands, you must use specific methods that handle these commands.
Note: Starting with version 2004.4 of 4D, the mechanism for restricting access to
commands and methods in the Formula editor can be disabled for all users (compatibility
option) or for the Designer and Administrator via two corresponding options in the
Preferences. If the compatibility option is checked, the SET ALLOWED METHODS command
will have no effect.
Example
This example authorizes all methods starting with “formula” and the “Total_general”
method in the Formula editor:
ARRAY STRING(15;methodsArray;2)
methodsArray{1}:="formula@"
methodsArray{2}:="Total_general"
SET ALLOWED METHODS(methodsArray)
See Also
EDIT FORMULA, GET ALLOWED METHODS.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET ALLOWED METHODS command returns, in methodsArray, the names of methods
that can be used to write formulas. These methods are listed at the end of the list of
commands in the editor.
By default, methods cannot be used in the Formula editor. Methods must be explicitly
authorized using the SET ALLOWED METHODS command. If this command has not been
executed, GET ALLOWED METHODS returns an empty array.
GET ALLOWED METHODS returns exactly what was passed to the SET ALLOWED METHODS
command, i.e. a string array (the command creates and sizes the array). Also, if the wildcard
(@) character is used to set a group of methods, the string containing the @ character is
returned (and not the names of the methods of the group).
This command is useful for storing the settings of the current set of authorized methods
before the execution of a formula in a specific context (for instance, a quick report).
Example
This example authorizes a set of specific methods to create a report:
See Also
SET ALLOWED METHODS.
Description
The EDIT FORMULA command displays the Formula editor in order to let the user write or
modify a formula. The editor contains the following on opening:
• in the left list, the fields of the table passed in the table parameter,
• in the formula area, the formula contained in the formula variable. If you passed an
empty string in formula, the Formula editor is displayed without a formula.
The user can modify the formula displayed and save it. It is also possible to write or load a
new formula. Regardless, if the user validates the dialog box, the system variable OK is set
to 1 and the formula variable contains the formula defined by the user. If the user cancels
the formula, the system variable OK is set to 0 and the formula variable is left untouched.
Note: By default, access to methods and commands is restricted for all users (except for the
Designer and Administrator, in databases created with 4D 2004.4 and higher). When this
mechanism is enabled, you must explicitly designate the elements that can be accessed by
the users using the SET ALLOWED METHODS command. If formula calls methods that were
not first “authorized” in the Formula editor using the SET ALLOWED METHODS command, a
syntax error is generated and you will not be able to validate the dialog box.
Keep in mind that when the dialog box is validated, the command does not execute the
formula; it only validates and updates the contents of the variable. If you want to execute
the formula, you must use the EXECUTE command.
$myFormula:=""
EDIT FORMULA([Employees];$myFormula)
If (OK=1)
APPLY TO SELECTION([Employees];EXECUTE($myFormula))
End if
See Also
APPLY TO SELECTION, EXECUTE, SET ALLOWED METHODS.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Load list creates a new hierarchical list whose contents are copied from the list and whose
name you pass in listName. It then returns the list reference number to the newly created list.
To make sure that the list specified by listName exists, use the Is a list function.
Note that the new list is a copy of the list defined in the Design environment. Consequently,
any modifications made to the new list will not affect the list defined in the Design
environment. Conversely, any subsequent modifications made to the list defined in the
Design environment will not affect the list that you just created.
If you modify the newly created list and want to permanently save the changes, call SAVE LIST.
Remember to call CLEAR LIST in order to delete the newly created list when you have finished
with it. Otherwise, it will stay in memory until the end of the working session or until the
process in which it was created ends or is aborted.
Tip: If you associate a list with a form object (hierarchical list, tab control, or hierarchical pop-
up menu) using the Choice List property in the Property List window, you do not need to call
Load list or CLEAR LIST from the method of the object. 4th Dimension loads and clears the list
automatically for you.
See Also
CLEAR LIST, Is a list, SAVE LIST.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAVE LIST command saves the list whose reference number you pass in list, within the
Design environment List Editor, under the name you pass in listName.
If there is already a list with this name, its contents are replaced.
See Also
Load list.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
New list creates a new, empty hierarchical list in memory and returns its unique list reference
number.
WARNING: Hierarchical lists are held in memory. When you are finished with a hierarchical
list, it is important to dispose of it and free the memory, using the command CLEAR LIST.
After you have created a hierarchical list using New list, you can:
• Add items to that list, using the command APPEND TO LIST or INSERT LIST ITEM.
• Delete items from that list, using the command DELETE LIST ITEM.
Example
See example for the command APPEND TO LIST.
See Also
APPEND TO LIST, BLOB to list, CLEAR LIST, Copy list, DELETE LIST ITEM, INSERT LIST ITEM, LIST TO
BLOB, Load list.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Copy list command duplicates the list whose reference number you pass in list, and returns
the list reference number of the new list.
After you have finished with the new list, call CLEAR LIST to delete it.
See Also
CLEAR LIST, Load list, New list.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The CLEAR LIST command deletes the hierarchical list whose list reference number you pass in
list.
Usually you will pass the optional * parameter, so all the sublists, if any, attached to items or
subitems of the list will be deleted as well.
You do not need to clear a list attached to a form object via the Property List window. 4D
loads and clears the list for you. On the other hand, each time you load, copy, extract from a
BLOB, or create a list programmatically, call CLEAR LIST when you are through with the list.
To clear a sublist attached to an item (on any level) of another list currently displayed in a
form, proceed as follows:
1. Call GET LIST ITEM on the parent item to get the list reference of the sublist.
2. Call SET LIST ITEM on the parent item to detach the sublist from the list item before clearing
it.
3. Call CLEAR LIST to clear the sublist whose reference number you obtained with GET LIST
ITEM.
4. Call REDRAW LIST for the list displayed in the form, to recalculate its items and sublists.
See Also
BLOB to list, Load list, New list.
Function result Longint ← Number of visible (expanded) list items (if * omitted)
or Total number of list items (if * present)
Description
The Count list items command returns either the number of items currently “visible” or the
total number of items in the list whose reference number you pass in list.
Use the * parameter to determine which type of information will be returned. When this
parameter is passed, the command returns the total number of items present in the list,
regardless of whether it is expanded or collapsed.
When this parameter is omitted, the command returns the number of items that are visible,
depending on the current expanded/collapsed state of the list and its sublists.
You apply this command to a list displayed in a form.
Examples
Here a list named hList shown in the User environment:
See Also
List item position, Selected list items.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Is a list command returns TRUE if the value you pass in list is a valid reference to a
hierarchical list. Otherwise, it returns FALSE.
Examples
1. See example for the command CLEAR LIST.
2. See examples for the command DRAG AND DROP PROPERTIES.
See Also
DRAG AND DROP PROPERTIES.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The REDRAW LIST command recalculates the positions of all the items and sublists (if any) of
the list whose reference number you pass in list.
You MUST call this command at least once when you modify one or several aspects of a list or
one of its sublists in a form.
Warning: Pass the actual variable instance of the list, not an expression or variable. For
example, if you have a list named hList in a form:
$vlList:=hList
` ...
` Recalculate the list after changes were made
REDRAW LIST ($vlList) ` WRONG
` ...
Description
The SET LIST PROPERTIES command sets the appearance of the hierarchical list whose list
reference you pass in list.
The parameter appearance can be one of the following predefined constants provided by
4th Dimension in the Hierarchical Lists theme:
In the Windows appearance, the list has connecting dotted lines between the nodes and
branches. One icon (+) denotes the collapsed nodes, a second one (–) the expanded nodes.
Nodes without child items have no icon.
In the Macintosh appearance, the list has no connecting dotted lines. One icon denotes the
collapsed nodes, a second one the expanded nodes. Nodes without child items have no icon.
Here is a default hierachical list in Macintosh appearance:
The parameter icon indicates the icons that will be displayed for each node. The value passed
in icon sets the icon for collapsed nodes and icon+1 sets the icon for expanded nodes.
For example, if you pass 15000, the color icon 'cicn' ID=15000 will be displayed for each
collapsed node and the color icon 'cicn' ID=15001 will be displayed for each expanded node.
It is therefore important to have these 'cicn' color icon resources present in your database
structure file. If a color icon resource is missing, the corresponding nodes are displayed with
no icons. (You can actually take advantage of this to display a list with no icons.)
WARNING: When creating 'cicn' color icon resources, use resource IDs greater than or equal to
15000. Resource IDs less than 15000 are reserved for 4th Dimension.
The resource IDs of the default Macintosh and Windows nodes are expressed by the following
predefined constants provided by 4th Dimension:
ID Number Description
860 Collapsed node a la Macintosh
861 Expanded node a la Macintosh
138 Collapsed node a la Windows
139 Expanded node a la Windows
If you do not pass the parameter icon or pass 0, the nodes are displayed with the default icons
of the chosen appearance type.
Color icon resources can be of various sizes. For example, you can create 16x16 or 32x32 color
icons.
Choose color icon size, font, and font size accordingly, otherwise pass in the parameter
lineHeight the minimal line height of the hierarchical list. If the value you pass is greater than
the line height derived from the font and font size used, the line height of the hierarchical list
will be forced to the value you pass.
Note: SET LIST PROPERTIES affects the way nodes are displayed in the hierarchical list. If you
would rather customize the icon of each item in the list, use the command SET LIST ITEM
PROPERTIES.
The optional parameter doubleClick allows you to define that a double-click on a parent list
item will not provoke the sublist to expand or to collapse. By default, a double-click on a
parent list item provokes its child list to expand or to collapse. However, some user interfaces
may need to deactivate this behavior. To do this, the doubleClick parameter should be set to 1.
Only double-click will be deactivated. Users will still be able to expand or collapse sublists by
clicking on the list node.
If you omit the doubleClick parameter or pass 0, default behavior will be applied.
The optional multiSelections parameter lets you indicate whether the list must accept multiple
selections.
By default, as in previous versions of 4th Dimension, you cannot simultaneously select several
items of a hierarchical list. If you would like this function to be available for the list, pass the
value 1 in the multiSelections parameter. In that case, multiple selections can be used:
- manually, using the Shift+click key combination for a continuous selection or Ctrl+click
(Windows) / Command+click (Mac OS) for a discontinuous selection,
- by programming, using the SELECT LIST ITEMS BY POSITION and SELECT LIST ITEMS BY
REFERENCE commands.
If you pass 0 or omit the multiSelections parameter, the default behavior will be applied.
The optional editable parameter lets you indicate whether the list must be editable by the user
when it is displayed as a choice list associated with a field or a variable during data entry.
When the list is editable, a Modify button is added in the choice list window and the user can
add, delete and sort the values through a specific editor.
If you pass 1 or omit the editable parameter, the list will be editable; if you pass 0, it will not
be editable.
Within a form, the hierarchical list object hlCities reuses that list with this object method:
Case of
: (Form event=On Load)
hlCities:=Load list("Cities")
SET LIST PROPERTIES(hlCities;vlAppearance;vlIcon)
: (Form event=On Unload)
CLEAR LIST(hlCities;*)
End case
The 'cicn' color icon resources shown are then added to the structure file of the database:
See Also
GET LIST ITEM PROPERTIES, GET LIST PROPERTIES, SET LIST ITEM PROPERTIES.
Description
The GET LIST PROPERTIES command returns information about the list whose reference
number you pass in list.
These properties can be set using the command SET LIST PROPERTIES and/or in the Design
environment List Editor, if the list was created there or saved using the command SAVE LIST.
For a complete description of the appearance, node icons, minimal line height and double-
click management of a list, see the command SET LIST PROPERTIES.
See Also
SET LIST PROPERTIES.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SORT LIST command sorts the list whose reference number is passed in list.
To sort in ascending order, pass >. To sort in descending order, pass <. If you omit the sorting
order parameter, SORT LIST sorts in ascending order by default.
SORT LIST sorts all levels of the list; it first sorts the items of the list, then it sorts the items in
each sublist (if any), and so on, through all the levels of the list. This is why you will usually
apply SORT LIST to a list in a form. Sorting a sublist is of little interest because the order will be
changed by a call to a higher level.
SORT LIST does not change the current list item nor the current expanded/collapsed state of
the list and sublists. However, because the current item can be moved by the sorting
operation, Selected list items may return a different position before and after the sort.
See Also
Selected list items.
Description
The APPEND TO LIST command appends a new item to the hierarchical list whose list reference
number you pass in list.
You pass the text of the item in itemText. You can pass a string or text expression of up to 255
characters. If you pass a longer value, it will be truncated.
You pass the unique reference number of the item in itemRef. Although we qualify this item
reference number as unique, you can actually pass the value you want. See the "Item Reference
Numbers" section below.
If you also want an item to have child items, pass a valid list reference to the child hierarchical
list in sublist. In this case, you must also pass the expanded parameter. Pass True or False in this
parameter so that the sublist is displayed expanded or collapsed respectively.
The list reference you pass in sublist must refer to an existing list. The existing list may be a
one-level list or a list with sublists. If you do not want to attach a child list to the new item,
omit the parameter or pass 0. Even though they are both optional, the sublist and expanded
parameters must be passed jointly.
Tips
• To insert a new item in a list, use INSERT LIST ITEM. To change the text of an existing item or
modify its child list as well as its expanded state, use SET LIST ITEM.
• To change the appearance of the new appended item use SET LIST ITEM PROPERTIES.
Warning: You can use any longint value as a reference number except for 0. For most of the
commands in this theme, the value 0 is used to designate the last item added to the list.
Note: If you use the Bitwise Operators, you can also use item reference numbers for storing
information that fit into a Long Integer value. This means: 2 Integer values, 4-byte values or 32
Booleans values.
Basically, you need to deal with item reference numbers when you want direct access to any
item of the list programmatically and not necessarily the one currently selected in the list.
Case of
End case
In this example, there is only one reason to distinguish [Departments] items and [Employees]
items:
1. We store record numbers in the item reference numbers; therefore, we will probably end up
with [Departments] items whose item reference numbers are the same as [Employees] items.
2. We use the List parent item command to retrieve the parent of the selected item. If we click
on an [Employees] item whose associated record number is #10, and if there is also a
[Departments] item #10, the [Departments] item will be found first by List parent item when it
browses the lists to locate the item with the item reference number we pass. The command
will return the parent of the [Departments] item and not the parent of the [Employees] item.
Therefore, we made the item reference numbers unique, not because we wanted unique
numbers, but because we needed to distinguish [Departments] and [Employees] records.
Note: This example is useful for user interface purposes if you deal with a reasonably small
number of records. Remember that lists are held in memory—do not build user interfaces with
hierarchical lists containing thousands of items.
See Also
INSERT LIST ITEM, SET LIST ITEM, SET LIST ITEM PROPERTIES.
Description
The INSERT LIST ITEM command inserts the item designated by the itemRef parameter in the
list whose reference number you pass in list.
The beforeItemRef parameter can be used to designate the item before which you wish to insert
the new item:
• You can pass the value 0 in order to designate the last item added to the list. The newly
inserted item will then become the selected item.
• You can pass * in order for the new item to be inserted before the currently selected item in
the list. In this case, the newly inserted item will also become the selected item.
• Otherwise, if you want to insert an item before a specific item, you pass the item reference
number of that item. In this case, the newly inserted item is not automatically selected. If
there is no item with the corresponding item reference number, the command does nothing.
You pass the text and the item reference number of the new item in itemText and itemRef.
If you want for the item to include subitems, pass a valid list reference number in the sublist
parameter. In this case, you must also pass the expanded parameter. Pass either True or False in
this parameter so that this sublist is displayed either expanded or collapsed respectively.
vlUniqueRef:=vlUniqueRef+1
INSERT LIST ITEM(hList;*;"New Item";vlUniqueRef)
REDRAW LIST(hList)
See Also
APPEND TO LIST.
SET LIST ITEM PROPERTIES (list; itemRef | *; enterable; styles; icon{; color})
Description
The SET LIST ITEM PROPERTIES command modifies the item designated by the itemRef
parameter within the list whose reference number is passed in list.
You can pass a reference number in itemRef. If there is no item with the item reference
number that is passed, the command does nothing. You can optionally pass 0 in itemRef to
modify the last item added to the list using APPEND TO LIST.
Lastly, you can pass * in itemRef: in this case, the command will apply to the current item of
the list. If several items are selected manually, the current item is the one that was selected
last. If no item is selected, the command does nothing.
If you work with item reference numbers, build a list in which items have unique reference
numbers, otherwise you will not be able to distinguish the items. For more information, refer
to the description of thecommand APPEND TO LIST.
Note: To change the text of the item or its sublist, use the command SET LIST ITEM.
Note: On Windows, only the styles Plain or a combination of Bold, Italic, and Underline are
available. Moreover, the Condensed and Shadow styles are no longer supported and are kept
only for compatibility reasons.
To associate an icon to the item, pass one of the following numeric values:
• N, where N is the resource ID of Mac OS-based ‘cicn’ resource
• Use PICT resource+N, where N is the the resource ID of a Mac OS-based ‘PICT’ resource
• Use PicRef+N, where N is the reference number of a Picture from the Design environment
Picture Library
Pass zero (0), if you do not want any graphic for the item.
Note: Use PICT resource and Use PicRef are predefined constants located in the Hierarchical Lists
theme.
The color parameter (optional) lets you modify the color of the item text. The color must be
specified in the form of an RGB color, i.e. a 4-byte longint in the 0x00RRGGBB format. For
more information about this format, refer to the description of the SET RGB COLORS
command. Pass -1 in the color parameter to reset the original color of the item.
2. The following example changes the text of the current item of list to bold and bright red:
See Also
GET LIST ITEM PROPERTIES, SET LIST ITEM.
GET LIST ITEM PROPERTIES (list; itemRef | *; enterable{; styles{; icon{; color}}})
Description
The GET LIST ITEM PROPERTIES command returns the properties of the item designated by the
itemRef parameter within the list whose list reference number is passed in list.
In itemRef, you can pass either a reference number, or the value 0 in order to designate the last
item added to the list, or * in order to designate the current item of the list. If several items are
selected, the current item is the last one selected.
If you pass * and no item is selected or if there is no item with the item reference number that
is passed, the command leaves the parameters unchanged.
If you work with item reference numbers, build a list in which items have unique reference
numbers, otherwise you will not be able to distinguish the items. For more information, refer
to the description of the command APPEND TO LIST.
See Also
GET LIST ITEM, SET LIST ITEM, SET LIST ITEM PROPERTIES.
Description
The List item position command returns the position of the item whose item reference number
is passed in itemRef, within the list whose list reference number is passed in list.
Note: Unlike the other commands of this theme, with this command it is not possible to pass
the value 0 in itemRef to designate the last item added.
The position is expressed relative to the top item of the main list, using the current
expanded/collapsed state of the list and its sublist.
The result is therefore a number between 1 and the value returned by Count list items.
If the item is not visible because it is located in a collapsed list, List item position expands the
appropriate list to make the item visible.
See Also
Count list items, SELECT LIST ITEMS BY REFERENCE.
Description
The List item parent command returns the item reference number of a parent item.
You pass a list reference number in list; you pass the item reference number of an item in the
list or 0 or yet again *, in itemRef. If you pass 0, the command applies to the last item added to
the list. If you pass *, the command applies to the current item of the list. If several items have
been selected manually, the current item is the last one selected.
In return, if the corresponding item exists in the list and if this item is in a sublist (and
therefore has a parent item), you obtain the item reference number of the parent item.
If there is no item with the item reference number you passed, or if you have passed * and no
item is selected, or if the item has no parent, List item parent returns 0 (zero).
If you work with item reference numbers, be sure to build a list in which the items have
unique reference numbers; otherwise you will not be able to distinguish the items. For more
information, see the description of the APPEND TO LIST command.
• In the following code, if the item “b - 3” is selected, the variable $vlParentItemRef gets 200,
the item reference number of the item “b”:
• If the item “a - 1” is selected, the variable $vlParentItemRef gets 100, the item reference
number of the item “a”.
• If the item “a” or “b” is selected, the variable $vlParentItemRef gets 0, because these items
have no parent item.
See Also
GET LIST ITEM, List item position, SELECT LIST ITEMS BY REFERENCE, SET LIST ITEM.
Description
The DELETE LIST ITEM command deletes the item designated by the itemRef parameter of the
list whose reference number is passed in list.
If you pass * in itemRef, you delete the currently selected item in the list. You can also pass 0 in
this parameter in order to request the deletion of the last item added to the list.
Otherwise, you specify the item reference number of the item you want to delete. If there is no
item with the item reference number you passed, the command does nothing.
If you work with item reference numbers, build a list in which the items have unique
reference numbers, otherwise you will not be able to distinguish the items. For more
information, see the description of the APPEND TO LIST command.
No matter which item you delete, you should specify the optional * parameter to let 4D
automatically delete the sublist attached to the item, if any. If you do not specify the *
parameter, it is a good idea to have previously obtained the list reference number of the sublist
(if any) attached to the item, so that you can delete it, if necessary, using the CLEAR LIST
command.
See Also
CLEAR LIST, GET LIST ITEM.
Description
The GET LIST ITEM command returns information about the item specified by itemPos of the
list whose reference number is passed in list.
The position must be expressed relatively, using the current expanded/collaped state of the list
and its sublist. You pass a position value between 1 and the value returned by Count list items.
If you pass a value outside this range, GET LIST ITEM returns empty values (0, "", etc.).
See Also
GET LIST ITEM PROPERTIES, List item parent, List item position, Selected list items, SET LIST ITEM,
SET LIST ITEM PROPERTIES.
Description
The SET LIST ITEM command modifies the item designated by the itemRef parameter within the
list whose reference number is passed in list.
You can pass a reference number in itemRef. If there is no item with the item reference
number you passed, the command does nothing. You can optionally pass 0 in itemRef to
designate the last item added to the list using APPEND TO LIST.
Lastly, you can pass * in itemRef: in this case, the command will apply to the current item of
the list. If several items are selected manually, the current item is the one that was selected
last. If no item is selected, the command does nothing.
If you work with item reference numbers, build a list in which the items have unique
reference numbers, otherwise you will not be able to distinguish the items. For more
information, see the description of the command APPEND TO LIST.
You pass the new text for the item in newItemText. To change the item reference number, pass
the new value in newItemRef; otherwise, pass the same value as itemRef.
To attach a list to the item, pass the list reference number in subList. In this case, you also
specify if the newly sublist is expanded by passing TRUE in expanded; otherwise, pass FALSE.
If you do not want to change the sublist property of the item, pass -1 in sublist.
Note: Even if they are optional, both the sublist and expanded parameters must be passed
jointly.
Examples
1. hList is a list whose items have unique reference numbers. The following object method for
a button adds a child item to the current selected list item.
See Also
GET LIST ITEM, GET LIST ITEM PROPERTIES, SET LIST ITEM PROPERTIES.
Description
The Selected list items command returns the position or reference of the selected item in the
list whose reference number you pass in list. In the case of multiple selection, the command
can also return in the itemsArray array, the position or reference of each item selected. You
apply this command to a list displayed in a form to detect which item(s) the user has selected.
The * parameter lets you indicate whether you want to work with current item positions (in
this case, the * parameter should be omitted) or with fixed item references (in this case, the *
parameter must be used).
You can pass a longint array in the itemsArray parameter. If necessary, the array will be created
and resized by the command. Once the command has been executed, itemsArray will contain:
• the position of each item selected in the expanded list(s) if the * parameter is omitted.
• the fixed reference of each item selected if the * parameter is passed.
If no items have been selected, the array is returned empty.
Note: In the event of multiple selections, the command returns the position or reference of
the current item of list. The current item is the last item clicked by the user (manual selections)
or the item set by the SELECT LIST ITEMS BY POSITION or SELECT LIST ITEMS BY REFERENCE
commands (programmed selection).
Examples
Here a list named hList, shown in User environment:
See Also
SELECT LIST ITEMS BY POSITION, SELECT LIST ITEMS BY REFERENCE.
Description
The SELECT LIST ITEMS BY POSITION command selects the item(s) whose position is passed in
itemPos and, optionally, in positionsArray within the list whose reference number is passed in
list.
The position of items is alwaysexpressed using the current expanded/collapsed state of the list
and its sublists. You pass a position value between 1 and the value returned by Count list items.
If you pass a value outside this range, no item is selected.
If you do not pass the positionsArray parameter, the itemPos parameter represents the position
of the item to be selected.
The optional positionsArray parameter lets you select several items simultaneously within the
list. In positionsArray, you must pass an array where each line indicates the position of an item
to be selected.
When you pass this parameter, the item designated by the itemPos parameter sets the new
current item of the list among the resulting selection. It may or may not belong to the set of
items defined by the array. The current item is, more particularly, the one that is edited if the
EDIT ITEM command is used.
Note: In order for several items to be selected simultaneously in a hierarchical list (manually
or by programming), the multiSelections property must have been enabled for this list. This
property is set using the SET LIST PROPERTIES command.
See Also
SELECT LIST ITEMS BY REFERENCE, Selected list items.
Description
The SELECT LIST ITEMS BY REFERENCE command selects the item(s) whose item reference
number is passed in itemRef and, optionally, in refArray, within the list whose reference
number is passed in list.
If there is no item with the item reference number you passed, the command does nothing.
If an item is not currently visible (i.e., it is located in a collapsed sublist), the command
expands the required sublist(s) so that it becomes visible.
If you do not pass the refArray parameter, the itemRef parameter represents the reference of the
item to be selected. If the item number does not correspond to an item in the list, the
command does nothing. You can also pass the value 0 in this parameter in order to designate
the last item added to the list.
The optional refArray parameter lets you select several items simultaneously within the list. In
refArray, you must pass an array where each line indicates the fixed reference of an item to be
selected.
In this case, the item designated by the itemRef parameter sets the new current item of the list
among the resulting selection. It may or may not belong to the set of items defined by the
array. The current item is, more particularly, the one that is edited if the EDIT ITEM command
is used.
Note: In order for several items to be selected simultaneously in a hierarchical list (manually
or by programming), the multiSelections property must have been enabled for this list. This
property is set using the SET LIST PROPERTIES command.
Example
hList is a list whose items have unique reference numbers. The following object method for a
button selects the parent item (if any) of the currently selected item:
See Also
SELECT LIST ITEMS BY POSITION, Selected list items.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The IMPORT TEXT command reads data from document, a Windows or Macintosh text
document, into the table table by creating new records for that table.
The import operation is performed through the current input form. The import operation
reads fields and variables based on the layering of objects in the input form. For this reason,
you should be very careful about the front-to-back order of text objects (fields and variables) in
the form. The first object into which data will be imported should be in the back of the form,
and so on. If the number of fields or variables in the form does not match the number of fields
being imported, the extra ones are ignored. An input form used for importing cannot contain
any buttons. Subform objects are ignored.
Note: One way to ensure that the data is imported into the correct objects is to select the
object into which the first field should be imported and move it to the front. Continue to
move fields and variables to the front in order, making sure that you have one field or variable
for each field being imported.
An On Validate event is sent to the form method for each record that is imported. If you use
variables in the import form, use this event to copy data from variables to fields, .
The document parameter can include a path that contains volume and folder names. If you
pass an empty string, the standard Open File dialog box is displayed. If the user cancels this
dialog, the import operation is canceled, and the OK system variable is set to 0.
A progress thermometer is displayed during import. The user can cancel the operation by
clicking a button labeled Stop. Records that have already been imported will not be removed if
the user presses the Stop button. If the import is successfully completed, the OK system
variable is set to 1. If an error occurs or the operation was interrupted, the OK variable is set to
0. The thermometer can be hidden with the MESSAGES OFF command.
Example
The following example imports data from a text document. The method first sets the input
form so that the data will be imported through the correct form, changes the 4D delimiter
variables, then performs the import:
See Also
EXPORT TEXT, IMPORT DIF, IMPORT SYLK, USE ASCII MAP.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The EXPORT TEXT command writes data from the records of the current selection of table in
the current process. The data is written to document, a Windows or Macintosh text document
on the disk.
The export operation is performed through the current output form. The export operation
writes fields and variables based on the entry order of the output form. For this reason, use an
output form that contains only the fields or enterable objects that you wish to export. Do not
place buttons or other extraneous objects on the export form. Subform objects are ignored.
An On Load event is sent to the form method for each record that is exported. Use this event
to set the variables you may use in the export form.
The document parameter can name a new or existing document. If document is given the same
name as an existing document, the existing document is overwritten. The document can
include a path that contains volume and folder names. If you pass an empty string, the
standard Save File dialog box is displayed. If the user cancels this dialog, the export operation
is canceled, and the OK system variable is set to 0.
A progress thermometer is displayed during export. The user can cancel the operation by
clicking a Stop button. If the export is successfully completed, the OK system variable is set to
1. If the operation is canceled or an error occurs, the OK system variable is set to 0. The
thermometer can be hidden with the MESSAGES OFF command.
The export operation is made using the default ASCII map for the platform on which it is
executed, unless you change the ASCII map (using the command USE ASCII MAP) prior to the
export. An ASCII map can be used to convert the data for use on other platforms that have a
different ASCII table.
Example
This example exports data to a text document. The method first sets the output form so that
the data will be exported through the correct form, changes the 4D delimiter variables, then
performs the export:
OUTPUT FORM([People];"Export")
FldDelimit:=27 ` Set field delimiter to Escape character
RecDelimit:=10 ` Set record delimiter to Line Feed character
EXPORT TEXT([People];"NewPeople") ` Export to the "NewPeople" document
See Also
EXPORT DIF, EXPORT SYLK, IMPORT TEXT, USE ASCII MAP.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The IMPORT SYLK command reads data from document, a Windows or Macintosh SYLK
document, into the table table by creating new records for that table.
The import operation is performed through the current input form. The import operation
reads fields and variables based on the layering of objects in the input form. For this reason,
you should be very careful about the front-to-back order of text objects (fields and variables) in
the form. The first object into which data will be imported should be in the back of the form,
and so on. If the number of fields or variables in the form does not match the number of fields
being imported, the extra ones are ignored. An input form used for importing cannot contain
any buttons. Subform objects are ignored.
Note: One way to ensure that the data is imported into the correct objects is to select the
object into which the first field should be imported and move it to the front. Continue to
move the fields and variables to the front, in order, making sure that you have one field or
variable for each field being imported.
An On Validate event is sent to the form method for each record that is imported. If you use
variables in the import form, use this event to copy data from variables to fields, .
The document parameter can include a path that contains volume and folder names. If you
pass an empty string, the standard Open File dialog box is displayed. If the user cancels this
dialog, the import operation is canceled, and the OK system variable is set to 0.
A progress thermometer is displayed during the import. The user can cancel the operation by
clicking a Stop button. Records that have already been imported will not be removed if the
user presses the Stop button. If the import is successfully completed, the OK system variable is
set to 1. If an error occurs or the operation was interrupted, the OK variable is set to 0. The
thermometer can be hidden with the MESSAGES OFF command.
Example
The following example imports data from a SYLK document. The method first sets the input
form so the data will be imported through the correct form, then performs the import:
See Also
EXPORT SYLK, IMPORT DIF, IMPORT TEXT, USE ASCII MAP.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The EXPORT SYLK command writes data from the records of the current selection of table in
the current process. The data is written to document, a Windows or Macintosh Sylk document
on the disk.
The export operation is performed through the current output form. The export operation
writes fields and variables based on the entry order of the output form. For this reason, you
should use an output form that contains only the fields or enterable objects that you wish to
export. Do not place buttons or other extraneous objects on the export form. Subform objects
are ignored.
An On Load event is sent to the form method for each record that is exported. Use this event
to set the variables you may use in the export form.
The document parameter can name a new or existing document. If document is given the same
name as an existing document, the existing document is overwritten. The document can
include a path that contains volume and folder names. If you pass an empty string, the
standard Save File dialog box is displayed. If the user cancels this dialog, the export operation
is canceled, and the OK system variable is set to 0.
A progress thermometer is displayed during export. The user can cancel the operation by
clicking a Stop button. If the export is successfully completed, the OK system variable is set to
1. If the operation is canceled or an error occurs, the OK system variable is set to 0. The
thermometer can be hidden with the MESSAGES OFF command.
The export operation is made using the default ASCII map for the platform on which it is
executed, unless you change the ASCII map (using the command USE ASCII MAP) prior to the
export. An ASCII map can be used to convert the data for use on platforms that have a
different ASCII table.
OUTPUT FORM([People];"Export")
EXPORT SYLK([People];"NewPeople") ` Export to the "NewPeople" document
See Also
EXPORT DIF, EXPORT TEXT, IMPORT SYLK, USE ASCII MAP.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The IMPORT DIF command reads data from document, a Windows or Macintosh DIF
document, into the table table by creating new records for that table.
The import operation is performed through the current input form. The import operation
reads fields and variables based on the layering of objects in the input form. For this reason,
you should be very careful about the front-to-back order of text objects (fields and variables) in
the form. The first object into which data will be imported should be in the back of the form,
and so on. If the number of fields or variables in the form does not match the number of fields
being imported, the extra ones are ignored. An input form used for importing cannot contain
any buttons. Subform objects are ignored.
Note: One way to ensure that the data is imported into the correct objects is to select the
object into which the first field should be imported and move it to the front. Continue to
move the fields and variables to the front, in order, making sure that you have one field or
variable for each field being imported.
An On Validate event is sent to the form method for each record that is imported. Use this
event to copy data from variables to fields, if you use variables in the import form.
The document parameter can include a path that contains volume and folder names. If you
pass an empty string, the standard Open File dialog box is displayed. If the user cancels this
dialog, the import operation is canceled, and the OK system variable is set to 0.
A progress thermometer is displayed during import. The user can cancel the operation by
clicking a Stop button. Records that have already been imported will not be removed if the
user presses the Stop button. If the import is successfully completed, the OK system variable is
set to 1. If an error occurs or the operation was interrupted, the OK variable is set to 0. The
thermometer can be hidden with the MESSAGES OFF command.
Example
The following example imports data from a DIF document. The method first sets the input
form so that the data will be imported through the correct form, then performs the import:
See Also
EXPORT DIF, IMPORT SYLK, IMPORT TEXT, USE ASCII MAP.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The EXPORT DIF command writes data from the records of the current selection of table in the
current process. The data is written to document, a Windows or Macintosh DIF document on
the disk.
The export operation is performed through the current output form. The export operation
writes fields and variables based on the entry order of the output form. For this reason, you
should use an output form that contains only the fields or enterable objects that you wish to
export. Do not place buttons or other extraneous objects on the export form. Subform objects
are ignored.
An On Load event is sent to the form method for each record that is exported. Use this event
to set the variables you may use in the export form.
The document parameter can name a new or existing document. If document is given the same
name as an existing document, the existing document is overwritten. The document can
include a path that contains volume and folder names. If you pass an empty string, the
standard Save File dialog box is displayed. If the user cancels this dialog, the export operation
is canceled, and the OK system variable is set to 0.
A progress thermometer is displayed during export. The user can cancel the operation by
clicking a Stop button. If the export is successfully completed, the OK system variable is set to
1. If the operation is canceled or an error occurs, the OK system variable is set to 0. The
thermometer can be hidden with the MESSAGES OFF command.
The export operation is made using the default ASCII map for the platform on which it is
executed, unless you change the ASCII map (using the command USE ASCII MAP) prior to the
export. An ASCII map can be used to convert the data for use on platforms that have a
different ASCII table.
OUTPUT FORM([People];"Export")
EXPORT DIF([People];"NewPeople") ` Export to the "NewPeople" document
See Also
EXPORT SYLK, EXPORT TEXT, IMPORT DIF, USE ASCII MAP.
Description
The IMPORT DATA command allows you to import the data located in the fileName file. 4D can
import the data in the following formats: Text, Fixed length text, XML, SYLK, DIF, DBF
(dBase), and 4th Dimension.
If you pass an empty string to fileName, IMPORT DATA displays the standard save file dialog
box, allowing the user to define the name, type, and location of the import file. Once the
dialog box has been accepted, the Document system variable contains the access path and the
name of the file. If the user clicks Cancel, the execution of the command is stopped and the
OK system variable is set to 0.
• If you do not pass the optional parameter project, the import dialog box is displayed. The
user can define then import parameters or load an existing import project.
Note: An import project contains all the import parameters such as the tables and fields in
which to import, the delimiters to use, and so on. Those parameters are defined in the import
dialog box. An import project can be saved to disk to be loaded and used later. For more
information about the import dialog box, please refer to the 4DUser Mode manual.
• If you pass a BLOB containing a valid import project in the project parameter, the import
will be directly performed and will not require the user's intervention. The project must
already be predefined in the import dialog box, then saved. To do so, you have two possible
solutions:
- Save the project to disk, then load it, using the DOCUMENT TO BLOB command, in a BLOB
field or a BLOB variable that you pass in project.
Note: Refer to the EXPORT DATA command for an example concerning the definition of an
empty project.
The optional parameter *, if it is specified, forces the display of the import dialog box with the
import parameters set as they were defined in project. This feature allows you to use a
predefined project, while still having the possibility to modify one or more of the parameters.
Furthermore, the project parameter contains, after closing the import dialog box, the
parameters of the “new” project. You can then store the new project in a BLOB field, on disk,
and so on.
See Also
EXPORT DATA, IMPORT DIF, IMPORT SYLK, IMPORT TEXT.
Description
The EXPORT DATA command allows you to export data in the fileName file. 4D can export data
in the following formats: Text, Fixed length text, XML, SYLK, DIF, DBF (dBase), and
4th Dimension.
If you pass an empty string in fileName, EXPORT DATA displays the standard save file dialog
box, allowing the user to define the name, type, and location of the export file. Once the
dialog box has been accepted, the Document system variable contains the access path and the
name of the file. If the user clicks Cancel, the execution of the command is stopped and the
OK system variable is equal to 0.
• If you don’t pass the optional parameter project, the export dialog box is displayed. The user
can define the export parameters or load an existing export project.
Note: An export project contains all the export parameters such as the tables and fields to
export, delimiters, etc. You define these parameters in the export dialog box. A project can be
saved to disk and then loaded. For more information about the export dialog box, please refer
to the 4D User Mode manual.
• If you pass a BLOB containing a valid export project to the project parameter, the export will
be directly performed, without the user intervening. The project must already be predefined in
the export dialog box, then saved. To do so, you have two possible solutions:
- Save the project to disk, then load it by using the DOCUMENT TO BLOB command, in a field
or a variable of type BLOB that you pass to the project parameter.
The optional parameter *, if it is specified, forces the display of the export dialog box with the
parameters defined in project. This feature allows you to use a predefined project, while still
having the possibility to modify one or more of the parameters. Furthermore, the project
parameter contains, after closing the export dialog box, the parameters of the “new” project.
You can then store the new project in a BLOB field, on disk, etc.
Example
This example creates an empty project and stores the parameters set by the user in the export
dialog box there:
C_BLOB($exportParams)
SET BLOB SIZE($exportParams;0) `Initialization of BLOB
EXPORT DATA("DocExport.txt";$exportParams;*) ` Display of the export dialog box
See Also
EXPORT DIF, EXPORT SYLK, EXPORT TEXT, IMPORT DATA.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ON EVENT CALL command installs the method, whose name you pass in eventMethod, as
the method for catching (trapping) events. This method is called the event-handling method
or event-catching method.
Tip: This command requires advanced programming knowledge. Usually, you do not need to
use ON EVENT CALL for working with events. While using forms, 4th Dimension handles the
events and sends them to the appropriate forms and objects.
Tip: Version 6 introduces new commands, such as GET MOUSE, Shift down, etc., for getting
information about events. These commands can be called from within object methods to get
the information you need about an event involving an object. Using them spares you the
writing of an algorithm based on the ON EVENT CALL scheme.
The scope of this command is the current working session. By default, the method is run in a
separate local process. You can have only one event-handling method at a time. To stop
catching events with a method, call ON EVENT CALL again and pass an empty string in
eventMethod.
Since the event-handling method is run in a separate process, it is constantly active, even if no
4th Dimension method is running. After installation, 4th Dimension calls the event-handling
method each time an event occurs. An event can be a mouse click or a keystroke.
The optional processName parameter names the process created by the ON EVENT CALL
command. If processName is prefixed with a dollar sign ($), a local process is started, which is
usually what you want. If you omit the processName parameter, 4D creates, by default, a local
process named $Event Manager.
In the event-handling method, you can read the following system variables—MouseDown,
KeyCode, Modifiers, MouseX, MouseY, and MouseProc. Note that these variables are process
variables. Their scope is therefore the event-handling process. Copy them into interprocess
variables if you want their values available in another process.
• The MouseDown system variable is set to 1 if the event is a mouse click, and to 0 if it is not.
• The KeyCode system variable is set to the ASCII code for a keystroke. This variable may
return an ASCII code or a function key code. These codes are listed in the sections ASCII Codes
(and its subsections) and Function Key Codes. 4D provides predefined constants for the major
ASCII Codes and for Function Key Codes. In the Explorer window, look for the themes of these
constants.
• The Modifiers system variable contains the modifier value. It indicates whether any of the
following modifier keys were down when the event occurred:
Platform Modifiers
Windows Shift key, Caps Lock, Alt key, Ctrl key, Right mouse button
Macintosh Shift key, Caps Lock, Option key, Command key, Control key
Notes
- The Windows ALT key is equivalent to the Macintosh Option key.
- The Windows Ctrl key is equivalent to the Macintosh Command key.
- The Macintosh Control key has no equivalent on Windows. However, a right mouse button
click on Windows is equivalent to a Control-Click on Macintosh.
The modifier keys do not generate an event; another key or the mouse button must also be
pressed. The Modifiers variable is a 4-byte Long Integer variable that should be seen as an array
of 32 bits. 4D provides predefined constants expressing bit positions or bit masks for testing
the bit corresponding to each modifier key. For example, to detect if the Shift key was pressed
for the event, you can write:
• The system variables MouseX and MouseY contain the horizontal and vertical positions of
the mouse click, expressed in the local coordinate system of the window where the click
occurred. The upper left corner of the window is position 0,0. These are meaningful only
when there is a mouse click.
• The MouseProc system variable contains the process reference number of the process in
which the event occurred (mouse click).
Important: The system variables MouseDown, KeyCode, Modifiers, MouseX, MouseY, and
MouseProc contain significant values only within an event-handling method installed with
ON EVENT CALL.
Example
This example will cancel printing if the user presses Ctrl+period. First, the event-handling
method is installed. Then a message is displayed, announcing that the user can cancel
printing. If the interprocess variable <>vbWeStop is set to True in the event-handling method,
the user is alerted to the number of records that have already been printed. Then the event-
handling method is deinstalled:
PAGE SETUP
If (OK=1)
<>vbWeStop:=False
ON EVENT CALL("EVENT HANDLER") ` Installs the event-handling method
ALL RECORDS([People])
MESSAGE("To interrupt printing press Ctrl+Period")
$vlNbRecords:=Records in selection([People])
For ($vlRecord;1;$vlNbRecords)
If (<>vbWeStop)
ALERT("Printing cancelled at record "+String($vlRecord)+" of "+
String($vlNbRecords))
$vlRecord:=$vlNbRecords+1
Else
Print form([People];"Special Report")
End if
End for
PAGE BREAK
ON EVENT CALL("") ` Deinstalls the event-handling method
End if
Note that this example uses ON EVENT CALL because it performs a special printing report using
the PAGE SETUP, Print form and PAGE BREAK commands with a For...End for loop.
If you print a report using PRINT SELECTION, you do NOT need to handle events that let the
user interrupt the printing; PRINT SELECTION does that for you.
See Also
FILTER EVENT, GET MOUSE, Method called on event, Shift down.
version 6.8.1
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Method called on event command returns the name of the method installed by the ON
EVENT CALL command.
See Also
ON EVENT CALL.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
FILTER EVENT
Description
You call the FILTER EVENT command from within an event-handling project method installed
using the ON EVENT CALL command.
If an event-handling method calls FILTER EVENT, the current event is not passed to 4D.
This command allows you to remove the current event (i.e., click, keystroke) from the event
queue, so 4D will not perform any additional treatment to the one you made in the event-
handling project method.
WARNING: Avoid creating an event-handling method that only calls the FILTER EVENT
command, because all the events are going to be ignored by 4D. In case you have an event-
handling method with only the FILTER EVENT command, type Ctrl+Shift+Backspace (on
Windows) or Command-Option-Shift-Control-Backspace (on Macintosh). This converts the
On Event Call process into a normal process that does not get any events at all.
Special case: The FILTER EVENT command can also be used within a standard output form
method when the form is displayed using the DISPLAY SELECTION or MODIFY SELECTION
commands. In this specific case, the FILTER EVENT command allows you to filter double-clicks
on the records (and in this way execute actions other than the opening of records in page
mode).
To do this, place the following lines in the output form method:
See Also
ON EVENT CALL.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ON ERR CALL command installs the project method, whose name you pass in errorMethod,
as the method for catching (trapping) errors. This project method is called the error-handling
method or error-catching method.
The scope of this command is the current process. You can have only one error-handling
method per process at a time, but you can have different error-handling methods for several
processes.
To stop the trapping of errors, call ON ERR CALL again and pass the empty string in
errorMethod.
Once an error-handling project is installed, 4th Dimension calls the method each time an
error occurs.
You can identify errors by reading the Error system variable, which contains the code number
of the error. Error codes are listed in the theme Error codes. For more information, see the
section Syntax Errors or Database Engine Errors. The Error variable value is significant only
within the error-handling method; if you need the error code within the method that
provoked the error, copy the Error variable to your own process variable.
The error-handling method should manage the error in an appropriate way or present an error
message to the user. Errors can be generated by:
• The 4th Dimension database engine; for example, when saving a record tries to duplicate a
unique index key.
• The 4th Dimension environment; for example, when you do not have enough memory for
allocating an array.
• The operating system on which the database is runs; for example, disk full or I/O errors.
Examples
1. The following project method tries to create a document whose name is received as
parameter. If the document cannot be created, the project metod returns 0 (zero) or the error
code:
gError:=0
ON ERR CALL("IO ERROR HANDLER")
$2->:=Create document($1)
ON ERR CALL("")
$0:=gError
The IO ERROR HANDLER project method is listed here:
Note the use of the gError process variable to get the error code result within the current
executing method. Once these methods are present in your database, you can write:
` ...
C_TIME(vhDocRef)
$vlErrCode:=Create doc($vsDocumentName;->vhDocRef)
If ($vlErrCode=0)
`...
CLOSE DOCUMENT($vlErrCode)
Else
3. While implementing a complex set of operations, you may end up with various subroutines
that require different error-handling methods. You can have only one error-handling method
per process at a time, so you have two choices:
- Keep track of the current one each time you call ON ERR CALL, or
- Use a process array variable (in this case, asErrorMethod) to “pile up” the error-handling
methods and a project method (in this case, ON ERROR CALL) to install and deinstall the error-
handling methods.
You must initialize the array at the very beginning of the process execution:
C_STRING(63;$1;$ErrorMethod)
C_LONGINT($vlElem)
If (Count parameters>0)
$ErrorMethod:=$1
Else
$ErrorMethod:=""
End if
If ($ErrorMethod#"")
C_LONGINT(gError)
gError:=0
$vlElem:=1+Size of array(asErrorMethod)
INSERT ELEMENT(asErrorMethod;$vlElem)
asErrorMethod{$vlElem}:=$1
ON ERR CALL($1)
Else
gError:=0
ON ERROR CALL("IO ERRORS") ` Installs the IO ERRORS error-handling method
` ...
ON ERROR CALL("ALL ERRORS") ` Installs the ALL ERRORS error-handling method
` ...
ON ERROR CALL ` Deinstalls ALL ERRORS error-handling method and reinstalls IO ERRORS
` ...
ON ERROR CALL ` Deinstalls the IO ERRORS error-handling method
` ...
See Also
ABORT, Method called on error.
version 6.8.1
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Method called on error command returns the name of the method installed by the ON ERR
CALL command for the current process.
Example
This command is particularly useful in the context of components because it enables you to
temporarily change and then restore the error-catching methods:
See Also
ON ERR CALL.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
ABORT
Description
The ABORT command is to be used from within an error-handling project method installed
using the command ON ERR CALL.
If you do not have an error-handling project method, when an error occurs (for example, a
database engine error) 4D displays its standard error dialog box and then interrupts the
execution of your code. If the code being executed is:
• An object method, form method (or a project method called by a form or object method),
the control returns to the form currently being displayed.
• A method called from a menu, the control returns to the menu bar or to the form currently
being displayed.
• The master method of a process, the process then ends.
• A method called directly or indirectly by an import or export operation, the operation is
stopped. The same is true for sequential queries or order by operations.
• And so on...
If you use an error-handling project method to catch errors, 4D neither displays its standard
error dialog box nor interrupts the execution of your code. Instead, 4D calls your error-
handling project method (that you can see as an exception handler), and resumes the
execution to the next line of code in the method that triggered the error.
There are errors you can treat programmatically; for example, during an import operation, if
you catch a database engine duplicated value error, you can “cover” the error and pursue the
import. However, there are errors that you cannot process and errors that you should not
“cover.” In these cases, you need to stop the execution by calling ABORT from within the error-
handling project method.
See Also
ON ERR CALL.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Count parameters command returns the number of parameters passed to a project method.
WARNING: Count parameters is meaningful only in a project method that has been called by
another method (project method or other). If the project method calling Count parameters is
associated with a menu, Count parameters returns 0.
Examples
1. 4th Dimension project methods accept optional parameters, starting from the right.
For example, you can call the method MyMethod(a;b;c;d) in the following ways:
MyMethod ( a ; b ; c ; d ) ` All parameters are passed
MyMethod ( a ; b ; c ) ` The last parameter is not passed
MyMethod ( a ; b ) ` The last two parameters are not passed
MyMethod ( a ) ` Only the first parameter is passed
MyMethod ` No Parameter is passed at all
Using Count parameters from within MyMethod, you can detect the actual number of
parameters and perform different operations depending on what you have received. The
following example displays a text message and can insert the text into a 4D Write area or send
the text into a document on disk:
` APPEND TEXT Project Method
` APPEND TEXT ( Text { ; Long { ; Time } } )
` APPEND TEXT ( Text { ; 4D Write Area { ; DocRef } } )
C_TEXT ($1)
C_TIME ($2)
C_LONGINT ($3)
After this project method has been added to your application, you can write:
2. 4th Dimension project methods accept a variable number of parameters of the same type,
starting from the right. To declare these parameters, you use a compiler directive to which you
pass ${N} as a variable, where N specifies the first parameter. Using Count parameters you can
address those parameters with a For loop and the parameter indirection syntax. This example
is a function that returns the greatest number received as parameter:
` Max of Project Method
` Max of ( Real { ; Real2... ; RealN } ) -> Real
` Max of ( Value { ; Value2... ; ValueN } ) -> Greatest value
C_REAL ($0;${1}) ` All parameters will be of type REAL as well as the function result
$0:=${1}
For ($vlParam;2;Count parameters)
If (${$vlParam}>$0)
$0:=${$vlParam}
End if
End for
After this project method has been added to your application, you can write:
vrResult:=Max of (Records in set("Operation A");Records in set("Operation B"))
or:
vrResult:=Max of (r1;r2;r3;r4;r5;r6)
See Also
Compiler Commands.
Description
The Type command returns a numeric value that denotes the type of the field or variable you
pass as fieldVar.
Compatibility Note: In previous versions of 4D, Type returned 3 (Is Picture) when applied to a
Graph variable declared using the command C_GRAPH. Starting with version 6, Type returns
9 (Is LongInt) when applied to a Graph variable.
You can apply Type to fields, interprocess variables, process variables, local variables, and
dereferenced pointers referring to these types of objects.
Version 6 Note: Starting with version 6, you can apply Type to parameters ($1,$2..., ${...}), or
to project method or function results ($0).
Examples
1. See example for the APPEND TO CLIPBOARD command.
3. The following project method empties some or all of the fields for the current record of the
table whose a pointer is passed as parameter. It does this without deleting or changing the
current record:
C_POINTER ($1)
C_LONGINT ($2;$vlTypeFlags)
If (Count parameters>=2)
$vlTypeFlags:=$2
Else
$vlTypeFlags:=0xFFFFFFFF
End if
See Also
Is a variable, Undefined.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Self → Pointer
Function result Pointer ← Pointer to form object (if any) whose method is
currently being executed.
Otherwise Nil (->[]) if outside of context
Description
The Self command returns a pointer to the object whose object method is currently being
executed.
Self is used to reference a variable within its own object method. It returns a valid pointer only
when it is called from within an object method. It cannot be used in a project method, even
when called from an object method. If Self is called out of context, it returns a Nil pointer
(->[]).
Tip: Self is useful when several objects on a form need to perform the same task, yet operate on
themselves.
Example
See the example for the RESOLVE POINTER command.
See Also
RESOLVE POINTER.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The RESOLVE POINTER command retrieves the information of the object referenced by the
pointer expression pointer and returns it into the parameters varName, tableNum, and fieldNum.
Depending on the nature of the referenced object, RESOLVE POINTER returns the following
values:
Notes:
• If the value you pass in pointer is not a pointer expression, a syntax error occurs.
• The RESOLVE POINTER command does not work with pointers to local variables. In fact, by
definition several local variables with the same name could exist in different locations, so it is
not possible for the command to find the correct variable.
2. For debugging purposes, you need to verify that the second parameter ($2) to a method is a
pointer to a table. At the beginning of this method, you write:
` ...
If (<>DebugOn)
RESOLVE POINTER($2;$vsVarName;$vlTableNum;$vlFieldNum)
If (Not(($vlTableNum>0)&($vlFieldNum=0)&($vsVarName="")))
` WARNING: The pointer is not a reference to a table
TRACE
End
End if
` ...
See Also
DRAG AND DROP PROPERTIES, Field, Get pointer, Is a variable, Nil, Table.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Nil command returns True if the pointer you pass in aPointer is Nil (->[]). It returns False in
all other cases (pointer to field, table or variable).
Starting with version 6, instead of using Nil, it will be more convenient to use RESOLVE
POINTER, which tells you about the nature of the referenced object, no matter what the object
is (including Nil pointers).
See Also
Is a variable, RESOLVE POINTER.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Is a variable command returns True if the pointer you pass in aPointer references a defined
variable. It returns False in all other cases (pointer to field or table, Nil pointer, and so on).
Starting with version 6, instead of using Is a variable, it will be more convenient to use RESOLVE
POINTER, which tells you about the nature of the referenced object, no matter what the object
is (including the case of Nil pointers).
See Also
Nil, RESOLVE POINTER.
Description
The Get pointer command returns a pointer to the process or interprocess variable whose name
you pass in varName.
To get a pointer to a field, use Field. To get a pointer to a table, use Table.
Note: You can pass expressions such as, for example, ArrName+"{3}" to Get pointer. However,
you cannot use 2D array elements (ArrName+"{3}{5}") or variable elements
(ArrName+"{myVar}").
Example
In a form, you build a 5 x 10 grid of enterable variables named v1, v2... v50. To initialize all of
these variables, you write:
` ...
For ($vlVar;1;50)
$vpVar:=Get pointer("v"+String($vlVar))
$vpVar->:=""
End for
See Also
Field, Table.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
EXECUTE (statement)
Description
EXECUTE executes statement as a line of code. The statement string must be one line. If
statement is an empty string, EXECUTE does nothing.
The rule of thumb is that if the statement can be executed as a one line method, then it will
execute properly.
In a compiled database, the line of code is not compiled. This means that statement will be
executed, but it will not have been checked by the compiler at compilation time.
The statement can include process variables and interprocess variables. The statement cannot
contain control of flow statements, because it must be in one line of code.
Example
See examples for the Command Name command.
See Also
Command name, EDIT FORMULA.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Command name command returns the literal name of the command whose command
number you pass in command.
4th Dimension integrates a dynamic translation of the keywords, constants, and command
names used in your methods. For example, if you use the English version of 4D, you write:
DEFAULT TABLE ([MyTable])
ALL RECORDS ([MyTable])
This same code, reopened with the French version of 4D, will read:
TABLE PAR DEFAUT ([MyTable])
TOUT SELECTIONNER ([MyTable])
However, 4th Dimension also includes a unique feature, the EXECUTE command, which allows
you to build code on the fly and then execute this code, even though the database is compiled.
The example code, written with EXECUTE statements in English, looks like:
EXECUTE ( "DEFAULT TABLE([MyTable])")
EXECUTE ( "ALL RECORDS([MyTable])")
This same code, reopened with the French version of 4D, will then read:
EXECUTER ( "DEFAULT TABLE([MyTable])")
EXECUTER ( "ALL RECORDS([MyTable])")
4D automatically translates EXECUTE (English) to EXECUTER (French), but cannot translate the
text statement you passed to the command.
Note: To know the number of a command, refer to the Command Syntax by Name section.
Examples
1. For all the tables of your database, you have a form called “INPUT FORM” used for standard
data entry in each table. Then, you want to add a generic project method that will set this
form as the current input form for the table whose pointer or name you pass. You write:
` STANDARD INPUT FORM project method
` STANDARD INPUT FORM ( Pointer {; String })
` STANDARD INPUT FORM ( ->Table {; TableName })
C_POINTER ($1)
C_STRING (31;$2)
If (Count parameters>=2)
EXECUTE (Command name (55)+"(["+$2+"];"INPUT FORM")")
Else
If (Count parameters>=1)
INPUT FORM ($1->;"INPUT FORM")
End if
End if
After this project method has been added to your database, you write:
STANDARD INPUT FORM (->[Employees])
STANDARD INPUT FORM ("Employees")
Note: Usually, it is better to use pointers when writing generic routines. First, the code will run
compiled if the database is compiled. Second, 4D Insider will retrieve the references to the
object whose pointer you pass. Third, as in the previous example, your code can cease to work
correctly if you rename the table. However, in certain cases, using EXECUTE will solve the
problem.
In the English version of 4D, the drop-down list will read: Sum, Average, Min, and Max. In the
French version, the drop-down list will read: Somme, Moyenne, Min, and Max.
See Also
Command Syntax by Name, EXECUTE.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Current method name command returns the method name where it has been invoked.
This command is useful for debugging generic methods.
According to the calling method type, the returned string can be as follows:
Note: For this command to be able to operate in compiled mode, the database must have been
compiled with the Range Checking option (located in the application Preferences) selected.
In order to deactivate range checking in a method (or a part of a method) locally, you can use
the following special comments:
`%R- to deactivate range checking
`%R+ to activate range checking
`%R* to restore the initial state of range checking (defined in the Preferences).
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
TRACE
Description
You use TRACE to trace methods during the development of a database.
The TRACE command turns on the 4th Dimension Debugger for the current process. The
debugger window is displayed before the next line of code is executed, and continues to be
displayed for each line of code that is executed. You can also turn on the debugger by pressing
Alt+Shift+right-click (Windows) or Control+Option+Command+click (Macintosh) while code is
executing.
In compiled databases, the TRACE command is ignored.
4D Server: If you call TRACE from a project method executed within the context of a Stored
Procedure, the debugger window appears on the Server machine.
Tip: Do not place TRACE calls when using a form whose On Activate and On Deactivate events
have been enabled. Each time the debugger window appears, these events will be invoked; you
will then loop infinitely between these events and the debugger window. If you end up in this
situation, Shift+click on the No Trace button of the debugger in order to get out of it. Any
subsequent calls to TRACE within the process will be ignored.
Example
The following code expects the process variable BUILD_LANG to be equal to “US” or “FR”. If
this is not the case, it calls the project method DEBUG:
` ...
Case of
: (BUILD_LANG="US")
vsBHCmdName:=[Commands]CM US Name
: (BUILD_LANG="FR")
vsBHCmdName:=[Commands]CM FR Name
Else
C_TEXT ($1)
See Also
NO TRACE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
NO TRACE
Description
You use NO TRACE when checking the execution of methods during the development of a
database.
NO TRACE turns off the debugger engaged by TRACE, by an error, or by the user. Using NO
TRACE has the same effect as clicking the No Trace button in the debugger.
See Also
TRACE.
The commands of this theme are dedicated to handling form objects of the List box type.
List boxes are comparable to Grouped Scrollable Areas. A list box provides all the functions
of grouped scrollable areas, notably the ability to represent data in the form of columns
and selectable rows. However, the list box does even more than that, including the ability
to enter values, sort columns, define alternating colors, etc.
You can set up a List box completely in the 4th Dimension Form editor and can also
manage it through programming. For more information on creating and setting List boxes
in the Form editor as well as on their use, refer to the Design Reference manual of the 4th
Dimension documentation.
Programming List box objects is done in the same way as other 4th Dimension list form
objects. However, specific rules must be followed, as detailed in this section.
Note: List box objects are designed for screen interfaces only. They cannot be printed.
A list box can contain one or more columns. Each column must be associated with a one-
dimensional 4th Dimension array; all array types can be used, with the exception of
pointer arrays. The display format for each column can be defined in the Form editor or by
using the SET FORMAT command.
Note: When a List box object contains several columns, each related array must have the
same size (same number of items) as the others, otherwise only the number of items of the
smallest array will be displayed.
Warning : When a list box contains several columns of different sizes, only the number of
items of the smallest array (column) will be displayed. You should make sure that each
array has the same number of elements as the others. Also, if a list box column is empty
(this occurs when the associated array was not correctly declared or sized using the
language), the list box displays nothing.
Notes:
• All the commands of the “List Box” theme apply only to List box objects, except for the
SET LISTBOX COLUMN WIDTH command (applies to object, column and header) and Get
listbox column width command (applies to column and header only).
• Only the color of the text of column headers can be modified using the SET COLOR and
SET RGB COLORS commands.
Object methods
It is possible to add an object method to the list box object and/or to each column of the
list box. Object methods are called in the following order:
1. Object method of each column
2. Object method of the list box
The column object method gets events that occur in its header.
Focus object
The Focus object function (“User Interface” theme) returns a pointer to the column of the
list box with the focus (i.e. to an array). The 4th Dimension pointer mechanism allows you
to see the item number of the modified array. For example, supposing a user modified the
5th line of the column col2:
$Column:=Focus object
` $Column contains a pointer to col2
$Row:= $Column-> `$Row equals 5
SCROLL LINES
The SCROLL LINES command (“User Interface” theme) can be used with a list box. It scrolls
the list box rows so that the first selected row or a specified row is displayed.
EDIT ITEM
The EDIT ITEM command (“Entry Control” theme) allows you to pass a cell of a list box
object into edit mode.
Form events
Specific form events are intended to facilitate list box management, in particular
concerning drag and drop and sort operations. For more information, refer to the
description of the Form event command.
By default, the list box automatically handles standard column sorts when the header is
clicked. A standard sort is an alphanumeric sort of column values, alternately
ascending/descending with each successive click. All columns are always synchronized
automatically.
You can forbid standard user sorts by deselecting the “Sortable” property of the list box.
The developer can set up custom sorts using the SORT LISTBOX COLUMNS command and/or
combining the On Header Click and On After Sort form events (see the Form event
command) and array management 4D commands.
Note: The “Sortable” column property only affects the standard user sorts; the SORT
LISTBOX COLUMNS command does not take this property into account.
The value of the variable related to the column header allows you to manage additional
information: the current sort of the column (read) and the display of the sort arrow.
• If the variable is set to 0, the column is not sorted and the sort arrow is not displayed;
• If the variable is set to 1, the column is sorted in ascending order and the sort arrow is
displayed;
• If the variable is set to 2, the column is sorted in descending order and the sort arrow is
displayed.
You can set the value of the variable (for example, Header2:=2) in order to “force” the sort
arrow display. The column sort itself is not modified in this case; it is up to the developer
to handle it.
Managing selections
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The SELECT LISTBOX ROW command can be used to select one or more rows of the list box
by programming.
The variable linked to the List box object is used to get, set or store selections of object
rows.
This variable corresponds to a Boolean array that is automatically created and maintained
by 4th Dimension. The size of this array is determined by the size of the list box: it
contains the same number of elements as the smallest array linked to the columns.
Note: The Count in array command can be used to find out the number of selected lines.
For example, this method allows inverting the selection of the first row of the list box:
ARRAY BOOLEAN(tBListBox;10)
` tBListBox is the name of the list box variable in the form
If (tBListBox{1} = True)
tBListBox{1}:= False
Else
tBListBox{1}:= True
End if
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The INSERT LISTBOX COLUMN command inserts a column in the list box set by the object
and * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
The new column is inserted just in front of the column set using the colPosition parameter.
If the colPosition parameter is greater than the total number of columns, the column is
added after the last column.
Pass the name of the object and the variable of the inserted column in the colName and
colVariable parameters. The name of the variable must match the name of the array whose
contents will be displayed in the column.
Pass the object name and the variable of the inserted column header in the headerName
and headerVar parameters.
Note: Object names must be unique in a form. You must be sure that the names passed in
the colName and headerName parameters are not already used. Otherwise, the column is
not created and an error is generated.
C_LONGINT(HeaderVarName;$Last;RecNum)
ALL RECORDS([Table 1])
$RecNum:=Records in table([Table 1])
ARRAY PICTURE(Picture;$RecNum)
See Also
DELETE LISTBOX COLUMN.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DELETE LISTBOX COLUMN command removes one or more columns (visible or
invisible) in the list box set in the object et * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
If you do not pass the optional number parameter, the command simply removes the
column set in the colPosition parameter.
Otherwise, the number parameter indicates the number of columns to remove to the right
starting from the column colPosition (this one included).
If the colPosition parameter is greater than the number of columns in the list box, the
command does nothing.
See Also
Get number of listbox columns, INSERT LISTBOX COLUMN.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get number of listbox columns command returns the total number of columns (visible
or invisible) present in the list box set in the object and * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information on object names, refer to the Object Properties section.
See Also
DELETE LISTBOX COLUMN.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
SORT LISTBOX COLUMNS ({*; }object; colNum; order{; colNum2; order2; ...; colNumN;
orderN})
Description
The SORT LISTBOX COLUMNS command sorts the rows of the list box set in the object and *
parameters on the basis of one or more column value(s).
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
In colNum, pass the column number of the column whose values you want to use as the
sort criteria. You can use any type of array data, except pictures and pointers.
In order, pass the symbol > or < to indicate the sort order. If order contains the “greater
than” symbol (>), the sort order is ascending. If order contains the “less than” symbol (<),
the sort oder is descending.
You can define multi-level sorts: to do so, pass as many pairs (colNum;order) as necessary.
The sorting level is defined by the position of the parameter in the call.
In conformity with the principle of list box operation, the columns are synchronized which
means that the sorting of a column is automatically passed on to all the other columns of
the object.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET LISTBOX COLUMN WIDTH command allows you to modify through programming
the width of one or all column(s) of the object (list box, column or header) set using the
object and * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (a string). If you do not pass this paraemter, you indicate that the object parameter is
a variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
Pass the new width (in pixels) of the object in the width parameter.
• If object sets the list box object, all columns of the list box are resized.
• If object sets a column or a column header, only the column set is resized.
See Also
Get listbox column width.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get listbox column width command returns the width (in pixels) of the column set in
the object and * parameters. You can pass either a list box column or a column header in
the object parameter.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
See Also
SET LISTBOX COLUMN WIDTH.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The MOVED LISTBOX COLUMN NUMBER command returns two numbers in oldPosition and
newPosition indicating respectively the previous position and the new position of the
column moved in the list box, specified by the object and * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
This command must be used with the form event On column moved (see the Form event
command).
See Also
Form event, MOVED LISTBOX ROW NUMBER.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SELECT LISTBOX ROW command selects the row whose number is passed in position in
the list box set in the object and * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
The optional action parameter, if passed, is used to define the selection action to execute
when a selection of rows already exists in the list box. You can pass a value or one of the
following constants (located in the “List box” theme):
• Replace listbox selection (0): The row selected becomes the new selection and replaces the
existing selection. The command has the same effect as a user click on a row. This is the
default action (if the action parameter is omitted).
• Add to listbox selection (1): The row selected is added to the existing selection. If the row
specified already belongs to the existing selection, the command does nothing.
• Remove from listbox selection (2): The row selected is removed from the existing selection.
If the row specified does not belong to the existing selection, the command does nothing.
When the position parameter does not correspond exactly to an existing row number, the
command works as follows:
• If position is <0, the command does nothing, regardless of the action parameter value.
• If position is 0 and if the action parameter contains Replace listbox selection or is omitted,
all the rows of the listbox are selected. If the action parameter contains Remove from listbox
selection, all the listbox rows are deselected.
Notes:
• If you want the list box to scroll automatically in order to display the row selected, use
the SCROLL LINES command.
• To switch a row into editing mode (to allow data entry), use the EDIT ITEM command.
See Also
DELETE LISTBOX ROW, EDIT ITEM, INSERT LISTBOX ROW, SCROLL LINES.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The INSERT LISTBOX ROW command inserts a new row in the list box set in the object and *
parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
The row is inserted at the position set by the position parameter. A new row is automatically
added at this position in all the arrays used by the list box columns, whatever their type
and their visibility.
If the position value is higher than the total number of rows in the list box, the row is
added at the end of each array. If it is equal to 0, the row is added at the beginning of each
array. If it contains a negative value, the command does nothing.
See Also
DELETE LISTBOX ROW.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DELETE LISTBOX ROW command deletes the row number position (visible or not) from
the list box set in the object and * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
Keep in mind that after command execution, there will no longer be any element selected
in the list box.
The position row is automatically removed from all the arrays used by the list box columns.
If the position value is higher than the total number of rows in the list box, the command
does nothing.
See Also
Get number of listbox rows, INSERT LISTBOX ROW.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get number of listbox rows command returns the number of rows in the list box set in
the object and * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
Note: If the arrays associated with the columns of a List box do not all have the same size,
only the number of items corresponding to the smallest array will appear in the list box
and thus be returned by this command.
See Also
DELETE LISTBOX ROW, INSERT LISTBOX ROW.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET LISTBOX ROWS HEIGHT command allows you to modify by programming the row
height in the list box object set using the object and * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
See Also
Get listbox rows height.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get listbox rows height command returns the current row height (in pixels) in the list
box object set using the object and * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
See Also
SET LISTBOX ROWS HEIGHT.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The MOVED LISTBOX ROW NUMBER command returns two numbers in oldPosition and
newPosition indicating respectively the previous position and the new position of the row
moved in list box, specified by the object and * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
This command must be used with the form event On row moved (see the Form event
command).
See Also
Form event, MOVED LISTBOX COLUMN NUMBER.
version 2004.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET LISTBOX CELL POSITION command returns the numbers of the column and the row
that correspond to the location of the last mouse click or the last selection made via the
keyboard in the listbox designated by * and object.
This command returns the coordinates of a click or a selection action even when data entry
is not allowed in the list box.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (a string). If you omit this parameter, you indicate that the object parameter is a
variable.
The optional colVar parameter returns a pointer to the variable (i.e. array) associated with
the column.
This command can only be called in the framework of a list box that generates one of the
following form events:
• On Clicked and On Double Clicked
• On Before Keystroke and On After Keystroke
• On After Edit
• On Getting Focus and On Losing Focus
• On Data Change
• On Selection Change
• On Before Data Entry
When the command is called outside of this context, GET LISTBOX CELL POSITION returns 0
in both column and row.
This command takes into account any selection or deselection actions whether by mouse
click, via keyboard keys, or using the EDIT ITEM command (which can generate the On
Getting Focus event).
The values returned by the command are not updated in the case of a right mouse click (or
Control+click under Mac OS) on the header of a list box column..
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET LISTBOX ARRAYS command returns a set of synchronized arrays providing
information on each column (visible or invisible) in the list box set in the object and *
parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
See Also
Get listbox information.
Description
The Get listbox information command returns various information regarding the current
visibility and size of headers and scrollbars in the list box object set using the object and *
parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
In the dans info parameter, pass a value indicating the type of information that you want to
get. You can use a value or one of the following constants from the “List box” theme:
Constant Type Value Returned value(s)
Display listbox header Longint 0 0=hidden, 1=shown
Listbox header height Longint 1 Height in pixels
Display listbox hor scrollbar Longint 2 0=hidden, 1=shown
Listbox hor scrollbar height Longint 3 Height in pixels
Display listbox ver scrollbar Longint 4 0=hidden, 1=shown
Listbox ver scrollbar width Longint 5 Width in pixels
Position listbox hor scrollbar Longint 6 Position of the cursor in pixels
Position listbox ver scrollbar Longint 7 Position of the cursor in pixels
• The first six constants are useful for calculating the actual size of a list box area in a form.
• When you use the constants Position listbox hor scrollbar or Position listbox ver
scrollbar, the Get listbox information command returns the position of the scrolling cursor
in relation to its original position, i.e. the size of the hidden part of the window, expressed
in pixels. By default, this position corresponds to 0. Combined, for example, with
information concerning the row height, this value lets you find out the contents displayed
in the listbox.
If, for instance, $scroll returns 200, you can conclude that the 11th row is currently the first
one displayed in the list box (200/20=10, thus 10 rows are hidden).
See Also
SET SCROLLBAR VISIBLE, SHOW LISTBOX GRID.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SHOW LISTBOX GRID command allows you to display or hide the horizontal and/or
vertical grid lines that make up the grid in the list box object set using the object and *
parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
Pass the Boolean values in horizontal and vertical that indicate if the corresponding grid
lines should be displayed valeurs (True) or hidden (False). The grid is displayed by default.
See Also
Get listbox information, SET LISTBOX GRID COLOR.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET LISTBOX GRID COLOR command allows you to modify the color of the grid in the
list box object set using the object and * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
Pass the RGB color value in color. For more information on RGB colors, refer to the
description of the SET RGB COLORS command.
The horizontal and vertical parameters allow you to set the grid lines to which you will
apply a color:
• If you pass True in horizontal, the color will be applied to horizontal grid lines. If you pass
False, their color is not changed.
• If you pass True in vertical, the color will be applied to vertical grid lines. If you pass False,
their color is not changed.
See Also
SET RGB COLORS, SHOW LISTBOX GRID.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Abs returns the absolute (unsigned, positive) value of number. If number is negative, it is
returned as positive. If number is positive, it is returned unchanged.
Example
The following example returns the absolute value of –10.3, which is 10.3:
vlVector:=Abs(–10.3)
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Int returns the integer portion of number. Int truncates a negative number away from zero.
Example
The following example illustrates how Int works for both positive and negative numbers. Note
that the decimal portion of the number is removed:
See Also
Dec.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Dec returns the decimal (fractional) portion of number. The value returned is always positive
or zero.
Example
The following example takes a monetary value expressed as a real number, and extracts the
dollar part and the cents part. If vrAmount is 7.31, then vlDollars is set to 7 and vlCents is set to
31:
See Also
Int.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Round returns number rounded to the number of decimal places specified by places.
If places is positive, number is rounded to places decimal places. If places is negative, number is
rounded on the left of the decimal point.
If the digit following places is 5 though 9, Round rounds toward positive infinity for a positive
number, and toward negative infinity for a negative number. If the digit following places is 0
through 4, Round rounds toward zero.
Example
The following example illustrates how Round works with different arguments. Each line
assigns a number to the vlResult variable. The comments describe the results:
See Also
Trunc.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Function result Number ← Number with its decimal part truncated to the
number of decimal places specified by Places
Description
Trunc returns number with its decimal part truncated to the number of decimal places specified
by places. Trunc always truncates toward negative infinity.
If places is positive, number is truncated to places decimal places. If places is negative, number
is truncated on the left of the decimal point.
Example
The following example illustrates how Trunc works with different arguments. Each line assigns
a number to the vlResult variable. The comments describe the results:
See Also
Round.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Random → Number
Description
Random returns a random integer value between 0 and 32,767 (inclusive).
(Random%(End–Start+1))+Start
The value start is the first number in the range, and the value end is the last.
Example
The following example assigns a random integer between 10 and 30 to the vlResult variable:
vlResult:=(Random%21)+10
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Mod command returns the remainder of the Integer division of number1 by number2.
Notes:
• Mod accepts Integer, Long Integer, and Real expressions. However, if number1 or number2
are real numbers, the numbers are first rounded and then Mod is calculated.
• Be careful when using Mod with real numbers of a large size (above 2^31) since, in this case,
its operation may reach the limits of the calculation capacities of standard processors.
You can also use the % operator to calculate the remainder (see Numeric Operators).
WARNING: The % operator returns valid results with Integer and Long Integer expressions. To
calculate the modulo of real values, you must use the Mod command.
Example
The following example illustrates how the Mod function works with different arguments. Each
line assigns a number to the vlResult variable. The comments describe the results:
See Also
Numeric Operators.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Square root returns the square root of number.
Examples
1. The line:
2. The following method returns the hypotenuse of the right triangle whose two legs are
passed as parameters:
` Hypotenuse method
` Hypotenuse ( real ; real ) -> real
` Hypotenuse ( legA ; legB ) -> Hypotenuse
C_REAL($0;$1;$2)
$0:= Square root(($1^2)+($2^2))
See Also
Numeric Operators.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Log returns the natural (Napierian) log of number. Log is the inverse function of Exp.
Example
The following line displays 1:
ALERT(String(Log(Exp(1)))
See Also
Exp.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Exp raises the natural log base (e = 2.71828...) by the power of number. Exp is the inverse
function of Log.
Example
The following example assigns the exponential of 1 to vrE (the log of vrE is 1):
See Also
Log.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Sin returns the sine of number, where number is expressed in radians.
Note: 4D provides the predefined constants Pi, Degree, and Radian. Pi returns the Pi number
(3.14159...), Degree returns one degree expressed in radians (0.01745...), and Radian returns
one radian expressed in degrees (57.29577...).
See Also
Arctan, Cos, Tan.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Cos returns the cosine of number, where number is expressed in radians.
Note: 4D provides the predefined constants Pi, Degree, and Radian. Pi returns the Pi number
(3.14159...), Degree returns one degree expressed in radians (0.01745...), and Radian returns
one radian expressed in degrees (57.29577...).
See Also
Arctan, Sin, Tan.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Tan returns the tangent of number, where number is expressed in radians.
Note: 4D provides the predefined constants Pi, Degree, and Radian. Pi returns the Pi number
(3.14159...), Degree returns one degree expressed in radians (0.01745...), and Radian returns
one radian expressed in degrees (57.29577...).
See Also
Arctan, Cos, Sin.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Arctan returns the angle, expressed in radians, of the tangent number.
Note: 4D provides the predefined constants Pi, Degree, and Radian. Pi returns the Pi number
(3.14159...), Degree returns one degree expressed in radians (0.01745...), and Radian returns
one radian expressed in degrees (57.29577...).
Examples
The following example shows the value of Pi:
See Also
Cos, Sin, Tan.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET REAL COMPARISON LEVEL command sets the epsilon value used by 4th Dimension to
compare real values and expressions for equality.
A computer always performs approximative real computations; therefore, testing real numbers
for equality should take this approximation into account. 4th Dimension does this when
comparing real numbers by testing whether or not the difference between the two numbers
exceeds a certain value. This value is called the epsilon and works this way:
Given two real numbers a and b, if Abs(a-b) is greater than the epsilon, the numbers are
considered not equal; otherwise, the numbers are considered equal.
By default, 4th Dimension, sets the epsilon value to 10 power minus 6 (10^-6). Please note
that the epsilon value should always be positive. Examples:
• 0.00001=0.00002 returns False, because the difference 0.00001 is greater than 10^-6.
• 0.000001=0.000002 returns True, because the difference 0.000001 is not greater than 10^-6.
• 0.000001=0.000003 returns False, because the difference 0.000002 is greater than 10^-6.
Using SET REAL COMPARISON LEVEL, you can increase or decrease the epsilon value as you
require.
Note: If you want to execute a query or an "Order by" on a numeric indexed field whose values
are lower than 10^-6, make sure that the SET REAL COMPARISON LEVEL command is executed
before construction of the index.
WARNING: Typically, you will not need to use this command to change the default epsilon
value.
See Also
Comparison Operators.
Preliminary Note
If you do not deal with cross-platform development, you can skip this section.
On older 68K-based Macintosh, the precision number is 19; this means that 1/3 is calculated
with 19 significant digits. On Windows and Power Macintosh, this number is 15; so 1/3 is
displayed with 15 significant digits. If you display the expression 1/3 in the Debugger window
of 4th Dimension, you will get 0.3333333333333333333 on 68K-based Macintosh and
something like 0.3333333333333333148 on Windows or Power Macintosh. Note that the last
three digits are different because the precision on Windows and Power Macintosh is less than
on the 68K-based Macintosh. Yet, if you display the expression (1/3)*3, the result is 1 on both
machines.
If your floating point arithmetic computations deal with the number of square feet in your
backyard, you will say “Fine with me!” because you do not care about the digits after the
decimal point. On the other hand, if you are filling out an IRS form, you may, in certain
circumstances, care about the accuracy of your computer. However, remember that 19 or 15
digits after the decimal point are quite sufficient even if you manage billions of dollars of
revenue.
Why does the value 1/3 seem different on 68K Macintosh and onWindows or Power
Macintosh?
On 68K-based Macintosh, the operating system stores real numbers on 10 bytes (80 bits),
while on Windows and Power Macintosh, it stores them on 8 bytes (64 bits). This is why real
numbers have up to 19 significant digits on 68K-based Macintosh and up to 15 significant
digits on Windows and Power Macintosh.
There is dual behavior of real numbers, so we must make the distinction between:
• How they are calculated and compared
• How they are displayed on the screen or printer
Originally, 4th Dimension handled real numbers using the standard 10-byte data type
provided by the operating system of the 68K-based Macintosh. Consequently, real values
stored in the data file on disk are saved using this format. In order to maintain compatibility
between the 68K, Power Macintosh, and Windows versions of 4th Dimension, the 4th
Dimension data files still hold the real values using the 10-byte data type. Because floating
point arithmetic is performed on Windows or Power Macintosh using the 8 byte format, 4th
Dimension converts the values from 10 bytes to 8 bytes, and vice versa. Therefore, if you load
a record containing real values, which have been saved on 68K-based Macintosh, onto
Windows or Power Macintosh, it is possible to lose some precision (from 19 to 15 significant
digits). Yet, if you load a record containing real values, which have been saved on Windows or
Power Macintosh, on a 68K-based Macintosh, there will be no loss of precision. Basically, if
you use a database on 68K or Power Macintosh and Windows, count on floating point
arithmetic with 15 significant digits, not 19.
Using the SET DATABASE PARAMETER command, you can set the number of digits to be skipped
(4 by default) when simplifying the display of real numbers.
Description
The Euro converter command allows you to convert any value from and to the different
currencies belonging to the “Euroland” and the Euro currency itself.
To specify a Currency code, 4th Dimension proposes the following predefined constants,
placed in the “Euro Currencies” theme:
If necessary, 4th Dimension performs rounding automatically on conversion results and keeps
2 decimals —except for conversions to Italian Lires, Belgian Francs, Luxembourg Francs and
Spanish Pesetas, for which 4D keeps 0 decimal (the result is an integer number).
The conversion rates between the Euro and the currencies of the 11 participating Member
States are fixed:
Example
Here are some examples of conversions that can be done with this command:
Terminology
The documentation of Menus commands uses the terms menu command and menu item
interchangeably when describing a line in a menu.
Menu Bars
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Each menu bar is identified by a number and by a name. The first menu bar (created
automatically by 4th Dimension) has the number 1 and is named Menu Bar #1 by default. In
order to rename a menu bar, Ctrl+click (Windows) or Command+click (Mac OS) on its name in
the Menu editor. The name of a menu bar may contain up to 31 characters and must be
unique.
Menu Bar #1 is also the menu bar used by default. To open an application with a menu bar
other than Menu Bar #1, you must use the MENU BAR command in the On Startup database
method.
Each menu command can have a project method or a standard action attached to it. If you do
not assign a method or a standard action to a menu command, choosing that menu command
causes 4th Dimension to exit the Custom Menus environment and go to the User
environment. If the user is working with the 4th Dimension Custom Menus version or does
not have access to the User environment, this means quitting to the Desktop.
Standard actions can be used to carry out various current operations linked to system
functions (copy, quit, etc.) or to those of the 4D database (add record, select all, etc.).
You can assign both a standard action and a project method to a menu command. In this case,
the standard action is never executed; however, 4th Dimension uses this action to
activate/deactivate the menu command according to the current context. When a menu
command is deactivated, the associated project method cannot be executed.
Every menu bar comes equipped with three menus—the File, Edit and Mode menus.
• The File menu has only one menu command—Quit. The Quit standard action is assigned to
it. This action displays an "Are you sure?" confirmation dialog box then quits the 4D
application if this dialog box is validated. Otherwise, the operation is cancelled.
Note: Under Mac OS X, the created menu command associated with the Quit action is
automatically placed in the application menu when the database is executed on this system.
• The Edit menu contains the standard editing menu commands. A standard action (Cancel,
Cut, Copy, etc.) is assigned to each command of this menu. You can add commands to this
menu or use your own methods for managing editing actions.
• The Mode menu contains the Design, User and Custom Menus commands by default. These
commands are used to access the different environments of 4D from the Custom Menus mode.
Note: 4th Dimension automatically manages the Help, Apple (Mac OS) and application (Mac
OS X) system menus. These menus cannot be modified, except for the About 4th Dimension
command, which can be managed using the SET ABOUT command.
Warning: Menu bars are "interprocess." Any modification carried out on a menu bar will be
reflected in all the processes where the menu bar is used.
Like menu bars, menus are numbered. The File menu is menu 1. Thereafter, menus are
numbered sequentially from left to right (2, 3, 4, and so on). Menu numbering is important
when you are working, for example, with the Menu selected function. When a menu is
associated with a form, the menu numbering scheme is different. The first appended menu
begins with the number 2049. To refer to an appended menu, add 2048 to the normal menu
number.
The menu commands within each menu are numbered sequentially from the top of the menu
to the bottom. The topmost menu command is item 1.
You can associate a menu bar with a form in the Form properties (General page). Such a menu
bar is called a “form menu bar” in this document.
The menus on a form menu bar are appended to the current menu bar when the form is
displayed. The menus are appended for input forms in both the User and Custom Menus
environments and for output forms in the Custom Menus environment.
Form menu bars are specified by a menu bar number and a name. If the number or name of
the menu bar displayed with the current form is the same as that of the menu bar appended to
the form, the menu bar is not appended.
4th Dimension provides the following commands for adding, deleting, inserting or modifying
menu items in a menu of the menu bar currently displayed or installed in a process:
The scope of each of these commands is the current use of the menu bar. As soon as you call
MENU BAR again, all the menus and menu items will return to their original state as defined in
the Design environment Menu Bar editor.
As explained, menus are numbered 1 to X from left to right. For example, File is usually the
first menu. The Apple (Mac OS) and Application (Mac OS X) menus are excluded from this
numbering. The Help menu is also excluded no matter what the platform.
Note that the Count menus command does not take these menus into account. For example, if
you have a menu bar composed of the File, Edit, Customers, Invoices and Help menus, Count
menus will return 4, ignoring the system menus maintained by 4D.
Menu items are numbered 1 to X, from top to bottom, including separator lines.
Menus that are inserted in the menu bar by means of a menu bar associated with a form, and
therefore appended to the current menu bar, are numbered from left to right starting with the
number 2049 (2048 + 1 to X).
Connected Menus: Menus can be connected to menu bars. If a connected menu is modified
using one of these commands, every other instance of the menu will reflect these changes. For
more information about connecting menus, refer to the 4th Dimension Design Reference Manual.
Description
MENU BAR replaces the current menu bar with the one specified by menuBar for the current
process only. In the menuBar parameter, you can pass either the number or name of the new
menu bar.
Note: The name of a menu bar may contain up to 31 characters and must be unique.
The optional process parameter changes the menu bar of the specified process to menuBar.
The optional * parameter allows you to save the state of the menu bar. If this parameter is
omitted, MENU BAR reinitializes the menu bar when the command is executed.
For example, suppose that MENU BAR(1) is executed. Next, several menu commands are
disabled using the DISABLE MENU ITEM command.
If MENU BAR(1) is executed a second time, either from the same process or from a different
process, all menu commands will revert to their initial enabled state.
If MENU BAR(1;*) is executed, the menu bar will retain the same state as before, and the menu
commands that were disabled will remain disabled.
Note: If you do not use the optional process parameter, * can be the second parameter. In
other words, MENU BAR(1;2;*) and MENU BAR(1;*) are both valid statements.
When a user enters the Custom Menus environment, the first menu bar is displayed (Menu
Bar #1). You can change this menu bar when opening a database by specifying the desired
menu bar in the On Startup database method or in the startup method for an individual user.
2. The following example changes the current menu bar to the menu bar named
“FormMenuBar1” and saves the states of the menu commands. Menu commands that were
previously disabled will appear disabled.
3. The following example sets the current menu bar to menu bar #3 while records are being
modified. After the records have been modified, the menu bar is reset to menu bar #2, with
the menu state saved:
MENU BAR(3)
ALL RECORDS([Customers])
MODIFY SELECTION([Customers])
MENU BAR(2;*)
See Also
Managing Menus.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The HIDE MENU BAR command makes the menu bar invisible.
If the menu bar was already hidden, the command does nothing.
Example
The following method displays a record in full-screen display (Macintosh) until you click the
mouse button:
Note: On Windows, the window will be limited to the bounds of the application window.
See Also
HIDE TOOL BAR, SHOW MENU BAR, SHOW TOOL BAR.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SHOW MENU BAR command makes the menu bar visible.
If the menu bar was already visible, the command does nothing.
Example
See example for the command HIDE MENU BAR.
See Also
HIDE MENU BAR, HIDE TOOL BAR, SHOW TOOL BAR.
Description
The SET ABOUT command changes the About 4th Dimension menu command in the Help
(Windows) or in the Application (Mac OS X) menu to itemText.
After the call, when a user selects this menu command in User or Custom Menus mode,
method will be called. Typically, this method can open a dialog box to give version
information about your database.
This command is used with 4th Dimension single user, 4D Runtime, 4D Client and 4D Server.
A new process is created when it is run on a server machine.
Examples
1. The following example replaces the About 4th Dimension menu command with the About
Scheduler menu command. The ABOUT method displays a custom About box:
2. The following example resets the About 4th Dimension menu command back to the
original About box:
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Menu selected is used only when forms are displayed. It detects which menu command has
been chosen from a menu.
Tip: Whenever possible, use methods associated with menu commands in an associated menu
bar (with a negative menu bar number) instead of using Menu selected. Associated menu bars
are easier to manage, since it is not necessary to test for their selection. However, if you use the
commands APPEND MENU ITEM or INSERT MENU ITEM, you have to use Menu selected because
the menu items added by these commands do not have associated methods.
Menu selected returns the menu-selected number, a long integer. To find the menu number,
divide Menu selected by 65,536 and convert the result to an integer. To find the menu
command number, calculate the modulo of Menu selected with the modulus 65,536. Use the
following formulas to calculate the menu number and menu command number:
Menu := Menu selected \ 65536
menu command := Menu selected % 65536
Starting with version 6, you can also extract these values using the bitwise operators as follows:
See Also
Managing Menus.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Count menus command returns the number of menus present in the menu bar.
If you omit the process parameter, Count menus applies to the menu bar for the current
process. Otherwise, Count menus applies to the menu bar for the process whose reference
number is passed in process.
See Also
Count menu items.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Count menu items command returns the number of menu items present in the menu
whose number is passed in menu.
If you omit the process parameter, Count menu items applies to the menu bar for the current
process. Otherwise, Count menu items applies to the menu bar for the process whose reference
number is passed in process.
See Also
Count menus.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get menu title command returns the title of the menu whose number is passed in menu.
If you omit the process parameter, Get menu title applies to the menu bar for the current
process. Otherwise, Get menu title applies to the menu bar for the process whose reference
number is passed in process.
See Also
Count menus.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get menu item command returns the text of the menu item whose menu and item
numbers are passed in menu and menuItem.
If you omit the process parameter, Get menu item applies to the menu bar for the current
process. Otherwise, Get menu item applies to the menu bar for the process whose reference
number is passed in process.
See Also
Get menu item key, SET MENU ITEM.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET MENU ITEM command changes the text of the menu item whose menu and item
numbers are passed in menu and menuItem, to the text passed in itemText.
If you omit the process parameter, SET MENU ITEM applies to the menu bar for the current
process. Otherwise, SET MENU ITEM applies to the menu bar for the process whose reference
number is passed in process.
See Also
Get menu item, SET MENU ITEM KEY.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get menu item style command returns the font style of the menu item whose menu and
item numbers are passed in menu and menuItem.
If you omit the process parameter, Get menu item style applies to the menu bar for the current
process. Otherwise, Get menu item style applies to the menu bar for the process whose
reference number is passed in process.
Get menu item style returns a combination (one or a sum) of the following predefined
constants:
Note: On Windows, only the styles Plain or a combination of Bold, Italic, and Underline are
available.
See Also
SET MENU ITEM STYLE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET MENU ITEM STYLE command changes the font style of the menu item whose menu
and item numbers are passed in menu and menuItem according to the font style passed in
itemStyle.
If you omit the process parameter, SET MENU ITEM STYLE applies to the menu bar for the
current process. Otherwise, SET MENU ITEM STYLE applies to the menu bar for the process
whose reference number is passed in process.
You specify the font style of the item in the itemStyle parameter. You pass a combination (one
or a sum) of the following predefined constants:
Note: On Windows, only the styles Plain or a combination of Bold, Italic, and Underline are
available.
See Also
Get menu item style.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get menu item mark command returns the check mark of the menu item whose menu and
item numbers are passed in menu and menuItem.
If you omit the process parameter, Get menu item mark applies to the menu bar for the current
process. Otherwise, Get menu item mark applies to the menu bar for the process whose
reference number is passed in process.
If the menu item has no mark, Get menu item mark returns an empty string.
Note: See discussion of check marks on Macintosh and Windows in the description of the
command SET MENU ITEM MARK.
Example
The following example toggles the check mark of a menu item:
See Also
SET MENU ITEM MARK.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET MENU ITEM MARK command changes the check mark of the menu item whose menu
and item numbers are passed in menu and menuItem to the first character of the string passed
in mark.
If you omit the process parameter, SET MENU ITEM MARK applies to the menu bar for the
current process. Otherwise, SET MENU ITEM MARK applies to the menu bar for the process
whose reference number is passed in process.
If you pass an empty string, any mark is removed from the menu item. Otherwise:
• On Macintosh, the first character of the string becomes the mark of the menu item. Usually,
you will pass Char (18), which is the check mark character for Macintosh menus.
• On Windows, the menu item is assigned the standard check mark.
Example
See example for the command Get menu item mark.
See Also
Get menu item mark.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get menu item key command returns the ASCII code of the Ctrl (Windows) or Command
(Macintosh) shortcut for the menu item whose menu and item numbers are passed in menu
and menuItem.
If you omit the process parameter, Get menu item key applies to the menu bar for the current
process. Otherwise, Get menu item key applies to the menu bar for the process whose reference
number is passed in process.
If the menu item has no shortcut, Get menu item key returns 0 (zero).
See Also
SET MENU ITEM KEY.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET MENU ITEM KEY command replaces the shortcut key associated with the menu
command specified by menu and menuItem, by the character whose ASCII code is passed in
itemKey. This key will automatically be combined with the Ctrl (Windows) or Command
(Macintosh) key in order to set the new keyboard shortcut.
If you omit the process parameter, SET MENU ITEM KEY applies to the menu bar for the current
process. Otherwise, SET MENU ITEM KEY applies to the menu bar for the process whose
reference number is passed in process.
If you pass 0 (zero) in itemKey, any shortcut is removed from the menu item.
Note: For consistency in the user interface, use uppercase characters, digits or symbols that are
available on the keyboard, without using any modifier key other than the Ctrl (Windows) or
Command (Macintosh) key.
See Also
Get menu item key.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DISABLE MENU ITEM command disables the menu item whose menu and item numbers
are passed in menu and menuItem.
If you omit the process parameter, DISABLE MENU ITEM applies to the menu bar for the current
process. Otherwise, DISABLE MENU ITEM applies to the menu bar for the process whose
reference number is passed in process.
See Also
ENABLE MENU ITEM.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ENABLE MENU ITEM command enables the menu item whose menu and item numbers are
passed in menu and menuItem.
If you omit the process parameter, ENABLE MENU ITEM applies to the menu bar for the current
process. Otherwise, ENABLE MENU ITEM applies to the menu bar for the process whose
reference number is passed in process.
See Also
DISABLE MENU ITEM.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The APPEND MENU ITEM command appends new menu items to the menu whose number is
passed in menu.
If you omit the process parameter, APPEND MENU ITEM applies to the menu bar for the current
process. Otherwise, APPEND MENU ITEM applies to the menu bar for the process whose
reference number is passed in process.
APPEND MENU ITEM allows you to append one or several menu items in one call.
You define the items to be appended with the parameter itemText as follows:
• Separate each item from the next one with a semi-colon (;). For example,
"ItemText1;ItemText2;ItemText3".
• To disable an item: Place an opening parenthesis (() in the item text.
• To specify a separation line: Pass "(-" as item text.
• To specify a font style for a line: In the item text, place a less than sign (<) followed by one
of these characters:
<B Bold
<I Italic
<U Underline
<O Outline (Macintosh only)
<S Shadow (Macintosh only)
• To add a check mark to an item: In the item text, place an exclamation mark (!) followed by
the character you want as a check mark. On Macintosh, the character is displayed; on
Windows, a check mark is displayed no matter what character you passed.
Note: Use menus that have a reasonable number of items. If you want to display more than 50
items, think about a using scrollable area in a form instead of a menu.
Note: APPEND MENU ITEM accepts up to 32,000 characters, while INSERT MENU ITEM accepts
up to 255 characters.
Important: The new items do not have any associated method. Therefore, they must be
managed from within a form method using the Menu selected command.
Example
This example appends the names of the available fonts to the Font menu, which in this
example is the sixth menu of the current menu bar:
See Also
DELETE MENU ITEM, INSERT MENU ITEM.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The INSERT MENU ITEM command inserts new menu items into the menu whose number is
passed in menu after the existing menu item whose number is passed in afterItem.
If you omit the process parameter, INSERT MENU ITEM applies to the menu bar for the current
process. Otherwise, INSERT MENU ITEM applies to the menu bar for the process whose
reference number is passed in process.
INSERT MENU ITEM allows to you insert one or several menu items in one call.
INSERT MENU ITEM works like APPEND MENU ITEM, except for the following differences:
• INSERT MENU ITEM enables you to insert items anywhere in the menu, while APPEND MENU
ITEM always adds them at the end of the menu.
• With INSERT MENU ITEM, the item definition passed in itemText is limited to 255 characters,
while with APPEND MENU ITEM, itemText is limited to 32,000 characters.
See the description of the APPEND MENU ITEM command for details about the the item
definition passed in itemText.
Important: The new items do not have any associated method. Therefore, they must be
managed from within a form method using the Menu selected command.
See Also
APPEND MENU ITEM.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DELETE MENU ITEM command deletes the menu item whose menu and item numbers are
passed in menu and menuItem.
If you omit the process parameter, DELETE MENU ITEM applies to the menu bar for the current
process. Otherwise, DELETE MENU ITEM applies to the menu bar for the process whose
reference number is passed in process.
Note: For consistency in the user interface, do not keep a menu with no items.
See Also
APPEND MENU ITEM, INSERT MENU ITEM.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
MESSAGES OFF
Description
The MESSAGES ON and MESSAGES OFF commands turn on and off the progress meters
displayed by 4th Dimension while executing time-consuming operations. By default, messages
are on.
The following table shows User environment operations that display the progress meter:
Apply Formula Quick Report Order by
Export Data Import Data Graph
Query by Form Query by Formula Query Editor
The following table lists the commands that display the progress meter:
APPLY TO SELECTION IMPORT SYLK QUERY
DISTINCT VALUES IMPORT TEXT QUERY BY FORMULA
EXPORT DIF RELATE MANY SELECTION QUERY BY EXAMPLE
EXPORT SYLK RELATE ONE SELECTION QUERY SELECTION
EXPORT TEXT REDUCE SELECTION QUERY SELECTION BY FORMULA
GRAPH TABLE QR REPORT ORDER BY FORMULA
IMPORT DIF SCAN INDEX ORDER BY
Example
The following example turns off the progress meter before doing a sort, and then turns it back
on after completing the sort:
MESSAGES OFF
ORDER BY ([Addresses];[Addresses]ZIP;>;[Addresses]Name2;>)
MESSAGES ON
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
MESSAGES ON
Description
See the description of the MESSAGES OFF command.
Description
The ALERT command displays an alert dialog box composed of a note icon, a message, and an
OK button.
You pass the message to be displayed in the parameter message. This message can be up to 255
characters long. However, if the message does not fit into the message area, it can appear
truncated, depending on its length and the width of the characters.
By default, the title of the OK button is “OK.” To change the title of the OK button, pass the
new custom title into the optional parameter ok button title. If necessary, the OK button width
is resized toward the left, according to the width of the custom title you pass.
Tip: Do not call the ALERT command from the section of a form or object method that handles
the On Activate or On Deactivate form events; this will cause an endless loop.
Examples
1. This example displays an alert showing information about a company. Note that the
displayed string contains carriage returns, which cause the string to wrap to the next line:
ALERT("Company: "+[Companies]Name+Char(13)+"People in company: "+
String(Records in selection([People]))+Char(13)+"Number of parts they supply: "
+String (Records in selection([Parts])))
2. The line:
ALERT("I'm sorry Dave, I can't do that.";"Alas!")
displays the alert dialog box (on Windows) shown:
3. The line:
ALERT("You no longer have the access privileges for deleting these records.";"Well, I swear I
did not know that")
See Also
CONFIRM, DISPLAY NOTIFICATION, Request.
Description
The CONFIRM command displays a confirm dialog box composed of a note icon, a message, an
OK button, and a Cancel Button.
You pass the message to be displayed in the message parameter. This message can be up to 255
characters long. If the message does not fit into the message area, it can appear truncated,
depending on its length and the width of the characters.
By default, the title of the OK button is “OK” and that of the Cancel button is “Cancel.” To
change the titles of these buttons, pass the new custom titles into the optional parameters ok
button title and cancel button title. If necessary, the width of the buttons is resized toward the
left, according to the width of the custom titles you pass.
The OK button is the default button. If the user clicks the OK button or presses Enter to accept
the dialog box, the OK system variable is set to 1. If the user clicks the Cancel button to cancel
the dialog box, the OK system variable is set to 0.
Tip: Do not call the CONFIRM command from the section of a form or object method that
handles the On Activate or On Deactivate form events; this will cause an endless loop.
2. The line:
CONFIRM("Do you really want to close this account?";"Yes";"No")
will display the confirm dialog box (on Windows) shown here:
3. You are writing a 4D application for the international market. You wrote a project method
that returns the correct localized text from its English version. You have also populated an
array named <>asLocalizedUIMessages,where you store the most common words. In doing so,
the line:
CONFIRM(INTL Text ("Do you want to add a new Memo?");
<>asLocalizedUIMessages{kLoc_YES};<>asLocalizedUIMessages{kLoc_NO})
4. The line:
CONFIRM("WARNING: If your pursue this operation, some records will be "+
"irremediably affected."+Char(13)+"What do you want to do?";"Do NOT continue";
"Continue")
will display the confirm dialog box (on Macintosh) shown here:
See Also
ALERT, Request.
Description
The Request command displays a request dialog box composed of a message, a text input area,
an OK button, and a Cancel Button.
You pass the message to be displayed in the message parameter. This message can be up to 255
characters long. If the message does not fit into the message area, it can appear truncated,
depending on its length and the width of the characters.
By default, the title of the OK button is “OK” and that of the Cancel button is “Cancel.” To
change the titles of these buttons, pass the new custom titles into the optional parameters
OKButtonTitle and CancelButtonTitle. If necessary, the width of the buttons is resized toward
the left, according to the width of the custom titles you pass.
The OK button is the default button. If you click the OK button or press Enter to accept the
dialog box, the OK system variable is set to 1. If you click the Cancel button to cancel the
dialog box, the OK system variable is set to 0.
The user can enter text into the text input area. To specify a default value, pass the default text
in the defaultResponse parameter. If the user clicks OK, Request returns the text. If the user
clicks Cancel, Request returns an empty string (""). If the response should be a numeric or a
date value, convert the string returned by Request to the proper type with the Num or Date
functions.
Tip: Do not call the Request command from the section of a form or object method that
handles the On Activate or On Deactivate form event; this will cause an endless loop.
Examples
1. The line:
$vsPrompt:= Request ("Please enter your name:")
will display the request dialog box (on Windows) shown here:
2. The line:
vsPrompt:= Request ("Name of the Employee:";"";"Create Record";"Cancel")
If (OK=1)
ADD RECORD ([Employees])
` Note: vsPrompt is then copied into the field [Employees]Last name
` during the On Load event in the form method
End if
will display the request dialog box (on Windows) shown here:
3. The line:
$vdPrompt:= Date (Request ("Enter the new date:";String (Current date)))
See Also
ALERT, CONFIRM.
MESSAGE (message)
Description
The MESSAGE command is usually used to inform the user of some activity. It displays message
on the screen in a special message window that opens and closes each time you call MESSAGE,
unless you work with a window you previously opened using Open window (see the following
details). The message is temporary and is erased as soon as a form is displayed or the method
stops executing. If another MESSAGE is executed, the old message is erased.
If a window is opened with Open window, all subsequent calls to MESSAGE display the
messages in that window. The window behaves like a terminal:
• Successive messages do not erase previous messages when displayed in the window. Instead,
they are concatenated onto existing messages.
• If a message is wider than the window, 4th Dimension automatically performs text wrap.
• If a message has more lines than the window, 4th Dimension automatically scrolls the
message window.
• To control line breaks, include carriage returns — Char(13) — into your message.
• To display the text at a particular place in the window, call GOTO XY.
• To erase the contents of the window, call ERASE WINDOW .
• The window is only an output window and does not redraw when other windows overlap it.
Examples
1. The following example processes a selection of records and calls MESSAGE to inform the user
about the progress of the operation:
For($vlRecord;1;Records in selection([anyTable]))
MESSAGE ("Processing record #"+String($vlRecord))
` Do Something with the record
NEXT RECORD([anyTable])
End for
2. In order to avoid this "blinking" window, you can display the messages in a window opened
using Open window, as in this example:
See Also
CLOSE WINDOW, ERASE WINDOW, GOTO XY, Open window.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
GOTO XY (x; y)
Description
The GOTO XY command is used in conjunction with the MESSAGE command when you
display messages in a window opened using Open window.
GOTO XY positions the character cursor (an invisible cursor) to set the location of the next
message in the window.
The upper-left corner is position 0,0. The cursor is automatically placed at 0,0 when a window
is opened and after ERASE WINDOW is executed.
After GOTO XY positions the cursor, you can use MESSAGE to display characters in the window.
Tip: Using a fixed-width (monospaced) font, such as Terminal on Windows and Monaco on
Macintosh, for the message, gives the best display results with GOTO XY and MESSAGE. See the
description of the MESSAGE command for more information.
Examples
1. See example for the command MESSAGE.
See Also
MESSAGE.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DISPLAY NOTIFICATION command displays a message in the notification area of the
Windows taskbar:
Usually this kind of message is used by the OS or an application to inform the user of an
external event (network disconnection, availability of an upgrade, etc.).
In title and text, pass the title and the text of the message to display (in the above example,
the title is “4D Export”). You can enter up to 255 characters.
By default, the message window remains displayed until the user clicks on the close box. If
you pass the optional duration parameter, the window will be closed automatically at the
end of the duration set if the user did not click on the close box. Note that the notification
icon will remain displayed until the end of duration, even if the user has closed the
window.
See Also
ALERT.
Named selections are created with the COPY NAMED SELECTION, CUT NAMED SELECTION and
CREATE SELECTION FROM ARRAY commands. Named selections are generally used to work on
one or more selections and to save and later restore an ordered selection. There can be many
named selections for each table in a process. To reuse a named selection as the current
selection, call USE NAMED SELECTION. When you are done with a named selection, use CLEAR
NAMED SELECTION.
A named selection is an interprocess named selection if its name is preceded by the symbols
(<>) — a “less than” sign followed by a “greater than” sign.
Note: This syntax can be used on both Windows and Macintosh. In addition, on Macintosh
only, you can use the diamond (Option-Shift-V on US keyboard).
A named selection whose name is not prefixed with the symbols (<>) is process in scope and is
available only within the process in which it was created.
Warning: Creating a named selection requires access to the selection of the table. Since
selections are kept on the server and a local process does not have access to server data, do not
use named selections within local processes.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
COPY NAMED SELECTION copies the current selection of table to the named selection name.
The default table for the process is used if the optional table parameter is not specified. The
parameter name contains a copy of the selection. The current selection and the current record
of Table for the process are not changed.
A named selection does not actually contain the records, but only an ordered list of references
to records. Each reference to a record takes 4 bytes in memory. This means that when a
selection is copied using the COPY NAMED SELECTION command, the amount of memory
required is 4 bytes multiplied by the number of records in the selection. Since named
selections reside in memory, you should have enough memory for the named selection as well
as the current selection of the table in the process.
Use the CLEAR NAMED SELECTION command to free the memory used by name.
Example
The following example allows you to check if there are other overdue invoices in the [People]
table. The selection is sorted and then saved. We search for all records where invoices are due.
Then we reuse the selection and clear the named selection in memory. Clearing the named
selection in memory is optional, in case the database designer wants to keep the sorted
selection for future use:
ALL RECORDS([People])
`Allow the user to sort the selection
ORDER BY([People])
` Save the sorted selection as a named selection
COPY NAMED SELECTION([People];"UserSort")
See Also
CLEAR NAMED SELECTION, CUT NAMED SELECTION, USE NAMED SELECTION.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CUT NAMED SELECTION creates a named selection name and moves the current selection of
table to it. This command differs from COPY NAMED SELECTION in that it does not copy the
current selection, but moves the current selection of table itself.
After the command has been executed, the current selection of table in the current process
becomes empty. Therefore, CUT NAMED SELECTION should not be used while a record is being
modified.
CUT NAMED SELECTION is more memory efficient than COPY NAMED SELECTION. With COPY
NAMED SELECTION, 4 bytes times the number of selected records is duplicated in memory.
With CUT NAMED SELECTION, only the reference to the list is moved.
Example
The following method empties the current selection of a table [Customers]:
CUT NAMED SELECTION([Customers]; "ToBeCleared")
CLEAR NAMED SELECTION("ToBeCleared")
See Also
CLEAR NAMED SELECTION, COPY NAMED SELECTION, USE NAMED SELECTION.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
USE NAMED SELECTION uses the named selection name as the current selection for the table to
which it belongs.
When you create a named selection, the current record is “remembered” by the named
selection. USE NAMED SELECTION retrieves the position of this record and makes the record
the new current record; this command loads the current record. If the current record was
modified after name was created, the record should be saved before USE NAMED SELECTION is
executed, in order to avoid losing the modified information.
• If COPY NAMED SELECTION was used to create name, the named selection name is copied to
the current selection of the table to which name belongs. The named selection name exists in
memory until it is cleared. Use the CLEAR NAMED SELECTION command to clear the named
selection and free the memory used by name.
• If CUT NAMED SELECTION was used to create name, the current selection is set to name and
name no longer exists in memory.
Remember that a named selection is a representation of a selection of records at the moment
that the named selection is created. If the records represented by the named selection change,
the named selection may no longer be accurate. Therefore, a named selection represents a
group of records that does not change frequently. A number of things can invalidate a named
selection: modifying a record of the named selection, deleting a record of the named selection,
or changing the criterion that determined the named selection.
Also note that during a transaction, temporary record addresses are used. If a named selection
is created during a transaction, it may contain addresses that will no longer be valid when the
transaction is validated or cancelled, because the records will receive their final and actual
address after the transaction is validated.
See Also
COPY NAMED SELECTION, CUT NAMED SELECTION, USE NAMED SELECTION.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CLEAR NAMED SELECTION clears name from memory and frees the memory used by name.
CLEAR NAMED SELECTION does not affect tables, selections, or records. Since named selections
use memory, it is good practice to clear named selections when they are no longer needed.
If name was created using the CUT NAMED SELECTION command and then manipulated using
the USE NAMED SELECTION command, name no longer exists in memory. In this case, the
CLEAR NAMED SELECTION command does not need to be used.
See Also
COPY NAMED SELECTION, CUT NAMED SELECTION, USE NAMED SELECTION.
Description
The CREATE SELECTION FROM ARRAY command creates the named selection selectionName
from:
If you don’t pass selectionName or if you pass an empty string, the command will be applied to
the current selection, which will then be updated.
When you use a Longint array with this command, all the numbers of the array represent the
list of record numbers in selectionName. If a number is incorrect (record not created), error -
10503 is generated.
Note: Be careful, you must make sure that the array does not contain any lines that have the
same value, otherwise the resulting selection will be incorrect.
When you use a Boolean array with this command, the Xth element of the array indicates if
the record number X is (True) or is not (False) in selectionName. The number of elements in
recordArray must be equal to the number of records in table. If the array is smaller than the
number of records, only the records defined by the array can make up the selection.
Note: With an array of booleans, the command uses elements from numbers 0 to X-1.
See Also
CLEAR NAMED SELECTION, COPY NAMED SELECTION, CREATE SET FROM ARRAY, LONGINT
ARRAY FROM SELECTION, USE NAMED SELECTION.
The Object Properties commands act on the properties of objects present in forms. They
enable you to change the appearance and behavior of the objects while using the forms in the
User or Custom menus environment.
Important: The scope of these commands is the form currently being used; changes disappear
when you exit the form.
Accessing Objects using their Object Names or their Data Source Names
The Object Properties commands share the same generic syntax described here:
If you specify the optional * parameter, you indicate an object name (a string) in object.
Note: It is possible to use the @ character within that name if you want to address several
objects of the form in one call. The following table shows examples of object names you can
specify to this command.
If you omit the optional * parameter, you indicate a field or a variable in object. In this case,
you specify a field or variable reference (field or variable objects only) instead of a string.
Note: This second syntax is compatible with the previous version of 4th Dimension.
Description
FONT sets the form objects specified by object to be displayed using the font whose name or
number you pass in font.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, you
specify a field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
Examples
1. The following example sets the font for a button named bOK:
2. The following example sets the font for all the form objects whose name contains "info":
3. The following example assigns the special %password font, which can be used for entry and
display of “password” type fields (characters are hidden).
FONT ([Users]Password"%password")
See Also
FONT SIZE, FONT STYLE.
Description
FONT SIZE sets the form objects specified by object to be displayed using the font size you pass
in size.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, you
specify a field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
The size is any integer between 1 and 255. If the exact font size does not exist, characters are
scaled.
The area for the object, as defined in the form, must be large enough to display the data in the
new size. Otherwise, the text may be truncated or not displayed at all.
Examples
1. The following example sets the font size for a variable named vtInfo:
2. The following example sets the font size for all the form objects whose name starts with "hl":
See Also
FONT, FONT STYLE.
Description
FONT STYLE sets the form objects specified by object to be displayed using the font style you
pass in styles.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, you
specify a field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
You pass in styles a sum of the constants describing your font style selection. The following are
the predefined constants provided by 4D:
Constant Type Value
Plain Long Integer 0
Bold Long Integer 1
Italic Long Integer 2
Underline Long Integer 4
Outline Long Integer 8
Shadow Long Integer 16
Condensed Long Integer 32
Extended Long Integer 64
Note: On Windows, only the Plain, Bold, Italic and Underline styles are available.
2. This example sets the font style to Plain for all form objects with names starting with “vt”:
See Also
FONT, FONT SIZE.
Description
The ENABLE BUTTON command enables the form objects specified by object.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, you
specify a field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
This command (despite what its name suggests) can be applied to the following types of object:
• Button, Default Button, 3D Button, Invisible Button, Highlight Button
• Radio Button, 3D Radio Button, Radio Picture
• Check Box, 3D Check Box
• Pop-up menu, Drop-down List, Combo Box, Menu/Drop-down list
• Thermometer, Ruler
Note: This command has no effect with an object that is assigned an automatic action (4D
changes the state of the control when needed), except for Validate and Cancel actions.
Examples
1. This example enables the button bValidate:
ENABLE BUTTON(bValidate)
ENABLE BUTTON(*;"@btn@")
See Also
BUTTON TEXT, DISABLE BUTTON.
Description
The DISABLE BUTTON command disables the form objects specified by object.
A disabled button or object does not react to mouse clicks and shortcuts, and is displayed
dimmed or grayed out.
Note: Disabling a button or an object does not prevent you from changing its value
programmatically.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, you
specify a field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
This command (despite what its name suggests) can be applied to the following types of object:
• Button, Default Button, 3D Button, Invisible Button, Highlight Button
• Radio Button, 3D Radio Button, Radio Picture
• Check Box, 3D Check Box
• Pop-up menu, Drop-down List, Combo Box, Menu/Drop-down list
• Thermometer, Ruler
Note: This command has no effect with an object that is assigned an automatic action (4D
changes the state of the control when needed), except for Validate and Cancel actions.
DISABLE BUTTON(bValidate)
2. This example disables all form objects that have names containing “btn”:
DISABLE BUTTON(*;"@btn@")
See Also
BUTTON TEXT, ENABLE BUTTON.
Description
The BUTTON TEXT command changes the title of the buttons specified by object to the value
you pass in buttonText.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, you
specify a field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
BUTTON TEXT affects only buttons that display text: buttons, check boxes, and radio buttons.
Usually, you will apply this command to one button at a time. The button area must be large
enough to accommodate the text; if it is not, the text is truncated. Do not use carriage returns
in buttonText.
Example
The following example is the object method of a search button located in the footer area of an
output form displayed using MODIFY SELECTION. The method searches a table; depending on
the search results, it enables or disables a button labeled bDelete and changes its title:
See Also
DISABLE BUTTON, ENABLE BUTTON.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get format command returns the current display format applied to the object specified
in the object parameter.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (in this case, pass a string in object). If you do not pass this parameter, you indicate
that the object parameter is a field or variable. In this case, you do not pass a string, but a
field or variable reference.
This command returns the current display format of the object; in other words, the format
as defined in the Design environment or using the SET FORMAT command. Get format
works with all types of form objects (fields or variables) that accept a display format:
Boolean, date, time, picture, string, number, as well as button grids, dials, thermometers,
rulers, picture pop-up menus, picture buttons and 3D buttons. For more information on
the display formats of these objects, refer to the documentation for the SET FORMAT
command.
Note: If you apply the command to a set of objects, the form of the last object selected is
returned.
When the Get format command is applied to date, time or picture objects (formats defined
as constants), the string returned corresponds to the ASCII code of the constant. To obtain
the value of the constant, simply apply the Ascii function to the result (see below).
C_STRING(2;$format)
SET FORMAT(*;"myphoto";Char(On background))
`Apply background format (value = 3)
$format:=Get format(*;"myphoto")
ALERT("Format number:"+String(Ascii($format)))
`Display value "3"
2. This example allows you to obtain the format applied to the Boolean field
[Members]Marital_status:
C_STRING(30;$format)
$format:=Get format([Members]Marital_status)
ALERT($format) `Display format, for example "Married;Single"
See Also
SET FORMAT.
Description
SET FORMAT sets the display format for the objects specified by object to the format you pass
in displayFormat. The new format is only used for the current display; it is not stored with the
form.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, you
specify a field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
SET FORMAT can be used for both input forms and output forms (displayed or printed) and can
be applied to fields or variables (enterable/non-enterable).
Naturally, you must use a display format compatible with the type of data found in the object
or with the object itself.
Boolean
To format Boolean fields, there are two possibilities:
• You can pass a single value in displayFormat. In this case, the field will be displayed as a
checkbox and its label will be the value specified.
• You can pass two values, separated by a semicolon (;), in displayFormat. In this case, the field
will be displayed as two radio buttons.
Time
To format Time fields or variables, pass Char(n) in displayFormat, where n is one of the
following predefined constants provided by 4D:
Constant Type Value
HH MM SS Long Integer 1
HH MM Long Integer 2
Hour Min Sec Long Integer 3
Hour Min Long Integer 4
HH MM AM PM Long Integer 5
Picture
To format Picture fields or variables, pass Char(n) in displayFormat, where n is one of the
following predefined constants provided by 4D:
Constant Type Value
Truncated Centered Long Integer 1
Scaled to Fit Long Integer 2
On Background Long Integer 3
Truncated non Centered Long Integer 4
Scaled to fit proportional Long Integer 5
Scaled to fit prop centered Long Integer 6
Replicated Long Integer 7
For more information about display formats, see the 4th Dimension Design Reference manual.
Note: In displayFormat, to use custom display formats that you may have predefined in the
Preferences dialog box, prefix the name of the format with a vertical bar (|).
Picture buttons
To format picture buttons, in the displayFormat parameter, pass a character string respecting
the following syntax:
cols;lines;picture;flags{;ticks}
Dials
To format objects of the dial type, in the displayFormat parameter, pass a character string
respecting the following syntax:
min;max;unit;step{;flags}
Note: For more information about the display formats for form objects, refer to the
4th Dimension Design Reference manual.
3D buttons
To format 3D buttons, in the displayFormat parameter, pass a character string respecting the
following syntax:
title;picture;background;titlePos;titleVisible;iconVisible;style;horMargin;vertMargin;
iconOffset;popupMenu
• title = Button title. This value can be expressed as text or a resource number (ex.: “:16800,1”)
• picture = Picture linked to a button that comes from a picture library, a picture variable or a
PICT resource:
- If the picture comes from a picture library, enter its number, preceded with a question mark
(ex.: “?250”).
- If the picture comes from a picture variable, enter the variable name.
-If the picture comes from a PICT resource, enter its number, preceded by a colon (ex.:
“:62500”).
• background = Background picture linked to a button (Custom style), that comes from a
picture library, a picture variable or a PICT resource (see above).
• titlePos = position of the button title. Five values are possible:
- titlePos = 0: Middle
- titlePos = 1: Right
- titlePos = 2: Left
- titlePos = 3: Bottom
- titlePos = 4: Top
• titleVisible = Defines whether or not the title is visible. Two values are possible:
- titleVisible = 0: the title is hidden
- titleVisible = 1: the title is displayed
• iconVisible = Defines whether or not the icon is visible. Two values are possible:
- iconVisible = 0 : the icon is hidden
- iconVisible = 1 : the icon is displayed
Examples
1. The following line of code formats the [Employee]Date Hired field to Month Date Year.
3. The following example sets the format of a Boolean field to display Married and Unmarried,
instead of the default Yes and No:
4. The following example sets the format of a Boolean field to display a checkbox labelled
“Classified”:
5. You have a table of thumbnails containing 1 row and 4 columns, intended to display a
picture button (“default”, “clicked”, “roll over” and “disabled”). You want to associate the
Switch when Roll Over, Switch back when Released and Use Last Frame as Disabled options
with it:
See Also
Get format, SET FILTER.
Description
SET FILTER sets the entry filter for the objects specified by object to the filter you pass in
entryFilter.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, you
specify a field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
SET FILTER can be used for input and dialog forms and can be applied to fields and enterable
variables that accept an entry filter in Design environment.
Passing an empty string in entryFilter removes the current entry filter for the objects.
Note: This command cannot be used with fields located in a subform’s list form.
Note: In entryFilter, to use entry filters you may have predefined using the Tool Box, prefix the
name of the filter with a vertical bar (|).
2. The following example allows only the letters “a,” “b,” “c,” or “g” to be entered in two
places in the field Field:
See Also
SET FORMAT.
Description
The SET CHOICE LIST command sets or replaces the choice list associated with the object or
group of objects specified by object to the choice list (defined in the Design environment List
Editor) whose name you pass in list.
This command can be applied in an input or dialog form, to fields and enterable variables
whose value can be entered as text. The choice list is displayed during data entry when the
user selects the text area.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, you
specify a field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
Note: This command cannot be used with fields located in a subform’s list form.
Example
The following example sets a choice list for a shipping field. If the shipping is overnight, then
the choice list is set to shippers who can ship overnight. Otherwise, it is set to the standard
shippers:
If ([Shipments]Overnight)
SET CHOICE LIST([Shipments]Shipper; "Fast Shippers")
Else
SET CHOICE LIST([Shipments]Shipper; "Normal Shippers")
End if
Description
The SET ENTERABLE command makes the form objects specified by object either enterable or
non-enterable.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a table, field or variable in object. In this case,
specify a table, field or variable reference (field or variable objects only) instead of a string. For
more information about object names, see the section Object Properties.
Using this command is equivalent to selecting Enterable for a field or variable in the Form
Editor’s Property List window. This command works in subforms only if it is in the form
method of the subform.
When the entryArea is enterable (TRUE), the user can move the cursor into the area and enter
data. When the entryArea is non-enterable (FALSE), the user cannot move the cursor into the
area and cannot enter data.
The SET ENTERABLE command can also be used to enable the “Enter in List” mode by
programming for subforms and list forms displayed using the MODIFY SELECTION and DISPLAY
SELECTION commands:
• For subforms, in the entryArea parameter, pass either the name of the subform table or the
name of the subform object itself, for example: SET ENTERABLE(*;"Subform";True).
• For list forms, you must pass the name of the form table in the entryArea parameter, for
example: SET ENTERABLE([MyTable];True).
Examples
1. The following example sets a shipping field, depending on the weight of the shipment. If
the shipment is 1 ounce or less, then the shipper is set to US Mail and the field is set to be non-
enterable. Otherwise, the field is set to be enterable.
If ([Shipments]Weight<=1)
[Shipments]Shipper:="US Mail"
SET ENTERABLE([Shipments]Shipper;False)
Else
SET ENTERABLE([Shipments]Shipper;True)
End if
2. Here is the object method of a checkbox located in the header of a list in order to control
the Enter in List mode:
C_BOOLEAN(bEnterable)
SET ENTERABLE([Table1];bEnterable)
See Also
DISABLE BUTTON, ENABLE BUTTON, SET VISIBLE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET VISIBLE command shows or hides the objects specified by object.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, you
specify a field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
If you pass visible equal to TRUE, the objects are shown. If you pass visible equal to FALSE, the
objects are hidden.
Example
Here is a typical form in the Design environment:
Therefore, in the User or Custom Menus environments, the form looks like:
See Also
DISABLE BUTTON, ENABLE BUTTON, SET ENTERABLE.
Description
The SET SCROLLBAR VISIBLE command allows you to display or hide the horizontal and/or
vertical scrollbars in the object set using the object and * parameters.
If you pass the optional * parameter, you indicate that the object parameter is an object
name (string). If you do not pass this parameter, you indicate that the object parameter is a
variable. In this case, you do not pass a string, but a variable reference. For more
information about object names, refer to the Object Properties section.
Pass the Boolean values in horizontal and vertical indicating whether the corresponding
scrollbars should be displayed (True) or hidden (False). The scrollbars are displayed by
default.
Note: Objects of the scrollable area type do not have horizontal scrollbars. Since the
horizontal parameter is mandatory, you must still pass it in this case; however, it will be
ignored.
See Also
Get listbox information, SET VISIBLE, SHOW LISTBOX GRID.
Description
The SET COLOR command sets the foreground and background colors of the form objects
specified by object. If object is a list box, an additional parameter is used to set the foreground
and background colors for even-numbered rows (alternating colors).
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, you
specify a field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
altColor is used to specify an alternative color for the even-numbered rows of a list box or a list
box column. When this parameter is passed, the color parameter will be applied only to odd-
numbered rows. Using alternating colors makes lists easier to read.
If object specifies the list box object, alternating colors are used throughout the entire list box.
If object specifies a column, only the column will use the colors set.
The color (as well as altColor) parameter specifies both foreground and background colors. The
color is calculated as:
Color:=-(Foreground+(256 * Background))
where foreground and background are color numbers (from 0 to 255) within the color palette.
Color is always a negative number. For example, if the foreground color is to be 20 and the
background color is to be 10, then color is – (20 + (256 * 10)) or –2580.
Note: You can see the color palette in the Form Editor’s Property List window.
Note: While SET COLOR works with indexed colors within the default 4D color palette, version
6 introduces the command SET RGB COLORS, which allows you to work with any RGB color.
Example
The following example sets the color of the text area shown below in the form editor:
See Also
SET RGB COLORS.
Description
The SET RGB COLORS command changes the foreground and background colors of the objects
specified by object and the optional * parameters. When the command is applied to a List box
object, an additional parameter lets you modify the alternating color of the rows.
If you specify the optional * parameter, you indicate an object name (a string) in object. If you
omit the optional * parameter, you indicate a field or a variable in object. In this case, you
specify a field or variable reference (field or variable objects only) instead of a string. For more
information about object names, see the section Object Properties.
The optional altBackgrndColor parameter lets you set an alternate background color for even-
numbered rows. This parameter is only used when the object specified is a List box or a
column of the List box. When this parameter is used, the backgroundColor parameter is only
used for odd-numbered rows. Using alternating colors makes lists easier to read.
If object specifies a List box object, alternating colors are used for the entire List box. If object
specifies a column of the List box, only the column will use the colors set.
Byte Description
3 Must be zero if absolute RGB color
2 Red component of the color (0..255)
1 Green component of the color (0..255)
0 Blue component of the color (0..255)
Value Description
0x00000000 Black
0x00FF0000 Bright Red
0x0000FF00 Bright Green
0x000000FF Bright Blue
0x007F7F7F Gray
0x00FFFF00 Bright Yellow
0x00FF7F7F Red Pastel
0x00FFFFFF White
Alternatively, you can specify one of the “system” colors used by 4th Dimension for drawing
objects whose colors are set automatically. The following predefined constants are provided by
4th Dimension:
WARNING: These automatic colors are system dependent. If you change your system colors,
4th Dimension will adjust its automatic colors accordingly. Use the automatic color values for
setting objects to the system colors, not for setting them to the example colors shown above.
Examples
This form contains the two non-enterable variables vsColorValue and vsColor as well as the
three thermometers: thRed, thGreen, and thBlue.
Note the use of the Bitwise operators for calculating the color value from the thermometer
values.
See Also
Bitwise Operators, SET COLOR.
Description
The GET OBJECT RECT command returns the coordinates left, top, right and bottom (in points)
in variables or fields of the object(s) of the current form defined by the parameters * and object.
If you pass the optional parameter *, it indicates that the object parameter is an object name (a
string). If you don’t pass the optional parameter *, it indicates that object is a field or a
variable. In this case, you don’t pass a string but a field or variable reference (only a field or
variable of type object).
If you pass an object name to object and use the wildcard character (“@”) to select more than
one object, the coordinates returned will be those of the rectangle formed by all the objects
concerned.
Note: Since 4D version 6.5, it is possible to set the interpretation mode of the wildcard
character (“@”), when it is included in a string of characters. This option has an impact on the
“Object Properties” commands. Please refer to the 4D Design Mode manual.
If the object doesn’t exist or if the command is not called in a form, the coordinates (0;0;0;0)
are returned.
See Also
MOVE OBJECT.
Description
The MOVE OBJECT command allows you to move the object(s) in the current form, defined by
the * and object parameters moveH pixels horizontally and moveV pixels vertically.
It is also possible (optionally) to resize the object(s) resizeH pixels horizontally and resizeV
pixels vertically.
The direction to move and resize depend on the values passed to the moveH and moveV
parameters:
• If the value is positive, objects are moved and resized to the right and to the bottom,
respectively.
• If the value is negative, objects are moved and resized to the left and to the top, respectively.
If you pass the first optional parameter *, you indicate that the object parameter is a parameter
name (a string of characters). If you don’t pass the * parameter, object is a field or a variable. In
this case, you don’t pass a string but a field or variable reference (only a field or variable of
type object).
Note: Since 4D version 6.5, it is possible to set the interpretation mode of the wildcard
character (“@”), when it is included in a string of characters. This option has an impact on the
“Object Properties” commands. Please refer to the 4D Design Mode manual.
By default, the values moveH, moveV, resizeH and resizeV modify the coordinates of the object
relative to its previous position. If you want the parameters to define the absolute parameters,
pass the last optional parameter *.
Examples
1. The following statement moves “button_1” 10 pixels to the right, 20 pixels to the top and
resizes it to 30 pixels in width and 40 in height:
2. The following statement moves “button_1” to the following coordinates (10;20) (30;40):
See Also
GET OBJECT RECT.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The BEST OBJECT SIZE command returns the bestWidth and bestHeight parameters, the
“optimal” width and height of the form object designated by the * and object parameters.
These values are expressed in pixels. This command is particularly useful for displaying or
printing complex reports, associated with the MOVE OBJECT command.
If you pass the optional * parameter, this indicates that the object parameter is an object
name (a character string). If you do not pass the * parameter, this indicates that object is a
field or a variable. In this case, do not pass a string but rather a field or variable reference
(object type only).
The optimal values returned indicate the minimum size of the object so that its current
contents are entirely included within the limits. Of course, these values are only
meaningful for objects containing text. This calculation takes the font, font size, font style
and object contents into account. It also takes hyphenation and carriage returns into
consideration. If the object specified is empty, the bestWidth returned is 0.
The size returned does not take into account any graphic frame applied around the object,
nor any scrollbars. To obtain the real size of an object on screen, it is necessary to add the
width of these elements.
The optional maxWidth parameter enables you to attribute a maximum width to the object.
If the optimal width of the object is greater than this value, BEST OBJECT SIZE returns
maxWidth in the bestWidth parameter and increases the optimal height as a consequence.
For all other form object types (group areas, tabs, rectangles, straight lines, circles/ovals,
external areas, etc.), the BEST OBJECT SIZE command returns the current object size (defined
in the form editor and possibly using the MOVE OBJECT command).
Example
Refer to the example in the SET PRINT MARKER command.
See Also
MOVE OBJECT.
version 6.8.1
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get alignment command returns a code indicating the type of alignment applied to the
object designated by the object and * parameters.
If you specify the optional * parameter, you indicate an object name (a string) in the object
parameter. If you omit the * parameter, you indicate a field or variable in the object parameter.
In this case, you specify a field or variable reference (field or variable objects only) instead of a
string.
Note: If you apply the command to a group of objects, only the alignment value of the last
object is returned.
The returned code corresponds to one of the following constants located in the Object
alignment theme:
Constant Type Value
Align default Longint 1
Align left Longint 2
Center Longint 3
Align right Longint 4
See Also
SET ALIGNMENT.
version 6.8.1
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET ALIGNMENT command allows you to set the type of alignment applied to the object(s)
designated by the object and * parameters.
If you specify the optional * parameter, you indicate an object name (a string) in the object
parameter. If you omit the * parameter, you indicate a field or variable in the object parameter.
In this case, you specify a field or variable reference (field or variable objects only) instead of a
string.
Pass one of the constants of the Object alignment theme in the alignment parameter:
Constant Type Value
Align default Longint 1
Align left Longint 2
Center Longint 3
Align right Longint 4
See Also
Get alignment.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
SEARCH BY INDEX
This command is still present in 4th Dimension for compatibility with 4D version 1. For any
new programming, use the command QUERY.
WARNING: This command will disappear in future versions. Please do not use it.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
SORT BY INDEX
This command is still present in 4th Dimension for compatibility with 4D version 1. For any
new programming, use the command ORDER BY.
WARNING: This command will disappear in future versions. Please do not use it.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
This command has been kept for compatibility reasons regarding previous versions of 4th
Dimension. Its operation is identical to that of the SAVE RELATED ONE command.
WARNING: Do not use this command any longer; it will not be included in future versions of
4D.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The Average, Max, Min, Sum, Sum squares, Std deviation, and Variance functions can be applied
to fields or subfields. In the case of a field, they are applied to a selection of records. In the case
of a subfield, they are applied to a selection of the subrecords of the current record. Note that
the
Sum squares, Std deviation, and Variance functions can be used on a field only during printing.
These functions work on numeric data only. Each of these functions returns a numeric value.
Using a field
When Average, Max, Min, or Sum are used on a field outside a printing operation, they may
have to load each record in the current selection to calculate the result. If there are many
records, this process may take some time. To avoid this, index the field.
When these functions are used in a report, they behave differently than at other times. This is
because the report itself must load each record. Use these functions in a form or object
method when printing with the PRINT SELECTION command or when printing by choosing
Print from the File menu in the User environment.
When you use these functions in a report, the values that are returned are reliable only at
break level 0, and only when break processing is turned on. This means that they are useful
only at the end of a report, after all the records have been processed.
You would use these functions only in an object method for a non-enterable area that is
included in the B0 Break area.
Remember that the field passed as a parameter to the statistical function must be a numeric.
See Also
Average, Max, Min, Std deviation, Sum, Sum squares, Variance.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Sum command returns the sum (total of all values) for series. If series is an indexed field,
the index is used to total the values.
Example
The following example is an object method for a variable that vTotal placed in a form. The
object method assigns the sum of all salaries to vTotal:
vTotal:=Sum([Employees]Salary)
The following method is called to print the records in the selection and to activate break
processing:
ALL RECORDS ([Employees])
ORDER BY ([Employees];[Employees]LastNm;>)
BREAK LEVEL (1)
ACCUMULATE ([Employees]Salary)
OUTPUT FORM ([Employees];"PrintForm")
PRINT SELECTION ([Employees])
Note: The parameter to the BREAK LEVEL command should be equal to the number of breaks in
your report. For more information about break processing, refer to the printing commands.
See Also
ACCUMULATE, Average, BREAK LEVEL, Max, Min, ORDER BY, PRINT SELECTION, Subtotal.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Average returns the arithmetic mean (average) of series. If series is an indexed field, the index is
used to find the average.
Example
The following example sets the variable vAverage that is in the B0 Break area of an output
form. The line of code is the object method for vAverage. The object method is not executed
until the level 0 break:
The following method is called to print the records in the selection and to activate break
processing:
Note: The parameter to the BREAK LEVEL command should be equal to the number of breaks in
your report. For more information about break processing, refer to the printing commands.
See Also
ACCUMULATE, BREAK LEVEL, Max, Min, ORDER BY, PRINT SELECTION, Subtotal, Sum.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Min returns the minimum value in series. If series is an indexed field, the index is used to find
the minimum value.
Examples
1. The following example is an object method for the variable vMin placed in the break 0
portion of the form. The variable is printed at the end of the report. The object method assigns
the minimum value of the field to the variable, which is then printed in the last break of the
report:
vMin:=Min([Employees]Salary)
The following method is called to print the records in the selection and to activate break
processing:
Note: The parameter to the BREAK LEVEL command should be equal to the number of breaks in
your report. For more information about break processing, refer to the printing commands.
See Also
Max.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Max returns the maximum value in series. If series is an indexed field, the index is used to find
the maximum value.
Example
The following example is an object method for the variable vMax placed in the break 0 portion
of the form. The variable is printed at the end of the report. The object method assigns the
maximum value of the field to the variable, which is then printed in the last break of the
report.
The following method is called to print the records in the selection and to activate break
processing:
Note: The parameter to the BREAK LEVEL command should be equal to the number of breaks in
your report. For more information about break processing, refer to the printing commands.
See Also
Min.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Std deviation returns the standard deviation of series. If series is an indexed field, the index is
used to find the standard deviation. You can only use a field with this function when printing
a report.
Example
The following example is an object method for the variable vDeviate. The object method
assigns the standard deviation for a data series to vDeviate:
The following method is called to print the records in the selection and to activate break
processing:
Note: The parameter to the BREAK LEVEL command should be equal to the number of breaks in
your report. For more information about break processing, refer to the printing commands.
See Also
Average, Sum, Sum squares, Variance.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Variance returns the variance for series. If series is an indexed field, the index is used to find the
variance. You can only use a field with this function when printing a report.
Example
The following example is an object method for the variable var. The object method assigns the
sum of squares for a data series to var:
The following method is called to print the records in the selection and to activate break
processing:
Note: The parameter to the BREAK LEVEL command should be equal to the number of breaks in
your report. For more information about break processing, refer to the printing commands.
See Also
Average, Std deviation, Sum, Sum squares.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Sum squares returns the sum of the squares of series. If series is an indexed field, the index is
used to find the sum of the squares. You can only use a field with this function when printing
a report.
Example
The following example is an object method for the variable vSquares. The object method
assigns the sum of squares for a data series to vSquares. The vSquares variable is printed in the
last break of the report:
The following method is called to print the records in the selection and to activate break
processing:
Note: The parameter to the BREAK LEVEL command should be equal to the number of breaks in
your report. For more information about break processing, refer to the printing commands.
See Also
Average, Std deviation, Sum, Variance.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Operators are symbols used to specify operations performed between expressions. They:
• Perform calculations on numbers, dates, and times.
• Perform string operations, Boolean operations on logical expressions, and specialized
operations on pictures.
• Combine simple expressions to generate new expressions.
Precedence
The order in which an expression is evaluated is called precedence. 4th Dimension has a strict
left-to-right precedence, in which algebraic order is not observed. For example:
3+4*5
returns 35, because the expression is evaluated as 3 + 4, yielding 7, which is then multiplied
by 5, with the final result of 35.
To override the left-to-right precedence, you MUST use parentheses. For example:
3 + (4 * 5)
returns 23 because the expression (4 * 5) is evaluated first, because of the parentheses. The
result is 20, which is then added to 3 for the final result of 23.
Parentheses can be nested inside other sets of parentheses. Be sure that each left parenthesis
has a matching right parenthesis to ensure proper evaluation of expressions. Lack of, or
incorrect use of parentheses can cause unexpected results or invalid expressions. Furthermore,
if you intend to compile your applications, you must have matching parentheses—the
compiler detects a missing parenthesis as a syntax error.
String Operators
See the section String Operators.
Numeric Operators
See the section Numeric Operators.
Date Operators
See the section Date Operators.
Time Operators
See the section Time Operators.
Comparison Operators
See the section Comparison Operators.
Logical Operators
See the section Logical Operators.
Picture Operators
See the section Picture Operators.
Bitwise Operators
See the section Bitwise Operators.
See Also
Constants, Data Types, Identifiers.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
An expression that uses a string operator returns a string. The following table shows the string
operators:
See Also
Bitwise Operators, Comparison Operators, Date Operators, Logical Operators, Numeric Operators,
Operators, Picture Operators, Time Operators.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
An expression that uses a numeric operator returns a number. The following table shows the
numeric operators:
Modulo Operator
The modulo operator % divides the first number by the second number and returns a whole
number remainder. Here are some examples:
• 10 % 2 returns 0 because 10 is evenly divided by 2.
• 10 % 3 returns 1 because the remainder is 1.
• 10.5 % 2 returns 0 because the remainder is not a whole number.
WARNING:
• The modulo operator % returns significant values with numbers that are in the Long Integer
range (from minus 2^31 to 2^31 minus one). To calculate the modulo with numbers outside
of this range, use the Mod command.
• The longint division operator \ returns significant values with integer numbers only.
See Also
Bitwise Operators, Comparison Operators, Date Operators, Logical Operators, Operators, Picture
Operators, String Operators, Time Operators.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
An expression that uses a date operator returns a date or a number, depending on the
operation. All date operations will result in an accurate date, taking into account the change
between years and leap years. The following table shows the date operators:
See Also
Bitwise Operators, Comparison Operators, Logical Operators, Numeric Operators, Operators,
Picture Operators, String Operators, Time Operators.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
An expression that uses a time operator returns a time or a number, depending on the
operation. The following table shows the time operators:
Tips
(1) To obtain a time expression from an expression that combines a time expression with a
number, use the commands Time and Time string.
Example:
` The following line assigns to $vlSeconds the number of seconds that will be elapsed
` between midnight and one hour from now
$vlSeconds:=Current Time+3600
` The following line assigns to $vHSoon the time it will be in one hour
$vhSoon:=Time(Time string(Current time+3600))
` The following line assigns to $vHSoon the time it will be in one hour
$vhSoon:=Current time+?01:00:00?
However, while developing your application, you may encounter situations where a delay,
expressed in seconds and added to a time value, is only available to you as a numeric value.
In this case, use the next tip.
For example, you open a document using Open document, which returns a Document
Reference (DocRef) that is formally a time expression. Later, you want to pass that DocRef to a
4D Extension routine that expects a numeric value as document reference. In such a case, use
the addition with 0 (zero) to get a numeric value from the time value, but without changing
its value.
Example:
See Also
Bitwise Operators, Comparison Operators, Date Operators, Logical Operators, Numeric Operators,
Operators, Picture Operators, String Operators.
The tables in this section show the comparison operators as they apply to string, numeric, date,
time, and pointer expressions. An expression that uses a comparison operator returns a Boolean
value, either TRUE or FALSE.
String Comparisons
Operation Syntax Returns Expression Value
Equality String = String Boolean "abc" = "abc" True
"abc" = "abd" False
Inequality String # String Boolean "abc" # "abd" True
"abc" # "abc" False
Greater than String > String Boolean "abd" > "abc" True
"abc" > "abc" False
Less than String < String Boolean "abc" < "abd" True
"abc" < "abc" False
Greater than or equal to String >= String Boolean "abd" >= "abc" True
"abc" >= "abd" False
Less than or equal to String <= String Boolean "abc" <= "abd" True
"abd" <= "abc" False
Numeric Comparisons
Operation Syntax Returns Expression Value
Equality Number = Number Boolean 10 = 10 True
10 = 11 False
Inequality Number # Number Boolean 10 #11 True
10 # 10 False
Greater than Number > Number Boolean 11 > 10 True
10 > 11 False
Less than Number < Number Boolean 10 < 11 True
11 < 10 False
Greater than or equal to Number >= Number Boolean 11 >= 10 True
10 >= 11 False
Less than or equal to Number <= Number Boolean 10 <= 11 True
11 <= 10 False
Time Comparisons
Operation Syntax Returns Expression Value
Equality Time = Time Boolean ?01:02:03? = ?01:02:03? True
?01:02:03? = ?01:02:04? False
Inequality Time # Time Boolean ?01:02:03? # ?01:02:04? True
?01:02:03? # ?01:02:03? False
Greater than Time > Time Boolean ?01:02:04? > ?01:02:03? True
?01:02:03? > ?01:02:03? False
Less than Time < Time Boolean ?01:02:03? < ?01:02:04? True
?01:02:03? < ?01:02:03? False
Greater than or equal to Time >= Time Boolean ?01:02:03? >=?01:02:03? True
?01:02:03? >=?01:02:04? False
Less than or equal to Time <= Time Boolean ?01:02:03? <=?01:02:03? True
?01:02:04? <=?01:02:03? False
Pointer comparisons
With:
• When strings are compared, diacritical characters are compared using the system character
comparison table of your computer. For example, the following expressions return TRUE:
"n" = "ñ"
"n" = "Ñ"
"A"="å"
` and so on
• The wildcard character (@) can be used in any string comparison to match any number of
characters. For example, the following expression is TRUE:
"abcdefghij" = "abc@"
The wildcard character must be used within the second operand (the string on the right side) in
order to match any number of characters. The following expression is FALSE, because the @ is
considered only as a one character in the first operand:
"abc@" = "abcdefghij"
The wildcard means “one or more characters or nothing”. The following expressions are TRUE:
"abcdefghij" = "abcdefghij@"
"abcdefghij" = "@abcdefghij"
"abcdefghij" = "abcd@efghij"
"abcdefghij" = "@abcdefghij@"
"abcdefghij" = "@abcde@fghij@"
On the other hand, whatever the case, a string comparison with two consecutive wildcards will
always return FALSE. The following expression is FALSE:
"abcdefghij" = "abc@@fg"
See Also
Bitwise Operators, Date Operators, Logical Operators, Numeric Operators, Operators, Picture
Operators, Time Operators.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
4th Dimension supports two logical operators that work on Boolean expressions: conjunction
(AND) and inclusive disjunction (OR). A logical AND returns TRUE if both expressions are
TRUE. A logical OR returns TRUE if at least one of the expressions is TRUE.
4th Dimension also provides the Boolean functions True, False, and Not. For more
information, see the descriptions of these commands.
The following is the truth table for the AND logical operator:
See Also
Bitwise Operators, Comparison Operators, Date Operators, Numeric Operators, Operators, Picture
Operators, String Operators, Time Operators.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
An expression that uses a picture operator returns a picture. The following table shows the
picture operators.
The two operators & and | always return a bitmapped picture, no matter what the nature of
the two source pictures. The reason is that 4th Dimension first draws the pictures into
memory bitmaps, then calculates the resulting picture by performing graphical exclusive or
inclusive OR on the pixels of the bitmaps.
The other picture operators return vectorial pictures if the two source pictures are vectorial.
Remember, however, that pictures printed by the display format On Background are printed
bitmapped.
Examples
In the following examples, all of the pictures are shown using the display format On
Background.
• Horizontal concatenation
• Horizontal move
• Resize
• Horizontal scaling
See Also
Bitwise Operators, Comparison Operators, Date Operators, Logical Operators, Numeric Operators,
Operators, String Operators, Time Operators.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Note: If you pass an Integer or a Real value to a bitwise operator, 4th Dimension evaluates the
value as a Long Integer value before calculating the expression that uses the bitwise operator.
While using the bitwise operators, you must think about a Long Integer value as an array of 32
bits. The bits are numbered from 0 to 31, from right to left.
Because each bit can equal 0 or 1, you can also think about a Long Integer value as a value
where you can store 32 Boolean values. A bit equal to 1 means True and a bit equal to 0 means
False.
An expression that uses a bitwise operator returns a Long Integer value, except for the Bit Test
operator, where the expression returns a Boolean value. The following table lists the bitwise
operators and their syntax:
Notes
(1) For the Left Bit Shift and Right Bit Shift operations, the second operand indicates the number
of positions by which the bits of the first operand will be shifted in the resulting value.
Therefore, this second operand should be between 0 and 32. Note however, that shifting by 0
returns an unchanged value and shifting by more than 31 bits returns 0x00000000 because all
the bits are lost. If you pass another value as second operand, the result is non significant.
(2) For the Bit Set, Bit Clear and Bit Test operations , the second operand indicates the number
of the bit on which to act. Therefore, this second operand must be between 0 and 31.
Otherwise, the expression returns the value of the first operand unchanged for Bit Set and Bit
Clear, and returns False for Bit Test.
Operation Description
Bitwise AND Each resulting bit is the logical AND of the bits in the two operands.
Here is the logical AND table:
1&1→1
0&1→0
1&0→0
0&0→0
In other words, the resulting bit is 1 if the two operand bits are 1;
otherwise the resulting bit is 0.
Bitwise OR (inclusive) Each resulting bit is the logical OR of the bits in the two operands.
Here is the logical OR table:
1|1→1
0|1→1
1|0→1
0|0→0
In other words, the resulting bit is 1 if at least one of the two operand
bits is 1; otherwise the resulting bit is 0.
Bitwise OR (exclusive) Each resulting bit is the logical XOR of the bits in the two operands.
Here is the logical XOR table:
1 ^| 1 → 0
0 ^| 1 → 1
1 ^| 0 → 1
0 ^| 0 → 0
In other words, the resulting bit is 1 if only one of the two operand bits
is 1; otherwise the resulting bit is 0.
Left Bit Shift The resulting value is set to the first operand value, then the resulting
bits are shifted to the left by the number of positions indicated by the
second operand. The bits on the left are lost and the new bits on the
right are set to 0.
Note: Taking into account only positive values, shifting to the left
by N bits is the same as multiplying by 2^N.
2. 4th Dimension provides many predefined constants. The literals of some of these constants
end with “bit” or “mask.” For example, this is the case of the constants provided in the
Resources properties theme:
For example, to test whether a resource (whose properties have been obtained in the variable
$vlResAttr) is purgeable or not, you can write:
3. This example stores two Integer values into a Long Integer value. You can write:
$vlLong:=($viIntA<<16) | $viIntB ` Store two Integers in a Long Integer
$vlIntA:=$vlLong>>16 ` Extract back the integer stored in the high-word
$viIntB:=$vlLong & 0xFFFF ` Extract back the Integer stored in the low-word
Tip: Be careful when manipulating Long Integer or Integer values with expressions that
combine numeric and bitwise operators. The high bit (bit 31 for Long Integer, bit 15 for
Integer) sets the sign of the value—positive if it is cleared, negative if it is set. Numeric
operators use this bit for detecting the sign of a value, bitwise operators do not care about the
meaning of this bit.
See Also
Comparison Operators, Date Operators, Logical Operators, Numeric Operators, Operators, Picture
Operators, String Operators, Time Operators.
Description
PRINT LABEL enables you to print labels with the data from the selection of table.
If do not specify the document parameter, PRINT LABEL prints the current selection of table as
labels, using the current output form. You cannot use this command to print subforms. For
details about creating forms for labels, refer to the 4th Dimension Design Reference manual.
If you specify the document parameter, PRINT LABEL enables you to access the Label Wizard
(shown below) or to print an existing Label document stored on disk. See the following
discussion.
You can suppress these dialog boxes by using either the optional asterisk (*) parameter or the
optional “greater than” (>) parameter:
• The * parameter causes a print job using the current print parameters (default parameters or
those defined by the PAGE SETUP and/or SET PRINT OPTION commands).
• Furthermore, the > parameter causes a print job without reinitializing the current print
parameters. This setting is useful for executing several successive calls to PRINT LABEL (ex.
inside a loop) while maintaining previously set customized print parameters. For an example
of use of this parameter, refer to the PRINT RECORD command description.
Note that this parameter has no effect if the Label Wizard is involved.
If the Label Wizard is not involved, the OK variable is set to 1 if all labels are printed;
otherwise, it is set to 0 (zero) (i.e., if user clicked Cancel in the printing dialog boxes).
If you specify the document parameter, the labels are printed with the label setup defined in
document. If document is an empty string (""), PRINT LABEL will present an Open File dialog
box so the user can specify the file to use for the label setup. If document is the name of a
document that does not exist (for example, pass char(1) in document), the Label Wizard is
displayed and the user can define the label setup.
Note: If the table has been declared “invisible” in Design mode, the Label Wizard will not be
displayed.
4D Server: This command can be executed on 4D Server within the framework of a stored
procedure. In this context:
• Make sure that no dialog box appears on the server machine (except for a specific
requirement). To do this, it is necessary to call the command with the * or > parameter.
• The syntax which makes the label editor appear does not work with 4D Server; in this case,
the system variable OK is set to 0.
• In the case of a problem concerning the printer (out of paper, printer disconnected, etc.), no
error message is generated.
Examples
1. The following example prints labels using the output form of a table. The example uses two
methods. The first is a project method that sets the correct output form and then prints labels:
2. The following example lets the user query the [People] table, and then automatically prints
the labels “My Labels”:
QUERY ([People])
If (OK=1)
PRINT LABEL ([People];"My Labels";*)
End if
3. The following example lets the user query the [People] table, and then lets the user choose
the labels to be printed:
QUERY ([People])
If (OK=1)
PRINT LABEL ([People];"")
End if
4. The following example lets the user query the [People] table, and then displays the Label
Wizard so the user can design, save, load and print any labels:
QUERY ([People])
If (OK=1)
PRINT LABEL ([People];Char(1))
End if
See Also
PRINT SELECTION, QR REPORT.
Description
PRINT SELECTION prints the current selection of table. The records are printed with the current
output form of the table in the current process. PRINT SELECTION performs the same action as
the Print menu command in the User environment. If the selection is empty, PRINT
SELECTION does nothing.
By default, PRINT SELECTION displays the printer dialog boxes before printing. If the user
cancels either of the printer dialog boxes, the command is canceled and the report is not
printed.
You can delete these dialog boxes by using either the optional asterisk (*) parameter or the
optional “greater than” (>) parameter:
• The * parameter causes a print job using the current print parameters (default parameters or
those defined by the PAGE SETUP and/or SET PRINT OPTION commands).
• Furthermore, the > parameter causes a print job without reinitializing the current print
parameters. This setting is useful for executing several successive calls to PRINT SELECTION
(e.g., inside a loop) while maintaining previously set customized print parameters. For an
example of the use of this parameter, refer to the PRINT RECORD command description.
During printing, the output form method and/or the form’s object methods are executed
depending on the events that are enabled for the form and objects using the Property List
window in the Design environment, as well as on the events actually occurring:
To print a sorted selection with subtotals or breaks using PRINT SELECTION, you must first sort
the selection. Then, in each Break area of the report, include a variable with an object method
that assigns the subtotal to the variable. You can also use statistical and arithmetical functions
like Sum and Average to assign values to variables. For more information, see the descriptions
of Subtotal, BREAK LEVEL and ACCUMULATE.
Warning: Do not use the PAGE BREAK command with the PRINT SELECTION command. PAGE
BREAK is to be used with the PRINT FORM command.
After a call to PRINT SELECTION, the OK variable is set to 1 if the printing has been completed.
If the printing was interrupted, the OK variable is set to 0 (zero) (i.e., the user clicked Cancel in
the printing dialog boxes).
4D Server: This command can be executed on 4D Server within the framework of a stored
procedure. In this context:
• Make sure that no dialog box appears on the server machine (except for a specific
requirement). To do this, it is necessary to call the command with the * or > parameter.
• In the case of a problem concerning the printer (out of paper, printer disconnected, etc.), no
error message is generated.
Example
The following example selects all the records in the [People] table. It then uses the DISPLAY
SELECTION command to display the records and allows the user to highlight the records to
print. Finally, it uses the selected records with the USE SET command, and prints them with
PRINT SELECTION:
See Also
ACCUMULATE, BREAK LEVEL, Level, PAGE SETUP, Subtotal.
Description
Print form simply prints form with the current values of fields and variables. It is usually used
to print very complex reports that require complete control over the printing process. Print
form does not do any record processing, break processing or page breaks. These operations are
your responsibility. Print form prints fields and variables in a fixed size frame only.
Since Print form does not issue a page break after printing the form, it is easy to combine
different forms on the same page. Thus, Print form is perfect for complex printing tasks that
involve different tables and different forms. To force a page break between forms, use the PAGE
BREAK command. In order to carry printing over to the next page for a form whose height is
greater than the available space, call the CANCEL command before the PAGE BREAK command.
In this case, Print form only prints the Detail area (the area between the Header line and the
Detail line) of the form.
In this case, the command will print the section designated by the marker. Pass one of the
constants of the Form area theme in the marker parameter:
Constant Type Value
Form Header Longint 200
Form Header1...10 Longint 201...210
Form Detail Longint 0
Form Break0...9 Longint 300...309
Form Footer Longint 100
• Section printing
Syntax:
height:=Print form (myTable;myForm;areaStart;areaEnd)
In this case, the command will print the section included between the areaStart and areaEnd
parameters. The values entered must be expressed in pixels.
The value returned by Print form indicates the height of the printable area. This value will be
automatically taken into account by the Get printed height command.
The printer dialog boxes do not appear when you use Print form. The report does not use the
print settings that were assigned to the form in the Design environment. There are two ways
to specify the print settings before issuing a series of calls to Print form:
• Call PRINT SETTINGS. In this case, you let the user choose the settings.
• Call PAGE SETUP. In this case, print settings are specified programmatically.
Print form builds each printed page in memory. Each page is printed when the page in memory
is full or when you call PAGE BREAK. To ensure the printing of the last page after any use of
Print form, you must conclude with the PAGE BREAK command. Otherwise, if the last page is
not full, it stays in memory and is not printed.
Starting with version 2004.5 of 4th Dimension, this command prints external areas and
objects (for example, 4D Write or 4D View areas). The area is reset for each execution of the
command.
Warning: Subforms are not printed with Print form. To print only one form with such objects,
use PRINT RECORD instead.
4D Server: This command can be executed on 4D Server within the framework of a stored
procedure. In this context:
• Make sure that no dialog box appears on the server machine (except for a specific
requirement).
• In the case of a problem concerning the printer (out of paper, printer disconnected, etc.), no
error message is generated.
Examples
1. The following example performs as a PRINT SELECTION command would. However, the
report uses one of two different forms, depending on whether the record is for a check or a
deposit:
See Also
CANCEL, PAGE BREAK, PAGE SETUP, PRINT SETTINGS.
Description
PAGE BREAK triggers the printing of the data that has been sent to the printer and ejects the
page. PAGE BREAK is used with Print form (in the context of the On Printing Detail form event)
to force page breaks and to print the last page created in memory. Do not use PAGE BREAK with
the PRINT SELECTION command. Instead, use Subtotal or BREAK LEVEL with the optional
parameter to generate page breaks.
The * parameter allows you to cancel a print job started with the Print form command.
Executing this command immediately stops the print job in progress.
Note: Under Windows, this mechanism can be disrupted by the spooling properties of the
print server. If the printer is configured to start printing immediately, cancelling will not be
effective. For the PAGE BREAK(*) command to operate correctly, it is preferable to choose the
"Start printing after last page is spooled" property for the printer.
The > parameter modifies the way in which the PAGE BREAK command behaves. This syntax
has two effects:
• It holds the print job open until the PAGE BREAK command is executed again without a
parameter.
• It gives priority to the print job. No other printing can take place until the print job is
finished.
The second option is particularly useful when used with a spooled print job. The > parameter
guarantees that the print job will be spooled to one file. This will reduce printing time.
Note: When screen printing, if the user clicks on Cancel in the print preview dialog box, the
PAGE BREAK command sets the systemvariable OK to 0.
See Also
CANCEL, Print form.
Description
PRINT RECORD prints the current record of table, without modifying the current selection. The
current output form is used for printing. If there is no current record for table, PRINT RECORD
does nothing.
You can print subforms with the PRINT RECORD command. This is not possible with Print form.
Note: If there are modifications to the record that have not been saved, this command prints
the modified field values, not the field values located on disk.
By default, PRINT RECORD displays the printer dialog boxes before printing. If the user cancels
either of the printer dialog boxes, the command is canceled and the record is not printed.
You can suppress these dialog boxes by using either the optional asterisk (*) parameter or the
optional “greater than” (>) parameter:
• The * parameter causes a print job using the current print parameters (default parameters or
those defined by the PAGE SETUP and/or SET PRINT OPTION commands).
• Furthermore, the > parameter causes a print job without reinitializing the current print
parameters. This setting is useful for executing several successive calls to PRINT RECORD (ex.
inside a loop) while maintaining previously set customized print parameters.
4D Server: This command can be executed on 4D Server within the framework of a stored
procedure. In this context:
• Make sure that no dialog box appears on the server machine (except for a specific
requirement). To do this, it is necessary to call the command with the * or > parameter.
• In the case of a problem concerning the printer (out of paper, printer disconnected, etc.), no
error message is generated.
Examples
1. The following example prints the current record of the [Invoices] table. The code is
contained in the object method of a Print button on the input form. When the user clicks the
button, the record is printed using an output form designed for this purpose.
2. The following example prints the same current record in two different forms. The code is
contained in the object method of a Print button on the input form. You want to set
customized print parameters and then use them in the two forms.
See Also
Print form.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Printing page returns the printing page number. It can be used only when you are printing
with PRINT SELECTION or the Print menu in the User environment.
Example
The following example changes the position of the page numbers on a report so that the
report can be reproduced in a double-sided format. The form for the report has two variables
that display page numbers. A variable in the lower-left corner (vLeftPageNum) will print the
even page numbers. A variable in the lower-right corner (vRightPageNum) will print the odd
page numbers. The example tests for even pages, then clears and sets the appropriate variables:
Case of
: (Form event=On Printing Footer)
If ((Printing page % 2) = 0) ` Modulo is 0, it is an even page
vLeftPageNum:=String(Printing page) ` Set the left page number
vRightPageNum:="" ` Clear the right page number
Else ` Otherwise it is an odd page
vLeftPageNum:="" ` Clear the left page number
vRightPageNum:=String (Printing page) ` Set the right page number
End if
End case
See Also
PRINT SELECTION.
Description
The PRINTERS LIST command fills in the array(s) passed as parameter(s) with the names as
well as, optionally, the locations or custom names and models of the available printers for
the machine.
Note: If the printers are managed using a print server (spooler), the complete access path
(under Windows) or the name of the spooler (under Mac OS) is returned.
Pass the name of a text array in the namesArray parameter. After command execution, this
array will contain the names of available printers. Under Mac OS, this will be the fixed
“system” names.
You can pass a second optional array, altNamesArray. The contents of this array will depend
on the platform:
• Under Windows, for each printer, you get its network location (or local port).
• Under Mac OS, for each printer, you get its custom name, which can be modified by the
user. This name can be used, for example, in dialog boxes.
The optional modelsArray parameter is used to get the model of each printer. This
parameter can only be used under Windows.
Use the SET CURRENT PRINTER and Get current printer commands to modify or get the
selected printer in 4D. You must pass them the names returned in the first array
(namesArray)
Under Windows, the name of a printer can be modified manually at the operating system
level. On the other hand, its location and model type are linked to its physical
characteristics. Therefore, you can use the optional array values to check the characteristics
of the selected printer — typically, you can check that all the client machines use the same
printer.
See Also
Get current printer, SET CURRENT PRINTER.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Note: This command does not work under Mac OS 9. Under Windows, it requires at least
Windows 2000.
The SET CURRENT PRINTER command is used to designate the printer to be used for printing
with the current 4D application.
Pass the name of the printer to be selected in the printerName parameter. To get a list of
available printers, use the new PRINTERS LIST command beforehand.
If you pass an empty string in printerName, the current printer defined in the system will
be used.
The SET CURRENT PRINTER command must be called before SET PRINT OPTION, so that the
options available correspond to the selected printer. On the other hand, SET CURRENT
PRINTER must be called after PAGE SETUP, otherwise the print settings are lost.
This command can be used with the PRINT SELECTION, PRINT LABEL, PRINT RECORD, Print
form, and QR REPORT commands, and is applied to all 4th Dimension printing, including
that in Design mode.
It is imperative for print commands to be called with the > parameter (where applicable) so
that the specified settings are not lost.
See Also
Get current printer, PRINTERS LIST.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Note: This command does not work under Mac OS 9. Under Windows, it requires at least
Windows 2000.
The Get current printer command returns the name of the current printer defined in the 4D
application. By default, on start-up of 4D, the current printer is the printer defined in the
system.
If the current printer is managed using a print server (spooler), the complete access path
(under Windows) or the name of the spooler (under Mac OS) is returned.
To obtain the list of available printers as well as additional information, use the PRINTERS
LIST command. To modify the current printer, use the SET CURRENT PRINTER command.
See Also
PRINTERS LIST, SET CURRENT PRINTER.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
BREAK LEVEL specifies the number of break levels in a report performed using PRINT SELECTION.
Warning: In compiled mode, you must execute BREAK LEVEL and ACCUMULATE before every
report for which you want to do break processing. These commands activate break processing
for a report. See the explanation for the Subtotal command.
The level parameter indicates the deepest level for which you want to perform break
processing. You must have sorted the records with at least that many levels. If you have sorted
more levels, those levels will be printed as sorted, but will not be processed for breaks.
Each break level that is generated will print the corresponding Break areas and Header areas in
the form. There should be at least as many Break areas in the form as the number you pass in
level. If there are more Break areas, they will be ignored and will not be printed.
The second, optional, argument, pageBreak, is used to cause page breaks during printing.
Example
The following example prints a report with two break levels. The selection is sorted on four
levels, but the BREAK LEVEL command specifies to break on only two levels. One field is
accumulated with the ACCUMULATE command:
See Also
ACCUMULATE, ORDER BY, PRINT SELECTION, Subtotal.
Description
The SET PRINT OPTION command is used to modify, by programming, the value of a print
option. Each option defined using this command is applied to the entire database and for
the duration of the session as long as no other command that modifies print parameters
(PRINT SETTINGS, PRINT SELECTION without the > parameter, etc.) is called.
The option parameter allows you to indicate the option to be modified. You can pass either
a value or one of the predefined constants of the “Print options” theme.
Pass the new value(s) of the specified option in the value1 and (optionally) value2
parameters. The number and nature of the values to be passed depend on the type of
option specified.
The following table lists the options and their possible values:
• Paper option (1): the list of all the names of available paper can be obtained using the
PRINT OPTION VALUES command.
You can either pass the name of the paper in value1 (and, in this case, omit value2), or pass
the paper width in value1 and its height in value2. The width and height must be expressed
in screen pixels.
• Orientation option (2): you can pass either 1 (Portrait), or 2 (Landscape) in value1.
• Scale option (3): pass a percentage in value1. Be careful, some printers do not allow you to
modify the scale. If you pass an invalid value, the property is reset to 100% at the time of
printing.
• Number of copies option (4): pass the number of copies to be printed in value1.
• Paper source option (5): pass the number corresponding to the index, in the array of trays
returned by the PRINT OPTION VALUES command, of the paper tray to be used.
Note: This option can only be used under Windows.
• Color option (8): in value1, pass the code specifying the mode for handling color: 1=Black
and white (monochrome), 2=Color.
Note: This option can only be used under Windows.
• Destination option (9): in value1, pass the code specifying the type of print destination:
1=Printer, 2=File (PC)/PS (Mac), 3=PDF file (Mac OS only), 5=Screen (Mac OS X driver
option).
If value1 is different from 1 or 5, pass the pathname for the resulting document in value2.
This path will be used until another path is specified. If a file with the same name already
exists at the destination location, it will be replaced. Under Windows only: if you pass an
empty string in value2 or omit this parameter, a file saving dialog appears at the time of
printing.
• Double sided option (11): you can either pass 0 (Single-sided or standard), or 1 (Double-
sided) in value1. If value1 equals 1, you can define the binding to be applied using value2:
0=Left binding (default value), 1=Top binding.
Note: This option can only be used under Windows.
• Spooler document name option (12): in value1, pass the name of the print document
that must appear in the list of spooler documents.
To use or restore standard operation (using the method name in the case of a method, the
table name for a record, etc.), pass an empty string in value1.
Warning: The name defined by this statement will be used for all the print documents of
the session for as long as a new name or an empty string is not passed.
Once set using this command, a print option is kept throughout the duration of the session
for the entire 4D application. It will be used by the PRINT SELECTION, PRINT LABEL, PRINT
RECORD, Print form, and QR REPORT commands, as well as for all 4th Dimension printing,
including that in Design mode.
Notes:
• It is indispensable to use the optional > parameter with the PRINT SELECTION, PRINT
LABEL, PRINT RECORD and PAGE BREAK commands in order to avoid resetting the print
options that were set using the SET PRINT OPTION command.
• The SET PRINT OPTION command only operates with PostScript printers.
See Also
GET PRINT OPTION, PRINT OPTION VALUES, SET CURRENT PRINTER.
Error Handling
If the value passed for an option is invalid or if it is not available on the printer, the
command returns an error (that you can intercept using an error-handling method
installed by the ON ERR CALL command) and the current value of the option remains
unchanged.
Constants
Print options theme.
Description
The GET PRINT OPTION command returns the current value(s) of a print option.
The option parameter enables you to specify the option to get. You can either pass a value
or one of the following predefined constants, located in the “Print options” theme:
Constant Type Value
Paper option Longint 1
Orientation option Longint 2
Scale option Longint 3
Number of copies option Longint 4
Paper source option Longint 5
Color option Longint 8
Destination option Longint 9
Double sided option Longint 11
Spooler document name option Longint 12
Mac spool file format option Longint 13
Hide printing progress option Longint 14
The command returns, in the value1 and (optionally) value2 parameters, the current
value(s) of the specified option. For more information on options and possible values, refer
to the description of the SET PRINT OPTION command. Note the following specific features
of the GET PRINT OPTION command:
• option = 1 (paper option): returns the name of the current paper in value1 if value2 is
omitted. If value2 is passed, the command returns, respectively, the width and height of the
paper in value1 and value2. Use the PRINT OPTION VALUES command to get the name,
height and width of all the paper formats offered by the printer.
• option = 2 (orientation option): returns 1 (Portrait) or 2 (Landscape). If a different
orientation option is used, value1 is set to 0.
• option = 5 (paper source option): in value1, returns the index (in the array of trays
returned by the PRINT OPTION VALUES command) of the paper tray used (value2 must be
omitted).
Note: This option can only be used under Windows.
Note: The GET PRINT OPTION command only operates with PostScript printers.
See Also
PRINT OPTION VALUES, SET PRINT OPTION.
Constants
Print options theme.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
In namesArray, the PRINT OPTION VALUES command returns a list of value names available
for the print option defined. Optionally, you can retrieve information for each value in
info1Array and info2Array.
The option parameter allows you to specify the option to get. You must pass one of the
following constants of the “Print options” theme (options able to return lists of value
names):
Constant Type Value
Paper option Longint 1
Paper source option Longint 5
After command execution, the namesArray array as well as, where applicable, the info1Array
and info2Array arrays will be filled in by the command with the names and information of
the available values.
If you pass value 1 (paper option) in the option parameter, the command will return the
following information:
• in namesArray, the names of the available paper formats;
• in info1Array, the heights of each paper format;
• in info2Array, the widths of each paper format.
Note: In order to obtain this information, the print driver must have access to a valid PPD
(PostScript Printer Description) file for the printer.
In order to apply a specific paper format using the SET PRINT OPTION command, you can
either pass one of the values of namesArray, the corresponding values of info1Array and
info2Array.
For more information on the different print options, refer to the description of the SET
PRINT OPTION and GET PRINT OPTION commands.
All the information returned by these commands is supplied by the operating system. Refer
to the documentation of your system for more details about specific options.
Note: The PRINT OPTION VALUES command only operates with PostScript printers.
See Also
GET PRINT OPTION, SET PRINT OPTION.
Constants
Print options theme.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
ACCUMULATE specifies the fields or variables to be accumulated during a form report
performed using PRINT SELECTION.
Warning: In compiled mode, you must execute BREAK LEVEL and ACCUMULATE before every
report for which you want to do break processing. These commands activate break processing
for a report. See the explanation for the Subtotal command.
Use ACCUMULATE when you want to include subtotals for numeric fields or variables in a form
report. ACCUMULATE tells 4th Dimension to store subtotals for each of the Data arguments.
The subtotals are accumulated for each break level specified with the BREAK LEVEL command.
Use the Subtotal function in the form method or an object method to return the subtotal of
one of the data arguments.
Example
See the example for the BREAK LEVEL command.
See Also
BREAK LEVEL, ORDER BY, PRINT SELECTION, Subtotal.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Subtotal returns the subtotal for data for the current or last break level. Subtotal works only
when a sorted selection is being printed with PRINT SELECTION or when printing using Print
in the User environment. The data parameter must be of type real, integer, or long integer.
Assign the result of the Subtotal function to a variable placed in the Break area of the form.
Warning: In compiled mode, you must execute BREAK LEVEL and ACCUMULATE before every
form report for which you want to do break processing and calculate subtotals. See discussion
at the end of the description of this command.
Subtotal should be in the form method or an object method for the form. 4th Dimension
scans the form method and object methods before printing; if Subtotal is present, break
processing will be initiated (in interpreted mode only).
The second, optional, argument to Subtotal is used to cause page breaks during printing. If
pageBreak is 0, Subtotal does not issue a page break. If pageBreak equals 1, Subtotal issues a
page break for each level 1 break. If pageBreak equals 2, Subtotal issues a page break for each
level 1 and level 2 break, and so on.
To have breaks on N sort levels, you must sort the current selection on N + 1 levels (unless you
use BREAK LEVEL or ACCUMULATE, in which case N levels is sufficient). This lets you sort on a
last field, so that the field does not create unwanted breaks. To have the last sort field generate
a break, sort the field twice.
Example
The following example is a one-line object method in a Break area of a form (B0, the area
above the B0 marker). The vSalary variable is placed in the Break area. The variable is assigned
the subtotal of the Salary field for this break level:
Case of
: (Form event=On Printing Break)
vSalary:=Subtotal ([Employees]Salary)
End case
For more information about designing forms with header and break areas, see the
4th Dimension Design Reference manual.
If 4th Dimension finds the function, break processing is activated. The Subtotal function does
not need to be executed for it to turn on break processing. For example, it could be in a
method of an object that is below the Footer line and therefore would never be printed or
executed.
The process to print the report in the User environment is typically like this:
1. Select the records to be printed.
2. Order by (sort) the records, sorting on one extra level.
3. Choose Print from the File menu.
4th Dimension scans the form and object methods, finds the Subtotal function, turns on break
processing, and prints the report. There are two disadvantages to using Subtotal to trigger
break processing:
• You cannot use Subtotal to activate break processing in compiled databases.
• You must sort on one extra level; if you have many records, this may be time consuming.
Using BREAK LEVEL and ACCUMULATE to activate break processing is the recommended
method when using methods to generate form reports. The process to print a report using this
method is typically like this:
1. Select the records to be printed.
2. Sort the records using ORDER BY. Sort on at least the same number of levels as breaks.
3. Execute BREAK LEVEL and ACCUMULATE.
4. Print the report using PRINT SELECTION.
You must use BREAK LEVEL and ACCUMULATE to activate break processing in compiled mode.
However, the Subtotal function is still necessary in order to display values on a form.
See Also
ACCUMULATE, BREAK LEVEL, Level, PRINT SELECTION.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Level → Number
Description
Level is used to determine the current header or break level. It returns the level number during
the On Header and On Printing Break events.
Level 0 is the last level to be printed and is appropriate for printing a grand total. Level returns
1 when 4th Dimension prints a break on the first sorted field, 2 when 4th Dimension prints a
break on the second sorted field, and so on.
Example
This example is a template for a form method. It shows each of the possible events that can
occur while a summary report uses a form as an output form. Level is called when a header or a
break is printed:
` Method of a form being used as output form for a summary report
$vpFormTable:=Current form table
Case of
` ...
: (Form event=On Header)
` A header area is about to be printed
Case of
: (Before selection($vpFormTable->))
` Code for the first break header goes here
: (Level = 1)
` Code for a break header level 1 goes here
: (Level = 2)
` Code for a break header level 2 goes here
` ...
End case
See Also
ACCUMULATE, BREAK LEVEL, Form event, PRINT SELECTION.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
PAGE SETUP sets the page setup for the printer to that stored with form. The page setup is
stored with the form when the form is saved in the Design environment.
In the following three cases, the printing dialog boxes are not displayed and the printing is
performed with the default print settings. :
• Calling PRINT SELECTION to which you pass the optional * parameter
• Calling PRINT RECORD to which you pass the optional * parameter
• Issuing a series of calls to PRINT FORM not preceeded by a call to PRINT SETTINGS.
Calling PAGE SETUP enables you, in this case, to skip the printing dialog boxes AND to use
print settings other than the default ones.
Example
Several (empty) forms are created for a table named [Design Stuff]. The form “PS100” is
assigned a page setup with a scaling of 100%, the form “PS90” is assigned a page setup with a
scaling of 90%, and so on. The following project method enables you to print the selection of
a table using various scalings without having to specify the scaling in the printing dialog
boxes (which are not displayed), each time:
See Also
Print form, PRINT RECORD, PRINT SELECTION, SET PRINT OPTION.
Description
The Get print marker command enables you to get the current position of a marker during
printing.
Pass one of the constants of the Form area theme in the markNum parameter:
Constant Type Value
Form Header Longint 200
Form Header1...10 Longint 201...210
Form Detail Longint 0
Form Break0...9 Longint 300...309
Form Footer Longint 100
Example
Refer to the example of the SET PRINT MARKER command.
See Also
MOVE OBJECT, SET PRINT MARKER.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
PRINT SETTINGS
Description
PRINT SETTINGS displays the printing dialog boxes. First, it displays the Print Setup dialog box.
Then, it displays the Print Job dialog box.
You should include PRINT SETTINGS before any group of PRINT FORM commands.
The Print Job dialog box contains a Preview on Screen check box that allows the user to
specify to print to the screen. You can preset or reset this check bok by calling SET PRINT
PREVIEW before calling PRINT SETTINGS.
Example
See example for the command PRINT FORM.
See Also
PAGE BREAK, Print form, SET PRINT PREVIEW.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SET PRINT PREVIEW allows you to programmatically check or uncheck the Preview on Screen
option of the Print dialog box. If you pass TRUE in preview, Preview on Screen will be checked,
if you pass FALSE in preview , Preview on Screen will be unchecked. This setting is local to a
process and does not affect the printing of other processes or users.
Example
The following example turns on the Preview on Screen option to display the results of a query
on screen, and then turns it off.
QUERY([Customers])
If (OK=1)
SET PRINT PREVIEW (True)
PRINT SELECTION ([Customers] ; *)
SET PRINT PREVIEW (False)
End if
See Also
PRINT RECORD, PRINT SELECTION, PRINT SETTINGS.
Description
The SET PRINT MARKER command enables the definition of the marker position during
printing. Combined with the Get print marker, MOVE OBJECT or Print form commands, this
command allows you to adjust the size of the print areas.
Pass one of the constants of the Form area theme in the markNum parameter:
Constant Type Value
Form Header Longint 200
Form Header1...10 Longint 201...210
Form Detail Longint 0
Form Break0...9 Longint 300...309
Form Footer Longint 100
If you pass the optional * parameter, all the markers located below the marker specified in
markNum will be moved the same number of pixels and in the same direction as this marker
when the command is executed. Warning: in this case, any objects present in the areas located
below the marker are also moved.
Notes:
• This command modifies only the existing marker position. It does not allow the addition of
markers. If you designate a marker that does not exist in the form, the command will not do
anything.
• The print marker mechanism in the Structure mode is retained: a marker cannot go any
higher than the one that precedes it, nor any lower than the one that follows it (when the *
parameter is not used).
Example
This complete example enables you to generate the printing of a three-column report, the
height of each row being calculated on the fly according to the contents of the fields.
The output form used for printing is as follows:
C_LONGINT(vLprint_height;$vLheight;vLprinted_height)
C_STRING(31;vSprint_area)
PAGE SETUP([Film];"Print_List3")
GET PRINTABLE AREA(vLprint_height)
vLprinted_height:=0
ALL RECORDS([Film])
While(Not(End selection([Film])))
vSprint_area:="Detail" `Printing of detail area
$vLheight:=Print form([Film];"Print_List3";Form Detail)
`Detail calculation is carried out in the form method
vLprinted_height:=vLprinted_height+$vLheight
If(OK=0) `CANCEL has been carried out in the form method
PAGE BREAK
vLprinted_height:=0
vSprint_area:="Header" `Reprinting of the header area
$vLheight:=Print form([Film];"Print_List3";Form Header)
$vLheight:=21
vLprinted_height:=vLprinted_height+$vLheight
vSprint_area:="Detail"
$vLheight:=Print form([Film];"Print_List3";Form Detail)
vLprinted_height:=vLprinted_height+$vLheight
End if
NEXT RECORD([Film])
End while
PAGE BREAK `Make sure that the last page is printed
C_LONGINT($l;$t;$r;$b;$fixed_wdth;$exact_hght;$l1;$t1;$r1;$b1)
C_LONGINT($final_pos;$i)
C_LONGINT($detail_pos;$header_pos;$hght_to_print;$hght_remaining)
If($movement>0)
$position:=Get print marker(Form Detail)
$final_pos:=$position+$movement
`We move the Detail marker and those that follow it
SET PRINT MARKER(Form Detail ;$final_pos;*)
`Resizing of text areas
MOVE OBJECT([Film]Actors;$l;$t;$r;$hght+$t;*)
MOVE OBJECT([Film]Summary;$l1;$t1;$r1;$hght1+$t1;*)
See Also
BEST OBJECT SIZE, GET OBJECT RECT, Get print marker, MOVE OBJECT, PAGE BREAK, Print form,
PRINT RECORD, PRINT SELECTION.
version 6.8.1
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET PRINTABLE MARGIN command returns the current values of the different margins
defined using the Print form command.
The values are returned in pixels with respect to the paper edges.
It is possible to obtain the paper size as well as to calculate the printable area using the GET
PRINTABLE AREA function.
Beginning with 4th Dimension version 6.8.1, it is possible to base the form printing carried
out using the Print form, PRINT RECORD and PRINT SELECTION commands on a fixed margin
which is identical on each printer: the paper margins, i.e. the physical limits of the sheet. To
do this, simply use the GET PRINTABLE MARGIN, SET PRINTABLE MARGIN and GET PRINTABLE
AREA commands.
See Also
GET PRINTABLE AREA, Print form, SET PRINTABLE MARGIN.
version 6.8.1
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET PRINTABLE MARGIN command enables you to set the values of various printing
margins by using the Print form command.
You can pass one of the following values into the left, top, right and bottom parameters:
• 0 = use paper margins
• -1 = use printer margins
• value > 0 = margin in pixels (remember that 1 pixel in 72 dpi represents approximately 0.4
mm)
The values of the right and bottom parameters relate to the right and bottom edges of the
paper respectively.
Note: For more information regarding Printing management and terminology in 4D, refer to
the GET PRINTABLE MARGIN command description.
By default, 4th Dimension bases its printouts on the printer margins. Once the SET PRINTABLE
MARGIN command is executed, the modified parameters are retained in the same process for
the entire session.
Examples
1. The following example enables you to obtain the size of the dead margin:
See Also
GET PRINTABLE MARGIN, Get printed height, Print form.
version 6.8.1
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET PRINTABLE AREA command returns the size, in pixels, of the height and width
parameters of the printable area. This size depends on the current printing parameters, the
paper orientation, etc.
The sizes returned do not vary from one page to another (after a page break, for instance).
Associated with the Get printed height command, this command is useful for knowing the
number of pixels available for printing or for centering an object on the page.
Note: For more information regarding Printing management and terminology in 4D, refer to
the GET PRINTABLE MARGIN command description.
See Also
GET PRINTABLE MARGIN, Print form.
version 6.8.1
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get printed height command returns the overall height (in pixels) of the section printed
using the Print form command.
The value returned will be included between 0 (the top edge of the page) and the overall
height returned by the GET PRINTABLE AREA command (the maximum size of the printable
area).
If you print a new section using the Print form command, the height of the new section is
added to this value. If the printable area available is insufficient to contain this section, a new
page is generated and the value returned is 0.
The right and left printable margins, unlike the top and bottom margins (which may be
defined using the SET PRINTABLE MARGIN command), do not influence the value returned.
Note: For more information regarding Printing management and terminology in 4D, refer to
the GET PRINTABLE MARGIN command description.
See Also
GET PRINTABLE AREA, Print form, SET PRINTABLE MARGIN.
Supported Formats
The following charts summarize the support for various picture formats on the Macintosh and
Windows platforms.
• Compression
Apple has added opcodes to the original PICT specifications, so applications can handle
QuickTime pictures without modification. When the application asks the system to draw a
picture containing embedded QuickTime data, the bitmap is expanded and displayed if
QuickTime is present; the QuickTime opcode is ignored if QuickTime is not installed.
This technology is transparent to the user and takes a minimal amount of memory, because a
1 megabyte picture can be stored in a 40 kilobyte PICT, and needs not be expanded before it is
displayed.
Under Windows, 4D requires QuickTime for Windows version 4 (or above) installation,
otherwise picture compression will not work. The compression codecs that can be used with
the picture compression commands are provided as constants in the Picture compression
constant theme.
Note: Both 4D commands requiring QuickTime but using desktop files (LOAD COMPRESS
PICTURE FROM FILE and COMPRESS PICTURE FILE) will not work on Windows.
• Conversion
4D commands such as WRITE PICTURE FILE allow you to convert and to save pictures to
different formats. Usually, these commands require QuickTime to work. Under Windows, 4D
requires QuickTime for Windows version 4 (or above) installation, otherwise picture
conversion will not work.
See Also
BLOB TO PICTURE, COMPRESS PICTURE, COMPRESS PICTURE FILE, LOAD COMPRESS PICTURE
FROM FILE, Picture Operators, PICTURE PROPERTIES, Picture size, PICTURE TO BLOB, PICTURE TYPE
LIST, READ PICTURE FILE, SAVE PICTURE TO FILE, WRITE PICTURE FILE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The COMPRESS PICTURE command compresses the picture contained in the field or variable
picture.
The parameter method is a 4-character string indicating the compressor type. You should pass
one of the constants of the Picture compression theme in this parameter.
The parameter quality is an integer between 1 and 1000 indicating the quality of the
compressed picture. In general, reducing the quality will allow for greater compression of the
picture.
Warning: The compression ratio possible for a given quality depends on the size and nature of
the picture you are compressing. Compressing small pictures may not produce any decrease in
size.
See Also
COMPRESS PICTURE FILE, LOAD COMPRESS PICTURE FROM FILE, Pictures.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
This command compresses a picture loaded from a document on disk.
You can open a PICT document using the Open document function. You can then use the
document reference returned by this function to load and compress the PICT found in the
document. This command loads the picture into memory, compresses it using the method
and quality you have specified, and then returns it into picture.
The picture is loaded into memory before it is compressed. If there is not enough memory to
load the picture, use COMPRESS PICTURE FILE before calling LOAD COMPRESS PICTURE FROM
FILE.
The parameter method is a 4-character string indicating the compressor type. You should pass
one of the constants of the Picture compression theme in method. If method is an empty string,
the picture is loaded but not compressed.
The parameter quality is an integer between 1 and 1000 indicating the quality of the
compressed picture. In general, reducing the quality will allow for greater compression of the
picture.
Warning: The compression ratio possible for a given quality depends on the size and nature of
the picture you are compressing. Compressing small pictures may not produce any decrease in
size.
See Also
COMPRESS PICTURE, COMPRESS PICTURE FILE, Pictures, SAVE PICTURE TO FILE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
This command compresses a picture document on disk. Use this command to compress a
picture that you know cannot be loaded with the available memory. Once compressed, it can
be loaded into memory using LOAD COMPRESS PICTURE FROM FILE.
The parameter method is a 4-character string indicating the compressor type. You should pass
one of the constants of the Picture compression theme in method.
The parameter quality is an integer between 1 and 1000 indicating the quality of the
compressed picture. In general, reducing the quality will allow for greater compression of the
picture.
Warning: The compression ratio possible for a given quality depends on the size and nature of
the picture you are compressing. Compressing small pictures may not produce any decrease in
size.
See Also
COMPRESS PICTURE, LOAD COMPRESS PICTURE FROM FILE, SAVE PICTURE TO FILE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
This command saves picture in a document that was created using the Create document
function.
Example
The following example creates a document and saves a picture in it:
vRef:=Create document("";"PICT")
If (OK=1)
SAVE PICTURE TO FILE(vRef;vPict)
CLOSE DOCUMENT(vRef)
End if
See Also
COMPRESS PICTURE FILE, LOAD COMPRESS PICTURE FROM FILE.
Description
The PICTURE TO GIF command allows you to convert a PICT picture stored in a variable or in a
4D field into a GIF picture.
You pass a picture variable or a picture field in pict and a BLOB variable or a BLOB field in
blobGIF. After executing the command, blobGIF contains the image in GIF format.
Note: The GIF picture format cannot contain more than 256 colors. If the original PICT
picture contains more colors, some may be lost. The command reduces the number of colors
according to the system palette. The GIF generated is of type 87a (opaque) and normal (not
interlaced).
You can then save the picture located in blobGIF in a file using the BLOB TO DOCUMENT
command or you can even publish it on the Web.
If the conversion was successful, the OK system variable is set to 1. Otherwise, it will be equal
to 0.
In the On Web Connection Database Method, you write the following code:
If (Web Context)
...
Else
C_BLOB ($blob)
Case of
...
: ($1="/4dcgi/counter") `Generating a GIF counter
`When 4D detects this URL while sending the static page
$blob:=gifcounter (<>nbHits) `Calculates the GIF picture
`The <>nbHits variable contains the number of connections
SEND HTML BLOB ($blob;"image/gif")
`Insert the picture and send it to the browser
...
End case
End if
C_LONGINT($1)
C_PICTURE($img)
C_BLOB($0)
If ($1=0)
$ndigits:=1
Else
$ndigits:=1+Length(String($1))
End if
$div:=10^($ndigits-1)
For ($i;1;$ndigits)
$ref:=Int($1/$div)%10
GET PICTURE FROM LIBRARY($ref+1000;picture)
$img:=$img+picture
$div:=$div/10
End for
PICTURE TO GIF($img;$0)
When sending a page to the Web browser, 4D displays a GIF picture that looks like the
following picture:
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The PICTURE TO BLOB command converts a picture stored in a 4D variable or field to another
format and places the resulting picture in a BLOB.
A picture 4D field or variable is passed in the picture parameter. In the pictureBlob parameter is
passed a BLOB variable or field which should contain the converted picture.
Pass in the format parameter a 4-characters string setting the conversion format. This format
can be:
• either a QuickTime format (see command PICTURE TYPE LIST description), in this case
QuickTime version 4 or above must be installed on the machine,
• either "GIFf" (GIF format) or "WBMP" (Wireless Bitmap); these last two formats do not
require QuickTime 4.
Once the command has been executed, the pictureBlob contains the picture in the specified
format.
If the conversion was successful, the system variable OK is set to 1. If the conversion has failed
(QuickTime is not installed or the convertor is not available), OK is set to 0 and the generated
BLOB is empty (0 byte).
See Also
BLOB TO PICTURE, PICTURE TO GIF, PICTURE TYPE LIST, WRITE PICTURE FILE.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The BLOB TO PICTURE command inserts a picture stored in a BLOB into a 4D picture variable
or field, regardless its original format — however the format should be QuickTime 4
compatible.
Warning: This command requires QuickTime version 4 or above for Mac OS and Windows. If
Quicktime 4 is not installed, the command does nothing.
This command is similar to the command READ PICTURE FILE, it just applies to a BLOB instead
of a file. It allows you to display pictures stored in native format into BLOBs. You can load a
picture into a BLOB using, for example, the command DOCUMENT TO BLOB or PICTURE TO
BLOB.
A BLOB variable or field containing a picture is passed in the pictureBlob parameter. The
picture can be in any QuickTime 4 supported format. You can obtain the list of available
formats using the PICTURE TYPE LIST command. Refer to the PICTURE TYPE LIST command for a
description of QuickTime 4 standard format codes.
Pass in the picture parameter the 4D picture field or variable which should display the picture.
Note: The internal picture format is stored by QuickTime within the 4D variable or field.
Consequently, it is necessary to get QuickTime to read the picture within 4D.
Once the command has been executed, the picture parameter contains the picture to display.
If the conversion has been done successfully, the system variable OK is set to 1. If the
conversion has failed (QuickTime 4 is not installed, or the BLOB does not contain a readable
picture), OK is set to 0 and the picture variable or field is empty.
See Also
PICTURE TO BLOB, PICTURE TYPE LIST, READ PICTURE FILE.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The WRITE PICTURE FILE command allows you to save the picture passed in the picture
parameter in the defined format to disk.
You can pass in fileName the full pathname to the file to create, or a file name only. If you just
pass the file name, the file will be located next to the database structure file. Under Windows,
the file extension has to be indicated.
If an empty string ("") is passed in fileName, the standard Save file dialog box is displayed and
the user can indicate the name, location and format of the file to create.
You will pass in picture the picture variable or field which contains the picture to save on disk.
The optional parameter format defines the picture saving format. This parameter should
contain a 4-characters QuickTime code. You can get the list of available formats using the
PICTURE TYPE LIST command. Refer to the PICTURE TYPE LIST command to get a description for
QuickTime 4 standard format codes.
If the format parameter is omitted or if QuickTime is not installed, the picture file is created
with a PICT format.
See Also
PICTURE TO BLOB, PICTURE TYPE LIST, Pictures, READ PICTURE FILE.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The READ PICTURE FILE command allows you to open the picture saved in the fileName disk file
and to load it in the picture 4D field or variable.
You can pass in fileName the full pathname of the file to read, or a file name only. If you just
pass the file name, it should be located next to the database structure file. Under Windows,
the file extension must be indicated.
If an empty string ("") is passed in fileName, the standard Open file dialog box is displayed and
the user can select the file to be read, as well as the available formats (provided with
QuickTime 4).
You can obtain the list of available formats using the PICTURE TYPE LIST command. Refer to
the PICTURE TYPE LIST command for a description of QuickTime 4 standard format codes.
You pass in picture the picture variable or field which will get the read image.
Note: The internal picture format is stored by QuickTime within the 4D variable or field.
Consequently, it is necessary to get QuickTime to read the picture within 4D.
If the command is executed successfully, the system variable Document contains the full
pathname to the open file and the system variable OK is set to 1. Otherwise, OK is set to 0.
See Also
BLOB TO PICTURE, PICTURE TYPE LIST, Pictures, WRITE PICTURE FILE.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The PICTURE TYPE LIST command fills the formatArray array with picture import/export
QuickTime codes available on the machine where it is executed.
The optional parameter nameArray array gets each picture format name. Format names are
easier to understand than their codes.
QuickTime (version 4 minimum) needs to be installed on the machine where the command is
executed. Otherwise, formatArray contains the PICT format only.
PICTURE TYPE LIST can be used to check that some picture formats are available for a given
database. This command is useful when some specific formats, not installed by default, are
necessary (a QuickTime 4 feature).
The information gathered in the nameArray array allow to build and to display a pop up menu
containing the available picture export formats.
See Also
BLOB TO PICTURE, PICTURE TO BLOB, READ PICTURE FILE, WRITE PICTURE FILE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
This function returns the size of picture in bytes.
See Also
PICTURE PROPERTIES.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The PICTURE PROPERTIES command returns information about the picture you pass in picture.
The parameters width and height return the width and height of the picture.
The parameters hOffset, vOffset, and mode return the horizontal and vertical positions and the
transfer mode of the picture when displayed on the background in a form (“On Background”).
See Also
Picture size.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The CREATE THUMBNAIL command returns a thumbnail from a given source picture.
Thumbnails are usually used for picture preview within multimedia software or Web sites.
You pass in the source parameter the 4D variable or field containing the picture to reduce to a
thumbnail. You pass in the dest parameter the 4D picture field or variable which should host
the resulting thumbnail.
The optional parameters width and height define the required thumbnail size (in pixels). If you
omit these parameters, the thumbnail default size will be 48 x 48 pixels.
The optional parameter mode defines the thumbnail creation mode, i.e. the reduction mode.
Three modes are available. The following predefined constants are provided by 4th Dimension
in the “Picture Display Formats” constant theme:
Note: Only these constants can be used with CREATE THUMBNAIL. The other constants in the
theme “Picture Display Formats” cannot be applied to this command.
Source picture
The optional parameter depth defines the number of colors under Mac OS (i.e., the screen
depth) to keep for the resulting thumbnail. The parameter is an integer equal to the number of
bits per pixel: 1, 2, 4, 8, 16 or 32. Enter 0 to use the current screen depth (default value).
Note: Under Windows, the depth parameter is ignored; the command always uses the current
screen depth.
version 6.0.2
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The PICTURE LIBRARY LIST command returns the reference numbers and names of the pictures
currently stored in the Picture Library of the database.
After the call, you retrieve the reference numbers in the array picRefs and the names in the
array picNames. The two arrays are synchronized: the nth element of picRefs is the reference
number of the Picture Library graphic whose name is returned in the nth element of picNames.
The array picRefs can be a Real, Long Integer or Integer array. In interpreted mode, if the array
is not declared prior to the call to PICTURE LIBRARY LIST, a Real array is created by default.
The array picNames can be a String or Text array. In interpreted mode, if the array is not
declared prior to the call PICTURE LIBRARY LIST, a Text array is created by default.
The maximum length of a Picture Library graphic name is 31 characters. If you use a String
array as picNames, declare it with a large enough fixed length to avoid having a truncated
name returned.
If there are no pictures in the Picture Library, both arrays are returned empty.
To obtain the number of pictures currently stored in the Picture Library, use the Size of array
command to get the size of one of the two arrays.
2. The following example tests whether or not the Picture Library is empty:
See Also
GET PICTURE FROM LIBRARY, REMOVE PICTURE FROM LIBRARY, SET PICTURE TO LIBRARY.
Description
The GET PICTURE FROM LIBRARY command returns in the picture parameter the Picture Library
graphic whose reference number is passed in picRef or whose name is passed in picName.
Note for components developers: If you want a 4D component to use graphics stored in the
Picture Library, you must pass a picture name as first parameter. Indeed, when a component
requiring its own pictures is installed by 4D Insider, the application can renumber
automatically these new pictures if some database pictures have already the same reference
number.
If there is no picture with that reference number or name, GET PICTURE FROM LIBRARY leaves
picture unchanged.
Examples
1. The following example returns in vgMyPicture the picture whose reference number is stored
in the local variable $vlPicRef:
2. The following example returns in $DDcom_Prot_MyPicture the picture with the name
"DDcom_Prot_Button1" stored in the Picture Library:
See Also
PICTURE LIBRARY LIST, REMOVE PICTURE FROM LIBRARY, SET PICTURE TO LIBRARY.
Error Handling
If there is not enough memory to return the picture, an error -108 is generated. You can catch
this error using an error-handling method.
version 6.0.2
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET PICTURE TO LIBRARY command creates a new picture or replaces a picture in the
Picture Library.
If there is an existing Picture Library graphic with the same reference number, the picture
contents are replaced and the picture is renamed according to the values passed in picture and
picName.
If there is no Picture Library graphic with the reference number passed in picRef, a new picture
is added to the Picture Library.
4D Server: SET PICTURE TO LIBRARY cannot be used from within a method executed on the
server machine (stored procedure or trigger). If you call SET PICTURE TO LIBRARY on a server
machine, nothing happens—the call is ignored.
Warning: Design objects (hierarchical list items, menu items, etc.) may refer to Picture Library
graphics. Use caution when modifying a Picture Library graphic programmatically.
Note: If you pass an empty picture in picture or a negative or null value in picRef, the
command does nothing.
2. The following example imports into the Picture Library the pictures (stored in a document
on disk) created by the third example for the command PICTURE LIBRARY LIST:
SET CHANNEL(10;"")
If (OK=1)
RECEIVE VARIABLE($vsTag)
If ($vsTag="4DV6PICTURELIBRARYEXPORT")
RECEIVE VARIABLE($vlNbPictures)
If ($vlNbPictures>0)
For($vlPicture;1;$vlNbPictures)
RECEIVE VARIABLE($vlPicRef)
If (OK=1)
RECEIVE VARIABLE($vsPicName)
End if
If (OK=1)
RECEIVE VARIABLE ($vgPicture)
End if
If (OK=1)
SET PICTURE TO LIBRARY($vgPicture;$vlPicRef;$vsPicName)
Else
$vlPicture:=$vlNbPictures+1
ALERT("This file looks like being damaged.")
End if
End for
Else
ALERT("This file looks like being damaged.")
End if
Else
See Also
GET PICTURE FROM LIBRARY, PICTURE LIBRARY LIST, REMOVE PICTURE FROM LIBRARY.
Error Handling
If there is not enough memory to add the picture to the Picture Library, an error -108 is
generated. Note that I/O errors may also be returned (i.e., the structure file is locked). You can
catch these errors using an error-handling method.
Description
The REMOVE PICTURE FROM LIBRARY command removes from the Picture Library the picture
whose reference number is passed in picRef or whose name is passed in picName.
If there is no picture with that reference number or name, the command does nothing.
4D Server: REMOVE PICTURE FROM LIBRARY cannot be used from within a method executed on
the server machine (stored procedure or trigger). If you call REMOVE PICTURE FROM LIBRARY on
a server machine, nothing happens—the call is ignored.
Warning: Design objects (hierarchical list items, menu items, etc.) may refer to Picture Library
graphics. Use caution when deleting a Picture Library graphic programmatically.
Examples
1. The following example deletes the picture #4444 from the Picture Library.
2. The following example deletes from the Picture Library any pictures whose names begin
with a dollar sign ($):
See Also
GET PICTURE FROM LIBRARY, PICTURE LIBRARY LIST, SET PICTURE TO LIBRARY.
Description
A semaphore is a flag shared among workstations (each user’s computer) or among processes
on the same workstation. A semaphore simply exists or does not exist. The methods that each
user is running can test for the existence of a semaphore. By creating and testing semaphores,
methods can communicate between workstations.
The Semaphore function returns TRUE if semaphore exists. If semaphore does not exist,
Semaphore creates it and returns FALSE. Only one user at a time can create a semaphore. If
Semaphore returns FALSE, it means that the semaphore did not exist, but it also means that
the semaphore has been set for the process in which the call has been made.
Semaphore returns FALSE if the semaphore was not set. It also returns FALSE if the semaphore
is already set by the same process in which the call has been made. semaphore is limited to 30
characters, including prefixes (<>, $). If you pass a longer string, the semaphore will be tested
with the truncated string.
The optional parameter tickCount allows you to specify a waiting time (in ticks) if semaphore is
already set. In this case, the function will wait either for the semaphore to be freed or the
waiting time to expire before returning True.
There are two types of semaphores in 4th Dimension: local semaphores and global semaphores.
• A local semaphore is accessible by all processes on the same workstation and only on the
workstation. A local semaphore can be created by prefixing the name of the semaphore with a
dollar sign ($). You use local semaphores to monitor operations among processes executing on
the same workstation. For example, a local semaphore can be used to monitor access to an
interprocess array shared by all the processes in your single-user database or on the
workstation.
Global and local semaphores are identical in their logic. The difference resides in their scope.
In 4D Server, global semaphores are shared among all the processes running on all clients. A
local semaphore is only shared among the processes running on the client where it has been
created.
In 4th Dimension, global or local semaphores have the same scope because you are the only
user. However, if your database is being used in both setups, make sure to use global or local
semaphores depending on what you want to do.
You do not use semaphores to protect record access. This is automatically done by
4th Dimension and 4D Server. Use semaphores to prevent several users from performing the
same operation at the same time.
Examples
1. In this example, you want to prevent two users from doing a global update of the prices in
a Products table. The following method uses semaphores to manage this:
2. The following example uses a local semaphore. In a database with several processes, you
want to maintain a To Do list. You want to maintain the list in an interprocess array and not
in a table. You use a semaphore to prevent simultaneous access. In this situation, you only
need to use a local semaphore, because your To Do list is only for your use.
See Also
CLEAR SEMAPHORE, Test semaphore.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CLEAR SEMAPHORE erases semaphore previously set by the Semaphore function.
As a rule, all semaphores that have been created should be cleared. If semaphores are not
cleared, they remain in memory until the process that creates them ends. A process can only
clear semaphores that it has created. If you try to clear a semaphore from within a process that
did not create it, nothing happens.
Example
See the example for Semaphore.
See Also
Semaphore.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Test semaphore command allows you to test the existence of a semaphore.
The difference between the Semaphore function and the Test semaphore function is that Test
semaphore doesn’t create the semaphore if it doesn’t exit. If the semaphore exists, the function
returns True. Otherwise, it returns False.
Example
The following example allows you to know the state of a process (in our case, while modifying
the code) without modifying semaphore:
See Also
Semaphore.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CALL PROCESS calls the form displayed in the frontmost window of process.
Important: CALL PROCESS only works between processes running on the same machine.
If process (the target process) is not currently displaying a form, nothing happens. The form
displayed in the target process receives an On Outside call event. This event must be enabled
for that form in the Design environment Form Properties window, and you must manage the
event in the form method. If the event is not enabled or if it is not managed in the form
method, nothing happens.
Note: The On Outside call event modifies the entry context of the receiving input form. In
particular, if a field was being edited, the On Data change event is generated.
The caller process (the process from which CALL PROCESS is executed) does not “wait”— CALL
PROCESS has an immediate effect. If necessary, you must write a waiting loop for a reply from
the called process, using interprocess variables or using process variables (reserved for this
purpose) that you can read and write between the two processes (using GET PROCESS VARIABLE
and SET PROCESS VARIABLE).
To communicate between processes that do not display forms, use the commands GET
PROCESS VARIABLE and SET PROCESS VARIABLE.
Example
See example for On Exit Database Method.
See Also
Form event, GET PROCESS VARIABLE, SET PROCESS VARIABLE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
GET PROCESS VARIABLE (process; srcVar; dstVar{; srcVar2; dstVar2; ...; srcVarN; dstVarN})
Description
The GET PROCESS VARIABLE command reads the srcVar process variables (srvVar2, etc.) from the
source process whose number is passed in process, and returns their current values in the
dstVar variables ( dstVar2, etc.) of the current process.
Each source variable can be a variable, an array or an array element. However, see the
restrictions listed later in this section.
In each couple of srcVar;dstVar variables, the two variables must be of compatible types,
otherwise the values you obtain may be meaningless.
The current process “peeks” the variables from the source process—the source process is not
warned in any way that another process is reading the instance of its variables.
4D Server: Using 4D Client, you can read variables in a destination process executed on the
server machine (stored procedure). To do so, put a minus sign before the process ID number in
the process parameter.
“Intermachine” process communication, provided by the commands GET PROCESS VARIABLE,
SET PROCESS VARIABLE and VARIABLE TO VARIABLE, is possible from client to server only. It is
always a client process that reads or write the variables of a stored procedure.
Tip: If you do not know the ID number of the server process, you can still use the interprocess
variables of the server. To do so, you can use any negative value in process. In other words, it is
not necessary to know the ID number of the process to be able to use the GET PROCESS
VARIABLE command with the interprocess variables of the server. This is useful when a stored
procedure is launched using the On server startup database method. As clients machines do not
automatically know the ID number of that process, any negative value can be passed in the
process parameter.
On the other hand, the destination variables can be interprocess, process or local variables.
You “receive” the values only into variables, not into fields.
GET PROCESS VARIABLE accepts any type of source process or interprocess variable, except:
• Pointers
• Array of pointers
• Two-dimensional arrays
The source process must be a user process; it cannot be a kernel process. If the source process
does not exist, this command has no effect.
Note: In interpreted mode, if a source variable does not exist, the undefined value is returned.
You can detect this by using the Type function to test the corresponding destination variable.
Examples
1. This line of code reads the value of the text variable vtCurStatus from the process whose
number is $vlProcess. It returns the value in the process variable vtInfo of the current process:
2. This line of code does the same thing, but returns the value in the local variable $vtInfo for
the method executing in the current process:
3. This line of code does the same thing, but returns the value in the variable vtCurStatus of
the current process:
Note: The first vtCurStatus designates the instance of the variable in the source process The
second vtCurStatus designates the instance of the variable in the current process.
Note: In this example, the process variable vl_IPCom_Array contains the size of the array
at_IPCom_Array, and must be maintained by the source process.
5. This example does the same thing as the previous one, but reads the array as a whole,
instead of reading the elements sequentially:
6. This example reads the source process instances of the variables v1,v2,v3 and returns their
values in the instance of the same variables for the current process:
7. See the example for the command DRAG AND DROP PROPERTIES.
See Also
CALL PROCESS, Drag and Drop, DRAG AND DROP PROPERTIES, Processes, SET PROCESS VARIABLE,
VARIABLE TO VARIABLE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
SET PROCESS VARIABLE (process; dstVar; expr{; dstVar2; expr2; ...; dstVarN; exprN})
Description
The SET PROCESS VARIABLE command writes the dstVar process variables (dstVar2, etc.) of the
destination process whose number is passed in process using the values passed in expr1 (expr2,
etc.).
Each destination variable can be a variable or an array element. However, see the restrictions
listed later in this section.
For each couple of dstVar;expr variables, the expression must be of a type compatible with the
destination variable, otherwise you may end up with a meaningless value in the variable. In
interpreted mode, if a destination variable does not exist, it is created and assigned with the
expression.
The current process “pokes” the variables of the destination process—the destination process is
not warned in any way that another process is writing the instance of its variables.
4D Server: Using 4D Client, you can write variables in a destination process executed on the
server machine (stored procedure). To do so, put a minus sign before the process ID number in
the process parameter.
“Intermachine” process communication, provided by the commands GET PROCESS VARIABLE,
SET PROCESS VARIABLE and VARIABLE TO VARIABLE, is possible from client to server only. It is
always a client process that reads or write the variables of a stored procedure.
Tip: If you do not know the ID number of the server process, you can still use the interprocess
variables of the server. To do so, use any negative value in process. In other words, it is not
necessary to know the ID number of the process to be able to use the SET PROCESS VARIABLE
command with the interprocess variables of the server. This is useful when a stored procedure
is launched using the On server startup database method. As client machines do not
automatically know the ID number of that process, any negative value can be passed in the
process parameter.
SET PROCESS VARIABLE accepts any type of destination process or interprocess variable, except:
• Pointers
• Arrays of any type. To write an array as a whole from one process to another one, use the
command VARIABLE TO VARIABLE. Note, however, that SET PROCESS VARIABLE allows you to
write the element of an array.
• You cannot write the element of an array of pointers or the element of a two-dimensional
array.
The destination process must be a user process; it cannot be a kernel process. If the destination
process does not exist, an error is generated. You can catch this error using an error-handling
method installed with ON ERR CALL.
Examples
1. This line of code sets (to the empty string) the text variable vtCurStatus of the process whose
number is $vlProcess:
2. This line of code sets the text variable vtCurStatus of the process whose number is $vlProcess
to the value of the variable $vtInfo from the executing method in the current process:
3. This line of code sets the text variable vtCurStatus of the process whose number is $vlProcess
to the value of the same variable in the current process:
Note: The first vtCurStatus designates the instance of the variable in the destination process.
The second vtCurStatus designates the instance of the variable in the current process.
4. This example sequentially sets to uppercase all elements of a process array from the process
indicated by $vlProcess:
5. This example writes the destination process instance of the variables v1, v2 and v3 using the
instance of the same variables from the current process:
See Also
CALL PROCESS, GET PROCESS VARIABLE, Processes, VARIABLE TO VARIABLE.
version 6.0.2
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
VARIABLE TO VARIABLE (process; dstVar; srcVar{; dstVar2; srcVar2; ...; dstVarN; srcVarN})
Description
The VARIABLE TO VARIABLE command writes the dstVar process variables (dstVar2, etc.) of the
destination process whose number is passed in process using the values of the variables srcVar1
srcVar2, etc.
VARIABLE TO VARIABLE has the same action as SET PROCESS VARIABLE, with the following
differences:
• You pass source expressions to SET PROCESS VARIABLE, and therefore cannot pass an array as
a whole. You must exclusively pass source variables to VARIABLE TO VARIABLE, and therefore
can pass an array as a whole.
• Each destination variable of SET PROCESS VARIABLE can be a variable or an array element,
but cannot be an array as a whole. Each destination variable of VARIABLE TO VARIABLE can be a
variable or an array or an array element.
For each couple of dstVar;expr variables, the source variable must be of a type compatible with
the destination variable, otherwise you may end up with a meaningless value in the variable.
In interpreted mode, if a destination variable does not exist, it is created and assigned with the
type and value of the source variable.
The current process “pokes” the variables of the destination process—the destination process is
not warned in any way that another process is writing the instance of its variables.
Restrictions
VARIABLE TO VARIABLE does not accept local variables as destination variables.
The destination process must be a user process; it cannot be a kernel process. If the destination
process does not exist, an error is generated. You can catch this error using an error-handling
method installed with ON ERR CALL.
Example
The following example reads a process array from the process indicated by $vlProcess,
sequentially sets the elements to uppercase and then writes back the array as a whole:
See Also
GET PROCESS VARIABLE, Processes, SET PROCESS VARIABLE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
HIDE PROCESS hides all windows that belong to process. All interface elements of process are
hidden until the next SHOW PROCESS. The menu bar of the process is also hidden. This means
that opening a window while the process is hidden does not make the screen redraw or
display. If the process is already hidden, the command has no effect.
The only exception to this rule is the Debugger window. If the Debugger window is displayed
when process is a hidden process, process is displayed and becomes the frontmost process.
If you do not want a process to be displayed when it is created, HIDE PROCESS should be the
first command in the process method. The User/Custom Menus and Cache Manager processes
cannot be hidden using this command.
Example
The following example hides all the windows belonging to the current process:
See Also
Process state, SHOW PROCESS.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SHOW PROCESS displays all the windows belonging to process. This command does not bring
the windows of process to the frontmost level. To do this, use the BRING TO FRONT command.
If the process was already displayed, the command has no effect.
Example
The following example displays a process called Customers, if it has been previously hidden.
The process reference to the Customers process is stored in the interprocess variable
<>Customers:
See Also
BRING TO FRONT, HIDE PROCESS, Process state.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
BRING TO FRONT brings all the windows belonging to process to the front. The order of the
windows is retained. If the process is already the frontmost process, the command does
nothing. If the process is hidden, you must use SHOW PROCESS to display the process,
otherwise BRING TO FRONT has no effect.
The User/Custom Menus and Design processes can be brought to the front using this
command.
Example
The following example is a method that can be executed from a menu. It checks to see if
<>vlAddCust_PID is the frontmost process. If not, the method brings it to the front:
If (Frontmost process#<>vlAddCust_PID)
BRING TO FRONT (<>vlAddCust_PID)
End if
See Also
HIDE PROCESS, Process state, SHOW PROCESS.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Frontmost process returns the number of the process whose window (or windows) are in the
front.
When you have one or more floating windows open, there are two window layers:
• Regular windows
• Floating windows
If the Frontmost process function is used from within a floating window form method or
object method, the function returns the process reference number of the frontmost floating
window in the floating window layer. If you specify the optional * parameter, the function
returns the process reference number of the frontmost active window in the regular window
layer.
Example
See the example for BRING TO FRONT.
See Also
BRING TO FRONT, WINDOW LIST.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Multi-tasking in 4th Dimension is the ability to have distinct database operations that are
executed simultaneously. These operations are called processes.
Multiple processes are like multiple users on the same computer, each working on his or her
own task. This essentially means that each method can be executed as a distinct database task.
Note: This section does not cover stored procedures. See the section Stored Procedures in the
4D Server Reference manual.
A process can be cleared under the following conditions. The first two conditions are
automatic:
• When the process method finishes executing
• When the user quits from the database
• If you stop the process procedurally or use the Abort button in the Debugger
• If you choose Abort from the Process menu in the Design environment
Elements of a Process
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Each process contains specific elements. There are three types of distinctly different elements
in a process:
• Interface elements: Elements that are necessary to display a process.
• Data elements: Information that is related to the data in the database.
• Language elements: Elements that are used procedurally or are that are important for
developing your own application.
Interface Elements
Interface elements consist of the following:
• Menu bar: Each process can have its own current menu bar. The menu bar of the frontmost
process is the current menu bar for the database.
• One or more windows: Each process can have more than one window open simultaneously.
On the other hand, some processes have no windows at all.
• One active (frontmost) window: Even though a process can have several windows open
simultaneously, each process has only one active window. To have more than one active
window, you must start more than one process.
Data Elements
Data elements refer to the data used by the database. The data elements are:
• Current selection per table: Each process has a separate current selection. One table can have
a different current selection in different processes.
• Current record per table: Each table can have a different current record in each process.
Note: This description of the data elements is valid if your processes are global in scope. By
default, all processes are global. See the “Global and Local Processes” section below.
Language Elements
The language elements of a process are the elements related to programming in
4th Dimension.
• Variables: Every process has its own process variables. See Variables for more information.
Process variables are recognized only within the domain of their native process.
• Default table: Each process has its own default table. However, note that the DEFAULT TABLE
command is only a typing convention for programming.
User Processes
User processes are processes that you create to perform certain tasks. They share processing
time with the kernel processes. As an example, Web connection processes are user processes.
Processes can be either global or local in scope. By default, all processes are global.
Global processes can perform any operation, including accessing and manipulating data. In
most cases, you will want to use global processes.
Local processes should be used only for operations that do not access data. For example, you
can use a local process to run an event-handling method or to control interface elements such
as floating windows.
You specify that a process is local in scope through its name. The name of local process must
start with a dollar sign ($).
Warning: If you attempt to access data from a local process, you access it though the
User/Custom Menus process, risking conflicts with operations performed within that process.
4D Server: Using local processes on the Client side for operations that do not require data
access reserves more processing time for server-intensive tasks.
A record is locked when another process has successfully loaded the record for modification. A
locked record can be loaded by another process, but cannot be modified. The record is
unlocked only in the process in which the record is being modified. A table must be in
read/write mode for a record to be loaded unlocked.
See Also
Methods, Project Methods, Variables.
New process (method; stack{; name{; param{; param2; ...; paramN}{; *}}}) → Number
Description
The New process command starts a new process (on the same machine) and returns the
process number for that process.
If the process could not be created (for example, if there is not enough memory), New process
returns zero (0) and an error is generated. You can catch this error using an error-handling
method installed using ON ERR CALL.
Process Method: In method, you pass the name of the process method for the new process.
After 4D has set up the context for the new process, it starts executing this method, which
therefore becomes the process method.
Process Stack: In stack, you pass the amount of memory allocated for the stack of the process.
It is the space in memory used to “pile up” method calls, local variables, parameters in
subroutines, and stacked records. It is expressed in bytes; it is recommended to pass at least
64K (around 64,000 bytes), but you can pass more if the process can perform large chain calls
(subroutines calling subroutines in cascade). For example, you can pass 200K (around 200000
bytes), if necesary.
Process Name: You pass the name of the new process in name. This name will appear in the
Process List window of the Design environment, and will be returned by the command
PROCESS PROPERTIES when applied to this new process. A process name can be up to 31
characters long. You can omit this parameter; if you do so, the name of the process will be the
empty string. You can make a process local in scope by prefixing its name with the dollar sign
($).
Important: Remember that local processes should not access data in Client/Server.
Parameter to Process Method: Starting with version 6, you can pass parameters to the process
method. You can pass parameters in the same way as you would pass them to a subroutine.
However, there is a restriction—you cannot pass pointer expressions. Also, remember that
arrays cannot be passed as parameters to a method. Upon starting execution in the context of
the new process, the process method receives the parameters values in $1, $2, etc.
Note: If you pass parameters to the process method, you must pass the name parameter; it
cannot be omitted in this case.
The optional * parameter: Specifying this last parameter tells 4D to first check whether or not
a process with the name you passed in name is already running. If it is, 4D does not start a
new process and returns the process number of the process with that name.
Example
Given the following project method:
` ADD CUSTOMERS
MENU BAR (1)
Repeat
ADD RECORD([Customers];*)
Until (OK=0)
If you attach this project method to a custom menu item in the Design environment Menu
Bar Editor window whose Start a New Process property is set, 4D will automatically start a
new process running that method. The call MENU BAR(1) adds a menu bar to the new process.
In the absence of any window (that you could open with Open window), the call to ADD
RECORD will automatically open one.
The button does the same thing as the custom menu item.
While choosing the menu item or clicking the button, if you want to start the process (if it
does not exist) or bring it to the front (if it is already running), you can create the method
START ADD CUSTOMERS:
In the Menu Bar editor, you replace the method ADD CUSTOMERS with the method START
ADD CUSTOMERS, and you deselect the Start a New Process property for the menu item.
See Also
Execute on server, Methods, Processes, Project Methods, Variables.
Execute on server (procedure; stack{; name{; param{; param2; ...; paramN}{; *}}}) → Number
Description
The Execute on server command starts a new process on the Server machine (if it is called in
Client/Server) or on the same machine (if it is called in single-user) and returns the process
number for that process.
You use Execute on server to start a stored procedure. For more information about stored
procedures, see the section Stored Procedures in the 4D Server Reference manual.
If you call Execute on server on a Client machine, the command returns a negative process
number. If you call Execute on server on the Server machine, Execute on server returns a
positive process number. Note that calling New process on the Server machine does the same
thing as calling Execute on server.
If the process could not be created (for example, if there is not enough memory), Execute on
server returns zero (0) and an error is generated. You can catch this error using an error-
handling method installed using ON ERR CALL.
Process Method: In method, you pass the name of the process method for the new process.
After 4D has set up the context for the new process, it starts executing this method, which
therefore becomes the process method.
Note: The stack is NOT the total memory for the process. Processes share memory for records,
interprocess variables, and so on. A process also uses extra memory for storing its process
variables. The stack only holds local variables, method calls, parameters in subroutines and
stacked records.
Process Name: You pass the name of the new process in name. In single-user, this name will
appear in the Process List window of the Design environment, and will be returned by the
command PROCESS PROPERTIES when applied to this new process. In Client/Server, this name
will appear in blue in the Stored Procedure list of the 4D Server main window.
A process name can be up to 31 characters long. You can omit this parameter; if you do so, the
name of the process will be the empty string.
Warning: Contrary to New Process, do not attempt to make a process local in scope by
prefixing its name with the dollar sign ($) while using Execute on server. This will work in
single-user, because Execute on server acts as New Process in this environment. On the other
hand, in Client/Server, this will generate an error.
Parameter to Process Method: Starting with version 6, you can pass parameters to the process
method. You can pass parameters in the same way as you would pass them to a subroutine.
However, there is a restriction—you cannot pass pointer expressions. Also, remember that
arrays cannot be passed as parameters to a method. Upon starting execution in the context of
the new process, the process method receives the parameters values in $1, $2, etc.
Note: If you pass parameters to the process method, you must pass the name parameter; it
cannot be omitted in this case.
The optional * parameter: Specifying this last parameter tells 4D to first check whether or not
a process with the name you passed in name is already running. If it is, 4D does not start a
new process and returns the process number of the process with that name.
With the regular import data, 4D Client performs the parsing of the text file, then, for each
record, create a new record, fills out the fields with the imported data and sends the record to
the Server machine so it can be added to the database. There are consequently many requests
going over the network. A way to optimize the operation is to use a stored procedure to do the
job locally on the Server machine. The Client machine loads the document into a BLOB, start
a stored procedure passing the BLOB as parameter. The stored procedure stores the BLOB into
a document on the server machine disk, then imports the document locally. The import data
is therefore performed locally at a single-user version-like speed because most the network
requests have been eliminated. Here is the CLIENT IMPORT project method. Executed on the
Client machine, it starts the SERVER IMPORT stored procedure listed just below:
` CLIENT IMPORT Project Method
` CLIENT IMPORT ( Pointer ; String )
` CLIENT IMPORT ( -> [Table] ; Input form )
C_POINTER($1)
C_STRING(31;$2)
C_TIME($vhDocRef)
C_BLOB($vxData)
C_LONGINT(spErrCode)
C_LONGINT($1)
C_STRING(31;$2)
C_BLOB($3)
C_LONGINT(spErrCode)
Once these two project methods have been implemented in a database, you can perform a
“Stored Procedure-based” import data by, for instance, writing:
With some benchmarks you will discover that using this method you can import records up to
60 times faster than the regular import.
See Also
New process, Stored Procedures.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
DELAY PROCESS delays the execution of a process for a number of ticks (1 tick = 1/60th of a
second). During this period, process does not take any processing time. Even though the
execution of a process may be delayed, it is still in memory.
If the process is already delayed, this command delays it again. The parameter duration is not
added to the time remaining, but replaces it. Therefore pass zero (0) for duration if you no
longer want to delay a process.
Warning: DELAY PROCESS has no effect on the Kernel processes (all environments), including
the User/Custom Menus process.
Tip: To “delay” the User/Custom Menus process, write a small “waiting” subroutine that loops
measuring the elasped time using Current time, or Tickcount or Milliseconds). For example, if
you want to display, for a given time period, a message in a window that you open and close
for this purpose.
Note: You cannot use this command to assign a stored procedure on the server machine from
a client machine (process<0).
Examples
1. See example in Record Locking.
2. See example for the command Process number.
See Also
HIDE PROCESS, PAUSE PROCESS.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
PAUSE PROCESS suspends the execution of process until it is reactivated by the RESUME
PROCESS command. During this period, process does not take any time on your machine.
Even though a process may be paused, the process is still in memory.
If process is already paused, PAUSE PROCESS does nothing. If the process has been delayed
using the DELAY PROCESS command, the process is paused. RESUME PROCESS resumes the
process immediately.
While process execution is suspended, the windows belonging to this process are not
enterable. In this case, to avoid confusing the user, consider hiding the process. If process does
not exist, the command does nothing.
Warning: Use PAUSE PROCESS only in processes that you have started. PAUSE PROCESS will not
affect the original User/Custom Menus process.
Note: You cannot use this command to assign a stored procedure on the server machine from
a client machine (process<0).
See Also
DELAY PROCESS, HIDE PROCESS, RESUME PROCESS.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
RESUME PROCESS resumes a process whose execution has been paused or delayed. If process is
not paused or delayed, RESUME PROCESS does nothing.
If process has been delayed before, see the PAUSE PROCESS or DELAY PROCESS commands. If
process does not exist, the command does nothing.
Note: You cannot use this command to assign a stored procedure on the server machine from
a client machine (process<0).
See Also
DELAY PROCESS, PAUSE PROCESS.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Process aborted command returns True if the process in which it is called is about to be
interrupted unexpectedly, which means that the execution of the command was unable to
reach its “normal” completion. For example, this can occur after calling QUIT 4D.
Example
This command can be used as a particular type of programming on the Web server, only in
compiled mode. When you use a method to send Web pages by using a loop like While...End
while (see example), the mechanism of the Web server doesn’t allow you to stop the loop in
case of a timeout (end of the inactivity period authorized) on a Web browser. If the Web
process is not closed, a context is therefore still in use.
The Process aborted command, placed in the initial test of the loop, will return True in case of
a timeout. The loop can then be interrupted and the process can be aborted.
Here is a method that can be used to send HTML pages. In compiled mode, this loop cannot
be interrupted in case of a timeout:
While (True)
SEND HTML FILE (HTMLFile)
End while
The Process aborted command allows you to use the same type of method, while still being
able to exit the loop and abort the Web process in case of a timeout:
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Current process returns the process reference number of the process within which this
command is called.
Example
See the examples for DELAY PROCESS and PROCESS PROPERTIES.
See Also
Process number, PROCESS PROPERTIES, Process state.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Process state command returns the state of the process whose number you pass in process.
The function result can be one of the values provided by the following predefined constants:
If the process does not exist (which means you did not pass a number in the range 1 to Count
tasks), Process state returns Does not exist (-100).
Example
The following example puts the name and process reference number for each process into the
asProcName and aiProcNum arrays. The method checks to see if the process has been aborted.
In this case, the process name and number are not added to the arrays:
$vlNbTasks:=Count tasks
ARRAY STRING(31;asProcName; $vlNbTasks)
ARRAY INTEGER(aiProcNum; $vlNbTasks)
$vlActualCount:=0
See Also
Count tasks, PROCESS PROPERTIES.
Description
The PROCESS PROPERTIES command returns information about the process whose process
number you pass in process.
• procState returns the state of the process at the moment of the call. This parameter can
return one of the values provided by the following predefined constants:
• procTime returns the cumulative time that the process has used since it started, in ticks
(1/60th of a second) .
• uniqueID, if specified, returns the unique process number. Actually, starting with 4D version
6.5, each process has attributed a process number to it as well as a unique process number per
session. The unique number allows you to differentiate between two processes or two process
sessions. It corresponds to the process number having been started during 4th Dimension’s
session.
• origin, if specified, returns a value that describes the origin of the process. 4th Dimension
offers the following predefined constants (in the "Process Type" theme):
Note: 4D’s internal processes return a negative value and the processes generated by the user
return a positive value.
If the process does not exist, which means you did not pass a number in the range 1 to Count
tasks, PROCESS PROPERTIES leaves the variable parameters unchanged.
See Also
Count tasks, Process state.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Process number returns the number of the process whose name you pass in name. If no process
is found, Process number returns 0.
The optional parameter * allows you to retrieve, from 4D Client, the process ID of a process
that is executed on the server (a stored procedure). In this case, the returned value is negative.
This option is especially useful when using the GET PROCESS VARIABLE and SET PROCESS
VARIABLE commands. Please refer to the descriptions of these commands for details.
If the command is executed with the * parameter from a process on the server machine, the
returned value is positive.
Example
You create a custom floating window, run in a separate process, in which you implement your
own tools to interact with the Design environment. For example, when selecting an item in a
hierarchical list of keywords, you want to paste some text into the frontmost window of the
Design environment. To do so, you can use the clipboard, but the pasting event must occur
within the Design process. The following small function returns the process number of the
Design process (if running):
Using this function, the following project method pastes the text received as parameter to the
frontmost window of the Design environment (if applicable):
C_TEXT($1)
C_LONGINT($vlDesignPID;$vlCount)
See Also
GET PROCESS VARIABLE, PROCESS PROPERTIES, Process state, SET PROCESS VARIABLE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Count users function returns the number of users connected to the database. If the server
executes any stored procedure(s), Count users returns the number of users + 1.
See Also
Count tasks, Count user processes.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Count tasks returns the number of processes open in 4D Client, 4D Server (stored procedures)
or in single-user 4th Dimension.
This number takes into account all processes, even those that are automatically managed by
4th Dimension. These include the User/Custom Menus process, Design process, Cache
Manager process, Indexing process, and Web Server process.
The number returned by Count tasks also takes into account processes that have been aborted.
Example
See the example for Process state and On Exit Database Method.
See Also
Count user processes, Count users, PROCESS PROPERTIES, Process state.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Count user processes function returns the number of open processes, except those
processes that are managed automatically by 4th Dimension.
The User/Custom Menus process, the Design process and the Web server process are
considered to be user processes since they can be closed by users. Therefore, these processes
will be counted when determining the number of user processes.
See Also
Count tasks, Count users.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The EXECUTE ON CLIENT command forces the execution of the methodName method, with the
parameters param1... paramN, if necessary, on the registered 4D Client whose name is
clientName. 4D Client’s registered name is defined by the REGISTER CLIENT command.
This command can be called from a 4D Client or a stored method from 4D Server.
If the method requires one or more parameters, pass them after the name of the method.
The execution of the method on 4D Client is done in a process automatically created on the
client workstation, and its name will be the 4D Client’s registered name.
If this command is called many times in a row on the same 4D Client, the execution orders
will be stacked. Therefore, the methods will be treated one after another in asynchronous
mode. The more methods that are stacked, the bigger the workload is for the 4D Client. You
can know the state of the workload of each client by using the GET REGISTERED CLIENTS
command.
Note: The stacking of the execution orders cannot be modified or stopped unless 4D Client is
unregistered by using the UNREGISTER CLIENT command.
You can simultaneously execute the same method on many or all of the registered 4D Clients.
To do so, use the wildcard character (@) in the clientName parameter.
The OK system variable is equal to 1 if 4D Server has correctly received the execution request
of a method; however, this does not guarantee that the method has been properly executed by
4D Client.
EXECUTE ON CLIENT("Client1";"GenerateNums";12;$a;"Text")
EXECUTE ON CLIENT("@";"EmptyTemp")
See Also
GET REGISTERED CLIENTS, REGISTER CLIENT, UNREGISTER CLIENT.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The REGISTER CLIENT command “registers” a 4D Client station with the name specified in
clientName on 4D Server, so as to allow other clients or eventually 4D Server (by using stored
methods) to execute methods on it by using the EXECUTE ON CLIENT command. Once it is
registered, a 4D Client can then execute one or more methods for other clients.
Note: You can also automatically register each client station that connects to 4D Server by
using the “Register Clients at Startup...” option in the Preferences dialog box.
When this command is executed, a process, named clientName, is created on the client station.
This process can only be aborted by the UNREGISTER CLIENT command.
If you pass the optional * parameter, the created process is local. 4D will automatically add the
dollar sign ($) at the beginning of the process name. Otherwise, the process is global.
After executing the command, the client station will periodically ask 4D Server to see if
another 4D Client or the server itself is calling it.
By default, this interrogation is done every two seconds. You can modify this time period by
modifying period. The minimum value is one second.
Note: If this command is used with a single-user version of 4th Dimension, it has no effect.
Once the command is executed, it is not possible to modify 4D Client’s name or the server’s
interrogation period on the fly. To do so, you must call the UNREGISTER CLIENT command,
then the REGISTER CLIENT command.
Note: More than one 4D Client can have the same registered name.
2. The following instruction allows you to get a list of the registered 4D Clients. It can be
placed in the On Startup Database Method:
3. The method 4D Client List allows you to recuperate all the registered 4D Clients and those
that can receive messages:
C_TEXT($1)
ALERT($1)
6. Finally, this method allows a client station to no longer be visible by the other 4D Clients
and to no longer receive messages:
UNREGISTER CLIENT
See Also
EXECUTE ON CLIENT, GET REGISTERED CLIENTS, UNREGISTER CLIENT.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
UNREGISTER CLIENT
Description
The UNREGISTER CLIENT command “unregisters” a 4D Client station. The client must have
already been registered by the REGISTER CLIENT command.
Note: A 4D Client is automatically unregistered when the user quits the application.
If the client workstation was not previously registered or if the command was executed on a
single-user 4th Dimension, the command has no effect.
If the client is correctly unregistered, the OK system variable is equal to 1. If the client wasn’t
registered, OK is equal to 0.
Example
Refer to the example for the REGISTER CLIENT command.
See Also
EXECUTE ON CLIENT, GET REGISTERED CLIENTS, REGISTER CLIENT.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET REGISTERED CLIENTS command fills two arrays:
• clientLists contains the list of clients who were “registered” by using the REGISTER CLIENT
command.
• methods supplies the list of each client’s “workload”. The workload is the number of
methods that a 4D Client must still execute by calling the EXECUTE ON CLIENT command (for
more information, please refer to the description of the EXECUTE ON CLIENT command).
Examples
1. Let’s assume that you want to obtain a list of all the registered clients and the methods that
remain to be executed:
ARRAY TEXT($clients;0)
ARRAY LONGINT($methods;0)
GET REGISTERED CLIENTS($clients;$methods)
See Also
EXECUTE ON CLIENT, REGISTER CLIENT, UNREGISTER CLIENT.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
QUERY BY EXAMPLE performs the same action as the Query by Example menu command in the
User environment. It displays the current input form as a query window. QUERY BY EXAMPLE
queries table for the data that the user enters into the query window. The form must contain
the fields that you want the user to be able to query. The query is optimized; indexed fields are
automatically used to optimize the query.
See the 4th Dimension User Reference for information about using the Query by Example menu
command in the User environment.
Example
The method in this example displays the MyQuery form to the user. If the user accepts the
form and performs the query (that is, if the OK system variable is set to 1), the records that
meet the query criteria are displayed:
See Also
ORDER BY, QUERY.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
QUERY looks for records matching the criteria specified in queryArgument and returns a
selection of records for table. QUERY changes the current selection of table for the current
process and makes the first record of the new selection the current record.
If the table parameter is omitted, the command applies to the default table. If no default table
has been set, an error occurs.
If you do not specify queryArgument or the * parameters, QUERY displays the Query editor for
table (except when it is the last row of a multiple query, see example 2). The User environment
Query editor is shown here:
The user builds the query, then clicks the Query button or chooses Query in selection to
perform the query. If the query is performed without interruption, the OK variable is set to 1.
If the user clicks Cancel, the QUERY terminates with no query actually performed, and sets the
OK variable to 0 (zero).
Examples
1. The following line displays the Query editor for the [Products] table:
QUERY([Products])
2. The following line displays the Query editor for the default table (if it has been set)
QUERY
If you specify the queryArgument parameter, the standard Query editor is not presented and
the query is defined programmatically. For simple queries (search on only one field) you call
QUERY once with queryArgument. For multiple queries (search on multiple fields or with
multiple conditions), you call QUERY as many times as necessary with queryArgument, and you
specify the optional * parameter, except for the last QUERY call, which starts the actual query
operation. The queryArgument parameter is described further in this section.
Examples
3. The following line looks for the [People] whose name starts with an “a”:
QUERY([People];[People]Last name="a@")
4. The following line looks for the [People] whose name starts with “a” or “b”:
Note: The interpretation of @ characters in queries can be modified via an option in the
Preferences. For more information, please refer to the Comparison Operators section.
• The conjunction is used to join QUERY calls when defining multiple queries. The
conjunctions available are the same as those in the User environment Query editor:
The conjunction is optional and not used for the first QUERY call of a multiple query, or if the
query is a simple query.
• The field is the field to query. The field may belong to another table if it belongs to a One
table related to table with an automatic relation. The table to which QUERY is applied must be
the Many table.
• The comparator is the comparison that is made between field and value. The comparator is
one of the symbols shown here:
• The value is the data against which field will be compared. The value can be any expression
that evaluates to the same data type as field. The value is evaluated once, at the beginning of
the query. The value is not evaluated for each record. To query for a string contained in a
string (a “contains” query), use the wildcard symbol (@) in value.
Note: Each table maintains its own current built query. This means that you can create
multiple built queries simultaneously, one for each table. You must use the table parameter or
set the default table to specify which table to use.
• If any indexed fields are specified, the query is optimized every time that it is possible
(indexed fields are searched first) resulting in a query that takes the least amount of time
possible.
Examples
5. The following command finds the records for all the people named Smith:
QUERY([People];[People]Last Name="Smith")
Note: If the Last Name field were indexed, the QUERY command would automatically use the
index for a fast query.
Reminder: This query will find records like “Smith”, “smith”,“SMITH”, etc. To distinguish
lowercase from uppercase, perform additional queries using the ASCII codes.
QUERY ([People]; [People]Last Name = "smith"; *) ` Find every person named Smith
QUERY ([People]; &; [People]First Name = "john") ` with John as first name
When the query is performed, it quickly does an indexed search on Last Name and reduces the
selection of records to those of people named Smith. The query then sequentially searches on
First Name in this selection of records.
7. The following example finds the records of people named Smith or Jones. The Last Name
field is indexed.
The QUERY command uses the Last Name index for both queries. The two queries are
performed, and their results put into internal sets that are eventually combined using a union.
8. The following example finds the records for people who do not have a company name. It
does this by finding entries with empty fields (the empty string).
9. The following example finds the record for every person whose last name is Smith and who
works for a company based in New York. The second query uses a field from another table.
This query can be done because the [People] table is related to the [Company] table with a
many to one relation:
QUERY ([People]; [People]Last Name = "smith"; *) ` Find every person named Smith…
QUERY ([People]; & ; [Company]State = "NY") ` ... who works for a company based in NY
10. The following example finds the record for every person whose name falls between A
(included) and M (included):
11. The following example finds the records for all the people living in the San Francisco or
Los Angeles areas (ZIP codes beginning with 94 or 90):
QUERY ([People]; [People]ZIP Code = "94@"; *) ` Find every person in the SF…
QUERY ([People]; | ; [People]ZIP Code = "90@") ` ...or Los Angeles areas
13. The following example finds the record that matches the invoice reference entered in the
request dialog box:
14. The following example finds the records for the invoices entered in 1996. It does this by
finding all records entered after 12/31/95 and before 1/1/97:
QUERY ([Invoice]; [Invoice]In Date > !12/31/95!; *) ` Find invoices after 12/31/95…
QUERY ([Invoice]; &; [Invoice]In Date < !1/1/97!) ` and before 1/1/97
15. The following example finds the record for each employee whose salary is between
$10,000 and $50,000. The query includes the employees who make $10,000, but excludes
those who make $50,000:
16. The following example finds the records for the employees in the marketing department
who have salaries over $20,000. The Salary field is queried first because it is indexed. Notice
that the second query uses a field from another table. It can do this because the [Dept] table is
related to the [Employee] table with an automatic many to one relation. Although the
[Dept]Name field is indexed, this is not an indexed query because the relation must be
activated sequentially for each record in the [Employee] table:
QUERY ([Laws]; [Laws]Text = myVar) ` Find all laws that match myVar
The query could have many different results, depending on the value of myVar. The query will
also be performed differently. For example:
• If myVar equals "Copyright@", the selection contains all laws with texts beginning with
Copyright.
• If myVar equals "@Copyright@", the selection contains all laws with texts containing at least
one occurrence of Copyright.
18. The following example adds or does not add lines to a complex query depending on the
value of the variables. This way, only valid criteria are taken into account for the query:
QUERY([Invoice];[Invoice]Paid=False;*)
If($city#"") ` if a city name has been specified
QUERY([Invoice];[Invoice]Delivery_city=$city;*)
End if
If($zipcode#"") ` If a zip code has been specified
QUERY([Invoice];[Invoice]ZipCode=$zipcode;*)
End if
QUERY([Invoice]) ` Execution of query on the criteria
19. This example illustrates the use of a comparison operator as an alphanumeric expression.
The value of the comparison operator is specified using a pop-up menu placed in a custom
query dialog box:
C_TEXT($oper)
$oper:=_popup_operator{_popup_operator} `$oper equals for example "#" or "="
If(OK =1)
QUERY(Invoice];[Invoice]Amount;$oper;$amount)
End if
See Also
Operators, QUERY SELECTION.
Description
QUERY SELECTION looks for records in table. QUERY SELECTION command changes the current
selection of table for the current process and makes the first record of the new selection the
current record.
QUERY SELECTION works and performs the same actions as QUERY. The difference between the
two commands is the scope of the query:
• QUERY looks for records among all the records in the table.
• QUERY SELECTION looks for records among the records currently selected in the table.
Note: The command SET DATABASE PARAMETER allows you to choose whether QUERY
SELECTION should use the index, depending on the number of selected records.
Example
This example illustrates the difference between QUERY and QUERY SELECTION. Here are two
queries:
QUERY SELECTION looks only among the selected records, therefore, in this example, among
the companies located in New York City.
See Also
QUERY, SET DATABASE PARAMETER.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
QUERY BY FORMULA looks for records in table. QUERY BY FORMULA changes the current
selection of table for the current process and makes the first record of the new selection the
current record.
QUERY BY FORMULA and QUERY SELECTION BY FORMULA work exactly the same way, except
that QUERY BY FORMULA queries every record in the entire table and QUERY SELECTION BY
FORMULA queries only the records in the current selection.
Both commands apply queryFormula to each record in the table or selection. The queryFormula
is a Boolean expression that must evaluate to either TRUE or FALSE. If queryFormula evaluates
as TRUE, the record is included in the new selection.
The queryFormula may be simple, perhaps comparing a field to a value; or it may be complex,
perhaps performing a calculation or even evaluating information in a related table. The
queryFormula can be a 4th Dimension function (command), or a function (method) or
expression you have created. You can use wildcards in queryFormula when working with Alpha
or text fields.
When the query is complete, the first record of the new selection is loaded from disk and
made the current record.
These commands always perform a sequential search, not an indexed search. QUERY BY
FORMULA and QUERY SELECTION BY FORMULA are slower than QUERY when used on indexed
fields. The query time is proportional to the number of records in the table or selection.
Examples
1. This example finds the records for all invoices that were entered in December of any year. It
does this by applying the Month of function to each record. This query could not be
performed any other way without creating a separate field for the month:
2. This example finds records for all the people who have names with more than ten
characters:
See Also
QUERY, QUERY SELECTION, QUERY SELECTION BY FORMULA.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
QUERY SELECTION BY FORMULA looks for records in table. QUERY SELECTION BY FORMULA
changes the current selection of table for the current process and makes the first record of the
new selection the current record.
QUERY SELECTION BY FORMULA performs the same actions as QUERY BY FORMULA. The
difference between the two commands is the scope of the query:
• QUERY BY FORMULA looks for records among all the records in the table.
• QUERY SELECTION BY FORMULA looks for records among the records currently selected in the
table.
For more information, see the description of the command QUERY BY FORMULA.
See Also
QUERY, QUERY BY FORMULA, QUERY SELECTION.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QUERY WITH ARRAY command searches all the records for which the value of indexedField
is equal, at least, to one of the values of the elements in array. The records found will become
the new current selection.
This command allows you to quickly and simply build a search on multiple values.
Notes:
• This command only works with indexed fields. It cannot be used with fields of type Text,
Picture, Subfield, or BLOB.
• indexedField and array must be of the same data type. Exception: you can use a Longint array
with a field of the Time type.
Example
The following example allows you to retrieve the records of both French and American clients:
Description
SET QUERY DESTINATION enables you to tell 4th Dimension where to put the result of any
subsequent query for the current process.
You specify the type of the destination in the parameter destinationType. 4th Dimension
provides the following predefined constants:
You specify the destination of the query itself in the optional destinationObject parameter
according to the following table:
destinationType destinationObject
parameter parameter
0 (current selection) You omit the parameter
1 (set) You pass the name of a set (existing or to be created)
2 (named selection) You pass the named of a named selection (existing or to be created)
3 (variable) You pass a numeric variable (existing or to be created)
The records found by any subsequent query will end up in the set "mySet". The current
selection and the current record for the table involved by the query are left unchanged.
Note: In client/server, you cannot use local/client sets (name preceeded by $ symbol) as a
query destination. This type of set is created on client machines when queries are executed on
the server. For more information on these types of sets, refer to the Sets section.
• With:
SET QUERY DESTINATION(Into named selection;"myNamedSel")
The records found by any subsequent query will end up in the named selection "myNamedSel".
The current selection and the current record for the table involved by the query are left
unchanged.
Note: If the named selection does not exist beforehand, it will be created automatically at the
end of the query.
• With:
SET QUERY DESTINATION(Into variable;$vlResult)
The number of records found by any subsequent query will end up in the variable $vlResult.
The current selection and the current record for the table involved by the query are left
unchanged.
Warning: SET QUERY DESTINATION affects all subsequent queries made within the current
process. REMEMBER to always counterbalance a call to SET QUERY DESTINATION (where
destinationType#0) with a call to SET QUERY DESTINATION(0) in order to restore normal query
mode.
On the other hand, SET QUERY DESTINATION does not affect other commands that may
change the current selection of a table such as ALL RECORDS, RELATE MANY and so on.
Examples
1. You create a form that will display the records from a [Phone Book] table. You create a Tab
Control named asRolodex (with the 26 letters of the alphabet) and a subform displaying the
[Phone Book] records. Choosing one Tab from the Tab Control displays the records whose
names start with the corresponding letter.
In your application, the [Phone Book] table contains a set of quite static data, so you do not
want to (or need to) perform a query each time you select a Tab. In this way, you can save
precious database engine time.
To do so, you can redirect your queries into named selections that you reuse as needed. You
write the object method of the Tab Control asRolodex as follows:
2. The Unique values project method in this example allows you to verify the uniqueness of the
values for any number of fields in a table. The current record can be an existing or a newly
created record.
` Unique values project method
` Unique values ( Pointer ; Pointer { ; Pointer... } ) -> Boolean
` Unique values ( ->Table ; ->Field { ; ->Field2... } ) -> Yes or No
C_BOOLEAN($0;$2)
C_POINTER(${1})
C_LONGINT($vlField;$vlNbFields;$vlFound;$vlCurrentRecord)
After this project method is implemented in your application, you can write:
` ...
If (Unique values (->[Contacts];->[Contacts]Company);->[Contacts]Last name;->
[Contacts]First name)
` Do appropriate actions for that record which has unique values
Else
ALERT("There is already a Contact with this name for this Company.")
End if
` ...
See Also
QUERY, QUERY BY EXAMPLE, QUERY BY FORMULA, QUERY SELECTION, QUERY SELECTION BY
FORMULA, QUERY WITH ARRAY, SET QUERY LIMIT.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SET QUERY LIMIT allows you to tell 4th Dimension to stop any subsequent query for the
current process as soon as at least the number of records you pass in limit has been found.
For example, if you pass limit equal to 1, any subsequent query will stop browsing an index or
the data file as soon as one record that matches the query conditions has been found.
To restore queries with no limit, call SET QUERY LIMIT again with limit equal to 0.
Warning: SET QUERY LIMIT affects all the subsequent queries made within the current process.
REMEMBER to always counterbalance a call to SET QUERY LIMIT(limit) (where limit>0) with a
call to SET QUERY LIMIT(0) in order to restore queries with no limit.
On the other hand, SET QUERY LIMIT does not affect the other commands that may change the
current selection of a table, such as ALL RECORDS, RELATE MANY, and so on.
2. See the second example for the command SET QUERY DESTINATION.
See Also
QUERY, QUERY BY EXAMPLE, QUERY BY FORMULA, QUERY SELECTION, QUERY SELECTION BY
FORMULA, QUERY WITH ARRAY, SET QUERY DESTINATION.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Find index key command returns the number of the first record whose indexedField field is
equal to value.
If no records are found, Find index key returns -1.
After calling this command, value contains the value found. This feature allows you to execute
searches using the wildcard character (“@”) on Alpha fields and then retrieve the value found.
This command doesn’t modify the current selection or the current record.
It is fast because it only uses the index, and is particularly useful to avoid creating double
entries during data entry.
Example
In an audio CD database, during data entry let’s assume that you want to verify the singer’s
name to see if it already exists in the database. Because homonyms can exist, you don’t want
the [Singer]Name field to be unique. Therefore, in the input form, you can write the following
code in the [Singer]Name field’s object method:
If (Form event=On Data Change)
$RecNum:=Find index key([Singer]Name;[Singer]Name)
If ($RecNum # -1) ` If this name has already been entered
CONFIRM("A singer with the same already exists. Do you want to see the record?";
"Yes";"No")
If (OK=1)
GOTO RECORD([Singer];$RecNum)
End if
End if
End if
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
ORDER BY ({table}{; field{; > or <{; field2; > or <2; ...; fieldN; > or <N}{; *}}})
Description
ORDER BY sorts (reorders) the records of the current selection of table for the current process.
After the sort has been completed, the new first record of the selection becomes the current
record.
If you omit the table parameter, the command applies to the default table. If no default table
has been set, an error occurs.
If you do not specify the field, the > or < or the * parameters, ORDER BY displays the Order By
editor for table. The User environment's Order By editor is shown here:
The user builds the sort, then clicks the Sort button to perform the sort. If the sort is
performed without interruption, the OK variable is set to 1. If the user clicks Cancel, the
ORDER BY terminates with no sort actually performed, and sets the OK variable to 0 (zero).
Examples
1. The following line displays the Order By editor for the [Products] table:
ORDER BY([Products])
2. The following line displays the Order By editor for the default table (if it has been set):
ORDER BY
If you specify the field and > or < parameters, the standard Order By editor is not presented and
the sort is defined programmatically. You can sort the selection on one level or on several
levels. For each sort level, you specify a field in field and the sorting order in > or <. If you pass
the “greater than” symbol (>), the order is ascending. If you pass the “less than” symbol (<),
the order is descending.
Examples
3. The following line orders the selection of [Products] by name in ascending order:
ORDER BY([Products];[Products]Name;>)
4. The following line orders the selection of [Products] by name in descending order:
ORDER BY([Products];[Products]Name;<)
5. The following line orders the selection of [Products] by type and price in ascending order for
both levels:
ORDER BY([Products];[Products]Type;>;[Products]Price;>)
6. The following line orders the selection of [Products] by type and price in descending order
for both levels:
ORDER BY([Products];[Products]Type;<;[Products]Price;<)
ORDER BY([Products];[Products]Type;>;[Products]Price;<)
8. The following line orders the selection of [Products] by type in descending order and by
price in ascending order:
ORDER BY([Products];[Products]Type;<;[Products]Price;>)
If you omit the sorting order parameter > or <, ascending order is the default.
Example
9. The following line orders the selection of [Products] by name in ascending order:
ORDER BY([Products];[Products]Name)
If only one field is specified (one level sort) and it is indexed, the index is used for the order. If
the field is not indexed or if there is more than one field, the order is performed sequentially.
The field may belong to the (selection’s) table being reordered or to a One table related to table
with an automatic relation. (Remember, the table to which ORDER BY is applied must be the
Many table.) In this case, the sort is always sequential.
Examples
10. The following line performs an indexed sort if [Products]Name is indexed:
ORDER BY([Products];[Products]Name;>)
11. The following line performs a sequential sort, whether or not the fields are indexed:
ORDER BY([Products];[Products]Type;>;[Products]Price;>)
12. The following line performs a sequential sort using a related field:
Example
13. In an Output form displayed in Custom menus environment, you allow the users to order
a column in ascending order by simply clicking in the column header.
If the user holds the Shift key down while clicking in other column headers, the sort is
performed on several levels:
Each column header contains a highlight button attached with the following object method:
Each button calls the MULTILEVEL project method with a pointer to the corresponding
column field. The MULTILEVEL project method is the following:
No matter what way a sort has been defined, if the actual sort operation is going to take some
time to be performed, 4th Dimension automatically displays a message containing a progress
thermometer. These messages can be turned on and off by using the commands MESSAGES ON
and MESSAGES OFF. If the progress thermometer is displayed, the user can click the Stop
button to interrupt the sort. If the sort is completed, OK is set to 1. Otherwise, if the sort is
interrupted, OK is set to 0 (zero).
See Also
ORDER BY FORMULA.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
ORDER BY FORMULA (table{; expression{; > or <}}{; expression2; > or <2; ...; expressionN; > or <N})
Description
ORDER BY FORMULA sorts (reorders) the records of the current selection of table for the current
process. After the sort has been completed, the new first record of the selection becomes the
current record.
Note that you must specify table. You cannot use a default table.
You can sort the selection on one level or on several levels. For each sort level, you specify a
expression in expression and the sorting order in > or <. If you pass the “greater than” symbol
(>), the order is ascending. If you pass the “less than” symbol (<), the order is descending. If
you do not specify the sorting order, ascending order is the default.
The parameter expression can be of type Alphanumeric, Real, Integer, Long Integer, Date, Time
or Boolean.
No matter what way a sort has been defined, if the actual sort operation is going to take some
time to be performed, 4th Dimension automatically displays a message containing a progress
thermometer. These messages can be turned on and off by using the commands MESSAGES ON
and MESSAGES OFF. If the progress thermometer is displayed, the user can click the Stop
button to interrupt the sort. If the sort is completed, OK is set to 1. Otherwise, if the sort is
interrupted, OK is set to 0 (zero).
Example
This example orders the records of the [People] table in descending order, based on the length
of each person’s last name. The record for the person with the longest last name will be first in
the current selection:
See Also
ORDER BY.
Description
QR REPORT prints a report for table, created with the Quick Report editor shown here.
Notes:
• The editor does not appear if the table has been declared “Invisible.”
• When the editor is called using the QR REPORT command, the All relations in automatic
option that is used to modify the automatic/manual status of the relations is hidden. This
allows the developer to manage this status himself using the SET AUTOMATIC RELATIONS and
SET FIELD RELATION command.
• document (string)
The document parameter is a report document that was created with the Quick Report editor
and saved on disk. The document stores the specifications of the report, not the records to be
printed.
If an empty string ("") is specified for document, QR REPORT displays an Open File dialog box
and the user can select the report to print.
If the document parameter specifies a document that does not exist (for example, pass Char(1)
in document), the Quick Report editor is displayed.
• hierarchical (Boolean)
The hierarchical parameter defines whether the related Many tables are displayed in the field
selection list. By default, this value is set to 0 (no display for related Many tables).
• wizard (Boolean)
This parameter indicates whether the Open Wizard button is going to be displayed in the
Quick Report editor, therefore either allowing or disallowing access to the wizard. By default,
this value is set to False (no access to the wizard).
• search (Boolean)
This parameter indicates whether the New Query button and the Master table drop-down
menu are going to be displayed in the Quick Report editor, therefore either allowing or
disallowing modification of the current table and current master table. By default, this value is
set to False (no access to the search tools and master table).
After a report is selected, the dialog boxes for printing are displayed, unless the * parameter is
specified. If this parameter is specified, these dialog boxes are not displayed. The report is then
printed.
If the Quick Report editor is not involved, the OK variable is set to 1 if a report is printed;
otherwise, it is set to 0 (zero) (i.e., if the user clicked Cancel in the printing dialog boxes).
Examples
1. The following example lets the user query the [People] table, and then automatically prints
the report “Detailed Listing”:
QUERY ([People])
If (OK=1)
QR REPORT ([People];"Detailed Listing";False;False;False;*)
End if
2. The following example lets the user query the [People] table, and then lets the user choose
which report to print:
QUERY ([People])
If (OK=1)
QR REPORT ([People];"";False;False;False)
End if
3. The following example lets the user query the [People] table, and then displays the Quick
Report editor so the user can design, save, load and print any reports with or without the
wizard:
QUERY ([People])
If (OK=1)
QR REPORT ([People];Char(1);False;True)
End if
See Also
PRINT LABEL, PRINT SELECTION, SET ALLOWED METHODS.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR REPORT TO BLOB command places the report whose reference was passed in area in a
BLOB (variable or field).
If you pass an invalid area number, the error -9850 will be generated.
Example
The following statement assigns the Quick Report stored in MyArea into a BLOB Field.
See Also
QR BLOB TO REPORT.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR BLOB TO REPORT command places the report contained in blob in the Quick Report
area passed in area.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid blob parameter, the error -9852 will be generated.
Examples
1. The following code allows you to display, in MyArea, a report file named “report.4qr”
located next to the database structure. The report file does not have to be created with 4th
Dimension 2003; it can originate from previous versions:
C_BLOB($doc)
C_LONGINT (MyArea)
DOCUMENT TO BLOB("report.4qr";$doc)
QR BLOB TO REPORT(MyArea;$doc)
2. The following statement retrieves the Quick Report stored in Field4 and displays it in
MyArea:
See Also
QR REPORT TO BLOB.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR New offscreen area command creates a new Quick Report offscreen area and returns its
reference.
See Also
QR DELETE OFFSCREEN AREA.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR DELETE OFFSCREEN AREA command deletes in memory the Quick Report offscreen area
whose reference was passed as parameter.
If you pass an invalid area number, the error -9850 will be generated.
See Also
QR New offscreen area.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR SET DESTINATION command sets the output type of the report for the area whose
reference was passed in area.
The following table describes the values that can be passed in both type and specifics
parameters:
Text file (2): If you pass an empty string as the file’s pathname, a Save file dialog is displayed,
otherwise the file is saved at the location indicated by the path.
The default field delimiter is the tab character (ASCII 9). The default record delimiter is the
carriage return character (ASCII 13). You can change these defaults by assigning values to the
two delimiter system variables: FldDelimit and RecDelimit. If under Windows, FldDelimit equals
13, a char 10 (line feed) will be appended after the carriage return. Be aware that these
variables are used by other commands such as IMPORT TEXT for example. Changing them for
the Quick Report editor, changes them everywhere in the application.
4D View (3): If 4D View is active for the user, a 4D View external window is created and
populated with the results of the current settings of the Quick Report area.
HTML file(5): An HTML file is created using the template set by QR SET HTML TEMPLATE. For
detailed information on how the translation is performed, please refer to the User Reference
section of the Quick Report Editor documentation.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid destination value, the error -9852 will be generated.
Example
The following code sets the destination as being the text file Mydoc.txt and executes the
Quick Report:
See Also
QR GET DESTINATION.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR GET DESTINATION command retrieves the output type of the report for the area whose
reference was passed in area.
You can compare the value of the type parameter with the constants of the QR Destination
theme.
The following table describes the values that can be retrieved in both type and specifics
parameters:
If you pass an invalid area number, the error -9850 will be generated.
See Also
QR SET DESTINATION.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR SET DOCUMENT PROPERTY command allows you to display the printing dialog or to
define the unit used for the document.
In property, you can pass the following constants, located in the QR Document properties
constant theme:
Constant Value
qr printing dialog 1
qr unit 2
• If property equals 1, the command applies to the display of the print dialog.
- If value equals 1, the print dialog is displayed prior to printing.
- If value equals 0, the print dialog is not displayed prior to printing (default value).
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid property value, the error -9852 will be generated.
See Also
QR Get document property.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR Get document property command allows you to retrieve the display status for the print
dialog box or the unit used for the document that are present in area.
In property, you can use the following constants, located in the QR Document properties
constant theme:
Constant Value
qr printing dialog 1
qr unit 2
• If property equals 1, the command applies to the display of the print dialog box.
- If value equals 1, the print dialog box is displayed prior to printing.
- If value equals 0, the print dialog box is not displayed prior to printing.
The default value is 1.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid property value, the error -9852 will be generated.
See Also
QR SET DOCUMENT PROPERTY.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR SET REPORT KIND command sets the report type for the area whose reference was
passed in area.
You can also use the constants of the QR Report Types theme:
Constant Value
qr list report 1
qr cross report 2
If you set a new type for an existing current report, it removes the previous settings and
creates a new empty report, ready to be set.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid type value, the error -9852 will be generated.
See Also
QR Get report kind.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR Get report kind command retrieves the report type for the area whose reference was
passed in area.
You can also compare the function result with the constants of the QR Report Types theme:
Constant Value
qr list report 1
qr cross report 2
If you pass an invalid area number, the error -9850 will be generated.
See Also
QR SET REPORT KIND.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR SET AREA PROPERTY command allows you to display or hide the interface element
(toolbar or menu bar) whose reference is passed in property.
The menu bar and toolbars are numbered from 1 to 6 (top to bottom) and the value 7 is
dedicated to the contextual menu.
You can use the constants from the QR Area Properties theme to designate the interface item:
Constant Description
qr view menubar (1) Display status of the menu bar (Displayed=1, Hidden=0)
qr view standard toolbar (2) Display status of the Standard toolbar (Displayed=1, Hidden=0)
qr view style toolbar (3) Display status of the Style toolbar (Displayed=1, Hidden=0)
qr view operators toolbar (4) Display status of the Operators toolbar (Displayed=1,
Hidden=0)
qr view color toolbar (5) Display status of the Color toolbar (Displayed=1, Hidden=0)
qr view column toolbar (6) Display status of the Column toolbar (Displayed=1, Hidden=0)
qr view contextual menus (7) Display status of the Contextual menu (Displayed=1, Hidden=0)
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid property parameter, the error -9852 will be generated.
See Also
QR Get area property.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR Get area property command returns 0 if the interface element (toolbar or menu bar)
passed in property is not displayed; otherwise, it returns 1.
The menu bar and toolbars are numbered from 1 to 6 (top to bottom) and the value 7 is
dedicated to the contextual menu.
You can use the constants from the QR Area Properties theme to designate the interface item:
Constant Description
qr view menubar (1) Display status of the menu bar (Displayed=1, Hidden=0)
qr view standard toolbar (2) Display status of the Standard toolbar (Displayed=1, Hidden=0)
qr view style toolbar (3) Display status of the Style toolbar (Displayed=1, Hidden=0)
qr view operators toolbar (4) Display status of the operators toolbar (Displayed=1,
Hidden=0)
qr view color toolbar (5) Display status of the Color toolbar (Displayed=1, Hidden=0)
qr view column toolbar (6) Display status of the Column toolbar (Displayed=1, Hidden=0)
qr view contextual menus (7) Display status of the Contextual menu (Displayed=1, Hidden=0)
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid property parameter, the error -9852 will be generated.
See Also
QR SET AREA PROPERTY.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR SET REPORT TABLE command sets the current table for the report area whose reference
was passed in area to the table whose number was passed in table.
It is necessary for a table to be assigned to the report since the report editor will be using the
current selection for that table to display the data, perform computations and propagate
relations, if needed.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid table value, the error -9852 will be generated.
See Also
QR Get report table.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR Get report table command returns the current table number for the report area whose
reference was passed in area.
If you pass an invalid area number, the error -9850 will be generated.
See Also
QR SET REPORT TABLE.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR SET TEXT PROPERTY command allows you to set the text attributes for the cell
determined by colNum and rowNum.
Note: In cross-table mode, the principle is similar except for the row values, which are always
positive.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid colNum number, the error -9852 will be generated.
If you pass an invalid rowNum number, the error -9853 will be generated.
If you pass an invalid property number, the error -9854 will be generated.
Example
This method defines several attributes of the first column’s title:
See Also
QR Get text property.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR Get text property command returns the property value of the text attributes for the cell
determined by colNum and RowNum.
Note: When passing -4 or -5 as rowNum, you still need to pass a column number in colNum,
even if it is not used.
- if rowNum is a positive value, it designates the corresponding subtotal (break level).
Note: In cross-table mode, the principle is similar except for the row values, which are always
positive.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid colNum number, the error -9852 will be generated.
If you pass an invalid rowNum number, the error -9853 will be generated.
If you pass an invalid property number, the error -9854 will be generated.
See Also
QR SET TEXT PROPERTY.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
QR RUN (area)
Description
The QR RUN command executes the report area whose reference was passed as parameter with
the Quick Report current settings, including the output type. You can use the QR SET
DESTINATION command to modify the output type.
The report is executed on the table to which the area belongs. When area designates an
offscreen area, it is necessary to specify the table to be used via the QR SET REPORT TABLE
command.
If you pass an invalid area number, the error -9850 will be generated.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR EXECUTE COMMAND command executes the menu command or toolbar button whose
reference was passed in command. The most common use for this command is to execute a
command after the user selected that command and your code intercepted it through the QR
ON COMMAND command.
In command, you can pass a value or one of the constants of the QR Commands constant
theme.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid command number, the error -9852 will be generated..
See Also
QR Get command status, QR ON COMMAND.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR Get command status command returns 0 if the command is disabled or 1 if it is enabled.
value returns the value of the selected sub-item, if any. For example, if the command that was
selected is the Font menu (1000) and the font selected was “Arial”, value would return “Arial”,
or if the command that was selected is a color menu (1002, 1003 or 1004), value would return
the color number.
In command, you can pass a value or one of the constants of the QR Commands constant
theme.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid command number, the error -9852 will be generated.
See Also
QR EXECUTE COMMAND, QR ON COMMAND.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR ON COMMAND command executes the 4D method passed in methodName when a
Quick Report command is invoked by the user, by the selection of a menu command or by a
click on a button.
Note: This command does not work with external windows in User mode.
If area equals zero, methodName will apply to each Quick Report area until the database is
closed or until the following call to QR ON COMMAND is made: QR ON COMMAND(0;"").
Note: When planning on compiling the database, it is necessary to declare both $1 and $2 as
Longints, even if you do not use them.
If you want the initial command to be executed, you need to include the following in the
called method: QR EXECUTE COMMAND($1;$2).
If you pass an invalid area number, the error -9850 will be generated.
See Also
QR EXECUTE COMMAND, QR Get command status.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR Find column command returns the number of the first column whose contents match
the expression passed in parameter.
If you pass an invalid area number, the error -9850 will be generated.
Example
The following code retrieves the column number that holds the field [G.NQR Tests]Quarter
and deletes that column:
followed by:
If ($NumColumn#-1)
QR DELETE COLUMN (MyArea ; $NumColumn)
End if
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR SET SELECTION command allows you to highlight a cell, a row, a column or the entire
area as you would with a mouse click. It also allows you to deselect the current selection.
left is the number of the left boundary. If left equals 0, the entire row is selected.
top is the number of the top boundary. If top equals 0, the entire column is selected.
right is the number of the right boundary.
bottom is the number of the bottom boundary.
Notes:
• If both left and top equal 0, the entire area is highlighted.
• If you want no selection, pass -1 to left, right, top and bottom.
If you pass an invalid area number, the error -9850 will be generated.
See Also
QR GET SELECTION.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR GET SELECTION command returns the coordinates of the cell that is selected.
left returns the number of the column that is the left boundary of the selection. If left equals 0,
the entire row is selected.
top returns the number of the row that is the top boundary of the selection. If top equals 0,
the entire column is selected.
Note: If both left and top equal 0, the entire area is highlighted.
right is the number of the column that is the right boundary of the selection.
bottom is the number of the row that is the top boundary of the selection.
Note: If there is no selection, left, top, right and bottom are set to -1.
If you pass an invalid area number, the error -9850 will be generated.
See Also
QR SET SELECTION.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
QR SET HEADER AND FOOTER (area; selector; leftTitle; centerTitle; rightTitle; height{; picture{;
pictAlignment}})
Description
The QR SET HEADER AND FOOTER command allows you to set the contents and size of the
header or footer.
leftTitle, centerTitle and rightTitle are the values for, respectively, the left, center and right
header/footer.
height is the height of the header/footer, expressed in the unit selected for the quick report.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid selector value, the error -9852 will be generated.
See Also
QR GET HEADER AND FOOTER.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
QR GET HEADER AND FOOTER (area; selector; leftTitle; centerTitle; rightTitle; height{; picture{;
pictAlignment}})
Description
The QR GET HEADER AND FOOTER command allows you to retrieve the contents and size of the
header or footer.
leftTitle, centerTitle and rightTitle returns the values for, respectively, the left, center and right
header/footer.
height returns the height of the header/footer, expressed in the unit selected for the report.
pictAlignment is the alignment attribute for the picture displayed in the header/footer.
• If pictAlignment returns 0, the picture is aligned to the left.
• If pictAlignment returns 1, the picture is centered.
• If pictAlignment returns 2, the picture is aligned to the right.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid selector value, the error -9852 will be generated.
See Also
QR SET HEADER AND FOOTER.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR SET BORDERS command allows you to set the border style for a given cell.
You can use constants from the QR Rows for Properties theme to designate the row item. (qr
title= -1, qr detail=-2, qr grand total=-3).
border is a composite value that indicates which borders of the cell are to be affected:
• 1 indicates the left border
• 2 indicates the top border
• 4 indicates the right border
• 8 indicates the bottom border
• 16 indicates the inside vertical border
• 32 indicates the inside horizontal border.
For example, a value of 5 passed in border would affect the right and left borders.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid column number, the error -9852 will be generated.
If you pass an invalid row number, the error -9853 will be generated.
If you pass an invalid border parameter, the error -9854 will be generated.
If you pass an invalid line parameter, the error -9855 will be generated.
See Also
QR GET BORDERS.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR GET BORDERS command allows you to retrieve the border style for a border of a given
cell.
You can use constants from the QR Rows for Properties theme to designate the row item (qr
title= -1, qr detail=-2, qr grand total=-3).
Note: Unlike the command QR SET BORDERS, QR GET BORDERS does not accept a cumulative
value. You must test all the parameters separately to have an overall view of the cell border.
color is the color of the line; it returns the value of the color applied to the line segment.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid column number, the error -9852 will be generated.
If you pass an invalid row number, the error -9853 will be generated.
If you pass an invalid border parameter, the error -9854 will be generated.
See Also
QR SET BORDERS.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
QR SET INFO COLUMN (area; colNum; title; object; hide; size; repeatedValue; displayFormat)
Description
List mode
The QR SET INFO COLUMN command allows you to set the parameters of an existing column.
title is the title that will be displayed in the header of the column.
size is the size in pixels to assign to the column. If size equals -1, the size is made automatic.
repeatedValue is the status for data repetition. For example, if the value for a field or variable
does not change from one record to the other, it may or may not be repeated when they do
not change.
• If repeatedValue equals 0, values are not repeated.
• If repeatedValue equals 1, values are repeated.
The following statement sets the title of column #1 to Title, sets the contents of the body to
Field2, makes the column visible with a width of 150 pixels and sets the format to ###.##.
Cross-table mode
The QR SET INFO COLUMN command allows you to set the same parameters but the reference
of the areas to which it applies is different and varies depending on the parameter you want to
set.
First of all, the title, hide, and repeatedValue parameters are not used when this command is
used in cross-table mode. The value to use for colNum varies depending on whether you want
to set the column size or the data source and display format.
• Column size
This is a “visual” attribute, therefore columns are numbered from left to right, as depicted
below.
The following statement will set the size to automatic for all the columns in a cross-table
report and will leave other elements unchanged:
For ($i;1;3)
QR GET INFO COLUMN(qr_area;$i;$title;$obj;$hide;$size;$rep;$format)
QR SET INFO COLUMN(qr_area;$i;$title;$obj;$hide;0;$rep;$format)
End for
You will notice that not all cells can be addressed using the QR SET INFO COLUMN command,
the cells that are not numbered above are addressed using QR SET TOTALS DATA.
The following code assigns data sources to the three cells required for creating a basic cross-
table report:
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid colNum value, the error -9852 will be generated.
See Also
QR GET INFO COLUMN, QR Get info row, QR SET INFO ROW.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
QR GET INFO COLUMN (area; colNum; title; object; hide; size; repeatedValue; displayFormat)
Description
List mode
The QR GET INFO COLUMN command allows you to retrieve the parameters of an existing
column.
title returns the title that will be displayed in the header of the column.
object returns the name of the actual object of the column (variable, field name or formula).
size returns the size of the column in pixels. If the value returned is negative, the size of the
column is automatic.
format returns the display format. Display formats are the 4D formats compatible with the
data displayed.
Cross-table mode
The QR GET INFO COLUMN command allows you to retrieve the same parameters but the
reference of the areas to which it applies is different and varies depending on the parameter
you want to set. First of all, the title, hide, and repeatedValue parameters are meaningless when
this command is used in cross-table mode. The value to use for colNum varies depending on
whether you want to retrieve the column size or the data source and display format.
• Column size
This is a “visual” attribute, therefore columns are numbered from left to right, as depicted
below:
The following statement sets the size to automatic for all the columns in a cross-table report
and leaves other elements unchanged:
For ($i;1;3)
QR GET INFO COLUMN(qr_area;$i;$title;$obj;$hide;$size;$rep;$format)
QR SET INFO COLUMN(qr_area;$i;$title;$obj;$hide;0;$rep;$format)
End for
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid ColNum value, the error -9852 will be generated.
See Also
QR Get info row, QR SET INFO COLUMN, QR SET INFO ROW.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR SET INFO ROW command displays/hides the row whose reference was passed in row.
You can use constants from the QR Rows for Properties theme to designate the row item (qr
title= -1, qr detail=-2, qr grand total=-3).
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid row value, the error -9852 will be generated.
Example
The following statement hides the detail row:
See Also
QR GET INFO COLUMN, QR Get info row, QR SET INFO COLUMN.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR Get info row command retrieves the display status of the row whose reference was
passed in row.
You can use constants from the QR Rows for Properties theme to designate the row item (qr
title= -1, qr detail=-2, qr grand total=-3)
The function result specifies whether the row is displayed or hidden. If it equals 1, the row is
set to hidden; if it equals 0, the row is set to displayed.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid row value, the error -9852 will be generated.
See Also
QR GET INFO COLUMN, QR SET INFO COLUMN, QR SET INFO ROW.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR SET SORTS command allows you to set the sort orders for the columns in the report
whose reference is passed in area.
aColumns: in this array, you need to store the column numbers of columns to which you want
to assign a sort order.
aOrders: each element of this array must contain the sort orders for the matching column in
the aColumns array.
• If aOrders{$i} equals 1, the sort order is ascending.
• If aOrders{$i} equals - 1, the sort order is descending.
Cross-table mode
In the case of cross-table mode, you cannot have more than two items in the array. You can
only sort columns (1) and rows (2). The data (that are the intersection of columns and rows)
cannot be sorted.
Here is the code to sort only the rows in the case of a cross-table report:
ARRAY REAL($aColumns;1)
$aColumns{1}:=2
ARRAY REAL($aOrders;1)
$aOrders{1}:=-1 `Alphabetic sort for rows
QR SET SORTS (qr_area;$aColumns;$aOrders)
If you pass an invalid area number, the error -9850 will be generated.
See Also
QR GET SORTS.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR GET SORTS command populates two arrays:
• aColumns
This array includes all the columns that have a sort order.
• aOrders
Each element of this array contains the sort orders for the matching column.
- If aOrders{$i} equals 1, the sort order is ascending.
- If aOrders{$i} equals -1, the sort order is descending.
Cross-table mode
In the case of cross-table mode, the resulting arrays cannot have more than two elements since
sorts can only be performed on columns (1) and rows (2). (Values for aColumns).
If you pass an invalid area number, the error -9850 will be generated.
See Also
QR SET SORTS.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
List Mode
The QR SET TOTALS DATA command allows you to set the details of a specific break (total or
subtotal).
colNum is the column number of the cell whose data is going to be set.
breakNum is the number of the break whose data will be set (subtotal or grand total). For a
Subtotal, breaknum is the sort number. For the Grand total, breaknum equals -3 or the constant
qr grand total.
operator is an addition of all the operators present in the cell. You can use the constants of the
QR Operators theme to set the value:
Constant Value
qr sum 1
qr average 2
qr min 4
qr max 8
qr count 16
qr standard deviation 32
Cross-table Mode
The QR SET TOTALS DATA command allows you to set the details of a specific cell.
colNum is the column number of the cell whose data is going to be set.
breakNum is the row number of the cell whose data is going to be set.
operator is an addition of all the operators present in the cell. You can use the constants of the
QR Operators theme to set the value (see above).
• Operator
An operator or a combination of operators (as described above) can be passed for the following
cells:
colNum=2, breakNum=2
colNum=3, breakNum=2
colNum=2, breakNum=3
Please note that these last two values affect the cell (Column 3; Row 3) as well. If a
computation is defined in the cell (Column 2; Row 3), the contents of this cell (Column 2;
Row 3) always define the contents of the cell (Column 3; Row 3).
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid colNum number, the error -9852 will be generated.
If you pass an invalid breakNum number, the error -9853 will be generated.
See Also
QR GET TOTALS DATA.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
List Mode
The QR GET TOTALS DATA command allows you to retrieve the details of a specific break.
breakNum is the number of the break whose data will be retrieved (subtotal or grand total):
- Subtotal: between 1 and the number of Subtotal/sort.
- Grand total: -3 / constant: qr grand total.
operator returns the sum of all the operators present in the cell. You can use the constants of
the QR Operators theme to process the returned value:
Constant Value
qr sum 1
qr average 2
qr min 4
qr max 8
qr count 16
qr standard deviation 32
Note: operator and text are mutually exclusive, so you either have a result returned through
operator or through text.
Cross-table Mode
The QR GET TOTALS DATA command allows you to retrieve the details of a specific cell.
colNum is the column number of the cell whose data is going to be retrieved.
breakNum is the row number of the cell whose data is going to be retrieved.
operator returns the sum of all the operators present in the cell. You can use the constants of
the QR Operators theme to process the returned value (see above).
Here is a depiction of how the parameters colNum and breakNum have to be combined in cross-
table mode:
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid colNum number, the error -9852 will be generated.
If you pass an invalid breakNum number, the error -9853 will be generated.
See Also
QR SET TOTALS DATA.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR SET TOTALS SPACING command allows you to set a space above a subtotal row. It
applies only to the list mode.
Note: If the space above a subtotal row “pushes” the row to the next page, there will be no
space inserted above the row on that page.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid subtotal, the error -9852 will be generated.
See Also
QR GET TOTALS SPACING.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR GET TOTALS SPACING command allows you to retrieve a space above a subtotal row. It
applies only to the list mode.
subtotal is the subtotal level (or break level) that will be affected. subtotal is a value between 1
and the number of the subtotal/sort.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid subtotal, the error -9852 will be generated.
See Also
QR SET TOTALS SPACING.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR INSERT COLUMN command inserts or creates a column at the specified position.
Columns located to the right of that position will be shifted accordingly.
The default title for the column will be the value passed in object.
If you pass an invalid area number, the error -9850 will be generated.
Example
The following statement inserts (or creates) a first column in a Quick Report area, inserts
“Field1” as column title (default behavior) and populates the contents of the body with values
from Field1.
See Also
QR DELETE COLUMN.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR Get drop column command returns a value depending on where the drop was
performed:
• if the value is negative, it indicates a column number (i.e., -3 if the the drop was performed
on column number 3)
• if the value is positive, it indicates that the drop was performed on a separator preceding the
column (i.e., 3 if the drop was performed after column 2). Keep in mind that the drop does
not have to take place before an existing column.
If you pass an invalid area number, the error -9850 will be generated.
See Also
QR DELETE COLUMN.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR Count columns command returns the number of columns present in the Quick Report
area.
If you pass an invalid area number, the error -9850 will be generated.
Example
The following code retrieves the column count and inserts a column to the right of the
rightmost existing column:
See Also
QR DELETE COLUMN, QR INSERT COLUMN.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR DELETE COLUMN command deletes the column in area whose number was passed in
colNumber. This command does not apply to cross-table reports.
If you pass an invalid area number, the error -9850 will be generated.
If you pass an invalid column number, the error -9852 will be generated.
Example
The following example makes sure the report is a list report and deletes the third column:
See Also
QR INSERT COLUMN.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR SET HTML TEMPLATE command sets the HTML template currently used for the Quick
Report area. The template will be used when building the report in HTML format.
The template uses a set of tags to process the data in order to either retain a layout close to the
original report or to adopt your own custom HTML.
Note: You first need to call QR SET DESTINATION to set the output to HTML file.
HTML Tags
<!--#4DQRheader--> ... <!--/#4DQRheader-->
The HTML contents that are included between these tags come from the column titles. You
will typically use these tags to define the title row of the report.
<!--#4DQRbgcolor-->
This color tag will be replaced by the current color for the current cell.
<!--#4DQRdata-->
This tag will be replaced by the current data for the current cell.
<!--#4DQRlHeader--><!--#4DQRdata--><!--/#4DQRlHeader-->
<!--#4DQRcHeader--><!--#4DQRdata--><!--/#4DQRcHeader-->
<!--#4DQRrHeader--><!--#4DQRdata--><!--/#4DQRrHeader-->
These tags will be replaced respectively by the data in the left, center or right header.
<!--#4DQRlFooter--><!--#4DQRdata--><!--/#4DQRlFooter-->
<!--#4DQRcFooter--><!--#4DQRdata--><!--/#4DQRcFooter-->
<!--#4DQRrFooter--><!--#4DQRdata--><!--/#4DQRrFooter-->
These tags will be replaced respectively by the data in the left, center or right footer.
If you pass an invalid area number, the error -9850 will be generated.
See Also
QR Get HTML template.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The QR Get HTML template command returns the HTML template currently used for the Quick
Report area. The returned value is a text value and includes all the contents of the HTML
template.
If no specific template was defined, the template that is returned is the default template. Please
note that no template will be returned if the output was not set to HTML file, either manually
or programmatically.
If you pass an invalid area number, the error -9850 will be generated.
See Also
QR SET HTML TEMPLATE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
4th Dimension and 4D Server/4D Client automatically manage databases by preventing multi-
user or multi-process conflicts. Two users or two processes cannot modify the same record or
object at the same time. However, the second user or process can have read-only access to the
record or object at the same time.
There are three important concepts to be aware of when using commands in a multi-
processing database:
• Each table is in either a read-only or a read/write state.
• Records become locked when they are loaded and unlocked when they are unloaded.
• A locked record cannot be modified.
As a convention in the following sections, the person performing an operation on the multi-
user database is referred to as the local user. Other people using the database are referred to as
the other users. The discussion is from the perspective of the local user. Also, from a multi-
process perspective, the process executing an operation on the database is the current process.
Any other executing process is referred to as other processes. The discussion is from the point
of view of the current process.
Locked Records
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
A locked record cannot be modified by the local user or the current process. A locked record
can be loaded, but cannot be modified. A record is locked when one of the other users or
processes has successfully loaded the record for modification. Only the user who is modifying
the record sees that record as unlocked. All other users and processes see the record as locked,
and therefore unavailable for modification. A table must be in a read/write state for a record to
be loaded unlocked.
Each table in a database is in either a read/write or a read-only state for each user and process
of the database. Read-only means that records for the table can be loaded but not modified.
Read/write means that records for the table can be loaded and modified if no other user has
locked the record first.
Note that if you change the status of a table, the change takes effect for the next record
loaded. If there is a record currently loaded when you change the table’s status, that record is
not affected by the status change.
Read-Only State
When a table is read-only and a record is loaded, the record is always locked. In other words,
the record can be displayed, printed, and otherwise used, but it cannot be modified.
Note that read-only status applies only to editing existing records. Read-only status does not
affect the creation of new records. You can add records to a read-only table using CREATE
RECORD and ADD RECORD or the New Record menu command from the User environment’s
Enter menu.
4th Dimension automatically sets a table to read-only for commands that do not require write
access to records. These commands are:
• DISPLAY SELECTION
• DISTINCT VALUES
• EXPORT DIF
• EXPORT SYLK
• EXPORT TEXT
• GRAPH TABLE
• PRINT SELECTION
• PRINT LABEL
• QR REPORT
• SELECTION TO ARRAY
• SELECTION RANGE TO ARRAY
You can find out the state of a table at any time using the Read only state function.
Before executing any of these commands, 4th Dimension saves the current state of the table
(read-only or read/write) for the current process. After the command has executed, the state is
restored.
A table must be set to read/write and the record loaded for it to become unlocked and thus
modifiable.
If a user loads a record from a table in read/write mode, no other users can load that record for
modification. However, other users can add records to the table, either through the CREATE
RECORD or ADD RECORD commands or manually in the User environment.
Read/write is the default state for all tables when a database is opened and a new process is
started.
Each process has its own state (read-only or read/write) for each table in the database.
Before the local user can modify a record, the table must be in the read/write state and the
record must be loaded and unlocked.
Any of the commands that loads a current record (if there is one) — such as NEXT RECORD,
QUERY, ORDER BY, RELATE ONE, etc. — sets the record as locked or unlocked. The record is
loaded according to the current state of its table (read-only or read/write) and its availability. A
record may also be loaded for a related table by any of the commands that cause an automatic
relation to be established.
If a table is in the read-only state, then a record loaded from that table is locked. A locked
record cannot be saved or deleted. Read-only is the preferred state, because it allows other
users to load, modify, and then save the record.
If the record is to be modified, you use the Locked function to test whether or not a record is
locked by another user. If a record is locked (Locked returns True), load the record with the
LOAD RECORD command and again test whether or not the record is locked. This sequence
must be continued until the record becomes unlocked (Locked returns False).
When modifications to be made to a record are finished, the record must be released (and
therefore unlocked for the other users) with UNLOAD RECORD. If a record is not unloaded, it
will remain locked for all other users until a different current record is selected. Changing the
current record of a table automatically unlocks the previous current record. You need to
explicitly call UNLOAD RECORD if you do not change the current record. This discussion
applies to existing records. When a new record is created, it can be saved regardless of the state
of the table to which it belongs.
Note: When it is used in a transaction, the UNLOAD RECORD command unloads the current
record only for the process that manages the transaction. For other processes, the record stays
locked as long as the transaction has not been validated (or cancelled).
Use the LOCKED ATTRIBUTES command to see which user and/or process have locked a record.
The following example shows the simplest loop with which to load an unlocked record:
READ WRITE([Inventory])
Repeat ` Loop until the record is unlocked
LOAD RECORD([Inventory]) ` Load record and set it to locked
Until (Not (Locked([Inventory])))
[Inventory]Part Qty := [Inventory]Part Qty – 1 ` Modify the record
SAVE RECORD ([Inventory]) ` Save the record
UNLOAD RECORD ([Inventory]) ` Let other users modfiy it
READ ONLY([Inventory])
The MODIFY RECORD command automatically notifies the user if a record is locked, and
prevents the record from being modified. The following example avoids this automatic
notification by first testing the record with the Locked function. If the record is locked, the
user can cancel.
This example efficiently checks to see if the current record is locked for the table [Commands].
If it is locked, the process is delayed by the procedure for one second. This technique can be
used both in a multi-user or multi-process situation:
Repeat
READ ONLY([Commands]) ` You do not need read/write right now
QUERY([Commands])
` If the search was completed and some records were returned
If ((OK=1) & (Records in selection([Commands])>0))
READ WRITE([Commands]) ` Set the table to read/write state
LOAD RECORD([Commands])
While (Locked([Commands]) & (OK=1)) `If the record is locked,
` loop until the record is unlocked
` Who is the record locked by?
LOCKED ATTRIBUTES([Commands];$Process;$User;$Machine;$Name)
If ($Process=-1) ` Has the record been deleted?
ALERT("The record has been deleted in the meantime.")
OK:=0
Else
A number of commands in the language perform specific actions when they encounter a
locked record. They behave normally if they do not encounter a locked record.
Here is a list of these commands and their actions when a locked record is encountered.
• MODIFY RECORD: Displays a dialog box stating that the record is in use. The record is not
displayed, therefore the user cannot modify the record. In the User environment, the record is
shown in read-only state.
• MODIFY SELECTION: Behaves normally except when the user double-clicks a record to modify
it. MODIFY SELECTION displays dialog box stating that the record is in use and then allows
read-only access to the record.
• APPLY TO SELECTION: Loads a locked record, but does not modify it. APPLY TO SELECTION
can be used to read information from the table without special care. If the command
encounters a locked record, the record is put into the LockedSet system set.
• DELETE SELECTION: Does not delete any locked records; it skips them. If the command
encounters a locked record, the record is put into the LockedSet system set.
• DELETE RECORD: This command is ignored if the record is locked. No error is returned. You
must test that the record is unlocked before executing this command.
• SAVE RECORD: This command is ignored if the record is locked. No error is returned. You
must test that the record is unlocked before executing this command.
See Also
LOAD RECORD, Locked, LOCKED ATTRIBUTES, Methods, READ ONLY, Read only state, READ
WRITE, UNLOAD RECORD, Variables.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
READ WRITE changes the state of table to read/write for the process in which it is called. If the
optional * parameter is specified, all tables are changed to read/write state.
After a call to READ WRITE, when a record is loaded, the record is unlocked if no other user has
locked the record. This command does not change the status of the currently loaded record,
only that of subsequently loaded records.
Use READ WRITE when you must modify a record and save the changes. Also use READ WRITE
when you must lock a record for other users, even if you are not making any changes. Setting
a table to read/write mode prevents other users from editing that table. However, other users
can create new records.
Note: This command is not retroactive. A record is loaded according to the table’s read/write
status at the time of loading. To load a record from a read-only table in read/write mode, you
must first change the table state to read/write.
See Also
READ ONLY, Read only state, Record Locking.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
READ ONLY changes the state of table to read-only for the process in which it is called. All
subsequent records that are loaded are locked, and you cannot make any changes made to
them. If the optional * parameter is specified, all tables are changed to read-only state.
Use READ ONLY when you do not need to modify the record or records.
Note: This command is not retroactive. A record is loaded according to the table’s read/write
status at the time of loading. To load a record from a read/write table in read-only mode, you
must first change the table state to read-only.
See Also
Read only state, READ WRITE, Record Locking.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
This function is used to test whether or not the state of table is read-only for the process in
which it is called. Read only state returns TRUE if the state of table is read-only. Read only state
returns FALSE if the state of table is read/ write.
Example
The following example tests the state of an [Invoice] table. If the state of the [Invoice] table is
read-only, it is set to read/write, and then the current record is reloaded.
Note: The invoice record is reloaded to allow the user to modify it. A record that was
previously loaded in a read-only state will remain locked until it is reloaded in a read/write
state.
See Also
READ ONLY, READ WRITE, Record Locking.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
LOAD RECORD loads the current record of table. If there is no current record, LOAD RECORD
has no effect.
You can then use the Locked function to determine whether you can modify the record:
• If the table is in read-only state, the Locked function returns TRUE, and you cannot modify
the record.
• If the table is in read/write state but the record was already locked, the record will be read-
only, and you cannot modify the record.
• If the table is in read/write state and the record is not locked, you can modify the record in
the current process. The Locked function returns TRUE for all other users and processes.
Note: If the LOAD RECORD command is executed after a READ ONLY, the record is
automatically unloaded and loaded without having to use the UNLOAD RECORD command.
Usually, you do not need to use the LOAD RECORD command, because commands like QUERY,
NEXT RECORD, PREVIOUS RECORD, etc., automatically load the current record.
In multi-user and multi-process environments, when you need to modify an existing record,
you must access the table (to which the record belongs) in read/write mode. If a record is
locked and not loaded, LOAD RECORD allows you to attempt to load the record again at a later
time. By using LOAD RECORD in a loop, you can wait until the record becomes available in
read/write mode.
Tip: The LOAD RECORD command can be used to reload the current record in the context of an
input form. All the data modified are then replaced by their previous values. In this case, the
LOAD RECORD command carries out a sort of general cancellation of data entry.
See Also
Locked, Record Locking, UNLOAD RECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
UNLOAD RECORD unloads the current record of table.
If the record is unlocked for the local user (locked for the other users), UNLOAD RECORD
unlocks the record for the other users.
Although UNLOAD RECORD unloads it from memory, the record remains the current record.
When another record is made the current record, the previous current record is automatically
unloaded and therefore unlocked for other users. Always execute this command when you
have finished modifying a record and want to make it available to other users, while retaining
the record as your current record.
If a record has a large amount of data, picture fields, or external documents (such as 4D Write
or 4D Draw documents), you may not want to keep the current record in memory unless you
need to modify it. In this case, use the UNLOAD RECORD command to keep the current record
without having it in memory. You free the memory occupied by the record, but you do not
have access to its field values. If you later need access to the values of the record, use the LOAD
RECORD command.
Note: When it is used in a transaction, the UNLOAD RECORD command unloads the current
record only for the process that manages the transaction. For other processes, the record stays
locked as long as the transaction has not been validated (or cancelled).
See Also
LOAD RECORD, Record Locking.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Locked tests whether or not the current record of table is locked. Use this function to find out
whether or not the record is locked; then take appropriate action, such as giving the user the
choice of waiting for the record to be free or skipping the operation.
If Locked returns TRUE, then the record is locked by another user or process and cannot be
saved. In this case, use LOAD RECORD to reload the record until Locked returns FALSE.
If Locked returns FALSE, then the record is unlocked, meaning that the record is locked for all
other users. Only the local user or current process can modify and save the record. A table
must be in read/write state in order for you to modify the record.
If you try to load a record that has been deleted, Locked continues to return TRUE. To avoid
waiting for a record that does not exist anymore, use the LOCKED ATTRIBUTES command. If the
record has been deleted, the LOCKED ATTRIBUTES command returns -1 in the process
parameter.
During transaction processing, LOAD RECORD and Locked are often used to test record
availability. If a record is locked, it is common to cancel the transaction.
See Also
LOAD RECORD, LOCKED ATTRIBUTES, Record Locking.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
LOCKED ATTRIBUTES returns information about the user and process that have locked a record.
The process number (on the server machine), the user name in the 4D application and in the
system as well as the process name are returned in the process, 4Duser, sessionUser, and
processName variables. You can use this information in a custom dialog box to warn the user
when a record is locked.
If the record is not locked, process returns 0 and 4Duser, sessionUser, and processName return
empty strings. If the record you try to load in read/write has been deleted, process returns -1
and 4Duser, sessionUser, and processName return empty strings.
In single-user mode, this command returns values in process and processName only if a record
is locked. The values returned in 4Duser and sessionUser are empty strings.
In Client/Server mode, the returned process number is the number of the process on the server.
The 4Duser parameter returned is the user name from the 4th Dimension password system,
even if user name is blank. If there is no password system, “Designer” is returned.
The sessionUser parameter returned corresponds to the name of the user that opened the
session on the client machine (this name is displayed in the 4D Server administration window
for each open process).
See Also
Locked, Record Locking.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DISPLAY RECORD command displays the current record of table, using the current input
form. The record is displayed only until an event redraws the window. Such an event might be
the execution of an ADD RECORD command, returning to an input form, or returning to the
menu bar. DISPLAY RECORD does nothing if there is no current record.
DISPLAY RECORD is often used to display custom progress messages. It can also be used to
generate a free-running slide show.
WARNING: Do not call DISPLAY RECORD from within a Web connection process, because the
command will be executed on the 4th Dimension Web server machine and not on the Web
browser client machine.
Example
The following example displays a series of records as a slide show:
ALL RECORDS([Demo]) ` Select all of the records
INPUT FORM ([Demo]; "Display") ` Set the form to use for display
For ($vlRecord;1;Records in selection([Demo])) ` Loop through all of the records
DISPLAY RECORD([Demo]) ` Display a record
DELAY PROCESS (Current process; 180) ` Pause for 3 seconds
NEXT RECORD([Demo]) ` Move to the next record
End for
See Also
MESSAGE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CREATE RECORD creates a new empty record for table, but does not display the new record. Use
ADD RECORD to create a new record and display it for data entry.
CREATE RECORD is used instead of ADD RECORD when data for the record is assigned with the
language. The new record becomes the current record but the current selection is left
untouched.
The record exists in memory only until a SAVE RECORD command is executed for the table. If
the current record is changed (for example, by a query) before the record is saved, the new
record is lost.
Example
The following example archives records that are over 30 days old. It does does this by creating
new records in an archival table. When the archiving is finished, the records that were
archived are deleted from the [Accounts] table:
See Also
ADD RECORD, MODIFY RECORD, SAVE RECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
DUPLICATE RECORD creates a new record for table that is a duplicate of the current record. The
new record becomes the current record. If there is no current record, then DUPLICATE RECORD
does nothing. You must use SAVE RECORD to save the new record.
DUPLICATE RECORD can be executed during data entry. This allows you to create a clone of the
currently displayed record. Remember that you must first execute SAVE RECORD in order to
save any changes made to the original record.
See Also
SAVE RECORD.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Is new record command returns True when the table’s current record is being created and
has not yet been saved in the current process.
Compatibility Note: You can obtain the same information by using the existing Record number
command, and by testing if it returns -3.
However, we strongly advise you to use Is new record instead of Record number in this case. In
fact, the Is new record command ensures compatibility with future versions of 4th Dimension.
4D Server: This command returns a different result for the On Validate form event depending
on whether it is executed on 4th Dimension single-user or 4D Client. In single-user version,
the command returns False (the record is considered as already created). In client/server
version, the command returns True because, in this case, the record is already created on the
server but the information has not yet been sent to the client.
Example
The following two instructions are identical. The second one is strongly advised so that the
code will be compatible with future versions of 4D:
See Also
Modified record, Record number.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Modified record returns True if the current record of table has been modified but not saved;
otherwise it returns False. This function allows the designer to quickly test whether or not the
record needs to be saved. It is especially valuable in input forms to check whether or not to
save the current record before proceeding to the next one. This function always returns TRUE
for a new record.
Example
The following example shows a typical use for Modified record:
See Also
Modified, Old, SAVE RECORD.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Is record loaded command returns True if the table’s current record is loaded in the current
process.
Example
Instead of using the “Next record” or “Previous record” automatic actions, you can write
object methods for these buttons to improve their operation. The “Next” button will display
the beginning of the selection if the user is at the end of the selection and the “Previous”
button will show the end of the selection when the user is at the beginning of the selection.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SAVE RECORD saves the current record of table in the current process. If there is no current
record, then SAVE RECORD is ignored.
You use SAVE RECORD to save a record that you created or modified with code. A record that
has been modified and validated by the user in a form does not need to be saved with SAVE
RECORD. A record that has been modified by the user in a form, but has been canceled, can
still be saved with SAVE RECORD.
You should not execute a SAVE RECORD during the On Validate event for a form that has been
accepted. If you do, the record will be saved twice.
See Also
CREATE RECORD, Locked, Triggers.
Description
DELETE RECORD deletes the current record of table in the process. If there is no current record
for table in the process, DELETE RECORD has no effect. In a form, you can create a Delete
Record button instead of using this command.
Note: If the current record is unloaded from memory before calling DELETE RECORD (for
example, subsequent to an UNLOAD RECORD), the current selection of table is empty after the
deletion occurs.
If a record is deleted, the record number will be reused when new records are created. Do not
use the record number as the record identifier if you will ever delete records from the database.
Example
The following example deletes an employee record. The code asks the user what employee to
delete, searches for the employee’s record, and then deletes it:
vFind := Request ("Employee ID to delete:") ` Get an employee ID
If (OK = 1)
QUERY ([Employee]; [Employee]ID = vFind) ` Find the employee
DELETE RECORD ([Employee]) ` Delete the employee
End if
See Also
Locked, Triggers.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Records in table returns the total number of records in table. Records in selection returns the
number of records in the current selection only. If Records in table is used within a transaction,
records created during the transaction will be taken into account.
Example
The following example displays an alert that shows the number of records in a table:
See Also
Records in selection.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Record number returns the physical record number for the current record of table. If there is no
current record, such as when the record pointer is before or after the current selection, Record
number returns –1. If the record is a new record that has not been saved, Record number
returns –3.
Record numbers can change. The record numbers of deleted records are reused. Record
numbers will also change if you compact the database or perform a recover by tags operation
on the database using 4D Tools. During a transaction, a newly created record has a temporary
record number. After the transaction has been accepted, the record is assigned a regular record
number.
4D Server: This command returns a different result for the On Validate form event depending
on whether it is executed on 4th Dimension or 4D Client. In single-user version, the
command returns a record number (the record is considered as already created). In
client/server version, the command returns -3 because, in this case, the record is already
created on the server but the information has not yet been sent to the client.
Example
The following example saves the current record number and then searches for any other
records that have the same data:
See Also
About Record Numbers, GOTO RECORD, Is new record, Selected record number, Sequence
number.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
GOTO RECORD selects the specified record of table as the current record. The record parameter
is the number returned by the Record number function. After executing this command, the
record is the only record in the selection.
If record is less than the smallest record number in the database or greater than the greatest
record number in the database, 4th Dimension generates an error message stating that the
record number is out of range. If record is equal to the record number of a deleted record, the
selection becomes empty.
Note: With this command, you should not use temporary record numbers issued during
transactions (see the Using Transactions section).
Example
See the example for Record number.
See Also
About Record Numbers, Record number.
Description
Sequence number returns the next sequence number for table. The sequence number is unique
for each table. It is a nonrepeating number that is incremented for each new record created for
the table. By default, the numbering starts at 1. You can change the numbering for a table
using the SET DATABASE PARAMETER command.
You should use the Sequence number function instead of the #N symbol if:
• You are creating records procedurally
• The sequence number needs to start at a number other than 1
• The sequence number needs an increment greater than 1
• The sequence number is part of a code, for example a part number code
To store the sequence number by means of a method, create a long integer field in the table
and assign the sequence number to the field.
The sequence number is the same number assigned by using the #N symbol as the default
value for a field in a form. For information on assigning default values, see the 4th Dimension
Design Reference .
If the sequence number needs to start at a number other than 1, just add the difference to
Sequence number. For example, if the sequence number must start at 1000, you would use the
following statement to assign the number:
See Also
About Record Numbers, Record number, Selected record number.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Record Number
The record number is the absolute/physical record number for a record. A record number is
automatically assigned to each new record and remains constant for the record until the
record is deleted or the file is permanently reordered using 4D Tools. Record numbers start at
zero. They are not unique because record numbers of deleted records are reused for new
records. They also change when the file is permanently reordered using 4D Tools or when the
database is compacted or repaired. New records added in transaction are assigned temporary
record numbers, and are assigned final record numbers when the transaction is validated.
Note: Temporary record numbers that are created during transactions start at 18,000,000.
Sequence Number
The sequence number is a unique nonrepeating number that may be assigned to a field of a
record. It is not automatically stored with each record. It starts at 1 and is incremented for
each new record that is created. Unlike record numbers, a sequence number is not reused
when a record is deleted or when a table is compacted, repaired, or permanently reordered
using 4D Tools. Sequence numbers provide a way to have unique ID numbers for records. If a
sequence number is incremented during a transaction, the number is not decremented if the
transaction is canceled.
The following tables illustrate the numbers that are associated with records. Each line in the
table represents information about a record. The order of the lines is the order in which
records would be displayed in an output form.
Note: The records remain in the default order after a command changes the current selection
without reordering it; for example, after the Show All menu command is chosen in the User
environment, or after the ALL RECORDS command is executed.
See Also
Record number, Selected record number, Sequence number.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
PUSH RECORD pushes the current record of table (and its subrecords, if any) onto the table’s
record stack. PUSH RECORD may be executed before a record is saved.
If you push a record that was unlocked, this record stays locked for all the other processes and
users until you pop and unload it.
Example
The following example pushes the record for the customer onto the record stack:
See Also
POP RECORD, Using the Record Stack.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
POP RECORD pops a record belonging to table from the table’s record stack, and makes the
record the current record.
If you push a record, change the selection to not include the pushed record, and then pop the
record, the current record is not in the current selection. To designate the popped record as
the current selection, use ONE RECORD SELECT. If you use any commands that move the
record pointer before saving the record, you will lose the copy in memory.
Example
The following example pops the record for the customer off the record stack:
See Also
PUSH RECORD, Using the Record Stack.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The PUSH RECORD and POP RECORD commands allow you to put (“push”) records onto the
record stack, and to remove (“pop”) them from the stack.
Each process has its own record stack for each table. 4th Dimension maintains the record
stacks for you. Each record stack is a last-in-first-out (LIFO) stack. Stack capacity is limited by
memory.
PUSH RECORD and POP RECORD should be used with discretion. Each record that is pushed
uses part of free memory. Pushing too many records can cause an out-of-memory or stack full
condition.
4th Dimension clears the stack of any unpopped records when you return to the menu at the
end of execution of your method.
PUSH RECORD and POP RECORD are useful when you want to examine records in the same file
during data entry. To do this, you push the record, search and examine records in the file
(copy fields into variables, for example), and finally pop the record to restore the record.
Note to version 3 users: While entering a record, if you have to check a multiple field unique
value, use the new SET QUERY DESTINATION command. This will save you the calls to PUSH
RECORD and POP RECORD that you were making before and after the call to QUERY in order to
preserve the data entered in the current record. SET QUERY DESTINATION allows you to make a
query that does not change the selection nor the current record.
See Also
POP RECORD, PUSH RECORD, SET QUERY DESTINATION.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The commands in this theme, in particular RELATE ONE and RELATE MANY, establish and
manage the automatic and non-automatic relations between tables. Before using any of the
commands in this theme, refer to the 4th Dimension Design Reference manual for information
about creating relations between tables.
Two tables can be related with automatic table relations. In general, when an automatic table
relation is established, it loads or selects the related records in a related table. Many operations
cause the relation to be established.
To optimize performance, when 4th Dimension establishes automatic relations, only one
record becomes the current record for a table. For each of the operations listed above, the
related record is loaded according to the following principles:
• If a relation selects only one record of a related table, that record is loaded from disk.
• If a relation selects more than one record of a related table, a new selection of records is
created for that table, and the first record in that selection is loaded from disk.
For example, using the database structure displayed here, if a record for the [Employees] table
is loaded and displayed for data entry, the related record from the [Companies] table is
selected and is loaded. Similarly, if a record for the [Companies] table is loaded and displayed
for data entry, the related records from the [Employees] table are selected.
Similarly, the Company field in the [Employees] table is referred to as the Many field, and the
Name field in the [Companies] table is referred to as the One field.
It is not always possible to have the related field be unique. For example, the
[Companies]Name field may have several company records containing the same value. This
non-unique situation can be easily handled by creating a relation, which will always be
unique, on another field in the related table. This field could be a company ID field.
The following table lists commands that use automatic relations to load related records during
operation of the command. All of the commands will use existing automatic Many-to-One
relations. Only those commands with Yes in the One-to-Many established column below will
use automatic One-to-Many relations.
Automatic relations do not mean that the related record or records for a table will be selected
simply because a command loads a record. In some cases, after using a command that loads a
record, you must explicitly select the related records by using RELATE ONE or RELATE MANY if
you need to access the related data.
Some of the commands listed in the previous table (such as the query commands) load a
current record after the task is completed. In this case, the record that is loaded does not
automatically select the records related to it. Again, if you need to access the related data, you
must explicitly select the related records by using RELATE ONE or RELATE MANY.
See Also
CREATE RELATED ONE, GET AUTOMATIC RELATIONS, GET FIELD RELATION, OLD RELATED MANY,
OLD RELATED ONE, RELATE MANY, RELATE MANY SELECTION, RELATE ONE, RELATE ONE
SELECTION, SAVE OLD RELATED ONE, SAVE RELATED ONE, SET AUTOMATIC RELATIONS, SET
FIELD RELATION.
Description
SET AUTOMATIC RELATIONS temporarily changes all the manual relations into automatic
relations for the entire database. The relations stay automatic unless a subsequent call to SET
AUTOMATIC RELATIONS is made.
• If one is true, then all manual Many-to-One relations will become automatic. If one is false,
all previously changed Many-to-One relations will revert to manual relations.
• The same is true for the many parameter, except that manual One-to-Many relations are
affected.
Relations that are set as automatic in the Design environment are not affected by this
command.
If all relations have been set as manual in the Design environment, this command makes it
possible to change them to be automatic, just before executing operations that need the
relation to be automatic (such as relational searches and sorts). After the operation is finished,
the relation can be changed back to manual.
Example
The following example makes all manual Many-to-One relations automatic and reverts any
previously changed One-to-Many relations:
See Also
GET AUTOMATIC RELATIONS, GET RELATION PROPERTIES, Relations, SELECTION RANGE TO
ARRAY, SELECTION TO ARRAY, SET FIELD RELATION.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET AUTOMATIC RELATIONS command lets you know if the automatic/manual status
of all manual many-to-one and one-to-many relations of the database have been modified
in the current process.
• one: This parameter returns True if a previous calll from the SET AUTOMATIC RELATIONS
command made all manual many-to-one relations automatic — for example, SET
AUTOMATIC RELATIONS(True;False).
This parameter returns False if the SET AUTOMATIC RELATIONS command has not been
called or if its previous execution did not modify manual many-to-one relations — for
example, SET AUTOMATIC RELATIONS(False;False).
• many: This parameter returns True if a previous call from the SET AUTOMATIC RELATIONS
command made all manual one-to-many relations automatic — for example, SET
AUTOMATIC RELATIONS(True;True).
This parameter returns False if the SET AUTOMATIC RELATIONS command has not been
called or if its previous execution did not modify manual one-to-many relations — for
example, SET AUTOMATIC RELATIONS(True;False).
Example
Refer to the example of the GET FIELD RELATION command.
See Also
GET FIELD RELATION, GET RELATION PROPERTIES, SET AUTOMATIC RELATIONS.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET FIELD RELATION command lets you set the automatic/manual status of each
relation of the database separately for the current process, regardless of its initial status as
defined in the Relation properties window in the Design environment.
In the one and many parameters, pass the values indicating the changing of the
automatic/manual status to be applied respectively to the specified Many-to-One and One-
to-Many relation(s). You can use the constants of the “Relations” theme:
• Do not modify (0) = Do not modify the current status of the relation(s).
• Structure configuration (1) = Use the configuration set for the relation(s) in the Structure
window of the application.
• Manual (2) = Makes the relation(s) manual for the current process.
• Automatic (3) = Makes the relation(s) automatic for the current process.
Note: Changes made using this command only apply to the current process. The
configuration of the relations set using the options in the Relation properties window is
not modified.
See Also
GET AUTOMATIC RELATIONS, GET FIELD RELATION, GET RELATION PROPERTIES, SET
AUTOMATIC RELATIONS.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET FIELD RELATION command lets you find out the automatic/manual status of the
relation starting from manyField for the current process. You can view any relation,
including automatic relations set in the Structure window.
• In manyField, pass the name of theMany table field from which the relation whose status
you want to find out originates. If no relation originates from the manyField field, the one
et many parameters return 0, an error is returned and the system variable OK is set to 0 (see
below).
• After the command is executed, the one parameter contains a value indicating whether
the Many-to-One relation specified is set as automatic:
0 = There is no relation originating from manyField. Syntax error No. 16 (“The field has
no relation”) is generated and the system variable OK is set to 0.
1 = The automatic/manual status of the Many-to-One relation specified is that set by
the Auto Relate One option in the Relation properties of the Design environment (it
has not been modified by programming).
2 = The Many-to-One relation is manual for the process.
3 = The Many-to-One relation is automatic for the process.
• After the command is executed, the many parameter contains a value indicating whether
the One-to-Many relation specified is set as automatic:
0 = There is no relation originating from manyField. Syntax error No. 16 (“The field has
no relation”) is generated and the system variable OK is set to 0.
1 = The automatic/manual status of the One-to-Many relation specified is that set by
the Auto One to Many option in the Relation properties of the Design environment (it
has not been modified by programming).
You can compare the values returned in the one and many parameters with the constants of
the “Relations” theme:
Constant Type Value
No relation Longint 0
Structure configuration Longint 1
Manual Longint 2
Automatic Longint 3
• The optional * parameter lets you “force” the reading of the current status of the relation,
even if it has not been modified by programming. In other words, when you pass the *
parameter, only the values 2 or 3 can be returned in the one and many parameters.
Example
Given the following structure:
See Also
GET AUTOMATIC RELATIONS, GET RELATION PROPERTIES, SET AUTOMATIC RELATIONS, SET
FIELD RELATION.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
RELATE ONE has two forms.
The first form, RELATE ONE(manyTable), establishes all automatic Many-to-One relations for
manyTable in the current process. This means that for each field in manyTable that has an
automatic Many-to-One relation, the command will select the related record in each related
table. This changes the current record in the related tables for the process.
The second form, RELATE ONE(manyField{;choiceField}), looks for the record related to
manyField. The relation does not need to be automatic. If it exists, RELATE ONE loads the
related record into memory, making it the current record and current selection for its table.
The optional choiceField can be specified only if manyField is an Alpha field. The choiceField
must be a field in the related table. The choiceField must be an Alpha, Numeric, Date, Time, or
Boolean field; it cannot be a text, picture, BLOB, or subtable field.
If choiceField is specified and more than one record is found in the related table, RELATE ONE
displays a selection list of records that match the value in manyField. In the list, the left
column displays related field values, and the right column displays choiceField values.
More than one record may be found if manyField ends with the wildcard character (@). If there
is only one match, the list does not appear. Specifying choiceField is the same as specifying a
wildcard choice when establishing the table relation. For information about specifying a
wildcard choice, refer to the 4th Dimension Design Reference.
Example
Let’s say you have an [Invoice] table related to a [Customers] table with two non-automatic
relations. One relation is from [Invoice]Bill to to [Customers]ID, and the other relation is from
[Invoice]Ship to to [Customers]ID.
Since both relations are to the same table, [Customers], you cannot obtain the billing and
shipment information at the same time. Therefore, displaying both addresses in a form should
be performed using variables and calls to RELATE ONE. If the [Customers] fields were displayed
instead, data from only one of the relations would be displayed.
The following two methods are the object methods for the [Invoice]Bill to and [Invoice]Ship to
fields. They are executed when the fields are entered.
See Also
OLD RELATED ONE, RELATE MANY.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
RELATE MANY has two forms.
The first form, RELATE MANY(oneTable), establishes all One-to-Many relations for oneTable. It
changes the current selection for each table that has a One-to-Many relation to oneTable. The
current selections in the Many tables depend on the current value of each related field in the
One table. Each time this command is executed, the current selections of the Many tables will
be regenerated.
The second form, RELATE MANY(oneField), establishes the One-to-Many relation for oneField. It
changes the current selection for only those tables that have relations with oneField. This
means that the related records become the current selection for the Many table.
Note: If the current selection in the One table is empty while the RELATE MANY command is
executed, it has no effect.
This form for the [Companies] table will display related records from both the [People] and
[Parts] tables.
When the People and Parts forms are displayed, the related records for both the [People] table
and the [Parts] table are loaded and become the current selections in those tables.
On the other hand, the related records are not loaded if a record for the [Companies] table is
selected programmatically. In this case, you must use the RELATE MANY command.
For example, the following method moves through each record of the [Companies] table. An
alert box is displayed for each company. The alert box shows the number of people in the
company (the number of related [People] records), and the number of parts they supply (the
number of related [Parts] records). In the example, the argument to the ALERTcommand is
printed on multiple lines for clarity.
Note that the RELATE MANY command is needed, even though the relations are automatic.
See Also
OLD RELATED MANY, RELATE ONE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CREATE RELATED ONE performs two actions. If a related record does not exist for field (that is, if
a match is not found for the current value of field), CREATE RELATED ONE creates a new related
record.
To save a value in the appropriate field, assign values to the One field from the Many field.
Call SAVE RELATED ONE to save the new record.
If a related record exists, CREATE RELATED ONE acts just like RELATE ONE and loads the related
record into memory.
See Also
SAVE RELATED ONE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SAVE RELATED ONE saves the record related to field. Execute a SAVE RELATED ONE command to
update a record created with CREATE RELATED ONE, or to save modifications to a record loaded
with RELATE ONE.
SAVE RELATED ONE does not apply to subtables, because saving the parent record automatically
saves the subrecords.
SAVE RELATED ONE will not save a locked record. When using this command, you must first be
sure that the record is unlocked. If the record is locked, the command is ignored, the record is
not saved, and no error is returned.
See Also
CREATE RELATED ONE, Locked, RELATE ONE, Triggers.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
OLD RELATED ONE operates the same way as RELATE ONE does, except that OLD RELATED ONE
uses the old value of field to establish the relation.
Note: OLD RELATED ONE uses the old value of the Many field as returned by the Old function.
For more information, see the description of the Old command.
OLD RELATED ONE loads the record previously related to the current record. The fields in that
record can then be accessed. If you want to modify this old related record and save it, you
must call SAVE RELATED ONE. Note that there is no old related record for a newly created
record.
See Also
Old, OLD RELATED MANY, RELATE ONE, SAVE RELATED ONE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
OLD RELATED MANY operates the same way RELATE MANY does, except that OLD RELATED
MANY uses the old value in the one field to establish the relation.
Note: OLD RELATED MANY uses the old value of the many field as returned by the Old
function. For more information, see the description of the Old command.
OLD RELATED MANY changes the selection of the related table, and selects the first record of
the selection as the current record.
See Also
OLD RELATED ONE, RELATE MANY.
Description
The RELATE ONE SELECTION command creates a new selection of records for the table
oneTable, based on the selection of records in the table manyTable.
This command can only be used if there is a relation from manyTable to oneTable. RELATE ONE
SELECTION can work across several levels of relations. There can be several related tables
between manyTable and oneTable. The relations can be manual or automatic.
Note: This command must not be used in the context of a transaction with record creation
(see the Using Transactions section).
Example
The following example finds all the clients whose invoices are due today.
Here is one way of creating a selection in the [Customers] table, given a selection of records in
the [Invoices] table:
See Also
QUERY, RELATE MANY SELECTION, RELATE ONE, Sets.
Description
The RELATE MANY SELECTION command generates a selection of records in the Many table,
based on a selection of records in the One table.
Notes:
- RELATE MANY SELECTION changes the current record for the One table.
- This command must not be used in the context of a transaction with record creation (see the
Using Transactions section).
Example
This example selects all invoices made to the customers whose credit is greater than or equal
to $1,000. The [Invoices] table field [Invoices]Customer ID relates to the [Customer] table field
[Customers]ID Number.
See Also
QUERY, RELATE ONE, RELATE ONE SELECTION.
A resource is data of any kind stored in a defined format in a separate file or in the resource
fork of a Macintosh file. Resources typically include data such as strings, pictures, icons and so
on. As a matter of fact, you can create and use your own kinds of resources and store whatever
data you want into them.
Originally, on Macintosh, data and resources were stored in the same file, made of a data fork
and a resource fork. The data fork of a Macintosh file is the equivalent of a file on Windows
and UNIX. The resource fork of a Macintosh file contains the Macintosh-based resources of the
file and has no direct equivalent on Windows or UNIX.
Although this feature is still supported by 4th Dimension, now under Mac OS as well as under
Windows, the resources are stored in a separate file (in the data fork on Mac OS). This
principle is managed transparently by 4th Dimension and allows direct exchange of files
between the different platforms without conversion. For example, when you create a new
database, 4th Dimension creates a file with the suffix .rsr to store the structure file resources
and a file with the suffix .4dr to store the data file resources.
Resource file management commands (Create resource file and Open resource file) can work
directly within the data fork for a better cross-platform compatibility.
Resource Files
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
No matter what platform you are using, a 4D database structure file is not the only type of file
with resources. The 4D application itself uses resources, stored in a file suffixed “.RSR”.
It is also the case for the data file of a 4D database. For example, you can lock a data file for
exclusive use with a particular structure file. This operation is done in the application
Preferences dialog box and results with the creation of the same WEDD (“WEDD” for
“wedding”) resource in both the structure and data resource files.
When you work with a 4D database, you can either work with all the currently open resource
files or with a specific resource file.
Multiple resource files can be open at the same time. This is always the case from within a 4D
database. The following files are open:
• On Macintosh, the System resource file.
• On Windows, the ASIPORT.RSR file (it contains part of the Macintosh system resources).
• The 4D application resource file.
• The database structure resource file.
• The database data file resource file may be optionally open.
• Finally, you can open your own resource file using the command Open resource file.
This list of open resource files is called the resource files chain. You can search for a given
resource in two ways:
• If you pass a resource file reference number to a resource 4D command, the resource is
searched for in that resource file only.
• If you do not pass a resource file reference number to a 4D Resource command, the resource
is searched for in all currently open resource files, starting with the most recently opened file
and ending with the first opened file. The resource files chain is thus browsed in the reverse
order of opening—the last opened resource file is examined first.
At execution of this method, the first alert will display “The size of the array is 0 element(s)”
and the second alert will display “The size of the array is 634 element(s)”.
looks for the resource "STR#" ID=8 only in the resource file just created and open by the call to
Create resource file. Because the file is new and therefore empty, the resource is not found.
looks for the resource "STR#" ID=8 in all the currently open resource files. Since the file just
created and opened (by the call to Create resource file) does not contain that resource, STRING
LIST TO ARRAY then looks for the resource in the database structure resource file. This resource
file does not contain that resource either, so STRING LIST TO ARRAY then examines the 4D
resource file, locates the resource in this file, and populates the array with it.
Conclusion: When working with resource files, if you want to access a specific file, make sure
to pass the resource file reference number to a 4D Resources command. Otherwise, the
command assumes that you do not care which file is the source of the resources.
Resource Type
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
A resource file is highly structured. In addition to the data of each resource, it contains a
header and a map that fully describe its contents.
Important: Resource types with lowercase characters are reserved for use by the Operating
System. Avoid designating your own resource types with lowercase characters.
• A resource of type “cicn” is a resource containing a Macintosh-based color icon that you can
use and display with 4D on both Macintosh and Windows. This resource is called a color icon
resource. For example, a “cicn” resource can be associated with an item of a hierarchical list,
using the command SET LIST ITEM PROPERTIES.
In addition to the standard resource types, you can create you own types. For example, you
can decide to work with resources of type “MTYP” (for “My Type”).
To obtain the list of resource types currently present in all open resource files or in a particular
resource file, use the command RESOURCE TYPE LIST. Then, to obtain the list of a specified type
of resource present in all open resource files or in a particular resource file, use the command
RESOURCE LIST. This command returns the IDs and Names (see next section) of all resources of
a given type.
WARNING: Many applications rely on the resource type for working with its contents. For
example, while accessing a “STR#” resource, applications expect to find a string list in the
resource. Do NOT store inconsistent data in resources of standard types; this may lead to
system errors in your 4D application or in other applications.
WARNING: A resource is a highly structured file—do NOT access the file with commands other
than Resources commands. Note that nothing prevents you from passing a resource file
reference number (formally a 4D time expression like the document reference number) to a
command such as SEND PACKET. However, if you do so, you will probably damage the
resource file.
A resource has a resource name. A resource name can be up to 255 characters, and is diacritical
sensitive but not case sensitive. Resource names are useful for describing a resource, but you
access a resource using its type and ID number. Resource names are not unique; several
resources can have the same name.
A resource has a resource ID number (for short, resource ID or ID). This ID is unique within a
resource type and a resource file. For example:
• One resource file can contain a resource “ABCD” ID=1 and a resource “EFGH” ID=1.
• Two resource files can contain a resource with the same type and ID.
When you access a resource using a 4D command, you indicate its type and ID. If you do not
specify the resource file in which you are looking for this resource, the command returns the
occurrence of the resource found in the first examined resource file. Remember that resource
files are examined in the reverse order in which they have been opened.
Important: Use the range 15,000..32,767 for your own resources. Do NOT use negative
resource IDs; these are reserved for use by the Operating System. Do NOT use resource IDs in
the range 0..14,999; this range is reserved for use by 4th Dimension.
To obtain the IDs and names of a given resource type, use the command RESOURCE LIST.
To obtain the name of an individual resource, use the command Get resource name.
To change the name of and individual resource, use the command SET RESOURCE NAME.
To obtain the current (actual) number for a resource installed by a 4D component, use the
command Get component resource ID.
Resource Properties
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Besides its type, name and ID, a resource has additional properties (also called attributes). For
example, a resource may or may not be purged. This attribute tells the Operating System
whether or not a loaded resource can be purged from memory when free memory is required
for allocating another object. As shown in the previous example, when creating or copying a
resource, it can be important to not only copy the resource, but also its name and properties.
For a complete explanation of resource properties, see the description of the commands Get
resource properties and SET RESOURCE PROPERTIES.
To load a resource of any type into memory, call GET RESOURCE, which returns the contents of
the resource in a BLOB.
To add or rewrite a resource on disk, call SET RESOURCE, which sets the contents of the
resource to the contents of the BLOB you pass.
Note that these commands are provided to simplify manipulation of standard resource types;
however, they do not prevent you from using GET RESOURCE and SET RESOURCE using BLOBs.
For example, this line of code:
GET RESOURCE("TEXT";20000;vxData)
If (OK=1)
$vlOffset:=0
ALERT(BLOB to text(vxData;Text without length;$vlOffset;BLOB Size(vxData)))
End if
In addition to the Resources commands described in this chapter, there are other 4D
commands that work with resources and resource files:
• On Macintosh, DOCUMENT TO BLOB and BLOB TO DOCUMENT can load and write the
whole resource fork of a Macintosh file.
• Using the commands SET LIST ITEM PROPERTIES and SET LIST PROPERTIES, you can associate
picture or color icon resources to the items of a list or use color icon resources as nodes of a list.
• The PLAY command plays “snd ” resources on both Macintosh and Windows.
• The SET CURSOR command changes the appearance of the mouse using “CURS” resources.
See Also
BLOB Commands, Get component resource ID, OS Resource Manager Errors, Resources and 4D
Insider: an Example.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Resources are a very convenient way to deal with localization issues when developing and
maintaining a 4D database in different languages for the international market.
Let’s look at an example. The following figure shows the menu bar of a database in English:
The title and menu items of the File and Edit menus already refer to resources (they appear in
italics), while the Examples menu, that is composed of the menu items Hierarchical Lists and
Picture Menus, does not.
Using 4D Insider, it is possible to transform the literals of the menu bar into references to
strings stored in STR# resources. Let’s see how to perform this operation.
Note: 4D Insider is the 4D cross-reference, components and library management tool delivered
with 4D Developer Edition.
2. At this point, the menu bar can be transformed to refer to a STR# resource. To do so, select
Text to STR# from the 4D Insider Tools Menu:
4. Select STR# in the pop-up menu of the browser window's main list:
5. Double-click the STR# 20000 list item. Its contents are displayed in the preview area.
Now that these strings are stored in a resource, it is possible to change their values without
tampering with the logic of your database development.
7. Translate the strings to another language. In the following figure, the strings have been
translated to French:
9. At this point, quit 4D Insider and reopen the database with 4th Dimension. The 4D Design
environment Menu Bar editor now shows the menu bar with the references to the resources in
French:
Refer to the 4D Insider documentation for more information about this process. In addition,
for more information about using references to resources in menus bars as well as objects in
your database forms, refer to the 4th Dimension Design Reference manual.
In the Debugger window, you can see that the array is populated with the strings translated in
4D Insider:
See Also
Resources.
Description
The Open resource file command opens the resource file whose name or pathname you pass in
resFileName.
If you pass a filename, the file should be located in the same folder as the structure file of the
database. Pass a pathname to open a resource file located in another folder.
If you pass an empty string in resFileName, the Open File dialog box is presented. You can
then select the resource file to open. If you cancel the dialog, no resource file is open; Open
resource file returns a null DocRef and sets the OK variable to 0.
By default, the command opens the resource fork of the file passed as parameter. If it is empty,
the command opens the data fork of the file and accesses any resources found there. For more
information, refer to the Resources section.
If the resource file is opened correctly, Open resource file returns its resource file reference
number and sets the OK variable to 1. If the resource file does not exist, or if the file you try to
open is not a resource file, an error is generated.
On Macintosh, if you use the Open File dialog box, all files are presented by default. To show a
particular type of file, specify the file type in the optional fileType parameter.
On Windows, if you use the Open File dialog box, all files are presented by default. To show a
particular type of file, in fileType, pass a 1- to 3-character Windows file extension or a
Macintosh file type mapped using the command MAP FILE TYPES.
Unlike the Open document command, which opens a document with exclusive read-write
access by default, Open resource file does not prevent you from opening a resource file already
open from within the 4D session. For example, if you try to open the same document twice
using Open document, an I/O error will be returned at second attempt. On the other hand, if
you try to open a resource file already open from within the 4D session, Open resource file will
return the resource file reference number to the file already open. Even if you open a resource
file several times, you need to call CLOSE RESOURCE FILE once in order to close that file. Note
that this is permitted if the resource file is open from within the 4D session; if you try open a
resource file already opened by another application, you will get an I/O error.
WARNING
• It is forbidden to access a 4D application resource file as well as a 4D Runtime merged
database resource file.
• Although it is technically possible, you are advised not to use the database structure resource
file because your code will not work if the database is compiled and merged with 4D Runtime.
However, if you access and intend to programmatically add, delete or modify its resources, be
sure to test the environment in which you are running. With 4D Server, this will probably
lead to serious issues. For example, if you modify a resource on the server machine (via a
database method or a stored procedure), you will definitely affect the built-in 4D Server
administration service that distributes resources (transparently) to the workstations. Note that
with 4D Client, you do not have direct access to the structure file; it is located on the server
machine.
• For these reasons, if you use resources, store them in your own files.
• When working with your own resources, do NOT use negative resource IDs; they are reserved
for use by the Operating System. Do NOT use resource IDs in the range 0..14,999; this range is
reserved for use by 4th Dimension. Use the range 15,000..32,767 for your own resources.
Remember that once you have opened a resource file, it will be the first file to be searched in
the resource files chain. If you store a resource in that file with an ID in the range of system or
4D resources, this resource will be found by commands such as GET RESOURCE and also by
internal routines of the 4D application. This may be the result you want to achieve, but if you
are not sure, do NOT use these ranges, as they may lead to system errors.
• Resource files are highly structured files and cannot accept more than 2,700 resources per
file. If you work with files containing a large number of resources, it is a good idea to test that
number before adding new resources to a file. See the Count resources examples listed for the
command RESOURCE TYPE LIST.
After you have opened a resource file, you can analyze the contents of the file using the
commands RESOURCE TYPE LIST and RESOURCE LIST.
2. The following example tries to open, on Windows. the resource file “MyPrefs.rsr” located in
the database folder:
4. The following example displays the Open file dialog box showing files created by the Create
resource file command, using the default file type:
See Also
CLOSE RESOURCE FILE, Create resource file, Resources.
If the resource file is successfully opened using the Open file dialog box, the Document
variable is set to the pathname of the file.
Error Handling
If the resource file could not be opened due to a resource or I/O problem, an error is generated.
You can catch this error with an error-handling method installed using ON ERR CALL.
Description
The Create resource file command creates and opens a new resource file whose name or
pathname is passed in resFileName.
If you pass a filename, the file will be located in the same folder as the structure file of the
database. Pass a pathname to create a resource file located in another folder.
If the file already exists and is not currently open, Create resource file overrides it with a new
empty resource file. If the file is currently open, an I/O error is returned.
If you pass an empty string in resFileName, the Save File dialog box is presented. You can then
choose the location and the name of the resource file to be created. If you cancel the dialog,
no resource file is created; Create resource file returns a null DocRef and sets the OK variable to
0.
If the resource file is correctly created and opened, Create resource file returns its resource file
reference number and sets the OK variable to 1. If the resource file cannot be created, an error
is generated.
On Macintosh, the default file type for a file created with Create resource file is “res ”.
On Windows, the default file extension is “.res”. To create a file of another type:
• On Macintosh, pass the file type in the optional parameter fileType.
• On Windows, in fileType, pass a 1- to 3-character Windows file extension or a Macintosh file
type mapped using the command MAP FILE TYPES.
Remember to call CLOSE RESOURCE FILE for the resource file. Note, however, when you quit
the application (or open another database), 4D automatically closes all the resource files you
opened using Create resource file or Open resource file.
Examples
1. The following example tries to create and open on Windows, the resource file “MyPrefs.res”
located in the database folder:
On Macintosh, the example tries to create and open the file “MyPrefs”.
2. The following example tries to create and open, on Windows, the resource file “MyPrefs.rsr”
located in the database folder:
On Macintosh, the example tries to create and open the file “MyPrefs”.
See Also
CLOSE RESOURCE FILE, ON ERR CALL, Open resource file, Resources.
Error Handling
If the resource file could not be created or opened due to a resource or I/O problem, an error is
generated. You can catch this error with an error-handling method installed using ON ERR
CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The CLOSE RESOURCE FILE command closes the resource file whose reference number is passed
in resFile.
Even if you have opened the same resource file several times, you need to call CLOSE
RESOURCE FILE only once in order to close that file.
If you apply CLOSE RESOURCE FILE to the 4D application or database resource files, the
command detects it and does nothing.
If you pass an invalid resource file reference number, the command does nothing.
Remember to eventually call CLOSE RESOURCE FILE for a resource file that you have opened
using Open Resource file or Create resource file. Note that when you quit the application (or
open another database), 4D automatically closes all the resource files you opened.
Example
The following example creates a resource file, adds a string resource and closes the file:
See Also
Create resource file, Open resource file.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The RESOURCE TYPE LIST command populates the array resTypes with the resource types of the
resources present in the resource files currently open.
If you pass a valid resource file reference number in the optional parameter resFile, only the
resources from that file are listed. If you do not pass the parameter resFile, all the resources
from the current open resource files are listed.
You can predeclare the array resTypes as a String or Text array before calling RESOURCE TYPE
LIST. If you do not predeclare the array, the command creates resTypes as a Text array.
After the call, you can test the number of resource types found by applying the command Size
of array to the array resTypes.
Examples
1. The following example populates the array atResType with the resource types of the
resources present in all the resource files currently open:
2. The following example tells you if the Macintosh 4D structure file you are using contains
old 4D plug-ins that will need to be updated in order to use the database on Windows:
3. The following project method returns the number of resources present in a resource file:
C_LONGINT($0)
C_TIME($1)
$0:=0
RESOURCE TYPE LIST($atResType;$1)
For ($vlElem;1;Size of array($atResType))
RESOURCE LIST($atResType{$vlElem};$alResID;$atResName;$1)
$0:=$0+Size of array($alResID)
End for
See Also
RESOURCE LIST.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The RESOURCE LIST command populates the arrays resIDs and resNames with the resource IDs
and names of the resources whose type is passed in resType.
If you pass a valid resource file reference number in the optional parameter resFile, only the
resources from that file are listed. If you do not pass the parameter resFile, all resources from
the current open resource files are listed.
If you predeclare the arrays before calling RESOURCE LIST, you must predeclare resIDs as a
Longint array and resNames as a String or Text array. If you do not predeclare the arrays, the
command creates resIDs as a Longint array and resNames as a Text array.
After the call, you can test the number of resources found by applying the command Size of
array to the array resIDs or resNames.
Examples
1. The following example populates the arrays $alResID and $atResName with the IDs and
names of the string list resources present in the structure file of the database:
If (On Windows)
$vhStructureResFile:=Open resource file(Replace string(Structure file;".4DB";".RSR"))
Else
$vhStructureResFile:=Open resource file(Structure file)
End if
2. The following example copies the picture resources present in all currently open resource
files into the Picture Library of the database:
RESOURCE LIST("PICT";$alResID;$atResName)
Open window(50;50;550;120;5;"Copying PICT resources...")
For ($vlElem;1;Size of array($alResID))
GET PICTURE RESOURCE($alResID{$vlElem};$vgPicture)
If (OK=1)
$vsName:=$atResName{$vlElem}
If ($vsName="")
$vsName:="PICT resID="+String($alResID{$vlElem})
End if
ERASE WINDOW
GOTO XY(2;1)
MESSAGE("Adding picture “"+$vsName+"” to the DB Picture library.")
SET PICTURE TO LIBRARY($vgPicture;$alResID{$vlElem};$vsName)
End if
End for
CLOSE WINDOW
See Also
RESOURCE TYPE LIST.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The STRING LIST TO ARRAY command populates the array strings with the strings stored in the
string list ("STR#") resource whose ID is passed in resID.
If the resource is not found, the array strings is left unchanged and the OK variable is set to 0
(zero).
If you pass a valid resource file reference number in resFile, the resource is searched for in that
file only. If you do not pass resFile, the first occurrence of the resource found in the resource
files chain is returned.
Before calling STRING LIST TO ARRAY, you can predeclare the array strings as a String or Text
array. If you do not predeclare the array, the command creates strings as a Text array.
Note: Each string of a string list resource can contain up to 255 characters.
Tip: Limit your use of string list resources to those up to 32K in total size, and a maximum of a
few hundred strings per resource.
Example
See example for the command ARRAY TO STRING LIST.
See Also
ARRAY TO STRING LIST, Get indexed string, Get string resource, Get text resource.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ARRAY TO STRING LIST command creates or rewrites the string list (“STR#”) resource whose
ID is passed in resID. The contents of the resource are created from the strings passed in the
array strings. The array can be a String or Text array.
If you pass a valid resource file reference number in resFile, the resource is added to that file. If
you do not pass resFile, the resource is added to the file at the top the resource files chain (the
last resource file opened).
Note: Each string of a string list resource can contain up to 255 characters.
Tip: Limit your use of string list resources to resources no more than 32K in total size, and a
maximum of a few hundred strings maximum per resource.
See Also
SET STRING RESOURCE, SET TEXT RESOURCE, STRING LIST TO ARRAY.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get indexed string command returns one of the strings stored in the string list (“STR#”)
resource whose ID is passed in resID.
You pass the number of the string in strID. The strings of a string list resource are numbered
from 1 to N. To get all the strings (and their numbers) of a string list resource, use the
command STRING LIST TO ARRAY.
If the resource or the string within the resource is not found, an empty string is returned and
the OK variable is set to 0 (zero).
If you pass a valid resource file reference number in resFile, the resource is searched for in that
file only. If you do not pass resFile, the first occurrence of the resource found in the resource
files chain is returned.
Example
See example for the command Month of.
See Also
Get string resource, Get text resource, STRING LIST TO ARRAY.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get string resource command returns the string stored in the string (“STR ”) resource
whose ID is passed in resID.
If the resource is not found, an empty string is returned and the OK variable is set to 0 (zero).
If you pass a valid resource file reference number in resFile, the resource is searched for in that
file only. If you do not pass resFile, the first occurrence of the resource found in the resource
files chain is returned.
Example
The following example displays the contents of the string resource ID=20911, which must be
located in at least one of the currently open resource files:
See Also
Get indexed string, Get text resource, SET STRING RESOURCE, STRING LIST TO ARRAY.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET STRING RESOURCE command creates or rewrites the string (“STR ”) resource whose ID
is passed in resID with the string passed in resData.
If you pass a valid resource file reference number in resFile, the resource is added to that file. If
you do not pass resFile, the resource is added to the file at the top the resource files chain (the
last resource file opened).
See Also
Get string resource, SET TEXT RESOURCE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get text resource command returns the text stored in the text (“TEXT”) resource whose ID
is passed in resID.
If the resource is not found, empty text is returned, and the OK variable is set to 0 (zero).
If you pass a valid resource file reference number in resFile, the resource is searched for in that
file only. If you do not pass resFile, the first occurrence of the resource found in the resource
files chain is returned.
Example
The following example displays the contents of the text resource ID=20800, which must be
located in at least one of the currently open resource files:
See Also
Get indexed string, Get string resource, SET TEXT RESOURCE, STRING LIST TO ARRAY.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET TEXT RESOURCE command creates or rewrites the text (“TEXT”) resource whose ID is
passed in resID with the text or string passed in resData.
If you pass a valid resource file reference number in resFile, the resource is added to that file. If
you do not pass resFile, the resource is added to the file at the top the resource files chain (the
last resource file opened).
See Also
Get text resource, SET STRING RESOURCE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET PICTURE RESOURCE command returns in the picture field or variable resData the
picture stored in the picture (“PICT”) resource whose ID is passed in resID.
If the resource is not found, the resData parameter is left unchanged, and the OK variable is set
to 0 (zero).
If you pass a valid resource file reference number in resFile, the resource is searched for in that
file only. If you do not pass resFile, the first occurrence of the resource found in the resource
files chain is returned.
Example
See example for the command RESOURCE LIST.
See Also
GET ICON RESOURCE, ON ERR CALL, SET PICTURE RESOURCE.
Error Handling
If there is not enough memory to load the picture, an error is generated. You can catch this
error with an error-handling method installed using ON ERR CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET PICTURE RESOURCE command creates or rewrites the picture (“PICT”) resource whose
ID is passed in resID with the picture passed in resData.
If you pass a valid resource file reference number in resFile, the resource is added to that file. If
you do not pass resFile, the resource is added to the file at the top of the resource files chain
(the last resource file opened).
If you pass in resData an empty picture field or variable, the command has no effect and the
OK variable is set to 0.
Note: A picture resource can be several megabytes in size and even more.
See Also
GET PICTURE RESOURCE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET ICON RESOURCE command returns, in the picture field or variable resData, the icon
stored in the color icon (“cicn”) resource whose ID is passed in resID.
If the resource is not found, the resData parameter is left unchanged and the OK variable is set
to 0 (zero).
If you pass a valid resource file reference number in resFile, the resource is searched for in that
file only. If you do not pass resFile, the first occurrence of the resource found in the resource
files chain is returned.
Example
The following example loads, in a Picture array, the color icons located in the active 4D
application:
If (On Windows)
$vh4DResFile:=Open resource file(Replace string(Application file;".EXE";".RSR"))
Else
$vh4DResFile:=Open resource file(Application file)
End if
RESOURCE LIST("cicn";$alResID;$asResName;$vh4DResFile)
$vlNbIcons:=Size of array($alResID)
ARRAY PICTURE(ag4DIcon;$vlNbIcons)
For ($vlElem;1;$vlNbIcons)
GET ICON RESOURCE($alResID{$vlElem};ag4DIcon{$vlElem};$vh4DResFile)
End for
See Also
GET PICTURE RESOURCE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET RESOURCE command returns in the BLOB field or variable resData the contents of the
resource whose type and ID is passed in resType and resID.
If the resource is not found, the resData parameter is left unchanged and the OK variable is set
to 0 (zero).
If you pass a valid resource file reference number in resFile, the resource is searched for in that
file only. If you do not pass resFile, the first occurrence of the resource found in the resource
files chain is returned.
Platform independence: Remember that you are working with Mac OS-based resources. No
matter what the platform, internal resource data such as Long Integer is stored using
Macintosh byte ordering. On Windows, the data for standard resources (such as string list and
pictures resources) is automatically byte swapped when necessary. On the other hand, if you
create and use your own internal data structures, it is up to you to byte swap the data you
extract from the BLOB (i.e., passing Macintosh byte ordering to a command such as BLOB to
longint).
Example
See the example for the command SET RESOURCE.
Error Handling
If there is not enough memory to load the resource, an error is generated. You can catch this
error with an error-handling method installed using ON ERR CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET RESOURCE command creates or rewrites the resource whose type and ID is passed in
resType and resID with the data passed in the BLOB resData.
If you pass a valid resource file reference number in resFile, the resource is added to that file. If
you do not pass resFile, the resource is added to the file at the top of the resource files chain
(the last resource file opened).
Platform independence: Remember that you are working with Mac OS-based resources. No
matter what the platform, internal resource data such as Long Integer is stored using
Macintosh byte ordering. On Windows, the data for standard resources (such as string list and
pictures resources) is automatically byte swapped when necessary. On the other hand, if you
create and use your own internal data structures, it it up to you to byte swap the data you
write into the BLOB (i.e., passing Macintosh byte ordering to a command such as LONGINT TO
BLOB).
See Also
BLOB Commands, GET RESOURCE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get resource name command returns the name of the resource whose type is passed in
resType and whose ID number is passed in resID.
If you pass a valid resource file reference number in the parameter resFile, the resource is
searched for within that file only. If you do not pass the parameter resFile, the resource is
searched for within the current open resource files.
If the resource does not exist, Get resource name returns an empty string and sets the OK
variable to 0 (zero).
Example
The following project method copies a resource, and its resource name and attributes, from
one resource file to another:
` COPY RESOURCE Project Method
` COPY RESOURCE ( String ; Long ; Time ; Time )
` COPY RESOURCE ( resType ; resID ; srcResFile ; dstResFile )
C_STRING (4;$1)
C_LONGINT ($2)
C_TIME ($3;$4)
C_BLOB ($vxResData)
See Also
SET RESOURCE PROPERTIES.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET RESOURCE NAME command changes the name of the resource whose type is passed in
resType and whose ID number is passed in resID.
If you pass a valid resource file reference number in the parameter resFile, the resource is
searched for within that file only. If you do not pass the parameter resFile, the resource is
searched for within the current open resource files.
If the resource does not exist, SET RESOURCE NAME does nothing and sets the OK variable to 0
(zero).
WARNING: DO NOT change the names of resources that belong to 4D or to any System files. If
you do so, you may provoke undesired system errors.
Note: Resource names can be up to 255 characters in length. They are not case sensitive, but
are diacritical sensitive.
Example
See example for the command Get resource name.
See Also
SET RESOURCE PROPERTIES.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get resource properties command returns the attributes of the resource whose type is
passed in resType and whose ID number is passed in resID.
If you pass a valid resource file reference number in the parameter resFile, the resource is
searched for within that file only. If you do not pass the parameter resFile, the resource is
searched for within the current open resource files.
If the resource does not exist, Get resource properties returns 0 (zero) and sets the OK variable
to 0 (zero).
The numeric value returned by Get resource properties must be seen as a bit field value whose
bits have special meaning. For a description of the resource attributes and their effects, please
refer to the command SET RESOURCE PROPERTIES.
Example
See example for the command Get resource name.
See Also
SET RESOURCE NAME.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET RESOURCE PROPERTIES command changes the attributes of the resource whose type is
passed in resType and whose ID number is passed in resID.
If you pass a valid resource file reference number in the parameter resFile, the resource is
searched for within that file only. If you do not pass the parameter resFile, the resource is
searched for within the current open resource files.
If the resource does not exist, SET RESOURCE PROPERTIES does nothing and sets the OK variable
to 0 (zero).
The numeric value you pass in resAttr must be seen as a bit field value whose bits have special
meaning. The following predefined constants are provided by 4th Dimension:
You will usually use the attribute purgeable and, more rarely, Preloaded and Protected.
WARNING: DO NOT change the attributes of resources that belong to 4D or to any System
files. If you do so, you may provoke undesired system errors.
2. The following example makes the resource 'STR#' ID=17000 purgeable, but leaves the other
attributes unchanged:
3. The following example makes the resource 'STR#' ID=17000 preloaded and non purgeable:
4. The following example makes the resource 'STR#' ID=17000 preloaded but purgeable:
See Also
SET RESOURCE NAME.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DELETE RESOURCE command deletes the resource whose type is passed in resType and
whose ID number is passed in resID.
If you pass a valid resource file reference number in the parameter resFile, the resource is
searched for within that file only. If you do not pass resFile, the resource is searched for within
the current open resource files.
If the resource does not exist, DELETE RESOURCE does nothing and sets the OK variable to 0
(zero). If the resource is found and deleted, the OK variable is set to 1.
WARNING: DO NOT delete resources that belong to 4D or to any System files. If you do so,
you may provoke undesired system errors.
Examples
1. The following example deletes the resource "STR#" ID=20000:
` Note that this example will delete the first "STR#" ID=20000 resource
` found in any resource file currently open:
DELETE RESOURCE ("STR#";20000)
` Note that this example will delete the resource "STR#" ID=20000
` only if it is present in the resource file specified by $vhResFile:
DELETE RESOURCE ("STR#";20000;$vhResFile)
` Note also that if there is such a resource in a currently open
` resource file other than that specified by $vhResFile, this resource
` is left untouched
3. The project method DELETE RESOURCES OF TYPE deletes all the resources of the type
specified (as the second parameter) from the resource file specified (as the first parameter):
C_TIME($1)
C_STRING(4;$2)
RESOURCE LIST($2;$aiResID;$asResName;$1)
If(OK=1)
For($vlElem;1;Size of array($aiResID))
DELETE RESOURCE($2;$aiResID{$vlElem};$1)
End for
End if
` Delete all the resource of type "PREF" from the resource file $vhResFile
DELETE RESOURCES OF TYPE ($vhResFile;"PREF")
4. The project method DELETE RESOURCE BY NAME deletes a resource (of a specific type) whose
name is known:
See Also
RESOURCE LIST, SET RESOURCE PROPERTIES.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get component resource ID command allows component developers to verify that their
customized PICT or STR# resource calls will be properly executed even though the resource
numbers have been modified while installing the component.
Indeed, when 4D Insider installs a component requiring its own resources, the application can
automatically renumber these new resources if some database resources already have the same
ID.
Note: For further information on components in 4th Dimension, refer to the 4D Insider
documentation.
The command Get component resource ID reveals the current (actual) number for each resource
used by a component, based on its type and its original number.
In resType, you put the resource type (4 characters only). The Get component resource ID
command only accepts resources of type PICT and STR#.
Note: Pictures stored in the Picture Library are NOT managed by the Get component resource
ID command. To use Picture Library pictures in a 4D component, you must call the GET
PICTURE FROM LIBRARY command and pass a String (picture name) as a first parameter. For
more information, refer to the GET PICTURE FROM LIBRARY command description.
Put in originalResNum the original resource number, i.e. the number defined at the design
stage.
If no resource matches originalResNum, Get component resource ID returns the value entered
for originalResNum.
Example
The code below does not guarantee that the resource calls will be made properly:
See Also
GET SERIAL INFORMATION.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GENERATE ENCRYPTION KEYPAIR command generates a new pair of RSA keys. The security
system offered in 4D is based on keys designed to encrypt/decrypt information. They can be
used within the SSL protocol, with 4D Web server (encryption and secured communications)
and in all databases (for data encryption).
Once the command has been executed, the BLOBs passed in privKey and pubKey parameters
contain a new pair of encryption keys.
The optional parameter length can be used to set the key size (in bits). The larger the key, the
more difficult it is to break the encryption code.
However, large keys require longer execution or reply time, especially within a SSL connection.
By default (if the length parameter is omitted), the generated key size is set to 512 bits, which
is a good compromise for the security/efficiency ratio. To increase the security factor, you can
change keys more often, for example every six months.
You can generate 1024 bits keys to increase the encryption security but the Web application
connections will be slowed down.
Notes:
• If you generate keys in order to establish a SSL certificate request, pay attention to the fact
that only 512 bits and 1024 bits key length are admitted.
• Many browsers will not accept keys with a length greater than 512 bits. Additionaly, the
"Export" version of the encryption system library which is provided by default by 4D, Inc.,
does not provide support for key length greater than 512 bits. For more information, please
refer to the section Using SSL Protocol).
This encryption mode is also used by the first syntax of the ENCRYPT BLOB and DECRYPT BLOB
commands. The public key should be confidentially published.
It is possible to mix the public and private keys from two persons to encrypt information so
that the recipient is the only person to be able to decrypt them and the sender is the only
person to have encrypted them. This principle is given by the two commands ENCRYPT BLOB
and DECRYPT BLOB second syntax.
Example
See example for command ENCRYPT BLOB.
See Also
DECRYPT BLOB, ENCRYPT BLOB, GENERATE CERTIFICATE REQUEST.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GENERATE CERTIFICATE REQUEST command generates a certificate request at the PKCS
format which can be directly used by certificate authorities such as Verisign(R) . The certificate
plays an important part in the SSL secured protocol. It is sent to each browser connecting in
SSL mode. It contains the “ID card” of the Web site (made from the information entered in
the command), as well as its public key allowing the browsers to decrypt the received
information. Furthermore, the certificate contains various information added by the certificate
authority which guarantees its integrity.
Note: For more information on the SSL protocol use with 4D Web server, refer to the section
Using SSL Protocol.
The certificate request uses keypairs generated with the command GENERATE ENCRYPTION
KEYPAIR and contains various information. The certificate authority will generate its certificate
combining this request with other parameters.
Pass in privKey a BLOB containing the private key generated with the command GENERATE
ENCRYPTION KEYPAIR.
Pass in certifRequest an empty BLOB. Once the command has been executed, it contains the
certificate request at the PKCS format. You can store this request in a text file, for example
using the BLOB TO DOCUMENT command, to submit it to the certificate authority.
Warning: The private key is used to generate the request but should NOT be sent to the
certificate authority.
The arrays codeArray (long integer) and nameArray (string) should be filled respectively with
the code numbers and the information content required by the certificate authority.
The code and information content entering order does not matter, however the two arrays
must be synchronized: if the third item of the codeArray contains the value 15 (locality name),
the nameArray third item should contain this information, in our example San Jose.
Example
A “Certificate request” form contains the six fields necessary for a standard certificate request.
The Generate button creates a document on disk containing the certificate request. The
“Privatekey.txt” document containing the private key (generated with the GENERATE
ENCRYPTION KEYPAIR command) should be on the disk:
C_BLOB($vbprivateKey;$vbcertifRequest)
C_LONGINT($tableNum)
ARRAY LONGINT($tLCodes;6)
ARRAY STRING(80;$tSInfos;6)
See Also
GENERATE ENCRYPTION KEYPAIR, Using SSL Protocol.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
ALL RECORDS selects all the records of table for the current process. ALL RECORDS makes the
first record the current record and loads the record from disk. ALL RECORDS returns the records
to the default record order, which is the order in which the records are stored on disk.
Example
The following example displays all the records from the [People] table:
See Also
DISPLAY SELECTION, MODIFY SELECTION, ORDER BY, QUERY, Records in selection, Records in
table.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Records in selection returns the number of records in the current selection of table. In contrast,
Records in table returns the total number of records in the table.
Example
The following example shows a loop technique commonly used to move through all the
records in a selection. The same action can also be accomplished with the APPLY TO
SELECTION command:
See Also
Records in table.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
DELETE SELECTION deletes the current selection of records from table. If the current selection is
empty, DELETE SELECTION has no effect. After the records are deleted, the current selection is
empty. Records that are deleted during a transaction are locked to other users and other
processes until the transaction is validated or canceled.
The Completely Delete option in the Table Properties dialog box allows you to increase the
speed of deletions when DELETE SELECTION is used.
Examples
1. The following example displays all the records from the [People] table and allows the user to
select which ones to delete. The example has two sections. The first is a method to display the
records. The second is an object method for a Delete button. Here is the first method:
ALL RECORDS ([People]) ` Select all records
OUTPUT FORM ([People]; "Listing") ` Set the form to list the records
DISPLAY SELECTION ([People]) ` Display all records
The following is the object method for the Delete button, which appears in the Footer area of
the output form. The object method uses the records the user selected (the UserSet) to delete
the selection. Note that if the user did not select any records, DELETE SELECTION has no effect.
2. If a locked record is encountered during the execution of DELETE SELECTION, that record is
not deleted. Any locked records are put into a set called LockedSet. After DELETE SELECTION has
executed, you can test the LockedSet to see if any records were locked. The following loop will
execute until all the records have been deleted:
See Also
DISPLAY SELECTION, MODIFY SELECTION, Record Locking, Sets.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Selected record number returns the position of the current record within the current selection
of table.
If the selection is not empty and if the current record is within the selection, Selected record
number returns a value between 1 and Records in selection. If the selection is empty, of if there
is no current record, it returns 0 (zero).
The selected record number is not the same as the number returned by Record number, which
returns the physical record number in the table. The selected record number depends on the
current selection and the current record.
Example
The following example saves the current selected record number in a variable:
See Also
About Record Numbers, GOTO SELECTED RECORD, Records in selection.
Description
GOTO SELECTED RECORD moves to the specified record in the current selection of table and
makes that record the current record. The current selection does not change. The record
parameter is not the same as the number returned by Record number; it represents the record’s
position in the current selection. The record’s position depends on how the selection is made
and whether or not the selection is sorted.
If there are no records in the current selection, or the number is not in the selection, then
GOTO SELECTED RECORD does nothing.
If you pass 0 in position, there will no longer be a current record in table. When the “single”
selection mode is chosen, this allows you to deselect all the records in a list, in particular in
the case of included subforms.
Example
The following example loads data from the field [People]Last Name into the atNames array. An
array of long integers, called alRecNum, is filled with numbers that will represent the selected
record numbers. Both arrays are then sorted:
If the atNames array is displayed in a scrollable area, the user can click one of the items. Since
the sorting of the two arrays is synchronized, any element in alRecNum provides the selected
record number for the record whose name is stored in the corresponding element in atNames.
The following object method for atNames selects the correct record in the [People] selection,
according to the name chosen in the scrollable area:
Case of
: (Form event=On Clicked)
If (atNames#0)
GOTO SELECTED RECORD (alRecNum{atNames})
End if
End case
See Also
Selected record number.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
FIRST RECORD makes the first record of the current selection of table the current record, and
loads the record from disk. All query, selection, and sorting commands also set the current
record to the first record. If the current selection is empty or if the current record is already the
first record of the selection, FIRST RECORD has no effect.
This command is most often used after the USE SET command to begin looping through a
selection of records from the first record. However, you can also call it from a subroutine if
you are not sure whether or not the current record is actually the first.
Example
The following example makes the first record of the [Customers] table the first record:
See Also
Before selection, End selection, LAST RECORD, NEXT RECORD, PREVIOUS RECORD.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Displayed line number command only works with the On Display Detail form event. It
returns the number of the row being processed while a list of records is displayed on screen.
If Displayed line number is called other than when displaying a list, it returns 0.
If the displayed row is not empty (when it is linked to a record), the value returned by
Displayed line number is identical to the value returned by Selected record number.
Like Selected record number, Displayed line number starts at 1.This command is useful if you
want to process each row of a list form displayed on screen, including empty rows.
Example
This example lets you apply an alternating color to a list form displayed on screen, even for
rows without records:
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
NEXT RECORD moves the current record pointer to the next record in the current selection of
table for the current process. If the current selection is empty, or if Before selection or End
selection is TRUE, NEXT RECORD has no effect.
If NEXT RECORD moves the current record pointer past the end of the current selection, End
selection returns TRUE, and there is no current record. If End selection returns TRUE, use FIRST
RECORD, LAST RECORD, or GOTO SELECTED RECORD to move the current record pointer back
into the current selection.
Example
See the example for DISPLAY RECORD.
See Also
Before selection, End selection, FIRST RECORD, LAST RECORD, PREVIOUS RECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
LAST RECORD makes the last record of the current selection of table the current record and
loads the record from disk. If the current selection is empty, LAST RECORD has no effect.
Example
The following example makes the last record of the [People] table the current record:
See Also
Before selection, End selection, FIRST RECORD, NEXT RECORD, PREVIOUS RECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
PREVIOUS RECORD moves the current record pointer to the previous record in the current
selection of table for the current process. If the current selection is empty, or if Before selection
or End selection is TRUE, PREVIOUS RECORD has no effect.
If PREVIOUS RECORD moves the current record pointer before the current selection, Before
selection returns TRUE, and there is no current record. If Before selection returns TRUE, use
FIRST RECORD, LAST RECORD, or GOTO SELECTED RECORD to move the current record pointer
back into the current selection.
See Also
Before selection, End selection, FIRST RECORD, LAST RECORD, NEXT RECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Before selection returns TRUE when the current record pointer is before the first record of the
current selection of table. Before selection is commonly used to check whether or not PREVIOUS
RECORD has moved the current record pointer before the first record. If the current selection is
empty, Before selection returns TRUE.
To move the current record pointer back into the selection, use LAST RECORD, FIRST RECORD,
or GOTO SELECTED RECORD. NEXT RECORD does not move the pointer back into the selection.
Before selection also returns TRUE in the first header when a report is being printed with PRINT
SELECTION or from the Print menu. You can use the following code to test for the first header
and print a special header for the first page:
See Also
End selection, FIRST RECORD, Form event, PREVIOUS RECORD, PRINT SELECTION.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
End selection returns TRUE when the current record pointer is beyond the last record of the
current selection of table. End selection is commonly used to check whether or not NEXT
RECORD has moved the current record pointer past the last record. If the current selection is
empty, End selection returns TRUE.
To move the current record pointer back into the selection, use LAST RECORD, FIRST RECORD,
or GOTO SELECTED RECORD. PREVIOUS RECORD does not move the pointer back into the
selection.
End selection also returns TRUE in the last footer when a report is being printed with PRINT
SELECTION or from the Print menu. You can use the following code to test for the last footer
and print a special footer for the last page:
See Also
Before selection, Form event, LAST RECORD, NEXT RECORD, PRINT SELECTION.
Description
DISPLAY SELECTION displays the selection of table, using the output form. The records are
displayed in a scrollable list similar to the User environment’s list. If the user double-clicks a
record, by default the record is displayed in the current input form. The list is displayed in the
frontmost window.
To display a selection and also modify a record in the current input form after you have
double-clicked on it (as you do in the User environment window), use MODIFY SELECTION
instead of DISPLAY SELECTION.
All of the following information applies to both commands, except for the information on
modifying records.
After DISPLAY SELECTION is executed, there may not be a current record. Use a command such
as FIRST RECORD or LAST RECORD to select one.
The selectMode parameter is used to set the possibilities for selecting records in the list using
the mouse. You can pass one of the following constants of the “Form Parameters” theme in
this parameter:
• if you pass No Selection (0), it will not be possible to select a record in the list.
• if you pass Single Selection (1), only one record can be selected at a time.
The enterList parameter lets you authorize the “Enter in List” mode for the displayed list. This
lets the user select and modify the record values directly in the output form. Pass True to
enable this mode or False to disable it. By default, if you do not pass the enterList parameter,
the “Enter in List” mode is disabled.
Keep in mind that with the DISPLAY SELECTION command, this parameter only allows the
selection of the values in the list and not their modification. In fact, the DISPLAY SELECTION
command loads the records of the current selection in Read only in the current process. Only
the MODIFY SELECTION command allows the actual entry of values.
Note: The SET ENTERABLE command can be used to enable or disable the Enter in list mode on
the fly.
Custom buttons may be put in the Footer or Header area of the output form in order to
terminate the execution of the DISPLAY SELECTION command. You can use automatic Accept
or Cancel buttons to exit, or use an object method that calls ACCEPT or CANCEL. When an
output form called by the DISPLAY SELECTION command has no buttons, only the Escape
(Windows) or Esc (Mac OS) key can be used to exit the list.
During and after execution of DISPLAY SELECTION, the records that the user highlighted
(selected) are kept in a set named UserSet. The UserSet is available within the selection display
for object methods when a button is clicked or a menu item is chosen. It is also available to
the project method that called DISPLAY SELECTION after the command was completed.
2. See example #6 for the Form event command. This example shows all the tests you may
need to check in order to fully monitor the events that occur during a DISPLAY SELECTION.
3. To reproduce the functionality provided by, for example, the Queries menu of the User
environment when you use DISPLAY SELECTION or MODIFY SELECTION in the Custom Menus
environment, proceed as follows:
a. In the Design environment, create a menu bar with the menu commands you want, for
example, Show All, Query and Order By.
b. Associate this menu bar (using the “Associated menu bar” menu in the form properties
dialog box) with the output form used with DISPLAY SELECTION or MODIFY SELECTION.
c. Associate the following project methods to your menu commands:
You can also use other commands, such as PRINT SELECTION, QR REPORT, and so on, to
provide all the “standard” menu options you may want each time you display or modify a
selection in the Custom Menus environment. Thanks to the Current form table command,
these methods are generic, and the menu bar they support can be attached to any output form
of any table.
See Also
Form event, MODIFY SELECTION, Sets.
Description
MODIFY SELECTION does almost the same thing as DISPLAY SELECTION. Refer to the description
of DISPLAY SELECTION for details. The differences between the two commands are:
1. DISPLAY SELECTION and MODIFY SELECTION enable you to display the current selected
records in list mode, or in the input form when you double-click on a record. Using MODIFY
SELECTION, you can also modify the fields of the record in the input form when you double-
click on it, if it is not already in use by another process or user, or in “Enter in List” mode (if it
is authorized).
2. DISPLAY SELECTION loads the records in Read-only mode in the current process, which
means that they are not locked for writing in the other processes. MODIFY SELECTION places
all the records of the selection in Read-Write mode, which means that they are automatically
locked for writing in other processes. MODIFY SELECTION frees the records when its execution
is completed.
See Also
DISPLAY SELECTION, Form event, Sets.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
APPLY TO SELECTION applies statement to each record in the current selection of table. The
statement can be a statement or a method. If statement modifies a record of table, the modified
record is saved. If statement does not modify a record, the record is not saved. If the current
selection is empty, APPLY TO SELECTION has no effect. If the relation is automatic, the
statement can contain a field from a related table.
APPLY TO SELECTION can be used to gather information from the selection of records (for
example, a total), or to modify a selection (for example, changing the first letter of a field to
uppercase). If this command is used within a transaction, all changes can be undone if the
transaction is canceled.
4D Server: The server does not execute any of the commands that may be passed in statement.
Every record in the selection will be sent back to the local workstation to be modified.
The progress thermometer is displayed while APPLY TO SELECTION is executing. To hide it, use
MESSAGES OFF prior to the call to APPLY TO SELECTION. If the progress thermometer is
displayed, the user can cancel the operation.
Examples
1. The following example changes all the names in the table [Employees] to uppercase:
Repeat
APPLY TO SELECTION([Employees];[Employees]Last Name:=
Uppercase([Employees]Last Name))
USE SET ("LockedSet") ` Select only locked records
Until (Records in set ("LockedSet") = 0) ` Done when there are no locked records
See Also
EDIT FORMULA, Sets.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
REDUCE SELECTION creates a new selection of records for table. The command returns the first
number of records from the current selection table. REDUCE SELECTION is applied to the
current selection of table in the current process. It changes the current selection of table for
the current process; the first record of the new selection is the current record.
Notes:
- If the statement REDUCE SELECTION(0) is executed, there is no longer any selection nor any
current records in the table.
- This command must not be used in the context of a transaction with record creation (see the
Using Transactions section).
Examples
The following example first finds the correct statistics for a worldwide contest among the
dealers in over 20 countries. For each country, the 3 best dealers who have sold product worth
more than $50,000 and who are among the 100 best dealers in the world are awarded a prize.
With a few lines of code, this complex request can be executed by using indexed searches:
See Also
ORDER BY, QUERY, SCAN INDEX, Sets.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SCAN INDEX returns a selection of number records for table. If you pass <, SCAN INDEX returns
the number of records from the end of the index (high values). If you pass >, SCAN INDEX
returns the number of records from the beginning of the index (low values). This command is
very efficient because it uses the index to perform the operation.
Note: The selection obtained is not sorted.
SCAN INDEX only works on indexed fields. This command changes the current selection of the
table for the current process, but there is no current record.
If you specify more records than exist in the table, SCAN INDEX will return all the records.
Note: This command must not be used in the context of a transaction with record creation
(see the Using Transactions section).
Example
The following example mails letters to 50 of the worst customers and then to 50 of the best
customers:
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
ONE RECORD SELECT reduces the current selection of table to the current record. If no current
record exists or if the current record is not loaded into memory (special case), ONE RECORD
SELECT has no effect.
Historical Note: This command was useful to “return” a record that had been pushed and
popped from the record stack back to the selection while the selection for the table was
changed. In version 6, SET QUERY DESTINATION allows you to make a query without changing
the selection or the current record of a table; therefore, you no longer need to push and pop a
current record in order to query its table. Consequently, ONE RECORD SELECT is less useful,
unless you actually want to reduce the selection of a table to the current record.
Description
The HIGHLIGHT RECORDS command allows you to highlight records in a list form. This
operation is identical to manually selecting records in list mode by using the mouse or the
Shift+Click or Ctrl+Click (Windows) or Command+Click (Mac OS) key combinations.
The current selection is not modified.
Note: The set of “selected” records is updated after redrawing the records; that is, after
executing the entire calling method — and not just immediately after executing HIGHLIGHT
RECORDS.
The table parameter lets you designate the table where records will be “highlighted.” This
parameter can be used, in particular, to highlight the records of included subforms — which
do not belong to the current table (see below).
• If you pass a valid set name to setName, the command will be applied to the records in that
set for the table defined.
• If you omit the setName parameter, the command will only highlight the records in the
current UserSet set. This set is only managed in User mode or when calling the MODIFY
SELECTION / DISPLAY SELECTION commands. If you want to highlight the records of a
subform, you must pass a table name and set name. For more information about the UserSet
set, refer to the Sets section.
Note: Regarding included subforms, the HIGHLIGHT RECORDS command does nothing if the
Selection Mode property Multiple is not selected for the subform. In this case, to highlight a
line, you should use the GOTO SELECTED RECORD command.
Example
In an output form displayed by the MODIFY SELECTION command, you want the user to be
able to perform searches without the current selection being modified. To do this, place a
Search button in the form and associate it with the following method:
When the user clicks the button, the standard query dialog box appears. Once the search has
been validated, the records found will be highlighted without the current selection being
modified.
See Also
GET HIGHLIGHTED RECORDS, SCROLL LINES.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET HIGHLIGHTED RECORDS command stores in the set designated by the setName
parameter the highlighted records (i.e., the records highlighted by the user in the list form)
in the table passed as parameter. If the table parameter is omitted, the table of the current
form or subform is used.
In User mode or when executing the DISPLAY SELECTION / MODIFY SELECTION commands,
this command can be replaced by calling the UserSet system set which is automatically
maintained by 4D. However, since this command allows you to pick the table that will
receive highlighted records, the GET HIGHLIGHTED RECORDS command can also manage
record selections in subforms as well. In this case, subform selections can also come from
different tables. For more information about the UserSet set, refer to the Sets section.
The GET HIGHLIGHTED RECORDS command can also be called in a non-form context;
however, the returned set is empty.
The set designated by setName can be local/client, process or interprocess.
Note: In included subforms, the GET HIGHLIGHTED RECORDS command returns an empty
set if the subform does not have the Multiple Selection Mode property. In this case, to find
out the selected row, you must use the Selected record number command.
See Also
HIGHLIGHT RECORDS.
Sets offer you a powerful, swift means for manipulating record selections. Besides the ability to
create sets, relate them to the current selection, and store, load, and clear sets, 4th Dimension
offers three standard set operations:
• Intersection
• Union
• Difference.
A set is a compact representation of a selection of records. The idea of sets is closely bound to
the idea of the current selection. Sets are generally used for the following purposes:
• To save and later restore a selection when the order does not matter
• To access the selection a user made on screen (the UserSet)
• To perform a logical operation between selections.
The current selection is a list of references that points to each record that is currently selected.
The list exists in memory. Only currently selected records are in the list. A selection doesn’t
actually contain the records, but only a list of references to the records. Each reference to a
record takes 4 bytes in memory. When you work on a table, you always work with the records
in the current selection. When a selection is sorted, only the list of references is rearranged.
There is only one current selection for each table inside a process.
Like a current selection, a set represents a selection of records. A set does this by using a very
compact representation for each record. Each record is represented by one bit (one-eighth of a
byte). Operations using sets are very fast, because computers can perform operations on bits
very quickly. A set contains one bit for every record in the table, whether or not the record is
included in the set. In fact, each bit is equal to 1 or 0, depending on whether or not the record
is in the set.
Sets are very economical in terms of RAM space. The size of a set, in bytes, is always equal to
the total number of records in the table divided by 8. For example, if you create a set for a
table containing 10,000 records, the set takes up 1,250 bytes, which is about 1.2K in RAM.
There can be many sets for each table. In fact, sets can be saved to disk separately from the
database. To change a record belonging to a set, first you must use the set as the current
selection, then modify the record or records.
A set “remembers” which record was the current record at the time the set was created. The
following table compares the concepts of the current selection and of sets:
When you create a set, it belongs to the table from which you created it. Set operations can be
performed only between sets belonging to the same table.
Sets are independent from the data. This means that after changes are made to a file, a set may
no longer be accurate. There are many operations that can cause a set to be inaccurate. For
example, if you create a set of all the people from New York City, and then change the data in
one of those records to “Boston” the set would not change, because the set is just a
representation of a selection of records. Deleting records and replacing them with new ones
also changes a set, as well as compacting the data. Sets can be guaranteed to be accurate only
as long as the data in the original selection has not been changed.
• Process sets: A process set can only be accessed by the process in which it has been created.
UserSet and LockedSet are process sets. Process sets are cleared as soon as the process method
ends. Process sets do not need any special prefix in the name.
• Interprocess sets: A set is an interprocess set if the name of the set is preceded by the
symbols (<>) — a “less than” sign followed by a “greater than” sign. Note: This syntax can be
used on both Windows and Macintosh. Also, on Macintosh only, you can use the diamond
(Option-Shift-V on a US keyboard).
An interprocess set is “visible” to all the processes of the database.
Note: For more information about the use of sets in client/server mode, please refer to the 4D
Server and Sets section if the 4D Server Reference Manual.
A set can be created inside a transaction. It is possible to create a set of the records created
inside a transaction and a set of records created or modified outside of a transaction. When
the transaction ends, the set created during the transaction should be cleared, because it may
not be an accurate representation of the records, especially if the transaction was canceled.
Set Example
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The following example deletes duplicate records from a table which contains information
about people. A For...End for loop moves through all the records, comparing the current record
to the previous record. If the name, address, and zip code are the same, then the record is
added to a set. At the end of the loop, the set is made the current selection and the (old)
current selection is deleted:
As an alternative to immediately deleting records at the end of the method, you could display
them on screen or print them, so that a more detailed comparison can be made.
4th Dimension maintains a system set named UserSet, which automatically stores the most
recent selection of records highlighted on screen by the user. Thus, you can display a group of
records with MODIFY SELECTION or DISPLAY SELECTION, ask the user to select from among
them and turn the results of that manual selection into a selection or into a set that you name.
4D Server: Although its name does not begin with the character "$", the UserSet system set is a
client set. So, when using INTERSECTION, UNION and DIFFERENCE, make sure you compare
UserSet only to client sets.
There is only one UserSet for a process. Each table does not have its own UserSet. UserSet
becomes “owned” by a table when a selection of records is displayed for the table.
The following method illustrates how you can display records, allow the user to select some of
them, and then use UserSet to display the selected records:
` Display all records and allow user to select any number of them.
` Then display this selection by using UserSet to change the current selection.
OUTPUT FORM ([People]; "Display") ` Set the output layout
ALL RECORDS ([People]) ` Select all people
ALERT ("Press Ctrl or Command and Click to select the people required.")
DISPLAY SELECTION ([People]) ` Display the people
USE SET ("UserSet") ` Use the people that were selected
ALERT ("You chose the following people.")
DISPLAY SELECTION ([People]) ` Display the selected people
The APPLY TO SELECTION, ARRAY TO SELECTION and DELETE SELECTION commands create a set
named LockedSet when used in a multi-processing environment. LockedSet indicates which
records were locked during the execution of the command.
See Also
ADD TO SET, CLEAR SET, COPY SET, CREATE EMPTY SET, CREATE SET, DIFFERENCE,
INTERSECTION, Is in set, LOAD SET, Records in set, REMOVE FROM SET, SAVE SET, UNION, USE
SET.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CREATE EMPTY SET creates a new empty set, set, for table. You can add records to this set with
the ADD TO SET command. If a set with the same name already exists, the existing set is
cleared by the new set.
Note: You do not need to use CREATE EMPTY SET before using CREATE SET.
Example
Please refer to the examples of the Sets section.
See Also
CLEAR SET, CREATE SET.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CREATE SET creates a new set, set, for table, and places the current selection in set. The current
record pointer for the table is saved with set. If set is used with USE SET, the current selection
and current record are restored. As with all sets, there is no sorted order; when set is used, the
default order is used. If a set with the same name already exists, the existing set is cleared by
the new set.
Example
The following example creates a set after doing a search, in order to save the set to disk:
See Also
CLEAR SET, CREATE EMPTY SET.
Description
The CREATE SET FROM ARRAY command creates setName from:
• Or an array of booleans recordsArray. In this case, the values of the array indicate if each
record in the table belongs (True) or not (False) to setName.
When you use this command and pass a Longint array in recordsArray, all the numbers in the
array represent the list of record numbers that are in setName. If a number is invalid (for
example, if a record has not been created), the error -10503 is generated.
When you use this command and pass a Boolean array in recordsArray, the Nth element of the
array indicates whether the "Nth" record is contained (True) or not (False) in setName. Usually,
the number of elements in the array must equal the number of records in the table. If the
array is smaller than the number of records, only the records defined by the array will be in
the set.
Note: With a Boolean array, this command uses the elements from 0 to N-1.
If you do not pass the setName parameter or if you pass an empty string, the command will be
applied to the Userset system set.
See Also
BOOLEAN ARRAY FROM SET, CREATE SELECTION FROM ARRAY.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
USE SET makes the records in set the current selection for the table to which the set belongs.
When you create a set, the current record is “remembered” by the set. USE SET retrieves the
position of this record and makes the it the new current record. If you delete this record before
you execute USE SET, 4th Dimension selects the first record in the set as the current record.
The set commands INTERSECTION, UNION, DIFFERENCE, and ADD TO SET reset the current
record. Also, if you create a set that does not contain the position of the current record, USE
SET selects the first record in the set as the current record.
Example
The following example uses LOAD SET to load a set of the Acme locations in New York. It then
uses USE SET to make the loaded set the current selection:
LOAD SET ([Companies]; "NY Acme"; "NYAcmeSt") ` Load the set into memory
USE SET ("NY Acme") ` Change current selection to NY Acme
CLEAR SET ("NY Acme") ` Clear the set from memory
See Also
CLEAR SET, LOAD SET.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
ADD TO SET adds the current record of table to set. The set must already exist; if it does not, an
error occurs. If a current record does not exist for Table, ADD TO SET has no effect.
See Also
REMOVE FROM SET.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
REMOVE FROM SET removes the current record of table from set. The set must already exist; if it
does not, an error occurs. If a current record does not exist for Table, REMOVE FROM SET has no
effect.
See Also
ADD TO SET.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CLEAR SET clears set from memory and frees the memory used by set. CLEAR SET does not affect
tables, selections, or records. To save a set before clearing it, use the SAVE SET command. Since
sets use memory, it is good practice to clear them when they are no longer needed.
Example
See the example for USE SET.
See Also
CREATE EMPTY SET, CREATE SET, LOAD SET.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Is in set tests whether or not the current record for the table is in set. The Is in set function
returns TRUE if the current record of the table is in set, and returns FALSE if the current record
of the table is not in set.
Example
The following example is a button object method. It tests to see whether or not the currently
displayed record is in the set of best customers:
See Also
ADD TO SET, REMOVE FROM SET.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Records in set returns the number of records in set. If set does not exist, or if there are no
records in set, Records in set returns 0.
Example
The following example displays an alert telling what percentage of the customers are rated as
the best:
See Also
Records in selection, Records in table.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
SAVE SET saves Set to document, a document on disk.
The document need not have the same name as the set. If you supply an empty string for
document, a Create File dialog box appears so that the user can enter the name of the
document. You can load a saved set with the LOAD SET command.
If the user clicks Cancel in the Save File dialog box, or if there is an error during the save
operation, the OK system variable is set to 0. Otherwise, it is set to 1.
SAVE SET is often used to save to disk the results of a time-consuming search.
Example
The following example displays the Save File dialog box, wihch the user can enter the name of
the document that contains the set:
See Also
LOAD SET.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
LOAD SET loads a set from document that was saved with the SAVE SET command.
The set that is stored in document must be from table. The set created in memory is
overwritten if it already exists.
The document parameter is the name of the disk document containing the set. The document
need not have the same name as the set. If you supply an empty string for document, an Open
File dialog box appears so that the user can choose the set to load.
Remember that a set is a representation of a selection of records at the moment that the set is
created. If the records represented by the set change, the set may no longer be accurate.
Therefore, a set loaded from disk should represent a group of records that does not change
frequently. A number of things can make a set invalid: modifying a record of the set, deleting
a record of the set, or changing the criteria that determined a set.
Example
The following example uses LOAD SET to load a set of the Acme locations in New York:
LOAD SET ([Companies]; "NY Acme"; "NYAcmeSt") ` Load the set into memory
USE SET ("NY Acme") ` Change current selection to NY Acme
CLEAR SET ("NY Acme") ` Clear the set from memory
System Variables or Sets
If the user clicks Cancel in the Open File dialog box, or there is an error during the load
operation, the OK system variable is set to 0. Otherwise, it is set to 1.
See Also
SAVE SET.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
DIFFERENCE compares set1 and set2 and excludes all records that are in set2 from the resultSet.
In other words, a record is included in the resultSet only if it is in set1, but not in set2. The
following table shows all possible results of a set Difference operation.
The result of a Difference operation is depicted here. The shaded area is the result set.
The resultSet is created by DIFFERENCE. The resultSet replaces any existing set having the same
name, including set1 and set2. Both set1 and set2 must be from the same table. The resultSet
belongs to the same table as set1 and set2.
Example
This example excludes the records that a user selects from a displayed selection. The records
are displayed on screen with the following line:
At the bottom of the list of records is a button with an object method. The object method
excludes the records that the user has selected (the set named “UserSet”), and displays the
reduced selection:
See Also
INTERSECTION, UNION.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
INTERSECTION compares set1 and set2 and selects only the records that are in both. The
following table lists all possible results of a set Intersection operation.
The graphical result of an Intersection operation is displayed here. The shaded area is the
result set.
The resultSet is created by INTERSECTION. The resultSet replaces any existing set having the
same name, including set1 and set2. Both set1 and set2 must be from the same table. The
resultSet belongs to the same table as set1 and set2.
Example
The following example finds the customers who are served by two sales representatives, Joe
and Abby. Each sales representative has a set that represents his or her customers. The
customers that are in both sets are represented by both Joe and Abby:
See Also
DIFFERENCE, UNION.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
UNION creates a set that contains all records from set1 and set2. The following table shows all
possible results of a set Union operation.
The result of a Union operation is depicted here. The shaded area is the result set.
The resultSet is created by UNION. The resultSet replaces any existing set having the same
name, including set1 and set2. Both set1 and set2 must be from the same table. The resultSet
belongs to the same table as set1 and set2. The current record for the resultSet is the current
record from Set1.
Example
This example adds records to a set of best customers. The records are displayed on screen with
the first line. After the records are displayed, a set of the best customers is loaded from disk,
and any records that the user selected (the set named “UserSet”) are added to the set. Finally,
the new set is saved on disk:
See Also
DIFFERENCE, INTERSECTION.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The COPY SET command copies the contents of the set srcSet into the set dstSet.
4D Server: In Client/Server, interprocess and process sets are maintained on the server
machine, while local sets are maintained on the client machines. COPY SET allows you to
copy sets between the two machines. See the discussion 4D Server and Sets in the 4D Server
Reference manual for more information.
Examples
1. The following example, in Client/Server, copies the local set "$SetA", maintained on the
client machine, to the process set "SetB", maintained on the server machine:
COPY SET("$SetA";"SetB")
2. The following example, in Client/Server, copies the process set "SetA", maintained on the
server machine, to the local process set "$SetB", maintained on the client machine:
COPY SET("SetA";"$SetB")
See Also
Sets.
Description
The String command returns the string form of the numeric, Date, or Time expression you
pass in expression.
If you do not pass the optional format parameter, the string is returned with the appropriate
default format. If you pass format, you can force the result string to be of a specific format.
Numeric Expressions
If expression is a numeric expression (Real, Integer, Long Integer), you can pass an optional
string format. Following are some examples:
Example Result
String(2^15) ` Use default format 32768 (Default format used here)
String(2^15;"###,##0 Inhabitants") 32,768 Inhabitants
String(1/3;"##0.00000") 0.33333
String(1/3) ` Use default format 0.3333333333333333 (Default format used here)
String(Arctan(1)*4) 3.1415926535897931 (Default format used here)
String(Arctan(1)*4;"##0.00") 3.14
String(-1;"&x") 0xFFFFFFFF
String(-1;"&$") $FFFFFFFF
String(0 ?+ 7;"&x") 0x80
String(0 ?+ 7;"&$") $80
String(0 ?+ 14;"&x") 0x4000
String(0 ?+ 14;"&$") $4000
String(Num(1=1);"True;;False") True
String(Num(1=2);"True;;False") False
Date Expressions
If expression is a Date expression, the string is returned using the default format specified in
the system (i.e., MM/DD/YY for the U.S. English language version).
You can pass an optional numeric format from the following table:
Note: The ISO Date Time format corresponds to the ISO8601 standard. This format contains a
date and a time. For example, the date May 31, 2006 at 1:20 p.m. is written 2006-05-
31T13:20:00. It is used for XML processing and with Web services. 4th Dimension does not
permit storing a date and a time in a single field. However, it is possible to handle dates in this
format using the String command.
Time Expressions
If expression is a Time expression, the string is returned using the default HH:MM:SS format.
You can pass an optional numeric format from the following table:
These examples assume that the current time is 5:30 PM and 45 seconds:
See Also
Date, Num, Time string.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Num command returns the numeric form of the String or Boolean expression you pass
in expression.
String Expressions
If string consists only of one or more alphabetic characters, Num returns a zero. If string
includes alphabetic and numeric characters, Num ignores the alphabetic characters. Thus,
Num transforms the string "a1b2c3" into the number 123.
There are three reserved characters that Num treats specially: the decimal separator in the
US English version (i.e., the period “.”) , the hyphen “-”, and “e” or “E”. These characters
are interpreted as numeric format characters.
• The decimal separator is interpreted as a decimal place and must appear embedded in a
numeric string.
• The hyphen causes the number or exponent to be negative. The hyphen must appear
before any negative numeric characters or after the “e” for an exponent. Except for the “e”
character, if a hyphen is embedded in a numeric string, the portion of the string after the
hyphen is ignored. For example, Num("123-456") returns 123, but Num("-9") returns -9.
• The e or E causes any numeric characters to its right to be interpreted as the power of an
exponent. The “e” must be embedded in a numeric string. Thus, Num("123e–2") returns
1.23.
Note that when the string includes more than on "e", conversion might give different
results under Mac OS and under Windows.
Boolean Expressions
If you pass a Boolean expression, Num returns 1 if the expression is True; otherwise, it
returns 0 (zero).
2. Here, [Client]Debt is compared with $1000. The Num command applied to these
comparisons returns 1 or 0. Multiplying 1 or 0 with a string repeats the string once or
returns the empty string. As a result, [Client]Risk gets either “Good” or “Bad”:
See Also
Logical Operators, String, String Operators.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Position returns the position of the first occurrence of find in string.
If Position locates an occurrence of find, it returns the position of the first character of the
occurrence in string.
If you ask for the position of an empty string within an empty string, Position returns zero (0).
Warning: You cannot use the @ wildcard character with Position. For example, if you pass
"abc@" in find, the command will actually look for "abc@" and not for "abc" plus any character.
Examples
1. This example illustrates the use of Position. The results, described in the comments, are
assigned to the variable vlResult.
vlResult := Position ("ll"; "Willow") ` vlResult gets 3
vlResult := Position (vtText1; vtText2) ` Returns first occurrence of vtText1 in vtText2
See Also
Comparison Operators, Substring.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Substring command returns the portion of source defined by firstChar and numChars.
The firstChar parameter points to the first character in the string to return, and numChars
specifies how many characters to return.
If firstChar plus numChars is greater than the number of characters in the string, or if numChars
is not specified, Substring returns the last character(s) in the string, starting with the character
specified by firstChar. If firstChar is greater than the number of characters in the string,
Substring returns an empty string ("").
Examples
1. This example illustrates the use of Substring. The results, described in the comments, are
assigned to the variable vsResult.
vsResult := Substring ("08/04/62"; 4; 2) ` vsResult gets "04"
vsResult := Substring ("Emergency"; 1; 6) ` vsResult gets "Emerge"
vsResult := Substring (var; 2) ` vsResult gets all characters except ` the first
2. The following project method appends the paragraphs found in the text (passed as first
parameter) to a string or text array (the pointer of which is passed as second parameter):
` EXTRACT PARAGRAPHS
` EXTRACT PARAGRAPHS ( text ; Pointer )
` EXTRACT PARAGRAPHS ( Text to parse ; -> Array of ¶s )
C_TEXT ($1)
C_POINTER ($2)
See Also
Position.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Length is used to find the length of string. Length returns the number of characters that are in
string.
Example
This example illustrates the use of Length. The results, described in the comments, are assigned
to the variable vlResult.
vlResult := Length ("Topaz") ` vlResult gets 5
vlResult := Length ("Citizen") ` vlResult gets 7
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Ascii command returns the ASCII code of character.
If there is more than one character in the string, Ascii returns the code of the first character.
The Char function is the counterpart of Ascii. It returns the character that an ASCII code
represents.
Important: Within 4D, all the text values, fields, or variables that you have not yet converted
to another ASCII map are Mac OS-encoded on both Macintosh and Windows. For more
information, see the section ASCII Codes.
Examples
1. Uppercase and lowercase characters are considered equal within a comparison. You can use
Ascii to differentiate between uppercase and lowercase characters. Thus, this line returns True:
("A" = "a")
(Ascii("A")=Ascii("a"))
2. This example returns the ASCII value of the first character of the string "ABC":
For($vlChar;1;Length(vtText))
Case of
: (vtText[[$vlChar]]=Char(Carriage return))
` Do something
: (vtText[[$vlChar]]=Char(Tab))
` Do something else
: (...)
` ...
End case
End for
When executed multiple times on large texts, this test will run faster when compiled if it is
written this way:
For($vlChar;1;Length(vtText))
$vlAscii:=Ascii(vtText[[$vlChar]])
Case of
: ($vlAscii=Carriage return)
` Do something
: ($vlAscii=Tab)
` Do something else
: (...)
` ...
End case
End for
The second piece of code runs faster for two reasons: it does only one character reference by
iteration and uses LongInt comparisons instead of string comparisons to test for carriage
returns and tabs. Use this technique when working with common ASCII codes such as CR and
TAB.
See Also
ASCII Codes, Char, Character Reference Symbols.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Char command returns the character whose ASCII code is asciiCode.
Tip: In editing a method, the command Char is commonly used to specify characters that
cannot be entered from the keyboard or that would be interpreted as an editing command in
the Method editor.
Important: Within 4D, all the text values, fields, or variables that you have not yet converted
to another ASCII map are Mac OS-encoded on both Macintosh and Windows. For more
information, see the section ASCII Codes.
Example
The following example uses Char to insert a carriage return within the text of an alert message:
ALERT("Employees: "+String(Records in table([Employees]))+Char(13)+
"Press OK to continue.")
See Also
Ascii, ASCII Codes, Character Reference Symbols.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Introduction
The character reference symbols:
are used to refer to a single character within a string. This syntax allows you to individually
address the characters of a text variable, string variable, or field.
Note: On Macintosh, you obtain the first two symbols by typing Option+"<" and Option+">".
If the character reference symbols appear on the left side of the assignment operator (:=), a
character is assigned to the referenced position in the string. For example, if vsName is not an
empty string, the following line sets the first character of vsName to uppercase:
If (vsName#"")
vsName[[1]]:=Uppercase(vsName[[1]])
End if
Otherwise, if the character reference symbols appear within an expression, they return the
character (to which they refer) as a 1-character string. For example:
` The following example tests if the last character of vtText is an At sign "@"
If (vtText # "")
If (Ascii(Substring(vtText;Length(vtText);1))=At Sign)
` ...
End if
End if
` Using the character reference syntax, you would write in a simpler manner:
If (vtText # "")
If (Ascii(vtText[[Length(vtText)]])=At Sign)
` ...
End if
End if
Example
The following project method capitalizes the first character of each word of the text received
as parameter and returns the resulting capitalized text:
ALERT(Capitalize text ("hello, my name is jane doe and i'm running for president!"))
See Also
Ascii, ASCII Codes, Char.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Uppercase takes string and returns the string with all alphabetic characters in uppercase.
Example
See the example for Lowercase.
See Also
Lowercase.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Lowercase takes string and returns the string with all alphabetic characters in lowercase.
Example
The following project method capitalizes the string or text received as parameter. For instance,
Caps ("john") would return "John".
$0:=Lowercase($1)
If (Length($0)>0)
$0[[1]]:=Uppercase($0[[1]])
End if
See Also
Uppercase.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Change string changes a group of characters in source and returns the resulting string. Change
string overlays source, with the characters in newChars, at the character described by where.
If newChars is an empty string (""), Change string returns source unchanged. Change string
always returns a string of the same length as source. If where is less than one or greater than
the length of source, Change string returns source.
Change string is different from Insert string in that it overwrites characters instead of inserting
them.
Example
The following example illustrates the use of Change string. The results are assigned to the
variable vtResult.
See Also
Delete string, Insert string, Replace string.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Insert string inserts a string into source and returns the resulting string. Insert string inserts the
string what before the character at position where.
If where is greater than the length of source, then what is appended to source. If where is less
than one (1), then what is inserted before source.
Insert string is different from Change string in that it inserts characters instead of overwriting
them.
Example
The following example illustrates the use of Insert string. The results are assigned to the
variable vtResult.
vtResult := Insert string ("The tree"; " green"; 4) ` vtResult gets "The green tree"
vtResult := Insert string ("Shut"; "o"; 3) ` vtResult gets "Shout"
vtResult := Insert string ("Indention"; "ta"; 6) ` vtResult gets "Indentation"
See Also
Change string, Delete string, Replace string.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Delete string deletes numChars from source, starting at where, and returns the resulting string.
If where is less than one, the characters are deleted from the beginning of the string.
If where plus numChars is equal to or greater than the length of source, the characters are
deleted from where to the end of source.
Example
The following example illustrates the use of Delete string. The results are assigned to the
variable vtResult.
See Also
Change string, Insert string, Replace string.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Replace string replaces howMany occurrences of oldString in source with newString.
If newString is an empty string (""), Replace string deletes each occurrence of oldString in source.
If howMany is specified, Replace string will replace only the number of occurrences of oldString
specified, starting at the first character of source. If howMany is not specified, then all
occurrences of oldString are replaced.
Examples
1. The following example illustrates the use of Replace string. The results, described in the
comments, are assigned to the variable vtResult.
See Also
Change string, Delete string, Insert string.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Mac to Win command returns a text expressed using the Windows ANSI map that is
equivalent to the text you pass in text, which is expressed using the Mac OS ASCII map.
This command expects a Text type parameter that is expressed using the Mac OS ASCII map.
Generally, when running on Windows, you do not need to use this command to convert
ASCII codes. When you copy or paste text between 4D and Windows or when you import or
export data, 4D automatically performs these conversions. However, when you use disk
read/write commands such as SEND PACKET or RECEIVE PACKET, you need to explicitly perform
ASCII conversions. This is the main purpose of the Mac to Win command.
Within 4D, all the text values, fields, or variables that you have not yet converted to another
ASCII map are Mac OS-encoded on both Macintosh and Windows. For more information, see
the section ASCII Codes.
Note: This command replaces the CR (Carriage return) characters with CRLF (Carriage return +
Line feed, ASCII codes 13 and 10) characters. Consequently, the text returned may be longer
than the original text.
Example
On Windows, when you write characters into a document using SEND PACKET, if you do not
use an output ASCII map for filtering characters from Mac OS to Windows (see USE ASCII
MAP), you need to convert the text from Mac OS to Windows yourself. You can do it this way:
` ...
SEND PACKET ($vhDocRef;Mac to Win(vtSomeText))
` ...
See Also
ASCII Codes, SEND PACKET, USE ASCII MAP, Win to Mac.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Win to Mac command returns text expressed using the Mac OS ASCII map that is
equivalent to the text you pass in Text, which is expressed using the Windows ANSI map.
This command expects a text parameter that is expressed using the Windows ANSI map.
Generally, when running on Windows, you do not need to use this command to convert
ASCII codes. When you copy or paste text between 4D and Windows or when you import or
export data, 4D automatically performs these conversions. However, when you use disk
read/write commands such as SEND PACKET or RECEIVE PACKET, you need to explicitly perform
ASCII conversions. This is the main purpose of the Win to Mac command.
Within 4D, all the text values, fields, or variables that you have not yet converted to another
ASCII map are Mac OS-encoded on both Macintosh and Windows. For more information, see
the section ASCII Codes.
Note: This command replaces the CRLF (Carriage return + Line feed, ASCII codes 13 and 10)
characters with the CR (Carriage return) characters. Consequently, the text returned may be
shorter than the original text.
Example
When you read characters from a Windows document using RECEIVE PACKET, if you do not use
an input ASCII map for filtering characters from Windows to Mac OS (see USE ASCII MAP), you
need to convert the text from Windows to Mac OS yourself. You can do it this way:
` ...
RECEIVE PACKET ($vhDocRef;vtSomeText;16*1024)
vtSomeText:=Win to Mac(vtSomeText)
` ...
See Also
ASCII Codes, Mac to Win, RECEIVE PACKET, USE ASCII MAP.
Function result String ← Text expressed using ISO Latin-1 character map
Description
The Mac to ISO command returns text equivalent to that passed in text, but expressed using
the Web characters table found in the Standard Set menu of the Web/Configuration page in
the application Preferences. By default, the ISO Latin-1 (ISO-8859-1) character set is used:
This command expects a text parameter expressed using the Mac OS ASCII map.
Generally, when running on Windows, you do not need to convert ASCII codes. When you
copy or paste text between 4D and Windows or when you import or export data, 4D
automatically performs these conversions. However, when you use disk read/write commands
such as SEND PACKET or RECEIVE PACKET, you need to explicitly invoke ASCII conversions.
Within 4D, all the text values, fields, or variables that you have not yet converted to another
ASCII map are Mac OS-encoded on both Macintosh and Windows. For more information, see
the ASCII Codes section.
On Windows, it is necessary that, in this case, you do not filter the characters using an output
filter ASCII map.
Consequently, no matter what the platform, if you want to write ISO Latin-1 HTML
documents or documents using other Web character sets on disk, you just need to convert the
text using Mac to ISO. This is the main purpose of the Mac to ISO command.
Examples
1. The following line of code converts by default the (assumed) Mac OS encoded text stored in
vtSomeText into an ISO-Latin 1 encoded text:
vtSomeText:=Mac to ISO(vtSomeText)
2. While developing a 4D Web Server application, you build HTML documents that you later
send over Intranet or Internet, using the SEND HTML FILE command. Some of these documents
have references or links to other documents.
The following project method calculates an HTML-based pathname from the Windows or
Macintosh pathname received as parameter:
C_TEXT($0;$1)
C_LONGINT($vlChar;$vlAscii)
C_STRING(31;$vsChar)
Note: The On Windows project method is listed in the System Documents section.
Once this project method is present in your database, if you want to include a list of FTP links
to documents present in a particular directory, you can write:
` ...
ARRAY STRING(31;$asDocuments;0)
DOCUMENT LIST(...;$asDocuments)
$vlNbDocuments:=Size of array($asDocuments)
jsHandler:=...
See Also
ASCII Codes, ISO to Mac, SEND HTML FILE, SEND PACKET, USE ASCII MAP.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The ISO to Mac command returns text, expressed using the Mac OS ASCII map, equivalent to
the text you pass in text, expressed using the ISO Latin-1 character map.
This command expects a text parameter expressed using the ISO Latin-1 character map.
4D converts characters received from and sent to a Web Browser. As a result, the text values
you deal with, inside a Web Connection process, are always expressed using the Mac OS ASCII
map.
Generally, when running on Windows, you do not need to convert ASCII codes. When you
copy or paste text between 4D and Windows or when you import or export data, 4D
automatically performs these conversions. However, when you use disk read/write commands
such as SEND PACKET or RECEIVE PACKET, 4D does not perform any ASCII code conversion.
Within 4D, all the text values, fields, or variables that you have not yet converted to another
ASCII map are Mac OS-encoded on both Macintosh and Windows. For more information, see
the ASCII Codes section.
On Windows, it is necessary that, in this case, you do not filter the characters using an output
filter ASCII map.
Consequently, no matter what the platform, if you want to use RECEIVE PACKET to read ISO
Latin-1 HTML documents from the disk, you just need to convert the text using ISO to Mac.
This is the main purpose of the ISO to Mac command.
Note: The ISO to Mac command uses the "Conversion" resource (MapC), if any.
See Also
ASCII Codes, Mac to ISO, RECEIVE PACKET, USE ASCII MAP.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Preliminary note
This command meets very specific needs related to non-Roman character sets. Its use is
very limited.
Description
The Convert case command calls the TransliterateText function of the Apple Script Manager
directly, which permits the conversion of text into different subvariants on non-Roman
systems. For a complete description of this function, please refer to the following address:
http://developer.apple.com/documentation/mac/Text/Text-402.html
The parameters of this command correspond to those of the TransliterateText function. Note
that 4D uses the smSystemScript scriptCode.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The commands in this theme return a description of the database structure. They return the
number of tables, the number of fields in each table, the names of the tables and fields, and
the type and properties of each field.
Determining the database structure is extremely useful when you are developing and using
groups of project methods and forms that can be copied into different databases.
The ability to read the database structure allows you to develop and use portable code.
See Also
Count fields, Count tables, Field, GET FIELD PROPERTIES, Pointers, SET INDEX, Table, Table name.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Count tables returns the number of tables in the database. Tables are numbered in the order in
which they are created.
Example
The following example builds an array, named asTables, with the names of tables defined in
the database. This array can be used as a drop-down list (or tab control, scrollable area, and so
on) to display the list of the tables, within a form:
See Also
Count fields, Table name.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Count fields command returns the number of fields in the table whose number or pointer
you pass in tableNum or tablePtr.
Example
The following project method builds the array asFields, consisting of the field names, for the
table whose pointer is received as first parameter:
$vlTable:=Table($1)
ARRAY STRING(31;asFields;Count fields($vlTable))
For ($vlField;1;Size of array(asFields))
asFields{$vlField}:=Field name($vlTable;$vlField)
End for
See Also
Count tables, Field name, GET FIELD PROPERTIES.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Table name command returns the name of the table whose number of pointer you pass in
tableNum or tablePtr.
Example
The following is an example of a generic method that displays the records of a table. The
reference to the table is passed as a pointer to the table. The Table name command is used to
include the name of the table in the title bar for the window:
SET WINDOW TITLE("Records for "+Table name($1)) ` Sets the window title
DISPLAY SELECTION($1->) ` Displays the selection
See Also
Count tables, Field name, Table.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Field name command returns the name of the field whose pointer you pass in fieldPtr or
whose table and field number you pass in tableNum and fieldNum.
Examples
1. This example sets the second element of the array FieldArray{1} to the name of the second
field in the first table. FieldArray is a two-dimensional array:
FieldArray{1}{2}:=Field name(1;2)
2. This example sets the second element of the array FieldArray{1} to the name of the field
[MyTable]MyField. FieldArray is a two-dimensional array:
FieldArray{1}{2}:=Field name(->[MyTable]MyField)
ALERT("The ID number for the field "+Field name($1)+" in the table "+
Table name(Table($1))+" has to be longer than five characters.")
See Also
Count fields, Field, Table name.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Table command has three forms:
• If you pass a table number in tableNum, Table returns a pointer to the table.
• If you pass a table pointer in aPtr, Table returns the table number of the table.
• If you pass a field pointer in aPtr, Table returns the table number of the field.
Examples
1. This example sets the tablePtr variable to a pointer to the third table of the database:
TablePtr:=Table(3)
2. Passing tablePtr (a pointer to the third table) to Table returns the number 3. The following
line sets TableNum to 3:
TableNum:=Table(TablePtr)
3. This example sets the tableNum variable to the table number of [Table3]:
TableNum:=Table(->[Table3])
4. This example sets the tableNum variable to the table number of the table to which the
[Table3]Field1 field belongs:
TableNum:=Table (->[Table3]Field1)
See Also
Count tables, Field, Pointers, Table name.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET TABLE PROPERTIES command returns the properties for the table passed in tablePtr or
tableNum. The table number or a pointer to the table can be passed as first parameter.
See Also
GET FIELD ENTRY PROPERTIES, GET FIELD PROPERTIES, GET RELATION PROPERTIES.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Field command has two forms:
• If you pass a table number in tableNum and a field number in fieldNum, Field returns a
pointer to the field.
• If you pass a field pointer in fieldPtr, Field returns the field number of the field.
Examples
1. The following example sets the fieldPtr variable to a pointer to the second field in the third
table:
FieldPtr:=Field(3; 2)
2. Passing fieldPtr (a pointer to the second field of a table) to Field returns the number 2. The
following line sets FieldNum to 2:
FieldNum:=Field(FieldPtr)
3. The following example sets the FieldNum variable to the field number of [Table3]Field2:
FieldNum:=Field(->[Table3]Field2)
See Also
Count fields, Field name, GET FIELD PROPERTIES, Table.
Description
The GET FIELD PROPERTIES command returns information about the field specified by fieldPtr
or by tableNum and fieldNum.
You either pass:
• the table and field numbers in tableNum and fieldNum, or
• a pointer to the field in fieldPtr.
After the call:
• fieldType returns the type of the field. The fieldType variable parameter can take a value
provided by the following predefined constants:
Constant Type Value
Is Alpha Field Long Integer 0
Is Text Long Integer 2
Is Real Long Integer 1
Is Integer Long Integer 8
Is LongInt Long Integer 9
Is Date Long Integer 4
Is Time Long Integer 11
Is Boolean Long Integer 6
Is Picture Long Integer 3
Is Subtable Long Integer 7
Is BLOB Long Integer 30
• The indexed parameter returns True is the field is indexed, and False if not. The value of
indexed is meaningful only for Alphanumeric, Integer, Long Integer, Real, Date, Time, and
Boolean fields.
• The unique parameter returns True if the field is set to “Unique”, else False. The Unique
attribute can be set only to indexed fields.
• The invisible parameter returns True if the field is set to “Invisible”, else False. The Invisible
attribute can be used to hide a given field in 4D standard editor (label, charts...).
Examples
1. This example sets the variables vType, vLength, vIndex, vUnique and vInvisible to the
properties for the third field of the first table:
2. This example sets the variables vType, vLength, vIndex, vUnique and vInvisible to the
properties for the field named [Table3]Field2:
See Also
Field, Field name, SET INDEX.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET FIELD ENTRY PROPERTIES command returns the data entry properties for the field
specified by tableNum and fieldNum or by fieldPtr.
You can either pass:
• table and field numbers in tableNum and fieldNum, or
• a pointer to the field in fieldPtr.
Note: This command returns the properties defined at the structure window level. Similar
properties can be defined at the form level.
See Also
GET FIELD PROPERTIES, GET RELATION PROPERTIES, GET TABLE PROPERTIES.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET RELATION PROPERTIES command returns the properties of the relation (if any) which
starts from the source field defined by tableNum and fieldNum or by fieldPtr.
Note: The autoOne and autoMany parameters will also return True if no relation starts from the
source field (in this case they return non-significant values). The value of both the oneTable
and oneField parameters allows you to make sure that a relation exists.
See Also
GET FIELD ENTRY PROPERTIES, GET FIELD PROPERTIES, GET TABLE PROPERTIES, SET AUTOMATIC
RELATIONS, SET FIELD RELATION.
Description
The SET INDEX command creates or removes the index for the field or subfield you pass in
field.
To index the field or subfield, pass TRUE in index. If the index already exists, the call has no
effect. To delete the index, pass FALSE. If the index does not exist, the call has no effect.
SET INDEX will not index locked records; it will wait until the record becomes unlocked.
Starting from version 6.5, 4D allows you to now choose between two index modes: the
“traditional” mode, which is the mode used in previous versions of 4D, and the new “fast”
mode, which in most cases allows for a significant increase in speed. For more information,
refer to the 4D Design Reference manual.
You select the index mode to use by choosing whether to pass the optional mode parameter.
The mode parameter is only used if the command is able to actually create the index (that is if
the index parameter is True).
• If you don't pass the mode parameter, the indexing will be performed in traditional mode. In
this case, since indexing is done in a separate process, the database remains available for use
during this time. If an operation that uses the index is executed while the index is being built,
the index will not be used. To determine if a field has been indexed, use the GET FIELD
PROPERTIES command.
Examples
1. The following example indexes the field [Customers]ID with the classical mode:
UNLOAD RECORD([Customers])
SET INDEX ([Customers]ID; True)
2. You want to index the [Customers]Name field with the fast mode. This field is mainly used
for queries:
2. You want to index the [Contacts]Name field with the fast mode. This field is mainly used for
adding and inserting names, but also for queries:
See Also
GET FIELD PROPERTIES, ORDER BY, QUERY.
Description
The Get database parameter command allows you to get the current value of a 4D database
parameter. When the parameter value is a character string, it is returned in the stringValue
parameter.
The selector parameter designates the parameter to get. 4th Dimension offers you the
following predefined constants, which are in the “Database Parameters” theme:
To know the values that could be returned by this function for the selectors 1 to 8 and 10 to
40, as well as the scope of each selector and whether or not any changes made are kept
between sessions, please refer to the description of the SET DATABASE PARAMETER command.
The Database Cache Size (9) selector allows you to get the current database memory cache size.
The returned value is expressed in bytes.
The Maximum Cache size is set on the “Database/Data Management” page of the Preferences.
The actual size allocated to the database cache however will depend on both the settings and
the current system resources. The Get database parameter command allows you to get the
actual size of the memory allocated to the database cache by 4D.
Note: You cannot set the database cache memory size using the language. In other words, the
Database Cache Size selector cannot be set using the SET DATABASE PARAMETER command.
When you use the WEDD Signature (36) selector with this command, the string defined as the
WEDD signature is returned in the optional stringValue parameter and the function returns 0.
C_LONGINT($ticksbtwcalls;$maxticks;$minticks;$lparams)
If (Application type=4th Dimension) ` 4D single user is used
$lparams:=Get database parameter(4th Dimension scheduler)
$ticksbtwcalls:=$lparams & 0x00ff
$maxticks:=($lparams>>8) & 0x00ff
$minticks:=($lparams>>16) & 0x00ff
End if
2. The selector 16 (IP Address to listen) lets you get the IP address on which the 4D Web server
receives HTTP requests. The following example splits up the hexadecimal value:
C_LONGINT($a;$b;$c;$d)
C_LONGINT($addr)
$addr:=Get database parameter(IP Address to listen)
$a:=($addr>>24)&0x000000ff
$b:=($addr>>16)&0x000000ff
$c:=($addr>>8)&0x000000ff
$d:=$addr&0x000000ff
See Also
DISTINCT VALUES, QUERY SELECTION, SET DATABASE PARAMETER.
Description
The SET DATABASE PARAMETER command allows you to modify various internal parameters of
the 4D database.
selector designates the database parameter to modify. 4th Dimension offers predefined
constants, which are located in the “Database Parameters” theme. The following table lists
each constant, describes its scope and indicates whether any changes made are kept between
two sessions:
value designates the value of the parameter. The value passed depends on the parameter that
you want to modify. Here are the possible values for each selector:
Note: An additional selector can be used with the Get database parameter command: Database
Cache Size (9). This selector cannot be used with the SET DATABASE PARAMETER command. For
more information, please refer to the description of the Get database parameter command.
Note: The operation of selector 12 (4D Client Scheduler) differs according to whether the SET
DATABASE PARAMETER command is executed on the server machine or on the client machine:
- If the command is executed on the server machine, the new value will be applied to all the
client machines that connect to it subsequently.
- If the command is executed on the client machine, the new value is applied to the client
machine immediately as well as to all the client machines that connect to the server
subsequently.
You can use this operation to implement a dynamic and individualized management of
priority for each client machine. This consists in executing the command initially on the
client machine to be configured, then a second time on the server machine using the default
value, which will then be used for the client machines that connect to it subsequently.
This operation is in effect in 4th Dimension starting with versions 6.8.6, 2003.3 and 2004.
C_LONGINT($addr)
$addr:=($a<<24)|($b<<16)|($c<<8)|$d
SET DATABASE PARAMETER(IP Address to listen;$addr)
See also example 2. For more information on how to designate the IP address, refer to the Web
Services, Web Server Settings section.
Note: If you pass a value inferior to the high limit of the “pool of processes,” this limit is
reduced in order to match the value of the selector 18. If necessary, the low limit of the pool
(see selector 6, Minimum Web Process) is also modified.
Note: It is possible to manually enable or disable the recording of requests using the Ctrl+Alt+L
shortcut under Windows or the Command+Option+L shortcut under Mac OS.
• Selector = 33 (TCP_NODELAY)
• Possible values: 0 or 1 (0 = disable, 1 = enable)
• Description: Enabling or disabling of the TCP_NODELAY network option. This option,
which is internal to the TCP/IP protocol, controls a network communications optimization
mechanism. It can be set separately for the server machine and the client machines. By
default, the value is 1 (option enabled) on all the machines (server and clients).
In specific cases, in particular in the case of client/server connections by DSL or by VPN
(Virtual Private Network), disabling this option can noticeably improve application
performance. This operation should be carried out with caution and must be accompanied by
load testing in the different client/server configurations.
If you modify this value, it will be necessary to restart the application in order for the new
value to be taken into account.
Note: This option is provided solely for the purpose of debugging and must not be put into
production since it may lead to deterioration of the application performance and saturation of
the hard disk.
Note: When you use this selector with the Get database parameter command, the string
defined as the WEDD signature is returned in the optional stringValue parameter and the
command returns 0.
See Also
DISTINCT VALUES, Get database parameter, QUERY SELECTION.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CREATE SUBRECORD creates a new subrecord for subtable and makes the new subrecord the
current subrecord. The new subrecord is saved only when the parent record is saved. The
parent record can be saved by a command such as SAVE RECORD or by the user accepting the
record. If there is no current record, CREATE SUBRECORD has no effect. To add a new subrecord
through a subrecord input form, use ADD SUBRECORD.
Example
The following example is an object method for a button. When it is executed (that is, when
the button is clicked), it creates new subrecords for children in the [People] table. The Repeat
loop lets the user add children until the Cancel button is clicked. The form displays the
children in an subform, but will not allow direct data entry into the subtable because the
Enterable option has been turned off:
Repeat
` Get the child’s name
vChild := Request("Name (cancel when done):")
` If the user clicked OK
If (OK = 1)
` Add a new subrecord for a child
CREATE SUBRECORD([People]Children)
` Assign child’s name to the subfield
[People]Children'Name:=vChild
End if
Until (OK=0)
See Also
ADD SUBRECORD, DELETE SUBRECORD, MODIFY SUBRECORD, SAVE RECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
DELETE SUBRECORD deletes the current subrecord of subtable. If there is no current subrecord,
DELETE SUBRECORD has no effect. After the subrecord is deleted, the current subselection for
subtable is empty. As a result, DELETE SUBRECORD can’t be used to scan through a subselection
and delete selected subrecords.
The deletion of subrecords is not permanent until the parent record is saved. Deleting a parent
record automatically deletes all its subrecords.
To delete a subselection, create the subselection you want to delete, delete the first subrecord,
create the subselection again, delete the first subrecord, and so on.
Examples
1. The following example deletes all the subrecords of a subtable:
ALL SUBRECORDS([People]Children)
While (Records in subselection([People]Children)>0)
DELETE SUBRECORD([People]Children)
ALL SUBRECORDS([People]Children)
End while
See Also
ALL SUBRECORDS, QUERY SUBRECORDS, Records in subselection, SAVE RECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
ALL SUBRECORDS makes all the subrecords of subtable the current subselection. If a current
parent record does not exist, ALL SUBRECORDS has no effect. When a parent record is first
loaded, the subselection contains all subrecords. A subselection may not contain all subrecords
after ADD SUBRECORD, QUERY SUBRECORDS, or DELETE SUBRECORD is executed.
Example
The following example selects all subrecords to ensure that they are all included in the sum:
See Also
QUERY SUBRECORDS, Records in subselection.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Records in subselection returns the number of subrecords in the current subselection of
subtable. Records in subselection applies only to subrecords in the current record. It is the
subrecord equivalent of Records in selection. The result is undefined if no parent record exists.
Example
The following example selects all the subrecords and displays the number of children for the
parent record:
See Also
ALL SUBRECORDS, QUERY SUBRECORDS.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
APPLY TO SUBSELECTION applies statement to each subrecord in the current subselection of
subtable. The statement may be a statement or a method. If the statement modifies a subrecord,
the modified subrecord is written to disk only when the parent record is written. If the
subselection is empty, APPLY TO SUBSELECTION has no effect.
APPLY TO SUBSELECTION can be used to gather information from the subselection or to modify
the subselection.
Example
The following example capitalizes the first names in [People]Children:
Note: The statement has been put on several lines for clarity in documentation only.
See Also
ALL SUBRECORDS, EDIT FORMULA, QUERY SUBRECORDS, SAVE RECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
FIRST SUBRECORD makes the first subrecord of the current subselection of subtable the current
subrecord. All query, selection, and order by commands also set the current subrecord to the
first subrecord. If the current subselection is empty, FIRST SUBRECORD has no effect.
Example
The following example concatenates the first and last names in child records stored in a
subtable. It copies the names into the array atNames:
See Also
LAST SUBRECORD, NEXT SUBRECORD, PREVIOUS SUBRECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
LAST SUBRECORD makes the last subrecord of the current subselection of subtable the current
subrecord. If the current subselection is empty, LAST SUBRECORD has no effect.
Example
The following example concatenates the first and last names in child records stored in a
subtable. It copies the names into an array, called atNames. It is the same as the example for
FIRST SUBRECORD except that it moves through the subrecords from last to first:
See Also
FIRST SUBRECORD, NEXT SUBRECORD, PREVIOUS SUBRECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
NEXT SUBRECORD moves the current subrecord pointer to the next subrecord in the current
subselection of subtable. If NEXT SUBRECORD moves the pointer past the last subrecord, End
subselection returns TRUE, and there is no current subrecord. If End subselection returns TRUE,
use FIRST SUBRECORD or LAST SUBRECORD to move the pointer back into the current
subselection. If the current subselection is empty, or Before subselection returns TRUE, NEXT
SUBRECORD has no effect.
Example
See the example for FIRST SUBRECORD.
See Also
FIRST SUBRECORD, LAST SUBRECORD, PREVIOUS SUBRECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
PREVIOUS SUBRECORD moves the current subrecord pointer to the previous subrecord in the
current subselection of subtable. If PREVIOUS SUBRECORD moves the pointer before the first
subrecord, Before subselection returns TRUE, and there is no current subrecord. If Before
subselection returns TRUE, use FIRST SUBRECORD or LAST SUBRECORD to move the pointer back
into the current subselection. If the current subselection is empty, or End subselection returns
TRUE, PREVIOUS SUBRECORD has no effect.
Example
See the example for LAST SUBRECORD.
See Also
FIRST SUBRECORD, LAST SUBRECORD, NEXT SUBRECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Before subselection returns True when the current subrecord pointer is before the first
subrecord of subtable. Before subselection is used to check whether or not PREVIOUS
SUBRECORD has moved the pointer before the first subrecord. If the current subselection is
empty, Before subselection returns True.
Example
The following example is an object method for a button. When the button is clicked, the
pointer moves to the previous subrecord. If the pointer is before the first subrecord, it moves
to the last subrecord:
See Also
PREVIOUS SUBRECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
End subselection returns True when the current subrecord pointer is after the end of the
current subselection of subtable. End subselection is used to check whether or not NEXT
SUBRECORD has moved the pointer after the last subrecord. If the current subselection is
empty, End subselection returns True.
Example
The following example is an object method for a button. When the button is clicked, the
pointer moves to the next subrecord. If the pointer is after the last subrecord, it moves to the
first subrecord:
See Also
NEXT SUBRECORD.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
ORDER SUBRECORDS BY (subtable; subfield{; > or <}{; subfield2; > or <2; ...; subfieldN; > or <N})
Description
ORDER SUBRECORDS BY sorts the current subselection of subtable. It sorts only the subselection
of the subtable contained in the current parent record.
The direction parameter specifies whether to sort subfield in ascending or descending order. If
direction is the “greater than” symbol (>), the subrecords are ordered in ascending order. If
direction is the “less than” symbol (<), the subrecords are ordered in descending order.
You can specify more than one level of sort by including more subfields and sort symbols.
After the sort is completed, the first subrecord of the sorted subselection is the current
subrecord. Sorting subrecords is a dynamic process. Subrecords are never saved in their sorted
order. If neither a current record nor a higher-level subrecord exists, ORDER SUBRECORDS BY
has no effect.
If a form contains a subform that is to be printed in a fixed frame, this command needs to be
called just once before printing in the Before phase of the parent form method.
Example
The following example sorts the [Stats]Sales subtable into ascending order, based on the
SalesDollars subfield:
See Also
QUERY SUBRECORDS.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
QUERY SUBRECORDS queries subtable and creates a new subselection. This is the only
command that queries subrecords and returns a selection of subrecords. The queryFormula is
applied to each subrecord in subtable. If the formula evaluates as TRUE, the subrecord is added
to the new subselection. When the query is complete, QUERY SUBRECORDS makes the first
subrecord the current subrecord of subtable.
Remember that QUERY SUBRECORDS queries only the subrecords of the subtable contained in
the currently selected parent record, and not all the subrecords associated with the records of
the parent table. QUERY SUBRECORDS does not change the current parent record.
If neither a current record nor a higher-level subrecord exists, QUERY SUBRECORDS has no
effect.
Example
The following example queries for children older than 10 years:
See Also
ALL SUBRECORDS, ORDER SUBRECORDS BY, Records in subselection.
Introduction
All the documents and applications you use on your computer are stored as files on the hard
disk(s) connected to or mounted on your machine, or floppy disk(s) or other similar
permanent storage devices. Within 4th Dimension, we use the terms file or document to refer
to these documents and applications. However, most commands in this theme use the term
"document" because most of the time you will use them to access documents (rather than
application or system files) on disk.
A hard disk can be formatted as one or several partitions, each of which is called a volume. It
does not matter if two volumes are physically present on the same hard disk; at the 4D First
level, you will usually treat these volumes as separate and equal entities.
A volume can be located on a hard disk physically connected to your machine or mounted
over the network through a file sharing protocol such as NetBEUI (Windows) or AFP
(Macintosh). Whatever the case, when using the System Documents commands at the 4D
level, you treat all these volumes in the same way (unless you know what you are doing and
use Plug-ins to extend the capability of your application in that domain).
Each volume has a volume name. On Windows, volumes are designated by a letter followed by
a colon. Usually A: and B: are used to designate the 5 1/4 or 3 1/2 floppy drives. Usually C:
designates the volume you use for booting your system (unless you configure your PC
otherwise). Then the letters D: through Z: are used for the additional volumes connected or
mounted to your PC (CD-ROM drives, additional drives, network drives, and so on). On
Macintosh, volumes have natural names whose maximal length is 31 characters; these are the
names you see on the desktop at the Finder level.
Normally, you classify your documents into folders, which themselves can contain other
folders. It is not a good idea to accumulate hundreds or thousands of files at the same level of
a volume; it is messy and it slows down your system. On Windows, a folder is (or was) called a
directory. Folders have always been called so on the Macintosh.
To uniquely identify a document, you need to know the name of the volume and the name(s)
of the folder(s) where the document is located as well as the name of the document itself. If
you concatenate all these names, you get the pathname to the document. Within this
pathname, folder names are separated by a special character called the directory (separator)
symbol. On Windows, this character is the backslash (\); on Macintosh it is the colon (:).
On Windows, if the whole thing is located on the C: drive (volume), the pathname of the
document is:
C:\Current Work\Documents\Memos\Important Memo.TXT
Note: The \ character is also used by the method editor of 4th Dimension to designate escape
sequences. In order to avoid any interpretation problems, the editor automatically transforms
pathnames such as C:\Disk into C:\\Disk. For more information, refer to the paragraph below
titled “Specifying Document names or Document pathnames”.
On Macintosh, if the whole thing is located on the disk (volume) Internal Drive, the pathname
of the document is:
Internal Drive:Current Work:Documents:Memos:Important Memo
On Windows, the name of the document is suffixed with .TXT; we will see why in the next
section.
Whatever the platform, the full pathname of a document can be expressed as follows:
VolName DirSep { DirName DirSep { DirName DirSep { ... } } } DocName
All the documents (files) located on volumes have several characteristics, usually called
attributes or properties: the name of the document itself, the type and the creator.
On Windows, a document has a type. On Macintosh, a document has a type and a creator.
The type of a document generally indicates what the document is or what it contains. For
instance, a text document contains some text (without style variations).
On Windows, the type of a document is determined by the suffix (called the file extension)
attached to the document name. For instance, .TXT is the Windows file extension for text
documents. On Macintosh, the type of a document is determined by the file type property,
which is a 4-character signature (not displayed at the Finder level). For instance, the file type
of a text document is "TEXT".
A document is open in read/write mode, open in read-only mode or closed. Using the built-in
4D commands, a document can be opened in read/write mode by only one process at a time.
One process can open several documents, several processes can open multiple documents, you
can open the same document in read-only mode as many times as necessary, but you cannot
open the same document in read/write mode twice at a time.
You open a document with the Open document, Create document and Append document
commands. The Create document and Append document commands automatically open
documents in read/write mode. Only the Open document command lets you choose the
opening mode. Once a document is open, you can read and write characters from and to the
document (see the RECEIVE PACKET and SEND PACKET commands). When you are finished
with the document, you usually close it using the CLOSE DOCUMENT command.
All open documents are referred to using the DocRef expression returned by the Open
document, Create document and Append document commands. A DocRef uniquely identifies
an open document. It is formally an expression of the Time type. All commands working with
open documents expect DocRef as a parameter. If you pass an incorrect DocRef to one of these
commands, a file manager error occurs.
When you access (open, close, delete, rename, copy) documents, when you change the
properties of a document or when you read and write characters in a document, I/O errors
may occur. A document might not be found; it may be locked; it may be already open in write
mode. You can catch these errors with an error-handling method installed with ON ERR CALL.
Most of the errors that can occur while using system documents are described in the section
OS File Manager Errors.
The commands Open document, Create document, Append document and Select document
enable you to access a document using the standard Open or Save file dialog boxes. When you
access a document through a standard dialog, 4D returns the full pathname of the document
in the Document system variable. This system variable has to be distinguished from the
document parameter that appears in the parameter list of the commands.
Most of the routines of this section expecting a document name accept both a name or a
pathname to the document (except when signaled otherwise). If you pass a name, the
command looks for the document within the folder of the database. If you pass a pathname, it
must be valid.
If you pass a wrong name or a wrong pathname, the command generates a file manager error
that you can intercept using an ON ERR CALL method.
Warning: The maximum length of the document parameter is 255 characters. If you pass a
longer name, it will be truncated and a File manager error will be generated.
The On Windows project method listed here tells whether your database is running on
Windows:
C_BOOLEAN($0)
C_LONGINT($vlPlatform;$vlSystem;$vlMachine)
PLATFORM PROPERTIES($vlPlatform;$vlSystem;$vlMachine)
$0:=($vlPlatform=Windows)
C_INTEGER($0)
If (On Windows )
$0:=Ascii("\\")
Else
$0:=Ascii(":")
End if
$viDirSymbol:=Directory symbol
$viLen:=Length($1)
$viPos:=0
For ($viChar;$viLen;1;-1)
If (Ascii($1[[$viChar]])=$viDirSymbol)
$viPos:=$viChar
$viChar:=0
End if
End for
If ($viPos>0)
$0:=Substring($1;1;$viPos)
Else
$0:=$1
End if
If (<>vbDebugOn) ` Set this variable to True or False in the On Startup database method
If ($0="")
TRACE
End if
End if
See Also
Append document, CLOSE DOCUMENT, COPY DOCUMENT, Create document, CREATE FOLDER,
DELETE DOCUMENT, Document creator, DOCUMENT LIST, Document type, FOLDER LIST, Get
document position, GET DOCUMENT PROPERTIES, Get document size, MAP FILE TYPES, MOVE
DOCUMENT, Open document, Select document, SET DOCUMENT CREATOR, SET DOCUMENT
POSITION, SET DOCUMENT PROPERTIES, SET DOCUMENT SIZE, SET DOCUMENT TYPE, Test path
name, VOLUME ATTRIBUTES, VOLUME LIST.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Document type command returns the type of the document whose name or pathname
you pass in document.
On Windows, Document type returns the file extension of the document (i.e. 'DOC' for a
Microsoft Word document, 'EXE' for an executable file, and so on) or the corresponding Mac
OS-based 4 characters file type if this latter has been mapped with its equivalent Windows file
extension by 4th Dimension (i.e. 'TEXT' for the 'TXT' file extension) or by a prior call to MAP
FILE TYPES.
On Macintosh, Document type returns the 4-characters file type of the document (i.e. 'TEXT' for
a Text document, 'APPL' for a double-clickable application and so on).
See Also
Document creator, GET DOCUMENT PROPERTIES, MAP FILE TYPES, SET DOCUMENT TYPE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET DOCUMENT TYPE command sets the type of the document whose name or pathname
you pass in document.
See the discussion of file types in System Documents and Document type.
On Windows, this command modifies the file extension and therefore the value of document.
For example, the instruction:
SET DOCUMENT TYPE("C:\\Docs\\Invoice.asc";"TEXT")
renames the file "Invoice.asc" to "Invoice.txt". In 4D, the Macintosh "TEXT" type corresponds
to the Windows "txt" type.
If the type has no equivalent provided by 4D, you will have to pass the extension. For
example, the following instruction renames the file "Invoice.asc" to "Invoice.zip":
SET DOCUMENT TYPE("C:\\Docs\\Invoice.asc";"zip")
See Also
Document type, MAP FILE TYPES, SET DOCUMENT CREATOR, SET DOCUMENT PROPERTIES.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Document creator command returns the creator of the document whose name or
pathname you pass in document.
See Also
Document type, SET DOCUMENT CREATOR.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET DOCUMENT CREATOR command sets the creator of the document whose name or
pathname you pass in document.
See Also
Document creator, SET DOCUMENT PROPERTIES, SET DOCUMENT TYPE.
Description
The Open document command opens the document whose name or pathname you pass in
document.
If you pass an empty string in document, the Open File dialog box is presented, and you then
select the document to be open. If you cancel the dialog, no document is opened; Open
document returns a null DocRef and sets the OK variable to 0.
• If the document is correctly opened, Open document returns its document reference number
and sets the OK variable to 1.
• If the document is already open and the mode parameter is omitted, Open document opens
the document in Read mode and sets the OK variable to 1.
• If the document is already open and you try to open it in Write mode, an error is generated.
• If the document does not exist, an error is generated.
On Macintosh, if you use the Open File dialog box, all documents are presented by default. To
show another type of document, specify a document type in the optional fileType parameter.
On Windows, if you use the Open File dialog box, all types of documents *.* are presented by
default. To show another type of document, in fileType, pass a 1 to 3-character Windows file
extension or a Macintosh file type mapped using the MAP FILE TYPES command.
vhDocRef:=Open document("C:\\Letter";"WRI")
will try to open the document “C:\\Letter.WRI” on your disk. If you pass more than three
characters in fileType, Open document only takes the first three characters into account. If a
document type is not specified, Open document tries to open the document with no file
extension. If it does not find it, it tries to open the document with the .TXT extension. If it
still does not find it, it will return a “File not found” error.
If a document is open, Open document initially sets the file position at the beginning of the
document while Append document sets it at the end of the document.
Once you have opened a document, you can read and write in the document using the
RECEIVE PACKET and SEND PACKET commands that you can combine with the Get document
position and SET DOCUMENT POSITION commands in order to directly access any part of the
document.
The optional mode parameter allows you to define how document is to be opened. Four
different open file modes are possible. 4th Dimension offers the following predefined
constants, located in the "System Documents" theme:
Examples
1. The following example opens an existing document called Note, writes the string “Good-
bye” into it, and closes the document. If the document already contains the string “Hello”,
this string would be overwritten:
C_TIME(vhDoc)
vhDoc:=Open document ("Note";Read and Write) ` Open a document called Note
If (OK=1)
SEND PACKET (vhDoc"Good-bye") ` Write one word into the document
CLOSE DOCUMENT (vhDoc) ` Close the document
End if
Note: If the file defined in document is not found or if you pass an empty string in document,
an open file dialog box appears. If the user chooses a document and clicks the OK button,
document is set to the path of the document the user selected and OK is set to 1. If the user
clicked the Cancel button, OK is set to 0.
See Also
Append document, Create document.
Description
The Create document command creates a new document and returns its document reference
number.
Pass the name or full pathname of the new document in document. If document already exists
on the disk, it is overwritten. However, if document is locked or already open, an error is
generated.
If you pass an empty string in document, the Save As dialog box is displayed and you can then
enter the name of the document you want to create. If you cancel the dialog, no document is
created; Create document returns a null DocRef and sets the OK variable to 0.
If the document is correctly created and opened, Create document returns its document
reference number and sets the OK variable to 1. The system variable Document is updated and
returns the access path of the created document.
Whether or not you use the Save As dialog box, Create document creates a .TXT (Windows) or
TEXT (Macintosh) document by default. If you want to create another type of document, pass
the fileType parameter.
Once you have created and opened a document, you can write and read the document using
the SEND PACKET and RECEIVE PACKET commands that you can combine with the Get
document position and SET DOCUMENT POSITION commands in order to directly access any
part of the document.
Examples
1. The following example creates and opens a new document called Note, writes the string
“Hello” into it, and closes the document:
C_TIME(vhDoc)
vhDoc:=Create document ("Note") ` Create new document called Note
If (OK=1)
SEND PACKET(vhDoc; "Hello") ` Write one word in the document
CLOSE DOCUMENT(vhDoc) ` Close the document
End if
2. The following example creates documents with non-standard extensions under Windows:
See Also
Append document, Open document.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Append document command does the same as thing as Open document: it allows you to
open a document on disk.
The only difference is that Append document sets the file position at the end of the document
while Open document sets its at the beginning of the document.
Refer to Open document for more details about using Append document.
Example
The following example opens an existing document called Note, appends the string “and so
long” and a carriage return onto the end of the document, and closes the document. If the
document already contained the string “Good-bye”, the document would now contain the
string “Good-bye and so long”, followed by a carriage return:
C_TIME(vhDocRef)
vhDocRef:=Append document ("Note") ` Open Note document
SEND PACKET (vhDocRef;" and so long"+Char(13)) ` Append a string
CLOSE DOCUMENT (vhDocRef) ` Close the document
See Also
Create document, Open document.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CLOSE DOCUMENT closes the document specified by docRef.
Closing a document is the only way to ensure that the data written to a file is saved. You must
close all the documents you open with the commands Open document, Create document or
Append document.
Example
The following example lets the user create a new document, writes the string “Hello” into it,
and closes the document:
C_TIME(vhDocRef)
vhDocRef:=Create document ("")
If (OK=1)
SEND PACKET(vhDocRef; "Hello") ` Write one word into the document
CLOSE DOCUMENT(vhDocRef) ` Close the document
End if
See Also
Append document, Create document, Open document.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The COPY DOCUMENT command copies the document specified by sourceName to the
location specified by destinationName.
Both sourceName and destinationName can be a name referring to a document located in the
database folder or a pathname referring to a document in relation to the root level of a volume.
An error will occur if there is already a document named destinationName unless you specify
the optional * parameter instructing COPY DOCUMENT to delete and override the destination
document.
Examples
1. The following example duplicates a document in its own folder:
COPY DOCUMENT("C:\\FOLDER\\DocName";"C:\\FOLDER\\DocName2")
2. The following example copies a document to the database folder (provided C:\\FOLDER is
not the database folder):
COPY DOCUMENT("C:\\FOLDER\\DocName";"DocName")
3. The following example copies a document from one volume to another one:
COPY DOCUMENT("C:\\FOLDER\\DocName";"F:\\Archives\\DocName.OLD")
COPY DOCUMENT("C:\\FOLDER\\DocName";"C:\\FOLDER\\DocName2";*)
See Also
MOVE DOCUMENT.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The MOVE DOCUMENT command moves or renames a document.
You specify the full pathname to the document in srcPathname and the new name and/or new
location for the document in dstPathname.
Warning: Using MOVE DOCUMENT, you can move a document from and to any directory on
the same volume. If you want to move a document between two distinct volumes, use COPY
DOCUMENT to “move” the document then delete the original copy of the document using
DELETE DOCUMENT.
Examples
1. The following example renames the document DocName:
MOVE DOCUMENT("C:\\FOLDER\\DocName";"C:\\FOLDER\\NewDocName")
MOVE DOCUMENT("C:\\FOLDER1\\DocName";"C:\\FOLDER2\\NewDocName")
MOVE DOCUMENT("C:\\FOLDER1\\DocName";"C:\\FOLDER2\\DocName")
Note: In the last two examples, the destination folder "C:\\FOLDER2" must exist. The MOVE
DOCUMENT command only moves a document; it does not create folders.
See Also
COPY DOCUMENT.
Description
The DELETE DOCUMENT command deletes the document whose name you pass in document.
If the document name or the entered path name is incorrect, an error is generated. This is also
the case if you try to delete an open document.
DELETE DOCUMENT doesn’t accept an empty string argument for document. If an empty string
is used, the Open File dialog box is not displayed and an error is generated.
WARNING: DELETE DOCUMENT can delete any file on a disk. This includes documents created
with other applications as well as the applications themselves. DELETE DOCUMENT should be
used with extreme caution. Deleting a document is a permanent operation and cannot be
undone.
Examples
1. The following example deletes the document named Note:
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Function result String ← Name of selected file (first file of the list
in case of multiple selection)
Description
The Select document command displays a standard open document dialog box which
allows the user to set one or more files and returns the name and/or full access path of the
selected file(s).
The directory parameter indicates the folder whose contents are initially displayed in the
open document dialog box. You can pass three types of values:
• a text containing the full access path of the folder to display.
• an empty string ("") to display the default user folder for the current opeerating system
(“My documents” under Windows, “Documents” under Mac OS).
• a number of the memorized access path (from 1 to 32000) to display the associated folder.
As such, you can store in memory the access path of the folder opened when the user
clicked the selection button, in other words, the folder selected by the user. During the first
call of an arbitrary number (for example, 5) the command displays the default user folder
of the operating system (equivalent of passing an empty string). The user could also browse
folders on the hard disk. When the user clicks on the selection button, the access path is
memorized and associated with number 5. During future calls to number 5, the memorized
access path will be used by default. If a new location is selected, path number 5 is updated.
This mechanism lets you memorize up to 32,000 access paths. Under Windows, each path
is kept for the session only. Under Mac OS, the paths are kept by the system and remain
stored from one session to the next.
Under Windows, you can also pass a standard Mac OS type file — 4th Dimension performs
the conversion internally — or the file extensions (.txt, .exe, etc.). Please note that under
Windows, the user can “force” the display of all document types by entering *.* in the
dialog box. However, in this case, 4th Dimension will perform an additional verification of
the types of files selected: if the user selects an unauthorized file type, the command
returns an error.
If you do not want to restrict the files displayed to one or more types, pass the "*" (star) or
".*" string in fileTypes.
Pass the label that must appear in the dialog box in the title parameter. By default, if you
pass an empty string, the label “Open” is displayed.
The options parameter allows you to specify advanced functions that are allowed in an
open file dialog box. 4th Dimension provides the following pre-defined constants in the
“System Documents” theme:
Constant Type Value
Multiple files Longint 1
Package open Longint 2
Package selection Longint 4
Alias selection Longint 8
Use Sheet Window Longint 16
The optional selected parameter allows you to get the full access path (access path + name)
of every file selected by the user. The command creates, sizes and fills the array according
to the user selection. This parameter is useful when the Multiple files option is used or when
you want to find out the access path of the selected file (simply take the name of the file
returned by the command from the value of the array). If no file is selected, the array is
returned empty.
The command returns the name (name + extension under Windows) of the selected file. If
several files are selected, the command returns the name of the first file in the list of
selected files. The list of files can be obtained in the selected parameter. If no file is selected,
the command returns an empty string.
See Also
Open document, Select folder.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Test path name function checks if a document or folder whose name or pathname you
pass in pathname is present on the disk.
If a document is found, Test path name returns 1. If a folder found, Test path name returns 0.
The following predefined constant are provided by 4D:
If no document nor folder is found, Test path name returns a negative value (i.e. -43 for File
not found).
Example
The following tests if the document “Journal” is present in the folder of the database, then
creates it if it was not found:
See Also
Create document, CREATE FOLDER.
version 2004.1
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SHOW ON DISK command displays the file or folder whose pathname was passed in the
pathname parameter in a standard window of the operating system.
In a user interface, this command lets you designate the location of a specific file or folder.
By default, if pathname designates a folder, the command displays the level of the folder itself.
If you pass the optional * parameter, the command opens the folder and displays its contents
in the window. If pathname designates a file, the * parameter is ignored.
Examples
The following examples illustrate the operation of this command:
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The CREATE FOLDER command creates a folder according to the pathname you pass in
folderPath.
If you pass a name, the folder is created in the folder of the database. If you pass a pathname,
it must refer to a valid path up to the name of the folder you want to create, starting at the
root level of a volume or at the level of the database folder.
Examples
1. The following example creates the “Archives” folder in the folder of the database:
CREATE FOLDER("Archives")
2. The following example creates the Archives folder in the folder of the database, then it
creates the “January” and “February” subfolders:
CREATE FOLDER("Archives")
CREATE FOLDER("Archives\\January")
CREATE FOLDER("Archives\\February")
3. The following example creates the “Archives” folder at the root level of the C volume:
CREATE FOLDER("C:\\Archives")
4. The following example will fail if there is no “NewStuff” folder at the root level of the C
volume:
See Also
FOLDER LIST, Test path name.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Select folder command displays a dialog box that allows you to manually select a folder
and then retrieve the complete access path to that folder.
The Select folder command displays a standard dialog box to browse through the workstation’s
volumes and folders.
The optional parameter message allows you to display a message in the dialog box. In the
following examples, the message is "Select a destination folder":
Windows
The user selects a folder and then clicks the OK button (on Windows) or the Select button (on
Mac OS). The access path to the folder is then returned by the function.
• On Windows, the access path is returned in the following format:
“C:\Folder1\Folder2\SelectedFolder\”
• On Mac OS, the access path is returned in the following format:
“Hard Disk:Folder1:Folder2:SelectedFolder:”
Note: On Mac OS, depending on whether or not the name of the folder is selected in the
dialog box, the access path that is returned to you may be different.
4D Server: This function allows you to view the volumes connected to the client workstations.
It is not possible to call this function from a stored procedure.
If the user validates the dialog box, the OK system variable is set to 1. If the user clicks the
Cancel button, the OK system variable is set to 0 and the function returns an empty string.
Example
The following example allows you to select the folder in which the pictures in the picture
library will be stored:
See Also
CREATE FOLDER, FOLDER LIST.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DELETE FOLDER command deletes the folder whose name or full path has been passed in
folder.
You can detect these errors through a method installed by the ON ERR CALL command.
See Also
DELETE DOCUMENT.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The CREATE ALIAS command creates an alias (named “shortcut” under Windows) for the target
file or folder passed in targetPath. The name and location are defined by the targetPath
parameter.
An alias can be made for any kind of document or folder. The alias icon will be the same as
the target item. The icon contains a small arrow at the bottom left side. Under Mac OS, the
icon name is also displayed in italics characters.
This command does not assign a name by default, the name has to be passed in the aliasPath
parameter. If just a name is passed in this parameter, the alias is created in the current working
folder (usually the folder containing the structure file).
Note: Under Windows, the shortcuts are designated by a “.LNK” extension (invisible). If this
extension is not passed, it is automatically added by the command.
Example
Your database generates text files called “Report Number” sorted in the database folder. The
user would like to create shortcuts to these reports and to store them at a convenient location:
`Method CREATE_REPORT
C_TEXT($vtRport)
C_STRING(250;$vtpath)
C_STRING(80;$vaname)
C_TIME(vDoc)
C_INTEGER($ReportNber)
See Also
RESOLVE ALIAS.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The RESOLVE ALIAS command returns the full path to the target file or folder of the alias
(named shortcut under Windows).
See Also
CREATE ALIAS.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The VOLUME LIST command populates the Text or String array volumes with the names of the
volumes currently defined (Windows) or mounted (Macintosh) on your machine.
On Macintosh, it returns the list of the volumes visible at the Finder level.
On the other hand, on Windows, it returns the list of the volumes currently defined whether
or not each volume is physically present (i.e. the volume A:\ will be returned whether or not a
disk is actually present in the floppy drive).
Example
Using a scrollable area named asVolumes you want to display the list of the volumes defined or
mounted on your machine, you write:
Case of
: (Form event=On Load)
ARRAY STRING(31;asVolumes;0)
VOLUME LIST(asVolumes)
` ...
End case
See Also
DOCUMENT LIST, FOLDER LIST, VOLUME ATTRIBUTES.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The VOLUME ATTRIBUTES command returns, expressed in bytes, the size, the used space and
the free space for the volume whose name you pass in volume.
Note: If volume indicates a non-mounted remote volume, the OK variable is set to 0 and the
three parameters return -1.
Example
Your application includes some batch operations running the night or the week-end that store
huge temporary files on disk. To make this process as automatic and flexible as possible, you
write a routine that will automatically find the first volume whose free space is sufficient for
your temporary files. You might write the following project method:
C_STRING(31;$0)
C_STRING(255;$vsDocName)
C_LONGINT($vlNbVolumes;$vlVolume)
C_REAL($1;$vlSize;$vlUsed;$vlFree)
C_TIME($vhDocRef)
Once this project method is added to your application, you can for instance write:
See Also
VOLUME LIST.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The FOLDER LIST command populates the Text or String array directories with the names of the
folders located at the pathname you pass in pathname.
If there are no folders at the specified location, the command returns an empty array. If the
pathname you pass in pathname is invalid, FOLDER LIST generate a file manager error that you
can intercept using an ON ERR CALL method.
Warning: The maximum length of the parameter pathname is 255 characters. If you pass a
longer pathname, it will be truncated and a File manager error will be generated.
See Also
DOCUMENT LIST, VOLUME LIST.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DOCUMENT LIST command populates the Text or String array documents with the names
of the documents located at the pathname you pass in pathname.
If there are no documents at the specified location, the command returns an empty array. If
the pathname you pass in pathname is invalid, DOCUMENT LIST generates a file manager error
that you can intercept using an ON ERR CALL method.
Warning: The maximum length of the parameter pathname is 255 characters. If you pass a
longer pathname, it is truncated and a File Manager error is generated.
See Also
FOLDER LIST, VOLUME LIST.
version 3.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
MAP FILE TYPES lets you associate a Windows file extension with a Macintosh file type.
You need to call this routine only once to establish a mapping for an entire worksession with a
database. Once the call has been made, the commands Append document, Create document,
Create resource file, Open resource file and Open resource file while running on Windows will
automatically substitute the Windows file extension for the Macintosh file type you actually
pass as a parameter to the routine.
In the macOS parameter you pass a 4-character Macintosh file type. If you do not pass a 4-
character string, the command does nothing and generates an error.
In the windows parameter you pass a 1 to 3-character Windows file extension. If you do not
pass a 1 to 3-character string, the command does nothing and generates an error.
In the context parameter you pass the string that will be displayed in the List Files of Type
drop-down list of the Windows Open File dialog box. The context string is limited to 32
characters; additional characters are ignored.
IMPORTANT: Once you have mapped a Windows file extension to a Macintosh file type, you
cannot change or delete this mapping within a single work session. If you need to change a
mapping while developing and debugging a 4D application, reopen the database and remap
the file extension.
Once the call above has been made, the following code will display only Word documents in
the Open file dialog on Windows and Macintosh:
$DocRef:=Open document("";"WDBN")
If (OK=1)
` ...
End if
See Also
Append document, Create document, Create resource file, Open resource file.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
GET DOCUMENT PROPERTIES (document; locked; invisible; created on; created at; modified on;
modified at)
Description
The GET DOCUMENT PROPERTIES command returns information about the document whose
name or pathname you pass in document.
Example
You have created a documentation database and you would like to export all the records you
created in the database to documents on disk. Because the database is regularly updated you
want to write an export algorithm that create or recreate each document on disk if the
document does not exist or if the corresponding record has been modified after the document
was saved for the last time. Consequently, you need to compare the date and time of
modification of a document (if it exists) with its corresponding record.
Rather than saving both a date and time values into each record, you can save a “time stamp”
value which expresses the number of seconds elapsed between an arbitrary anterior date and
time (in this example we use Jan, 1st 1995 at 00:00:00) and the date and time when the record
was saved.
In our example, the field [Documents]Creation Stamp holds the time stamp when the record
was first created and the field [Documents]Modification Stamp holds the time stamp when the
record was last modified.
The Time stamp project method listed below calculates the time stamp for a specific date and
time or for the current date and time if no parameters are passed:
If (Count parameters=0)
$vdDate:=Current date
$vhTime:=Current time
Else
$vdDate:=$1
$vhTime:=$2
End if
$0:=(($vdDate-!01/01/95!)*86400)+$vhTime
Note: Using this method, you can encode dates and times from the 01/01/95 at 00:00:00 to
the 01/19/2063 at 03:14:07 which cover the long integer range 0 to 2^31 minus one.
C_DATE($0)
C_LONGINT($1)
$0:=!01/01/95!+($1\86400)
C_TIME($0)
C_LONGINT($1)
$0:=Time(Time string(†00:00:00†+($1%86400)))
For ensuring that the records have their time stamps correctly updated no matter the way they
are created or modified, we just need to enforce that rule using the trigger of the table
[Documents]:
Case of
: (Database event=Save New Record Event)
[Documents]Creation Stamp:=Time stamp
[Documents]Modification Stamp:=Time stamp
: (Database event=Save Existing Record Event)
[Documents]Modification Stamp:=Time stamp
End case
C_STRING(255;$vsPath;$vsDocPathName;$vsDocName)
C_LONGINT($vlDoc)
C_BOOLEAN($vbOnWindows;$vbDoIt;$vbLocked;$vbInvisible)
C_TIME($vhDocRef;$vhCreatedAt;$vhModifiedAt)
C_DATE($vdCreatedOn;$vdModifiedOn)
See Also
Document creator, Document type, SET DOCUMENT PROPERTIES.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
SET DOCUMENT PROPERTIES (document; locked; invisible; created on; created at; modified on;
modified at)
Description
The SET DOCUMENT PROPERTIES command changes the information about the document
whose name or pathname you pass in document.
The dates and times of creation and last modification are managed by the file manager of your
system each time you create or access a document. Using this command, you can change
those properties for special purpose. See example for the command GET DOCUMENT
PROPERTIES.
See Also
GET DOCUMENT PROPERTIES, SET DOCUMENT CREATOR, SET DOCUMENT TYPE.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET DOCUMENT ICON command returns in the 4D picture variable or field icon, the icon
of the file whose name is passed in filePath. The file can be of any type (executable, document,
shortcut or alias...). However, the command does not return folder icons.
filePath should contain the full pathname of the file. You can also pass the file name only, in
this case the file must be placed in the database current working directory (usually, the folder
containing the database structure file).
If you pass an empty string in filePath, the standard Open File dialog box is presented. The user
can then select the file to read. Once the dialog box is validated, the Document system variable
contains the full pathname to the selected file.
Pass in icon a 4D picture field or variable. After the command is executed, this parameter
contains the icon of the file (PICT format).
The optional size parameter allows you to set the dimensions in pixels of the returned icon.
This value actually represents the side length of the square including the icon. Icons are
usually defined in 32x32 pixels (“large icons”) or 16x16 pixels (“small icons”). If you pass 0 or
omit this parameter, the largest available icon is returned.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get document size command returns the size, expressed in bytes, of a document.
If the document is open, you pass its document reference number in document.
If the document is not open, you pass its name or pathname in document.
On Macintosh, if you do not pass the optional * parameter, the size of the data fork is
returned. If you do pass the * parameter, the size of the resource fork is returned.
See Also
Get document position, SET DOCUMENT POSITION, SET DOCUMENT SIZE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET DOCUMENT SIZE command sets the size of a document to the number of bytes you
pass in size.
If the document is open, you pass its document reference number in document.
See Also
Get document position, Get document size, SET DOCUMENT POSITION.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
This command operates only on a document currently open whose document reference
number you pass in docRef.
Get document position returns the position, starting from the beginning of the document,
where the next read (RECEIVE PACKET) or write (SEND PACKET) will occur.
See Also
RECEIVE PACKET, SEND PACKET, SET DOCUMENT POSITION.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
This command operates only on a document currently open whose document reference
number you pass in docRef.
SET DOCUMENT POSITION sets the position you pass in offset where the next read (RECEIVE
PACKET) or write (SEND PACKET) will occur.
If you omit the optional anchor parameter, the position is relative to the beginning of the
document. If you do specify the anchor parameter, you pass one of the values listed above.
Depending on the anchor you can pass positive or negative values in offset.
See Also
Get document position, RECEIVE PACKET, SEND PACKET.
version 3.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
On Windows, Screen height returns the height of 4D application window (MDI window). If
you specify the optional * parameter, Screen height returns the height of the screen.
On Macintosh, Screen height returns the height of the main screen, the screen where the
menu bar is located.
See Also
SCREEN COORDINATES, Screen width.
version 3.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
On Windows, Screen width returns the width of 4D application window (MDI window). If you
specify the optional * parameter, Screen width returns the width of the screen.
On Macintosh, Screen width returns the width of the main screen, the screen where the menu
bar is located.
See Also
SCREEN COORDINATES, Screen height.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Count screens command returns the number of screen monitors connected to your
machine.
See Also
Menu bar screen, SCREEN COORDINATES, SCREEN DEPTH, Screen height, Screen width.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SCREEN COORDINATES command returns in left, top, right, and bottom the global
coordinates of the screen specified by screen.
On Windows
Usually, you will not pass the screen parameter.
On Macintosh
If you omit the screen parameter, the command returns the coordinates of the main screen,
the screen where the menu bar is displayed.
See Also
Count screens, Menu bar screen, SCREEN DEPTH.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Screen depth command returns in depth and color information about the monitor.
• The depth of the screen is returned in depth. The depth of the screen is the exponent of the
power of 2 expressing the number of colors displayed on your monitor. For example, if your
monitor is set for 256 colors (2^8), the depth of your screen is 8.
If the monitor is set to display in color, 1 is returned in color. If the monitor is set to display
in gray scale, 0 is returned in color. Note that this value is significant on the Macintosh
platform.
• The optional parameter screen specifies the monitor for which you want to get information.
On Windows, you will not usually pass the screen parameter. On Macintosh, if you omit the
screen parameter, the command returns the depth of the main screen, the screen where the
menu bar is displayed.
Example
Your application displays many color graphics. Somewhere in your database, you could write:
SCREEN DEPTH ($vlDepth;$vlColor)
If ($vlDepth<8)
ALERT("The forms will look better if the monitor"+" was set to display 256 colors or
more.")
End if
See Also
Count screens, SET SCREEN DEPTH.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
This command does nothing on Windows.
On Macintosh, SET SCREEN DEPTH changes the depth and color/gray scale settings of the
screen whose number you pass in screen. If you omit this parameter, the command is applied
to the main screen.
For details about the values you pass in color and depth, see the description of the command
SCREEN DEPTH.
See Also
SCREEN DEPTH.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Menu bar screen returns the number of the screen where the menu bar is located.
See Also
Count screens, Menu bar height.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Menu bar height returns the height of the menu bar, expressed in pixels.
See Also
HIDE MENU BAR, Menu bar screen, SHOW MENU BAR.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The FONT LIST command populates the string or text array fonts with the names of the fonts
available on your system.
Example
In a form, you want a drop-down list that displays a list of the fonts available on your system.
The method of the drop-down list is as follows:
Case of
: (Form event=On Load)
ARRAY STRING(63;asFont;0)
FONT LIST(asFont)
` ...
End case
See Also
Font name, Font number.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Font name command returns the name of the font whose number is fontNumber. If there
is no available font with that number, the command returns an empty string.
Examples
1. To display a form object with the default system font, you write:
2. To display a form object with the default application font, you write:
See Also
FONT LIST, Font number.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Font number command returns the number of the font whose name is fontName. If there
is no font with this name, the command returns 0.
Example
Some forms in your database use the font whose name is “Kind of Special.” Somewhere in
your database, you could write:
See Also
FONT LIST, Font name.
Description
The PLATFORM PROPERTIES command returns information about the type of platform you are
running, the version and the language of the operating system, and the processor installed on
your machine.
PLATFORM PROPERTIES returns environment information in the platform, system, machine and
language parameters.
• platform indicates whether you are running a PowerPC-based Macintosh or Windows version
of 4th Dimension. This parameter returns one the following predefined constants:
• The information returned in system depends on the version of 4th Dimension you are
running.
Macintosh version
If you are running a Mac OS version of 4th Dimension, the system parameter returns a 32-bit
(Long Integer) value, for which the high level word is unused and the low level word is
structured like this:
- The high byte contains the major version number,
Note: In 4D, you can extract these values using the % (modulo) and \ (integer division)
numeric operators or the Bitwise operators.
Use the following formula to find out the Mac OS main version number:
PLATFORM PROPERTIES($vlPlatform;$vlSystem)
$vlResult:=$vlSystem\256
`If $vlResult = 8 → you are under Mac OS 8.x
`If $vlResult = 9 → you are under Mac OS 9.x
`If $vlResult = 16 → you are under Mac OS 10.x
Windows version
If you are running the Windows version of 4th Dimension, the system parameter returns a 32-
bit (Long Integer) value, the bits and bytes of which are structured as follows:
If the high level bit is set to 0, it means you are running Windows NT, Windows 2000,
Windows XP or Windows Vista. If the bit is set to 1, it means you are running Windows 95 or
Windows 98 (both obsolete).
Note: The high level bit fixes the sign of the long integer value. Therefore, in 4D, you just
need to test the sign of the value; if it is positive you are running Windows NT, Windows
2000, Windows XP or Windows Vista. You can also use the Bitwise operators.
The low byte gives the major Windows version number. If it returns 4, you are running
Windows 95, 98 or Windows NT 4. If it returns 5, you are running Windows 2000 or Windows
XP (in both cases, the sign of the value tells whether or not you are running NT/2000). If it
returns 6, you are running Windows Vista..
The next low byte gives the minor Windows version number. If you are running Windows 95,
this value is 0.
Note: In 4D, you can extract these values using the % (modulo) and \ (integer division)
numeric operators or the Bitwise operators.
Note: An updated list of Macintosh numbers is published by Apple Computer, Inc. in its
Developer and Technical documentation. New values may be added when Apple or other
manufacturers release new models of the Macintosh.
• The language parameter is used to find out the current language of the system on which the
database is running. Here is a list of the codes that can be returned in this parameter, as well
as their meanings:
Code Language
1 Arabic
2 Bulgarian
3 Catalan
4 Chinese
5 Czech
6 Danish
7 German
8 Greek
9 English
10 Spanish
11 Finnish
12 French
13 Hebrew
14 Hungarian
15 Icelandic
16 Italian
17 Japanese
18 Korean
19 Dutch
Note: If the command is not able to identify the system language, the value 9 (English) is
returned.
Example
The following project method displays an alert box showing the OS software you are using:
PLATFORM PROPERTIES($vlPlatform;$vlSystem;$vlMachine)
If (($vlPlatform<1) | ($vlPlatform>3))
$vsPlatformOS:=""
Else
End case
End if
$vsPlatformOS:=$vsPlatformOS+" version "+String($winMajVers)+"."+
String($winMinVers)
Else
$vsPlatformOS:="Mac OS™ version "
If (($vlSystem\256) = 16)
$vsPlatformOS:=$vsPlatformOS+"10"
Else
$vsPlatformOS:=$vsPlatformOS+String($vlSystem\256)
End if
$vsPlatformOS:=$vsPlatformOS+"."+String(($vlSystem\16)%16)+(("."+
String($vlSystem%16))*Num(($vlSystem%16) # 0))
End if
End if
ALERT($vsPlatformOS)
See Also
Bitwise Operators.
Description
The System folder command returns the pathname to a particular folder of the operating
system or to the active Windows or Mac OS System folder itself.
You pass in the optional type parameter a value indicating the type of system folder. 4D
provides you with the following predefined constants, placed in the “System Folder” theme:
If you omit the type parameter, the function will return the pathname to active System folder
(= constant System).
See Also
Get 4D folder, Temporary folder.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Temporary folder command returns the pathname to the current temporary folder set by
your system.
Example
See example for the command APPEND TO CLIPBOARD.
See Also
System folder.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Current machine command returns the network name of your machine, as set in the
Network Control Panel.
Example
Even if you are not running with the Client/Server version of the 4D environment, your
application can include some network services that require your machine to be correctly
configured. In the On Startup database method of your application, you write:
See Also
Current machine owner.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Current machine owner command returns the owner name of your machine, as set in the
Network Control Panel.
Example
See example for the command Current machine.
See Also
Current machine.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Gestalt command returns in value a numeric value that denotes the characteristics of your
system hardware and software, depending on the selector you pass in selector.
Important: The Gestalt Manager is part of Mac OS. On Windows, some of the selectors are also
implemented, but the usefulness of this command is limited.
For more information about the selectors that you can pass to Gestalt, refer to the Apple
Developer documentation related to the Gestalt Manager, available on-line at the following
address:
http://developer.apple.com/documentation/Carbon/Reference/Gestalt_Manager/index.html
Example
On Macintosh, using version 9.2 of Mac OS, the following code displays the alert “You're
running system version 0x0920”:
$vlErrCode:=Gestalt("sysv";$vlInfo)
If ($vlErrCode=0)
ALERT("You're running system version "+String($vlInfo;"&x"))
End if
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The LOG EVENT command allows you to add custom messages that will appear in the
Windows Log events. This service maintains a log file that receives and stores messages
coming from running applications. It therefore allows you to monitor the course of a
worksession. For more information, please refer to the 4D Design Mode manual.
For this feature to be available, Windows Log events service must be running.
You can attribute a level of importance to message, which helps you to read and understand
the log events. There are three levels of importance: Information, Warning, and Error. The
importance parameter allows you to set the level of importance of the message.
4th Dimension provides you with the following predefined constants, placed in the “Windows
Log Events” category:
If you don’t pass anything in importance or pass an incorrect value, the default value (0) is
used.
Each time the database is opened, this information will be written in Windows’ log events and
its level of importance will be 0.
Description
The SET ENVIRONMENT VARIABLE command allows you to set the value of an environment
variable under Mac OS X and Windows. It is meant to be used with the SET CGI
EXECUTABLE or LAUNCH EXTERNAL PROCESS commands.
Pass the name of the variable to define in varName and its value in varValue.
• To get the general list of environment variables and possible values, please refer to the
technical documentation of your operating system.
• To see the list of environment variables available with the SET CGI EXECUTABLE
command, please refer to the Using CGIs section in the “Web Server” chapter.
• To see the list of environment variables available with the LAUNCH EXTERNAL PROCESS
command, please refer to the documentation for this command. Note that two specific
environment variables are available for use in this context:
_4D_OPTION_CURRENT_DIRECTORY: Used to set the current directory of the external
process to be launched. In varValue, you must pass the pathname of the directory (HFS type
syntax on Mac OS and DOS on Windows).
_4D_OPTION_HIDE_CONSOLE (Windows only): Used to hide the window of the DOS
console. You should pass "true" in varValue to hide the console or "false" to display it.
These variables are valid in the current process for the next call to LAUNCH EXTERNAL
PROCESS.
Example
Refer to examples 7 and 8 of the LAUNCH EXTERNAL PROCESS command.
See Also
LAUNCH EXTERNAL PROCESS, SET CGI EXECUTABLE, Using CGIs.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The LAUNCH EXTERNAL PROCESS command allows you to launch an external process from
4th Dimension under Mac OS X and Windows.
Under Mac OS X, this command provides access to any executable application that can be
launched from the Terminal.
Note: For 4D Pack users, this command has the same functions (plus expanded features) as
the AP_Sublaunch command.
Pass the fixed file path of the application to execute, as well as any required arguments (if
necessary), in the fileName parameter.
Under Mac OS X, you can also pass the application name only; 4th Dimension will then
use the PATH environment variable to locate the executable.
Warning: This command can only launch executable applications; it cannot execute
instructions that are part of the shell (command interpreter). For example, under Mac OS it
is not possible to use this command to execute the echo instruction or indirections.
The inputStream parameter (optional) contains the stdin of the external process. Once the
command has been executed, the outputStream and errorStream parameters (if passed)
return respectively the stdout and stderr of the external process. You can use BLOB
parameters instead of strings if you manage text data of a size greater than 32 KB or binary
data (such as pictures).
1. To change permissions for a file (chmod is the Mac OS X command used to modify file
access):
2. To edit a text file (cat is the Mac OS X command used to edit files). In this example, the
full access path of the command is passed:
C_TEXT(input;output)
input:=""
LAUNCH EXTERNAL PROCESS ("/bin/cat /folder/myfile.txt";input;output)
3. To get the contents of the “Users” folder (ls -l is the Mac OS X equivalent of the dir
command in DOS):
C_TEXT($In;$Out)
LAUNCH EXTERNAL PROCESS("/bin/ls -l /Users";$In;$Out)
5. To open NotePad:
7. To launch the Microsoft® Word® application and open a specific document (note the
use of the two ""):
C_TEXT($input;$output)
SET ENVIRONMENT VARIABLE("myvariable";"value")
LAUNCH EXTERNAL PROCESS ("D:\\Perl\\bin\\perl.exe D:\\Perl\\eg\\cgi\\env.pl";
$input;$output)
9. To launch a command with the current directory and without displaying the console:
See Also
SET ENVIRONMENT VARIABLE.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
DEFAULT TABLE sets table as the default table for the current process.
There is no default table for a process until the DEFAULT TABLE command is executed. After a
default table has been set, any command that omits the table parameter will operate on the
default table. For example, consider this command:
If the default table is first set to [Table], the same command could be written this way:
One reason for setting the default table is to create code that is not table specific. Doing this
allows the same code to operate on different tables. You can also use pointers to tables to write
code that is not table specific. For more information about this technique, see the description
of the Table name command.
DEFAULT TABLE does not allow the omission of table names when referring to fields. For
example:
because a default table had been set. However, you can omit the table name when referring to
fields in the table method, form, and objects that belong to the table.
Tip: Although using DEFAULT TABLE and omitting the table name may make the code easier to
read, many programmers find that using this command actually causes more problems and
confusion than it is worth.
Example
The following example first shows code without the DEFAULT TABLE command. It then shows
the same code, with DEFAULT TABLE. The code is a loop commonly used to add new records to
a database. The INPUT FORM and ADD RECORD commands both require a table as the first
parameter:
See Also
Current default table.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Current default table returns a pointer to the table that has been passed to the last call to
DEFAULT TABLE for the current process.
Example
Provided a default table has been set, the following line of code sets the window title to the
name of the current default table:
See Also
DEFAULT TABLE, Table, Table name.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Function result Pointer ← Pointer to the table of the currently displayed form
Description
The Current form table command returns the pointer to the table of the form being displayed
or printed in the current process.
If there is no form being displayed or printed in the current process, the command returns Nil.
If there are several windows open for the current process (which means that the window
opened last is the current active window), the command returns the pointer to the table of the
form displayed in the active window.
If the currently displayed form is the Detail form for a subform area, you are in data entry and
you double-clicked on a record or a subrecord of a double-clickable subform area. In this case,
the command returns:
• The pointer to the table shown in the subform area, if the subform displays a table.
• A non-significant pointer, if the subform area displays a subtable.
Example
Throughout your application, you use the following convention when displaying a record:
If the variable vsCurrentRecord is present in a form, it displays “New Record” if you are
working with a new record. If you are working with the 56th record of a selection composed of
5200 records, it displays “56 of 5200”.
See Also
DIALOG, INPUT FORM, OUTPUT FORM, PRINT SELECTION.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The HIDE TOOL BAR command makes the toolbar invisible.
If the toolbar was already hidden, HIDE TOOL BAR does nothing.
See Also
HIDE MENU BAR, SHOW MENU BAR, SHOW TOOL BAR.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SHOW TOOL BAR command makes the toolbar visible.
If the toolbar was already visible, SHOW TOOL BAR does nothing.
See Also
HIDE MENU BAR, HIDE TOOL BAR, SHOW MENU BAR.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The BUILD APPLICATION command launches the application generation process. It takes
into account parameters set in the current application project or the application project set
in the projectName parameter.
An application project is an XML file that contains all the parameters used to generate an
application. Most parameters can be seen in the Build Application... dialog box (for more
information, refer to the Design Reference manual of 4th Dimension).
By default, 4th Dimension creates an application project named “buildapp.prj” (default) for
each database and places it in the BuildApp subfolder in the database Preferences folder.
If the database has not yet been compiled or if the compiled code is outdated, the
command will first launch the compiler process. In this case, the compiler window does
not appear (unless an error occurs), only a progress bar is displayed.
If you do not pass the optional projectName parameter, the command displays a standard
open file dialog box, so that you can designate a project file. When the dialog box has been
validated, the system variable Document contains the full pathname of the open project file.
If you pass the access path and name of an XML file for a valid application project (“.prj”
extension), the command will use the parameters defined in the file. For more information
on the structure and the keys that can be used in the XML file of an application project,
refer to the 4th Dimension XML Keys manual (HTML format).
Example
This example builds two applications in a single method:
BUILD APPLICATION("c:\\folder\\projects\\myproject1.prj")
If (OK=1)
BUILD APPLICATION("c:\\folder\\projects\\myproject2.prj")
End if
Error Handling
If the command fails, an error is generated that you can intercept using the ON ERR CALL
command.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
ENCODE (blob)
Description
The ENCODE command encodes the BLOB passed in the blob parameter in Base64 format.
The command directly modifies the BLOB passed as a parameter.
Base64 encoding modifies 8-bit coded data so that they do not keep more than 7 useful
bits. This encoding is required, for example, for handling BLOBs using XML.
See Also
DECODE.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
DECODE (blob)
Description
The DECODE command allows you to decode the BLOB coded in Base64 format passed in
the blob parameter. The command directly modifies the BLOB passed as a parameter.
The command does not verify the contents of the blob. You must verify that the data
passed is really coded in Base64 format, otherwise the result will be incorrect.
See Also
ENCODE.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
SPELL CHECKING
Description
The SPELL CHECKING command provokes the spell check of the field or variable having the
focus in the currently displayed form. The object checked must be of the string or text type.
Spell checking starts with the first word of the field or variable. If an unknown word is
detected, the spell check dialog box appears (for more information , refer to the Design
Reference manual of 4th Dimension). 4th Dimension uses the current dictionary
(corresponding to the language of the application) unless you have used the SET
DICTIONARY command.
See Also
SET DICTIONARY.
Description
The SET DICTIONARY command causes the replacement of the current dictionary with the
one specified by the dictionary parameter. The current dictionary is used for the built-in
spell-check feature in 4th Dimension (for more information, refer to the 4th Dimension
Design Reference manual).
By default, 4th Dimension uses the dictionary corresponding to the application language.
Five main dictionaries are available: English, French, German, Spanish and Norwegian.
In dictionary, pass the number of the dictionary to use. You can use one of the following
predefined constants, which are found in the “Dictionaries” theme:
Constant Type Value
English Dictionary Longint 69632
German Dictionary Longint 131584
Spanish Dictionary Longint 196608
French Dictionary Longint 262144
Norwegian Dictionary Longint 589824
In addition, numerous variants are available for each of the four main languages. Here is
the full list of all variants supported by the command. To load a variant, pass its value
directly in the dictionary parameter:
Dictionary Value
English (United Kingdom) 65536
English Irish (Ireland) 65600
English Australian (Australia) 65664
English of New Zealand 65680
English American (USA) 65792
English Canadian (Canada) 65920
English South African (South Africa) 66048
English West Indian (Caribbean) 66176
English Jamaican (Jamaica) 66192
English (United Kingdom + America) 69632 (*)
German standard (Germany, old spelling) 131072
German of Luxembourg 131073
Note: The Norwegian dictionary is not present by default in 4th Dimension. Please contact
4D in order to obtain it free of charge. You must then install it in the 4D
Extensions/Spellcheck folder.
See Also
SPELL CHECKING.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Transactions are a series of related data modifications made to a database within a process. A
transaction is not saved to a database permanently until the transaction is validated. If a
transaction is not completed, either because it is canceled or because of some outside event,
the modifications are not saved.
During a transaction, all changes made to the database data within a process are stored locally
in a temporary buffer. If the transaction is accepted with VALIDATE TRANSACTION, the changes
are saved permanently. If the transaction is canceled with CANCEL TRANSACTION, the changes
are not saved.
Since transactions deal with temporary record addresses, after a transaction is validated or
canceled, the selection for each table of the current process becomes empty. For this reason,
you should be cautious when using named selections inside a transaction. After a transaction
is validated or canceled, a named selection created before or during the transaction may
contain incorrect record addresses. For example, a named selection may contain the address of
a deleted record or the temporary address of a record added during the transaction. This
warning also applies to sets, because they are based on bit tables with record addresses.
Note: Records created during a transaction receive temporary numbers that are incremented
beginning with the number18,000,000.
The following commands use record numbers—do not use them in a transaction where
records are created:
• GOTO RECORD
• RELATE ONE SELECTION
• RELATE MANY SELECTION
• REDUCE SELECTION
• SCAN INDEX
Transaction Examples
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
In this example, the database is a simple invoicing system. The invoice lines are stored in a
table called [Invoice Lines], which is related to the table [Invoices] by means of a relation
between the fields [Invoices]Invoice ID and [Invoice Lines]Invoice ID. When an invoice is
added, a unique ID is calculated, using the Sequence number command. The relation between
[Invoices] and [Invoice Lines] is an automatic Relate Many relation. The Auto assign related
value in subform check box is checked.
This example is a typical situation in which you need to use a transaction. You must be sure
that you can save all these records during the operation or that you will be able to cancel the
transaction if a record cannot be added or updated. In other words, you must save related data.
If you do not use a transaction, you cannot guarantee the logical data integrity of your
database. For example, if one record of the [Parts] records is locked, you will not be able to
update the quantity stored in the field [Parts]In Warehouse. Therefore, this field will become
logically incorrect. The sum of the parts sold and the parts remaining in the warehouse will
not be equal to the original quantity entered in the record. You can avoid such a situation by
using transactions.
1. You can handle the transactions yourself by using the transaction commands START
TRANSACTION, VALIDATE TRANSACTION, and CANCEL TRANSACTION. You can write, for
example:
2. To reduce record locking while performing the data entry, you can also choose to manage
transactions from within the form method and access the tables in READ WRITE only when it
becomes necessary.
You perform the data entry using the input form for [Invoices], which contains the related
table [Invoice Lines] in a subform. The form has two buttons: bCancel and bOK, both of which
are no action buttons.
The adding loop becomes:
Note that the [Parts] table is now in read-only access mode during data entry. Read/write
access will be available only if the data entry is validated.
The transaction is started in the [Invoices] input form method listed here:
Case of
: (Form Event=On Load)
START TRANSACTION
[Invoices]Invoice ID:=Sequence number([Invoices]Invoice ID)
Else
[Invoices]Total Invoice:=Sum([Invoice Lines]Total line)
End case
Case of
: (Form Event=On Clicked)
CANCEL TRANSACTION
CANCEL
End case
If you click the bValidate button, the data entry must be accepted and the transaction must be
validated. Here is the object method of the bOK button:
Case of
: (Form Event=On Clicked)
$NbLines:=Records in selection([Invoice Lines])
READ WRITE([Parts]) ` Switch to Read/Write access for the [Parts] table
FIRST RECORD([Invoice Lines]) ` Start at the first line
$ValidTrans:=True ` Assume everything will be OK
For ($Line;1;$NbLines) ` For each line
RELATE ONE([Invoice Lines]Part No)
OK:=1 ` Assume you want to continue
` Try getting the record in Read/Write access
While (Locked([Parts]) & (OK=1))
CONFIRM("The Part "+[Invoice Lines]Part No+" is in use. Wait?")
If (OK=1)
DELAY PROCESS(Current process;60)
LOAD RECORD([Parts])
End if
End while If (OK=1)
` Update quantity in the warehouse
[Parts]In Warehouse:=[Parts]In Warehouse-[Invoice Lines]Quantity
SAVE RECORD([Parts]) ` Save the record
Else
$Line:=$NbLines+1 ` Leave the loop
$ValidTrans:=False
End if
NEXT RECORD([Invoice Lines]) ` Go next line
End for
In this code, we call the CANCEL command regardless of the button clicked. The new record is
not validated by a call to ACCEPT, but by the SAVE RECORD command. In addition, note that
SAVE RECORD is called just before the VALIDATE TRANSACTION command. Therefore, saving
the [Invoices] record is actually a part of the transaction. Calling the ACCEPT command would
also validate the record, but in this case the transaction would be validated before the
[Invoices] record was saved. In other words, the record would be saved outside the transaction.
Depending on your needs, you can customize your database, as shown in these examples. In
the last example, the handling of locked records in the [Parts] table could be developed further.
See Also
CANCEL TRANSACTION, In transaction, START TRANSACTION, VALIDATE TRANSACTION.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
START TRANSACTION
Description
START TRANSACTION starts a transaction in the current process. All changes to the data
(records) of the database are stored temporarily until the transaction is accepted (validated) or
canceled.
If you have several global processes, you can have several transactions. You cannot, however,
nest transactions. If you start a transaction inside another transaction, 4th Dimension ignores
the second transaction.
See Also
CANCEL TRANSACTION, In transaction, Using Transactions, VALIDATE TRANSACTION.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
VALIDATE TRANSACTION
Description
VALIDATE TRANSACTION accepts the transaction in the current process that was started with
START TRANSACTION. VALIDATE TRANSACTION saves the changes to the data of the database
that occurred during the transaction.
See Also
CANCEL TRANSACTION, In transaction, START TRANSACTION, Using Transactions.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
CANCEL TRANSACTION
Description
CANCEL TRANSACTION cancels the transaction in the current process that was started with
START TRANSACTION. CANCEL TRANSACTION leaves the database unchanged by canceling the
operations executed during the transaction.
See Also
In transaction, START TRANSACTION, Using Transactions, VALIDATE TRANSACTION.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
In transaction → Boolean
Description
The In transaction command returns TRUE if the current process is in a transaction, otherwise it
returns FALSE.
Example
If you perform a multi-record operation (adding, modifying, or deleting records), you may
encounter locked records. In this case, if you have to maintain data integrity, you must be in
transaction so you can “roll-back” the whole operation and leave the database untouched.
If you perform the operation from within a trigger or from a subroutine (that can be called
while in transaction or not), you can use In transaction to check whether or not the current
process method or the caller method started a transaction. If a transaction was not started, you
do not even start the operation, because you already know that you will not be able to roll it
back if it fails.
See Also
CANCEL TRANSACTION, START TRANSACTION, Triggers, VALIDATE TRANSACTION.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
A Trigger is a method attached to a table. It is a property of a table. You do not call triggers;
they are automatically invoked by the 4D database engine each time you manipulate table
records (add, delete, modify, and load). You can write very simple triggers, and then make
them more sophisticated.
Triggers can prevent “illegal” operations on the records of your database. They are a very
powerful tool for restricting operations on a table, as well as preventing accidental data loss or
tampering. For example, in an invoicing system, you can prevent anyone from adding an
invoice without specifying the customer to whom the invoice is billed.
By default, when you create a table in the Design Environment, it has no trigger.
Activating a trigger that is not yet written or writing a trigger without activating it will not
affect the operations performed on a table.
On deleting a record
If this option is selected, the trigger will be invoked each time a record of the table is deleted.
This happens when:
• Deleting a record (User environment or calling DELETE RECORD or DELETE SELECTION).
• Performing any operation that provokes deletion of related records through the deletion
control options of a relation.
• Using a Plug-in that calls the DELETE RECORD command.
On loading a record
If this option is selected, the trigger will be invoked each time a record of the table is loaded.
This includes all situations in which a current record is loaded from the data file. You will use
this option less often than the three previous ones.
In order to optimize the operation of 4D, the On loading a record option never triggers a call to
the trigger when using a command that can take advantage of the index.
In fact, when the index is used, records are not loaded and conversely, if the index is not used
(i.e., if the field being processed is not indexed), records are loaded. That would mean that a
trigger for which the On loading a record option was selected could either be or not be
executed depending on the Indexed attribute for the processed field. Rather than keeping a
behavior that is difficult to anticipate, the decision was made to never execute the trigger with
the On loading a record option selected when using a command that could take advantage of
the index.
Note: If the On loading a record option is selected, the trigger will be executed when a current
record is loaded from the data file, except for the following functions:
• Queries: User queries that were prepared in the standard query editor or by using the QUERY
or QUERY SELECTION commands.
• Order by: Sorts that were prepared in the standard Order by Editor or by using the ORDER BY
command.
• On a series: Sum, Average, Min, Max, Std deviation, Variance, Sum square.
• Commands: RELATE ONE SELECTION, RELATE MANY SELECTION.
IMPORTANT: If you execute an operation or call a command that acts on multiple records, the
trigger is called once for each record. For example, if you call APPLY TO SELECTION for a table
whose current selection is composed of 100 records, the trigger will be invoked 100 times.
Database Events
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
A trigger can be invoked for one of the four database events described above. Within the
trigger, you detect which event is occurring by calling the Database event function. This
function returns a numeric value that denotes the database event.
Typically, you write a trigger with a Case of structure on the result returned by Database event.
You can use the constants of the Database Events theme:
Note: The Time stamp function used in this example is a small project method that returns the
number of seconds elapsed since a fixed date was chosen arbitrarily.
After this trigger has been written and activated, no matter what way you add or modify a
record to the [Documents] table (data entry, import, project method, 4D plug-in), the fields
[Documents]Creation Stamp and [Documents]Modification Stamp will automatically be assigned
by the trigger before the record is eventually written to the disk.
Note: See the example for the GET DOCUMENT PROPERTIES command for a complete study of
this example.
Example
Let’s take the case of an [Employees] table. During data entry, you enforce a rule on the field
[Employees]Social Security Number. When you click the validation button, you check the field
using the object method of the button:
If you also create [Employees] records programmatically, the following piece of code would be
programmatically valid, but would violate the rule expressed in the previous object method:
Using a trigger for the [Employees]table, you can enforce the [Employees]SS number rule at all
the levels of the database. The trigger would look like this:
Once this trigger is written and activated, the line SAVE RECORD ([Employees]) will generate a
database engine error -15050, and the record will NOT be saved.
The trigger guarantees that nobody (user, database designer, Plug-in, 4D Open client with
4D Server) can violate the social security number rule, either deliberately or accidentally.
Note that even if you do not have a trigger for a table, you can get database engine errors
while attempting to save or delete a record. For example, if you attempt to save a record with a
duplicated value in a unique indexed field, the error -9998 is returned.
Important: You can return an error code value of your choice. However, do NOT use error
codes already taken by the 4D database engine. We strongly recommend that you use error
codes between -32000 and -15000. We reserve error codes above -15000 for the database
engine.
At the process level, you handle trigger errors the same way you handle database engine errors:
• You can let 4D display the standard error dialog box, then the method is halted.
• You can use an error-handling method installed using ON ERR CALL and recover the error the
appropriate way.
Notes:
• During data entry, if a trigger error is returned while attempting to validate or delete a
record, the error is handled like a unique indexed error. The error dialog is displayed, and you
stay in data entry. Even if you only use a database in the User environment (not in Custom
Menus), you have the benefit of using triggers.
• When an error is generated by a trigger within the framework of a command acting on a
selection of records (like DELETE SELECTION), the execution of the command is immediately
stopped, without the selection having necessarily been completely processed. This case
requires appropriate handling by the developer, based, for instance, on the temporary
preservation of the selection, the processing and elimination of the error before trigger
execution, etc.
Even when a trigger returns no error ($0:=0), this does not mean that a database operation will
be successful—a unique index violation may occur. If the operation is the update of a record,
the record may be locked, an I/O error may occur, and so on. The checking is done after the
execution of the trigger. However, at the higher level of the executing process, errors returned
by the database engine or a trigger are the same—a trigger error is a database engine error.
Triggers execute at the database engine level. This is summarized in the following diagram:
Triggers are executed on the machine where the database engine is actually located. This is
obvious with a 4D single-user version. On 4D Server, triggers are executed within the acting
process on the server machine, not on the client machine.
When a trigger is invoked, it executes within the context of the process that attempts the
database operation. This process, which invokes the trigger execution, is called the invoking
process.
In particular, the trigger works with the current selections, current records, table read/write
states, and record locking operations of the invoking process.
Warning: A trigger cannot and must not change the current record of the table to which it is
attached. Within a trigger, if you need to check a unique value on multiple fields, use the SET
QUERY DESTINATION command, which allows you to query a table without changing the
current selection or current record of the table.
Be careful about using other database or language objects of the 4D environment, because a
trigger may execute on a machine other than that of the invoking process—this is the case
with 4D Server!
Transactions must be handled at the invoking process level. They must not be managed at the
trigger level. During one trigger execution, if you have to add, modify or delete multiple
records (see the following case study), you must first use the In transaction command from
within the trigger to test if the invoking process is currently in transaction. If this is not the
case, the trigger may potentially encounter a locked record. Therefore, if the invoking process
is not in transaction, do not even start the operations on the records. Just return an error in $0
in order to signal to the invoking process that the database operation it is trying to perform
must be executed in a transaction. Otherwise, if locked records are met, the invoking process
will have no means to roll back the actions of the trigger.
Note: In order to optimize the combined operation of triggers and transactions, 4D does not
call triggers after the execution of VALIDATE TRANSACTION. This prevents the triggers from
being executed twice.
Note: The tables have been collapsed; they have more fields than shown here.
Let’s say that the database “authorizes” the deletion of an invoice. We can examine how such
an operation would be handled at the trigger level (because you could also perform deletions
at the process level).
In order to maintain the relational integrity of the data, deleting an invoice requires the
following actions to be performed in the trigger for [Invoices]:
• In the [Customer] record, decrement the Gross Sales field by the amount of the invoice.
• Delete all the [Line Items] records related to the invoice.
• This also implies that the [Line Items] trigger decrements the Quantity Sold field of the
[Products] record related to the line item to be deleted.
• Delete all the [Payments] records related to the deleted invoice.
First, the trigger for [Invoices] must perform these actions only if the invoking process is in
transaction, so that a roll-back is possible if a locked record is met.
Second, the trigger for [Line Items] is cascading with the trigger for [Invoices]. The [Line
Items] trigger executes “within” the execution of the [Invoices] trigger, because the deletion of
the list items are consequent to a call to DELETE SELECTION from within the [Invoices] trigger.
In this cascade relationship, the [Invoices] trigger is said to be executing at level 1, the
[Customers], [Line Items], and [Payments] triggers at level 2, and the [Products] trigger at level
3.
From within the triggers, you can use the Trigger level command to detect the level at which a
trigger is executed. In addition, you can use the TRIGGER PROPERTIES command to get
information about the other levels.
For example, if a [Products] record is being deleted at a process level, the [Products] trigger
would be executed at level 1, not at level 3.
Using Trigger level and TRIGGER PROPERTIES, you can detect the cause of an action. In our
example, an invoice is deleted at a process level. If we delete a [Customers] record at a process
level, then the [Customers] trigger should attempt to delete all the invoices related to that
customer. This means that the [Invoices] trigger will be invoked as above, but for another
reason. From within the [Invoices] trigger, you can detect if it executed at level 1 or 2. If it did
execute at level 2, you can then check whether or not it is because the [Customers] record is
deleted. If this is the case, you do not even need to bother updating the Gross Sales field.
While handling an On Saving New Record Event database event, you can call the Sequence
number command to maintain a unique ID number for the records of a table.
See Also
Database event, Methods, Record number, Trigger level, TRIGGER PROPERTIES.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Called from within a trigger, the Database event command returns a numeric value that
denotes the type of the database event, in other words, the reason why the trigger has been
invoked.
Within a trigger, if you perform database operations on multiple records, you may encounter
conditions (usually locked records) that will make the trigger unable to perform correctly. An
example of this situation is updating multiple records in a [Products] table when a record is
being added to an [Invoices] table. At this point, you must stop attempting database
operations, and return a database error so the invoking process will know that its database
request cannot be performed. Then the invoking process must be able to cancel, during the
transaction, the incomplete database operations performed by the trigger. When this type of
situation occurs, you need to know from within the trigger if you are in transaction even
before attempting anything. To do so, use the command In transaction.
Example
You use the command Database event to structure your triggers as follows:
` Trigger for [anyTable]
C_LONGINT($0)
$0:=0 ` Assume the database request will be granted
Case of
: (Database event=On Saving New Record Event)
` Perform appropriates action for the saving of a newly created record
: (Database event=On Saving Existing Record Event)
` Perform appropriates actions for the saving of an already existing record
: (Database event=On Deleting Record Event)
` Perform appropriates actions for the deletion of a record
: (Database event=On Loading Record Event)
` Perform appropriates actions for the loading into memory of a record
End case
See Also
In transaction, Trigger level, TRIGGER PROPERTIES, Triggers.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Trigger level command returns the execution level of the trigger.
For more information on execution levels, see the topic Cascading Triggers in the section
Triggers.
See Also
Database event, TRIGGER PROPERTIES, Triggers.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The TRIGGER PROPERTIES command returns information about the trigger execution level you
pass in triggerLevel. You use TRIGGER PROPERTIES in conjunction with Trigger level to perform
different actions depending on the cascading of trigger execution levels. For more
information, see the topic Cascading Triggers in the section Triggers.
If you pass a non-existing trigger execution level, the command returns 0 (zero) in all
parameters.
The nature of the database event for the trigger execution level is returned in dbEvent. The
following predefined constants are provided:
Constant Type Value
On Saving New Record Event Long Integer 1
On Saving Existing Record Event Long Integer 2
On Deleting Record Event Long Integer 3
On Loading Record Event Long Integer 4
The table number and record number for the record involved by the database event for the
trigger execution level are returned in tableNum and recordNum.
Note: Remember that while in transaction, newly created records have temporary record
numbers.
See Also
About Record Numbers, Database event, Trigger level, Triggers.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
In 4th Dimension 2004, developers can offer users the possibility of creating or modifying
customized forms. These “User forms” can then be used like any other 4th Dimension
form.
Introduction
User forms are based on standard 4th Dimension forms created by the developer in the
Design environment (called “source” or “developer” forms) where the Editable by user
property has been applied in the Form editor. A simplified Form editor (called using the
EDIT FORM command) allows users to modify the form appearance, add graphic objects
(using a library of specific objects), hide elements, etc.— the developer can control of
authorized actions.
Error codes
Specific error codes may be returned when using user form management commands. These
codes, located from -9750 to -9759, are described in the Database Engine Errors section.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The EDIT FORM command opens the form set using the table, form and the optional
userForm parameters in the User form editor:
Note: The window of the editor opens only if it is the first window of the processs. In other
words, usually you will need to open a new process to display the editor.
If you pass an empty string in the userForm parameter and if there is not a user form
already linked to form, the source form is displayed in the editor. The modified form is
then copied in the user structure file (.4DA) and will be used as a form replacement.
If a user form was already generated from form using this command, the user form is
displayed in the editor. If you want to start from the source form, you must first delete the
user form using the DELETE USER FORM command.
The userForm parameter allows setting a user form (created using the CREATE USER FORM
command) to modify. In this case, the form is displayed in the editor.
Example
In this example, the user can choose a library then modify a dialog form:
EDIT FORM([Dialogs];"Welcome";"Lib_Logos.4il")
If(OK=1)
`Display of modified form
DIALOG([Dialogs];"Welcome")
End if
See Also
CREATE USER FORM, DELETE USER FORM, LIST USER FORMS, Overview of user forms.
Error Handling
An error is generated if:
• the form has not been declared editable by the user in the Design environment or if it
does not exist,
• the form is already open and being modified in another process,
• the user cannot access the form because they do not have the proper access rights.
You can intercept this error with the error-handling method installed by the ON ERR CALL
command.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The CREATE USER FORM command duplicates the 4th Dimension form whose table and
name are passed as parameters and creates a new user form named userForm.
Once created, the userForm form can be modified using the EDIT FORM command. This
command allows you to create X user forms (for example, various report forms) from a
single source form.
See Also
DELETE USER FORM, EDIT FORM, INPUT FORM, LIST USER FORMS, OUTPUT FORM, Overview of
user forms.
Error Handling
An error is generated if:
• form is already a user form,
• the name of userForm is the same as the name of the source form or an existing user form,
• the user cannot access the form because they do not have the proper access rights.
You can intercept these errors with the error-handling method installed by the ON ERR
CALL command.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The LIST USER FORMS command fills the userFormArray array with the names of user forms
coming from the developer form set in the table and form parameters.
If the user form was created directly using the EDIT FORM command, the only item that
userFormArray contains is an empty string ("").
The array is empty if there are no user forms for the specified developer form.
See Also
CREATE USER FORM, EDIT FORM, Overview of user forms.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DELETE USER FORM command allows you to remove the user form set using the table,
form and userForm parameters.
If the user form was created directly using the EDIT FORM command, pass an empty string
("") in userForm.
See Also
CREATE USER FORM, LIST USER FORMS, Overview of user forms.
Error Handling
An error is generated if:
• the user form does not exist,
• the user does not have the proper access to remove the user form.
You can intercept this error with the error-handling method installed by the ON ERR CALL
command.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
BEEP
Description
The BEEP command causes the PC or Macintosh to generate a beep. Your computer (on
Windows or Macintosh) can emit a sound other than a beep, depending on the sound chosen
in the Sound control panel.
Warning: Do not call BEEP from within a Web connection process, because the beep will be
produced on the 4th Dimension Web server machine and not on the client Web browser
machine.
Example
In the following example, if no records are found by the query, a beep is emitted and an alert
is displayed:
QUERY([Customers];[Customers]Name=$vsNameToLookFor)
If (Records in selection([Customers])=0)
BEEP
ALERT("There is no Customer with such a name.")
End if
See Also
PLAY.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description on Windows
On Windows, the PLAY command plays sound (.WAV files), MIDI (.MID files), or Video (.AVI
files) Windows files. You pass the full pathname of the file you want to play in objectName.
Note: You cannot play multimedia files or objects in asynchronous mode. To do so, use OLE
Services.
On Macintosh or on Windows (with some restrictions, see Important Note below), the
command PLAY plays the sound resource named by objectName on Macintosh.
The channel parameter specifies the Macintosh synthesizer channel. If channel is not specified,
the channel is for simple digitized sounds and is synchronous. Synchronous means that all
processing stops until the sound has finished. If channel is 0, the channel is for simple
digitized sounds and is asynchronous. Asynchronous means that processing does not stop and
the sound plays in the background.
PLAY ("";0)
If you work with a database on Macintosh and Windows concurrently, you can also play
Macintosh sounds on the Windows platform. To do so:
• On the Macintosh, using a resource editor such as ResEdit or Resorcerer, copy the required
'snd ' resources into the resource fork of the structure file.
Important Note: The Windows version of 4th Dimension does not play Macintosh sounds that
have been compressed by MACE. If your Macintosh ‘snd’ resource does not play on Windows,
determine whether it complies with the following requirements:
You can check the internal data of a ‘snd’ resource using Resorcerer.
Examples
1. The following example shows how to play a video file on Windows:
2. The following example code appears in a startup method. It welcomes the user with a sound
called Welcome Sound on Macintosh:
See Also
BEEP.
Description
The Get platform interface command returns a numeric value that denotes the current platform
interface used for displaying forms.
You can change the platform interface using the command SET PLATFORM INTERFACE or
within the Design environment Preferences dialog box.
See Also
SET PLATFORM INTERFACE.
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET PLATFORM INTERFACE command sets the platform interface used for displaying the
forms.
Note: The constant Mac Theme allows you to use the user interface defined with the
Appearance Manager. This manager only exists on Mac OS. When a database defined with “Mac
Theme” interface is displayed on Windows, the interface “Windows 9x” is applied.
Note: The platform interface can also be changed in the Design environment Preferences
dialog box.
Example
In a 4D Client/Server architecture, the Macintosh and Windows stations can use different
platform interfaces concurrently. To do so, you can call the SET PLATFORM INTERFACE
command in the On Startup Database Method:
` This example assumes that user preferences are stored in a [Preferences] table
` Look for the record corresponding to the current user
QUERY([Preferences];[Preferences]User name=Current User)
If (Records in selection([Preferences])=0)
` If not found, look for the default preferences
QUERY([Preferences];[Preferences]User name="Default")
End if
` Set the Platform Interface according to the user preferences
SET PLATFORM INTERFACE ([Preferences]Platform Interface)
See Also
Get platform interface.
Description
SET TABLE TITLES enables you to mask, rename, and reorder the tables of your database when
they appear in standard 4th Dimension dialog boxes such as the Query editor, within the User
or Custom Menus environments.
Using this command, you can also rename on the fly the table labels in your forms, if you
used dynamic names. For more information about inserting dynamic field and table names in
the forms, refer to the 4th Dimension Design Reference manual.
The tableTitles and tableNumbers arrays must be synchronized. In the tableTitles array, you pass
the names of the tables as you would like them to appear. If you do not want to show a
particular table, do not include its name or new title in the array. The tables will appear in the
order you specify in this array. In each element of the tableNumbers array, you pass the actual
table number corresponding to the table name or new title passed in the same element
number in the tableTitles array.
For example, you have a database composed of the tables A, B, and C, created in that order.
You want these tables to appear as X, Y, and Z. In addition you do not want to show table B.
Finally, you want to show Z and X, in that order. To do so, you pass Z and X in a two-element
tableTitles array, and you pass 3 and 1 in a two-element tableNumbers array.
The optional * parameter lets you indicate whether or not custom names defined using this
command can be used in 4D formulas.
• By default, when this parameter is omitted, formulas executed in 4D cannot use these
custom names; it is necessary to use the real table names.
Note: At the formula editor level, the execution of this command without the * parameter
does not modify any settings made previously with the * parameter. In other words, the
formula editor always displays the custom name set via the last call of the command with the
* parameter.
SET TABLE TITLES does NOT change the actual structure of your database. It only affects
subsequent uses of the standard 4th Dimension dialog boxes and forms using dynamic names
within the User or Custom Menus environments. The scope of the SET TABLE TITLES command
is the worksession. One benefit in Client/Server is that several 4D Client stations can
simultaneously “see” your database in different ways. You can call SET TABLE TITLES as many
times as you want.
WARNING: SET TABLE TITLES does NOT override the Invisible property of a table. When a table
is set to be invisible at the Design level of your database, even though it is included in a call to
SET TABLE TITLES, it will not appear.
Example
• You are building a 4D application that you plan to sell internationally. Therefore, you must
carefully consider localization issues. Regarding the standard 4th Dimension dialog boxes that
can appear in the User and Custom Menus environments and your forms that use dynamic
names, you can address localization needs by using a [Translations] table and a few project
methods to create and use fields localized for any number of countries.
• Then, create the TRANSLATE TABLES AND FIELDS project method listed below. This method
browses the actual structure of your database and creates all the necessary [Translations] records
for the localization corresponding to the language passed as parameter.
C_STRING(31;$1)
C_LONGINT($vlTable;$vlField)
• At this point, if you execute the following line, you create as many records as needed for a
Spanish localization of the tables and fields titles.
• After this call has been executed, you can then enter the [Translations]Translated Name for
each of the newly created records.
• Finally, each time you want to show your database’s standard 4D dialog boxes or forms with
dynamic titles using the Spanish localization, you execute the following line:
C_STRING(63;$1)
C_LONGINT($vlTable;$vlNbTable;$vlField;$vlNbField)
• Note that new localizations can be added to the database without modifying or recompiling
the code.
See Also
Count tables, SET FIELD TITLES, Table name.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET TABLE TITLES command fills the tableTitles and tableNums arrays with the names
and numbers of database tables defined in the Structure window or using the SET TABLE
TITLES command. The contents of these two arrays are synchronized.
If the SET TABLE TITLES command is called during the session, GET TABLE TITLES only
returns the “modified” names and table numbers defined using this command.
Otherwise, GET TABLE TITLES returns the names of all database tables as defined in the
Structure window.
In both cases, the command does not return invisible tables.
See Also
GET FIELD TITLES, SET TABLE TITLES.
Description
SET FIELD TITLES enables you to mask, rename, and reorder the fields of the table or subtable
passed in table or subtable when they appear in standard 4th Dimension dialog boxes, such as
the Query editor, within the User or Custom Menus environments.
Using this command, you can also rename on the fly the labels of the fields in your forms, if
you used dynamic names. For more information about inserting dynamic field and table
names in forms, refer to the 4th Dimension Design Reference manual.
The fieldTitles and fieldNumbers arrays must be synchronized. In the fieldTitles array, you pass
the name of the fields as you would like them to appear. If you do not want to show a
particular field, do not include its name or new title in the array. The fields will appear in the
order you specify in this array. In each element of the fieldNumbers array, you pass the actual
field number corresponding to the field name or new title passed in the same element number
in the fieldTitles array.
For example, you have a table or subtable composed of the fields F, G, and H, created in that
order. You want these fields to appear as M, N, and O. In addition you do not want to show
field N. Finally, you want to show O and M in that order. To do so, pass O and M in a two-
element fieldTitles array and pass 3 and 1 in a two-element fieldNumbers array.
The optional * parameter lets you indicate whether or not custom names defined using this
command can be used in 4D formulas.
• By default, when this parameter is omitted, formulas executed in 4D cannot use these
custom names; it is necessary to use the real table names.
Note: At the formula editor level, the execution of this command without the * parameter
does not modify any settings made previously with the * parameter. In other words, the
formula editor always displays the custom name set via the last call of the command with the
* parameter.
SET FIELD TITLES does NOT change the actual structure of your table. It only affects subsequent
uses of the standard 4th Dimension dialog boxes and forms using dynamic names within the
User or Custom Menus environments. The scope of the SET FIELD TITLES command is the
worksession. One benefit in Client/Server is that several 4D Client stations can simultaneously
“see” your table in different ways. You can call SET FIELD TITLES as many times as you want.
WARNING:
• SET FIELD TITLES does NOT override the Invisible property of a field. When a field is set to be
invisible at the Design level of your database, even though it is included in a call to SET FIELD
TITLES, it will not appear.
• Each call to SET FIELD TITLES must be followed or preceded by a call to SET TABLE TITLES —
even though you do not want to modify the table title — otherwise the command will have
no effect.
Example
See example for the SET TABLE TITLES command.
See Also
Count fields, Field name, SET TABLE TITLES.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET FIELD TITLES command fills the fieldTitles and fieldNums arrays with the names and
numbers of database fields for the desired table. The contents of these two arrays are
synchronized.
If the SET FIELD TITLES command is called during the session, GET FIELD TITLES only returns
the “modified” names and field numbers defined using this command.
Otherwise, GET FIELD TITLES returns the names of all database fields as defined in the
Structure window.
In both cases, the command does not return invisible fields.
See Also
GET TABLE TITLES, SET FIELD TITLES.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Shift down returns TRUE if the Shift key is pressed.
Example
The following object method for the button bAnyButton performs different actions, depending
on which modifier keys are pressed when the button is clicked:
` bAnyButton Object Method
Case of
` Other multiple key combinations could be tested here
` ...
: (Shift down & Windows Ctrl down)
` Shift and Windows Ctrl (or Macintosh Command) keys are pressed
DO ACTION1
` ...
: (Shift down)
` Only Shift key is pressed
DO ACTION2
` ...
: (Windows Ctrl down)
` Only Windows Ctrl (or Macintosh Command) key is pressed
DO ACTION3
` ...
` Other individual keys could be tested here
` ...
End case
See Also
Caps lock down, Macintosh command down, Macintosh control down, Macintosh option down,
Windows Alt down, Windows Ctrl down.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Caps lock down returns TRUE if the Caps Lock key is pressed.
Example
See example for the command Shift down.
See Also
Macintosh command down, Macintosh control down, Macintosh option down, Shift down,
Windows Alt down, Windows Ctrl down.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Windows Ctrl down returns TRUE if the Windows Ctrl key is pressed.
Note: When called on a Macintosh platform, Windows Ctrl down returns TRUE if the
Macintosh Command key is pressed.
Example
See example for the command Shift down.
See Also
Caps lock down, Macintosh command down, Macintosh option down, Shift down, Windows Alt
down, Windows Ctrl down.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Windows Alt down returns TRUE if the Windows Alt key is pressed.
Note: When called on a Macintosh platform, Windows Alt down returns TRUE if the Macintosh
Option key is pressed.
Example
See example for the command Shift down.
See Also
Caps lock down, Macintosh command down, Macintosh control down, Macintosh option down,
Shift down, Windows Ctrl down.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Macintosh command down returns TRUE if the Macintosh command key is pressed.
Note: When called on a Windows platform, Macintosh command down returns TRUE if the
Windows Ctrl key is pressed.
Example
See example for the command Shift down.
See Also
Caps lock down, Macintosh control down, Macintosh option down, Shift down, Windows Alt
down, Windows Ctrl down.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Macintosh option down returns TRUE if the Macintosh Option key is pressed.
Note: When called on a Windows platform, Macintosh option down returns TRUE if the
Windows Alt key is pressed.
Example
See example for the command Shift down.
See Also
Caps lock down, Macintosh command down, Macintosh control down, Shift down, Windows Alt
down, Windows Ctrl down.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Macintosh control down returns TRUE if the Macintosh Control key is pressed.
Note: When called on a Windows platform, Macintosh control down always return FALSE. This
Macintosh key has no equivalent on Windows.
Example
See example for the command Shift down.
See Also
Caps lock down, Macintosh command down, Macintosh option down, Shift down, Windows Alt
down, Windows Ctrl down.
Description
The GET MOUSE command returns the current state of the mouse.
The horizonal and vertical coordinates are returned in mouseX and mouseY. If you pass the *
parameter, the coordinates are expressed relative to the screen. If you omit the * parameter,
they are expressed relative to the frontmost window of the current process.
The parameter mouseButton returns the state of the buttons, as listed previously.
Note: The values 2 and 3 can be returned under Mac OS X starting with version 10.2.5 only.
Example
See the example for the command Pop up menu.
See Also
Caps lock down, Macintosh command down, Macintosh control down, Macintosh option down,
ON EVENT CALL, Shift down, Windows Alt down, Windows Ctrl down.
Description
The Pop up menu command displays a pop-up menu at the current location of the mouse.
In order to follow user interface rules, you usually call this command in response to a mouse
click and if the mouse button is still down.
You define the items of the pop-up menu with the parameter contents as follows:
• Separate each item from the next one with a semi-colon (;). For example,
"ItemText1;ItemText2;ItemText3".
• To disable an item, place an opening parenthesis (() in the item text.
• To specify a separation line, pass "(-" as item text.
• To specify a font style for a line, place in the item text a less than sign (<) followed by one of
these characters:
<B Bold
<I Italic
<U Underline
<O Outline (Macintosh only)
<S Shadow (Macintosh only)
• To add a check mark to an item, place in the item text an exclamation mark (!) followed by
the character you want as a check mark.
- On Macintosh, the character is displayed directly. To display the standard check mark
whatever the system version or language, use the following statement: Char(18).
- On Windows, a check mark is displayed, no matter what character you passed.
• To add an icon to an item, place in the item text a circumflex accent (^) followed by a
character whose ASCII code plus 208 is the resource ID of a Mac OS-based icon resource.
Tip: It is possible to disable the mechanism for interpreting special characters (!, /, etc.) in the
pop up menu in order, for example, to have these characters included in the wording. To do
this, simply have the contents parameter begin with the statement Char(1). For example:
contents:=Char(1)+"1/4;1/2;3/4")
Note that once this statement has been executed, it is no longer possible to assign styles or
shortcuts to the pop up menu.
The optional default parameter allows you to specify the default menu item selected when the
pop-up menu is displayed. Pass a value between 1 and the number of menu items. If you omit
this parameter, the command selects the first menu item as the default.
The optional xCoord and yCoord parameters are used to designate the location of the pop-up
menu to be displayed. In xCoord and yCoord, pass respectively the horizontal and vertical
coordinates of the upper left corner of the menu. These coordinates must be expressed in
pixels in the local coordinate system of the current form. These two parameters must be
passed together; if only one is passed, it will be ignored.
If you use the xCoord and yCoord parameters, the default parameter is ignored. In this case, the
mouse is not necessarily located at the level of the pop-up menu.
These parameters are useful in particular for managing 3D buttons with an associated pop-up
menu.
If you select a menu item, the command returns its number; otherwise, it returns zero (0).
Note: Use pop-up menus that have a reasonable number of items. If you want to display more
than 50 items, you might think about a using scrollable area in a form instead of a pop-up
menu.
Example
The project method MY SPEED MENU pulls down a navigation speed menu:
In the last two cases, the click does not need to occur in any form object. This is one of the
advantages of the Pop up menu command. Generally, you use form objects to display pop-up
menus. Using Pop up menu, you can display the menu anywhere.
The pop-up menu is displayed on Windows by pressing the right mouse button; it is displayed
on Macintosh by pressing Control-Click. Note, however, that the method does not actually
check whether or not there was a mouse click; the caller method tests that.
The following is the pop-up menu as it appears on Windows (left) and Macintosh (right). Note
the standard check mark for the Windows version.
See Also
GET MOUSE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The POST KEY command simulates a keystroke. Its effect is as if the user actually entered a
character on the keyboard.
If you pass the modifiers parameter, you pass one or a combination of the Events (modifiers)
constants. For example, to simulate the Shift key, pass Shift key mask. If you do not pass
modifiers, no modifiers are simulated.
If you specify the process parameter, the keystroke is sent to the process whose process number
you pass in process. If you pass 0 (zero) or if you omit the parameter, the keystroke is sent at
the application level, and the 4D scheduler will dispatch it to the appropriate process.
Example
See example for the command Process number.
See Also
POST CLICK, POST EVENT.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The POST CLICK command simulates a mouse click. Its effect as if the user actually clicked the
mouse button.
You pass the horizontal and vertical coordinates of the click in mouseX and mouseY. If you
pass the * parameter, you express these coordinates relative to the screen. If you omit the *
parameter, you express these coordinates relative to the frontmost window of the process
whose process number you pass in process.
If you specify the process parameter, the click is sent to the process whose process number you
pass in process. If you pass 0 (zero) or if you omit the parameter, the click is sent at the
application level, and the 4D scheduler will dispatch it to the appropriate process.
See Also
POST EVENT, POST KEY.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The POST EVENT command simulates a keyboard or mouse event. Its effect is as if the user
actually acted on the keyboard or the mouse.
If the event is a mouse-related event, you pass 0 (zero) in message. If the event is a keyboard-
related event, you pass the ASCII code of the simulated character in message.
If the event is a mouse-related event, you pass the horizontal and vertical coordinates of the
click in mouseX and mouseY.
In the parameter modifiers, you pass one or a combination of the Events (modifiers) constants.
For example, to simulate the Shift key, pass Shift key bit.
See Also
POST CLICK, POST KEY.
Description
The SCROLL LINES command allows scrolling lines of a list form (displayed using the
MODIFY SELECTION or DISPLAY SELECTION commands), a subform or a list box so that the
first selected record/row or a specific record/row is displayed.
If you pass the first optional * parameter, you indicate that the object parameter is the
name of a subform or list box object (in this case, pass a string in object). If you do not pass
anything in this parameter, you indicate that the object parameter is a table (list form table
or subform table) or a variable (list box).
If you do not pass the position parameter, the command provokes the vertical scroll of lines
of the list so that the first highlighted line in the list is visible. If no line is selected, the
command does nothing. If at least one selected line is already visible, the command does
nothing.
The position parameter allows you to indicate the number of the line to display. If you pass
this parameter, the command provokes the vertical scroll of lines of the list so that the set
line is visible (highlighted or not). If the line is already visible, the command does nothing.
For list forms and subforms, this number is the number of the line among the current
selection (its position). For list boxes, this number is the number of the row among all the
object rows (including hidden rows).
If you pass the second optional * parameter, the line made visible using the command (if
the list was scrolled) will be placed in the first position of the list.
Note: The HIGHLIGHT RECORDS command features an optional * parameter that allows
delegating scroll management to the SCROLL LINES command.
See Also
HIGHLIGHT RECORDS, SELECT LISTBOX ROW.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET HIGHLIGHT command is used to determine what text is currently highlighted.
Warning: Although you pass a enterable field or variable name to GET HIGHLIGHT, this
command returns a significant selection position only when it is applied to the area currently
being edited.
Note: This command cannot be used with fields in the List form of a subform.
The parameter startSel returns the position of the first highlighted character.
The parameter endSel returns the position of the last highlighted character plus one.
If startSel and endSel are returned equal, the insertion point is positioned before the character
specified by startSel. The user has not selected any text, and no characters are highlighted.
Examples
1. The following example gets the highlighted selection from the field called
[Products]Comments:
See Also
FILTER KEYSTROKE, HIGHLIGHT TEXT, Keystroke.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The HIGHLIGHT TEXT command highlights a section of the text in area.
If area is not the object currently being edited, the focus is then set to this area.
Note: This command cannot be used with fields in the List form of a subform.
startSel is the first character position to be highlighted, and lastSel is the last character plus one
to be highlighted. If startSel and lastSel are equal, the insertion point is positioned before the
character specified by startSel, and no characters are highlighted.
If lastSel is greater than the number of characters in area, then all characters between startSel
and the end of the text are highlighted.
Examples
1. The following example selects all the characters of the enterable field [Products]Comments:
HIGHLIGHT TEXT([Products]Comments;1;Length([Products]Comments)+1)
2. The following example moves the insertion point to the beginning of the enterable field
[Products]Comments:
HIGHLIGHT TEXT([Products]Comments;1;1)
$vLen:=Length([Products]Comments)+1
HIGHLIGHT TEXT([Products]Comments;$vLen;$vLen)
See Also
GET HIGHLIGHT.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET CURSOR command changes the mouse cursor to the cursor stored in the Mac OS-
based ‘CURS’ resource whose ID number you pass in cursor.
If you omit the parameter, the mouse cursor is set to the standard arrow.
Use the RESOURCE LIST command to get the list of available cursors.
See Also
RESOURCE LIST.
Description
Focus object returns a pointer to the object having the focus in the current form. If no object
has the focus, the command returns Nil. You can use Focus object to perform an action on a
form area without having to know which object is currently selected. Be sure to test that the
object is the correct data type, using Type, before performing an action on it.
Note: When it is used with a List box type object, the Focus object function returns a pointer
to the column (the array) of the list box that has the focus.
Note: This command is to be used only in data entry context, otherwise it will return errors.
Example
The following example is an object method for a button. The object method changes the data
in the current object to uppercase. The object must be a text or string data type (type 0 or 24):
$vp := Focus object ` Save the pointer to the last area
Case of
: (Nil($pointer)) ` No object has the focus
...
` If it is a string or text area
: ((Type ($vp->) = Is Alpha field) | (Type($vp->) = Is String var))
$vp-> := Uppercase ($vp->) ` Change the area to uppercase
End case
REDRAW (object)
Description
When you use a method to change the value of a field or subfield displayed in a subform, you
must execute REDRAW to ensure that the form is updated.
Web Server: When executed after the On Timer form event, the REDRAW command can be
called to periodically update a 4D form sent to a Web browser. For more information, please
refer to the description of the SET TIMER command.
See Also
SET TIMER.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
INVERT BACKGROUND is used to invert textVar or textField in the form.
You can use INVERT BACKGROUND when displaying on screen or printing to a dot matrix
printer. A postscript printer will not print an inverted background.
You cannot invert a variable in an output form. Avoid using INVERT BACKGROUND on an
enterable variable. Entering characters will only partially erase the inverted display.
Example
This example is an object method for a variable in an input form. It tests the value of a field. If
the field is positive, the object method does nothing. If the field is negative, the object
method inverts the display of the variable in the form:
Note: This command, originally created for black and white user interfaces, is now rarely used.
You now generally use colors to highlight a field or a variable.
See Also
SET COLOR, SET RGB COLORS.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
EDIT ACCESS
Description
EDIT ACCESS allows the user to edit the password system. When this command is executed,
the Toolbox window with only the Users and User groups pages is displayed.
Note: This command opens a modal window. Consequently, you should not call it from
another modal window; otherwise it will do nothing.
Groups can be edited by the Designer, the Administrator and group owners. The Designer and
the Administrator can edit any group. Group owners can edit only the groups they own. Users
can be added to and removed from groups. The command has no effect if no groups are
defined.
The Designer and the Administrator can add new users, as well as assign them to groups.
Example
The following example displays the Users and User groups management window to the user:
EDIT ACCESS
See Also
CHANGE CURRENT USER, CHANGE PASSWORD.
Description
CHANGE CURRENT USER is used to change the identity of the current user in the database,
without having to quit. The user can change their identity themselves either using the
database connection dialog box (when the command is called without parameters) or directly
via the command. When a user changes their identity, they abandon any former access
privileges in favor of those belonging to the chosen user.
If the CHANGE CURRENT USER command is executed without parameters, the database
connection dialog box is displayed. The user must then enter or select a valid name and
password in order to enter the database. The contents of the connection dialog box will
depend on the options set on the Application/Access page of the database Preferences.
You can also pass the two optional user and password parameters in order to specify by
programming the new account to be used.
In the user parameter, pass the name or unique user ID (userRef) of the account to be used. The
user names and IDs can be obtained using the GET USER LIST command.
If the user account does not exist or was deleted, error -9979 is returned. You can intercept this
error with the error-handling method installed by the ON ERR CALL command. Otherwise, you
can call the function Is user deleted to test the user account before calling this command.
The command execution is now delayed to prevent flooding (brute force attack), in other
words, attempts of multiple user name/password combinations. As a result, after the 4th call
to this command, it is run only after a period of 10 seconds. This delay is throughout the
entire work station.
Example
The following example displays the connection dialog box:
See Also
CHANGE PASSWORD.
Description
Validate password returns True if the string passed in password is the password for the user
account whose ID number is passed in userID.
The command execution is now delayed to prevent flooding (brute force attack), in other
words, attempts of multiple user name/password combinations. As a result, after the 4th call
to this command, it is run only after a period of 10 seconds. This delay is throughout the
entire work station.
Example
This example checks whether the password of the user “Hardy” is “Laurel”:
See Also
GET USER PROPERTIES, Set user properties.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CHANGE PASSWORD changes the password of the current user. This command replaces the
current password with the new password you pass in password.
Example
The following example allows the user to change his or her password.
See Also
CHANGE CURRENT USER.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Current user returns the user name of the current user.
Example
See example for the command User in group.
See Also
CHANGE CURRENT USER, CHANGE PASSWORD, User in group.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get default user command returns the unique user ID of the user set as “Default user”
in the database Preferences dialog box:
ID User description
1 Designer
2 Administrator
3 to 15000 User created by Designer (user #3 is the 1st user created by Designer,
user #4 is the second, and so on).
-11 to -15010 User created by the Administrator (user #-11 is the 1st user created by
Administrator, user #-12 is the second, and so on).
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
User in group returns TRUE if user is in group.
Example
The following example searches for specific invoices. If the current user is in the Executive
group, he or she is allowed access to forms that display confidential information. If the user is
not in the Executive group, a different form is displayed:
QUERY([Invoices];[Invoices]Retail>100)
If (User in group(Current user;"Executive"))
OUTPUT FORM([Invoices];"Executive Output")
INPUT FORM([Invoices];"Executive Input")
Else
OUTPUT FORM([Invoices];"Standard Output")
INPUT FORM([Invoices];"Standard Input")
End if
MODIFY SELECTION([Invoices];*)
See Also
Current user.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DELETE USER command deletes the user whose unique user ID number you pass in userID.
You must pass a valid user ID number returned by the command GET USER LIST.
If the user account does not exist or has already been deleted, the error -9979 is generated. You
can catch this error with an error-handling method installed using ON ERR CALL.
Deleted user names no longer appear in the Password window displayed when the database is
open or when you call CHANGE ACCESS. However, in order to maintain unique user ID
numbers, the user account is kept in the password system. Deleted user names are displayed in
green in the Design environment Passwords window.
See Also
GET USER LIST, GET USER PROPERTIES, Is user deleted, Set user properties.
Error Handling
If you do not have the proper access privileges for calling DELETE USER or if the Password
system is already accessed by another process, an access privilege error is generated. You can
catch this error with an error-handling method installed using ON ERR CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Function result Boolean ← TRUE = User account is deleted or does not exist
FALSE = User account is active
Description
The Is user deleted command tests the user account whose unique user ID number you pass in
userID.
If the user account does not exist or has been deleted, Is user deleted returns TRUE. Otherwise,
it returns FALSE.
See Also
DELETE USER, GET USER PROPERTIES, Set user properties.
Error Handling
If you do not have the proper access privileges for calling Is user deleted or if the Password
system is already accessed by another process, an access privilege error is generated. You can
catch this error with an error-handling method installed using ON ERR CALL.
version 6.0
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
GET USER LIST populates the arrays userNames and userNumbers with the names and unique
ID numbers of the users as they appear in the Passwords window.
The array userNames is filled with the user names displayed in the Passwords window,
including users whose accounts are disabled (user names displayed in green in the Passwords
window).
See Also
GET GROUP LIST, GET USER PROPERTIES, Set user properties.
Error Handling
If you do not have the proper access privileges for calling GET USER LIST or if the Password
system is already accessed by another process, an access privilege error is generated. You can
catch this error with an error-handling method installed using ON ERR CALL.
GET USER PROPERTIES (userID; name; startup; password; nbLogin; lastLogin{; memberships{;
groupOwner}})
Description
GET USER PROPERTIES returns the information about the user whose unique user ID number
you pass in userID. You must pass a valid user ID number returned by the command GET USER
LIST.
If the user account does not exist or has been deleted, the error -9979 is generated. You can
catch this error with an error-handling method installed using ON ERR CALL. Otherwise, you
can call Is user deleted to test the user account before calling GET USER PROPERTIES.
Note: GET USER PROPERTIES no longer returns the encrypted password in the password
parameter. Starting with version 6.0.2, an empty string is always returned in this parameter.
To check the password of a user, call the Validate password function.
If you pass the optional memberships parameter, the unique ID numbers of the groups to
which the user belongs are returned. Group ID numbers can have the following ranges:
If you pass the optional groupOwner parameter, you get the ID number of the user group
“owner”, i.e. the default owner group of the objects created by this user.
See Also
GET GROUP LIST, GET USER LIST, Set user properties, Validate password.
Error Handling
If you do not have the proper access privileges for calling GET USER PROPERTIES or if the
Password system is already accessed by another process, an access privilege error is generated.
You can catch this error with an error-handling method installed using ON ERR CALL.
Set user properties (userID; name; startup; password; nbLogin; lastLogin{; memberships{;
groupOwner}}) → Number
Description
Set user properties enables you to change and update the properties of an existing user account
whose unique user ID number you pass in userID, or to add a new user affiliated with the
Designer or the Administrator.
If you are changing the properties of an existing user account, you must pass a valid user ID
number returned by the GET USER LIST command.
If the user account does not exist or has been deleted, the error -9979 is generated. You can
catch this error with an error-handling method installed using ON ERR CALL. Otherwise, you
can call Is user deleted to test the user account before calling Set user properties.
To add a new user affiliated with the Designer pass -1 in userID. To add a new user affiliated
with the Administrator pass -2 in userID.
After the call, if the user is successfully added or modified, its unique ID number is returned in
userID.
If you do not pass -1, -2 or a valid user ID number, Set user properties does nothing.
Before the call, you pass the new name, startup method, password, number of logins and date
of last login for the user, in the name, startup, password, nbLogin and lastLogin parameters. You
pass an unencrypted password in the password parameter. 4D will encrypt it for you before
saving it in the user account.
If the new user name passed in name is not unique (there is already a user with the same
name), the command does nothing and the error -9979 is returned. You can catch this error
with an error-handling method installed using ON ERR CALL.
If you do not want to change all the properties of the user (aside from the memberships, see
below), first call GET USER PROPERTIES and pass the returned values for the properties you want
to leave unchanged.
If you do not want to change the password for an account, pass the * symbol as a value for the
password parameter. This allows you to change the other properties of the user account
without changing the password for the account.
If you do not pass the optional memberships parameter, the current memberships of the user
are left unchanged. If you do not pass memberships when adding a user, the user will not
belong to any group.
If you pass the optional memberships parameter, you change all the memberships for the user.
Before the call, you must populate the memberships array with the unique ID numbers of the
groups to which the user will belong.
See Also
DELETE USER, GET GROUP LIST, GET USER LIST, GET USER PROPERTIES, Is user deleted, Validate
password.
Error Handling
If you do not have the proper access privileges for calling Set user properties or if the Password
system is already accessed by another process, an access privilege error is generated. You can
catch this error with an error-handling method installed using ON ERR CALL.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The USERS TO BLOB command stores in the BLOB users the list of all user accounts and
database groups created by the Aministrator.
Only the database Administrator or the Designer can execute this command. If another
user attempts to execute it, the command does nothing and a privilege error (-9949) is
generated.
The generated BLOB is automatically encrypted and can only be read using the BLOB TO
USERS command. You can store this BLOB in a file on your hard disk or in a field.
This command is the equivalent of recording groups and users from the Toolbar. The only
difference is that it allows the storing of user accounts in a BLOB field and not just in a file.
This concept allows you to keep a backup of users in the database data and, as such,
implements a backup mechanism as well as a system to automatically load users in case of a
database structure file update (information related to user accounts are stored by 4th
Dimension in the database structure file).
See Also
BLOB TO USERS.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The BLOB TO USERS command adds the user accounts present in the BLOB users in the
database. The BLOB users is encrypted and must have been created using the USERS TO
BLOB command.
Only the database Administrator or Designer can execute this command. If another user
attempts to execute it, the command does nothing and a privilege error (-9949) is
generated.
If the command is executed correctly, the system variable OK is set to 1. Otherwise, it is set
to 0.
Compatibility note: User and group files (.4UG extension) created by the Save Groups...
menu command in versions of 4th Dimension prior to 2004 can be loaded in 4th
Dimension 2004 using the following sequence:
DOCUMENT TO BLOB(mydoc; blob)
BLOB TO USERS(blob)
See Also
USERS TO BLOB.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
GET GROUP LIST populates the arrays groupNames and groupNumbers with the names and
unique ID numbers of the groups as they appear in the Password editor window.
The array groupNumbers, synchronized with groupNames, is filled with the corresponding
unique group ID numbers. These numbers can have the following ranges:
See Also
GET GROUP PROPERTIES, GET USER LIST, Set group properties.
Error Handling
If you do not have the proper access privileges for calling GET GROUP LIST or if the Password
system is already accessed by another process, an access privilege error is generated. You can
catch this error with an error-handling method installed using ON ERR CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
GET GROUP PROPERTIES returns the properties of the group whose unique group ID number
you pass in groupID. You must pass a valid group ID number returned by the command GET
GROUP LIST. Group ID numbers can have the following values or ranges:
If you do not pass a valid group ID number, GET GROUP PROPERTIES returns empty parameters.
After the call, you retrieve the name and owner of the group, in the parameters name and
owner.
If you pass the optional members parameter, the unique ID numbers of the users and groups
belonging to the group are returned. Member ID numbers can have the following ranges:
Error Handling
If you do not have the proper access privileges for calling GET GROUP PROPERTIES or if the
Password system is already accessed by another process, an access privilege error is generated.
You can catch this error with an error-handling method installed using ON ERR CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Set group properties enables you to change and update the properties of an existing group
whose unique group ID number you pass in groupID, or to add a new group affiliated with the
Designer or the Administrator.
If you are changing the properties of an existing group, you must pass a valid group ID
number returned by the command GET GROUP LIST. Group ID numbers can have the
following values or ranges:
To add a new group affiliated with the Designer, pass -1 in groupID. To add a new group
affiliated with the Administrator, pass -2 in groupID. After the call, if the group is successfully
added, its unique ID number is returned in groupID.
If you do not pass -1, -2 or a valid group ID number, Set group properties does nothing.
If you do not pass the optional members parameter, the current member list of the group is
left unchanged. If you do not pass members while adding a group, the group will have no
members.
Note: The group owner is not automatically set as a member of the group that he or she owns.
It is up to you to include the group owner in the group, using the members parameter.
If you pass the optional members parameter, you change the whole member list for the group.
Before the call, you must populate the array members with the unique ID numbers of the users
and groups the group will get as members. Member ID numbers can have the following ranges:
To remove all the members from a group, pass an empty members array.
See Also
GET GROUP LIST, GET GROUP PROPERTIES, GET USER LIST.
Error Handling
If you do not have the proper access privileges for calling Set group properties or if the
Password system is already accessed by another process, an access privilege error is generated.
You can catch this error with an error-handling method installed using ON ERR CALL.
CHANGE LICENSES
Description
The CHANGE LICENSES command displays the 4D Update License dialog box, which enables
the user to activate plug-ins, the Web server or, with 4D Server, to add expansion numbers in
order to increase the number of clients who can use the database and its plug-ins
simultaneously.
Note: In 4th Dimension and 4D Server, you can display this dialog box by selecting the
Update License... command in the Help menu.
Using the CHANGE LICENSES command, you can display the 4D License dialog box from the
User and Custom menus environments.
For more information about this dialog box, please refer to the 4th Dimension Installation
Guide.
Example
In a custom configuration or preferences dialog box, you include a button whose method is:
` bLicense button object method
CHANGE LICENSES
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET PLUGIN ACCESS command lets you set, by programming, the user group allowed to
use each “serialized” plug-in that is installed in the database. By doing so, you can manage
how plug-in licenses are used.
Note: This operation can also be carried out in the Design environment using the Groups
editor.
Pass the number of the plug-in to be associated with a group of users in the plugIn
parameter. Plug-in licenses include 4D Client Web and SOAP licenses. You can pass one of
the following constants found in the “Is license available” theme:
Pass the name of the group whose users are authorized to use the plug-in in group.
Note: Only one group at a time can be allowed to use a plug-in. When this command is
executed, if another group had the plug-in access rights, it loses this privilege.
See Also
Get plugin access, GET PLUGIN LIST.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get plugin access command returns the name of the user group authorized to use the
plug-in whose number was passed in the plugIn parameter. If there is no group associated
with the plug-in, the command returns an empty string ("").
Pass the number of the plug-in for which you want to find out the associated group of users
in the plugIn parameter. Plug-in licenses include 4D Client Web and SOAP licenses. You
can pass one of the following constants found in the “Is license available” theme:
See Also
GET PLUGIN LIST, SET PLUGIN ACCESS.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET PLUGIN LIST command fills in the numbersArray and namesArray arrays with the
numbers and names of the plug-ins loaded by the 4th Dimension application. These two
arrays are automatically sized and synchronized by the command.
Note: You can compare the values returned in numbersArray with the constants of the “Is
license available” theme.
GET PLUGIN LIST takes all plug-ins into account, including those that are integrated (for
example, 4D Chart), and third-party plug-ins.
See Also
Get plugin access, Is license available, SET PLUGIN ACCESS.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAVE VARIABLES command saves one or several variables in the document whose name
you pass in document.
The variables do not need to be of the same type, but have to be of type String, Text, Real,
Integer, Long Integer, Date, Time, Boolean, or Picture.
If you supply an empty string for document, the standard Save File dialog box appears; the user
can then choose the document to create. In this case, the 4D system variable Document is set
to the name of the document if one is created.
If the variables are properly saved, the OK variable is set to 1. If not, OK is set to 0.
Note: When you write variables to documents with SAVE VARIABLES, 4th Dimension uses an
internal data format. You can retrieve the variables only with the LOAD VARIABLES command.
Do not use RECEIVE VARIABLE or RECEIVE PACKET to read a document created by SAVE VARIABLES.
WARNING: This command does not support array variables. Use the new BLOB commands
instead.
Example
The following example saves three variables to a document named UserPrefs:
See Also
BLOB TO DOCUMENT, BLOB TO VARIABLE, DOCUMENT TO BLOB, LOAD VARIABLES, System
Variables, VARIABLE TO BLOB.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The LOAD VARIABLES command loads one or several variables from the document specified by
document. The document must have been created using the command SAVE VARIABLES.
The variables variable, variable2...variableN are created; if they already exist, they are
overwritten.
If you supply an empty string for document, the standard Open File dialog box appears, so the
user can choose the document to open. If a document is chosen, the 4D system variable
Document is set to the name of the document.
In compiled databases, each variable must be of the same type as those loaded from disk.
WARNING: This command does not support array variables. Use the new BLOB commands
instead.
Example
The following example loads three variables from a document named UserPrefs:
See Also
BLOB TO DOCUMENT, BLOB TO VARIABLE, DOCUMENT TO BLOB, RECEIVE VARIABLE, VARIABLE
TO BLOB.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
This command acts differently in interpreted mode and in compiled mode.
In interpreted mode
CLEAR VARIABLE erases variable from memory. Consequently, the variable becomes undefined;
trying to read its value will generate a syntax error. Note that if you again assign a value to the
variable, 4D recreates the variable on the fly. After a variable is cleared, Undefined returns True
when applied to that variable.
In compiled mode
CLEAR VARIABLE only resets variable to its default type value (i.e., empty string for String and
Text variables, 0 for numeric variables, no elements for arrays, etc.). The variable still exists—
variables can never be undefined in compiled code.
Note: You do not need to clear process variables when a process ends; 4D clears them
automatically.
Local variables, which are variables preceded by a dollar sign ($), cannot be cleared with
CLEAR VARIABLE. They are cleared automatically when the method in which are located
completes execution.
See Also
Undefined.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
Undefined returns True if variable has not been defined, and False if variable has been defined.
A variable is defined if a value is assigned to it. A variable is undefined if it does not have a
value assigned to it, or if it has been cleared with CLEAR VARIABLE.
If the database has been compiled, the Undefined function returns False for all variables.
Examples
1. Up to version 6, a good way to test if you were running in interpreted mode or in compiled
mode was to write:
anyVar:="Hello"
CLEAR VARIABLE(anyVar)
If (Undefined(anyVar))
` You are in interpreted mode
Else
` You are in compiled mode
End if
Starting with version 6, it is more convenient to use the built-in command Compiled
application.
2. The following code manages the creation of processes when a menu item for a particular
module of your application is chosen. If the process already exists, you bring it to the front; if
it does not exist, you start it. To do so, for each module of the application, you maintain an
interprocess variable <>PID_... that you initialize in the On Startup database method.
If (<>PID_ADD_CUSTOMERS=0)
<>PID_ADD_CUSTOMERS:=New process("P_ADD_CUSTOMERS";64*1024;
"P_ADD_CUSTOMERS")
Else
SHOW PROCESS(<>PID_ADD_CUSTOMERS)
BRING TO FRONT(<>PID_ADD_CUSTOMERS)
End if
` Note: P_ADD_CUSTOMERS, the process master method,
` sets <>PID_ADD_CUSTOMERS to zero when it ends.
See Also
CLEAR VARIABLE.
4th Dimension, 4D Server and 4D Client include a Web Server engine that enables you to
publish 4D databases or any type of HTML page on the Web. The principal characteristics of
the 4D Web Server engine are:
• Easy publication
You can start or stop publication of the database on the Web at any time. To do so, you just
need to choose a menu command or execute a language command.
• Access Security
Several automatic configuration options allow you to grant specific access authorizations to
Web browsers or to use the password system integrated into 4th Dimension. You can define a
"Generic Web User" to simplify access management within the database.
The On Web Authentication Database Method allows you to evaluate any request before it is
processed by the Web server. Moreover, the ability to define a default HTML root folder allows
you to restrict access to files on disk.
Finally, you must designate individually the project methods that may be executed via the
Web.
• SSL Connections
Your 4D Web server can communicate with browsers in secured mode through the SSL
protocol (Secured Socket Layer). This protocol, compatible with most Web browsers,
authenticates the sender and receiver and guaranties the confidentiality and integrity of the
exchanged information.
• CGI Support
The 4D Web Server can call CGIs in a very simple way, as well as be called by other HTTP
servers through CGIs.
The basic mechanisms of the 4D Web server are used in a similar manner by 4D Client, with
the exception of the contextual mode. In fact, it is not possible to use the contextual mode
with the 4D Client Web server (for more information about this mode, refer to the Using the
Contextual Mode section).
Similarly, the operation of language commands is usually identical, whether the command be
executed on 4th Dimension, 4D Server or 4D Client. The main point is that commands are
applied to the Web site of the machine on which they are executed. You must manage this
using the Execute on server / EXECUTE ON CLIENT commands.
• Load balancing with 4D Client: since any 4D Client machine can be used as a Web server,
you can set up a dynamic Web server system with a load balancer. This offers extensive
development possibilities, including, more particularly:
- the setting-up of a load-balancing system in order to optimize the performance of the 4D
Web server: using a mirror of the Web site that is installed on each 4D Client Web server, a
load balancer (hardware or software) will send requests to the client machines on the basis of
their current load.
- the setting-up of a fault tolerance Web server: the 4D Web site is mirrored on two or more
4D Client machines. If one 4D Client Web server fails, another one takes over.
See Also
Connection Security, SEND HTML FILE, SET HOME PAGE, SET HTML ROOT, SET WEB DISPLAY
LIMITS, SET WEB TIMEOUT, STOP WEB SERVER, Using CGIs, Using SSL Protocol, Using the
Contextual Mode, Web Server Settings.
4th Dimension, 4D Server and 4D Client include a Web server that enable you to publish the
data of your databases on the Web, transparently and dynamically.
This section describes the steps necessary for publication of 4D databases and for connection
of browsers, as well as the process of connection management.
To be able to publish a 4D database on the Web using 4th Dimension, 4D Server or 4D Client,
you must have the elements described below:
• The required 4D Web Extension, 4D Server Web Extension or 4D Client Web Extension
licenses must be installed in your application. For more information, please refer to your 4D
Product Line Installation Guide.
• Web connections are made over the network using the TCP/IP protocol. Consequently:
- You must have TCP/IP installed on your machine and correctly configured. Refer to your
computer or Operating System manuals for more information.
- If you want to use SSL for network connections, make sure that requested components are
correctly installed (see section Using SSL Protocol).
• After all the previous points have been checked and taken care of, you need to start the Web
server from within 4D. This last point is discussed further on in this section.
To do this, display the Groups page in the Toolbox using 4D Client (you must have suitable
access authorization to modify these parameters).
Above: only users belonging to the "Web" group are authorized to publish their 4D Client
machine as a Web server.
Under Mac OS X, using TCP/IP ports reserved for Web publishing requires specific access
privileges: only the “root” user of the machine can launch an application using these ports.
These ports are numbers 0 to 1023. Remember that, by default, a 4D database is published on
TCP port 80 in standard mode and on port 443 in SSL mode.
To use the Web server under Mac OS X, you have four possibilities:
• Port transfer
This third solution lets you publish a 4D Web database under Mac OS X without being a
“root” user and without it being necessary to specify the port number behind each connection
URL to the server. It is based on port transfer. The principle consists of transferring, at the
system level, the requests received on the standard TCP port number (80) to one specified in
the 4D database (which must be greater than 1023). Note that this tip will not work with
secured connections (the TCP port 443 is not modifiable).
To carry out this operation, you must connect as a “root” user, start the Terminal and use
Unix commands.
To set up the port transfer under Mac OS X (assuming that your IP address is 192.168.93.45):
1. Open a session as a root user (see the previous paragraph).
2. Start the Terminal program.
This program is found in the Applications:Utilities folder.
3. Enter “su” (“substitute user” special account) followed by the root user password.
4. Enter the following command:
ipfw add 400 fwd 192.168.93.45,8080 tcp from any to 192.168.93.45 80
Of course, you must replace “192.168.93.45” with your own IP address.
The figure 400 is the reference number of this operation.
5. Quit the Terminal program.
6. Start your 4D application as a standard user.
7. In the Preferences of the database, set the Web publication TCP port to 8080.
From then on, Mac OSX is ready to transfer the requests received on port 80 to port 8080
instantaneously and in a manner which is invisible for the user.
The drawback of this mechanism is that once it is in place, you cannot stop, start and restart
the Web server at will during a session. You cannot go from a standard user session to a “root”
session (higher access privileges) without restarting the application. This mechanism only
works on application startup.
4D Server:
In the Web Server Publishing section, select the Publish Database at Startup check box, then
click OK. Once this is done, the database will be automatically published on the Web each
time you open it with 4th Dimension, 4D Server or 4D Client.
Tip: You do not need to quit 4D and reopen your database to start or stop publishing a
database on the Web. You can interrupt and restart the Web server as many times as you want,
using the Run menu or calling the commands START WEB SERVER and STOP WEB SERVER.
The Test Web Server command can be used to make sure the built-in Web server is
functioning correctly (4th Dimension and 4D Client only). This command is accessible in the
Run menu when the Web server is launched:
When you select this command, the home page of the Web site published by the 4D
application is displayed in a window of your default Web browser:
This command lets you verify that the Web server, home page display, etc. work correctly. The
page is called using the URL Localhost, which is the standard shortcut designating the IP
address of the machine on which the Web browser is executed. The command takes into
account the TCP publication port number specified in the application preferences.
After you have started publishing a 4D database on the Web, you can connect to it using a
Web browser. To do so:
• If your Web site has a registered name (i.e., “ www.flowersforever.com”), indicate that name
in the Open, Address, or Location area of your browser. Then press Enter to connect.
• If your Web Site does not have a registered name, indicate the IP address of your machine
(i.e., 123.4.567.89) in the Open, Address, or Location area of your browser. Then press Enter.
At this time, your browser should display the home page of your Web site. If you have
published a database in keeping with standard configurations, you should obtain the default
home page of the 4th Dimension Web server. This page lets you test the connection and the
server operation.
2. You connect, but you get an HTTP 404 "File not found" error. This means that the site home
page has not be served. In this case, check that the home page actually exists at the location
defined in the database Preferences (see Web Server Settings section) or using the SET HOME
PAGE command.
4. You connect, but you do NOT obtain the Web page you were expecting! This can occur
when you have several Web servers running simultaneously on the same machine. Examples:
• You are running only one 4D Web database on a Windows system that is already running its
own Web server.
• You are running several 4D Web databases on the same machine.
In this kind of situation, you need to change the TCP port number on which your 4D Web
database is published. To do so, refer to Web Server Settings section.
Note: If your database is protected by a password system, you may have to enter a valid user
name and password (for more information, refer to section Connection Security).
Various 4D processes support Web publication of databases and connection to browsers. This
paragraph describes these processes as well as their characteristics.
You can start the Web Server process in the following ways:
• Choose Start Web Server in the Web Server menu of 4D Server or the Run menu of
4th Dimension/4D Client.
• Call the 4D command START WEB SERVER.
• Open a database whose Publish Database at Startup Preference is checked.
You can stop running the Web Server process in the following ways:
• Choose Stop Web Server from the User environment Web Server menu of 4D Server or the
Run menu of 4th Dimension/4D Client.
• Call the 4D command STOP WEB SERVER.
• Quit the database being currently published.
The purpose of the Web Server process is only to handle Web connection attempts. Starting
the Web Server process does not mean that you open an actual Web connection, it just means
that you allow Web users to initiate Web connections. Stopping the Web Server process does
not mean that you close currently running Web connection processes (if any), it just means
that you no longer allow Web users to initiate new Web connections.
If there are open Web connection processes when you stop the Web Server process, each of
these processes continues executing normally.
Consequently, a delay time can be necessary to complete the termination of the Web Server
process.
Each time a Web browser attempts to connect to the database, the request is handled by the
Web Server process, which performs the following steps:
• First, it creates one or several temporary local 4D processes called Web Processes to evaluate
and manage the connection with the Web browser.
Note: These temporary processes manage every HTTP request. They execute quickly and then
aborted or delayed. For the Web server to be reactive in non-contextual mode, 4D freezes this
“pool” of Web processes for 5 seconds and reuses them to execute any possible future HTTP
queries. You can customize this behavior using the command SET DATABASE PARAMETER.
• If the request does not require that a context be created, the Web process handles the
processing of the request and sends a response (if necessary) to the browser. The temporary
process is then aborted or delayed (see above).
Note that the sixth process, which was started then aborted, handled the initialization of the
Web connection.
Note: For more information about the context management, see the paragraph Using the
Contextual Mode section.
• If during the session, the connection switches from contextual mode to non-contextual
mode, the Web connection process (with an ID) is aborted.
Conversely, if during the session, the connection switches from non-contextual mode to
contextual mode, a numbered Web connection process is created.
See Also
SEND HTML FILE, SET HTML ROOT, SET WEB DISPLAY LIMITS, SET WEB TIMEOUT, STOP WEB
SERVER, Using SSL Protocol.
The structure of this database (given at the end of this section) is simple: the database is made
of one table, an input form, an output form and a menu bar. The Home page is customized.
The database is published as a Web server.
At this point, you can browse the records at your convenience. After you click the Done
button, you go back to the Web site Home page.
3. Add records
In the Web site Home page, click on the Linked text Add Some Records to display the Web
equivalent of a 4D Add Record screen:
At this point, clicking on each menu item allows you to List or Add records: the same 4D
methods that were used from the Home page are associated to the menu items.
A Web connection to 4D or 4D Server is not the same as a Client/Server connection. The HTTP
protocol, which supports HTML and the Web, is not a “session-based” protocol; it is rather a
“request-based” protocol. In Client/Server, you connect, work in a session, and then
disconnect from the server. With HTTP, each time you perform an action that requires the
attention of or an action from the Web Server, a request is sent to the server. In short, an
HTTP request can be understood as the sequence “Connect+Request+Wait for
reply+Disconnect.”
In contextual mode, in order to run a Client/Server session via HTTP, by default 4D maintains,
through a transparent encoding of the URLs, a context that uniquely identifies your Web
connection and at the same time associates the connection to the 4D process handling the
connection.
If we eliminate the HTML home page, building a Web Server supporting database
Client/Server transactions consists of building a 4D database on Windows or Macintosh, for
one or multiple users. The following steps explain the process of creating the example
database in this way.
• Input and Output forms are added to enable you to work with records.
• Menu bar #1 is added to enable you to work with Custom menus and to support Web
connections.
• The Web server starts up in contextual mode and a default home page is defined in the
database Preferences:
Once these links have been defined, when the Web browser sends back the URL, 4D executes
the project method specified after the /4DMETHOD/ keyword. Then, after the project method
has been completed, you go back to the HTML page that triggered its execution. Note that the
project method can itself display 4D forms, other HTML pages, and so on.
Your 4D-based Web Site can be a completely 4D-based system or a combination of 4D forms
and HTML pages. The interesting point in using HTML pages from within your 4D database is
that you benefit from both the 4D and HTML development environments. Remember, you do
not have to use HTML pages if you do not want to
The HTML home page in this example includes a button used to submit a record. There are
three types of HTML buttons: normal, submit, and reset.
• Normal - Normal buttons can be attributed an URL that refers to a 4D method using the
/4DMETHOD/ keyword. Normal buttons are used for navigation purposes.
• Submit - Submit buttons submit the form with the values entered by the user (if any) to the
Web server. They are useful for handling data entry that you prefer to perform via an HTML
page rather than a plain 4D form
• Reset - Reset buttons are not very useful within a 4D development: they clear the form of the
values entered by the user (if any) and does not send any request to the server.
To submit the HTML form on the 4D side, you need to specify the POST action 4D method
that will be executed by 4D after the form is submitted.
To do this, it must contain the line FORM ACTION="/4DMETHOD/GO_MAIN_MENU_BAR"
METHOD="POST"
In this example, this method has only one purpose: getting out of the current default home
page displayed on the Web browser and then sending the current menu bar. 4D switches to
the menu bar #1 of the database.
That is it!
In less than five minutes, you have created a 4D database that is both a locally operable
database and a Web Server that you can publish on your Intranet network or on the Internet.
See Also
SEND HTML FILE, SET WEB DISPLAY LIMITS, SET WEB TIMEOUT, START WEB SERVER, STOP WEB
SERVER.
• The combination of the Web password management system and the On Web Authentication
Database Method,
• The definition of a Generic Web User,
• The definition of a HTML Root folder by default,
• The definition of the “Available through 4DACTION, 4DMETHOD and 4DSCRIPT” property
for each project method of the database.
Note: The security of the connection itself can be managed through the SSL protocol. For
more information, refer to section Using SSL Protocol.
You can now define, in the Preferences dialog box, the access control system you want to
apply to your Web server. To do this, in the Preferences dialog box, choose the Advanced page
of the Web theme:
In the "Passwords" area, two options are available to you: Use Passwords and Include 4D
Passwords. The second check box is only active if the first one has been selected.
• Include 4D Passwords: allows you to use, instead of or in addition to your own password
system, 4D’s database password system (as defined in 4D).
Notes:
- With the 4D Client Web server, keep in mind that all the sites published by the 4D Client
machines will share the same table of users. Validation of users/passwords is carried out by the
4D Server application.
- Passwords entered by users are not encrypted in the HTTP requests (Basic mode).
The operation of the 4D Web server's access system is summarized in the following diagram:
For example:
User-Agent: *
Disallow: /4D
Disallow: /%23%23
Disallow: /GIFS/
“User-Agent: *” means that all robots are affected.
“Disallow: /4D” means that robots are not allowed to access URLs beginning with /4D.
“Disallow: /%23%23” means that robots are not allowed to access URLs beginning with
/%23%23.
“Disallow: /GIFS/’ means that robots are not allowed to access the /GIFS/ folder or its
subfolders.
Another example:
User-Agent: *
Disallow: /
In this case, robots are not allowed to access the entire site.
You can designate a user, previously defined in the 4D password table, as a “Generic Web
User.” In this case, each browser that connects to the database can use the access
authorizations and restrictions associated with this generic user. You can therefore easily
control the browser’s access to the different parts of the database.
Note: Do not confuse this option, which allows you to restrict the browser’s access to different
parts of the database (tables, menus, etc.), with the Web server’s connection control system,
managed by the password system and the On Web Authentication Database Method.
All the Web browsers that are authorized to connect to the database will benefit from the
access authorizations and restrictions associated with this Generic Web User (except when the
“Include 4D Passwords” option has been selected and the user that connects does not exist in
the 4D password table, see below).
However, when the "Include 4D passwords" option is selected, two possible results can occur:
• The user’s name and password don’t exist in 4D’s password table. In this case, if the
connection has been accepted by the On Web Authentication Database Method, the Generic
Web User’s access rights will be applied to the browser.
• If the user’s name and password exist in 4D’s password table, the “Generic Web User”
parameter is ignored. The user connects with his own access rights.
This option in the Preferences allows you to define the folder in which 4D will search for the
static and semi-dynamic HTML pages, pictures, etc., to send to the browsers.
Moreover, the HTML root folder defines, on the Web server hard drive, the hierarchical level
above which the files will not be accessible. This access restriction applies to URLs sent to Web
browsers as well as to 4D’s Web server commands, such as SEND HTML FILE. If a URL is sent to
the database by a browser or if a 4D command tries to access a file located above the HTML
root folder, an error is returned indicating that the file has not been found.
You can modify the default HTML root folder name and location in the Preferences dialog box
(Web theme, Configuration page):
In the “Default HTML Root” entry area, enter the new access path of the folder that you wish
to define.
The access path entered in this dialog box is relative: it is established from the folder
containing the structure of the database (4th Dimension or 4D Server) or the folder containing
the 4D Client application or software package (4D Client).
For multi-platform compatibility of your databases, the 4D Web server uses particular writing
conventions to describe access paths. The syntax rules are as follows:
• Folders are separated by a slash (“/”)
• The access path must not end with a slash (“/”)
• To “go up” one level in the folder hierarchy, enter “..” (two periods) before the folder name
• The access path must not start with a slash (“/”) (except if you want the HTML root folder to
be the database or 4D Client folder, see below).
For example, if you want the HTML root folder to be the “Web” subfolder in the
“4DDatabase” folder, enter 4DDatabase/Web.
If you want the HTML root folder to be the database or 4D Client folder, but for access to the
folders above to be forbidden, enter “/” in the area. For a completely free access to the
volumes, leave the “Default HTML Root” area empty.
WARNING: If you do not define a default HTML Root folder in the Preferences dialog box, the
folder that contains the structure file of the database or the 4D Client application will be used.
Be careful because in this case there are no access restrictions (users can access all the
volumes).
Note: When the HTML root folder is modified in the Preferences dialog box, the cache is
cleared so as to not store files whose access is restricted.
Note: The SET HTML ROOT command has no effect when the Web server is in non-contextual
mode.
The special 4DACTION (non-contextual mode) and 4DMETHOD (contextual mode) URLs, as
well as the 4DSCRIPT, 4DVAR and 4DHTMLVAR tags, allow you to trigger the execution of any
project method of a4D database published on the Web. For example, the request
http://www.server.com/4DACTION/Erase_All causes the execution of the Erase_All project
method, if it exists.
This mechanism therefore presents a security risk for the database, in particular if an Internet
user intentionally (or unintentionally) triggers a method not intended for execution via the
Web. You can avoid this risk in three ways:
• Restrict access to project methods using the 4D password system. Drawbacks: This system
requires the use of 4D passwords and forbids any type of method execution (including using
HTML tags).
• Filter the methods called via the URLS using the On Web Authentication Database Method.
Drawbacks: If the database includes a great number of methods, this system may by difficult to
manage.
This option is used to individually designate each project method that can be called using the
special URLs, 4DACTION and 4DMETHOD, or the 4DSCRIPT, 4DVAR and 4DHTMLVAR tags.
When it is not checked, the project method concerned cannot be executed using an HTTP
request containing a special URL or tag. Conversely, it can be executed using other types of
calls (formulas, other methods, etc.).
This option is unchecked by default for databases created with 4th Dimension starting with
version 2003. Methods that can be executed using the 4DACTION or 4DMETHOD Web URLs or
the 4DSCRIPT, 4DVAR and 4DHTMLVAR tags must be specifically indicated.
Conversely, for reasons of compatibility, this option is checked for existing databases (created
with a version of 4D earlier than 2003): by default, all the project methods are accessible via
Web requests.
In the Explorer, Project methods “available through 4DACTION, 4DMETHOD and 4DSCRIPT”
are given a specific icon:
See Also
On Web Authentication Database Method, On Web Connection Database Method, Using SSL
Protocol.
The On Web Authentication Database Method is in charge of managing Web server engine
access. It is called by 4th Dimension, 4D Server or 4D Client when a Web browser request
requires the execution of a 4D method on the server (method called using a 4DACTION or
4DCGI URL, a 4DSCRIPT tag, etc.).
This method receives six Text parameters: $1, $2, $3, $4, $5, and $6, and returns one Boolean
parameter, $0. The description of these parameters is as follows:
C_TEXT($1;$2;$3;$4;$5;$6)
C_BOOLEAN($0)
Note: All the On Web Authentication database method’s parameters will not eventually be
filled in. The information received by the database method depends on the options that you
have previously selected in the Preferences dialog box (please refer to the section Connection
Security).
• URL
The first parameter ($1) is the URL entered by the user in the location area of his or her Web
browser, from which the host address has been removed.
Note: For more information about this parameter, please refer to the description of the On
Web Connection Database Method.
• Server IP address
The $4 parameter receives the IP address used to call the Web server. 4D since version 6.5
allows for multi-homing, which allows you to exploit machines with more than one IP
address. For more information, please refer to the section Web Server Settings.
Note: If the user name sent by the browser exists in 4D, the $6 parameter (the user’s password)
is not returned for security reasons.
The On Web Connection Database Method is only executed if the connection has been
accepted by On Web Authentication.
Notes
• Do not call any interface elements in the On Web Authentication Database Method (ALERT,
DIALOG, etc.), otherwise it will be interrupted and the connection will be refused. The same is
true if an error occurs while the database method is being executed.
• It is possible to forbid execution by 4DACTION or 4DMETHOD for each project method using
the “Available through 4DACTION, 4DMETHOD and 4DSCRIPT” option in the Method
properties dialog. For more information about this point, refer to the Connection Security
section.
The On Web Authentication Database Method is therefore called in the following cases:
• when 4D receives a URL beginning with 4DACTION/
• when 4D receives a URL beginning with 4DMETHOD/
• when 4D receives a URL beginning with 4DCGI/
• when 4D receives a URL requesting a static page that does not exist
• when 4D processes a 4DSCRIPT tag in a semi-dynamic page
• when 4D processes a 4DLOOP tag based on a method in a semi-dynamic page.
Note that the On Web Authentication Database Method is NOT called when the server receives a
URL requesting a valid static page.
$0:=False
$user:=$5
$password:=$6
$BrowserIP:=$3
$ServerIP:=$4
If (Not($4Duser))
`It is not a user defined 4D, look in the table of Web users
QUERY([WebUsers];[WebUsers]User=$user;*)
QUERY([WebUsers]; & [WebUsers]Password=$password)
$0:=(Records in selection([WebUsers]) = 1)
Else
`WithWildcard Method
`WithWildcard ( String ) -> Boolean
`WithWildcard ( Name ) -> Contains a Wilcard character
C_INTEGER($i)
C_BOOLEAN($0)
C_TEXT($1)
$0:=False
For($i;1;Length($1))
If (Ascii(Substring($1;$i;1)) = Ascii("@"))
$0:=True
End if
End for
See Also
Connection Security, Database Methods, On Web Connection Database Method, URLs and Form
Actions.
The On Web Connection database method can be called in three different cases:
• the Web server receives a request beginning with the 4DCGI URL.
• the Web server receives an invalid request.
• it is also called by 4th Dimension or 4D Server each time a Web browser initiates a
connection to the database in contextual mode, or each time the Web server receives a request
requiring the creation of a context (this case is not handled by 4D Client, which does not
support the contextual mode).
For more information, refer to the paragraph “On Web Connection Database Method calls”
below.
The request should have been previously accepted by the On Web Authentication Database
Method (if it exists) and the database should be published as a Web server.
The On Web Connection database method receives six text parameters that are passed by 4D.
The contents of these parameters are as follows:
C_TEXT($1;$2;$3;$4;$5;$6)
Note that you are free to use this parameter at your convenience. 4D simply ignores the value
passed beyond the host part of the URL.
For example, you can establish a convention where the value "/Customers/Add" means “go
directly to add a new record in the [Customers] table.” By supplying the Web users of your
database with a list of possible values and/or default bookmarks, you can provide shortcuts to
the different parts of your application. This way, Web users can quickly access resources of
your Web site without going through the whole navigation path each time they make a new
connection to your database.
WARNING: In order to prevent a user from reentering a database with a bookmark created
during a previous session, 4D intercepts any URL that corresponds to one of the standard 4D
URLs.
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.5 (Macintosh; I; PPC)
Host: 123.45.67.89
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
Accept-Encoding: gzip
Accept-Language: us
Accept-Charset: iso-8
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: 123.45.67.89
Accept: image/gif, image/x-xbitmap, image/pjpeg, */*
Accept-Language: us
If your application deals with this information, it is up to you to parse the header and the
body.
Note: If the user name sent by the browser exists in 4D, the $6 parameter (the user’s password)
is not returned for security reasons.
The On Web Connection Database Method can be used as the entry point for the 4D Web
server, either using the special 4DCGI URL, or using customized command URLs. It also plays a
role as the entry point in contextual mode (with 4th Dimension and 4D Server).
Warning: Calling a 4D command that displays an interface element (ALERT, DIALOG...) ends
the method processing.
(*) In this particular cases, the URL received in $1 does NOT start with the "/" character.
To know whether the On Web Connection Database Method was called from a contextual or
from a non-contextual connection, you can use the Web Context function, that returns True if
it is called from contextual mode, and False otherwise.
Consequently, we suggest that you structure the On Web Connection database method in the
following manner:
` Table List
ARRAY STRING(31;<>asTables;Count tables)
For ($vlTable;1;Size of array(<>asTables))
<>asTables{$vlTable}:=Table name($vlTable)
End for
The main job of the On Web Connection database method is to decipher the extra data passed
in the URL after the host part of the address and to act accordingly. The method is as follows:
At this point, people within the organization can connect to the database and enter a URL
according to the convention set by the methods listed. Users can also create bookmarks if they
do not want to re-enter the URL each time. In fact, the ultimate solution is to provide each
member of the organization with an HTML page that they will use locally to access the
database. This HTML page is shown:
In other words, the HTML page ACME_IS.HTM is the Client Local Home Page for the 4D-based
information system of the organization. If a user clicks on the Add New Products link, the
Web browser will connect to the host having the URL http://123.4.567.89/Products/Add.
Provided that the IP address of the database computer is 123.4.567.89, the On Web Connection
Database Method receives the extra URL data "/Products/Add" in $1, and therefore proceeds to
add records in the [Products] table.
See Also
Database Methods, On Web Authentication Database Method, URLs and Form Actions, Using the
Contextual Mode.
This section describes the means made available by the 4D Web server for exchanging
information via the Web, i.e. for dynamically sending and receiving values. The following
points will be dealt with:
• Sending dynamic values stored in 4D variables
• Receiving dynamic values via Web forms
• Using the COMPILER_WEB project method
• Managing server-side image mapping
• Embedding JavaScript
Note: the sending and receiving of dynamic values can be carried out automatically in
contextual mode via converted 4D forms. For more information on this point, refer to the
section Using the contextual mode.
References to 4D variables can be inserted in your HTML pages. You can bind these references
with any type of HTML object. When the Web pages are sent to the browser, 4D will replace
these references with the current values of the variables. The pages received are therefore a
combination of static elements and values coming from 4D. This type of page is called semi-
dynamic.
Notes:
• You work with process variables.
• As HTML is a word processing oriented language, you will usually work with Text variables.
However, you can also use BLOBs variables (which avoid the 32 000 characters limitation of
text type variables). You just need to generate the BLOB in Text without length mode.
First, an HTML object can have its value initialized using the value of a 4D variable.
Second, after a Web form is submitted back, the value of an HTML object can be returned into
a 4D variable. To do so, within the HTML source of the form, you create an HTML object
whose name is the same as the name of the 4D process variable you want to bind. That point
is studied further in the paragraph “Receiving dynamic values” in this document.
Note: Some HTML editors may not accept <!--#4DVAR VarName--> in the value field of HTML
objects. In this case, you will have to type it in the HTML code.
The <!--#4DVAR --> tag also allows the insertion of 4D expressions in the pages sent (fields,
array elements, etc.). The operation of this tag with this type of data is identical to that with
variables. For more information, refer to the section 4D HTML Tags.
In fact, the syntax <!--#4DVAR VarName--> allows you to insert 4D data anywhere in the HTML
page. For example, if you write:
Here is an example:
` The following piece of 4D code assigns "4D4D" to the process variable vs4D
vs4D:="4D4D"
` Then it send the HTML page "AnyPage.HTM"
SEND HTML FILE("AnyPage.HTM")
In the HTML source code shown, note the hidden input object named vs4D. The value of this
object is set to the text value "<!--#4DVAR vs4D-->". Since the project method sending the
HTML file has previously defined the 4D process variable vs4D, 4D replaces the value of the
HTML object and sets it to "4D4D", the value of the 4D variable.
This first example shows how you can build “intelligent” HTML pages that provide additional
features when being served by 4D, while staying compatible with other Web servers.
Important: You bind process variables only. In addition, the current version of 4D does not
allow you to bind a 4D array to an HTML SELECT object. On the other hand, each element of
a SELECT object can refer to separate 4D variables (i.e., the first element to V1, the second to
V2, and so on).
The binding in the direction 4D toward Web Browser works with any encapsulation method
(SEND HTML FILE, SEND HTML BLOB, as well as, in contextual mode, static text or text or BLOB
variable in a 4D form).
• Insert directly the 4D variable (i.e., vtHTML:="...HTML code...") in the HTML page using the <!-
-#4DHTMLVAR vtHTML--> tag.
You can use a Text or a BLOB variable (the BLOB should have been generated in Text without
length mode).
When you send an HTML page using SEND HTML FILE or SEND HTML BLOB, you can also bind
4D variables with HTML objects in the “Web Browser toward 4D” direction. The binding
works both ways: once the HTML form is submitted, 4D can copy back the values of the HTML
objects into the 4D process variables. With a view to database compilation, these variables
must be declared in the COMPILER_WEB method (see paragraph below).
It is also possible to retrieve values from the Web forms sent to 4D without prior knowledge of
the fields that they contain, using the GET WEB FORM VARIABLES command. For more
information, refer to the description of this command.
Warning: Getting the values back into the 4D process variables is only possible with HTML
pages sent using SEND HTML FILE or SEND HTML BLOB. With HTML encapsulated in a 4D form
in contextual mode, getting back values is restricted to the actual 4D objects located in the
form.
Let’s examine the 4D method WWW Welcome that sends this HTML page using the SEND
HTML FILE command. This method is called by the On Web Connection Database Method.
C_BOOLEAN($0)
$0:=False
• The 4D variables vsbLogOn, vsbRegister and vsbInformation are bound to the three Submit
buttons. Note that these variables are reset each time the page is sent to the browser. When
the submit is performed by one of these buttons, the browser returns the value of the clicked
button to 4D. The 4D variables are reset each time, so the variable that is no longer equal to
the empty string tells you which button was clicked. The two other variables are empty
strings, not because the browser returned empty strings, but because the browser “said”
nothing about them; consequently, 4D left the variables unchanged. That is why it is
necessary to reset those variables to the empty string each time the page is sent to the browser.
This the way to distinguish which Submit button was clicked when several Submit buttons
exist on the Web page. Note that 4D buttons in a 4D form are numeric variables. However,
with HTML, all objects are text objects.
If you bind a 4D variable with a SELECT object, you also bind a text variable. In 4D, to test
which element of a drop-down list was chosen, you test the numeric value of the 4D array.
With HTML, this is the value of the selected item that is returned in the 4D variable bound to
the HTML object.
No matter which object you bind with a 4D variable, the returned value is of type Text, so you
bind String or Text 4D process variables.
After you have saved the information in a table, you can use other project methods to send
the information back to the Web user. To do so, simply use QUERY to find the right
information and then use DISPLAY SELECTION to show the [WWW Log] records. The following
figure shows the log information available to the registered user of the Web site:
Using the binding features shown in this example, combined with all the information you can
give to or gather from users via HTML dialogs or 4D forms, you can add some very interesting
administrative capabilities to your database Web site.
When the 4D Web server receives a posted form, it automatically calls the project method
called COMPILER_WEB (if it exists). This method must contain all the typing and/or variable
initialization directives, which are the variables whose names are the same as the field names
in the form. It will be used by the compiler when compiling the database.
The COMPILER_WEB method is common to all the Web forms. By default, the COMPILER_WEB
method does not exist. You must explicitly create it.
Note: You can also use the GET WEB FORM VARIABLES command, which gets the value for all
the variables included in a submitted HTML page.
Web Services: The COMPILER_WEB project method is called, if it exists, for each SOAP request
accepted. You must use this method to declare all the 4D variables associated with incoming
SOAP arguments, for all methods published as Web Services. In fact, the use of process
variables in Web Services methods requires that they be declared before the method is called.
For more information on this point, refer to the description of the SOAP DECLARATION
command.
As seen in the section Using the Contextual Mode, when a 4D form is used as a Web page, 4D
provides Server-side Image Mapping by means of invisible-like buttons that overlap a static
picture.
If you send an HTML document using SEND HTML FILE or SEND HTML BLOB, you can bind 4D
variables with Image Map HTML objects (INPUT TYPE="IMAGE") to retrieve information. For
example, you can create an Image Map HTML object named bImageMap (you can actually use
any name). Each time you click on the image on the browser side, a submit with the click
position is sent back to the 4D Web Server. To retrieve the coordinates of the click (expressed
relative to the top left corner of the image), you just need to read the value the 4D process
variables bImageMap_X and bImageMap_Y (of type Longint) which contain the horizontal and
vertical coordinates of the click. These variables should be declared in the COMPILER_WEB
project method (see previous paragraph).
C_LONGINT(bImageMap_X;bImageMap_Y)
bImageMap_X:=-1 `Initializing the variable
bImageMap_Y:=-1 `Initializing the variable
• Then, in the POST action 4D method or in the current method, after the POST action
method issued a SEND HMTL FILE("") call, you retrieve the coordinates of the click in the
bImageMap_X and bImageMap_Y variables :
If (($bImageMap_X#-1)&($bImageMap_Y#-1))
` Do something accordingly to the coordinates
End if
JavaScript Encapsulation
4D supports JavaScript source code embedded into HTML documents, and also JavaScript .js
files embedded in HTML documents (for example <SCRIPT SRC="...").
Using SEND HTML FILE or SEND HTML BLOB in standard mode, you send a page that you have
prepared in an HTML source editor or built programmatically using 4D and saved as a
document on disk. In both cases, you have full control of the page. You can insert JavaScript
scripts in the HEAD section of the document as well as use scripts with the FORM markup. In
the previous example, the script refers to the form "frm" because you were able to name the
form. You can also trigger, accept, or reject the submission of the form at the FORM markup
level.
In contextual mode, if you encapsulate HTML in a 4D form, you do not have control over the
HEAD section or the FORM declaration. The scope of the scripts is therefore different. For
example, you cannot access the HTML form by its name. However, compare the Is4DWebServer
JavaScript function of the previous example with this one:
Both functions do the same thing, but the second example uses the forms property of the
HTML document object to access the object through the element forms[0]. As a result, it
operates even if you do not know the name that 4D may or may have not given to the
translated HTML page (form).
See Also
4D HTML Tags, SEND HTML BLOB, SEND HTML FILE, URLs and Form Actions.
The 4D Web Server offers different URLs and HTML form actions that allow you to implement
various actions in your database, in both contextual and non-contextual modes.
URL 4DACTION/
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Syntax: 4DACTION/MyMethod{/Param}
Mode: Non-contextual. When called from contextual mode, aborts the context process and
switches to non-contextual mode.
Usage: URL or Form action.
This URL allows you to link an HTML object (text, button...) to a 4D project method in non-
contextual mode. The link will be /4DACTION/MyMethod/Param where MyMethod is the name
of the 4D project method to be executed when the user clicks on the link and Param an
optional Text parameter to pass to the method in $1 (see paragraph “The Text Parameters
Passed to 4D Methods Called via URLs” below).
When 4D receives a /4DACTION/MyMethod/Param request, the On Web Authentication
Database Method (if it exists) is called. If it returns True, the MyMethod method is executed.
4DACTION/ can be associated with a URL in a static Web page. The syntax of the URL must be
in the following form: <A HREF="/4DACTION/MyMethod/Param">Do Something</A>
Note: A method called by 4DACTION must not call interface elements (DIALOG, ALERT...).
Warning: For a 4D method to be able to be executed using the 4DACTION/ URL, it must have
the “Available through 4DACTION, 4DMETHOD and 4DSCRIPT” attribute (unchecked by
default), defined in the Method properties. For more information on this point, refer to the
Connection Security section.
Example
This example describes the association of the 4DACTION/ URL with an HTML picture object in
order to dynamically display a picture in the page. You insert the following instructions in a
static HTML page:
<IMG SRC="/4DACTION/PICTFROMLIB/1000">
Note: A form can be submitted through two methods (both can be used with 4D):
• POST, usually used to add data into the Web server - to a database,
• GET, usually used to request the Web server - data coming from a database.
Note: For more information, refer to the section Binding 4D objects with HTML objects.
For each field in the form, 4D sets the value of the field to the value of the variable with the
same name. For the form options (for example, check boxes), 4D sets the associated variable to
1 if it is selected, otherwise 0.
For numerical data entries, 4D converts the value of the field from Alpha–>Real.
Note: If a field in the form is named OK (for example the Submit button), the OK system
variable is set to 1 if the value of the field is not empty, otherwise it is set to 0.
Example
In a 4D Web database started and used in “non-contextual” mode, we hope that the browsers
can search records by using a static HTML page. This page is called “search.htm”. The database
contains other static pages that allow you to, for example, display the search result
(“results.htm”). The POST type has been associated to the page, as well as the
/4DACTION/SEARCH action.
During data entry, type “ABCD” in the data entry area, check the option and validate it by
clicking the Search button.
C_TEXT(VNAME)
VNAME:=""
C_LONGINT(vEXACT)
vEXACT:=0
OK:=0 `particular case
If (OK=1)
If (vEXACT=0) `If the option has not been selected
vNAME:=VNAME+"@"
End if
QUERY([Jockeys];[Jockeys]Name=vNAME)
vLIST:=Char(1) `Return the list in HTML
FIRST RECORD([Jockeys])
While (Not(End selection([Jockeys])))
vLIST:=vLIST+[Jockeys]Name+” “+[Jockeys]Tel+”<BR>”
NEXT RECORD([Jockeys])
End while
SEND HTML FILE(“results.htm”) `Send the list to the results.htm form
`which contains a reference to the variable vLIST (that is <!--4DVAR vLIST––>)
...
End if
URL 4DMETHOD/
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Syntax: 4DMETHOD/MyMethod{/Param}
Mode: Contextual. When called from non-contextual mode, switches to contextual mode.
Usage: URL or Form action.
This URL allows you to link an HTML object (text, button...) to a 4D project method in
contextual mode. The link will be /4DMETHOD/Method_Name/Param where Method_Name is
the name of the 4D project method to be executed when the HTML object is clicked and
Param an optional Text parameter to pass to the method in $1 (see paragraph “The Text
Parameters Passed to 4D Methods Called via URLs” below). The linked item triggers the
execution of the 4D project method through their URLs. The project method can itself display
4D forms, other HTML pages, and so on.
When 4D receives a /4DMETHOD request, the On Web Authentication Database Method (if it
exists) is called. If it returns True, the On Web Connection Database Method (if it exists) is
called, then the Method_Name method is executed with the /Param string as parameter (in $1).
Warning: For a 4D method to be able to be executed using the 4DMETHOD/ URL, it must have
the “Available through 4DACTION, 4DMETHOD and 4DSCRIPT” attribute (unchecked by
default), defined in the Method properties. For more information on this point, refer to the
Connection Security section.
URL 4DCGI/<action>
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Syntax: 4DCGI/<action>
Mode: Both.
Usage: URL.
When the 4D Web server receives the /4DCGI/<action> URL, the On Web Authentication
Database Method (if it exists) is called. If it returns True, the Web server calls the On Web
Connection Database Method by sending the URL “as is ” to $1.
The 4DCGI/ URL does not correspond to any file. Its role is to call 4D using the On Web
Connection Database Method. The “<action>” parameter can contain any type of information.
This URL allows you to perform any type of action. You just need to test the value of $1 in the
On Web Connection Database Method or in one of its submethods and have 4D perform the
appropriate action. For example, you can build completely custom static HTML pages to add,
search, or sort records or to generate GIF images on-the-fly. Examples of how to use this URL
are in the descriptions of the PICTURE TO GIF and SEND HTTP REDIRECT commands.
When issuing an action, a “response” must be returned, by using commands that send data
(SEND HTML FILE, SEND HTML BLOB, etc.).
Warning: Please be sure to execute the shortest possible actions so as not to hold up the
browser.
4th Dimension sends text parameters to any 4D method called via special URLs (4DMETHOD/,
4DACTION/ and 4DCGI/), in both contextual and non-contextual modes. Regarding these text
parameters:
• Although you do not use these parameters, you must explicitly declare them with the
command C_TEXT, otherwise runtime errors will occur while using the Web to access a
database that runs in compiled mode.
• The $1 parameter returns the extra data placed at the end of the URL, and can be used as a
placeholder for passing values from the HTML environment to the 4D environment.
This runtime error is related to the missing declaration of the text $1 parameter in the 4D
method that is called when you click on the HTML link referring to that method. As the
context of the execution is the current HTML page, the error refers to the “line 0” of the
method that has actually sent the page to the Web browser.
After these changes have been made, the compiled runtime errors no longer occur.
See Also
Binding 4D objects with HTML objects, GET WEB FORM VARIABLES, Using the Contextual Mode,
Your First Time with the Web Server.
The 4D Web server provides you with different HTML tags specific to 4D, which allow you to
insert references to 4D variables or expressions, or different types of processing, in static HTML
pages sent by the Web server, for example using the SEND HTML FILE and SEND HTML BLOB
commands. These pages are called semi-dynamic pages.
These tags are inserted as HTML comments (<!--#Tag Contents--> in HTML code). Most HTML
editors offer editing facilities to insert comments.
Compatibility Note: In version 6.0.x of 4D, the notation to use for inserting 4D variables in
static pages was square brackets [VarName]. In a converted database, to be able to use the
standard HTML syntax (<!--#4DVAR VarName-->), make sure that the option “Use 4DVAR
Comments instead of Brackets” in the Preferences dialog box is checked (see section Web
Server Settings).
Parsing of the contents of semi-dynamic pages sent by 4D takes place when SEND HTML FILE
(.htm, .html, .shtm, .shtml) or SEND HTML BLOB (text/html type BLOB) commands are called,
as well as when sending pages called using URLs.
However, in non-contextual mode, for reasons of optimization, pages that are suffixed with
“.htm” and “.html” are NOT parsed. In order to "force" the parsing of HTML pages in this case,
you must add the suffix “.shtm” or “.shtml” (for example,
http://www.server.com/dir/page.shtm).
An example of the use of this type of page is given in the description of the WEB CACHE
STATISTICS command.
In order to be processed by 4D, an HTML comment should have the following format <!--
#4D...-->. Please note that some HTML editors automatically add other information within the
comment; this can lead to some misinterpretation.
However, other HTML comments such as <!--Beginning of list--> are possible.
If a comment <!--#4D... does not end by -->, the following message “<!--#4D... : --> expected”
will be inserted and the analysis will stop at this level (the page will be sent to indicate the
error).
It is possible to mix several types of comments. For example, the following HTML syntax is
possible:
<HTML>
...
<BODY>
<!--#4DSCRIPT/PRE_PROCESS--> (Method call)
<!--#4DIF (myvar=1)--> (If condition)
<!--#4DINCLUDE banner1.html--> (Subpage insertion)
<!--#4DENDIF--> (End if)
<!--#4DIF (myvar=2)-->
<!--#4DINCLUDE banner2.html-->
<!--#4DENDIF-->
4DVAR
Syntax: <!--#4DVAR VarName--> or <!--#4DVAR 4DExpression-->
The tag <!--#4DVAR VarName--> allows you to insert a reference to the 4D variable or
expression VarName anywhere in an HTML page. For example, if you write:
<P>Welcome to <!--#4DVAR vtSiteName-->!</P>
The value of the 4D variable vtSiteName will be inserted in the HTML page.
You can insert a 4D text variable in HTML code, provided its first character is ASCII code 1 (i.e.,
vtHTML:=Char(1)+"...HTML code..."). You can also use the tag 4DHTMLVAR.
You can also insert 4D expressions (not only variables) in 4D HTML comments with the
4DVAR tag. You can directly insert a field content (for example <!--#4DVAR
[tableName]fieldName-->) or an item array content (for example <!--#4DVAR arr{1}-->) or a
method returning a value (<!--#4DVAR mymethod-->).
The expression conversion follows the same rules as the variable ones. Moreover, the
expression must comply with 4D syntax rules.
Note: Executing a 4D method with 4DVAR depends on the value of the “Available through
4DACTION, 4DMETHOD and 4DSCRIPT” attribute set in the Method properties. For more
information about this, refer to the Connection Security section.
Although an expression can contain direct calls to 4D functions, this is not recommended for
localization issues. For example, <!--#4DVAR Current date-->, although correctly interpreted
with a 4D in English will not be understood by an French version. The same applies to real
numbers (the decimal separator can be different according to the language). In both cases, we
strongly advise you to assign a variable through programming.
In case of interpretation error, the inserted text will appear as
“<!--#4DVAR myvar--> : ## error # error code”.
4DHTMLVAR
Syntax: <!--#4DHTMLVAR VarName--> or <!--#4DHTMLVAR 4DExpression-->
This tag allows assessing a variable or a 4D expression and inserting it in a page as an HTML
expression. In fact, this tag works exactly the same way as the <!--#4DVAR VarName--> tag
when VarName starts with the ASCII code 1 (see above).
For example, here are the insertion results of the 4D text variable myvar with the available tags:
myvar Value Tags Web Page Insertion
myvar:="<B>" <!--#4DVAR myvar--> <B>
myvar:=Char(1)+"<B>" <!--#4DVAR myvar--> <B>
myvar:="<B>" <!--#4DHTMLVAR myvar--> <B>
Note: Executing a 4D method with 4DHTMLVAR depends on the value of the “Available
through 4DACTION, 4DMETHOD and 4DSCRIPT” attribute set in the Method properties. For
more information about this, refer to the Connection Security section.
Note: The text variable should be expressed using the ISO Latin-1 character map (for more
information, refer to the Mac to ISO command description).
The 4DSCRIPT tag allows you to execute 4D methods when sending static HTML pages. The
presence of the <!--#4DSCRIPT/MyMethod/MyParam--> tag in a static page as an HTML
comment forces the execution of the MyMethod method with the MyParam parameter as a
string in $1. When loading the home page, 4D calls the On Web Authentication Database
Method (if it exists). If it returns True, 4D executes the method.
The method returns text in $0. If the string starts with the ASCII code character 1, it is
considered as HTML (the same principle is true for the variables).
Note: The execution of a method with 4DSCRIPT depends on the value of the “Available
through 4DACTION, 4DMETHOD and 4DSCRIPT” attribute defined in the Method properties.
For more information about this, refer to the Connection Security section.
The analysis of the contents of the page is done when either SEND HTML FILE (.htm, .html,
.shtm, .shtml) or SEND HTML BLOB (blob of type text/html) is called.
Remember that in non-contextual mode, the analysis is also done when a URL points to a file
that has either the “.shtm” or “.shtml” extension (for example
http://www.server.com/dir/page.shtm).
For example, let’s say that you insert the following comment “Today is <!--
#4DSCRIPT/MYMETH/MYPARAM-->” into a static page. When loading the page, 4D calls the On
Web Authentication Database Method (if it exists), then calls the MYMETH method and passes
the string “/MYPARAM” as the parameter $1.
The method returns text in $0 (for example “12/31/03”); the expression
“Today is <!--#4DSCRIPT/MYMETH/MYPARAM––>” therefore becomes “Today is 12/31/03”.
The MYMETH method is as follows:
Warning: You must always declare the $0 and $1 parameters in the called method.
Note: A method called by 4DSCRIPT must not call interface elements (DIALOG, ALERT...).
Note: You can insert as many <!--#4DSCRIPT...--> comments as you want in a static page.
Compatibility note: In 4D previous versions, the same tag, 4DACTION, could be used as a URL
(for example, http://myserver/4DACTION/meth), or as an HTML comment in a static page
(<!--#4DACTION/meth-->). As this could be misleading, starting with 4D version 6.7 the
4DSCRIPT tag replaces the 4DACTION tag. It is used only as an HTML comment
(<!--#4DSCRIPT/meth-->) and has the same effect as <!--#4DACTION/meth-->. 4DACTION is
now just used for URLs.
4DINCLUDE
Syntax: <!--#4DINCLUDE Path-->
This comment allows the body of another HTML page (indicated by the path parameter) to be
included in an HTML page. An HTML page body is included within the <BODY> and
</BODY> tags (the tags themselves are not included).
The <!--#4DINCLUDE --> comment is very useful for tests (<!--#4DIF-->) or loops
(<!--#4DLOOP-->). It is very convenient to include tags according to a criteria or randomly.
When including, regardless of the mode and file name extension, 4D analyses the called page
and then inserts the contents (modified or not) in the page originating the 4DINCLUDE call.
An included page with the <!--#4DINCLUDE --> comment is loaded in the Web server cache the
same way as pages called via a URL or sent with the SEND HTML FILE command.
In path, put the path leading to the document to include. Warning: In the case of a
4DINCLUDE call, the path is relative to the document being analyzed, that is, the “parent”
document. Use the slash character (/) as a folder separator and the two dots (..) to go up one
level (HTML syntax).
Note: In contextual mode, if a page is inserted in a form via a tag {mypage.html} inserted in a
static text area, the 4DINCLUDE comments (if any) will be ignored.
Examples
<!--#4DINCLUDE subpage.html-->
<!--#4DINCLUDE folder/subpage.html-->
<!--#4DINCLUDE ../folder/subpage.html-->
Example
This example of code inserted in a static HTML page displays a different label according the
vname#"" expression result:
<BODY>
...
<!--#4DIF (vname#"")-->
Names starting with <!--#4DVAR vname-->.
<!--#4DELSE-->
No name has been found.
<!--#4DENDIF-->
...
</BODY>
This comment allows repetition of a portion of HTML code as long as the condition is
fulfilled. The portion is delimited by <!--#4DLOOP--> and <!--#4DENDLOOP-->.
The <!--#4DLOOP condition--> ... <!--#4DENDLOOP--> blocks can be nested. Like in 4D, each
<!--#4DLOOP condition--> should match a <!--#4DENDLOOP-->.
• <!--#4DLOOP [table]-->
This syntax makes a loop for each record from the table current selection in the current
process. The HTML code portion located between the two comments is repeated for each
current selection record.
Note: When the 4DLOOP tag is used with a table, records are loaded in Read only mode.
<!--#4DLOOP [People]-->
<!--#4DVAR [People]Name--> <!--#4DVAR [People]Surname--><BR>
<!--#4DENDLOOP-->
• <!--#4DLOOP array-->
This syntax makes a loop for each item array. The array current item is increased when each
HTML code portion is repeated.
Note: This syntax cannot be used with two dimension arrays. In this case, it is better to
combine a method with nested loops.
<!--#4DLOOP arr_names-->
<!--#4DVAR arr_names{arr_names}--><BR>
<!--#4DENDLOOP-->
• <!--#4DLOOP method-->
This syntax makes a loop as long as the method returns True. The method takes a Long Integer
parameter type. First it is called with the value 0 to allow an initialization stage (if necessary);
it is then called with the values 1,then 2, then 3 and so on, as long as it returns True.
For security reasons, the On Web Authentication Database Method can be called once just before
the initialization stage (method execution with 0 as parameter). If the authentication is OK,
the initialization stage will proceed.
Warning: C_BOOLEAN($0) and C_LONGINT($1) MUST be declared within the method for
compilation purposes.
Example
The following HTML code example:
<!--#4DLOOP my_method-->
<!--#4DVAR var--> <BR>
<!--#4DENDLOOP-->
If(AuthenticationWebOK)
If(my_method(0))
$counter:=1
While(my_method($counter))
...
$counter:=$counter+1
End while
End if
End if
See Also
Binding 4D objects with HTML objects, URLs and Form Actions, Using the Contextual Mode.
You can configure the operation of the 4D Web server using the parameters defined in the
Web theme of the database Preferences. This section describes the parameters of the
Configuration, Advanced and Options pages of this theme as well as the “Web Compatibility”
section of the Application/Compatibility page.
Publishing Page
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Note: If you specify 0, 4D will use the default TCP port number 80.
From a Web browser, you need to include that non-default TCP port number into the address
you enter for connecting to the Web database. The address must have a suffix consisting of a
colon followed by the port number. For example, if you are using the TCP port number 8080,
you will specify “123.4.567.89:8080”.
WARNING: If you use TCP port numbers other than the default numbers (80 for standard
mode and 443 for SLL mode), be careful not to use port numbers that are defaults for other
services that you might want to use simultaneously. For example, if you also plan to use the
FTP protocol on your Web server machine, do not use the TCP port 20 and 21, which are the
default ports for that protocol (unless you know what you are doing). To find out the standard
assignment of TCP port numbers, refer to the Appendix B, TCP port numbers section in the
documentation of the 4D Internet Commands. Ports numbers below 256 are reserved for well
known services and ports numbers from 256 to 1024 are reserved for specific services
originated on the UNIX platforms. For maximum security, specify a port number beyond these
intervals, for example in the 2000's or 3000's.
This feature is for 4D Web Servers located on machines with multiple TCP/IP addresses. It is,
for example, frequently the case of most Internet host providers.
Please check the Apple Open Transport documentation for more information.
2. Click the Add.... button in the "IP Addresses" area, and add additional IP addresses.
You can define up to 5 different IP addresses. You may need to consult your systems
administrator to do so. For more information, please refer to Windows documentation.
To modify the default home page, simply replace it in the database root folder with your own
“index.html” page or enter the relative access path of the page that you want to define in the
“Default Home Page” entry area.
The access path must be set up in relation to the default HTML root folder.
In order to ensure multi-platform compatibility of your databases, the 4D Web server uses
particular writing conventions to define access paths. The syntax rules are as follows:
• folders are separated by a slash (“/”)
• the access path must not end with a slash (“/”)
• to “go up” one level in the folder hierarchy, enter “..” (two periods) before the folder name
• the access path must not start with a slash (“/”)
For example, if you want the default home page to be “MyHome.htm”, and it is located in the
“Web” folder (itself located in the default HTML root folder of the database), enter
“Web/MyHome.htm”.
Note: You can also define a default home page for each Web process by using the routine SET
HOME PAGE.
If you do not specify a default custom home page, the operation of the Web server will differ
depending on the startup mode:
• If the Web server starts up in non-contextual mode (standard mode), the On Web Connection
Database Method is called. It’s up to you to process the request procedurally.
The cache is shared between all the Web processes. You can set the size of the cache in the
Preferences. By default, the cache of the static pages is not enabled. To activate it, simply
check the Use the 4D Web cache option.
You can modify the size of the cache in the Pages Cache Size area. The value you set depends
on the number and size of your Web site’s static pages, as well as the resources that the host
machines has at its disposal.
Note: While using your Web database, you can check the performance of the cache by using
the routine WEB CACHE STATISTICS. If, for example, you notice that the cache’s rate of use is
close to 100%, you may want to consider increasing the size that has been allocated to it.
The /4DSTATS and /4DHTMLSTATS URLs allow you to also obtain information about the
cache’s state. Please refer to section Information about the Web Site.
Once the cache has been enabled, the 4D Web server looks for the page requested by the
browser first in the cache. If it finds the page, it sends it immediately. If not, 4D loads the page
from disk and places it in the cache.
When the cache is full and additional space is required, 4D “unloads” the oldest pages first,
among the least demanded ones.
This option indicates the strictly high limit of Maximum Concurrent Web Processes of any
type (contextual, non-contextual or belonging to the“pool of processes”) that can be
simultaneously open on the server. This parameter allows prevention of 4D Server saturation
as the result of massive number of requests or an excessive demand of contexts creation.
When the maximum number of concurrent Web processes (minus one) is reached, 4D no
longer creates new processes and sends the following message “Server unavailable” (status
HTTP 503 – Service Unavailable) for each new request.
When this option is checked, in contextual mode a part of the data entry controls can be done
on the browsers by using automatic Javascripts.
On the browser, the data entry controls and the data types (fields or variables) to which they
can be applied are as follows:
• minimum value (for numeric values)
• maximum value (for numeric values)
• mandatory value (for numeric and alphanumeric values)
Generated Javascripts, which are small in size, display alert dialog boxes without preventing
the user from accepting a data entry (it is still 4D’s responsibility).
Actually, if a data entry area contains an incorrect value, an alert message is displayed on the
browser when the user clicks on a button (OK, Cancel, etc.):
“Passwords” area
Configuration of Web site access protection using passwords. This option is described in the
Connection Security section.
Options page
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
By default, the 4D Web server converts the extended ASCII characters in the dynamic and
static Web pages according to HTML standards before sending them. They are then interpreted
by the browsers.
You can set the Web server so that the extended ASCII characters are sent “as is”, without
converting them into HTML entities. This option has shown a speed increase on most foreign
operating systems (especially the Japanese system).
Character Sets
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The Standard Set drop-down list allows you to define the set of characters to be used by the
4D Web server.
You can also define a customized set of characters by modifying the ASCII character
conversion tables (Web filters) for both input and output of data.
To do this, check the User Defined radio button. This parameter is equivalent to selecting the
“x-user-defined” set of characters.
The buttons associated with Edit Input Filter and Edit Output Filter are now enabled. The input
filter interprets the characters sent by the browser to 4D Web server. The output filter
interprets the characters sent by 4D Web server to the browser.
Click the button that corresponds to the filter that you want to modify.
Input filter interprets characters sent by the browser to the 4D Web server and Output filter
interprets characters sent by the 4D Web server to the browser.
The following dialog box appears:
In the scrollable area, look for and click on the Mac character that you want to filter.
Repeat this operation for all the characters you want to filter.
You can click on the Save... button in order to save the filter. You can then load it
subsequently using the Load... button.
Click the Use map button in order to activate the Web input and/or output filter.
Keep-Alive Connections
The Web server of 4th Dimension can use keep-alive connections. The keep-alive option
allows you to maintain a single open TCP connection for the set of exchanges between the
Web browser and the server to save system resources and to optimize transfers.
The Use Keep-Alive Connections option enables or disables keep-alive TCP connections for the
Web server. This option is enabled by default. In most cases, it is advisable to keep this option
check since it accelerates the exchanges. If the Web browser does not support connection keep
alive, the 4D Web server automatically switches to HTTP/1.0.
The 4th Dimension Web server keep-alive function concerns all TCP/IP connections (HTTP,
HTTPS), in contextual and non-contextual mode. Note however that keep-alive connections
are not always used for all 4D Web processes. In some cases, other optimized internal
functions may be invoked. Keep-alive connections are useful mainly for static pages.
Two options allow you to set how the keep-alive connections work:
• Number of requests by connection: Allows you to set the maximum number of requests and
responses able to travel over a connection keep alive. Limiting the number of requests per
connection allows you to prevent server flooding due to a large number of incoming requests
(a technique used by hackers).
The default value (100) can be increased or decreased depending on the resources of the
machine hosting the 4D Web server.
• Timeout: This value defines the maximum wait period (in seconds) during which the Web
server maintains an open TCP connection without receiving any requests from the Web
browser. Once this period is over, the server closes the connection.
If the Web browser sends a request after the connection is closed, a new TCP connection is
automatically created. This operation is not visible for the user.
The Compatibility page of the Application theme of the Preferences includes options allowing
you to adjust the operation of the Web server:
This option allows you to define the notation to use when inserting 4D variables on static
pages.
• When the option is checked (default value), the syntax you need to use is the standard
HTML notation <!--#4DVAR MYVAR--> (A space character must be inserted between 4DVAR and
the variable name).
• When the option is not checked, the syntax you need to use is the notation with square
brackets ([MYVAR]) — which is a proprietary solution used in former versions of the 4D Web
server.
When this option is checked (default value), in contextual mode the Web server places the
current context number in the basic URL of the documents sent to the browsers.
With the previous system (option not checked), the 4D Web server sends the context number
for each element of a page to the browser, which slows down processing.
This option can be unchecked for reasons of compatibility. Keep in mind that after modifying
it, you must restart the database in order for the new operation to take effect.
See Also
Connection Security, SET DATABASE PARAMETER, SET HOME PAGE, Using the Contextual Mode.
4D allows you to obtain information about the functioning of your 4D Web site.
• You can control the site by using particular URLs (/4DSTATS, /4DHTMLSTATS,
/4DCACHECLEAR and /4DWEBTEST).
• You can generate a log of all the requests.
• You can obtain information regarding the Web Server in the Watch page of the Runtime
Explorer window.
4D Web Server accepts four particular URLs: /4DSTATS, /4DHTMLSTATS, /4DCACHECLEAR and
/4DWEBTEST.
• /4DSTATS, /4DHTMLSTATS and /4DCACHECLEAR are only available to the Designer and
Administrator of the database. If the database’s 4D password system has not been activated,
these URLs are available to all the users.
• /4DWEBTEST is always available.
/4DSTATS
The /4DSTATS URL returns the following information in pure text form:
• the number of “hits” (low-level connections),
• the number of contexts created,
• the number of contexts that could not be created,
• the number of password errors,
• the number of pages stored in the cache,
• the percentage of cache used,
• the list of pages and JPEG or GIF files stored in the cache of the static pages (*).
(*) For more information about the cache of static pages and pictures, please refer to section
Web Server Settings.
This information can allow you to check the functioning of your server and eventually adapt
the corresponding parameters.
Note: The command WEB CACHE STATISTICS allows you to also obtain information about how
the cache is being used for static pages.
/4DCACHECLEAR
The /4DCACHECLEAR URL immediately clears the cache of the static pages and images. It
allows you to therefore “force” the update of the pages that have been modified.
/4DWEBTEST
The /4DWEBTEST URL is designed to check the Web Server status. When this URL is called, 4D
returns a text file only with the following HTTP fields filled:
4D allows you to obtain a log of requests. The log is presented in the form of a text file named
“logweb.txt” automatically placed at the same level as the structure file of the database. This
file is in CLF (Common Log Format) format or NCSA format, recognized by most Web site
analysis tools.
Each field is separated by a space and each line ends by the CR/LF sequence (character 13,
character 10).
• host: IP address of the client (ex. 192.100.100.10)
• rfc931: information not generated by 4D, it’s always - (a minus sign)
Note: For performance reasons, the operations are saved in a memory buffer in packets of 1Kb
before being written to disk. The operations are also written to disk if no request has been sent
every 5 seconds.
By default, the log file of requests is not generated. To request the generation of a log file of all
the Web requests you must check the Save Request in File (logweb.txt) option on the
Configuration page of the Web theme of the database Preferences.
The Watch page (“Information” heading) in the Runtime Explorer displays three pieces of
information relative to the Web Server:
• Web Cache Usage: indicates the number of pages present in the Web cache as well as its use
percentage. This information is only available if the Web server is active and if the cache size
is greater than 0.
• Web Server Elapsed Time: indicates the duration of use (in hours:minutes:seconds format) of
the Web server. This information is only available if the Web server is active.
• Web Hits Count: indicates the total number of HTTP requests received since the Web server
boot, as well as an instantaneous number of requests per second (measure taken between two
Runtime Explorer updates). This information is only available if the Web server is active.
Note: For more information about the Runtime Explorer, refer to 4D Design Reference manual.
See Also
WEB CACHE STATISTICS, Web Server Settings.
The 4D Web server can operate in two different modes: non-contextual mode (standard mode)
and contextual mode. This section describes these two modes and details the particularities of
the contextual mode.
Warning: The contextual mode can only be used with 4th Dimension and 4D Server. The 4D
Client Web server does not support this mode.
Note: The section Your First Time with the Web Server gives a complete example of the
publication of a database in contextual mode.
Starting with version 2003 of 4th Dimension, the 4D Web server uses the non-contextual
mode by default (disconnected mode). In this mode, the operation of the 4D Web server is
comparable to that of standard Web servers: when an HTTP request is received from a browser
(URL, posted form, etc.), the server processes the request, then returns a response when
necessary (sending a Web page, for example). No specific connection is maintained
subsequently between the server and the browser.
In non-contextual mode, the Web server can send static or semi-dynamic pages. Semi-
dynamic pages allow you to access data in the database or to carry out any type of processing
using special 4D tags that are evaluated at the time the page is sent. Semi-dynamic pages allow
you to build, manage and send Web pages whose content originates in whole or in part from
processing carried out by 4D. Non-contextual mode generally meets most Web site
development needs.
In contextual mode, connection to a Web browser causes the creation of a context in which
the current selection, its variables, etc. will be placed. In a way, each browser is considered as a
4D Client connecting to the database in Custom Menus mode. The context is handled by a
specific Web connection process.
This mode allows instant publication of a 4D database on the Web, without it being necessary
to create Web pages: 4D manages and sends to the browser dynamic pages stemming from
automatic conversion of database menu bars and forms into HTML. In contextual mode, it is
still possible to send semi-dynamic or static pages. It is also possible to insert HTML or
Javascript code into 4D forms in order to add functions to the pages displayed on the Web.
The URLs are automatically maintained by 4D during the whole Web session in contextual
mode. Each time an HTTP request is received via TCP/IP, 4D extracts the context ID from the
URL, and thereby can redirect the request to the right Web Connection process.
Context IDs:
• Enable 4D to maintain both a Web and Database session over each Web connection.
• Transparently handle multiple concurrent Web connections.
• Prevent future undesirable connections when using bookmarks, because a different context
ID is generated at each connection.
For example, if a Web user is adding a record to a table, you need to know whether or not the
data entry is validated, that is, whether or not the Web user clicked the Accept or Cancel
buttons of your 4D form. If, at this point, the Web user navigates to other pages, the data
entry is left in an uncertain state. To prevent this, 4D uses the subcontext ID to synchronize
the Web session on the browser side with the database session on the 4D side.
This synchronization is also essential for the Web Connection process. You need to correctly
get out of, for example, an ADD RECORD ([...]) to pursue the execution of your 4D code.
The synchronization is selective. If the current Web page displayed on the browser side is a 4D
form (ADD RECORD, DISPLAY SELECTION, DIALOG, etc.), the synchronization will eventuallly
occur.
If the current Web page is an HTML page accessed by link from another Web page (sent using
the command SEND HTML FILE), then you can navigate freely through the pages.
(1) An ADD RECORD is issued. 4D translates the current input form of the table into an HTML
page and sends it to the Web browser. If the form is a multi-page form, the standard 4D page
navigation buttons allow you to navigate through the pages of the form. This 4D-based
navigation is implemented and performed transparently by 4D (via Web form submission).
(2) During data entry (therefore within the ADD RECORD call), a button is clicked and its
object method issues a SEND HTML FILE call.
(3) Within the SEND HTML FILE call, if the HTML page includes links, it is possible to navigate
through several pages. Eventually, when a SEND HTML FILE("") is issued, the HTML mode is
exited.
(4) The object method of the button that was clicked and the data entry initiated by ADD
RECORD are executed. Note that steps (2) and (3) can be repeated several times within the data
entry.
(5) Finally, the data entry is accepted or canceled, and the Web Connection process is
executed.
(7) This step is analogous to step 3. If the HTML page includes links, it is possible to navigate
through several pages. Eventually, when a SEND HTML FILE("") is issued, the HTML mode is
exited.
(8) The Web Connection process is executed.
(9) A DISPLAY SELECTION is issued. 4D translates the current output form of the table into an
HTML page and sends to the Web browser. During the DISPLAY SELECTION, 4D transparently
navigates between the selection page and the display of individual records. 4D also uses
MODIFY SELECTION to manage data entry and record locking, via Web form submissions.
(10) During navigation through the selection, a button in the footer area of the form is clicked
and its object method issues a SEND HTML FILE call.
(11) This step is analogous to steps 7 and 3. If the HTML page includes links, it is possible to
navigate through several pages. Eventually, when a SEND HTML FILE("") is issued, the HTML
mode is exited.
(12) The object method of the button that was clicked and the selection display initiated by
DISPLAY SELECTION are executed. Note that steps (10) and (11) can be repeated several times
during navigation of the selection.
(13) Finally, the selection display is exited and the Web Connection process is executed.
Free Web navigation (clicking on the Back or Forward buttons for instance) is possible within
any SEND HTML FILE (green areas in the figure above). On the other hand, any 4D-based HTML
page (data entry, selection display... including standard dialog boxes such those displayed by
CONFIRM or Request) is exited through the use of one of the browser navigation controls, 4D
will eventually synchronize the Web sessions and the Database sessions by going back to the
Web page whose subcontext ID corresponds to that of the issued 4D command currently
being executed on the Web Connection process side.
With this in mind, always take into account this duality of the Web Connection process when
designing Web database applications in contextual mode. For example:
• During data entry of any kind, the main menu bar is that of the browser, not that of 4D.
Within a form, do not rely on the 4D menu bar; it is on the Web server machine, not on the
Web browser machine,
• When you design forms to be used on the Web browser, remember that the 4D form set of
features is limited to that of HTML (but sometimes with some 4D additions). Do not rely on
the whole 4D forms feature set (i.e., object types and form events). For more information on
this point, refer to the paragraph “Automatic HTML conversion” below.
Note: The command SET WEB TIMEOUT allows you to specify a different Timeout for each Web
process.
You can increase or decrease this timeout at your convenience. For example, you can increase
the timeout if your application allows Web users to surf to other Web sites via HTML links in
the pages served by your database. By increasing the timeout, you enable users to navigate
longer within the other Web sites without closing their connections to your databases.
Tip: Unlike Web Server process, Web Connection processes can be aborted using the Abort
command (available in the Runtime Explorer when the Process page is displayed).
This paragraph specifies the elements, objects and mechanisms handled automatically during
database conversion into HTML by 4th Dimension in contextual mode.
Menu Bars
• Each menu bar is translated into one HTML page. Each menu title appears as text only and
menu commands associated with 4D methods appear as links to these 4D methods. Menu
commands that are only associated with automatic actions appear as text only.
• Clicking a menu item on the Web Browser side starts the execution of the associated 4D
method on the Web Connection process side.
Forms
• Objects are translated from top to bottom and from left to right, and they have the same
position on the browser as they do in the 4D form. Note, however, that HTML is a word
processing oriented application; horizontal objects positions may be different and wrap-
around may occur.
• Multi-page forms are supported transparently, including a page zero and inherited forms.
• Automatic actions, when appropriate, are supported transparently.
• Form events (On Load, On Unload, On Clicked and On Timer) are supported. Other events are
not supported.
• The Header, Detail, Break and Footer tags are taken into account during calls to DISPLAY
SELECTION and MODIFY SELECTION. The Header of the form appears once at the beginning of
the HTML page, the detail area is repeated as many times as necessary, and variables (such as
buttons) placed in the Footer area appear at the end of the HTML page, just under the
automatic selection page navigation links.
• The tips associated with buttons displayed as pictures in the form editor appear on the
browser — if the browser allows these tips to be displayed.
• A picture replicated (“Replicated” display) inserted in the (0,0,x,x) coordinates in 4D’s form
editor is sent as a background picture on the browser. Please note that dark pictures should be
avoided.
Note: The 4D Web server uses CSS1 to produce HTML pages with a very similar appearance to
the 4D forms themselves. CSS1 (Cascading Style Sheet 1) specifications have been defined by
the World Wide Web Consortium (W3C). These style sheets set some characteristics related to
the document appearance: font, size, color, title, body, spacing, etc. .CSS documents are sent
with the MIME type “text/css”. In both contextual or non-contextual mode, these documents
are not processed by 4D.
For compatibility reasons, you can modify the Web conversion mode to use for the forms
using the SET DATABASE PARAMETER command (selector 8, Web Conversion Mode).
Form Objects
When a 4D form is translated to an HTML page, form objects are translated as follows:
The following objects are not supported by HTML and therefore are ignored during the
translation:
Hierarchical Pop-up menu, Hierarchical List, Subform, Radio Picture, Thermometer, Ruler, Dial,
Picture Pop-up Menu, Picture Button, 3D Check Box, 3D Radio Button.
Notes
1. Non-horizontal lines are not supported in HTML; they are therefore ignored.
2. Invisible-like buttons are objects of type Invisible Button, Highlight Button, 3D Button, and
Button Grid. If a static picture is not overlapped by an invisible-like button, the picture is
translated as a static image. If it is overlapped by at least one invisible-like button, it is
translated as a Server-Side Image Map. On the Web browser side, the image is treated as a
Server-Side Image Map. On the 4D side, when the submission is received, 4D recalculates the
position of the click in order to generate an On Clicked event for the appropriate button, as if
the button was actually clicked. Managing invisible-like buttons is therefore quite simple,
provided that they overlap with static pictures. You manage these buttons through the Form
method or their object methods, as you would do in the regular 4D interface. This also
provides you with a very simple way to handle Web Image Mapping. If an invisible-like button
does not overlap with any static picture objects, it is ignored during the translation.
3. Radio button grouping is maintained though the translation.
4. Grouped scrollable areas are not supported in HTML. 4D translates them as independent
scrollable lists located on the same line.
If the array elements are empty strings, 4D displays 1, 2, 3... on the browser.
6. Plug-in areas are publishable on the Web, by first being converted into HTML, Image or
Image Map. This last solution allows you to manage mouse clicks inside the plug-in area (for
example, the integrated plug-in 4D Chart is published in an Image Map and the 4D_Pack _AP
External clock area is published as an Image). The way in which a plug-in area, which is on a
4D form, is published on the Web depends on the plug-in editor’s specifications.
4D Commands
While developing a 4D Web database, you may ask what happens when this or that command
is called. Will the command take effect on the Web Server machine or on the Web Browser
machine? The Web Connection Process is executing on the Web Server machine, but its user
interface is remotely echoed on the connected Web Browser. Consequently, for Web database
development, the 4D commands can be classified as follows:
Commands that are not affected by execution from within a Web Connection process
A command such as CREATE RECORD works within the executing process; in this case, it
creates a record within the Web Connection process. The same applies to commands such as
Screen width, which returns the width of the screen on the Web Server machine (the machine
on which the process is executing).
For example, you can invoke the printing of a selection from a Web Browser. However, the
printing will be performed on the Web Server machine.
In addition, when a user interface component is involved, it appears on the Web Server
machine, i.e., Open document("") vs Open Document("This document"). You should avoid such
calls, because the Web Browser will wait for a reply until the dialog box is closed on the Web
Server machine. On the other hand, it is perfectly OK to call these routines when no dialog
boxes are involved.
Embedding HTML
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
You can customize the content of 4D forms converted into HTML by embedding HTML code
(or Javascript) into the form. The resulting form, on the Web browser side, is a combination of
HTML and 4D objects.
Note: In some cases, HTML conversion of 4D forms created in version 6.0.x that contain a
reference to an HTML document ({mapage.htm}) do not always give the expected result with
4D version 6.7 and later. In this case, it is possible to modify the form conversion mode using
the SET DATABASE PARAMETER command.
In contextual mode, to insure the maintenance of the database context and subcontext IDs,
4D automatically remaps file references and URLs. For example, 4D remaps all IMG and HREF
references to local files.
If you insert your own HTML code into a 4D form using a text variable, you must follow the
4D remapping syntax.
Example
The following 4D method returns the remapped reference for the pathname received as
parameter:
Note: For details about the method HTML Pathname, see the examples of the command Mac to
ISO.
Then, when inserting HTML code into a 4D form using a text variable, you can write:
This will insert the GIF document in the 4D form at the location of the 4D variable vtHTML.
Important: You only need to write this kind of code to insert custom HTML code into a 4D
form. If you just send an HTML page using SEND HTML FILE or if you use a command such as
ADD RECORD, remember that 4D transparently translates and remaps the HTML.
See Also
Connection Security, On Web Authentication Database Method, On Web Connection Database
Method, SET DATABASE PARAMETER.
The 4D Web server can communicate in secured mode through the SSL protocol (Secured Socket
Layer).
At the network level, the SSL protocol is inserted between the TCP/IP layer (low level) and the
HTTP high level protocol. SSL has been designed mainly to work with HTTP.
Network configuration using SSL:
Note: The SSL protocol can also be used to secure standard 4D Server client/server
connections. For more information, refer to the section Encrypting Client/Server Connections in
the 4D Server Reference manual.
The SSL protocol is designed to authenticate the sender and receiver and to guarantee the
confidentiality and integrity of the exchanged information:
• Authentication: The sender and receiver identities are confirmed.
• Confidentiality: The sent data is encrypted so that no third person can understand the
message.
• Integrity: The received data has not been changed, by accident or malevolently.
SSL uses a public key encryption technique based on a pair of asymmetric keys for encryption
and decryption: a public key and a private key.
Note: For more information on the encryption method and the public and private key issues,
refer to the ENCRYPT BLOB command description.
Note: A browser authorizes only the certificates issued by a certification authority referenced
in its properties.
The certification authority is chosen according to several criteria. If the certification authority
is well known, the certificate will be authorized by many browsers, however the price to pay
will be expensive.
Warning: For security reasons, the private key should always be kept secret. Actually, it should
always remain with the Web server machine. The Key.pem file must be placed in the Database
structure folder.
4. Once you get your certificate, create a text file named “cert.pem” and paste the contents of
the certificate into it.
You can receive a certificate in different ways (usually by E-mail or HTML form). The 4D Web
Server accepts all platform-related text formats for certificates (Mac OS, PC, Linux...). However,
the certificate must be in PKCS format.
Note: 4DSLI.DLL is also necessary to use the encryption commands ENCRYPT BLOB and
DECRYPT BLOB.
The installation of these elements makes it possible to use SSL for connections to the 4D Web
server. However, in order for SSL connections to be accepted by the 4D Web server, you must
“activate” the SSL.
By default, the SSL connections are allowed. You can uncheck this option if you do not want
to use SSL functionalities with your Web server, or if another Web server allowing secure
connections is operating on the same machine.
The TCP port dedicated to SSL data exchange is 443 by default. This port number can be
modified in the HTTPS Port Number area in order, for example, to reinforce the security of the
Web server (for more information about this pont, refer to the Web Server Settings section).
The TCP port defined in this page of the Preferences is used for standard mode Web server
connections.
Note: The other Preferences defined for the 4D Web Server management (password, timeout,
cache size, etc.) are applied, regardless of whether or not the server is operating in SSL mode.
The encryption algorithm used for the connection is then decided by the browser and the
Web server. The server offers several symetric encryption algorithms (RC2, RC4, DES...). The
most powerful common algorithm is used.
Warning: The level of encryption allowed depends on current laws in the country of use. The
level of encryption offered by 4D Web Server depends on the version of the encryption system
library used. By default, 4D provides an "Export" version of the library whereby symetric
algorithms are limited to 40 bits.
See Also
DECRYPT BLOB, ENCRYPT BLOB, GENERATE CERTIFICATE REQUEST, GENERATE ENCRYPTION
KEYPAIR, Secured Web connection, Web Server Settings.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
WML
4D Web Server supports WML (Wireless Markup Language) technology. This feature allows a
mobile phone or a PDA’s owner to read and enter data in a 4D database.
Note: The WML language associated to the WAP (Wireless Application Protocol) is developed by
several companies. The WAP technology offers a set of network communication tools so that
mobile phones and PDA users can visualize text published on Web pages. The WML
technology is open and free of charge. For more information on WML, please refer to the
Phone.com Web site: http://www.phone.com/.
The data can be entered or read through WML pages using 4DVAR or 4DSCRIPT tags.
XML
The 4D Web server supports .xml,.xls and .dtd documents which are sent with the following
MIME type: “text/xml” and “text/xsl”.
Regardless of the mode applied to the sent documents (contextual or non-contextual mode),
4D analyzes their content and processes their 4DVAR or 4DSCRIPT type tags (if any) in order to
generate dynamic XML.
Note: It is not possible to send XML format from a 4D form in contextual mode using a tag
such as {mypage.xml} included in a static text.
See Also
Binding 4D objects with HTML objects.
The 4D Web Server supports CGIs (Common Gateway Interface). CGIs for Web servers are
similar to plug-ins for 4D methods. They are called by the Web server to execute a task and
return an answer, i.e. a full Web page or some HTML code inserted in the page sent by the
server. CGIs are frequently used to display visitors counters, generate guest books, receive a
form-mail, etc. A multitude of CGIs are available today, most of which are freeware.
Note: Originally, CGI was a standard for interfacing external applications with HTTP server.
The "CGI" word is now used for the external applications themselves.
4D supports all types of CGIs, under Mac OS X and under Windows. A CGI can be an
application, a PERL script or a DLL interfacing with a Web server.
- Executables (.EXE) using the “console” and the environment variables. The source code is
usually cross-platform (Windows and Unix). The CGI names are usually written as follows:
nnn.exe or nph-nnn.exe. For more information on this kind of CGI, please refer to the
http://hoohoo.ncsa.uiuc.edu/cgi/ Internet site.
- DLL ISAPI, i.e. extensions for IIS (Internet Information Server). The CGI names are written as
follows: nnn.dll or nph-nnn.dll. The DLLs are downloaded once the Web server has been
stopped for performance purposes.
For more information on this type of CGI, please refer to the http://www.microsoft.com/iis/
Internet site.
- PERL scripts using the “console” and the environment variables. The CGIs require an
interpreter to execute. However they are cross-platform (Windows, Unix and Mac OS). Their
names are written as follows: nnnn.pl, nph-nnnn.pl, nnnn.cgi or nph-nnnn.cgi.
For more information on this kind of CGI, please refer to the http://www.perl.com/ Internet
site.
The CGI should be located at the root of the folder named cgi-bin. This folder should be
placed at the Web server root or in a subfolder. A server can have several cgi-bin folders. This
folder can contain other files than executable application, but only the latest can be called
from a Web client.
A CGI is always executed without context, regardless of the calling mode. Note however, that
in contextual mode, we strongly recommend that you not use a CGI sending back HTML
code, as it might desynchronize the context.
Note: When a CGI does not work, check that the execution privileges of the CGI are adequate
and that the line feeds in the CGI script are correct.
• Environment variables
4D defines environment variables in compliance with CGI/1.1 specifications, and the
following information:
GATEWAY_INTERFACE: always “CGI/1.1”
SERVER_SOFTWARE: always “4D WebStar_D/version”
SERVER_PROTOCOL: always “HTTP/1.0”
SERVER_PORT_SECURE: contains “1” if the HTTP connection is secure, else “0”.
PATH_TRANSLATED: contains the full path to the HTML server root, and the part of the path
following the CGI name. For security reasons, this part cannot contain the character
sequences // or ..
Example : Root of the server “C:/web”. For a CGI call such as /cgi-bin/cgi.exe/path,
PATH_TRANSLATED value is “C:/web/path”. For a CGI call such /cgi-bin/cgi.exe/../path, 4D
returns the error Forbidden.
REMOTE_IDENT: user name (if relevant), else undefined.
HTTP_AUTHORIZATION, HTTP_CONTENT_LENGTH and HTTP_CONTENT_TYPE: undefined.
ALL_HTTP and URL are defined in case of ISAPI DLLs calls.
CERT_xxx and HTTPS_xxx are defined if the connection is secured (for DLL only).
Note: The SET ENVIRONMENT VARIABLE command lets you set these variables.
This functionality makes form processing easier (it is not necessary to parse strings such as
a=1&b=2&...), however the CGI is made 4D-specific.
4th Dimension is provided with two new extensions, 4DISAPI.DLL and NPH-CGI4D.EXE. These
extensions have been designed to allow a HTTP server to send requests to a 4D HTTP server.
For example, a non secured 4D Web server can be interrogated via another HTTP server,
running in secured mode.
• The 4DISAPI extension complies to the specifications defined by ISAPI (Internet Services
Application Programming Interface). The ISAPI technology has been developed originally by
Microsoft® for the IIS server but since it has been made compatible with various HTTP servers
such as Netscape®, Apache® or Sambar®.
These two extensions work the same way. The CGI compatibility is broadly used with HTTP
servers, however the CGI extension performances are usually lower than the ISAPI ones.
Note: The 4DISAPI and NPH-4DCG extensions are not compatible with 4D Web server
contextual mode.
• The extensions identify the GET, HEAD and POST methods which manage the various status
sent back by 4D (200 OK, 302 Moved Temporarily, 404 Not Found...).
Note: The extensions have been designed to receive and send dynamic data and more
specifically to post data. The basic Web page service does not offer good performance when
the ISAPI or CGI extensions are used.
Each installed extension file is provided with a configuration file (.INI file). The .INI file
should bear the same name as the extension (for example 4DISAPI.INI). The extension and
configuration files should be located in the same folder.
An HTTP server can be defined to target several other HTTP servers. In this case, copy in the
HTTP server [Scripts] folder as many extensions as target servers. You just need to rename
them (for example, 4DISAPI2.DLL, 4DISAPI3.DLL, etc.). Make sure that a configuration file is
associated to each extension and that its name is correct (4DISAPI2.INI, 4DISAPI3.INI, etc.).
A .INI file contains one section: [Forward] which authorizes the following commands:
• TargetServer =
IP name or address of the Web server to target (for example, myserver.net or 192.193.194.195).
The line can be left blank for targeting a server by its address if the name resolution is
unavailable.
The “localhost” name is identified to the 127.0.0.1 address.
The address 127.0.0.1 is used by default.
• TargetPort =
Port used by the target server (by example, 81). The port number 8080 is used by default.
• Timeout =
Maximum timeout for the server answer (in seconds). The default value is set to 30 seconds.
• Allowed =
Allowed URL list, separated by a comma. For example: /pages, /img to give access only to the
URL starting with /pages and /img. To give access to the full site, enter a slash character /
(default setting).
• Forbidden =
Forbidden URL list, separated by a comma. For example: /4DMETHOD, /pages2 to forbid the
access to the URL starting with /4DMETHOD and /pages2. To give unlimited access, do not
enter anything in the list (default setting).
If a forbidden URL is called, the extension directly returns the error “HTTP/1.0 403 Forbidden”.
• 4D call (4D will receive only the URL part located after the extension name):
http://server-address/cgi-bin/4disapi.dll/[Path]
http://server-address/cgi-bin/nph-cgi4d.exe/[Path]
Note concerning 4D WebSTAR: 4D WebSTAR® is one of the most popular Web servers on Mac
OS. Various interaction possibilities between 4D and 4D WebSTAR have been developed, in
particular the 4D WebSTAR plug-in called 4D Link. For more information about this plug-in,
please refer to the 4D WebSTAR documentation.
See Also
SET CGI EXECUTABLE, SET ENVIRONMENT VARIABLE.
Description
The START WEB SERVER command starts the Web server of the 4th Dimension application on
which it has been executed (4th Dimension, 4D Server or 4D Client). The database is therefore
published on your Intranet network or on the Internet.
If the Web Server is successfully started, OK is set to 1, otherwise OK is set to 0 (zero). For
example,
if the TCP/IP network protocol is not properly configured, OK is set to 0.
See Also
STOP WEB SERVER.
Description
The STOP WEB SERVER command stops the Web server of the 4th Dimension application on
which it has been executed (4th Dimension, 4D Server or 4D Client). If the Web server has
been started, all Web connections are stopped, and all Web processes terminated.
If the Web server has not been started, the command does nothing.
See Also
START WEB SERVER.
Description
The SET WEB TIMEOUT command sets the timeout for the Web Connection processes in
contextual mode. The default timeout is 5 minutes.
You reduce or increase this delay by passing, in the timeout parameter, the new timeout
expressed in seconds.
The command takes effect immediately, and its scope is the working session.
• If SET WEB TIMEOUT is called from within a Web process, the value of timeout is applied to
that process only.
• If SET WEB TIMEOUT is not called from a Web process, all the Web Connection processes are
affected.
See Also
Using the Contextual Mode, Web Server Settings.
Description
The SET HTML ROOT command is used to modify the default directory or folder where 4D
looks for the HTML file you pass as a parameter to the command SEND HTML FILE.
Warning: The SET HTML ROOT command works in contextual mode only. To set a default
HTML root folder in non-contextual mode, use the Default HTML Root area in the Preferences
dialog box. For performance reasons, it is usually more judicious to set the default HTML root
folder in the Preferences, whatever the execution mode of the Web server.
The pathname you specify must be an HTML pathname, where the directory or folder names
are separated by a slash (“/”) character, no matter what the platform. For more information
about HTML pathnames, please refer to the Language Reference part of any HTML manual you
can find in bookstores.
If you specify an invalid pathname, an OS File manager error is generated. You can intercept
the error with an ON ERR CALL method. If you display an alert or a message from within the
error method, it will appear on the browser side.
Note: The SET HTML ROOT command takes into account the default HTML root folder defined
in the Preferences of the database. For more information on this folder, please refer to section
Connection Security.
See Also
ON ERR CALL.
Error Handling
If you specify an invalid pathname, an OS File manager error is generated. You can intercept
the error with an ON ERR CALL method.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET WEB DISPLAY LIMITS command modifies the way 4th Dimension displays a selection of
records on the Web browser side when you call DISPLAY SELECTION or MODIFY SELECTION.
This command only operates in contextual mode.
When you display a selection of records using 4th Dimension, the program does not load all
the records of the selection; it only loads (from the disk) the records that are visible in the
window at one time. In doing so, although you create a selection of thousands of records,
displaying them is quite fast. Then, if you scroll or resize the window, 4D loads the records
appropriately.
On the Web, 4D divides the selection of records to be displayed in pages. Without a paging
scheme, a selection of thousands of records would result in thousands of records going over
the Internet or your Intranet to be displayed in only one Web page. It also would take quite
some time to download these records, and your Web browser would more than likely run out
of memory.
By default, 4th Dimension displays the first 20 records of the selection and includes, at the
end of each HTML page, 20 links to the first 20 pages of the selection. This means that, by
default, you can browse the first 400 records of the selection by clicking on the page links
located at the end of each selection page. Note that this paging system is transparent to your
coding; everything happens within the call to DISPLAY SELECTION or MODIFY SELECTION.
SET WEB DISPLAY LIMITS enables you to change these settings. In the numberRecords parameter,
you indicate the maximum number of records you want to display per selection page. In
numberPages, you indicate the maximum number of selection page links you want at the end
of each selection page.
In addition, SET WEB DISPLAY LIMITS optionally allows you to change the default icon of the
full page record button. In the picRef parameter, specify the picture reference number of the
picture stored in the database Picture library you want to use as new icon.
SET WEB DISPLAY LIMITS only affects subsequent calls to DISPLAY SELECTION or MODIFY
SELECTION, and its scope is local to the current process.
Example
In the following example, a DISPLAY SELECTION or a MODIFY SELECTION is issued for a [Zip
Codes] table. By default, 4D displays the records on the Web browser side as shown here:
Then the selection on the Web browser side ends up looking like this:
You can now browse the first 5,000 records of the selection.
See Also
DISPLAY SELECTION, MODIFY SELECTION, Using the Contextual Mode.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET HOME PAGE command allows you to modify the custom home page for the current
Web process.
The defined page is linked to the Web process, you can therefore define the different home
pages depending, for example, on the user that is connected. This page can either be static or
semi-dynamic.
You pass the name of the HTML home page or the page’s HTML access path to the homePage
parameter.
To stop sending homePage as home page for the current Web process, execute SET HOME PAGE
with an empty string ("") passed in homePage.
Note: 4D also allows you to define a default home page in the Preferences dialog box. In this
case, the page applies to all the Web connections whatever the Web server’s startup mode
(contextual or non-contextual).
See Also
Web Server Settings.
Description
The SEND HTML FILE command sends, to the Web browser, the Web page stored in the HTML
document whose pathname you pass in htmlFile.
By default, 4th Dimension looks for the HTML document within the HTML root folder,
defined in the application Preferences.
This command will only acccept path names in HTML syntax as a parameter: names of
directories or folders must be separated with a slash ("/") regardless of the platform.
If you specify an invalid HTML pathname, 4D sends the message “The requested HTML page
could not be found” to the Web browser.
The alternate syntax SEND HTML FILE(""), in which you pass an empty string in hmtlFile, allows
you, in contextual mode, to terminate the call to SEND HTML FILE, which initiated the HTML
mode. This is illustrated in the following diagram:
3. Any of the Web pages can include references to a 4D method that issues a SEND HTML
FILE("") call. This call terminates the SEND HTML FILE call that initiated the whole thing, and
you go back, pursuing the execution 4D Method that originally started the free Web
navigation.
Once SEND HTML FILE is executed, the OK system variable is updated: if the file to be sent
exists and if the timeout has not run out, OK is equal to 1. Otherwise, it is equal to 0.
Note: If you call SEND HTML FILE from within a process that is not a Web process, the
command does nothing and returns no error; the call is simply ignored.
The references to 4D variables and 4DSCRIPTS type tags in the page are always parsed,
whatever the mode.
Examples
1. The HTML root folder of the database is the WebDocs folder. It contains the following
elements:
..\WebDocs\HTM\MyPage.HTM
Sending the Web page "MyPage.HTM" must be carried out in the following manner :
Starting from the Help.HTM document, you can freely navigate between numerous HTML
pages which implement the database Help system for your Web site. In each page, you have a
submit button titled Done, which allows you to go back to data entry.
On the 4D side, the project method htm_Help_Done terminates the SEND HTML FILE initiated
by the bHelp button:
The call to SEND HTML FILE in the object Method of the bHelp button is the last line of the
method. When the method is completed, you return to data entry.
See Also
Binding 4D objects with HTML objects, SEND HTML BLOB, Your First Time with the Web Server.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SEND HTML BLOB command allows you to send blob to the browser.
The type of data contained in the BLOB is indicated by type. This parameter can be one of the
following types:
• type = Empty String (""): In this case, you don’t need to supply any more information in the
BLOB. The browser will try to interpret the contents of the BLOB.
• type = File extension (example: ".HTM", ".GIF", ".JPEG", etc.): In this case, you specify the
MIME type of the data contained in the BLOB by indicating its extension. The BLOB will then
be interpreted according to its extension. However, the extension must be a standard one so
that the browser can correctly interpret it.
• type = Mime/Type (example: “text/html”, “image/tiff”, etc.): In this case, you directly specify
the MIME type of data contained in the BLOB. This solution offers you more freedom. Besides
the standard types, you can pass a custom MIME type to send proprietary documents via
Intranet. To do so, you only need to configure the browsers so that they recognize the type
sent and so that they can open the appropriate application. The value you pass to type is, in
this case, “application/x-[TypeName]”. In the client workstations’s browser, you reference this
type and associate it to the “Launch the application” action. The SEND HTML BLOB command
allows you to therefore send all types of documents, the Intranet clients automatically open
the associated application.
Extension Mime/Type
.htm text/html
.html text/html
.shtml text/html
.shtm text/html
.css text/css
.pdf application/pdf
.rtf application/rtf
.ps application/postscript
.eps application/postscript
.hqx application/mac-binhex40
.js application/javascript
.txt text/plain
.text text/plain
.gif image/gif
.jpg image/jpeg
.jpeg image/jpeg
.jpe image/jpeg
.jfif image/jpeg
.pic image/pict
.pict image/pict
.tif image/tiff
.tiff image/tiff
.mpeg video/mpeg
.mpg video/mpeg
.mov video/quicktime
.moov video/quicktime
.aif audio/aiff
.aiff audio/aiff
.wav audio/wav
.ram audio/x-pn-realaudio
.sit application/x-stuffit
.bin application/x-stuffit
.z application/x-zip
Note: For more information, go to http://www.iana.org and look for “Protocol Numbers and
Assignment Services” topics.
The noContext parameter allows you to tell the 4D Web server that you want to switch from
contextual mode to non-contextual mode. In this case, pass True to noContext.
If the parameter is omitted or contains False, the current mode is used.
The references to 4D variables and 4DSCRIPT type tags in the page are always parsed, whatever
the mode.
Example
Refer to the example of the routine PICTURE TO GIF.
See Also
SEND HTML FILE.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SEND HTML TEXT command directly sends HTML formatted text data.
The htmlText parameter contains the data to be sent. As 4D does not check the parameter
content, make sure that the HTML encoding is correct. The text variable should be expressed
using the ISO Latin-1 character map.
Note: This command is similar to the SEND HTML BLOB command using a BLOB with a
“html/txt” type.
The noContext parameter indicates to the 4D Web server that you want to switch from the
contextual mode to the non-contextual mode when executing the command.
In this case, pass True in the noContext parameter if you want to use the non-contextual
mode. Pass False or nothing if you want to use the current mode.
The references to the 4D variables and 4DSCRIPT type tags (if any) in the text are always
analyzed, regardless of the mode.
Example
The following method:
See Also
Mac to ISO, SEND HTML BLOB.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The PROCESS HTML TAGS command causes the processing by 4th Dimension of 4D HTML
tags contained in the inputData parameter (field or variable of the BLOB or Text type) and
returns the resulting data in outputData.
This command lets you carry out processing on tagged HTML code without it being
necessary for the Web server to send an HTML page using a command of the SEND HTML
BLOB type or that a page suffixed “.shtml” be requested via a URL. It is not even necessary
for the 4th Dimension Web server to be started.
Pass the data containing the tags to be processed in the inputData parameter. This
parameter can be a field or variable of the BLOB or Text type. Keep in mind that it is
generally prefereable to use the BLOB type since the number of characters is not limited
(32,000 limit for the Text type).
All the HTML tags of 4D are supported (4DVAR, 4DSCRIPT, 4DLOOP, etc.), regardless of the
Web server operating mode (contextual or non-contextual) — and even when it is not
started.
Note: When using the 4DINCLUDE tag outside the framework of the Web server (Web
process):
• with 4th Dimension or 4D Server, the default folder is the folder containing the database
structure file,
• with 4D Client, the default folder is the folder containing the 4D Client application.
After command execution, the outputData parameter receives the data of the inputData
parameter, along with the result of the processing of any 4D HTML tags that it contains,
when applicable. If inputData does not contain any 4D HTML tags, the contents of
outputData is identical to that of inputData.
The outputData parameter may be a field or a variable, but it must be of the same type as
that of the inputData parameter.
This command makes it possible to store the values resulting from the processing of HTML
tags in the database before they are sent.
Example
The following example shows how this command works:
C_BLOB($in)
C_BLOB($out)
C_TEXT($in_text)
C_TEXT(Var)
C_TEXT(VarHTML)
Var:="<B>"
$in_text:="<p><!--#4DVAR Var→</p>"
TEXT TO BLOB($in_text;$in;Text without length)
PROCESS HTML TAGS($in;$out)
VarHTML:=BLOB to text($out;Text without length)
` HTMLvar contains <p><B></p>
See Also
4D HTML Tags.
Description
The GET WEB FORM VARIABLES command fills the text arrays nameArray and valueArray with
the variable names and values contained in the Web form “submitted” (i.e. sent to the Web
server).
This command gets the value for all the variables which can be included in HTML pages: text
area, button, checkbox, radio button, pop up menu, choice list...
Note: Regarding checkboxes, the variable name and value are returned only if the checkbox
has been actually checked.
This command is valid for non-contextual mode or in contextual mode, regardless of the type
of URL or form (POST or GET method) sent to the Web server.
This command can be called, if necessary, in the On Web Connection Database Method or any
other 4D method resulting from a form submission.
Example
A form contains two fields, vName and vCity with “ROBERT” and “DALLAS” values. The
action associated to the form is “/4DACTION/WEBFORM”.
• If the form method is POST (most frequently used), the data entered will not be visible in
the URL (http://127.0.0.1/4DACTION/WEBFORM).
ARRAY TEXT($anames;0)
ARRAY TEXT($avalues;0)
GET WEB FORM VARIABLES($anames;$avalues)
$anames{1} = "vNAME"
$anames{2} = "vCITY"
$avalues{1} = "ROBERT"
$avalues{2} = "DALLAS"
The vNAME variable contains ROBERT and the vCITY variable contains DALLAS.
See Also
Binding 4D objects with HTML objects, URLs and Form Actions.
Description
The Web Context command must be called from a Web process. It returns a boolean that
indicates if the Web connection is executing in contextual mode (True) or in non-contextual
mode (False).
Note : The Web Context command always returns False when it is:
• called from a process other than a Web process,
• executed on a 4D Client machine.
The use of this function is advocated in the On Web Connection Database Method.
Example
Here is an example of the On Web Connection database method:
If (Web Context)
WithContext ($1;$2;$3;$4;$5;$6)
Else
WithoutContext ($1;$2;$3;$4;$5;$6)
End if
See Also
On Web Connection Database Method, PROCESS PROPERTIES, Using the Contextual Mode.
Description
The SET HTTP HEADER command allows you to set the fields in the HTTP header of the reply
sent to the Web browser by 4D. It only has an effect in a Web process in non-contextual
mode.
This command allows you to manage “cookies”.
C_TEXT($vTcookie)
$vTcookie:="SET-COOKIE: USER="+String(Abs(Random))+"; PATH=/"
SET HTTP HEADER($vTcookie)
Note: The command will not accept a literal text type constant as the header parameter; it
must be a 4D variable or field.
For more information about the syntax, please refer to the R.F.Cs (Request For Comments) that
can be found at the following Internet address: http://www.w3c.org.
fieldArray{1}:="X-VERSION"
fieldArray{2}:="X-STATUS"
fieldArray{3}:="Set-Cookie"
valueArray{1}:="HTTP/1.0" *
valueArray{2}:="200 OK" *
valueArray{3}:="C=HELLO"
* The first two items are the first line of the reply. When they are entered, they must be the
first and second items of the arrays. However, it is possible to omit them and to write only the
following (4D will handle the header format):
fieldArray{1}:="Set-Cookie"
valueArray{1}:="C=HELLO"
If several SET HTTP HEADER calls occur in the same Web process, only the last call is taken into
account.
The Server, Date and Content-Length fields are always set by 4D.
See Also
GET HTTP HEADER.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET HTTP HEADER command returns either a string or two arrays, containing the HTTP
header used for the currently processed request.
This command works only in non-contextual mode. It can be called from within any method
(On Web Connection Database Method or On Web Authentication Database Method, method
called by '/4DACTION'...) executed in a Web process in a non-contextual mode. If GET HTTP
HEADER is called in contextual mode, it returns empty strings.
Each header field is separated by a CR+LF (Carriage return+Line feed) sequence under
Windows and Mac OS.
To comply with the HTTP standard, field names are always written in English.
Example
The following method allows getting any HTTP request header field content:
C_TEXT($0;$1)
C_LONGINT($vlItem)
ARRAY TEXT($names;0)
ARRAY TEXT($values;0)
$0:=""
GET HTTP HEADER($names;$values)
$vlItem:=Find in array($names;$1)
If ($vlItem>0)
$0:=$values{$vlItem}
End if
• Once this project method has been written, it can be called as follows:
$language:=GetHTTPField("Accept-Language")
Case of
: ($language="@fr@") `French (see list ISO 639)
SEND HTML FILE("index_fr.html")
: ($language="@sp@") `Spanish (see list ISO 639)
SEND HTML FILE("index_es.html")
Else
SEND HTML FILE("index.html")
End case
Note: Web browsers allow defining several languages by default. They are listed in the "Accept-
Language" field, separated by a ";". Their priority is defined according to their position within
the string; therefore it is a good idea to test language positions in the string.
• Here is an example of virtual hosts (for example, in the On Web Connection Database
Method). The following names "home_site.com", "home_site1.com" and "home_site2.com" are
directed towards the same IP address, for example 192.1.2.3.
$host:=GetHTTPField("Host")
Case of
: ($host="www.site1.com")
SEND HTML FILE("home_site1.com")
: ($host="www.site2.com")
SEND HTML FILE("home_site2.com")
Else
SEND HTML FILE("home_site.com")
End case
See Also
GET HTTP BODY, SET HTTP HEADER.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET HTTP BODY command returns the body of the HTTP request being processed. The
HTTP body is returned as is, without processing or parsing.
This command only operates in non-contextual mode. It can be called using a Web
database method (On Web Authentication Database Method, On Web Connection Database
Method) or any Web method executed in non-contextual mode.
In body, you can pass a variable or a field of the BLOB or Text type. Keep in mind that it is
generally preferable to use the BLOB type since the number of characters is not limited. The
Text type, on the other hand, is limited to 32,000 characters; if you exceed this amount,
any excess data received will be truncated.
This command allows you, for example, to carry out queries in the body of requests. It also
permits advanced users to set up a WebDAV server within a 4th Dimension database.
Example
In this example, a simple request is sent to the 4th Dimension Web server and the contents
of the HTTP body are displayed in the debugger. Here is the form sent to the 4th
Dimension Web server, as well as the corresponding HTML code:
C_BLOB($request)
C_TEXT($requestText)
When the form is submitted to the Web server, the $requestText variable receives the text of
the HTTP request body.
See Also
GET HTTP HEADER.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SEND HTTP RAW DATA command lets the 4D Web server send “raw” HTTP data, which
can be chunked. It only operates in non-contextual mode.
The data parameter contains the two standard parts of an HTTP response, i.e. Header and
Body. The data are sent without prior formatting by the server. However, 4th Dimension
carries out a basic check of the response header and body in order to make sure that they
are valid:
• If the header is incomplete or does not comply with the HTTP protocol specifications, 4th
Dimension will change it accordingly.
• If the HTTP request is incomplete, 4th Dimension adds the missing information. If, for
instance, you want to redirect the request, you must write:
HTTP/1.1 302
Location: http://...
If you only pass:
Location: http://...
4th Dimension will complete the request by adding HTTP/1.1 302.
The optional * parameter lets you specify that the response will be sent “chunked”. The
cutting up of responses into chunks can be useful when the server sends a response without
knowing its total length (if, for instance, the response has not yet been generated). All
HTTP/1.1-compatible browsers accept chunked responses.
If you pass the * parameter, the Web server will automatically include the transfer-encoding:
chunked field in the header of the response, if necessary (you can handle the response
header manually if you so desire). The remainder of the response will also be formatted in
order to respect the syntax of the chunked option. Chunked responses contain a single
header and an undefined number of body “chunks”.
All the SEND HTTP RAW DATA statements that follow the execution of SEND HTTP RAW
DATA(data;*) within the same method will be considered as part of the response (regardless
of whether they contain the * parameter). The server puts an end to the chunked send
when the method execution is terminated.
Combined with the new GET HTTP BODY command and other commands of the “Web
Server” theme, this command completes the range of tools available to 4D developers in
order to entirely customize the processing of incoming and outgoing HTTP connections.
These different tools are shown in the following diagram:
C_LONGINT($cpt)
C_BLOB($my_blob)
C_TEXT($output)
For ($cpt;1;100)
$output:="["+String($cpt)+"]"
TEXT TO BLOB($output;$my_blob;Text without length)
SEND HTTP RAW DATA($my_blob;*)
End for
See Also
GET HTTP BODY, GET HTTP HEADER.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SEND HTTP REDIRECT command allows you to transform a URL into another one.
The url parameter contains the new URL that allows you to redirect the request. If this
parameter is a url to a file, it must contain the reference to this file, for example: SEND HTTP
REDIRECT ("/MyPage.HTM").
When this command is called in contextual mode, the Web process is aborted just after being
executed. The command prevails over commands that send data (SEND HTML FILE, SEND HTML
BLOB, etc.) that may be in the same method.
This command also allows you to redirect a request to another Web server.
4D automatically encodes the URL’s special characters. If you pass the * character, 4D will not
translate them.
Example
You can use this command to execute custom requests in 4D by using static pages. Imagine
that you have placed the following elements in a static HTML page:
In the On Web Connection database method part (or subroutine) that manages the non-
contextual mode, you insert the following code:
Case of
: ($1="/4dcgi/rech") `When 4D receives this URL
`If the OK button has been used and the ‘name’ field contains a Value
If ((bOK="OK") & (name # ""))
`Change the URL to execute the request code,
`placed farther down in the same method
SEND HTTP REDIRECT("/4dcgi/rech?"+name)
Else
`Else return to the beginning page
SEND HTTP REDIRECT("/page1.htm")
End if
...
: ($1="/4dcgi/rech?@") `If the URL has been redirected
... `Put the request code here
End case
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The WEB CACHE STATISTICS command allows you to obtain information about the most
consulted pages loaded in the Web server’s cache. Consequently, these statistics only concern
static pages, GIF pictures, JPEG pictures <100 KB and style sheets (.css).
Note: For more information about setting the 4D Web server’s cache, please refer to section
Web Server Settings.
The command fills the pages Text array with the names of the most consulted pages. The hits
Longint array receives the number of “hits” for each page. The usage parameter receives the
percentage of the Web cache used by each page.
Example
Let’s assume that you want to generate a semi-dynamic page that displays the statistics of the
Web cache. For this, in a static HTML page named “stats.shtm”, you place the tag <!--
4DACTION/STATS––>. Then you insert two 4D variables, vPages and vUsage.
In the project method STATS, you write the following code:
C_TEXT ($1)
ARRAY TEXT (pages;0)
ARRAY LONGINT (hits;0)
C_LONGINT (vUsage)
See Also
Information about the Web Site, Web Server Settings.
version 6.7
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Secured Web connection command returns a boolean indicating if the 4D Web server
connection was done in secured mode through SSL (the request starts with “https:” instead of
“http:”).
Note: For more information on the SSL protocol, refer to section Using SSL Protocol.
This command allows, for example, denying connections made in a non-secured mode (if
any).
See Also
GENERATE CERTIFICATE REQUEST, Using SSL Protocol.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET CGI EXECUTABLE command is used to execute a CGI without it being visible to the
Web user in the URL. This command can be used in particular in the On Web
Authentication Database Method to determine, for example, which CGI to execute. It
operates both under Mac OS X and Windows.
Note: For more information about CGIs, refer to the Using CGIs section.
In url1, pass the access URL for the CGI to be executed. For example, if you write SET CGI
EXECUTABLE("/myfile.pl"), the 4D Web server will execute the CGI myfile.pl — this
application must be located in the default folder of the Web server.
If you pass an empty string ("") in url1, 4th Dimension will execute the CGI specified in the
URL sent by the browser directly, where applicable.
In the optional url2 parameter, pass the access URL for the file that you want to be
processed by the CGI. For example, if you write SET CGI EXECUTABLE("cgi-
bin/Perl2.cgi";"Perl2.pl"), the Web server will execute the CGI Perl2.cgi (located in the cgi-
bin folder) by passing it the Perl2.pl file.
If you pass an empty string ("") in url2, 4th Dimension will pass the file specified in the URL
sent by the browser to the CGI for processing. This mechanism is used more particularly by
PHP. Example: SET CGI EXECUTABLE("/cgi-bin/php";"").
If the access URL indicated by the command is incorrect, the browser will display the “File
not found” error page.
Keep in mind that the SET CGI EXECUTABLE command does not return an error directly.
This command only sets a “current value” that will be used subsequently when the CGI is
called. In the event of multiple calls with this command, only the value indicated by the
last call will be used.
See Also
Using CGIs.
version 6.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The OPEN WEB URL command launches your default Web browser and opens it on the URL
passed in the url parameter.
If there is no browser on the volumes connected to the computer, this command has no effect.
4D automatically encodes the URL’s special characters. If you pass the * character, 4D will not
translate the URL’s special characters. This option allows you to access and to send URLS of
type "http://www.server.net/page.htm?q=something".
Note: This command does not work when called from a Web process.
Examples
1. When the following line of code is executed:
The Web browser is launched and the URL is translated into "file:///D%3A/web%20file.htm".
The Web browser is launched and the URL remains "file:///D:/web file.htm"
4. The following line of code launches the browser and connects it to 4D’s home page:
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Starting with version 2003, 4th Dimension supports“Web Services”, meaning that the
program enables you to publish (server part) and/or use (client part) Web Services directly
from your database. A Web Service is a set of functions published on a network. These
functions can be called and used by any application compatible with Web Services and
connected to a network. Web Services can carry out all types of tasks, such as supervising
the routing of packages at a transporter’s, e-commerce, monitoring market values, etc.
For more information about the concept and operation of Web Services, refer to the Design
Mode manual.
Subscription to Web Services with 4th Dimension is easy to carry out using the Web
Services Wizard. In most cases, this Wizard will be sufficient for you to be able to use Web
Services. However, if you want to customize certain mechanisms, you must use the client
SOAP commands of 4th Dimension.
This section describes the commands used for subscription to external Web Services (client
part). For a description of the commands used for the publication of Web Services (server
part), refer to the Web Services (Server) commands theme.
Note: By convention, the terms “SOAP” and “Web Service” have been used to differentiate
between command (and constant) names on the server and client side, respectively. These
two concepts refer to the same technology.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET WEB SERVICE PARAMETER command enables the definition of a parameter used for a
client SOAP request. Call this command for each parameter in the request (the number of
times the command is called depends on the number of parameters).
In name, pass the name of the parameter as it must appear in the SOAP request.
In value, pass the 4D variable containing the value of the parameter. In the case of proxy
methods, this variable is generally $1, $2, $3, etc., corresponding to a 4D parameter passed
to the proxy method when it was called. It is, however, possible to use intermediary
variables.
Note: Each 4D variable or array used must first be declared using the commands of the
“Compiler” and “Arrays” themes.
By default, 4th Dimension automatically determines the most appropriate SOAP type for
the name parameter according to the content of value. The indication of the type is
included in the request.
However, you may want to “force” the definition of the SOAP type of a parameter. In this
case, you can pass the optional soapType parameter using one of the following character
strings (primary data types):
soapType Description
string String
int Longint
boolean Boolean
float 32-bit real
decimal Real with decimal
double 64-bit real
duration Duration in years, months, days, hours, minutes, seconds, for example
P1Y2M3DT10H30M
datetime Date and time in ISO8601 format, for example 2003-05-31T13:20:00
Note: For more information about XML data types, refer to the URL
http://www.w3.org/TR/xmlschema-2/
Example
This example defines two parameters:
C_TEXT($1)
C_TEXT($2)
SET WEB SERVICE PARAMETER("city";$1)
SET WEB SERVICE PARAMETER("country";$2)
See Also
CALL WEB SERVICE, GET WEB SERVICE RESULT.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Preliminary note: This command is designed for advanced Web Services users. Its use is
optional.
Description
The SET WEB SERVICE OPTION command allows you to set different options that will be
used during the next SOAP request triggered using the CALL WEB SERVICE command.
You can call this command as many times as there are options to be set.
In the option parameter, pass the number of the option to set and in the value parameter,
pass the new value of the option. For these parameters, you can use one of the following
predefined constants of the “Web Services (Client)” theme:
The order in which the options are called is not important. If the same option is set several
times, only the value of the last call is taken into account.
Examples
1. Insertion of a customized header in the SOAP request:
See Also
CALL WEB SERVICE.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The CALL WEB SERVICE command is used to call a Web Service by sending an HTTP request.
This request contains the SOAP message created previously using the SET WEB SERVICE
PARAMETER command.
Any subsequent call to the SET WEB SERVICE PARAMETER command will cause the creation
of a new request. The execution of the CALL WEB SERVICE command also erases any result
from a previously-called Web Service and replaces it with the new result(s).
In accessURL, pass the complete URL allowing access to the Web Service (do not confuse
this URL with that of the WSDL file, which describes the Web Service).
• Access in secure mode (SSL): If you want to use a Web Service in secure mode using SSL,
pass https:// in front of the URL instead of http://. This configuration automatically enables
connection in secure mode.
In soapAction, pass the contents of the SOAPAction field of the request. This field generally
contains the value “ServiceName#MethodName”.
In methodName, pass the name of the remote method (belonging to the Web Service) that
you want to execute.
In namespace, pass the XML namespace used for the SOAP request. For more information
about XML namespaces, refer to the Design Mode manual of 4D.
Note: Remember that the “input” or “output” characteristic of parameters is evaluated from
the point of view of the proxy method/Web Service:
• an “input” parameter is a value passed to the proxy method and thus to the Web Service,
• an “output” parameter is returned by the Web Service and thus by the proxy method
(generally via $0).
The following table shows all the possible configurations as well as the corresponding
constants:
Input parameters
Output parameters Simple Complex
Simple Web Service Dynamic Web Service Manual In
(RPC mode) (RPC mode)
Complex Web Service Manual Out Web Service Manual
(RPC mode) (RPC or DOC mode)
The five configurations described below can therefore be implemented. In all cases, 4th
Dimension will handle the formatting of the SOAP request to be sent to the Web Service as
well as its envelope. It is up to you to format the contents of this request according to the
configuration used.
Note: Despite the fact that they are complex XML types, data arrays are handled by 4D as
simple types.
Note: In the case of DOC Web Services, the value of the strings (“MyXMLInput” and
“MyXMLOutput” above) passed as parameters is of no importance; it is even possible to
pass empty strings "". In fact, these values are not used in the SOAP request containing the
XML document. It is, nevertheless, mandatory to pass these parameters.
To use a Web Service published in DOC mode (or in RPC mode with complex types), it is
advisable to proceed as follows:
• Generate the proxy method using the Client Web Services Wizard.
The proxy method will be called in the following manner:
$XMLresultBlob:=$DOCproxy_Method($XMLparamBlob)
• Familiarize yourself with the contents of SOAP requests to be sent to the Web Service
using an on-line test (for instance, http://soapclient.com/soaptest.html). This type of tool is
used to generate HTML test forms based on the WSDL of the Web Service.
• Copy the XML contents generated from the first child element of <body>.
• Write the method enabling you to place the real parameter values into the XML code;
this code must then be placed in the $XMLparamBlob BLOB.
• To parse the response, you can also use an on-line test, or make use of the WSDL that
specifies the returned elements.
See Also
GET WEB SERVICE RESULT, SET WEB SERVICE PARAMETER.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET WEB SERVICE RESULT command is used to retrieve a value sent back by the Web
Service as a result of the processing performed.
Note: This command must be used only after the CALL WEB SERVICE command.
The returnValue parameter receives the value sent back by the Web Service. Pass a 4D
variable in this parameter. This variable is generally $0, corresponding to the value
returned by the proxy method. It is, however, possible to use intermediary variables (you
must use process variables only).
Note: Each 4D variable or array used must be previously declared using the commands of
the “Compiler” and “Arrays” themes.
The optional returnName parameter is used to specify the name of the parameter to be
retrieved. However, since most Web Services only return a single value, this parameter is
generally not necessary.
The optional * parameter signals the program to free up the memory devoted to the
processing of the request. You must pass this parameter after retrieving the last value sent
by the Web Service.
Example
Imagine that a Web Service returns the current time in any city in the world. The
parameters received by the Web Service are the name of the city and the country code. In
return, the Web Service sends the corresponding time. The proxy calling method could be
in the following form:
C_TEXT($1)
C_TEXT($2)
C_TIME($0)
If (OK=1)
GET WEB SERVICE RESULT($0;"return";*)
End if
See Also
CALL WEB SERVICE, SET WEB SERVICE PARAMETER.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The AUTHENTICATE WEB SERVICE command enables the use of Web Services requiring
authentication of the client application (simple authentication).
In the name and password parameters, pass the required identification information (user
name and password). This information will be encoded and added to the HTTP request sent
to the Web Service using the CALL WEB SERVICE command. It is thus necessary to call the
AUTHENTICATE WEB SERVICE command before calling the CALL WEB SERVICE command.
The authentication information is reset to zero after each request. Therefore, you must use
the AUTHENTICATE WEB SERVICE command before each CALL WEB SERVICE command.
If authentication fails, the SOAP server returns an error that you can identify using the Get
Web Service error info command.
See Also
CALL WEB SERVICE, Get Web Service error info.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get Web Service error info command returns information about the last error
encountered during the execution of a SOAP request sent to a remote Web Service. This
command should generally be called within an error-handling method installed by the ON
ERR CALL command.
The infoType parameter allows you to indicate the type of information that you want to
obtain. You must pass one of the constants listed below, located in the Web Services (Client)
theme:
Constant Type Value
Web Service Error Code Longint 0
Web Service Detailed Message Longint 1
Web Service HTTP Error code Longint 2
Web Service Fault Actor Longint 3
• Web Service Error Code: Main error code (defined by 4D). This code is also returned in the
Error system variable.
List of codes that may be returned:
9910: Soap fault (see also Web Service Fault Actor)
9911: Parser fault
9912: HTTP fault (see also Web Service HTTP Error code)
9913: Network fault
9914: Internal fault.
• Web Service Detailed Message: Detailed message describing the error. The type of message
differs according to the main error type.
- If the main error = 9910 (Soap fault): the cause of the SOAP fault is returned (e.g.: “the
remote method does not exist”).
- If the main error = 9911 (Parser fault): the location of the error in the XML document is
returned.
• Web Service HTTP Error code: HTTP error code (to be used in case of main error 9912).
• Web Service Fault Actor: Cause of the error (returned by the SOAP protocol — to be used in
the case of main error 9910).
- Version Mismatch
- Must Understand (the server was unable to interpret a parameter defined as
mandatory)
- Client Fault
- Server Fault
- Encoding Unknown .
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Publication of Web Services with 4th Dimension is carried out easily using options in the
method properties. In most cases, this operation will be sufficient to enable you to publish
Web Services. However, if you want to customize certain mechanisms, use data arrays, etc.,
you must use the server SOAP commands of 4th Dimension.
This section describes the commands used for the publication of Web Services in 4th
Dimension (server part). For more general information about Web Services or for a
description of the commands used for subscription to Web Services (client part), refer to
the Web Services (Client) Commands section.
Note: By convention, the terms “SOAP” and “Web Service” have been used to differentiate
between command (and constant) names on the server and client side, respectively. These
two concepts refer to the same technology.
Description
The SOAP DECLARATION command is used to explicitly declare the type of parameters used
in a 4D method published as a Web Service.
When a method is published as a Web Service, the standard parameters $0, $1... $n are used
to describe the parameters of the Web Service to the outside world (more particularly in the
WSDL file). The SOAP protocol requires that parameters be explicitly named; 4th
Dimension uses the names “FourD_arg0, FourD_arg1 ... FourD_argn” by default.
This default operation can nevertheless prove to be problematic for the following reasons:
• It is not possible to declare $0 or $1, $2, etc. as an array. Therefore, it is necessary to use
pointers; however, in this case, the type of values must be known for the generation of the
WSDL file.
• Next, it can be useful or necessary to customize the parameter names (incoming and
outgoing).
• Also, returning values with a size greater than 32 KB (limit for Text arguments) can be
necessary.
• Finally, this operation makes it impossible to return more than one value per RPC call (in
$0).
The SOAP DECLARATION command allows you to be free from these limits. You can execute
this command for each incoming and outgoing parameter and assign it a name and a type.
Note: Even if the SOAP DECLARATION command is used, it is always necessary to declare 4D
variables and arrays in the Compiler_Web method using commands of the “Compiler”
theme.
Warning: You can only refer to process variables or 4D method arguments ($0 to $n). Local
and interprocess variables cannot be used.
By default, because only Text type arguments can be used, the SOAP server responses are
limited to 32 KB. However, it is possible to return SOAP arguments with a size greater than
32 KB, using BLOBs. To exceed this limit, you simply need to declare the arguments as
BLOBs before calling the SOAP DECLARATION command (see example 4).
Note: On the client side, if you subscribe to this type of Web Service with 4th Dimension,
the Web Services Wizard will of course generate a Text type variable. To be able to use it,
you just need to re-type this return variable as a BLOB in the proxy method.
In type, pass the corresponding 4D type. Most types of 4D variables and arrays can be used.
You can use the following predefined constants, located in the “Field and Variable Types”
theme:
Constant Type Value
Is BLOB Longint 30
Is Boolean Longint 6
Is Integer Longint 8
Is LongInt Longint 9
Is Real Longint 1
Boolean array Longint 22
String array Longint 21
Date array Longint 17
Integer array Longint 15
LongInt array Longint 16
Real array Longint 14
Text array Longint 18
Is Text Longint 2
Is Date Longint 4
Is Time Longint 11
Is String Var Longint 24
Note: The following constants are not used in SOAP methods: Is Alpha Field, Is Pointer,
Array 2D, Picture array, Pointer array, Is Picture, Is Subtable, Is Undefined.
In input_output, pass a value indicating whether the processed parameter is “incoming” (i.e.
corresponding to a value received by the method) or “outgoing” (i.e. corresponding to a
value returned by the method). You can use the following predefined constants, located in
the “Web Services (Server)” theme:
Constant Type Value
SOAP Input Longint 1
SOAP Output Longint 2
In alias, pass the name of the argument as it must appear in the WSDL and in the SOAP
exchanges.
Warning: This name must be unique in the RPC call (both input and output parameters
taken together), otherwise, only the last declaration will be taken into account by 4D.
Note: The argument names must not begin with a number nor contain spaces. Moreover,
to avoid any risks of incompatibility, it is recommended to not use extended characters
(such as accented characters).
If the alias parameter is omitted, 4th Dimension will use, by default, the name of the
variable or FourD_argN for the 4D method arguments ($0 to $n).
Note: The SOAP DECLARATION command must be included in the method published as a
Web Service. It is not possible to call it from another method.
Examples
1. This example specifies a parameter name:
2. This example is used to retrieve an array of zip codes in the form of longints:
4. This example allows the 4D SOAP server to return an argument with a size greater than
32 KB:
C_BLOB($0)
SOAP DECLARATION($0; Is Text; SOAP Output)
Note the type Is Text (and not Is BLOB). This allows the argument to be correctly processed.
See Also
Get SOAP info, Is data file locked, SEND SOAP FAULT.
Constants
Field and Variable Types and Web Services (Server) themes.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SEND SOAP FAULT command is used to return an error to a SOAP client indicating the
origin of the fault: client or server. Using this command enables you to indicate an error to
a client without having to return a result.
For instance, a fault on the client side may be detected when you publish a “Square_root”
Web Service and a client sends a request with a negative number; you can use this
command in order to indicate to the client that a positive value is required.
A possible fault on the server side may be, for instance, a lack of memory occurring during
method execution.
Pass the origin of the error in faultType. You can use the following predefined constants,
located in the “Web Services (Server)” theme:
Example
To go back to the example of the “Square_root” Web Service provided in the command
description, the following command can be used to process requests with negative numbers:
See Also
Get SOAP info, SOAP DECLARATION.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Is SOAP request command returns True if the code being executed is part of a SOAP
request.
This command can be used for security reasons in the On Web Authentication Database
Method in order to determine the nature of the received requests.
See Also
On Web Authentication Database Method, SOAP DECLARATION.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get SOAP info command is used to retrieve, in the form of a character string, the
different types of information concerning a SOAP request.
When you process a SOAP request, it may be useful to obtain additional information —
other than the RPC parameter values — about the request. For instance, for security
reasons, you can use this command in the On Web Authentication Database Method to find
out the name of the requested Web Service method.
Pass the number of the type of SOAP information you want to get in the infoNum
parameter. You can use the following predefined constants, located in the “Web Services
(Server)” theme:
Constant Type Value
SOAP Method Name Longint 1
SOAP Service Name Longint 2
• SOAP Method Name = name of the Web Service method about to be executed.
• SOAP Service Name = name of the Web Service to which the method belongs.
Note: Also for security reasons, it is possible to set the maximum size for Web Services
requests sent to 4D. This configuration is carried out using the SET DATABASE PARAMETER
command (“Structure Access” theme).
See Also
SEND SOAP FAULT, SET DATABASE PARAMETER.
Windows are used to display information to the user. They have three main uses: to enter
data, to display data, and to inform the user in messages and dialogs.
There is always at least one window open. Scroll bars are added, when needed, to let the user
scroll in a form that is larger than the window. In the User environment, this window displays
either the record list (output form) or the data entry screen (input form). In the Custom
Menus environment, this window displays a splash screen (a custom graphic).
When you execute a menu command within the Custom Menus process, the splash screen can
be replaced with data by commands that display forms. When the commands finish
executing, the splash screen is displayed again by default.
You can open various types of custom windows with the Open Window or Open form window
commands (see the Window Types section). All windows opened by these commands are
referenced through a WinRef expression. A WinRef is the unique ID of each open window. It is
a Longint expression. All commands working with custom windows expect a WinRef
parameter.
When you no longer need a custom window, you should close it using the CLOSE WINDOW
command or by clicking the Control-menu box (Windows) or Close Box (Macintosh), if it
exists.
Some commands open their own windows. Commands such as GRAPH TABLE, QR REPORT, and
PRINT LABEL open a window that becomes the frontmost window.
If you start a new process and do not open a window at the beginning of the process method,
4D will automatically open a default one as soon as a form is to be displayed.
This mechanism allows you to manage retractable windows like the Explorer window (see the
example of the SET FORM SIZE command).
Note: This does not work with windows that have scrollbars.
Note: For more information about "right-to-left" mode, please refer to the Design Reference
manual and to the description of the SET DATABASE PARAMETER command.
See Also
Open form window, Open window, Window Types.
You can use one of the following predefined constants to specify the type of window that you
open with Open window:
Floating Windows: If you pass one of these constants to Open window, you open a regular
windows. To open a floating windows, pass a negative window type value to Open window.
Modal windows
A modal window places the user in a state (or “mode”) where they can only act within this
window. As long as the modal window is displayed, the menu commands and other
application windows are inaccessible. To close a modal window, the user must either validate
it, cancel it, or choose one of the options it offers. Warning dialog boxes are a typical example
of modal windows.
In 4D, windows of the types 1 and 5 are modal windows.
Note: A modal window always stays in the foreground. As a consequence, when a modal
window calls a non-modal window, this latter window is displayed in the background, even
though it was called subsequent to the modal window. You should thus avoid this type of
operation.
On the other hand, when a modal window calls another modal window, this latter window
will be displayed in the foreground.
When you call Open window, you can add one or several of the following constants to Palette
window in order to obtain variations in the behavior of the window:
This type of window has the same basic characteristics of the Plain dialog box (2) type
windows and features the following advanced specifics:
• The window is automatically closed and the "cancel" event is passed to the window when:
- a click occurs outside the window;
Sheet windows are specific to Mac OS X. These windows “drop down” over the title bar of the
main window using animation and are displayed above the main window. They are
automatically centered in the main window. Their properties are identical to those of the
modal dialog boxes. They are generally used to perform an action directly relating to the
action occurring in the primary window.
• You can only create a sheet window under Mac OS X if the last open window is visible and a
document type (form).
See Also
Open external window, Open window.
Open window (left; top; right; bottom{; type{; title{; controlMenuBox}}}){ → WinRef }
Description
Open window opens a new window with the dimensions given by the first four parameters:
• left is the distance in pixels from the left edge of the application window to the left internal
edge of the window.
• top is the distance in pixels from the top of the application window to the top internal edge
of the window.
• right is the distance in pixels from the left edge of the application window to the right
internal edge of the window.
• bottom is the distance in pixels from the top of the application window to the bottom
internal edge of the window.
If you pass -1 in both right and bottom, you instruct 4D to automatically size the window
under the following conditions:
• You have designed a form and set its Sizing Options in the Design environment Form
properties window
• Before calling Open window, you selected the form using the command INPUT FORM, to
which you passed the optional * parameter.
• The type parameter is optional. It represents the type of window you want to display, and
corresponds to the different windows shown in the section Window Types. If the window type
is negative, the window created is a floating window. If the type is not specified, type 1 is used
by default.• The title parameter is the optional title for the window
If you pass an empty string ("") in title, you instruct 4D to use the Window Title set in the
Design environment Form Properties window for the form to be displayed.
Important: The default form title will be set to the window only if you made a prior call to
INPUT FORM for the form to be displayed, and if you passed the * optional parameter to INPUT
FORM.
• The controlMenuBox parameter is the optional Control-menu box method for the window. If
this parameter is specified, a Control-menu box (Windows) or a Close Box (Macintosh) is
added to the window. When the user double-clicks the Control-menu box (Windows) or clicks
on the Close Box (Macintosh), the method passed in controlMenuBox is called.
Version 6 Note: You can also manage the closing of the window from within the form method
of the form displayed in the window when an On Close Box event occurs. For more
information, see the command Form event.
If more than one window is open for a process, the last window opened is the active
(frontmost) window for that process. Only information within the active window can be
modified. Any other windows can be viewed. When the user types, the active window will
always come to the front, if it is not already there.
Forms are displayed inside an open window. Text from the MESSAGE command also appears in
the window.
2. The following example opens a floating window that has a Control-menu box (Windows)
or Close Box (Macintosh) method. The window is opened in the upper right hand corner of
the application window.
CANCEL
Reminder: In order to have Open window automatically use the properties of the form, you
must call INPUT FORM with the optional * parameter, and the properties of the form must
have been set accordingly in the Design environment.
4. This example illustrates the “delay” mechanism for displaying sheet windows under
Mac OS X:
See Also
CLOSE WINDOW, Open external window, Open form window.
Open external window (left; top; right; bottom; type; title; plugInArea) → Number
Function result Number ← Reference number for window and external area
Description
Open external window opens a new window and displays the external area supported by the
command plugInArea provided by a 4D plug-in. The code passed in plugInArea is generally in
the form "_PluginName", for example: _4D Write, _4D View or _4D Draw.
Open external window returns a Long Integer value that can be used both as a window
reference number (that can be used with other Windows theme commands) and as a reference
to the external area displayed in the window (that can be used with other routines provided
by the 4D plug-in).
The first six arguments are the same as those of the the Open window command. However,
none of the parameters are optional.
Open external window creates modeless windows. The command does not wait for user input,
so you can have several active windows open at once. You can click between each window and
edit the one in front. If the window type has a title bar, a Control-menu box (Windows) or a
Close Box (Macintosh) will be added to enable the user to close the window.
wrWind:=Open external window (50; 50; 350; 450; 8; "Letter Writing"; "_4D WRITE")
The following example closes the external window opened in the previous example:
See Also
CLOSE WINDOW, Open window.
version 3
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
CLOSE WINDOW closes the active window opened by an Open window command in the
current process. CLOSE WINDOW has no effect if a custom window is not open; it does not
close standard windows. CLOSE WINDOW also has no effect if called while a form is active in
the window. You must call CLOSE WINDOW when you are done using a window opened by
Open window.
It is useless to pass a number to CLOSE WINDOW when closing a window previously opened by
the Open window function, since a call to CLOSE WINDOW will close the last window created
by Open window.
If you pass an external window reference number in the extWindowRef parameter, CLOSE
WINDOW closes the specified external window. For more information about external windows,
refer to the Open external window function.
Example
The following example opens a window and adds new records with the ADD RECORD
command. When the records have been added, the window is closed with CLOSE WINDOW:
Open window (5; 40; 250; 300; 0; "New Employee")
Repeat
ADD RECORD ([Employees]) ` Add a new employee record
Until (OK = 0) ` Loop until the user cancels
CLOSE WINDOW ` Close the window
See Also
Open external window, Open window.
Description
The ERASE WINDOW command clears the contents of the window whose reference number is
passed in window.
If you omit the window parameter, ERASE WINDOW clears the contents of the frontmost
window for the current process.
Usually, you will use ERASE WINDOW in combination with MESSAGE and GOTO XY. In this
case, ERASE WINDOW clears the contents of the window and moves the cursor to the upper-left
corner of the window, the GOTO XY (0; 0) position.
Do not confuse ERASE WINDOW, which clears the contents of a window, with CLOSE
WINDOW, which removes the window from the screen.
See Also
GOTO XY, MESSAGE.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The REDRAW WINDOW command provokes a graphical update of the window whose reference
number you pass in window.
If you omit the window parameter, REDRAW WINDOW applies to the frontmost window for the
current process.
Note: 4th Dimension handles the graphical updates of the windows each time you move a
window, resize it, or bring it to the front, as well as when you change the form and/or the
values displayed in the window. You will rarely use this command.
See Also
ERASE WINDOW.
DRAG WINDOW
Description
The DRAG WINDOW command allows users to drag the window on which they clicked
following the movements of the mouse. Usually you call this command from within an object
method of an object that can respond instantaneously to mouse clicks (i.e., invisible buttons).
Example
The following form, shown here in the Design Environment, contains a frame created with a
static picture, above which are four invisible buttons for each side:
Open window(50;50;50+400;50+300;2)
DIALOG([Table1];"Custom Drag")
CLOSE WINDOW
Then you can drag the window by clicking anywhere on the borders.
See Also
GET WINDOW RECT, SET WINDOW RECT.
version 6.0.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The HIDE WINDOW command allows you to hide the window whose number was passed in
window or, if this parameter is omitted, the current process frontmost window. For
example, this command allows you to display only the active window in a process that
consists of several processes.
The window disappears from the screen but remains open. You can still programmatically
apply any changes supported by 4D windows.
To display a window that was previously hidden by the HIDE WINDOW command:
• Use the SHOW WINDOW command and pass the window reference ID.
• Use the Process page of the Runtime Explorer. Select the process in which the window is
handled, then click on the Show button.
To hide all the windows of a process, use the HIDE PROCESS command.
Example
This example corresponds to a method of a button located in an input form. This button
opens a dialog box in a new window that belongs to the same process. In this example, the
user wants to hide the other windows of the process (an entry form and a tool palette)
while displaying the dialog box. Once the dialog box is validated, other process windows
are displayed again.
See Also
SHOW WINDOW.
version 6.0.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SHOW WINDOW command allows you to display the window whose number was
passed in window. If this parameter is omitted, the frontmost window of the current
process will be displayed.
In order to use the SHOW WINDOW command, the window must have been hidden by
using the HIDE WINDOW command. If the window is already displayed, the command does
nothing.
Example
Refer to the example of the HIDE WINDOW command.
See Also
HIDE WINDOW.
version 6.0.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The MAXIMIZE WINDOW command triggers the expansion of the window whose reference
number was passed in window. If this parameter is omitted, the effect is the same but is
applied to all the frontmost windows of the current process (Windows) or to the frontmost
window of the current process (Mac OS).
This command has the same effect as a click on the zoom box of a 4D application window:
On Windows
The size of the window is increased to match the current size of the application window.
The maximized window is set to be the frontmost window. If you do not pass the window
parameter, the command is applied to all the application windows.
On Mac OS
The size of the window is increased to match the size of its contents. If you do not pass the
window parameter, the command is applied to the frontmost window of the current
process.
Notes:
• This command only applies to windows that contain a zoom box. If the window type
does not include it, the command does nothing. For more information, please refer to the
Window Types section.
MAXIMIZE WINDOW sets a window to its "maximum" size. If the window is actually a form
whose size was defined in the form properties, the window size is set to those values.
A later click on the zoom box of the window or a call to the MINIMIZE WINDOW command
reduces the window to its initial size. On Windows, a call to MINIMIZE WINDOW without
parameters sets the size of all application windows to their initial sizes.
Example
This example sets the window size of your form to full screen when it is opened. To achieve
this, the following code is placed in the form method:
MAXIMIZE WINDOW
See Also
MINIMIZE WINDOW.
version 6.0.5
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The MINIMIZE WINDOW command sets the size of the window whose number is passed as
window to the size it was before being maximized. If window is omitted, the command
applies to each window of the application (Windows) or to the frontmost window of the
process (on Mac OS).
This command has the same effect as one click on the reduction box of the 4D application:
On Windows
The size of the window is set to its initial size, i.e., its size before being maximized. If the
window parameter is omitted, all the application windows are set to their initial sizes.
On Mac OS
The size of the window is set to its initial size (i.e. its size before being maximized). If the
window parameter is omitted, the frontmost window of the current process is set to its
initial size.
If the windows to which the command is applied were not previously maximized
(manually or using MAXIMIZE WINDOW), or if the window type does not include a zoom
box, the command has no effect. For more information on window types, refer to the
Window Types section.
Windows
Mac OS
See Also
MAXIMIZE WINDOW.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Get window title command returns the title of the window whose reference number is
passed in window. If the window does not exist, an empty string is returned.
If you omit the window parameter, Get window title returns the title of the frontmost window
for the current process.
Example
See example for the command SET WINDOW TITLE.
See Also
SET WINDOW TITLE.
Description
The SET WINDOW TITLE command changes the title of the window whose reference number is
passed in window to the text passed in title (max. length 80 characters).
If the window does not exist, SET WINDOW TITLE does nothing.
If you omit the window parameter, SET WINDOW TITLE changes the title of the frontmost
window for the current process.
Note: In the User environment, 4th Dimension changes the window titles automatically —i.e.,
“Entry for Table” when you perform data entry. If you change a window title, 4D will
probably override it. On the other hand, in the Custom Menus environment, 4th Dimension
does not change the titles of the windows.
Example
While performing data entry in a form, you click on a button that executes a lengthy
operation (i.e., browsing programmatically related records shown in a subform). You keep
informed about the progress of the operation using the title of the current window:
See Also
Get window title.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The WINDOW LIST command populates the array windows with the window reference numbers
of the windows currently open in all running processes (kernel or user processes).
If you do not pass the optional * parameter, floating windows are ignored.
Example
The following project method tiles all the current open window, except floating windows and
dialog boxes:
WINDOW LIST($alWnd)
$vlLeft:=10
$vlTop:=80 ` Leave enough room for the Tool bar
For ($vlWnd;1;Size of array($alWnd))
If (Window kind($alWnd{$vlWnd}) # Modal Dialog)
GET WINDOW RECT($vlWL;$vlWT;$vlWR;$vlWB;$alWnd{$vlWnd})
$vlWR:=$vlLeft+($vlWR-$vlWL)
$vlWB:=$vlTop+($vlWB-$vlWT)
$vlWL:=$vlLeft
$vlWT:=$vlTop
SET WINDOW RECT($vlWL;$vlWT;$vlWR;$vlWB;$alWnd{$vlWnd})
$vlLeft:=$vlLeft+10
$vlTop:=$vlTop+25
End if
End for
See Also
Window kind, Window process.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Window kind command returns the 4th Dimension type of the window whose reference
number is passed in window. If the window does not exist, Window kind returns 0 (zero).
If you omit the window parameter, Window kind returns the type of the frontmost window for
the current process.
Example
Set example for the command WINDOW LIST.
See Also
GET WINDOW RECT, Get window title, Window process.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Window process command returns the process number that runs the window whose
reference number is passed in window. If the window does not exist, 0 (zero) is returned.
If you omit the window parameter, Window process returns the process of the current
frontmost window.
See Also
Current process.
Description
The GET WINDOW RECT command returns the coordinates of the window whose reference
number is passed in window. If the window does not exist, the variable parameters are left
unchanged.
If you omit the window parameter, GET WINDOW RECT applies to the frontmost window for
the current process.
The coordinates are expressed relative to the top left corner of the contents area of the
application window (on Windows) or of the main screen (on Macintosh). The coordinates
return the rectangle corresponding to the contents area of the window (excluding title bars
and borders).
Note: Under Windows, if you pass -1 in window, GET WINDOW RECT returns the coordinates
of the application window (MDI window). These coordinates correspond to the contents area
of the window (excluding menu bars and borders).
Example
See example for the command WINDOW LIST.
See Also
SET WINDOW RECT.
Description
The SET WINDOW RECT command changes the global coordinates of the the window whose
reference number is passed in window. If the window does not exist, the command does
nothing.
If you omit the window parameter, SET WINDOW RECT applies to the frontmost window for
the current process.
This command can resize and move the window, depending on the new coordinates passed.
The coordinates must be expressed relative to the top left corner of the contents area of the
application window (on Windows) or to the main screen (on Macintosh). The coordinates
indicate the rectangle corresponding to the contents area of the window (excluding title bars
and borders).
Warning: Be aware that by using this command, you may move a window beyond the limits
of the main window (on Windows) or of the screens (on Macintosh). To prevent this, use
commands such as Screen width and Screen height to double-check the new coordinates of the
window.
This command does not affect form objects. If the window contains a form, the form objects
are not moved or resized by the command (regardless of their properties). Only the window is
modified. In order to modify a form window while taking the resizing properties and the
objects it contains into account, you must use the RESIZE FORM WINDOW command.
See Also
DRAG WINDOW, GET WINDOW RECT, RESIZE FORM WINDOW.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Frontmost window command returns the window reference number of the frontmost
window.
See Also
Frontmost process, Next window.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Next window command returns the window reference number of the window “behind”
the window you pass in window (based on the front-to-back order of the windows).
See Also
Frontmost window.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Find window command returns (if any) the reference number of the first window
“touched” by the point whose coordinates passed in left and top.
The coordinates must be expressed relative to the top left corner of the contents area of the
application window (Windows) or to the main screen (Macintosh).
If you specify the windowPart parameter, whether or not a window has been found, the
parameter returns one of the following values:
See Also
Frontmost window, Next window.
Open form window ({table; }formName{; type{; hPos{; vPos{; *}}}}) → WinRef
Description
The Open form window command opens a new window using the size and resizing properties
of the form formName.
Note that formName is not displayed in the window. If you want to display the form, you have
to call a command which loads a form (ADD RECORD for example).
By default (if the type parameter is not passed), a standard window with a close box is opened.
Unlike the Open window command, no method is associated to the window's close box.
Clicking on this close box cancels and closes the window, except if the On Close Box form
event has been activated for the form. In this case, the code associated to the On Close Box
event will be executed.
If formName is resizable, the window opened will contain a zoom box as well as a grow box.
Note: To know the main properties of a form, use the GET FORM PROPERTIES command.
Notes:
• The attributes (grow box, close box...) of the window created depend on the interface
specifications of the operating system for the chosen type. It is therefore possible to obtain
different results depending on the platform used.
• For more information about window types, refer to the Window types section. Note that only
the types listed in the “Open form window” theme can be used with the Open form window
command.
The optional parameter hPos allows you to define the horizontal position of the window. You
can pass a defined position, expressed in points, to this parameter (refer to the Open window
command) or one of the following predefined constants placed in the “Open form window”
theme:
Constant Type Value
Horizontally Centered Longint 65536
On the Left Longint 131072
On the Right Longint 196608
The optional parameter vPos allows you to define the vertical position of the window. You can
pass a defined position, expressed in points, to this parameter (refer to the Open window
command) or one of the following predefined constants placed in the “Open form window”
theme:
Constant Type Value
Vertically Centered Longint 262144
At the Top Longint 327680
At the Bottom Longint 393216
These parameters take into account the presence of the tool bar and menu bar as well as the
current size of the application's window (on Windows).
Examples
1. The following statement opens a standard window with a close box and automatically
adjusts it to be the same size as the "Input" form. Since the form has been defined as resizable,
the window also has a grow and a zoom box:
2. The following statement opens a floating palette in the upper left portion of the screen.
This palette uses the last position it was in when the user closed it each time it is reopened:
$winRef := Open form window ([Table1]; "Tools"; Palette form window; On the Left;
At the Top;*)
See Also
GET FORM PROPERTIES, Open window, Window Types.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The Current form window command returns the reference of the current form window. If no
window has been set for the current form, the command returns 0.
The current form window can be generated automatically using a command such as ADD
RECORD, following a user action or by using the Open window or Open form window
commands.
See Also
Open form window, Open window, RESIZE FORM WINDOW.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The RESIZE FORM WINDOW command lets you change the size of the current form window.
Pass the number of pixels that you would like to add to the current window size in the
width and height parameters. Pass 0 in either parameter if you do not wish to change the
current size. To reduce the size, pass a negative value in the width and height parameters.
This command produces the exact same result as a manual window resize using the resize
box (if the window type allows it). As a result, the command takes into consideration resize
properties for objects and size limitations defined in the form properties. If, for example,
the command resizes a window to a size greater than what is allowed in the form, the
command will have no effect.
Please note that this behavior is different than that of the SET WINDOW RECT command,
which does not take form properties nor content into account when resizing the window.
Also, note that this command does not necessarily modify the form size. To modify the size
of a form by programming, please see the SET FORM SIZE command.
See Also
GET FORM PROPERTIES, SET FORM SIZE, SET WINDOW RECT.
4th Dimension includes a set of commands used for parsing objects containing XML
(eXtensible Markup Language) data.
The XML language is a data exchange standard. It is based on the use of tags and enables
precise description of the data exchanged as well as their structure. XML files are Text
format files; their content is parsed by the applications importing the data. Many
applications now support this format.
For more information about XML, refer, for instance, to the http://xml.org and
http://www.w3.org sites.
For XML support, 4th Dimension uses a library named Xerces.dll developed by the Apache
Foundation company. 4th Dimension supports XML version 1.0.
Note: 4th Dimension allows direct importing and exporting of data in XML format using
the import/export editor.
4th Dimension offers two separate sets of XML commands, prefixed DOM and SAX.
Note: Documents read by SAX commands must be opened in read-only mode by the Open
document command. This avoids any conflict between 4th Dimension and the Xerces
library when you open “standard” and XML documents simultaneously. If you execute a
SAX parsing command with a document open in read-write mode, an alert message is
displayed and parsing is impossible.
Closing an XML document must be carried out using the CLOSE DOCUMENT command. If
any XML elements were open, they will be closed automatically.
Three DOM commands (DOM Create XML element, DOM Find XML element and DOM SET
XML ELEMENT VALUE) accept XPath notation for accessing XML elements.
XPath notation comes from the XPath language, designed to navigate within XML structures.
It allows the setting of elements directly within an XML structure via a "pathname" type
syntax, without necessarily having to indicate the complete pathname in order to reach it.
For example, given the following structure:
<RootElement>
<Elem1>
<Elem2>
<Elem3 Font=Verdana Size=10> </Elem3>
</Elem2>
</Elem1>
</RootElement>
For an illustration of XPath notation, please refer to the examples in the DOM Create XML
element and DOM Find XML element commands.
4th Dimension supports the application of XSL style sheets (eXtended Stylesheet
Language). The XSL language allows you to modify the tags of an XML document.
Note: 4th Dimension uses the Xalan-C_1_6_0.dll library to perform XSL transformations.
Xalan is a freeware XSLT processor. For more information, please visit
http://xml.apache.org/xalan-c/index.html.
XSL style sheets are text documents (with .xsl extensions) generated manually or using
specialized applications. The XSL language features various elements and functions that
allow you to perform any type of dynamic transformation. For more information on this
language, please visit http://xmlfr.org (for example).
4th Dimension allows you to transform an XML document using an existing XSL style
sheet (APPLY XSLT TRANSFORMATION command). Also, 4th Dimension allows you to
modify XSL style sheet parameters on the fly using the SET XSLT PARAMETER command.
Note: An option in the export dialog box lets you use an XSL style sheet when exporting
XML and thus generate a transformed XML document.
The XML language uses a number of specific terms and acronyms. This non-exhaustive list
details the main XML concepts used by the commands and functions of 4th Dimension.
Attribute: an XML sub-tag associated with an element. An attribute always contains a name
and a value (see diagram below).
DTD: Document Type Declaration The DTD records the set of specific rules and properties
that the XML must follow. These rules define, more particularly, the name and content of
each tag as well as its context. This formalization of the elements can be used to check
whether an XML document is in compliance (in which case, it is declared “valid”).
The DTD may be included in the XML document (internal DTD) or in a separate document
(external DTD). Note that the DTD is not mandatory.
Element: an XML tag. An element always contains a name and a value. Optionally, an
element may contain attributes (see diagram).
ElementRef: XML reference used by the 4D XML commands to specify an XML structure.
This reference is made up of 8 coded characters in hexadecimal form, which means it
consists of 16 characters.
Parsing, parser: The act of analyzing the contents of a structured object in order to extract
useful information. The commands of the “XML” theme are used to parse the contents of
any XML objects.
Structure XML: structured XML object. This object can be a document, a variable, or an
element.
XML: eXtensible Markup Language. A computerized data exchange standard enabling the
transfer of data as well as their structure. The XML language is based on the use of tags and
a specific syntax, in keeping with the HTML language. However, unlike the latter, the XML
language allows the definition of customized tags.
XSL: eXtensible Stylesheet Language. A language permitting the definition of style sheets used
to process and display the contents of an XSL document.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DOM Create XML Ref command creates an empty XML tree in memory and returns its
reference.
Pass the name of the XML tree root element in the root parameter.
Pass the declaration of the namespace value of the tree in the optional nameSpace
parameter (for example, “http://www.4d.com”).
In this case, you must prefix the root parameter with the namespace name followed by :
(for example, “MyNameSpace:MyRoot”).
Note: The namespace is a string that allows you to make sure the XML variable names are
unique. In general, a URL like http://www.mysite.com/myurl is used. The URL does not
necessarily have to be valid, but it does have to be unique.
You can declare one or more additional namespaces in the generated XML tree using
nameSpaceName/nameSpaceValue pairs. You can pass as many namespace name/value pairs
as you want.
Important: Remember to call the DOM CLOSE XML command in order to free up the
memory when you have finished using the XML tree.
Examples
1. Creating a single XML tree:
C_STRING (16;vElemRef)
vElemRef:=DOM Create XML Ref("MyRoot")
C_STRING (16;vElemRef)
$Root:="MyNameSpace:MyRoot"
$Namespace:="http://www.4D.com/tech/namespace"
vElemRef:=DOM Create XML Ref($Root$Namespace)
C_STRING (16;vElemRef)
C_STRING (80;$aNSName1;$aNSName2;$aNSValue1;$aNSValue2)
$Root:="MyNameSpace:MyRoot"
$Namespace:="http://www.4D.com/tech/namespace"
$aNSName1:="NSName1"
$aNSName2:= "NSName2"
$aNSValue1:="http://www.4D.com/Prod/namespace"
$aNSValue2:="http://www.4D.com/Mkt/namespace"
vElemRef:=DOM Create XML Ref($Root;$Namespace;$aNSName1;$aNSValue1;
$aNSName2;$aNSValue2)
See Also
DOM CLOSE XML, DOM SET XML OPTIONS.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DOM SET XML OPTIONS command allows you to define various options that are useful
in creating the XML tree set using elementRef. These options concern encoding, the
standalone property and tree identation options:
• encoding: Indicates the character set used in the document. By default (if the command is
not called), the UTF-8 character set (compressed Unicode) is used.
• standalone: Indicates whether the tree is standalone (True) or if it needs other files or
external resources to operate (False). By default (if the command is not called or if the
parameter is omitted), the tree is not standalone.
• indentation: Indicates whether the tree should display indentations corresponding to XML
key hierarchies (True) or not (False). By default (if the command is not called or if the
parameter is omitted), the tree is indented.
Example
The following example sets the encoding to use and the standalone option in the
elementRef element:
See Also
DOM Create XML Ref.
Description
The DOM Parse XML source command parses a document containing an XML structure and
returns a reference for this document. The command can validate (or not) the document.
The document can be located on the disk or on the Internet/Intranet.
The Boolean parameter validation is used to indicate whether or not to validate the
structure using the DTD.
• If validation equals True, the structure will be validated. In this case, the parser will
attempt to validate the XML structure of the document based either on the DTD defined or
referred to in the document, or that designated by the dtd parameter.
• If validation equals False, the structure will not be validated.
The third parameter, dtd, is used to indicate the specific DTD for document parsing. If you
use this parameter, the command will not take the DTD referred to in the XML document
into account.
There are two ways to specify a DTD:
• as a reference. To do this, pass the complete pathname of the new DTD in the dtd
parameter. If the document indicated does not contain a valid DTD, the dtd parameter is
ignored and an error is generated.
• directly in a text. In this case, if the contents of the parameter begin with “<?xml”, 4D
will consider that it is the DTD; otherwise, 4D will consider it as a pathname.
If validation cannot be performed (no DTD, incorrect URL to DTD, etc.), an error is
generated. The Error system variable indicates the error number. You can intercept this
error using a method installed by the ON ERR CALL command.
Important: Once you no longer have any need for it, remember to call the DOM CLOSE
XML command with this reference in order to free up the memory.
Examples
1. Opening an XML document located on disk, without validation:
2. Opening an XML document located next to the database structure file, without
validation:
3. Opening an XML document located on disk and validation using a DTD on the disk:
See Also
DOM CLOSE XML, DOM Parse XML variable.
Description
The DOM Parse XML variable command parses a BLOB or Text type variable containing an
XML structure and returns a reference for this variable. The command can validate (or not)
the document.
Pass the name of the BLOB or Text variable containing the XML object in the variable
parameter.
The Boolean parameter validation is used to indicate whether or not to validate the
structure using the DTD.
• If validation equals True, the structure will be validated. In this case, the parser will
attempt to validate the XML structure of the document based either on the DTD defined or
referred to in the document, or that designated by the dtd parameter.
• If validation equals False, the structure will not be validated.
The third parameter, dtd, is used to indicate the specific DTD for document parsing. If you
use this parameter, the command will not take the DTD referred to in the XML variable
into account.
If validation cannot be performed (no DTD, incorrect URL to DTD, etc.), an error is
generated. The Error system variable indicates the error number. You can intercept this
error using a method installed by the ON ERR CALL command.
Important: Once you no longer have any need for it, remember to call the DOM CLOSE
XML command with this reference in order to free up the memory.
Examples
1. Opening an XML object located in a 4D Text variable, without validation:
C_TEXT(myTextVar)
C_TIME(vDoc)
C_STRING(16;$xml_Struct_Ref)
C_BLOB(myBlobVar)
C_STRING(16;$ref_XML_Struct)
DOCUMENT TO BLOB(“c:\\import.xml”;myBlobVar)
$xml_Struct_Ref:=DOM Parse XML variable(myBlobVar)
See Also
DOM CLOSE XML, DOM Parse XML source.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DOM Create XML element command allows you to create a new element in the XML
element elementRef in the path set by the xPath parameter and to add attributes to it if
necessary.
Pass the root element reference in elementRef (created, for example, using the DOM Create
XML Ref command).
In xPath, pass the access path in XPath notation of the element to create (see the “Use of
XPath notation” paragraph in the Presentation of XML Commands section). If any path
elements do not exist, they are created.
It is possible to pass a simple item name directly in the xPath parameter in order to create a
sub-item from the current item (see example 3).
Note: If you have defined one or more namespaces for the tree set using elementRef (see the
DOM Create XML Ref command), you must precede the xPath parameter with the
namespace to be used (for example, “MyNameSpace:MyElement”).
You can pass attribute/attribute value pairs (in the form of variables, fields or literal values)
in the optional attrName and attrValue parameters. You can pass as many pairs as you want.
The command returns the XML reference of the element created as a result.
C_STRING(16;vRootRef;vElemRef)
vRootRef:=DOM Create XML Ref("RootElement")
vxPath:="/RootElement/Elem1/Elem2/Elem3"
vElemRef:=DOM Create XML element(vRootRef;vxPath)
vxPath:="/RootElement/Elem1/Elem2/Elem3[2]"
vElemRef:=DOM Create XML element(vRootRef;vxPath)
C_STRING(16;vRootRef;vElemRef)
C_STRING(80;$aAttrName1;$aAttrName2;$aAttrVal1;$aAttrVal2)
$aAttrName1:="Font"
$aAttrName2:="Size"
$aAttrVal1:="Verdana"
$aAttrVal2:="10"
We want to use the syntax based on a simple item name. To do this, simply write:
C_STRING(16;$root)
C_STRING(16;$ref1)
See Also
DOM Get XML element, DOM REMOVE XML ELEMENT.
Error Handling
An error is generated when:
• The root element reference is invalid.
• The name of the element to create is invalid (for example, if it starts with a number).
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DOM Find XML element command allows you to look for a specific XML element in an
XML structure. The search starts at the element designated by the elementRef parameter.
The XML node to seek is set expressed in XPath notation using the xPath parameter (see the
“Use of XPath notation” parameter in the Presentation of XML Commands section). Indexed
elements can be used.
Note: In conformity with the XML standard, searches will be case sensitive.
Example
This example lets you quickly look for an XML element and display its value:
Note: As you can see in the above example, the XPath path must always begin with the
name of the current element. This detail is important when you are handling relative
XPath paths.
Error Handling
An error is generated when:
• The element reference is invalid
• The specified xPath path is invalid.
Description
The DOM Count XML elements command returns the number of “child” elements
dependent on the elementRef parent element and named elementName.
See Also
DOM Get XML element.
Description
The DOM Get XML element command returns a reference to the “child” element dependent
on the elementName and index parameters.
See Also
DOM GET XML ELEMENT VALUE.
version 2004.2
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DOM Get parent XML element command returns an XML reference to the “parent” of
the XML element passed as reference in elementRef. This reference may be used with the
other XML parsing commands.
See Also
DOM Get first child XML element, DOM Get last child XML element.
DOM Get first child XML element (elementRef{; childElemName{; childElemValue}}) → String
Description
The DOM Get first child XML element command returns a reference to the first “child” of the
XML element passed in elementRef. This reference can be used with other XML parsing
commands.
The childElemName and childElemValue parameters, if they are passed, receive respectively
the name and the value of the child element.
Examples
1. Retrieval of the reference of the first XML element of the parent root. The XML structure
(C:\\import.xml) is first loaded into a BLOB:
C_BLOB(myBlobVar)
C_STRING(16;$xml_Parent_Ref;$xml_Child_Ref)
DOCUMENT TO BLOB("c:\\import.xml";myBlobVar)
$xml_Parent_Ref:=DOM Parse XML variable(myBlobVar)
$xml_Child_Ref:=DOM Get first child XML element($xml_Parent_Ref)
C_BLOB(myBlobVar)
C_STRING(16;$xml_Parent_Ref;$xml_Child_Ref)
C_TEXT($childName;$childValue)
DOCUMENT TO BLOB("c:\\import.xml";myBlobVar)
$xml_Parent_Ref:=DOM Parse XML variable(myBlobVar)
$xml_Child_Ref:=DOM Get first child XML element($xml_Parent_Ref;$childName;
$childValue)
See Also
DOM Get next sibling XML element.
Description
The DOM Get next sibling XML element command returns a reference to the next “sibling”
of the XML element passed as reference. This reference can be used with other XML parsing
commands.
This command is used to navigate among the “children” of the XML element.
Examples
1. Retrieval of the reference of the next sibling XML element following the element passed
as parameter:
C_STRING(16;$xml_Parent_Ref;$next_XML_Ref)
$next_XML_Ref:=DOM Get next sibling XML element($xml_Parent_Ref)
C_STRING(16;$xml_Parent_Ref;$first_XML_Ref;$next_XML_Ref)
See Also
DOM Get first child XML element.
version 2004.2
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DOM Get previous sibling XML element command returns a reference to the previous
“sibling” of the XML element passed as reference. This reference may be used with the
other XML parsing commands.
This command can be used to navigate among the “children” of an XML element.
See Also
DOM Get next sibling XML element.
version 2004.2
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
DOM Get last child XML element (elementRef{; childElemName{; childElemValue}}) → String
Description
The DOM Get last child XML element command returns an XML reference to the last “child”
of the XML element passed as reference in elementRef. This reference may be used with the
other XML parsing commands.
Example
Recovery of the reference of the last XML element of the parent root. The XML structure
(C:\\import.xml) is loaded into a BLOB beforehand:
C_BLOB(myBlobVar)
C_STRING(16;$ref_XML_Parent;$ref_XML_Child)
C_TEXT($childName;$childValue)
DOCUMENT TO BLOB("c:\\import.xml";myBlobVar)
$ref_XML_Parent:=DOM Parse XML variable(myBlobVar)
$ref_XML_Child:=DOM Get last child XML element($ref_XML_Parent;$childName;
$childValue)
See Also
DOM Get first child XML element.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DOM SET XML ELEMENT NAME command allows you to modify the name of the
element set by elementRef.
Pass the reference of the element to rename in elementRef and the new name of the
element in elementName. The command will also take charge of updating the open and
close tags of the element.
Example
In the following XML source:
<Book>
<Title>The Best Seller</Title>
</Book>
If the following code is executed, with vElemRef containing the reference to the ‘Book’
element:
We get:
<BestSeller>
<Title>The Best Seller</Title>
</BestSeller>
See Also
DOM GET XML ELEMENT NAME.
Error Handling
An error is generated when:
• The element reference is invalid
• The new name of the element to create is invalid (for example, if it starts with a number).
Description
The DOM GET XML ELEMENT NAME command returns, in the elementName parameter, the
name of the XML element designated by elementRef. For more information on XML
element names, refer to the Presentation of XML commands section.
Example
This method returns the name of the $xml_Element_Ref element:
C_STRING(16;$xml_Element_Ref)
C_TEXT($name)
See Also
DOM Get XML element, DOM GET XML ELEMENT VALUE, DOM SET XML ELEMENT NAME.
Description
The DOM SET XML ELEMENT VALUE command allows you to modify the value of the
element set by elementRef.
If you pass the optional xPath parameter, you choose to use XPath notation to indicate the
element to be modified (for more information about this notation, refer to the “Use of
XPath notation” paragraph in the Presentation of XML Commands section). In this case, you
must pass the reference of a root XML element in elementRef and the XPath path of the
element to be modified in xPath .
In elementValue, pass a string or a variable (or a field) containing the new value of the
specified element:
• If you pass a string, the value will be used “as is” in the XML structure.
• If you pass a variable or a field, 4th Dimension will process the value, depending on the
type of elementValue. All data types can be used, except arrays, pictures and pointers.
When the optional asterisk (*) parameter is passed, this indicates that the value of the
element must be set in the form of CDATA. The special CDATA form can be used to write
raw text as is (see example 2).
Examples
1. In the following XML source:
<Book>
<Title>The Best Seller</Title>
</Book>
If the following code is executed, with vElemRef containing the reference to the “Title”
element:
We want to write the text “12<18” in the <Postulate> element. This string cannot be
written as is in XML because the “<” character is not accepted. This character must
therefore be changed into “<” or the CDATA form must be used. If vElemRef indicates the
XML <Postulate> node:
` Normal form
DOM SET XML ELEMENT VALUE(vElemRef;"12<18")
We get:
<Maths>
<Postulate>12 < 18</Postulate>
</Maths>
` CDATA form
DOM SET XML ELEMENT VALUE(vElemRef;"12<18";*)
We get:
<Maths>
<Postulate><![CDATA[12 < 18]]></Postulate>
</Maths>
See Also
DOM GET XML ELEMENT VALUE.
Description
The DOM GET XML ELEMENT VALUE command returns, in the elementValue parameter, the
value of the XML element designated by elementRef. 4th Dimension will attempt to convert
the value obtained into the same type as that of the variable passed as parameter.
The optional cDATA parameter is used to retrieve the contents of the CDATA section(s) of
the elementRef XML element. Like with the elementValue parameter, 4th Dimension will
attempt to convert the value obtained into the same type as that of the variable passed as
parameter.
Example
This method returns the value of the $xml_Element_Ref element:
C_STRING(16;$xml_Element_Ref)
C_REAL($value)
See Also
DOM Get XML element, DOM GET XML ELEMENT NAME, DOM SET XML ELEMENT VALUE.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DOM REMOVE XML ELEMENT command removes the element designated by elementRef.
See Also
DOM Create XML element.
Description
The DOM Count XML attributes command returns the number of XML attributes present in
the XML element designated by elementRef. For more information about XML attributes,
refer to the Presentation of XML commands section.
Example
Before retrieving the values of elements in an array, you want to know the number of
attributes in the following XML element:
C_BLOB(myBlobVar)
C_STRING(16;$xml_Parent_Ref;$xml_Child_Ref)
C_TEXT(myResult)
C_LONGINT($numAttributes)
Note: The index number does not correspond to the location of the attribute in the XML
file displayed in text form. In XML, the index of an attribute indicates its position among
the attributes arranged in alphabetical order (according to their name).
See Also
DOM Count XML elements.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
DOM SET XML ATTRIBUTE (elementRef; attrName; attrValue{; attrName2; attrValue2; ...;
attrNameN; attrValueN})
Description
The DOM SET XML ATTRIBUTE command allows adding one or more attributes to the XML
element whose reference is passed in the elementRef parameter. It also allows setting the
value of each attribute defined.
Pass the attriibute to set and its value respectively in the attrName and attrValue parameters
(in the form of variables, fields or literal values). You can pass as many attribute/value pairs
as you want.
Example
In the following XML source:
<Book>
<Title>The Best Seller</Title>
</Book>
vAttrName:="Font"
vAttrVal:="Verdana"
DOM SET XML ATTRIBUTE(vElemRef;vAttrName;vAttrVal)
We get:
<Book>
<Title Font=Verdana>The Best Seller</Title>
</Book>
See Also
DOM GET XML ATTRIBUTE BY INDEX, DOM GET XML ATTRIBUTE BY NAME.
Description
The DOM GET XML ATTRIBUTE BY INDEX command is used to get the name of an attribute
specified by its index number as well as its value.
Pass the reference of an XML element in elementRef and the index number of the attribute
that you want to know the name of in attribIndex. The name is returned in the attribName
parameter and its value is returned in the attribValue, parameter. 4th Dimension will
attempt to convert the value obtained into the same type as that of the variable passed as
parameter.
Note: The index number does not correspond to the location of the attribute in the XML
file displayed in text form. In XML, the index of an attribute indicates it position among
the attributes when placed in alphabetical order (based on their names). For an illustration
of this, refer to the example of the DOM Count XML attributes command.
If the value passed in attribIndex is greater than the number of attributes present in the
XML element, an error is returned.
Example
Refer to the example in the DOM Count XML attributes command.
See Also
DOM GET XML ATTRIBUTE BY NAME.
Description
The DOM GET XML ATTRIBUTE BY NAME command is used to get the value of an attribute
specified by name.
Pass the reference of an XML element in elementRef and the name of the attribute that you
want to know the value of in attribName. The value is returned in the attribValue parameter.
4th Dimension will attempt to convert the value obtained into the same type as that of the
variable passed as parameter.
Example
This method is used to retrieve the value of an XML attribute using its name:
C_BLOB(myBlobVar)
C_STRING(16;$xml_Parent_Ref;$xml_Child_Ref)
C_LONGINT($LineNum)
See Also
DOM GET XML ATTRIBUTE BY INDEX.
Description
The DOM Get XML information command is used to retrieve diverse information about the
XML element designated by elementRef.
In xmlInfo, pass a code indicating the type of information to be retrieved. You can use the
following predefined constants, located in the “XML” theme:
Constant Type Value
PUBLIC ID Longint 1
SYSTEM ID Longint 2
DOCTYPE Name Longint 3
Encoding Longint 4
Version Longint 5
Document URI Longint 6
See Also
GET XML ERROR.
Constants
XML theme.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DOM EXPORT TO FILE command allows you to store an XML tree in a file on disk.
Example
This example stores the tree vElemRef in the file MyDoc.xml:
See Also
DOM EXPORT TO VAR.
Error Handling
An error is generated when:
• The element reference is invalid,
• The specified access path is invalid,
• The storage volume returns an error (insufficient disk space, etc.).
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The DOM EXPORT TO VAR command allows you to save an XML tree in a text or BLOB
variable.
Pass the name of the variable that must contain the XML tree in vXmlVar. This variable
must either be a Text or BLOB type. You can select the type depending on what you plan
on doing next or the size that the tree can reach (remember that Text type variables are
limited to 32,000 characters).
Keep in mind that if you use a Text variable to store elementRef, it will be encoded using
the “current” Mac character set (i.e. Mac Roman on most Western systems). This means
that the text returned will lose its original encoding (encoding="xxx"). In this case, the
vVarXml variable allows you to view or store the code but NOT to generate a valid XML
document (using the SEND PACKET command for example).
Example
This example stores the tree vElemRef in a text variable:
C_TEXT(vtMyText)
DOM EXPORT TO VAR(vElemRef;vtMyText)
See Also
DOM EXPORT TO FILE.
Description
The DOM CLOSE XML command frees up the memory occupied by the XML object
designated by elementRef.
See Also
DOM Parse XML source, DOM Parse XML variable.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX SET XML OPTIONS command initializes the XML document referenced in
document using the values passed in the parameter. These parameters allow determining
the encoding, standalone attribute and document indentation.
• encoding: Indicates the character set used in the document. By default (if the command is
not called), the UTF-8 character set (compressed Unicode) is used.
• standalone: Indicates whether the document is standalone (True) or if it needs other files
or external resources to operate (False). By default (if the command is not called or if the
parameter is omitted), the document is not standalone.
• indentation: Indicates whether the document should display indentations corresponding
to XML key hierarchies (True) or not (False). By default (if the command is not called or if
the parameter is omitted), the document is indented.
This command must be called one time per document and before the first XML set
command in the document; otherwise, an error message will be generated.
Example
The following code:
See Also
SAX GET XML DOCUMENT VALUES.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX GET XML DOCUMENT VALUES command gets basic information from the XML
header of the XML document referenced in the document parameter.
The command returns the type of encoding, version and the “standalone” property of the
document respectively in the encoding, version and standalone parameters. This command
must be used with the SAX event XML Start Document. For more information about SAX
events, refer to the description of the SAX Get XML node command.
See Also
SAX Get XML node, SAX SET XML OPTIONS.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX ADD XML DOCTYPE command adds a DocType statement set by the docType
parameter in the XML document referenced by document.
The DocType statement lets you indicate the type of XML in which the document has been
written and to specify the Document Type Declaration (DTD) used. A DocType statement
generally takes the following form: <!DOCTYPE XML_type "DTD_address">.
Example
The following statement:
See Also
SAX ADD XML COMMENT.
Error Handling
In the event of an error, the the command returns an error which can be intercepted using
an error-handling method.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX Get XML node command returns a long integer that indicates the type of SAX
event returned while the XML document referenced in document is parsed.
Example
The following example processes an event:
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX ADD XML COMMENT command adds a comment in the XML document referenced
by document.
An XML comment is a text whose contents will not be parsed by the XML interpreter. XML
comments must be enclosed between the <!-- and --> characters.
Example
The following statement:
See Also
SAX ADD XML DOCTYPE.
Error Handling
In the event of an error, the command returns an error which can be intercepted using an
error-handling method.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX GET XML COMMENT command returns a comment if an XML Comment SAX event
is generated in the XML document referenced in the document parameter. For more
information about SAX events, refer to the description of the SAX Get XML node command.
See Also
SAX ADD XML COMMENT, SAX Get XML node.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX OPEN XML ELEMENT command lets you add a new element in the XML document
referenced by document as well as, optionally, attributes and their values.
The added element is “open” in the document (the end tag is not added). To close an
element created using this command, you must either:
• Use the SAX CLOSE XML ELEMENT command, or
• Close the XML document. In this case, 4th Dimension will automatically add the
necessary XML end tags.
In tag, pass the name of the element to be created. This name may only contain letters,
numbers and the characters “.”, “-“,”_” and “:”. If an invalid character is passed in tag, an
error will be generated.
Optionally, the command can pass one or more attribute/value pairs (in the form of
variables, fields or literal values) using the attribName and attribValue parameters. You can
pass as many attribute/value pairs as you want.
Example
The following statement:
vElement:="Book"
SAX OPEN XML ELEMENT($DocRef;vElement)
... will write the following line in the document:
<Book
See Also
SAX CLOSE XML ELEMENT, SAX OPEN XML ELEMENT ARRAYS.
Error Handling
If an invalid character is passed in tag, an error is generated.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX OPEN XML ELEMENT ARRAYS command is used to add a new element in the XML
document whose reference is passed in document as well as, optionally, attributes and their
values in the form of arrays.
Except for the support of arrays (see below), this command is identical to SAX OPEN XML
ELEMENT. Please refer to the description of this command for more information about its
operation.
Optionally, the SAX OPEN XML ELEMENT ARRAYS command can be used to pass pairs of
attributes and attribute values in the form of arrays in the attribNamesArray and
attribValuesArray parameters.
The arrays must have been created previously and operate in attribute/attribute value pairs.
You can pass as many pairs of arrays, and as many items in each pair, as you want.
Example
The following method:
ARRAY STRING(80;tAttrNames;2)
ARRAY STRING(80;tAttrValues;2)
vElement:="Book"
tAttrNames{1}:="Font"
tAttrValues{1}:="Arial"
tAttrNames{2}:="Style"
tAttrValues{2}:="Bold"
SAX OPEN XML ELEMENT ARRAYS($DocRef;vElement;tAttrNames;tAttrValues)
See Also
SAX CLOSE XML ELEMENT, SAX OPEN XML ELEMENT.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
In the XML document referenced by document, the SAX CLOSE XML ELEMENT command
writes the statements necessary for closing the last element opened using the SAX OPEN
XML ELEMENT command.
The use of this command is optional. In fact, 4th Dimension will automatically add the
necessary end tags for any unclosed elements when XML documents are closed.
Example
If the last element opened is <Book>, the following statement:
See Also
SAX OPEN XML ELEMENT, SAX OPEN XML ELEMENT ARRAYS.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX GET XML ELEMENT command returns various information about the element name
that is present in the XML document reference in the document parameter. This command
must be called with the XML Start Element or XML End Element SAX events. In the specific
case of XML End Element, the attribute parameters are not handled. For more information
about SAX events, refer to the description of the SAX Get XML node command.
The prefix parameter returns the namespace of the element. This parameter is empty if no
namespace is linked to the element.
The command fills the attrNames array with the names of attributes of the target element.
If necessary, the command creates and sizes the array automatically.
The command also fills the attrValues array with the values of attributes of the target
element. If necessary, the command creates and sizes the array automatically.
Example
Let's look at the following piece of XML code:
<RootElement>
<Child Att1="111" Att2="222" Att3="333">MyText</Child>
</RootElement>
See Also
SAX Get XML node.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
In the XML document referenced by document, the SAX ADD XML ELEMENT VALUE
command adds data directly without converting them. This command is equivalent, for
instance, to inserting an attachment in the body of an e-mail.
In data, you can either pass a character string directly, or a 4D variable. The variable
contents will be converted into text before being included in the XML document.
If you want to encode the contents of data, you must use the ENCODE command. In this
case, of course, you must passs a BLOB in data.
In order for this command to operate correctly, an element must be open. Otherwise, an
error will be generated. If the command was executed correctly, the system variable OK is
set to 1. Otherwise, it is set to 0.
Example
This example inserts the whitepaper.pdf file into the open XML element:
C_BLOB(vBMyBLOB)
DOCUMENT TO BLOB ("c:\\whitepaper.pdf";vBMyBLOB)
SAX ADD XML ELEMENT VALUE($DocRef;vBMyBLOB)
See Also
SAX GET XML ELEMENT VALUE.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX GET XML ELEMENT VALUE command allows you to get the value of an XML
element that exists in the XML document referenced in the document parameter. This
command must be called with the XML DATA SAX event. For more information about SAX
events, refer to the description of the SAX Get XML node command.
Pass a Text or BLOB type variable in the value parameter. If you pass a BLOB, the text will
be returned as is (it will not be modified).
Example
Let's look at the following piece of XML code:
<RootElement>
<Child Att1="111" Att2="222" Att3="333">MyText</Child>
</RootElement>
See Also
SAX ADD XML ELEMENT VALUE, SAX Get XML node.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
In the XML document referenced by document, the SAX ADD XML CDATA command adds
data of the text or BLOB type. This data will be automatically framed between the <CData>
and </CData> tags.
The text included in a CData section is ignored by the XML interpreter.
If you want to encode the contents of data, you must use the ENCODE command. In this
case, of course, you must pass a BLOB in data.
In order for this command to operate correctly, an element must be open. Otherwise, an
error will be generated.
Example
You want to insert the following lines in your XML document:
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1
}
else
{
return 0
}
}
C_TEXT (vtMytext)
... ` place the text in the vtMytext variable here
SAX ADD XML CDATAL($DocRef;vtMytext)
See Also
SAX GET XML CDATA.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX GET XML CDATA command allows you to get the CDATA value of an XML element
that exists in the XML document referenced in the document parameter. This command
must be called with the XML CDATA SAX event. For more information about SAX events,
refer to the description of the SAX Get XML node command.
Example
Let's look at the following piece of XML code:
<RootElement>
<Child>MyText<![CDATA[MyCData]]</Child>
</RootElement>
C_BLOB (vData)
C_TEXT (vTextData)
SAX GET XML CDATA(DocRef;vData)
vTextData:=BLOB to text(vData;C string)
See Also
SAX ADD XML CDATA, SAX Get XML node.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
In the XML document referenced by document, the SAX ADD PROCESSING INSTRUCTION
command adds an XML processing statement.
A processing statement lets you indicate the application type and when necessary any
additional parameters allowing you to process an unparsable external entity.
The command formats the data of the statement in conformity with XML. However, the
statements themselves are not parsed and it is up to the developer to make sure that they
are valid.
Example
The following code:
See Also
SAX GET XML PROCESSING INSTRUCTION.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX GET XML PROCESSING INSTRUCTION command returns the name and value of the
XML instruction processed in the XML document referenced in the document parameter.
This command must be called with the XML Processing Instruction event. For more
information about SAX events, refer to the description of the SAX Get XML node command.
Example
Let's look at the following piece of XML code:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Edited with XML Spy v3.0.7 NT (http://www.xmlspy.com) by Myself (4D SA)-->
<?PI TextProcess?>
<!DOCTYPE RootElement SYSTEM "ParseTest.dtd">
The following instruction will return “PI” in vName and “TextProcess” in vValue:
See Also
SAX ADD PROCESSING INSTRUCTION, SAX Get XML node.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SAX GET XML ENTITY command allows you to get the name and value of an XML entity
that exists in the XML document referenced in the document parameter. This command
must be called with the XML Entity SAX event. For more information about SAX events,
refer to the description of the SAX Get XML node command.
Examples
Let's look at the following piece of XML code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE body [
<!ELEMENT body (element*)>
<!ELEMENT element (#PCDATA)>
<!ENTITY name "Replacement">
]>
<body>
<element>Entity updated by &name;</element>
</body>
The following instruction will return “name” in vName and “Replacement” in vValue.
SAX GET XML ENTITY(DocRef;vName;vValue)
See Also
SAX Get XML node.
version 2003
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET XML ERROR command returns, in the errorText parameter, a description of the
error encountered when processing the XML element designated by the elementRef
parameter. The information returned is supplied by the Xerces.DLL library.
The optional row and column parameters indicate the location of the error: they retrieve,
respectively, the row number and, in this row, the position of the first character of the
expression at the origin of the error.
See Also
DOM Get XML information.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The APPLY XSLT TRANSFORMATION command applies an XSLT transformation to a
document or a BLOB containing XML and generates a document or a BLOB result. The
scope of this command is the current process.
Note: For more information about XSL transformation (or XSLT), refer to the Presentation
of XML Commands section.
The command requires three BLOBs or character string parameters. Warning: This
command only accepts variables or fields as parameters.
If you pass a character string, you designate a document. In this case, you can only pass the
name (the document must be next to the database structure) or the full access path of the
document.
You cannot mix different types of parameters within the same call.
• The xmlSource parameter must contain the XML source to transform. The command
checks the validity of the XML code.
• The xslSheet parameter must contain the XSL style sheet to use for the XSLT
transformation. This style sheet may have been generated manually or using speciality
software. The command checks the validity of the XML code.
• The result parameter must contain the name of the document or the BLOB that must
receive the result of the XSLT transformation. If you pass a document name that does not
exist at the designated location, 4th Dimension creates it automatically. If the document is
already open with write access, an error is generated.
Example
Refer to the example of the SET XSLT PARAMETER command.
See Also
GET XSLT ERROR, SET XSLT PARAMETER.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The SET XSLT PARAMETER command must be used jointly with the APPLY XSLT
TRANSFORMATION command. It allows you to define values of variable parameters placed
in an XSL style sheet when the XSLT transformation of an XML document begins. Using
this command, it is possible to insert values coming from 4th Dimension processes in the
XSL style sheets right before using APPLY XSLT TRANSFORMATION.
Notes:
• For more information about XSL transformation (or XSLT), refer to the Presentation of
XML Commands section.
• The scope of this command is the current process. It must be called in the same process as
the associated APPLY XSLT TRANSFORMATION command.
Pass the name of the XSL variable parameter to replace in paramName. This parameter must
be present in the XSL style sheet as $toreplace. However, the $ character is not necessary in
paramName. For example, if the instruction <xsl:template match=$myvar> is placed in the
XSL file, simply pass “myvar” in paramName to set this parameter.
In paramValue, pass the value that you wish to insert instead of the XSL variable in the
transformed file. To use the above example, if you pass “title” in paramValue, the XSLT
traansformation will take into account the <xsl:template match="title"> instruction (which
set “title” elements as subject to style rules).
If the value type is string, you must include it between single quotes (for example 'myvalue')
— in addition to the double quotes of the 4D syntax ("'myvalue'").
Note: For a detailed description of XSL language, you can refer to a number of sites on the
Internet dedicated to this language. For example, http://xml.org.
To pass several parameters in an XSL style sheet, simply call the SET XSLT PARAMETER
command several times. The parameters are “piled” until the APPLY XSLT
TRANSFORMATION call in the same process. Once APPLY XSLT TRANSFORMATION is
executed, the “pile” of parameters is automatically deleted.
See Also
APPLY XSLT TRANSFORMATION, GET XSLT ERROR.
version 2004
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Description
The GET XSLT ERROR command returns, in the errorText parameter, a description of the last
error encountered during the XSLT transformation performed in the current process. The
information returned is supplied by the Xerces.dll library.
The optional row and column parameters indicate the location of the error in the XSL
document: they retrieve, respectively, the row number and, in this row, the position of the
first character of the expression at the origin of the error.
See Also
APPLY XSLT TRANSFORMATION, SET XSLT PARAMETER.
The following table lists the syntax error codes for errors that may occur during code
execution in the User or Custom Menus environment. Some of these errors may occur in
interpreted mode only, some in compiled mode only, some in both modes. You can intercept
these errors using an error interruption method installed using ON ERR CALL.
Code Description
1 A “(” was expected.
2 A field was expected.
3 The command may be executed only on a field in a subtable.
4 Parameters in the list must all be of the same type.
5 There is no table to which to apply the command.
6 The command may only be executed on a Subtable type field.
7 A Numeric argument was expected.
8 An Alphanumeric argument was expected.
9 The result of a conditional test was expected.
10 The command cannot be applied to this field type.
11 The command cannot be applied between two conditional tests.
12 The command cannot be applied between two Numeric arguments.
13 The command cannot be applied between two Alphanumeric arguments.
14 The command cannot be applied between two Date arguments.
15 The operation is not compatible with the two arguments.
16 The field has no relation.
17 A table was expected.
18 Field types are incompatible.
19 The field is not indexed.
20 An “=” was expected.
21 The method does not exist.
22 The fields must belong to the same table or subtable for a sort or graph.
23 A “<” or “>” was expected.
24 A “;” was expected.
25 There are too many fields for a sort.
26 The field type cannot be Text, Picture, Blob or Subtable.
27 The field must be prefixed by the name of its table.
28 The field type must be Numeric.
29 The value must be 1 or 0.
30 A variable was expected.
31 There is no menu bar with this number.
Tips
Some of these error codes denote plain syntax errors due to mistyping. For example, you get
an error #37 if you execute the statement v=0 when you actually meant v:=0. You can
eliminate the error by fixing your code in the Design Method Editor.
Some of these error codes are due to simple programming errors. For example, you get an error
#5 if you execute an ADD RECORD command, when you have not first set the default table
(using the DEFAULT TABLE command), and do not pass the table parameter. In this case, there
is no table to which to apply the command. You eliminate the error by checking to see if you
forgot to set the default table or if you forgot to pass the table parameter to the command for
this occurrence.
Some of these error codes denote errors due to a flaw in the design. For example, you get an
error #16 if you apply RELATE ONE to a field that is not related to any other field. You
eliminate the error by checking to see if your code is actually wrong or if you simply forgot to
create the relation starting from the field.
Some errors, when they occur, are not always located exactly where your code breaks. For
example, if in a subroutine you get an error #53 (indice out of range) on the line
vpFld:=Field($1;$2), the error is due to a wrong table and/or field number that has been passed
to the subroutine as a parameter. Therefore, the error is located in the caller method and not
where the error actually occurs. In this case, trace your code in the Debugger window to
determine which line of code is the real culprit, then fix it in the Design Method Editor.
See Also
ON ERR CALL.
This table lists the error codes generated by the 4th Dimension Database Engine. These codes
cover errors that occur at a low level of the database engine, such as user interruption,
privilege errors, and damaged objects.
Code Description
Notes
1. While some of the errors listed reflect serious problems, i.e., -10502 Invalid record structure
(data file needs to be repaired), other errors may occur on a regular basis and can be managed
using an ON ERR CALL project method. For example, it is common to handle the error –9998
Duplicated key if your application offers opportunities to create duplicated values for a table
that includes an indexed field whose Unique property is set.
2. Some of the errors listed never occur at the 4D language level. They can occur and be
handled at a low level by database engine routines or when using 4D Backup or 4D Open.
3. The error -10503 Record # is out of range generally means that your code (for example, the
GOTO RECORD command) is attempting to access a record that no longer exists (or has never
existed). This error may also occur if you attempt to use the record number for a newly created
record in a transaction. The reason is that newly created records, while in a transaction, are
assigned temporary record numbers until the transaction is validated. If this error occurs in
that context, your database is fine, but your algorithm is not. Finally, in certain more unusual
cases, this error may mean that the database needs repairing.
4. The error -9999 No more room to save the record occurs when all the segments of your
database are full or located on full volumes. This error can also be generated if the data file is
locked or located on a locked volume.
See Also
ON ERR CALL.
The following table describes the errors that can occur with a network connection.
Code Description
-10001 The actual connection to the database has been disrupted.
-10002 The connection for this process has been disrupted.
-10003 Bad connection parameters.
-10020 No server was selected while using OP Select 4D server.
-10021 No server was found while using OP Find 4D server.
-10030 Desynchronization has occured during the write cycle.
-10031 Desynchronization has occured during the read cycle.
-10033 Incorrect data size during read cycle.
-10050 Unknown option in Get/SetOption.
-10051 Incorrect value in Get/SetOption.
The following table lists the specific error codes generated by the backup and restore
module of 4th Dimension.
You can retrieve these errors using a method installed via the ON ERR CALL command.
Code Description
1401 The maximum number of backup attempts has been reached; automatic
backup is temporarily disabled.
1403 No log file.
1404 A transaction is opened in this process.
1405 The maximum timeout for transactions to end in a concurrent process has
been reached.
1406 Backup canceled by user.
1407 Destination folder is not valid.
1408 Error during log file backup.
1409 Error during backup.
1410 Cannot find the backup file to be checked.
1411 Error during backup file check.
1412 Cannot find the log backup file to be checked.
1413 Error during log backup file check.
1414 This command can only be executed on 4D Server.
1415 Cannot back up log file; a critical operation is in progress.
1416 This log file does not correspond to the database opened.
1417 A log integration operation is already running. The backup cannot be launched.
1420 Integration aborted due to detection of locked records.
1421 This command cannot be used in a client/server environment.
• Errors 1408 and 1409 generally come from a read error for files to be backed up or a write
error during file backup.
• Errors 1411 and 1413 occur during checking of archives.
When these errors occur, it may be prudent to first check the space remaining on the disk
and the read-write access privileges.
See Also
ON ERR CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The following table lists codes returned by the Operating System File Manager. These codes
can be returned when you are using, for example, the System Documents commands. In this
list, the word “file” indicates a document on disk and not a file in your database structure.
Code Description
-33 File directory full. You cannot create new files on disk.
-34 Disk is full. There is no more room available on the disk.
-35 Specified volume doesn’t exist.
-36 I/O error. There is probably a bad block on the disk.
-37 Bad filename or volume name.
-38 Tried to read or write to a file that is not open.
-39 Logical end-of-file reached during read operation.
-40 Attempt to position before start of file.
-41 Not enough memory to open a new file on the disk.
-42 Too many files open at the same time.
-43 File not found.
-44 Volume is locked by a hardware setting.
-45 File is locked.
-46 Volume is locked by an application.
-47 Tried to access a file that has been deleted.
-48 Tried to rename a file with the name of an already deleted file.
-49 Tried to open a file already open with write permission.
-51 Tried to access a document with an invalid document reference number.
-52 Internal file manager error (position of file marker is lost).
-53 Volume not on line.
-54 Attempt to open locked file for writing.
-57 Tried to work with a non-Macintosh disk.
-58 Error in the external file system.
-60 Bad master directory block. Your disk is damaged.
-61 Read/write permission doesn’t allow writing.
-64 There is a hardware problem with the disk (bad installation, incorrect formatting,...).
-84 There is a hardware problem with the disk (bad installation, incorrect formatting,...).
-120 Tried to access a file by using a pathname that specifies a non existing directory.
-121 An access path could not be created.
-124 Tried to access a disconnected shared volume.
See Also
ON ERR CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The following table lists the error codes returned by the Operating System Memory Manager.
Code Description
-108 Not enough memory to perform an operation.
Give more memory to your 4D application.
-109 Internal Memory problem. Memory is probably logically corrupted.
Exit as soon as possible. Restart your machine and reopen the database.
-111 Internal Memory problem. Memory is probably logically corrupted.
Exit as soon as possible. Restart your machine and reopen the database. (*)
-117 Internal Memory problem. Memory is probably logically corrupted.
Exit as soon as possible. Restart your machine and reopen the database.
Tip: When allocating and working with large arrays, BLOBs, pictures, as well as sets (objects
that can hold large amount of data), use an ON ERR CALL project method to test the error -108.
(*) Error -111 can also occur when you attempt to read a value from a BLOB with an offset out
of range. In this case, the error is minor and you do not need to terminate the working
session. Just fix the offset you pass to the BLOB command.
See Also
ON ERR CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The following table lists the error codes returned by the Operating System Printing Manager.
These codes can be returned during printing.
Code Description
-1 Problem saving file to be printed
-27 Problem opening or closing connection with printer
-128 Printing interrupted by the user
-193 Resource file not found
-4100 Printer connection has been interrupted
-4101 Printer busy or not connected
-8150 A LaserWriter is not selected
-8151 The printer has been initialized with a different driver version
-8192 LaserWriter time-out
See Also
ON ERR CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The following table lists the error codes returned by the Operating System Resource Manager.
Code Description
-1 Resource file could not be opened
-192 Resource not found
-193 Resource map is damaged (file needs to be repaired)
-194 Resource could not be added
-196 Resource could not be deleted
See Also
ON ERR CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The following table lists the NaN codes returned by the Operating System. NaN is a Standard
Apple Numeric Environment (SANE) representation which means “Not a Number.” NaN
appears when an operation produces a result that is beyond SANE’s scope.
Code Description
1 Invalid square root
2 Invalid addition
4 Invalid division
8 Invalid multiplication
9 Invalid remainder
17 Converting an invalid ASCII string
20 Converting a Comp type number to floating-point
21 Creating a NaN with a zero code
33 Invalid argument to a trig function
34 Invalid argument to an inverse trig function
36 Invalid argument to a log function
37 Invalid argument to an xi or xy function
38 Invalid argument to a financial function
255 Uninitialized storage
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The following table lists the codes returned by the Operating System Sound Manager.
Code Description
-203 Too many sound commands
-204 The sound resource cannot be loaded
-205 The sound channel is logically corrupted
-206 The format of the sound resource is wrong
-207 Not enough memory to perform the sound
-209 The sound channel is busy
See Also
ON ERR CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The following table lists error codes returned by the Operating System Serial Ports Manager.
Code Description
-28 There is no open serial port
See Also
ON ERR CALL.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The following table lists some of the Mac OS system errors. It is usually not possible to recover
from these errors.
Code Description
4 Zero divide
15 Segment Loader Error: 4th Dimension failed in loading one of its own code
segments. You must allocate more memory to 4th Dimension.
17 to 24 A system package is missing. Check if your system directory has been correctly
installed
25 Out of memory
You must allocate more memory to 4th Dimension
28 Stack has moved into the application heap.
You must allocate more memory to 4th Dimension
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
• The ASCII codes 128 through 255 are different on Windows and Macintosh. In order to
maintain platform independence, the Windows version of 4th Dimension automatically
converts ASCII codes from Windows to Macintosh ASCII maps when characters are entering
the 4D environment (Data entry, Edit/Paste, Import, etc.) and from Macintosh to Windows
ASCII maps when characters are leaving the 4D environment (Edit/Cut or Copy, Export, etc.).
The ASCII codes 128 through 255 are listed in ASCII Codes 128..191 and ASCII Codes 192..255.
The codes work the same when you type ALT+0233 in the Procedure editor. However, to look
for a character using its ASCII code, you use the Macintosh ASCII code of the character.
For example:
See Also
Ascii, ISO to Mac, Mac to ISO, Mac to Win, ON EVENT CALL, Win to Mac.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The standard ASCII codes (0 through 127) are common to Windows and Macintosh.
ASCII Codes 0..63 ASCII Codes 64..127 ASCII Codes 128..191 ASCII Codes 192..255
See Also
Char, ISO to Mac, Mac to ISO, Mac to Win, ON EVENT CALL, Win to Mac.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The standard ASCII codes (0 through 127) are common to Windows and Macintosh.
ASCII Codes 0..63 ASCII Codes 64..127 ASCII Codes 128..191 ASCII Codes 192..255
See Also
Ascii, ISO to Mac, Mac to ISO, Mac to Win, ON EVENT CALL, Win to Mac.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The following tables list the characters displayed by 4th Dimension for each ASCII code, on
Macintosh and Windows. In addition, the tables present the key combination required to
produce each character, using a US keyboard.
ASCII Codes 0..63 ASCII Codes 64..127 ASCII Codes 128..191 ASCII Codes 192..255
Note: The cells in the Windows column that are greyed out denote characters that are not
available on Windows or that are different from the Macintosh characters.
See Also
Char, ISO to Mac, Mac to ISO, Mac to Win, ON EVENT CALL, Win to Mac.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
The following tables list the characters displayed by 4th Dimension for each ASCII code, on
Macintosh and Windows. In addition, the tables present the key combination required to
produce each character, using a US keyboard.
ASCII Codes 0..63 ASCII Codes 64..127 ASCII Codes 128..191 ASCII Codes 192..255
Note: The cells in the Windows column that are greyed out denote characters that are not
available on Windows or that are different from the Macintosh characters.
See Also
Ascii, ISO to Mac, Mac to ISO, Mac to Win, ON EVENT CALL, Win to Mac.
version 6.0
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
4th Dimension returns values for Function keys in the KeyCode system variable, which is used
within project methods installed by the ON EVENT CALL command. These project methods are
used to catch events.
The values for Function keys are not based on ASCII codes. They are:
Reminder
The KeyCode system variable is to be used in a project method installed using ON EVENT CALL.
In addition to the function keys, the following table lists the values returned in KeyCode when
you press one of the common keys, such as Return or Enter.
The first column indicates the number for each command, used more particularly by the
Command name command.
156 ABORT
99 Abs (number) → Number
269 ACCEPT
303 ACCUMULATE (data{; data2; ...; dataN})
346 Activated → Boolean
361 ADD DATA SEGMENT
56 ADD RECORD ({table}{; }{*})
202 ADD SUBRECORD (subtable; form{; *})
393 Add to date (date; years; months; days) → Date
119 ADD TO SET ({table; }set)
31 After → Boolean
41 ALERT (message{; ok button title})
47 ALL RECORDS {(table)}
109 ALL SUBRECORDS (subtable)
265 Append document (document{; type}) → DocRef
411 APPEND MENU ITEM (menu; itemText{; process})
911 APPEND TO ARRAY (array; value)
403 APPEND TO CLIPBOARD (dataType; data)
376 APPEND TO LIST (list; itemText; itemRef{; sublist; expanded})
491 Application file → String
494 Application type → Long Integer
493 Application version {(*)} → String
70 APPLY TO SELECTION ({table; }statement)
73 APPLY TO SUBSELECTION (subtable; statement)
882 APPLY XSLT TRANSFORMATION (xmlSource; xslSheet; result)
20 Arctan (number) → Number
223 ARRAY BOOLEAN (arrayName; size{; size2})
224 ARRAY DATE (arrayName; size{; size2})
220 ARRAY INTEGER (arrayName; size{; size2})
887 BACKUP
151 BEEP
29 Before → Boolean
198 Before selection {(table)} → Boolean
199 Before subselection (subtable) → Boolean
717 BEST OBJECT SIZE ({*; }object; bestWidth; bestHeight{; maxWidth})
536 BLOB PROPERTIES (blob; compressed{; expandedSize{; currentSize}})
605 BLOB size (blob) → Longint
526 BLOB TO DOCUMENT (document; blob{; *})
549 BLOB to integer (blob; byteOrder{; offset}) → Number
557 BLOB to list (blob{; offset}) → ListRef
551 BLOB to longint (blob; byteOrder{; offset}) → Number
682 BLOB TO PICTURE (pictureBlob; picture)
553 BLOB to real (blob; realFormat{; offset}) → Real
555 BLOB to text (blob; textFormat{; offset{; textLength}}) → Text
850 BLOB TO USERS (users)
533 BLOB TO VARIABLE (blob; variable{; offset})
646 BOOLEAN ARRAY FROM SET (booleanArr{; set})
302 BREAK LEVEL (level{; pageBreak})
326 BRING TO FRONT (process)
871 BUILD APPLICATION {(projectName)}
194 BUTTON TEXT ({*; }object; buttonText)
311 IDLE
665 IMPORT DATA (fileName{; project{; *}})
86 IMPORT DIF ({table; }document)
87 IMPORT SYLK ({table; }document)
168 IMPORT TEXT ({table; }document)
113 In break → Boolean
191 In footer → Boolean
112 In header → Boolean
397 In transaction → Boolean
55 INPUT FORM ({table; }form{; userForm}{; *})
227 INSERT ELEMENT (array; where{; howMany})
559 INSERT IN BLOB (blob; offset; len{; filler})
625 INSERT LIST ITEM (list; beforeItemRef | *; itemText; itemRef{; sublist; expanded})
829 INSERT LISTBOX COLUMN ({*; }object; colPosition; colName; colVariable; headerName;
headerVar)
913 INSERT LISTBOX ROW ({*; }object; position)
412 INSERT MENU ITEM (menu; afterItem; itemText{; process})
Related command(s): APPEND TO CLIPBOARD, GET CLIPBOARD, Get resource properties, SET
RESOURCE PROPERTIES, Test clipboard.
HH MM Long Integer 2
HH MM AM PM Long Integer 5
HH MM SS Long Integer 1
Hour Min Long Integer 4
Hour Min Sec Long Integer 3
B
BACKUP..........................................................................................................255
BEEP............................................................................................................. 1687
Before.............................................................................................................632
Before selection............................................................................................ 1402
Before subselection....................................................................................... 1527
BEST OBJECT SIZE...........................................................................................966
BLOB PROPERTIES...........................................................................................281
BLOB size........................................................................................................276
BLOB TO DOCUMENT....................................................................................285
BLOB to integer.............................................................................................. 308
BLOB to list.....................................................................................................294
BLOB to longint..............................................................................................310
BLOB TO PICTURE........................................................................................ 1080
BLOB to real................................................................................................... 312
BLOB to text................................................................................................... 314
BLOB TO USERS............................................................................................1746
BLOB TO VARIABLE.........................................................................................290
BOOLEAN ARRAY FROM SET...........................................................................252
BREAK LEVEL.................................................................................................1034
BRING TO FRONT.........................................................................................1123
BUILD APPLICATION.....................................................................................1635
BUTTON TEXT................................................................................................ 934
C
CALL PROCESS............................................................................................. 1108
CALL WEB SERVICE....................................................................................... 1942
D
Data file..........................................................................................................153
DATA SEGMENT LIST......................................................................................160
Database event.............................................................................................1670
Date............................................................................................................... 490
Day number................................................................................................... 487
Day of............................................................................................................ 482
Deactivated.................................................................................................... 639
Dec.................................................................................................................841
DECODE.......................................................................................................1638
DECRYPT BLOB...............................................................................................326
DEFAULT TABLE............................................................................................ 1623
DELAY PROCESS........................................................................................... 1139
DELETE DOCUMENT.....................................................................................1554
DELETE ELEMENT............................................................................................235
DELETE FOLDER............................................................................................1565
DELETE FROM BLOB....................................................................................... 318
DELETE LIST ITEM........................................................................................... 735
DELETE LISTBOX COLUMN.............................................................................815
DELETE LISTBOX ROW.................................................................................... 824
DELETE MENU ITEM........................................................................................889
DELETE RECORD...........................................................................................1284
DELETE RESOURCE........................................................................................1373
DELETE SELECTION.......................................................................................1391
Delete string................................................................................................. 1468
DELETE SUBRECORD.....................................................................................1518
DELETE USER................................................................................................ 1737
DELETE USER FORM......................................................................................1683
DIALOG.......................................................................................................... 471
E
EDIT ACCESS................................................................................................ 1729
EDIT FORM...................................................................................................1679
EDIT FORMULA...............................................................................................687
EDIT ITEM.......................................................................................................586
ENABLE BUTTON............................................................................................930
ENABLE MENU ITEM.......................................................................................885
ENCODE.......................................................................................................1637
ENCRYPT BLOB...............................................................................................320
End selection................................................................................................ 1404
End subselection...........................................................................................1528
ERASE WINDOW...........................................................................................1981
Euro converter................................................................................................ 857
EXECUTE........................................................................................................ 796
EXECUTE ON CLIENT....................................................................................1154
Execute on server..........................................................................................1134
Exp................................................................................................................. 848
EXPAND BLOB................................................................................................279
EXPORT DATA................................................................................................ 765
EXPORT DIF.................................................................................................... 761
EXPORT SYLK..................................................................................................757
EXPORT TEXT................................................................................................. 753
F
False............................................................................................................... 331
Field............................................................................................................. 1490
Field name....................................................................................................1487
FILTER EVENT..................................................................................................774
G
GENERATE CERTIFICATE REQUEST................................................................ 1383
GENERATE ENCRYPTION KEYPAIR.................................................................1381
Gestalt..........................................................................................................1614
Get 4D folder..................................................................................................156
Get alignment................................................................................................ 968
GET ALLOWED METHODS.............................................................................. 686
GET AUTOMATIC RELATIONS....................................................................... 1303
GET BACKUP INFORMATION..........................................................................256
GET CLIPBOARD............................................................................................. 343
Get component resource ID..........................................................................1376
Get current printer........................................................................................1033
Get database parameter................................................................................1499
Get default user............................................................................................ 1735
GET DOCUMENT ICON................................................................................1584
Get document position.................................................................................1587
H
HIDE MENU BAR.............................................................................................867
HIDE PROCESS..............................................................................................1121
HIDE TOOL BAR............................................................................................1631
HIDE WINDOW.............................................................................................1985
HIGHLIGHT RECORDS...................................................................................1416
HIGHLIGHT TEXT..........................................................................................1720
I
IDLE................................................................................................................447
IMPORT DATA................................................................................................ 763
IMPORT DIF....................................................................................................759
IMPORT SYLK..................................................................................................755
IMPORT TEXT................................................................................................. 751
In break.......................................................................................................... 636
In footer......................................................................................................... 637
In header........................................................................................................ 635
In transaction................................................................................................1653
INPUT FORM.................................................................................................. 666
INSERT ELEMENT............................................................................................234
INSERT IN BLOB..............................................................................................317
INSERT LIST ITEM............................................................................................725
INSERT LISTBOX COLUMN............................................................................. 813
INSERT LISTBOX ROW.................................................................................... 823
INSERT MENU ITEM........................................................................................888
Insert string.................................................................................................. 1467
Int.................................................................................................................. 840
INTEGER TO BLOB..........................................................................................296
INTEGRATE LOG FILE...................................................................................... 267
K
Keystroke........................................................................................................570
L
LAST PAGE......................................................................................................661
LAST RECORD...............................................................................................1400
LAST SUBRECORD.........................................................................................1524
LAUNCH EXTERNAL PROCESS.......................................................................1618
Length..........................................................................................................1457
Level.............................................................................................................1046
List item parent...............................................................................................733
List item position............................................................................................ 732
LIST TO ARRAY................................................................................................238
LIST TO BLOB................................................................................................. 292
LIST USER FORMS......................................................................................... 1682
LOAD COMPRESS PICTURE FROM FILE......................................................... 1071
Load list..........................................................................................................691
LOAD RECORD............................................................................................. 1269
LOAD SET..................................................................................................... 1438
LOAD VARIABLES.......................................................................................... 1760
Locked..........................................................................................................1271
M
Mac to ISO................................................................................................... 1473
Mac to Win...................................................................................................1471
Macintosh command down..........................................................................1706
Macintosh control down...............................................................................1708
Macintosh option down............................................................................... 1707
MAP FILE TYPES............................................................................................ 1575
Max................................................................................................................984
MAXIMIZE WINDOW....................................................................................1988
MENU BAR..................................................................................................... 865
Menu bar height...........................................................................................1599
Menu bar screen...........................................................................................1598
Menu selected................................................................................................ 870
MESSAGE........................................................................................................904
MESSAGES OFF...............................................................................................893
MESSAGES ON............................................................................................... 894
Method called on error...................................................................................780
Method called on event..................................................................................773
Milliseconds....................................................................................................495
Min................................................................................................................ 982
MINIMIZE WINDOW.................................................................................... 1990
Mod............................................................................................................... 845
Modified.........................................................................................................473
Modified record............................................................................................1280
MODIFY RECORD........................................................................................... 466
MODIFY SELECTION.....................................................................................1409
MODIFY SUBRECORD..................................................................................... 470
Month of........................................................................................................ 483
N
New list.......................................................................................................... 694
New log file.................................................................................................... 266
New process................................................................................................. 1131
NEXT PAGE.....................................................................................................662
NEXT RECORD..............................................................................................1399
NEXT SUBRECORD........................................................................................1525
Next window................................................................................................2003
Nil.................................................................................................................. 793
NO TRACE...................................................................................................... 803
Not.................................................................................................................332
Num.............................................................................................................1452
O
ODBC CANCEL LOAD.....................................................................................602
ODBC End selection........................................................................................600
ODBC EXECUTE..............................................................................................598
ODBC EXPORT............................................................................................... 608
ODBC GET LAST ERROR..................................................................................605
ODBC GET OPTION........................................................................................597
ODBC IMPORT............................................................................................... 606
ODBC LOAD RECORD.....................................................................................601
ODBC LOGIN................................................................................................. 593
ODBC LOGOUT..............................................................................................595
ODBC SET OPTION.........................................................................................596
ODBC SET PARAMETER...................................................................................603
Old.................................................................................................................475
OLD RELATED MANY.................................................................................... 1317
P
PAGE BREAK................................................................................................. 1025
PAGE SETUP..................................................................................................1048
PAUSE PROCESS........................................................................................... 1140
PICTURE LIBRARY LIST...................................................................................1091
PICTURE PROPERTIES....................................................................................1087
Picture size....................................................................................................1086
PICTURE TO BLOB........................................................................................ 1079
PICTURE TO GIF............................................................................................1076
PICTURE TYPE LIST........................................................................................1084
PLATFORM PROPERTIES................................................................................1603
PLAY............................................................................................................. 1688
POP RECORD................................................................................................1295
Pop up menu................................................................................................1710
Position........................................................................................................ 1454
POST CLICK..................................................................................................1714
POST EVENT................................................................................................. 1715
POST KEY......................................................................................................1713
Q
QR BLOB TO REPORT....................................................................................1199
QR Count columns....................................................................................... 1252
QR DELETE COLUMN....................................................................................1253
QR DELETE OFFSCREEN AREA....................................................................... 1201
QR EXECUTE COMMAND.............................................................................1218
QR Find column............................................................................................1221
QR Get area property....................................................................................1210
QR GET BORDERS.........................................................................................1230
QR Get command status...............................................................................1219
QR GET DESTINATION..................................................................................1204
QR Get document property.......................................................................... 1206
QR Get drop column.................................................................................... 1251
QR GET HEADER AND FOOTER.....................................................................1226
QR Get HTML template................................................................................ 1256
QR GET INFO COLUMN................................................................................1236
QR Get info row............................................................................................1240
QR Get report kind....................................................................................... 1208
S
SAVE LIST........................................................................................................693
SAVE OLD RELATED ONE................................................................................ 975
SAVE PICTURE TO FILE.................................................................................. 1075
SAVE RECORD...............................................................................................1282
SAVE RELATED ONE...................................................................................... 1315
SAVE SET...................................................................................................... 1437
SAVE VARIABLES............................................................................................1759
SAX ADD PROCESSING INSTRUCTION......................................................... 2074
SAX ADD XML CDATA..................................................................................2071
SAX ADD XML COMMENT........................................................................... 2061
SAX ADD XML DOCTYPE..............................................................................2058
SAX ADD XML ELEMENT VALUE................................................................... 2069
SAX CLOSE XML ELEMENT........................................................................... 2066
SAX GET XML CDATA...................................................................................2073
SAX GET XML COMMENT............................................................................ 2062
SAX GET XML DOCUMENT VALUES..............................................................2057
SAX GET XML ELEMENT............................................................................... 2067
SAX GET XML ELEMENT VALUE.....................................................................2070
SAX GET XML ENTITY...................................................................................2076
SAX Get XML node.......................................................................................2059
SAX GET XML PROCESSING INSTRUCTION.................................................. 2075
SAX OPEN XML ELEMENT.............................................................................2063
SAX OPEN XML ELEMENT ARRAYS................................................................2064
SAX SET XML OPTIONS................................................................................ 2056
SCAN INDEX................................................................................................ 1414
SCREEN COORDINATES................................................................................1594
SCREEN DEPTH.............................................................................................1595
Screen height............................................................................................... 1591
Screen width................................................................................................ 1592
SCROLL LINES...............................................................................................1717
SEARCH BY INDEX.......................................................................................... 973
T
Table............................................................................................................ 1488
Table name...................................................................................................1486
Tan.................................................................................................................851
Temporary folder..........................................................................................1611
Test clipboard.................................................................................................350
Test path name.............................................................................................1558
Test semaphore............................................................................................ 1107
TEXT TO BLOB................................................................................................305
Tickcount........................................................................................................494
Time............................................................................................................... 493
Time string..................................................................................................... 492
TRACE............................................................................................................ 801
Trigger level..................................................................................................1672
TRIGGER PROPERTIES....................................................................................1673
True................................................................................................................330
Trunc..............................................................................................................843
Type............................................................................................................... 787
V
Validate password.........................................................................................1732
VALIDATE TRANSACTION............................................................................. 1651
VARIABLE TO BLOB.........................................................................................287
VARIABLE TO VARIABLE.................................................................................1116
Variance......................................................................................................... 986
Version type....................................................................................................146
VOLUME ATTRIBUTES................................................................................... 1570
VOLUME LIST............................................................................................... 1569
W
WEB CACHE STATISTICS............................................................................... 1928
Web Context................................................................................................ 1915
Win to Mac...................................................................................................1472
Window kind................................................................................................ 1997
WINDOW LIST..............................................................................................1995
Window process........................................................................................... 1998
Windows Alt down....................................................................................... 1705
Windows Ctrl down......................................................................................1704
WRITE PICTURE FILE......................................................................................1081