Gestione testata/dettaglio

Sage X3 permette di creare la gestione di un nuovo oggetto semplice praticamente con la sola parametrizzazione.

Ma se si ha la necessità di realizzare un oggetto con testata/dettaglio bisogna seguire una procedura  ben precisa che richiede anche alcune modifiche al codice specifico.

Supponiamo di avere:

  • tabella di testata: YTESTATA [YTE]
  • chiavi della tabella YTESTATA (che saranno anche il legame con la tabella di dettaglio):
    • YTECHIAVE1 alfanumerica
    • YTECHIAVE2  numerica
  • tabella di dettaglio: YDETTAGLIO [YDE]
  • campi della tabella YDETTAGLIO che legano alla tabella di testata:
    • YDECHIAVE1 alfanumerica
    • YDECHIAVE2 numerica
  • oggetto legato alla tabella YTESTATA: YTD
  • videata di testata: YTE1
  • videata delle righe di dettaglio: YDE1

 

Procediamo così:

Oggetto

Andare all’oggetto YTD  (funzione GESAOB) legato alla tabella di testata YTESTATA.
Nel folder ambiente inserire la tabella di dettaglio YDETTAGLIO.

Tabella di dettaglio YDETTAGLIO

Nella tabella  di dettaglio bisogna dichiarare i seguenti campi:

  • <chiave di riga> di tipo L con dimensione 8
    il nome va scelto a piacere, nel nostro esempio sarà YIDRIGA
  • NBLIG di tipo ABS

Videata di dettaglio YDE1

Nella videata delle righe dettaglio bisogna dichiarare i seguenti campi:

  • UPDFLG di tipo C con dimensione 4, nascosto (flag di update usato dal sistema)
  • CREFLG di tipo C con dimensione 4, nascosto (flag di creazione usato dal sistema)
  • <chiave di riga> di tipo L con dimensione 8, nascosto (gli vengono attribuiti valori multipli di 1000 dal sistema)
    deve corrispondere al campo dichiarato nella tabella di dettaglio: quindi nel nostro esempio sarà YIDRIGA
  • NBLIG: va messo nella colonna Parametro nel blocco Riquadro della videata YDE1 (videata delle righe di dettaglio)
  • impostare come azioni del campo NBLIG:
    • C DIVLINCONT (controllo inserimento riga)
    • post_riga DIVLINNUM (attribuzione numero riga)
      queste azioni hanno un parametro LIG (in comune) che deve essere valorizzato con <chiave di riga>, nel nostro esempio YIDRIGA(nolign-1)

Attenzione: in videata di dettaglio non vanno inseriti i campi chiave di testata perchè altrimenti non verranno valorizzati nel record.

 

Codice Specifico

Nel codice specifico SPEYXX riportare il codice seguente:

####################################################################
# Codice base per la gestione testata dettaglio
####################################################################
$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 [YTE] #Abbreviazione tabella di Testata 
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 
# Ricarico degli indicatori UPDFLG e CREFLG 
Gosub LIENS From TABLEAUX 
Return
####################################################################
$LIENS
# Carico delle righe nella tabella
Gosub LIENS From TABLEAUX

#in questo punto tutti gli eventi LIENS_LIG sono stati elaborati
Return
####################################################################
$LIENS_LIG
        # evento al caricamento di ciascuna riga
	# eventuali chiamate su campi
	#Call AM_YCAMPO1([M:YDE1]YCAMPO1(nolign-1))
Return
####################################################################
$MODIF
Gosub MODIF From TABLEAUX
If GOK < 1  Return  Endif
Return
#################################################################### 
$APRES_MOD 
# Ricarico degli indicatori UPDFLG e CREFLG # 
Gosub LIENS From TABLEAUX 
Return 
###############################################################
$ANNULE
Gosub ANNULE From TABLEAUX : # Cancellazione delle righe
If GOK < 1  Return  Endif
Return
###############################################################
$DEFLIG
# Definizione dei vari elementi di dettaglio 
Default Mask [YDE1]   # Abbreviazione della videata di dettaglio
Default File [YDE]    # Abbreviazione della tabella di dettaglio
FICLIG = "YDETTAGLIO" # nome tabella di dettaglio 
ABLIG  = "YDE"        # abbreviazione nome tabella di dettaglio 
ZONLIG = "YIDRIGA"    # nome campo numero di riga (chiave) 

# la variabile CRIT deve contenere il criterio per legare la tabella di dettaglio alla tabella di testata 
# in questa forma (attenzione agli apici, con i numeri non servono): 
# nome campo tabella dettaglio = [M:videata testata]nome campo testata 
# se il campo è alfanumerico, vanno usati gli apici, nel nostro caso così:
# "YDECHIAVE1 = '"+[M:YTE1]YTECHIAVE1+"'"
# se il campo è numerico va senza singoli apici (usando num$()), nel nostro caso:
# "YDECHIAVE2 = "+num$([M:YTE1]YTECHIAVE2) 
# se ci fossero date: "' & YDATA1 = ["+num$([M:YTE1]YTEDATA1)+"] & YDATA2 = ["+[M:YTE1]YTEDATA2+"]"    
CRIT   = "YDECHIAVE1 = '"+[M:YTE1]YTECHIAVE1+"' & YDECHIAVE2 = "+num$([M:YTE1]YTECHIAVE2)

Return

####################################################################
$INI_LIG
    # Valorizzazione testata: vengono copiati i valori di testata sui campi di dettaglio
    # YDE tabella di dettaglio, YTE tabella di testata 
    # attenzione: qui si opera sulle tabelle: [F] non [M]
    [F:YDE]YDECHIAVE1 = [F:YTE]YTECHIAVE1
    [F:YDE]YDECHIAVE2 = [F:YTE]YTECHIAVE2 
Return
####################################################################

Ricordo che in una finestra di testata/dettaglio non è possibile utilizzare un campo di testata come filtro dei record.

Bene, riportato e compilato questo tutto è già funzionante;
non scordatevi ovviamente di validare tabelle, videate e finestra!

4 risposte

  1. Fabio ha detto:

    Ciao Francesco. l’articolo mi è stato molto utile.
    Unica domanda, perché mi sta dando un po’ di grattacapi.
    Nelle azioni C DIVLINCONT e post_riga DIVLINNUM il valore della variabile LIG indicato come YIDRIGA(nolign-1). restituisce errore di tipo.
    Ho pensato a inserirlo tra apici “YIDRIGA(nolign-1)” ma valorizza sempre 1000.

    • Admin ha detto:

      Ciao, scusami il ritardo
      Mi sa che c’è un errore: se guardi il campo NBLIG della videata SOH4, vedrai che il parametro LIG è inizializzato con “SOPLIN” tra doppi apici. Quindi nel nostro caso “YIDRIGA”.
      Fammi sapere se ti risolve il problema

      • Fabio ha detto:

        Ora funziona, grazie.
        Una domanda, la tabella di dettaglio mi sembra di capire che debba necessariamente avere una chiave tipo “campochiavetesta+riga”, se come nel mio caso dovessi impedire un dato valore di un campo riga venga inserito in più teste o più di una volta nella stessa testa, devo fare controlli da codice(?) non posso usare una chiave sul dettaglio priva del numero di riga. Giusto?

Lascia un commento

Scopri di più da SageDev

Abbonati ora per continuare a leggere e avere accesso all'archivio completo.

Continue reading