Sage X3 allow to create the management of a new object practically with only parameterization.
But if tou need to achieve an object with master/detail pattern you must follow a very precise procedure that requires some changes in the specific script.
Suppose we have:
- header table: YHEAD [YHE]
- YHEAD table keys (that will be the binding with detail table too):
- YHEKEY1 alphanumeric
- YHEKEY2 numeric
- detail table: YDETAIL [YDE]
- YDETAIL detail table fields for binding with header table:
- YDEKEY1 alphanumeric
- YDEKEY2 numeric
- object linked to YHEAD table: YHD
- header screen: YHE1
- detail lines screen: YDE1
Let’s proceed like this:
Object
Open the YTD object (GESAOB function) link to YHEAD header table.
In the Environment tab insert YDETAIL detail table.
YDETAIL detail table
In the detail table you must declare the following fields:
- <line key> with type L and size 8
the name can be of your choice, in this example will be YIDLINE - NBLIG with type ABS
Detail screen YDE1
In the detail lines screen you must declare the folllowing fields:
- UPDFLG with type C, size 4, hidden (it’s a update flag used by system)
- CREFLG with type C, size 4, hidden (it’s a creation flag used by system)
- <key line> with type L, size 8, hidden (the system will insert here values multiple of 1000)
it must match the field declared into detail table: therefore in this example it will be YIDLINE - NBLIG: it must be put in the column Parameter of corresponding block (General tab) of YDE1 screen (the detail lines screen)
- NBLIG field actions to setting:
- C DIVLINCONT (line insertion cheking)
- After_line DIVLINNUM (number line assignment)
these actions have a common LIG parameter LIG that must be valorized with <line key>, in yhis example YIDLINE(nolign-1)
Attention: in the detail screen the header keys they must not be inserted, otherwise in the record they will not be valorized.
Specific Code
In the specific script SPEYXX must be reported the following code:
####################################################################
# SAGEDEV.IT
# Code for master/detail pattern management
####################################################################
$ACTION
Case ACTION
When "OUVRE" : Gosub OUVRE
When "FILTRE" : Gosub FILTRE
When "SETBOUT" : Gosub SETBOUT
When "CREATION" : Gosub CREATION
When "APRES_CRE" : Gosub APRES_CRE
When "LIENS" : Gosub LIENS
When "MODIF" : Gosub MODIF
When "APRES_MOD" : Gosub APRES_MOD
When "ANNULE" : Gosub ANNULE
When "DEFLIG" : Gosub DEFLIG
When "INICRE_LIG" : Gosub INI_LIG
When "INIMOD_LIG" : Gosub INI_LIG
When Default
Endcase
Return
####################################################################
$OUVRE
Gosub DECLARE From TABLEAUX
Return
####################################################################
$FILTRE
Default File [YHE] # Header table abbreviation
Return
####################################################################
$SETBOUT
If GREP = ""
CHAINE+="A"
Else
Call VIREBOUT(CHAINE,"A") From GOBJET
Endif
Return
####################################################################
$CREATION
Gosub CREATION From TABLEAUX
If GOK < 1 Return Endif
Return
####################################################################
$APRES_CRE
# Reload of indicators UPDFLG and CREFLG
Gosub LIENS From TABLEAUX
Return
####################################################################
$LIENS
# lines table loading
Gosub LIENS From TABLEAUX
#at this point all LIENS_LIG events are elaborated yet
Return
####################################################################
$LIENS_LIG
# event that trigger at loading of every line
# let's insert here eventual call on fields
#Call AM_YCAMPO1([M:YDE1]YCAMPO1(nolign-1))
Return
####################################################################
$MODIF
Gosub MODIF From TABLEAUX
If GOK < 1 Return Endif
Return
####################################################################
$APRES_MOD
# Reload of indicators UPDFLG and CREFLG
Gosub LIENS From TABLEAUX
Return
###############################################################
$ANNULE
Gosub ANNULE From TABLEAUX : # Erasing of lines
If GOK < 1 Return Endif
Return
###############################################################
$DEFLIG
# Definition of the various detail elements
Default Mask [YDE1] # Detail screen abbreviation
Default File [YDE] # Detail table abbreviation
FICLIG = "YDETAIL" # Detail table name
ABLIG = "YDE" # Detail table name abbreviation
ZONLIG = "YIDLINE" # field name of number line (key)
# CRIT variable must contain the criteria to bind detail table with header table
# with this format (attention to apexes, with numbers they do not serve):
#
# detail table field name = [M:header screen]header field name
#
# with an alphanumeric field, apexes must be used,in our example like this:
# "YDEKEY1 = '"+[M:YTE1]YHEKEY1+"'"
# if the field is numeric the single quotes are not present (using num$()), in our case:
# "YDEKEY2 = "+num$([M:YTE1]YHEKEY2)
# in case of dates: "' & YDATE1 = ["+num$([M:YHE1]YHEDATE1)+"] & YDATE2 = ["+[M:YHE1]YHEDATE2+"]"
CRIT = "YDEKEY1 = '"+[M:YHE1]YHEKEY1+"' & YDEKEY2 = "+num$([M:YHE1]YHEKEY2)
Return
####################################################################
$INI_LIG
# header values insertion: the header values are copied in the detail fields
# YDE detail table, YHE header table
# attention: here we are working on tables: [F] non [M]
[F:YDE]YDEKEY1 = [F:YHE]YHEKEY1
[F:YDE]YDEKEY2 = [F:YHE]YHEKEY2
Return
####################################################################
I remember that in a master/detail window using a header field as filter for records is not possible.
Good!
Once you’ve done this all is working!
Don’t forget the validation of tables, screens and window!