English
Instant Developer Foundation Documentazione
  • Note di rilascio
  • Instant Developer Foundation
  • Versioni precedenti
  • Versione 20.0.7800
  • Correzioni

IDE: Parametri di input/output e IMDB/DO

copia link

Descrizione 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.
A partire dalla versione 20.0 di Instant Developer vengono segnalati rispettivamente i warning:
  • 356 - IMDB record field are not allowed as input/output parameter ([NOMECAMPO])
  • 357 - Document oriented properties are not allowed as input/output parameter ([NOMEPROPRIETA])
I warning richiedono una conferma esplicita del programmatore poiché, nei casi descritti sopra, il valore modificato all'interno delle procedure/funzioni, non verrà riportato fuori al chiamante.

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:
    • thread 1
    • thread 2
    • thread 3
  • 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 > 5
      
      Instant 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.
    Supportare i parametri di input/output anche in questi due casi costerebbe molto in termini di performance e occupazione di memoria poiché bisognerebbe fornire all'IDVariant altre proprietà che permettano allo stesso di aggiornare le tabelle IMDB collegate e/o di chiamare l'apposito setter sull'istanza del documento quando il valore viene modificato dento alla procedura che ha il parametro di input/output. Pertanto, per il momento, si è deciso di segnalare un warning che informi che la funzionalità non è supportata. Nei casi indicati è sempre possibile utilizzare variabili locali dove copiare il valore prima della chiamata alla procedura e riutilizzarle dopo la chiamata per impostare il valore nelle query IMDB o proprietà DO.

Ultima modifica: 25/03/2020 / Validità: da 20.0.7800

Hai trovato utile l'articolo?

Grazie per il feedback!

Ti serve altro aiuto?

Consulta il Forum