IDE: Parametri di input/output e IMDB/DO
copia linkDescrizione del difetto
I parametri di input/output non funzionavano in alcuni casi:
- campi di cursore di cicli FOR-EACH su tabella IMDB
- proprietà pubbliche di documento.
- 356 - IMDB record field are not allowed as input/output parameter ([NOMECAMPO])
- 357 - Document oriented properties are not allowed as input/output parameter ([NOMEPROPRIETA])
Effetti del malfunzionamento
- Il valore del campo IMDB o proprietà DO veniva passato alla procedura ma non risultava cambiato dopo la chiamata.
Soluzioni
Era sufficiente creare variabili locali dove memorizzare il valore del campo IMDB o della proprietà del documento, passare la variabile locale alla procedura e, dopo la chiamata, copiare il valore della variabile locale nel campo IMDB o proprietà del documento.
Funzionalità interessate
L'utilizzo di parametri di input/output in procedure e funzioni.
Note
- Malfunzionamento relativo alla richiesta di assistenza 000186-2015.
- Malfunzionamento relativo ai seguenti thread del forum:
-
I parametri di input/output di tipo "semplice" (interi, float, stringhe ma non oggetti) non sono gestiti da tutti i linguaggi. In C# c'è modo di utilizzare gli identificativi "ref" e "out" mentre in Java e Javascript non è possibile utilizzare parametri di input/output.
Instant Developer può gestire i parametri di input/output perché utilizza, anche per i tipi semplici, la classe IDVariant. Tale scelta permette ad Instant Developer di uniformare la gestione dei tipi di dato tra i vari linguaggi. La classe IDVariant permette di "boxare" il valore e, quando modificato all'interno di una procedura con parametri di input/output, può essere "riportato fuori".
Tale funzionalità, però, non è supportata in due casi particolari:- variabili di cursore di cicli FOR su tabelle IMDB: tale limitazione è dovuta al fatto che il valore di un campo di una tabella IMDB è un oggetto più complesso di un semplice IDVariant. Ha, infatti, collegamenti con altre tabelle IMDB e, quando viene modificato il campo il sistema modifica automaticamente anche il campo delle tabelle IMDB collegate. Nel caso di variabili di cursore di ciclo FOR su tabelle IMDB la limitazione nasce dal fatto che quando si modifica la variabile di cursore il sistema deve modificare anche la corrispondente tabella IMDB usata nella query del ciclo FOR. Si pensi al caso seguente:
for each FLD1 from TAB where FLD1 > 5Instant Developer, nel caso descritto sopra, oltre a creare la tabella IMDB TAB crea anche una nuova tabella IMDB associata al ciclo for dentro cui copia i dati provenienti dalla tabella IMDB TAB. La nuova tabella IMDB associata al ciclo FOR non contiene tutti i record della tabella originale ma solo quelli che corrispondono ai criteri presenti nella query (clausole where, raggruppamenti, ordinamenti). Inoltre non contiene tutti i campi della tabella IMDB originale ma solo quelli selezionati nella select list della query. Ora, quando viene modificato il valore di FLD1 della tabella associata al ciclo for, il sistema, oltre a modificare il valore del campo FLD1 della query del ciclo for, modifica anche il corrispondente campo FLD1 della tabella IMDB TAB. Tale automatismo di propagazione del valore alle tabelle collegate rende molto più complicato gestire i parametri di input/output in questo caso specifico; - proprietà pubbliche di documento: qui la limitazione è dovuta al fatto che le proprietà pubbliche di documento vengono dichiarate tramite GETTER e SETTER. In altre parole non viene dichiarata la proprietà ma vengono dichiarate due funzioni: una che permette la lettura della proprietà interna del documento (privata, non accessibile dall'esterno) e una funzione che permette la scrittura della proprietà interna che, oltre a modificare la proprietà interna, permette la sistema di notificare gli eventi di OnChangingProperty, portare il documento in stato modificato, aggiornare la UI. Tali funzioni di lettura e scrittura non permettono la gestione del parametro di input/output così come viene fatto negli altri casi più semplici.
- variabili di cursore di cicli FOR su tabelle IMDB: tale limitazione è dovuta al fatto che il valore di un campo di una tabella IMDB è un oggetto più complesso di un semplice IDVariant. Ha, infatti, collegamenti con altre tabelle IMDB e, quando viene modificato il campo il sistema modifica automaticamente anche il campo delle tabelle IMDB collegate. Nel caso di variabili di cursore di ciclo FOR su tabelle IMDB la limitazione nasce dal fatto che quando si modifica la variabile di cursore il sistema deve modificare anche la corrispondente tabella IMDB usata nella query del ciclo FOR. Si pensi al caso seguente:
Ultima modifica: 25/03/2020 / Validità: da 20.0.7800