sage x3 l4g development

Sage X3 L4G Development Skill

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "sage x3 l4g development" with this command: npx skills add opennext-dz/agent-skills/opennext-dz-agent-skills-sage-x3-l4g-development

Sage X3 L4G Development Skill

You are an expert developer in L4G (Langage de 4ème Génération) for the Sage X3 ERP. Your role is to write, read, and debug L4G code based on the user's requirements and the official Sage X3 documentation.

Sage X3 L4G - 4th Generation Language

Introduction to L4G

L4G (Language 4th Generation) is Sage X3's proprietary programming language. It is an interpreted, structured language oriented toward data processing, specifically designed for development within the Sage X3 ERP.

Syntax Conventions

General Rules

  • Instructions and keywords are case-insensitive

  • Multiple instructions can appear on the same line, separated by :

  • Comments start with # or REM

  • Variable names can contain letters, numbers, and underscores

  • Character strings use double quotes "

  • Instruction blocks typically end with End

  • keyword (e.g., Endif , Endfor )

Program Structure

=== DECLARATIONS ===

Table declarations

File MYTABLE [MTB]

Local variable declarations

Local Char NAME(50) Local Integer COUNTER Local Decimal AMOUNT(12,2)

Global variable declarations

Global Char G_USER(20)

=== MAIN PROGRAM ===

Main processing...

=== SUBPROGRAMS ===

Subprog MY_SUBPROGRAM(PARAM1, PARAM2) Value Char PARAM1 Variable Integer PARAM2 # Subprogram code End

=== FUNCTIONS ===

Funprog MY_FUNCTION(A, B) Value Integer A Value Integer B End A + B End

Data Types

Primitive Types

Type Description Declaration Syntax

Char

Alphanumeric string Char NAME(size) or Char NAME(size)(dim1:dim2)

Date

Date Date MY_DATE

Decimal

Decimal number Decimal AMOUNT(precision, decimals)

Double

Double precision floating point Double VALUE

Integer

Integer Integer COUNTER

Shortint

Short integer Shortint FLAG

Schar

Short character string Schar CODE(10)

Uuint

Unsigned integer Uuint ID

Uuid

Unique identifier Uuid GUID

Blbfile

Binary large object file Blbfile DOCUMENT

Clbfile

Character large object file Clbfile CONTENT

Variable Declaration

Local variables (scope limited to current program)

Local Char NAME(50) Local Integer COUNTER Local Decimal PRICE(10,2) Local Date DOC_DATE

Global variables (accessible from all programs)

Global Char G_USER(20) Global Integer G_NB_LINES

Initialization

Local Integer NUMBER = 0 Local Char TEXT = "Initial value"

Arrays

Local Char NAMES(30)(1:10) # Array of 10 strings (30 chars max) Local Integer MATRIX(1:5, 1:5) # 5x5 matrix Dim MY_ARRAY(1:MAX_SIZE) # Dynamic array

Constants

Const PI = 3.14159

Control Structures

IF Statement (Conditional)

Syntax:

If logical_expression [Then] # Instructions [Elsif logical_expression [Then] # Instructions]* [Else # Instructions] Endif

Examples:

Simple test

If I = 1 Infbox "I equals 1" Elsif I > 1 Infbox "I is greater than 1" Else Infbox "I is negative" Endif

Compact form

If CONDITION : ACTION : Endif

If with only Else

If I = 1 : Infbox "I = 1" : Else Infbox "I not equal to 1" : Endif

CASE Statement (Multiple Alternative)

Syntax:

Case variable When value1 # Instructions When value2, value3 # Instructions When DEFAULT # Default instructions Endcase

Example:

Case CHOICE When 1 Infbox "Option 1 selected" When 2, 3 Infbox "Option 2 or 3" When DEFAULT Infbox "Other option" Endcase

FOR Loop on Variable

Syntax 1 - Increment:

For num_variable = initial_value To final_value [Step step] # Instructions Next [num_variable]

Syntax 2 - Value List:

For variable = value_list # Instructions Next [variable]

Examples:

Simple loop with step

For I = 1 To 13 Step 2.5 Infbox num$(I) Next I

Displays: 1, 3.5, 6, 8.5, 11

Descending loop

For I = 15 To 11 Step -1 Infbox I Next I

Displays: 15, 14, 13, 12, 11

List traversal

For CHN = "A", "EF", "X", "ZZZ" Infbox CHN Next CHN

Displays: A, EF, X, ZZZ

Exit loop with Break

For I = 1 To 100 If [MTB]FIELD = "FOUND" : Break : Endif Next I

FOR Loop on File (FORF)

Syntax:

For key1 [hint-cl] [From key_start] [To key_end] [where-cl] [With Lock | With Stability] # Instructions Next [key]

Examples:

Simple traversal

For [CLI]CODECLI # Process each customer Next

Traversal with conditions

For [AMZ]CODE Where CODMSK=[M]MASK & SAIAFF=1 & CODTYP<>"ABS" If !find([F:AMZ]CODZON,[M]ZONE(0..NOL-1)) [M]ZONE(NOL) = [F:AMZ]CODZON NOL += 1 Endif Next

Traversal with locking

For [COM]NUMCOM With Lock # Processing with lock Rewrite [COM] Next

Equivalent to Read + While

For [CCL]CLICLI From START To END Where CONDITION # Processing Next

Is equivalent to:

Read [CCL]CLICLI >= START

While [S]fstat <= 2 and [CCL]CLICLI <= END

If CONDITION

# Processing

Endif

Read [CCL]CLICLI Next

Wend

WHILE Loop

Syntax:

While condition # Instructions Wend

or

While condition # Instructions Endwhile

Example:

I = 0 While I < 10 I += 1 Infbox num$(I) Wend

REPEAT Loop

Syntax:

Repeat # Instructions Until condition

Example:

Repeat I += 1 Infbox num$(I) Until I >= 10

Table Operations (Database)

Table Declaration (FILE)

Syntax:

[Local] File file [where_cl] [order_by_cl] [, file2 ...]

Examples:

Simple declaration

File HISTORY, CUSTOMER [CLI]

Remote file

File "SERVER:1801@FOLDER.TABLE" [ABR]

With Where and Order By clauses

File ORDERS [COM] Where STATUS = 1 Order By ORDDATE

Reopen with same abbreviation

File [COM] # Does not lose current record

Record Reading (READ)

Syntax:

Read [class] [key] [read_mode] [key_value]

Read Modes:

Mode Description

First

First record

Last

Last record

Next

Next record

Prev

Previous record

=

Equality

=

Greater than or equal

Greater than

<=

Less than or equal

<

Less than

Examples:

Read by equality

Read [CLI]CODECLI = "C001" If fstat = 0 # Record found Endif

Read first

Read [CLI]CODECLI First

Read next

Read [CLI]CODECLI Next

Read with locking

Read [CLI]CODECLI = "C001" With Lock

Read greater than or equal

Read [CLI]CODECLI >= "C001"

Read on partial key

Read [CLI]NAMCLI(1) = "DU" # First on 2 first characters

Read with Lock (READLOCK)

Readlock [CLI]CODECLI = "C001" If fstat = 0 # Record locked, ready for modification Endif

Record Writing (WRITE)

[CLI]CODECLI = "C001" [CLI]NAMCLI = "SMITH" [CLI]CITY = "NEW YORK" Write [CLI] If fstat <> 0 # Error during write Endif

Record Modification (REWRITE)

Readlock [CLI]CODECLI = "C001" If fstat = 0 [CLI]NAMCLI = "JONES" Rewrite [CLI] Endif

Record Deletion (DELETE)

Readlock [CLI]CODECLI = "C001" If fstat = 0 Delete [CLI] Endif

Existence Check (LOOK)

Look [CLI]CODECLI = "C001" If fstat = 0 Infbox "Customer exists" Endif

Table Join (LINK)

Syntax:

Link main_class With link_list As link_class [where_cl] [order_by_cl]

Example:

Define a link between tables

File HISTORY [HIS], CUSTOMER [CLI], PRODUCT [PRO]

Link [HIS] With [PRO]CODPRO = NUMPRO, [CLI]NUMCLI = NUMCLI _ As [LINK] _ Order By Key KEY1 = [PRO]KEY;[CLI]KEY

Use the link

For [LINK]KEY1 # Classes [F:HIS], [F:CLI], [F:PRO] are loaded Infbox [F:CLI]NAMCLI + " - " + [F:PRO]DESCRIPTION Next

Join Types:

  • = : Left outer join (main records even without linked)

  • ~= : Strict join (main records with linked only)

Transactions

Transaction Management

Begin transaction

Trbegin [TABLE1], [TABLE2]

Operations within transaction

[TABLE1]FIELD = VALUE Write [TABLE1]

If CONDITION_OK # Commit Commit Else # Rollback Rollback Endif

System Variables:

  • [S]adxlog : Indicates if a transaction is in progress

Note: A transaction can only be ended by the program that initiated it.

Filtering and Sorting

WHERE Clause

In File

File ORDERS [COM] Where STATUS = 1 And TOTAL > 1000

In For

For [COM]NUMCOM Where STATUS = 1

Separate filter

Filter [COM] Where STATUS = 1

ORDER BY Clause

File ORDERS [COM] Order By ORDDATE

Descending order

File ORDERS [COM] Order By ORDDATE Desc

SQL Queries

SQL Instruction

Simple query

Sql "SELECT * FROM MYTABLE WHERE FIELD = 'VALUE'"

Query with result

Local Char RESULT(100) Sql "SELECT FIELD FROM TABLE WHERE ID = 1" As RESULT

EXECSQL Instruction

For queries without return (INSERT, UPDATE, DELETE)

Execsql "UPDATE MYTABLE SET FIELD = 'VALUE' WHERE ID = 1"

SQL Analysis (ANASQL)

Analyze a SQL query

Anasql "SELECT * FROM MYTABLE"

Subprograms and Functions

Subprogram (SUBPROG)

Definition:

Subprog MY_SUBPROGRAM(PARAM1, PARAM2) Value Char PARAM1 # Passed by value Variable Integer PARAM2 # Passed by address (modifiable)

# Subprogram code
If PARAM1 = "TEST"
    PARAM2 = PARAM2 + 1
Endif

End

Call:

Call MY_SUBPROGRAM("TEST", MY_COUNTER)

Function (FUNPROG)

Definition:

Funprog CALC_X(A, B) Value Integer A Value Integer B

# Returns the value
End A * A / B

End

Funprog IS_ACTIVE(CODE) Value Char CODE

If CODE = ""
    End 1
Endif

If clalev([F:ACV]) = 0
    Local File ACTIV [ACV]
Endif

Read [ACV]CODACT = CODE

If fstat &#x3C;> 0 Or [F:ACV]FLACT &#x3C;> 2
    End 0
Elsif [F:ACV]TYP = 2
    End [F:ACV]DIME
Else
    End 1
Endif

End

Call:

Local Integer RESULT RESULT = func CALC_X(3, 2)

In an expression

If func IS_ACTIVE("CODE123") = 1 Infbox "Code is active" Endif

Parameter Passing Modes

Keyword Description

Value

Passed by value (copy, not modifiable)

Variable

Passed by address (modifiable)

Const

Passed by value (read-only, optimized)

Gosub (Internal Subroutine)

Call

Gosub LABEL

... main code ...

Internal subroutine

LABEL: # Code Return

Mask Management (Screens)

Mask Declaration

Mask MYMASK [MM]

Field Operations

Display a field

Affzo [MM]FIELD1

Clear a field

Effzo [MM]FIELD1

Force display

Envzo [MM]FIELD1

Enable a field (ungray)

Enable [MM]FIELD1

Disable a field (gray out)

Disable [MM]FIELD1

Initialize a grayed zone

Grizo [MM]FIELD1

Grayed zone on condition

Grizo [MM]FIELD1 Where CONDITION

Left Lists

Fill a left list

Fillbox [MM]LIST With EXPRESSION

Define a selection

Setlbox [MM]LIST, INDEX

Position in a left list

Leftbox [MM]LIST

Current left list

Local Integer SEL SEL = currbox

Sequential Files

Open for Reading (OPENI)

Local Integer FILEH Openi "folder\file.txt" Using FILEH If fstat = 0 # File opened successfully Endif

Open for Writing (OPENO)

Local Integer FILEH Openo "folder\file.txt" Using FILEH

Open for Read/Write (OPENIO)

Local Integer FILEH Openio "folder\file.txt" Using FILEH

Sequential Read (GETSEQ)

Local Char LINE(200) Getseq FILEH Into LINE While fstat = 0 # Process the line Getseq FILEH Into LINE Wend

Sequential Write (PUTSEQ)

Putseq FILEH From "Content to write"

Positioning (SEEK)

Absolute position

Seek FILEH, POSITION

Current position

Local Integer POS POS = adxseek(FILEH)

Close

Close FILEH

Separator Variables

  • [S]adxifs : Field separator (default TAB)

  • [S]adxirs : Record separator (default CR/LF)

  • [S]adxium : String encoding type

Dialog Boxes

Information (INFBOX)

Infbox "Information message" Infbox "Result: " + num$(VALUE)

Error (ERRBOX)

Errbox "Error message"

User Input (ASKUI)

Local Char RESPONSE(100) Askui "Enter a value:" With RESPONSE

Multiple Choice (CHOOSE)

Local Integer CHOICE Choose CHOICE, "Select an option:", _ "Option 1", "Option 2", "Option 3"

Error Handling

ONERRGO

Onerrgo ERROR_HANDLER

Code likely to generate an error

...

ERROR_HANDLER: # Error processing Infbox "Error #" + num$(errn) + ": " + errmes$(errn) Resume

Error Variables

Variable Description

errn

Error number

errm

Second part of error message

errmes$(n)

Complete error message

errp

Program where error occurred

errl

Error line

fstat

Return status for file operations

Common Error Codes

Code Constant Description

7 ERCLAS Abbreviation not found

8 ERINDI Index out of bounds

10 ERMODE Incorrect type

20 PAFIC File not opened

21 ERPATH Path not found

22 MODIN Incorrect read mode

28 ERREOP Abbreviation already used

29 TROFIC Too many open files

32 ERRET Incorrect loop nesting

41 ERLOOP Step value is zero

53 ERNOM Unknown variable

55 ERDIM Incorrect number of dimensions

61 ERVEX Incorrect expression type

System Variables

Input Variables

Variable Description

[S]adxfmt

Default input formats

[S]adxsca

Input characters

[S]status

Input return status

[S]indice

Current index in input

[S]inpmode

Mode used in input

Table Variables

Variable Description

[S]fstat

Return status of table instruction

[S]adxdlrec

Number of records deleted by DELETE

[S]adxuprec

Number of records modified by UPDATE

[S]currind

Current key number

[S]currlen

Number of key parts used

[S]keylen

Key length

[S]keyname

Key name

[S]nbrecord

Number of records

[S]nbind

Number of indexes

Application Variables

Variable Description

[S]nomap

Current and reference application

[S]adxmother

Reference applications

[S]adxusr

Connected user

[S]adxuid

User identifier

[S]adxpid

Adonix process number

[S]datesyst

Reference system date

[S]adxdir

Installation directory

[S]adxrob

Subdirectory names

Transaction Variables

Variable Description

[S]adxlog

Indicates if a transaction is in progress

[S]lockwait

Lock wait time

Menu Variables

Variable Description

[S]menchoix

Current function

[S]adxpam

Selected menu function parameter

[S]adxpno

Stack of OBJet names

Debugger Variables

Variable Description

[S]adxdbc

Input subroutine

[S]adxdbo

Open subroutine

[S]adxdbx

Close subroutine

[S]adxdpg

Program

[S]dbglong

Long variable

[S]dbgstr

String variable

[S]dbgmode

Mode

Built-in Functions

Numeric Functions

Function Description Example

abs(n)

Absolute value abs(-5) = 5

ar2(n)

Round to 2 decimals ar2(3.456) = 3.46

arr(n, p)

Round to precision p arr(3.456, 2) = 3.46

fix(n)

Truncate fix(3.9) = 3

int(n)

Integer part int(3.9) = 3

mod(n, d)

Modulo mod(10, 3) = 1

sgn(n)

Sign sgn(-5) = -1

sqr(n)

Square root sqr(16) = 4

exp(n)

Exponential exp(1) = e

ln(n)

Natural logarithm ln(e) = 1

log(n)

Base-10 logarithm log(100) = 2

fac(n)

Factorial fac(5) = 120

rnd(n)

Random number rnd(100)

anp(n, p)

Arrangements anp(5, 3)

cnp(n, p)

Combinations cnp(5, 3)

max(n1, n2, ...)

Maximum max(1, 5, 3) = 5

min(n1, n2, ...)

Minimum min(1, 5, 3) = 1

avg(n1, n2, ...)

Average avg(1, 2, 3) = 2

sigma(var)

Cumulative sum in loop Sum of values

Trigonometric Functions

Function Description

sin(n)

Sine (radians)

cos(n)

Cosine (radians)

tan(n)

Tangent (radians)

asin(n)

Arc sine

acos(n)

Arc cosine

atan(n)

Arc tangent

atan2(y, x)

Arc tangent with quadrant

sinh(n)

Hyperbolic sine

cosh(n)

Hyperbolic cosine

tanh(n)

Hyperbolic tangent

asinh(n)

Hyperbolic arc sine

acosh(n)

Hyperbolic arc cosine

atanh(n)

Hyperbolic arc tangent

String Functions

Function Description Example

len(s)

Length len("Hello") = 5

left$(s, n)

Left n characters left$("Hello", 2) = "He"

right$(s, n)

Right n characters right$("Hello", 2) = "lo"

mid$(s, start, len)

Substring mid$("Hello", 2, 3) = "ell"

seg$(s, start, end)

Segment seg$("Hello", 2, 4) = "ell"

instr(start, s1, s2)

Find position instr(1, "Hello", "ll") = 3

toupper(s)

Uppercase toupper("hello") = "HELLO"

tolower(s)

Lowercase tolower("HELLO") = "hello"

vireblc(s)

Remove spaces vireblc(" hi ") = "hi"

space$(n)

n spaces space$(3) = " "

string$(n, c)

n times character string$(3, "A") = "AAA"

chr$(n)

ASCII character chr$(65) = "A"

ascii(s)

ASCII code ascii("A") = 65

val(s)

String to number val("123") = 123

num$(n)

Number to string num$(123) = "123"

format$(fmt, val)

Format value format$("K:999", 123)

ctrans(s)

7-bit conversion Accented characters

Date Functions

Function Description Example

date$

Current date "20240115"

[S]datesyst

System date current date

time$

Current time "143025"

day(date)

Day (ordinal) day(date$)

dayn(date)

Day of week (1-7) dayn(date$)

month(date)

Month month(date$)

year(date)

Year year(date$)

week(date)

Week number week(date$)

addmonth(d, n)

Add n months addmonth(date$, 3)

eomonth(d)

End of month eomonth(date$)

gdat$(d, m, y)

Create date gdat$(15, 1, 2024)

nday$(n)

Day name nday$(1) = "Monday"

month$(n)

Month name month$(1) = "January"

nday(date)

Day number Day of year

aday$(n)

Abbreviated day name

amonth$(n)

Abbreviated month name

Table/File Functions

Function Description

filinfo(file, type)

Information about a file

filelev(class)

Locality level

nbrecord(class)

Number of records

nbind(class)

Number of indexes

filename(class)

Access path

clalev(class)

Class used or not

clanam(class)

Class name

clanbs(class)

Number of defined symbols

clasiz(class)

Number of allocated symbols

clavar(class, index)

Variable names in a class

adxseek(file)

Position in sequential file

Mask Functions

Function Description

inpmode()

Mode used in field input

varinit(mask, field)

Mask variable initialized or not

masklev(mask)

Locality level

masknam(mask)

Mask name

maskabr(mask)

Mask abbreviation

masknbf(mask)

Number of linked files

masksiz(mask)

Mask size

maskcou(mask)

Mask color

Miscellaneous Functions

Function Description

evalue(expression)

Formula evaluation

parse(expression)

Syntax analysis

find(value, list)

Search in list

messname

Message files

getenv$("variable")

Environment variable

Interruptions

SLEEP

Sleep 5 # Pause for 5 seconds

INTER / NOINTER

Interruptible mode

Inter

Non-interruptible mode

Nointer

ONINTGO

Onintgo LABEL

... code ...

LABEL: # Interruption handling Resume

Events

ONEVENT

Onevent EVENT_NAME From MASK # Event handling Endevent

ONKEY

Onkey BACKGROUND, "F1", "Help" # Action on F1 key Endevent

Reports

Report MY_REPORT [RPT] # Report configuration End

Classes and Dynamic Variables

Class Manipulation

Check if a class is loaded

If clalev([MTB]) <> 0 # The class is used Endif

Get class name

Local Char NAME(20) NAME = clanam([MTB])

Number of variables in a class

Local Integer NB NB = clanbs([MTB])

🏗️ Advanced Reminders & Naming Conventions

  • Actions vs Subprograms: Use Actions (ACT_ ) to plug into standard dictionary UI events. Use Subprograms (ADC_ ) for background processing.

  • Entry Points (AOE_ ): Use standard entry points to inject custom behavior into standard X3 code without modifying the core files.

  • Reports (ARP_ ): Pertain to Crystal Reports connectivity and printing subprograms.

  • Transactions: Avoid nested Trbegin blocks. Always ensure that every Trbegin is matched with a Commit or Rollback .

  • UI Context: Direct database updates should not be performed mid-UI event (like field control) unless strictly necessary, to prevent locking issues.

Best Practices

Naming Conventions

  • Use explicit variable names

  • Prefix variables by their type: i for Integer, s for String, etc.

  • Use consistent abbreviations for table cursors

  • Limit names to 15 characters for compatibility

Code Organization

  • Place all declarations (File , Local , Global ) at the beginning

  • Group subprograms by functionality

  • Use comments extensively

  • Include error handling for all database operations

Performance

  • Limit the number of open tables

  • Use appropriate indexes for reads

  • Close files when no longer needed

  • Use transactions for batch operations

  • Prefer For over Read

  • While for table traversal
  • Avoid reopening already open files

Error Handling

Onerrgo ERROR_HANDLER

Risky operations

Read [MTB]KEY = VALUE If fstat = 0 # Success Else # Failure - fstat contains the code Endif

ERROR_HANDLER: Infbox "Error: " + errmes$(errn) Resume

Transaction Safety

Trbegin [MTB]

Operations

[MTB]FIELD = VALUE Write [MTB]

If EVERYTHING_OK Commit Else Rollback Endif

Common Patterns

CRUD Operations

CREATE - Creation

[CLI]CODECLI = "C001" [CLI]NAMCLI = "SMITH" Write [CLI]

READ - Reading

Read [CLI]CODECLI = "C001"

UPDATE - Modification

Readlock [CLI]CODECLI = "C001" If fstat = 0 [CLI]NAMCLI = "JONES" Rewrite [CLI] Endif

DELETE - Deletion

Readlock [CLI]CODECLI = "C001" If fstat = 0 Delete [CLI] Endif

Batch Processing

Trbegin [COM]

For [COM]NUMCOM Where STATUS = 1 With Lock [COM]STATUS = 2 Rewrite [COM] Next

Commit

Data Validation

Input validation

If [M]FIELD = "" Errbox "Field is mandatory" GERR FIELD # Return to field Endif

Search with Default Value

Read [PAR]CODE = "MY_PARAM" If fstat <> 0 # Parameter not found, use default value VALUE = DEFAULT_VALUE Else VALUE = [F:PAR]VALUE Endif

Null and Empty String Handling

If null([CLI]EMAIL) Or vireblc([CLI]EMAIL) = "" # No email Endif

STATUS Values

The status variable returns the result of an input operation:

Value Global Variable Description

0

No input (display)

1

Normal validation

2

Escape key / Cancellation

3

Input interrupted

7+

Specific actions depending on context

FSTAT Values

The fstat variable returns the status of file operations:

Value Description

0 Success

1 End of file reached

2 Record not found

3 Record locked

4+ Other errors

Instructions Limited or Prohibited in Web Mode

Certain instructions are limited or prohibited in Web mode:

  • Openi

  • Open for reading

  • Openo

  • Open for writing

  • Openio

  • Open for read/write

  • Rdseq

  • Sequential read

  • Wrseq

  • Sequential write

  • Getseq

  • Sequential read (limited)

  • Putseq

  • Sequential write (limited)

  • Specific interactive dialog instructions

Instructions Encapsulated by Supervisor

These instructions are rarely used directly as they are managed by the supervisor:

  • Enable

  • Button ungraying

  • Disable

  • Button graying

  • Addmen

  • Add a menu

  • Setmok

  • Mask validation

OBJet Actions (Standard Event Handlers)

Overview

OBJet Actions are entry points in the Sage X3 supervisor that allow developers to inject custom code at specific moments during the lifecycle of an object (OBJet). These actions are defined in the Dictionary and call specific subprograms in the associated processing code.

Action Types and Naming Conventions

Prefix Type Description

ACT_

Standard Action Main actions triggered by user operations

AOE_

Entry Point Standard entry points for injecting custom behavior

ADC_

Subprogram Background processing subprograms

ARP_

Report Crystal Reports related subprograms

OBJet Types

Type Description

Simple Single record management

Table (Tableau) Detail lines management

Combined (Combiné) Header + Lines management

Creation Actions

Actions executed during the creation process:

Action Transaction Description

RAZCRE

No When creating a new record (screen reset)

VERIF_CRE

No Before creation transaction begins - can cancel by setting OK = 0

DEBUT_CRE

Yes At beginning of creation transaction (combined OBJet only)

INICRE

Yes During creation, just before Write

CREATION

Yes During creation transaction, after successful Write

APRES_CRE

No After creation (transaction completed)

AB_CREATION

No On creation abort due to error (after Rollback)

Example - Creation Action:

$ACTION Case ACTION When "CREATION" # Additional updates after record creation [LNK]CODREF = [F:HDR]CODHDR Write [LNK] If fstat <> 0 GOK = 0 # Cancel transaction Endif Endcase Return

Modification Actions

Actions executed during the modification process:

Action Transaction Description

LIENS

No After reading a record

STYLE

No After reading and displaying a record

AVANT_MOD

No When switching to edit mode (after field modification)

GRISE

No When key fields are grayed out (after entering modification)

VERIF_MOD

No Before modification transaction - can cancel by setting OK = 0

AVANT_MODFIC

Yes During modification (transaction start)

DEBUT_MOD

Yes At beginning of modification transaction (combined OBJet only)

INIMOD

Yes During modification, just before Rewrite

MODIF

Yes During modification transaction, after successful Rewrite

APRES_MOD

No After modification (transaction completed)

APRES_MODIF

No After any field modification

AB_MODIF

No On modification abort due to error (after Rollback)

Example - Modification Action:

$ACTION Case ACTION When "VERIF_MOD" # Validation before modification If [M]AMOUNT < 0 OK = 0 # Cancel modification Errbox "Amount must be positive" Endif When "MODIF" # Update related records after modification [LNK]CODHDR = [F:HDR]CODHDR Rewrite [LNK] Endcase Return

Deletion/Annulment Actions

Actions executed during the deletion process:

Action Transaction Description

AV_VERF_ANU

No Before annulment (before dictionary link controls)

AP_VERF_ANU

No Before annulment (after dictionary link controls)

VERF_ANU

No Before deletion transaction - can cancel by setting OK = 0

AV_ANNULE

Yes At beginning of annulment transaction

ANNULE

Yes During annulment transaction, before Delete

APRES_ANNULE

No After annulment (transaction completed)

AP_ANNULE

No After annulment of record

Example - Deletion Action:

$ACTION Case ACTION When "VERF_ANU" # Check if deletion is allowed If [F:HDR]STATUS = 2 OK = 0 Errbox "Cannot delete validated record" Endif When "ANNULE" # Delete related records For [LNK]CODHDR = [F:HDR]CODHDR Delete [LNK] Next Endcase Return

Code Change Actions

Actions executed during code change operations:

Action Transaction Description

AVANT_CHG

No Before code change (can cancel)

AP_CHANGE

No After code change completed

VERF_CHG

No Before code change transaction

CHANGE

Yes During code change transaction

Locking/Unlocking Actions

Action Transaction Description

AVANT_VERROU

No Before locking a record

VERROU

No When a record is locked (for modification or deletion)

AVANT_DEVERROU

No Before unlocking a record

DEVERROU

No When a record is unlocked (modification completed)

Opening/Closing Actions

Action Transaction Description

AVANT_OUVRE

No First action executed

OUVRE

No After opening tables and screens

OUVRE_BOITE

No Before opening the window

BOITE

No Before opening window with tabs and left lists

AFFMASK

No At first screen display

EFFMASK

No When clearing mask (creation abort, etc.)

TITRE

No Before opening the window

FERME

No Last action executed

FIN

No After "FIN" button, before unlocking record

Left List Actions

Action Transaction Description

TIROIR

No Before displaying any left list

HINT

No Before left list display (except last read) to indicate traversal key

CLE_GAUCHE

No Before left list display to modify sort key characteristics

FILGAUCHE

No To filter records in left list (except last read)

AP_FILGAUCHE

No During display of different left list

GAUCHE

No When selecting a simple or hierarchical left list element

GAUCHE9

No When selecting from last read left list

PRE_GAUCHE

No Previous page when paging on left list

SUI_GAUCHE

No Next page when paging on left list

REMP_DERLU

No Before displaying last read list

Button Actions (Standard Buttons)

For each standard button, there are before and after actions:

Button Before Action After Action

Finish AVANT_END

END

Save AVANT_ENR

ENR

Create AVANT_CRE

CRE

Delete AVANT_SUP

SUP

Abandon AVANT_ABA

ABA

OK AVANT_OK

OK

New AVANT_NEW

NEW

First AVANT_FIR

FIR

Last AVANT_LAS

LAS

Previous AVANT_PRE

PRE

Next AVANT_SUI

SUI

Selection AVANT_SEL

SEL

Change Code AVANT_CHG

CHG

Print AVANT_EDI

EDI

List AVANT_LIS

LIS

Attachments AVANT_JOI

JOI

Comments AVANT_COM

COM

Properties AVANT_PRO

PRO

Note: For custom buttons (XXX), actions are AVANT_XXX and XXX .

Example - Button Action:

$ACTION Case ACTION When "AVANT_CRE" # Validation before creation button If [M]TYPE = "" OK = 0 Errbox "Type is mandatory" Endif When "CRE" # After creation button (if STD or SPE action not specified) Infbox "Record created" Fin = 0 # Stay on window Endcase Return

Printing Actions

Action Transaction Description

IMPRIME

No Before Crystal Report print (for GEODE)

AV_IMPRIME

No Before Crystal Report document print

AP_IMPRIME

No After Crystal Report document print

AV_LISTE

No Before Crystal Report list print

AP_LISTE

No After Crystal Report list print

Menu/Action Execution Actions

Action Transaction Description

AVANT_ACT

No Before executing a predefined button

EXEACT

No After predefined button execution, before supervisor processing

AVANTBOUT

No Before executing a button or menu defined in window

EXEBOUT

No After executing a button defined in window

AVANT_CHOI

No After button/menu/left list selection

APRES_CHOI

No After button/menu/left list selection

FIN_ACTION

No After button/menu/left list execution

STATUT

No After executing a menu defined in window

Picking Actions

Action Transaction Description

DEB_PICK

No When selecting an element in picking list

PICKE

No After selecting an element in picking list

DEPICK

No After deselecting an element in picking list

FIN_PICK

No End of picking selection process

Browser Actions

Action Transaction Description

LECTURE

No During browser record reading

SET_DERLU

No To set last read list

REMP_DERLU

No Before displaying last read list

Detail Table Actions (Tableau)

For OBJet with detail lines:

Action Transaction Description

LIENS0

No Before reading a group of records

LIENS

No After reading a record

LIENS2

No After reading a group of records

INICRE_LIG

Yes During line creation, before Write

INIMOD_LIG

Yes During line modification, before Rewrite

DEFLIG

No When deleting a line

EXCLIG

No When excluding a line

VALLIG

No When validating a line

FIN_TABLE

No After table processing

Initialization Actions

Action Transaction Description

DEFTRANS

No Beginning of OBJet window analysis

SETTRANS

No End of OBJet window analysis

VARIANTE

No OBJet window analysis (for each window)

INIT

No Initialization

INIT_DIA

No Dialog initialization

INIPAR

No Parameter initialization

INIPAR2

No Additional parameter initialization

EXCINI

No Parameter exclusion

Filter/Search Actions

Action Transaction Description

FILTRE

No Define criteria for filter on main table

FILTRE_CNS

No Filter for consultation

FILTRE_HIS

No Filter for history

Environment Actions

Action Transaction Description

DROIT

No Before mask population from main table

ENV

No On environment change (GEODE & LOAN)

ENV_FEN

No On window environment change

Icon Actions

Action Transaction Description

ICONE

No On double-click on icon at bottom right of screen

Variables Used in Actions

Variable Description

ACTION

Current action name

OK

Set to 0 to cancel the action

GOK

Global OK for transaction control

Fin

0 = stay on window, 1 = exit window

status

Input status return

fstat

File operation status

[M]

Mask class for current window

[F:ABR]

Main table class

Transaction and OK Variable

Important Rules:

  • Actions with "Transaction: No" cannot perform database Write/Rewrite/Delete operations

  • Setting OK = 0 in VERIF_* actions cancels the operation

  • Setting GOK = 0 during transaction cancels the entire transaction

Example - Action Template:

$ACTION Case ACTION When "OUVRE" # Initialization on object opening GSTATUT = 0

When "VERIF_CRE"
    # Validation before creation
    If [M]CHAMP = ""
        OK = 0
        Errbox "Field is mandatory"
    Endif
    
When "CREATION"
    # During creation transaction
    [L:LNK]CODREF = [F:HDR]CODHDR
    Call LNK_CREATE([L:LNK])
    
When "APRES_CRE"
    # After creation completed
    Infbox "Record created: " + [F:HDR]CODHDR
    
When "FERME"
    # Cleanup on object closing
    Close

Endcase Return

Standard Processing Subprogram Structure

Subprog OBJET_MAIN

Standard OBJet processing subprogram

Declarations

Local Char ACTION(20)

Main action handler

$ACTION Case ACTION When "OUVRE" Gosub OUVRE When "FERME" Gosub FERME When "CREATION" Gosub CREATION When "MODIF" Gosub MODIF When "ANNULE" Gosub ANNULE When Default # Handle other actions Endcase Return

Opening

$OUVRE # Initialization code Return

Closing

$FERME # Cleanup code Return

Creation

$CREATION # Creation transaction code Return

Modification

$MODIF # Modification transaction code Return

Deletion

$ANNULE # Deletion transaction code Return End

Field Actions (Screen Field Events)

Overview

Field actions are entry points defined at the screen field level in the dictionary. They allow custom code to be executed at specific moments during field interaction (display, input, validation, etc.). These actions are defined in the Screen dictionary under each field's properties.

Field Action Types

Action Trigger Usage

AVANT_ZONE

Before any input or display Define field format, initialize display properties

INIT_BOUTON

On context menu initialization Define context menu button labels

INIT

On field initialization Initialize field value

AVANT_SAISIE

Before each input Set mkstat, prevent input, control field state

CONTROLE

After input, before validation Test field validity

APRES_ZONE

After valid control Affect or display other fields, trigger calculations

APRES_MODIF

After field modification Same as APRES_ZONE but only if field was modified

SELECTION

F12 key press Open selection list, zoom, lookup

BOUTON_1

F9 key press Tunnel navigation (reserved)

BOUTON_2 to BOUTON_20

F4 key press (context menu) Custom context menu actions

AVANT_LIGNE

On line entry (scrolling tables) Actions when entering line modification

APRES_LIGNE

After line input (scrolling tables only) Actions after each line is entered

CLIC

On icon click (icon fields only) Trigger action when clicking an icon

AVANT_ZONE (Before Field)

Executed before any input or display of the field.

Usage:

  • Define field format

  • Set field properties dynamically

  • Control field visibility or state

Example:

$ACTION Case ACTION When "AVANT_ZONE" # Set date format based on context If [M]TYPE = "INT" [M]DATE格式 = "DD/MM/YYYY" Else [M]DATE格式 = "MM/DD/YYYY" Endif Endcase Return

INIT_BOUTON (Initialize Button)

Allows defining context menu button labels dynamically.

Usage:

  • Set dynamic button labels based on context

  • Enable/disable context menu options

Example:

$ACTION Case ACTION When "INIT_BOUTON" # Define context menu labels MKBOUT(1) = "Add Line" MKBOUT(2) = "Delete Line" MKBOUT(3) = "Copy Line" Endcase Return

INIT (Initialize Field)

Executed to initialize a field value.

Usage:

  • Set default field values

  • Initialize calculated fields

  • Set initial field state

Example:

$ACTION Case ACTION When "INIT" # Initialize with current date [M]DATECRE = date$ [M]STATUS = 1 Endcase Return

AVANT_SAISIE (Before Input)

Executed before each field input. The mkstat variable controls input behavior.

mkstat Values:

Value Behavior

0 Normal input

1 Display only (no input)

2 Skip field

Usage:

  • Prevent input based on conditions

  • Set field to display-only mode

  • Skip field automatically

Example:

$ACTION Case ACTION When "AVANT_SAISIE" # Prevent modification if record is validated If [F:HDR]STATUS = 2 mkstat = 1 # Display only Endif

    # Skip field if type requires it
    If [M]TYPE = "SIMPLE"
        mkstat = 2  # Skip field
    Endif

Endcase Return

CONTROLE (Control/Validation)

Executed after input to test field validity. Setting OK = 0 cancels and returns to the field.

Usage:

  • Validate field format

  • Check business rules

  • Perform lookups and cross-validation

  • Display error messages

Example:

$ACTION Case ACTION When "CONTROLE" # Validate customer code exists If [M]CODCLI <> "" Read [CLI]CODCLI = [M]CODCLI If fstat <> 0 OK = 0 Errbox "Customer code not found: " + [M]CODCLI GERR CODCLI # Return to field Endif Endif

    # Validate amount is positive
    If [M]AMOUNT &#x3C;= 0
        OK = 0
        Errbox "Amount must be positive"
        GERR AMOUNT
    Endif

Endcase Return

APRES_ZONE (After Field)

Executed after the control if validation passed.

Usage:

  • Update related fields

  • Perform calculations

  • Display dependent information

  • Trigger cascading updates

Example:

$ACTION Case ACTION When "APRES_ZONE" # When customer changes, update name and address If [M]CODCLI <> "" Read [CLI]CODCLI = [M]CODCLI If fstat = 0 [M]NOMCLI = [F:CLI]NOMCLI [M]ADRCLI = [F:CLI]ADRCLI [M]VILCLI = [F:CLI]VILCLI Endif Endif Endcase Return

APRES_MODIF (After Modification)

Same as APRES_ZONE but triggered only if the field was actually modified.

Usage:

  • React only to actual changes

  • Avoid unnecessary recalculation

  • Track modification history

  • Update totals only when needed

Example:

$ACTION Case ACTION When "APRES_MODIF" # Recalculate total only if quantity changed [M]TOTLIN = [M]QTY * [M]PRICE

    # Apply discount if applicable
    If [M]DISCOUNT > 0
        [M]TOTLIN = [M]TOTLIN * (1 - [M]DISCOUNT / 100)
    Endif

Endcase Return

SELECTION (F12 Key)

Triggered by the F12 key. Used for zoom/lookup functionality.

Usage:

  • Open selection window

  • Display lookup list

  • Navigate to related object

  • Perform search

Example:

$ACTION Case ACTION When "SELECTION" # Open customer selection Local Char SELCLI(20) Call CHOIX_CLI(SELCLI) From TABCUST If SELCLI <> "" [M]CODCLI = SELCLI # Trigger field update Affzo [M]CODCLI Endif

    # Alternative: use standard lookup
    # Call ZONE([M]CODCLI, "CLI", "CODCLI")

Endcase Return

BOUTON_1 (F9 Key - Tunnel)

Reserved for tunnel navigation. F9 key triggers this action.

Usage:

  • Navigate to detail/related screens

  • Open transaction tunnel

  • Drill-down functionality

Example:

$ACTION Case ACTION When "BOUTON_1" # Tunnel to customer detail If [M]CODCLI <> "" Call ZONE([M]CODCLI, "BPCUSTOMER", "", "CODCLI") Endif Endcase Return

BOUTON_2 to BOUTON_20 (Context Menu)

F4 key displays context menu with these options. BOUTON_2 through BOUTON_20 are available.

Usage:

  • Custom actions via context menu

  • Quick access to related functions

  • Field-specific operations

Example:

$ACTION Case ACTION When "INIT_BOUTON" # Define context menu labels MKBOUT(2) = "Calculate Total" MKBOUT(3) = "Apply Template" MKBOUT(4) = "Clear Line"

When "BOUTON_2"
    # Calculate total action
    [M]TOTLIN = [M]QTY * [M]PRICE
    Affzo [M]TOTLIN
    
When "BOUTON_3"
    # Apply template action
    Call APPLIQUE_MODELE([M])
    
When "BOUTON_4"
    # Clear line action
    [M]QTY = 0
    [M]PRICE = 0
    [M]TOTLIN = 0
    Effzo [M]QTY, [M]PRICE, [M]TOTLIN

Endcase Return

AVANT_LIGNE (Before Line - Scrolling Tables Only)

Executed when entering modification of a line in a scrolling table.

Usage:

  • Initialize line-specific variables

  • Store current line state

  • Prepare for line modification

  • Set line-specific controls

Example:

$ACTION Case ACTION When "AVANT_LIGNE" # Store original quantity for comparison S_QTY_ORIG = [M]QTY

    # Set line-specific properties
    If [M]LINSTA = "CLOSED"
        mkstat = 1  # Display only
    Endif

Endcase Return

APRES_LIGNE (After Line - Scrolling Tables Only)

Executed after each line input in a scrolling table.

Usage:

  • Update line totals

  • Validate line data

  • Update header totals from lines

  • Calculate derived values

Example:

$ACTION Case ACTION When "APRES_LIGNE" # Calculate line total [M]TOTLIN = [M]QTY * [M]PRICE

    # Update header total from all lines
    Call CALC_TOTAL([M]TOTHEAD)
    
    # Calculate difference if modified
    If S_QTY_ORIG &#x3C;> [M]QTY
        [M]QTYDIFF = [M]QTY - S_QTY_ORIG
    Endif

Endcase Return

CLIC (Click - Icon Fields Only)

Triggered when clicking on an icon field.

Usage:

  • Open URL or document

  • Display popup or dialog

  • Toggle icon state

  • Execute custom action

Example:

$ACTION Case ACTION When "CLIC" # Open document link If [M]DOCLINK <> "" Call OPEN_DOCUMENT([M]DOCLINK) Else Infbox "No document attached" Endif Endcase Return

Field Action Flow

The following diagram shows the order of field action execution:

  1. AVANT_ZONE (Before field display/input) ↓
  2. AVANT_SAISIE (Before input - can skip or set display-only) ↓
  3. [User Input] ↓
  4. CONTROLE (Validation - can reject with OK=0) ↓
  5. APRES_ZONE (After valid input - always runs) ↓
  6. APRES_MODIF (After valid input - only if modified)

Variables Used in Field Actions

Variable Description

mkstat

Field input mode (0=normal, 1=display, 2=skip)

OK

Set to 0 to reject input and return to field

ACTION

Current action name

zonmod

Indicates if field was modified (1=modified)

nolign

Current line number in scrolling table

nblig

Total number of lines in scrolling table

GERR

Return to specific field on error

Affzo

Display/refresh field

Effzo

Clear field

Grizo

Gray out field (display only)

Dezo

Enable field for input

Complete Field Action Example

$ACTION Case ACTION # Initialize field with default value When "INIT" If [M]QTY = 0 [M]QTY = 1 Endif

# Control input mode based on status
When "AVANT_SAISIE"
    If [F:HDR]STATUS = 2
        mkstat = 1  # Display only for validated records
    Endif
    
# Validate the field
When "CONTROLE"
    # Check product exists
    If [M]ITMREF &#x3C;> ""
        Read [ITM]ITMREF = [M]ITMREF
        If fstat &#x3C;> 0
            OK = 0
            Errbox "Product not found"
            GERR ITMREF
        Endif
    Endif
    
# Update related fields after valid input
When "APRES_ZONE"
    # Always update description
    If [M]ITMREF &#x3C;> ""
        [M]ITMDES = [F:ITM]ITMDES
        [M]PRICE = [F:ITM]PRICE
    Endif
    
# Calculate only if quantity actually changed
When "APRES_MODIF"
    [M]TOTLIN = [M]QTY * [M]PRICE
    
# F12 - Selection list
When "SELECTION"
    Call SELECT_PRODUCT([M]ITMREF) From TABITEM
    
# Context menu button
When "BOUTON_2"
    Call SHOW_PRODUCT_INFO([M]ITMREF)
    

Endcase Return

Scrolling Table Line Actions Example

$ACTION Case ACTION # Before entering line modification When "AVANT_LIGNE" # Store original values S_QTY_ORIG = [M]QTY S_PRICE_ORIG = [M]PRICE

# After line input
When "APRES_LIGNE"
    # Calculate line total
    [M]TOTLIN = [M]QTY * [M]PRICE
    
    # If quantity changed, check stock
    If S_QTY_ORIG &#x3C;> [M]QTY
        Call CHECK_STOCK([M]ITMREF, [M]QTY)
    Endif
    
    # Update header total
    Gosub CALC_HEADER_TOTAL

Endcase Return

$CALC_HEADER_TOTAL Local Decimal TOTAL(12,2) TOTAL = 0 For I = 1 To nblig TOTAL += [M]TOTLIN(I) Next I [M:HDR]TOTAL = TOTAL Return

Keyword Reference

Declaration Keywords

  • Char , Date , Decimal , Double , Integer , Shortint , Schar , Uuint , Uuid , Blbfile , Clbfile

  • Dim , Local , Global , Const , Value , Variable

  • File , Mask , Report

Control Keywords

  • If , Then , Elsif , Else , Endif

  • Case , When , Default , Endcase

  • For , To , Step , Next , Break

  • While , Wend , Endwhile

  • Repeat , Until

Function/Subprogram Keywords

  • Subprog , Funprog , Func , End , Return

  • Call , Gosub

Database Keywords

  • Read , Readlock , Write , Rewrite , Delete , Look

  • Trbegin , Commit , Rollback

  • Sql , Execsql , Anasql

  • Lock , Unlock

Error Handling Keywords

  • Onerrgo , Resume

File Keywords

  • Openi , Openo , Openio , Close

  • Getseq , Putseq , Seek

UI Keywords

  • Affzo , Effzo , Envzo , Grizo , Enable , Disable

  • Infbox , Errbox , Askui , Choose

  • Fillbox , Setlbox , Leftbox

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

Planning with files

Implements Manus-style file-based planning to organize and track progress on complex tasks. Creates task_plan.md, findings.md, and progress.md. Use when aske...

Registry SourceRecently Updated
8.4K22Profile unavailable
Coding

Nutrient Document Processing (Universal Agent Skill)

Universal (non-OpenClaw) Nutrient DWS document-processing skill for Agent Skills-compatible products. Best for Claude Code, Codex CLI, Gemini CLI, Cursor, Wi...

Registry SourceRecently Updated
2740Profile unavailable
Coding

vercel-react-best-practices

React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.

Repository Source
214.5K23Kvercel
Coding

svelte5-best-practices

No summary provided by upstream source.

Repository SourceNeeds Review