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!
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.
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
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?
Puoi sempre inserire un indice univoco a livello di tabella,
se ho ben capito la domanda