Master/detail pattern management
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!