I campi di sistema sulle tabelle
Salve lettore, in questo articolo voglio parlarti di una feature legata alle tabelle che per chi lavora da tanti su Microsoft Dynamics Nav potrebbe rivelarsi una grossa novità e per i clienti finali un qualcosa che hanno sempre ricercato.
Mi sto riferendo ai campi di sistema sulle tabelle. Andando con ordine parliamo del campo SystemId. Il campo SystemId è un campo introdotto da Business Central 2019 wave 2. Esso è un campo di tipo GUID che specifica un identificatore univoco per ciascun record della tabella. Il campo SystemId presenta le seguenti caratteristiche:
- tutti i record hanno un valore SystemId.
- E’ possibile assegnare un valore personalizzato, in caso il campo sia blank, verrà assegnato automaticamente dalla piattaforma un valore GUID.
- Una volta impostato un valore di SystemId, esso non potrà più essere modificato.
- C’è sempre una chiave secondaria univoca nel campo SystemId per garantire che i record non abbiano valori di campo identici.
- Al campo SystemId viene assegnato il numero di campo 2000000000.
Il campo SystemId può essere utilizzato in tablerelation e in una pagina API può essere associato come una chiave.
Inoltre, a partire dalla versione di Microsoft Business Central 2020 wave 2, il campo SystemId può essere utilizzato per:
- se una chiamata POST di un servizio web lo chiama, lo stack OData ne mantiene il valore.
- Il campo SystemId può essere utilizzato come parte di una chiave non primaria.
- Il campo SystemId può essere visualizzato nelle pagine.
- E’ possibile collegare factbox/page part utilizzando il campo SystemId.
Un qualcosa che l’utente finale ha sempre richiesto è avere dei campi che identificano l’utente di inserimento/modifica e la data/ora di inserimento/modifica. Dalla versione 2020 wave 2 di Microsoft Business Central sono stati inclusi quattro campi di sistema:
- SystemCreatedAt (id campo 2000000001). E’ di tipo data/ora e rappresenta la data/ora di creazione del record.
- SystemCreatedBy (id campo 2000000002). E’ di tipo GUID e rappresenta l’ID di sicurezza dell’utente (SID) che ha creato il record.
- SystemModifiedAt (id campo 2000000003). E’ di tipo data/ora e rappresenta la data/ora di creazione del record.
- SystemModifiedBy (id campo 2000000004). E’ di tipo GUID e rappresenta l’ID di sicurezza dell’utente (SID) che ha modificato il record.
Questi campi vengono generati automaticamente dalla piattaforma:
- dopo dei trigger OnBeforeInsert e OnBeforeModify
- dopo l’esecuzione dei trigger OnInsert e OnModify
- prima che vengano eseguiti i trigger OnAfterInsert e OnAfterModify.
I campi vengono compilati come segue:
Quando viene creato un nuovo record, prima di chiamare Insert, ai campi di controllo vengono assegnati GUID vuoti e date vuote come valori.
Quando un record viene inserito per la prima volta, i campi vengono popolati con valori effettivi.
Ai campi $systemCreatedBy e $systemModifiedBy viene assegnato lo stesso valore. Lo stesso vale per i campi $systemCreatedAt e $systemModifiedAt.
I campi $systemCreatedBy e $systemCreatedAt non cambieranno dopo questo punto.
Quando un record viene aggiornato, i campi $systemModifiedBy e $systemModifiedAt vengono modificati.
La piattaforma non popolerà questi campi quando una società viene copiata; verranno semplicemente riportati gli stessi valori della società da cui si sta copiando. Inoltre quando si sincronizza lo schema della tabella, i campi non verranno scritti.
Fai attenzione a come usi questi campi nelle chiavi, nel senso che non possono essere utilizzati come chiave primaria, possono tuttavia essere utilizzati come parti di chiave primaria; ricorda, però, che il database non indicizzerà tale chiave.
Come ho scritto prima, i campi SystemCreatedBy e SystemModifiedBy sono i GUID del SID dell’utente, ma non l’utente in chiaro. Per renderlo in chiaro è sufficiente fare una GET sulla tabella User passando il GUID e farsi restituire il campo “User Name”.
Concludiamo la carrellata dei campi di sistema delle tabelle con il campo TimeStamp. Tale campo è sempre stato nascosto al gestionale, è un campo che si vedeva solo su SQL, ma dalla versione 21 è possibile esporlo in tabella attraverso la proprietà del campo SqlTimeStamp = true. Ad esempio:
field(50000; “Current Time Stamp”; BigInteger)
{
SqlTimestamp = true;
}
Un uso tipico del campo timestamp è per sincronizzare le modifiche dei dati nelle tabelle. Consente di identificare i record che sono stati modificati dall’ultima sincronizzazione.
Questa è una rapida ma esplicativa disanima dei campi di sistema delle tabelle. Soprattutto la seconda tipologia di campi che rappresenta i dati dell’utente e dell’ora di inserimento/modifica rappresenta una grande svolta perché spesso i clienti chiedevano questi campi, ma le vecchie versioni non li avevano e dovevano essere aggiunti e gestiti laddove veniva richiesto. In questo caso sono disponibili per tutte le tabelle. Pertanto sarà più veloce fare query per identificare modifiche al database in una certa data/ora per un certo utente.
Spero che questo articolo ti abbia dato qualche strumento di sviluppo in più per le tue applicazioni in Microsoft Business Central. Se vuoi approfondire l’argomento, al seguente link troverai la guida ufficiale.