La codeunit: dove vive la logica
In AL la logica di business non sta nelle page né nelle table: sta nelle codeunit. Una codeunit è un oggetto senza interfaccia utente che raccoglie procedure, pubbliche o local, richiamate da page action, trigger, job queue o altre codeunit. Due usi la rendono centrale. Il primo è l’incapsulamento: quando il requisito parla di logica riutilizzabile da più page o report, la risposta è una codeunit, non codice duplicato nei trigger. Il secondo è l’estendibilità: gli event subscriber vivono nelle codeunit, ed è così che un’estensione reagisce a ciò che accade nel base app senza modificarne il codice, che in cloud (SaaS) è comunque intoccabile. Gli event publisher possono stare in vari oggetti, i subscriber no. Ricorda anche il SingleInstance, che mantiene stato per la durata della sessione, e le codeunit di install e upgrade, identificate dal Subtype: sono distrattori ricorrenti.
Report: dataset, layout e request page
Un report è tre cose in un oggetto solo. Il dataset dichiara i dataitem e le column da estrarre, con relazioni padre-figlio e filtri. Il layout decide la resa: RDL per stampe con paginazione e posizionamento controllati al millimetro, Word per layout che un consulente funzionale deve poter ritoccare da solo, Excel per output analitico. Un report può avere più layout e sceglierne uno di default; cambiare layout non cambia i dati. La request page raccoglie filtri e opzioni prima dell’esecuzione. Per aggiungere column a un report standard senza duplicarlo esiste la report extension, che estende il dataset e consente layout aggiuntivi.
Query e XMLport: leggere in join, scambiare file
La query legge dati da più tabelle in join, con filtri e aggregazioni, e restituisce un risultato read-only. È efficiente perché la join la esegue il database invece di cicli annidati in AL: si usa per analisi, per i grafici del Role Center e per esporre dati via OData. Non è l’oggetto per scrivere.
L’XMLport serve invece all’import ed export di file strutturati: XML e, cambiando il format, anche file a larghezza fissa o delimitati come i CSV. Ha dataitem e field, può avere una request page ed essere esposto come web service SOAP. Tracciato bancario da caricare o flusso da inviare a un partner: XMLport. Dati in join per un’analisi: query.
Enum, interface e permission set
L’enum ha sostituito le option list dove serve estendibilità: se dichiarato Extensible, un’altra estensione può ampliarlo con un enumextension che aggiunge valori, cosa impossibile su un campo Option. La firma di uno scenario d’esame è “un altro publisher deve poter aggiungere una tipologia”.
L’interface introduce la programmazione per contratto: dichiara le procedure senza implementarle, e più codeunit possono implementarla. Combinata con un enum che associa ogni valore a un’implementazione, permette di scegliere il comportamento a runtime e di far arrivare implementazioni nuove da estensioni terze senza toccare il chiamante. È la risposta a “sostituire una lunga catena di case” e a “implementazioni intercambiabili”.
Il permission set come oggetto AL è versionato insieme al codice e viaggia con l’estensione, invece di essere configurato a mano in ogni ambiente; il permissionsetextension amplia set esistenti. Ogni estensione dovrebbe pubblicarne almeno uno.
Trappole tipiche d’esame
- Il cliente deve poter modificare l’aspetto della stampa → layout Word: RDL offre più controllo tipografico ma richiede strumenti e competenze da sviluppatore; il dataset resta identico nei due casi.
- Servono colonne extra su un report standard → report extension: copiare il report in uno nuovo compila, ma duplica la manutenzione e non sostituisce quello che il base app continua a chiamare.
- Un’altra estensione deve aggiungere valori a una lista → enum con Extensible: un campo Option è chiuso, e nemmeno una table extension può aggiungere membri a un’option list altrui.
- Aggregare dati da più tabelle per un grafico o un’API → query: l’XMLport è per i file, il report per le stampe; e poiché la query è read-only non è mai la risposta a “aggiornare i record”.
- Reagire alla registrazione di un documento senza toccare il base app → event subscriber in una codeunit: la table extension aggiunge campi, non comportamento, e la modifica del codice standard non è un’opzione in SaaS.
- Dopo la pubblicazione gli utenti non-SUPER vedono errori di permessi → permission set come oggetto AL: assegnare permessi manualmente nel tenant non è versionato e va rifatto in ogni ambiente.