Join di tabelle in Sage X3 adonix con l’istruzione link

L’istruzione che Sage X3 mette a disposizione per fare un join tra due tabelle è Link.

Questa istruzione è più performante che eseguire molte read consecutive, ed è quindi utile per ottimizzare le query.

Pertanto in caso di problemi di lentezza verifica che non si possa sostituire qualche ciclo contenente una o più istruzioni Read con un’istruzione Link.

Qui vediamo come collegare la tabella TAB1 con la tabella TAB2;
la prima tabella deve essere quella con maggiore dettaglio,
il collegamento si deve basare su un indice della tabella TAB2.

L’indice è KEY0, composto da 2 campi che in questo caso corrispondono ai campi CAMPO1TAB2 e CAMPO2TAB2 della TAB2:

Link [F:TAB1] With [F:TAB2]KEY0~=CAMPO1TAB2;CAMPO2TAB2 As [YJOI]
& Where [F:TAB1]CAMPO1=VALORE1 and [F:TAB1]CAMPO2=VALORE2
& Order By [F:TAB1]CAMPO1 Asc;[F:TAB1]CAMPO2 Asc

Attenzione: l’istruzione di join va scritta tutta su un’unica riga, o in alternativa bisogna usare il carattere & come visto qui.

La parola chiave che definisce il collegamento tra le due tabelle è With che corrisponde all'”ON” in una istruzione SQL:

SELECT * FROM TABA JOIN TABB JOIN ON TABA.CAMPOA = TABB.CAMPOB

Per esprimere una condizione in FULL JOIN bisogna usare l’operatore ~= (tilde uguale)
Per esprimere una condizione in LEFT JOIN si usa l’operatore = (uguale)

Prima di eseguire il join bisogna dichiarare/aprire le tabelle che si vogliono utilizzare,
ed è possibile dichiarare 2 volte la stessa tabella ovviamente con abbreviazioni diverse.

Supponiamo che la tabella di dettaglio sia TABDETTAGLIO e la tabella da unire in join sia TAB2:
questa la sintassi (come già detto va tutto sulla stessa riga, tra parentesi quadre le parti opzionali):

LINK TABDETTAGLIO
With CONDIZIONE_JOIN[,CONDIZIONE_JOIN]...[,CONDIZIONE_JOIN]
As [JOIN_NAME]
[Where CONDIZIONI_WHERE]
[Order By ESPRESSIONE_ORDER]

CONDIZIONE_JOIN

[TAB2]KEY_NAME ~= EXPRESSION_LIST                #usare = per la LEFT JOIN
[TAB2]KEY_NAME(INDEX_VALUE) ~= EXPRESSION_LIST   #usare = per la LEFT JOIN

Ci devono essere almeno una CONDIZIONE_JOIN e massimo 11.
Possono essere messe in JOIN fino a 12 tabelle.
KEY_NAME è il nome di un indice della tabella, per intenderci quelli definiti nell’apposita scheda “Indice” presente alla funzione GESATB.
Come si vede la condizione di join è vincolata all’uso di campi che appartengano ad almeno un indice della tabella,
non si può quindi impostare una join su campi a piacere.

JOIN_NAME
In pratica si dà un nome alla classe di join così creata, che potrà essere usata per esempio con una istruzione For:

For [JOIN_NAME]
...
Next

Poi vanno aggiunte le eventuali condizioni WHERE e l’eventuale ordinamento con ORDER BY.

Vediamone degli esempi.

Esempio di inner join

Proviamo a recuperare il codice fiscale dei clienti il cui codice iniza per ‘AAA’.
Il codice fiscale lo recuperiamo dal campo CRN della tabella dei terzi.
Non tutti i terzi sono clienti, quindi impostiamo una inner join in modo da ottenere solo i record che abbiano una corrispondenza nella tabella BPCUSTOMER.

If !clalev([F:BPR]) : Local File BPARTNER [BPR] : Endif
If !clalev([F:BPC]) : Local File BPCUSTOMER [BPC] : Endif  

Link [F:BPR] With [F:BPC]BPC0~=BPRNUM As [JOIN]
& Where left$([F:BPR]BPRNUM,5)='A0001'

For [JOIN]
Infbox [F:BPR]BPRNUM-'-'-[F:BPR]CRN
Next

Se nella condizione di join togliamo la tilde ~ verranno visualizzati tutti i terzi, anche quelli che non sono clienti.

Esempio di left join con legame one-to-many

Cerchiamo tutti gli articoli con i loro articoli-sito.
Un articolo può avere più corrispondenze nella tabella degli articoli-sito (relazione uno a molti).
Noi vogliamo visualizzare però anche tutti gli articoli che non hanno alcun articolo sito.

If !clalev([F:ITM]) : Local File ITMMASTER [ITM] : Endif
If !clalev([F:ITF]) : Local File ITMFACILIT [ITF] : Endif

Link [F:ITM] With [F:ITF]ITF0(1)=ITMREF As [JOIN]
& Where left$([F:ITM]ITMREF,7)='ABCDFEG'

For [JOIN]
  Infbox [F:ITM]ITMREF-[F:ITF]STOFCY
Next

Così facendo un articolo senza un articolo-sito verrà comunque visualizzato.

Da notare che in questo caso abbiamo utilizzato la sintassi [TAB2]KEY_NAME(INDEX_VALUE):
infatti abbiamo impostato la join solo sul primo campo della chiave ITF0 che è così composta:

ITF0 => ITMREF+STOFCY

Il problema che può sorgere è che l’istruzione link richiede l’utilizzo di una chiave nella condizione di join,
e bisogna arrangiarsi con le chiavi presenti o crearne una nuova.

Per trovare molte altre informazioni sull’istruzione Link di Sage X3 clicca qui.

Istruzione Columns

Come già detto l’istruzione Link che è già un buon passo in avanti rispetto all’esecuzione di un ciclo con all’interno un’istruzione Read.

Nel caso si voglia ottimizzare ulteriormente le prestazioni, è possibile dire al sistema di limitare il numero di campi da recuperare dalle tabelle attraverso l’istruzione Columns.

Questa istruzione va inserita subito dopo il comando Link (o File o Filter nel caso si utilizzino queste istruzioni).

Ripetendo l’esempio precedente potremo quindi dire al sistema direcuperare solo i 2 campi che ci interessano:

Link [F:ITM] With [F:ITF]ITF0(1)=ITMREF As [JOIN] 
& Where left$([F:ITM]ITMREF,7)='ABCDFEG'

Columns [JOIN] ([F:ITM]ITMREF,[F:ITF]STOFCY)

For [JOIN]
Infbox [F:ITM]ITMREF-[F:ITF]STOFCY
Next


Ho fatto un test per verificare di quanto migliorino le prestazioni:

  • Filter + Ciclo con istruzione Read: 31/32 secondi
  • Istruzione Link: 22/23 secondi
  • Istruzione Link + Columns: 20/21 secondi

Per trovare molte altre informazioni sull’istruzione Columns di Sage X3 clicca qui.

Lascia un commento

Scopri di più da SageDev

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

Continua a leggere