Ir al contenido principal

Master/detail pattern management

 

Fuente original: https://en.sagedev.it/sagex3/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 insertedotherwise 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!

Entradas populares de este blog

SAGE X3 SILENT IMPORT (IMPORTSIL) WITH ERROR CATCHING

FUENTE ORIGINAL: https://pluginx3.com/en/blog/post/sage-x3-silent-import-importsil-with-error-catching.html You already know how to manually generate a CSV file in order to import it threw a template in Sage X3. But If you wonder how to catch detailed errors after a silent import here is the solution. Sometimes you need to catch the incoming errors in order to alert the end-user regarding an issue. Closed period, wrong date etc …. Unfortunalty the standard Sage X3 silent import function doesn’t natively show the detailed errors during the import process. Call IMPORTSIL([M:IMP2]MODIMP,[M:IMP2]NOMIMP) From GIMPOBJ And the standard function ERR_IMPORT will only show the overall status of the importation and not the detailed errors. IMPORTSIL function is pushing all the log data into a tracefile in order to avoid any popup on end-user screen. So you have a log file available in order to search for errors in it. Sage X3 runtime is using the same principals standards as any shell for log...

Valores de fstat

Fstat fstat  is a numeric status that is returned upon execution of a database operation, a sequential file operation, or a lock instruction. Syntax fstat Examples # MYTABLE is a table with a key called KEY1, that has a unique component called KEYVAL # Create a record in the table MYTABLE with they key value 1 if it doesn't exist Local File MYTABLE [MYT] Read [MYT]KEY1=1 If fstat [MYT]KEYVAL=1 : Write [MYT] If fstat MSG="The key was created in the mean time" Else MSG="Key created" Endif Else MSG="Key already exists" Endif Details fstat  is always set to '0' if the operation is successfully completed, and has a non-null value if there is an error: In a sequential read ( Getseq  and  Rdseq ),  fstat  is set to '1' at the end of the file. On  Lock ,  fstat  is set to '1' if the lock could not be performed. For a database operation ( Read ,  Look ,  Readlock ,  For ,  Write ,  ...

How To Add a Custom Selector for the Screen Field

Fuente original del artículo:   https://www.rklesolutions.com/blog/how-to-add-a-custom-selector-for-the-screen-field January 5, 2022 By RKL Team Leave a Comment There may be times when you want to add a pop-up window to select a field for a screen. Sometimes this can be handled automatically if the field is a standard X3 object field (i.e. when selecting a product with a type of ITM from the ITMMASTER table). There may be other times where a standard look-up is not available, and some custom code is required to do the selection window. We'll show you how to add a custom selector of your choosing to the screen field. ADD SELECT ON SCREEN FIELD The first step is to add the appropriate code to the field on the screen in Sage X3: Go to  Development > Script Dictionary > Screens Select Your Screen Select the field to have the lookup for  by moving your cursor to it on the screen. The field should show with a blue background. Select a type of "Selection" , and an  ac...