Vai al contenuto

Form, FormUID e ItemUID

Cos'è un Form

Chi arriva dal frontend web tende a pensare a un <form> HTML. Nella UI API di SAP Business One il significato è completamente diverso.

Un Form è l'equivalente di una finestra/schermata intera dell'applicazione — quello che nel mondo desktop si chiamerebbe "una window" o "una view". Esempi:

  • La finestra "Ordine di Vendita"
  • La finestra "Anagrafica Articoli"
  • Una finestra custom creata da XML

Struttura gerarchica

graph TD
    Form["<b>Form</b><br/><i>(La finestra intera: schermata, window o view)</i>"]
    Items["<b>Items</b><br/><i>(Collezione di tutti i controlli presenti nella form)</i>"]
    Item["<b>Item</b><br/><i>(Singolo controllo generico: posizione, dimensioni, visibilità)</i>"]
    Specific["<b>Specific</b><br/><i>(Controllo tipizzato: EditText, ComboBox, Matrix, Button...)</i>"]

    Form -->|"contiene"| Items
    Items -->|"indicizza"| Item
    Item -->|"cast al controllo concreto"| Specific

FormUID vs FormTypeEx

Sono due identificativi diversi, spesso confusi all'inizio.

FormTypeEx — il "tipo" di form

Identifica quale schermata ha generato l'evento, indipendentemente dall'istanza aperta. È sempre lo stesso per lo stesso tipo di finestra.

oForm.TypeEx // es. "139" per l'Ordine di Vendita, sempre uguale

FormTypeEx è la versione stringa di FormType (che è un intero). È la versione raccomandata oggi perché gestisce meglio i form custom/UDO e garantisce compatibilità futura.

Come trovare il FormTypeEx di una form standard

  1. Aprire la form in SAP Business One.
  2. Usare System Information (in basso a sinistra) e passare il mouse sulla form: SAP mostra il Form Type nella barra di stato.
  3. In alternativa, mettere un breakpoint nel proprio FormDataEvent e ispezionare BusinessObjectInfo.FormTypeEx a runtime.

Note

Nessuna lista ufficiale è sempre aggiornata nell'help — verificare sempre a runtime con System Information o breakpoint.

FormUID — l'istanza specifica

Ogni volta che si apre una finestra, SAP crea una nuova istanza con un UID univoco e progressivo (es. "3", "27", "142"...). Aprendo due Ordini di Vendita contemporaneamente, si avranno due form con lo stesso TypeEx ("139") ma UniqueID diversi.

oForm.UniqueID   // cambia ogni volta, es. "27"
oForm.TypeEx     // resta "139" sempre

ItemUID: fisso o variabile?

Diversamente da FormUID, l'ItemUID degli item standard SAP è fisso e sempre uguale per ogni istanza dello stesso tipo di form. Non identifica un'istanza runtime, ma la posizione nel layout definita staticamente nello screen painter di quella form.

Esempio: nell'Ordine di Vendita (139), il campo "Codice Cliente" è sempre "4", in qualsiasi istanza si apra quella form.

oForm.Items.Item("4")  // funziona identico su ogni istanza di Ordine di Vendita

Eccezioni da tenere a mente

  1. Item aggiunti via codice (es. un bottone custom): l'ItemUID lo si sceglie in fase di creazione (.Add("MyButton", ...)), quindi resta fisso solo perché è lo sviluppatore a definirlo sempre uguale — non è una garanzia di SAP.
  2. Righe di una Matrix: non hanno un proprio UID individuale come gli Item — si indirizzano per indice (oMatrix.GetCellSpecific(columnUID, rowIndex)). Il concetto di "UID fisso" non si applica riga per riga.

Regola

FormUID cambia per istanza, ItemUID resta fisso per tipo di form (a meno che non venga creato dinamicamente dal codice).