RecId vs SystemId
Salve lettore, oggi voglio parlarti delle differenze tra due “oggetti” che troviamo in AL e quindi in Business Central: RecId e SystemId. Apparentemente potrebbero avere un utilizzo simile, ma vedremo che non sono utilizzabili indistintamente in tutti gli scenari.
RecId è l’oggetto più datato ed identifica univocamente un record in una tabella. Storicamente è sempre stato utilizzato per collegare record in scenari generici, come ad esempio nella tabella “Record Link” dove venivano memorizzate note e URL a record di una determinata tabella. Lo incontriamo spesso se si utilizzano istruzioni con RecordRef e FieldRef. È molto utile per fare delle GET sull’oggetto RecordRef, generalizzando completamente un’istruzione.
SystemId è, invece, relativamente più recente rispetto a RecId, poiché è stato introdotto a partire da Business Central 2019 wave 2. Esso è di tipo GUID, pertanto anch’esso è un identificatore univoco, immutabile per tutti i record. Una volta impostato, il SystemId non può essere modificato. A differenza di RecId, è unico per ogni tabella, ma non per l’intero database; pertanto avremo un unico SystemId per una stessa tabella, ma lo stesso valore potrebbe essere presente in tabelle diverse. Ricorda, inoltre, che il SystemId, al momento, non è disponibile per le tabelle virtuali. Per accedere al suo valore, è possibile chiamare la funzione GetBySystemId.
Ti starai chiedendo: ma allora che differenza c’è tra uno e l’altro dal momento che entrambi rappresentano un identificatore univoco del record di una tabella? La differenza più grande è che se si rinomina un record, RecId cambia mentre SystemId no. Questo non è banale, soprattutto se si sviluppano applicazioni che hanno tabelle con una forte integrazione tra loro. Vediamolo con un esempio: ho sviluppato tre tabelle (e tre pagine lista). La tabella 1, quella principale, è formata da codice e descrizione. La tabella 2 ha come chiave il RecId della tabella 1 e un codice, mentre la tabella 3 ha come chiave il SystemId della tabella 1 e un codice.
Ho, poi, nella page principale, creato delle funzioni per richiamare le altre pagine impostando una variabile globale di RecId o SystemId.
Vediamo, ora, il risultato finale di questo sviluppo.
Ecco cosa succede se rinomino il primo record della tabella principale.
Mentre la page con il SystemId di origine in chiave è rimasta intatta.
Un altro dettaglio che ti do su SystemId, leggendo sui forum, è che se fai Rec1 := Rec2 o Rec1.COPY(Rec2), se Rec2 viene salvato sul database, causa un errore di SystemId duplicato. Per risolvere questo problema utilizza TRANSFERFIELDS cols secondo parametro a FALSE oppure riassegnare Systemid dopo la copia prima di salvarlo perché è comunque possibile crearlo manualmente.
Comprendere le differenze tra RecId e SystemId è fondamentale per utilizzare Business Central in modo efficiente. Mentre il RecId è perfetto per la gestione interna dei record, ma con l’accortezza di rigenerare i riferimenti qualora il record principale venga rinominato; il SystemId brilla nelle integrazioni e nelle migrazioni di dati. Scegliere l’identificatore giusto per il contesto giusto può fare una grande differenza nella gestione dei dati e nell’integrità del sistema.
Spero che questo articolo ti sia stato di aiuto per le tue future implementazioni in Business Central.

