<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://kb.sagedev.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mwadmin</id>
	<title>SageDev KB - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://kb.sagedev.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mwadmin"/>
	<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php/Special:Contributions/Mwadmin"/>
	<updated>2026-04-06T17:26:37Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Gestione_videate_e_campi&amp;diff=1121</id>
		<title>Gestione videate e campi</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Gestione_videate_e_campi&amp;diff=1121"/>
		<updated>2026-01-21T13:24:38Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;Grizo&amp;lt;/code&amp;gt; per disabilitare un campo di una videata; &amp;lt;br /&amp;gt;un altro modo è &amp;lt;code&amp;gt; Chgfmt [M:YPE0]YMESSAGE With &amp;quot;KP:10&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;Grizo rank&amp;lt;/code&amp;gt; per disabilitare un blocco: ''rank'' deve essere il valore della colonna ''Numero'' della sezione Blocchi della scheda Generale in gestione maschera (GESAMK)&lt;br /&gt;
#&amp;lt;code&amp;gt;Diszo&amp;lt;/code&amp;gt; per disabilitare (rendere solo visualizzato) un campo di una videata; &lt;br /&gt;
#&amp;lt;code&amp;gt;Actzo&amp;lt;/code&amp;gt; istruzione per abilitare un campo di una videata; &lt;br /&gt;
#&amp;lt;code&amp;gt;Effzo&amp;lt;/code&amp;gt; per sbiancare un campo di una videata; mette spazi bianchi indipendentemente dal tipo dato; le variabili corrispondenti della videata vengono resettate (vedi Raz); (la videata deve essere visualizzata, altrimenti usare Raz)&lt;br /&gt;
#&amp;lt;code&amp;gt;Raz&amp;lt;/code&amp;gt;: per resettare una variabile; in pratica mette una stringa vuota, il valore 0 o la data nulla in base al tipo dato; se la variabile è multidimensionale e non viene indicato un indice, viene resettata completamente&lt;br /&gt;
#Per aggiornare in visualizzazione un campo di una videata: usare la funzione &amp;lt;code&amp;gt;Affzo&amp;lt;/code&amp;gt;; &amp;lt;br /&amp;gt; Attenzione: Effzo + Grizo è diverso che fare Raz + Affzo&lt;br /&gt;
#&amp;lt;code&amp;gt;Envzo&amp;lt;/code&amp;gt;: forza la visualizzazione di un campo (l'istruzione Affzo viene bufferizzata e ottimizzata, Envzo forza l'esecuzione)&lt;br /&gt;
#Per nascondere/fa riapparire un campo di una videata utilizzare ''Chgfmt'', per esempio &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt; Chgfmt [M:YPE0]YMESSAGE With &amp;quot;-K:10&amp;quot;     #nascondo il campo&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt; Chgfmt [M:YPE0]YMESSAGE With &amp;quot;K:10&amp;quot;      #visualizzo il campo&amp;lt;/code&amp;gt;&lt;br /&gt;
#chgtzn per titolo campi in lista &amp;lt;code&amp;gt;Chgtzn[M:TXM1]AMTVAL1 With &amp;quot;new text&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;onkey&amp;lt;/code&amp;gt; permette di eseguire un programma partendo dal clic del tasto destro in un campo (anche per help)&lt;br /&gt;
# setmok&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; e &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; per abilitare/disabilitare pulsanti, bottoni o menu della barra dei menu; in genere da usare nella azione SETBOUT (vedi anche variabili GSTABOU, ETABOU, CHMEN, CHAINE).&lt;br /&gt;
#* per vedere le variabili dei vari bottoni: cercare alla voce [[GESAGB|Sviluppo - Dizionario dati - Apertura alla parametrizzazione - Variabili globali]], o nel sorgente WWAGLOBADX, GSTA*: &amp;lt;br /&amp;gt;GSTAOK, GSTARET, GSTAENR...,GSPE*, GCHAN, GCHAINE, GETABOU, GETAMEN...&lt;br /&gt;
&lt;br /&gt;
Esempi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#Esempio in cui si disattiva il bottone Nuovo in fase di modifica&lt;br /&gt;
If REP &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then&lt;br /&gt;
    Disable GSTANEW  &lt;br /&gt;
Else&lt;br /&gt;
    Enable GSTANEW&lt;br /&gt;
Endif&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ETABOU(GSPE1)=0 #disattivo pulsante&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aggiornare una finestra ==&lt;br /&gt;
&lt;br /&gt;
Fonte:https://communityhub.sage.com/us/sage_x3/f/general-discussion/103996/hot-to-invoke-refresh-button&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per aggiornare una finestra va eseguita la chiamata&lt;br /&gt;
&amp;lt;pre&amp;gt;Gosub RELIT From GOBJSUB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ma prima vanno recuperate alcune variabili, in base alla situazione possono essere nessuna o solo alcune.&lt;br /&gt;
Qui il codice per recuperale tutte all'apertura della finestra e poi la chiamata di aggiornamento:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$OUVRE&lt;br /&gt;
&lt;br /&gt;
  Global Integer YCLECUR : YCLECUR = CLECUR&lt;br /&gt;
  Global Char YCLECUR1(30) : YCLECUR1 = CLECUR1&lt;br /&gt;
  Global Char YCLECUR2(30) : YCLECUR1 = CLECUR2&lt;br /&gt;
  Global Integer YTYPGES : YTYPGES = TYPGES&lt;br /&gt;
  Global Char YABFIC(30) : YABFIC = ABFIC&lt;br /&gt;
  Global Char YCLEPRIM(30) : YCLEPRIM = CLEPRIM&lt;br /&gt;
  Global Char YPROGOBJ(30) : YPROGOBJ = PROGOBJ&lt;br /&gt;
  Global Integer YVERROU : YVERROU = VERROU&lt;br /&gt;
  Global Integer YOVERROU : YOVERROU = OVERROU&lt;br /&gt;
  Global Char YSYMBOLE(30) : YSYMBOLE = SYMBOLE&lt;br /&gt;
  Global Integer YNBMASK : YNBMASK = NBMASK&lt;br /&gt;
  Global Char YWINPROG(30) : YWINPROG = WINPROG&lt;br /&gt;
  Global Integer YAMA(dim(AMA)) : YAMA = AMA&lt;br /&gt;
  Global Integer AMAINDX : AMAINDX = dim(AMA)&lt;br /&gt;
  Global Integer YAIMGLCK : YAIMGLCK = AIMGLCK&lt;br /&gt;
Return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subprog REFRESH_SCREEN()&lt;br /&gt;
Local Integer AMA(AMAINDX)&lt;br /&gt;
&lt;br /&gt;
  TYPGES = YTYPGES&lt;br /&gt;
  CLECUR = YCLECUR&lt;br /&gt;
  CLECUR1 = YCLECUR1&lt;br /&gt;
  CLECUR2 = YCLECUR2&lt;br /&gt;
  ABFIC = YABFIC&lt;br /&gt;
  CLEPRIM = YCLEPRIM&lt;br /&gt;
  PROGOBJ = YPROGOBJ&lt;br /&gt;
  VERROU = YVERROU&lt;br /&gt;
  OVERROU = YOVERROU&lt;br /&gt;
  SYMBOLE = YSYMBOLE&lt;br /&gt;
  NBMASK = YNBMASK&lt;br /&gt;
  WINPROG = YWINPROG&lt;br /&gt;
  AMA = YAMA&lt;br /&gt;
  AIMGLCK = YAIMGLCK&lt;br /&gt;
  Gosub RELIT From GOBJSUB&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Errori&amp;diff=1114</id>
		<title>Errori</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Errori&amp;diff=1114"/>
		<updated>2024-12-23T16:24:03Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: Created page with &amp;quot; === &amp;quot;Funzione non definita per il valore fornito&amp;quot; ===   Potrebbe essere che la schermata ha raggiuntno il numero massimo di righe (specie i dati sono alimentati da più perso...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=== &amp;quot;Funzione non definita per il valore fornito&amp;quot; === &lt;br /&gt;
&lt;br /&gt;
Potrebbe essere che la schermata ha raggiuntno il numero massimo di righe (specie i dati sono alimentati da più persone in contemporanea o attraverso altri sw).&lt;br /&gt;
&lt;br /&gt;
Andare sulla definizione schermata e cambiare il vaore del campo Riga&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Main_Page&amp;diff=1113</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Main_Page&amp;diff=1113"/>
		<updated>2024-12-23T16:21:59Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;Benvenuti in SageDev KB!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il wiki italiano su Sage X3&lt;br /&gt;
&lt;br /&gt;
Chiunque può contribuire!&lt;br /&gt;
&lt;br /&gt;
Buon lavoro&lt;br /&gt;
&lt;br /&gt;
== Parti da qui ==&lt;br /&gt;
=== per utenti finali ===&lt;br /&gt;
* [[UtentiFinali| Utenti finali]]&lt;br /&gt;
&lt;br /&gt;
=== per tecnici ===&lt;br /&gt;
&lt;br /&gt;
* [[Sistema|Sistema]]: Informazioni relative allo configurazione del Sistema Sage&lt;br /&gt;
* [[Syracuse]]&lt;br /&gt;
* [[Menu principale]]&lt;br /&gt;
* [[Parametrizzazione|Parametrizzazione]]: Informazioni relative allo sviluppo parametrico&lt;br /&gt;
* [[Programmazione|Programmazione]]: Informazioni relative allo sviluppo software&lt;br /&gt;
* [[Errori]]&lt;br /&gt;
* [[Web Services]]&lt;br /&gt;
* [[Crystal Report]]&lt;br /&gt;
* [[Eclipse|Eclipse]]&lt;br /&gt;
* [[Parametrizzazioni Funzionali]]&lt;br /&gt;
* [[Risorse]]&lt;br /&gt;
* [[Supporto Formula|Supporto Formula]]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Data_ora&amp;diff=1110</id>
		<title>Data ora</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Data_ora&amp;diff=1110"/>
		<updated>2024-12-05T09:18:47Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Per ottenere la data corrente in una variabile Date si usa la funzione &amp;lt;code&amp;gt;date$&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Allo stesso modo per avere data e ora correnti in una variabile Datetime si usa la funzione &amp;lt;code&amp;gt;datetime$&amp;lt;/code&amp;gt; (solo dalla V7).&lt;br /&gt;
&lt;br /&gt;
La '''forma canonica''' per rappresentare data e ora con una stringa è:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;YYYY-MM-DDThh:mm:ssZ           #attenzione alle lettere &amp;quot;in più&amp;quot; T e Z&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data e ora hanno formato &amp;quot;YYYY-MM-DDThh:mm:ss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attenzione: la variabile &amp;lt;code&amp;gt;adxdcs&amp;lt;/code&amp;gt; contiene l'anno pivot, usato per capire a quale secolo fare riferimento (anno 41- &amp;gt; 1941 o 2041?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
num$(date$)                   #Per ottenere come stringa la data odierna&lt;br /&gt;
num$(time$)                   #Per ottenere come stringa l'ora corrente&lt;br /&gt;
num$(datetime$)               #Per ottenere come stringa canonica la data e ora odierna&lt;br /&gt;
&lt;br /&gt;
year(data)                    #Per ottenere l'anno di una data&lt;br /&gt;
month(data)                   #Per ottenere il numero del mese di una data&lt;br /&gt;
month$(data)                  #Per ottenere il nome del mese di una data nella lingua corrente&lt;br /&gt;
day(data)                     #Per ottenere il numero del giorno del mese (1-31)&lt;br /&gt;
day$(data)                    #Per ottenere il nome del giorno della settimana&lt;br /&gt;
dayn(data)                    #Per ottenere il numero del giorno della settimana (1=lunedì, 7=domenica)&lt;br /&gt;
week(data)                    #Per ottenere il numero della settimana (1-53)&lt;br /&gt;
aweek(settimana,anno)         #Per ottenere il primo giorno (lunedì) della settimana specificata&lt;br /&gt;
nday(data)                    #Per ottenere il numero di giorni passati dal 1 gennaio 1600&lt;br /&gt;
nday$(NUM)                    #Per ottenere una data successiva di NUM giorni dal 1 gennaio 1600&lt;br /&gt;
eomonth(data)                 #Per ottenere l'ultimo giorno del mese di una data&lt;br /&gt;
addmonth(data,mesi)           #Per ottenere una data sommando n mesi alla data specificata&lt;br /&gt;
&lt;br /&gt;
gdat$(DAY,MONTH,YEAR)         #Per ottenere una data dati giorno, mese e anno&lt;br /&gt;
gdatetime$(str)               #Per ottenere una variabile Datetime da una stringa in forma canonica&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ottenere come stringa con formato a piacere: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;format$(&amp;quot;D:YYYYMMDD[_]hhmmss&amp;quot;,date$)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il 31 dicembre 2018 alle 12.30 e 56 secondi corrisponderà a “20181231_123056”.&lt;br /&gt;
&lt;br /&gt;
Notare che per inserire uno spazio o altri elementi costanti si usano le parentesi quadre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;FORMATO = &amp;quot;DD[ ]MM[ ]YY&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== gdatetime$: da stringa canonica a dateTime ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Date DATA&lt;br /&gt;
Local Char STR_DATETIME(20)&lt;br /&gt;
STR_DATETIME=&amp;quot;2011-05-23T04:43:53Z&amp;quot;  #la stringa deve avere 20 caratteri nel formato canonico&lt;br /&gt;
gdatetime$(str)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
YYYY-MM-DDThh:mm:ssZ&lt;br /&gt;
=== Esempi ===&lt;br /&gt;
Eseguire anche delle semplici operazioni:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Date DATA,DATA1&lt;br /&gt;
DATA=[1/2/2015]+5         #DATA conterrà [06/02/2015]&lt;br /&gt;
DATA1=[1/2/2015]-1        #DATA conterrà [31/01/2015]&lt;br /&gt;
NUMGIORNI=DATA-DATA1      #giorni di differenza tra due date&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fare una conversione implicita da data a testo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Char DATA_STR(30)                 # dichiaro una stringa&lt;br /&gt;
Local Date DATA                         # dichiaro una data&lt;br /&gt;
DATA=[31/12/2019]                       # imposto una data iniziale&lt;br /&gt;
DATA_STR = DATA                         # conversione implicita: DATA_STR = &amp;quot;20191231&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conversione da data a stringa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;format$(&amp;quot;DD2&amp;quot;,date$)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ottenere ultimo giorno di un mese: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local date LASTDATE&lt;br /&gt;
LASTDATE = eomonth([1/2/2015])&lt;br /&gt;
Infbox num$(LASTDATE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ottenere come stringa formattata: usare AFNC.FDH, per esempio &amp;lt;code&amp;gt;func AFNC.FDH(date$,&amp;quot;121531&amp;quot;)&amp;lt;/code&amp;gt; restituirà, il primo giugno 2018: &amp;lt;code&amp;gt;01/06/18 12:15:31&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variabili globali contenenti stringhe di formattazione ==&lt;br /&gt;
Sono preimpostate in base alle varie parametrizzazioni predefinite.&lt;br /&gt;
Sono utili per mantenere uno standard che si adatta in base ai vari utenti, siti, ecc.&lt;br /&gt;
&lt;br /&gt;
L’ordine giorno-mese-anno di queste formattazioni dipende appunto dalla localizzazione e dalle impostazioni utente.&lt;br /&gt;
&lt;br /&gt;
Le variabili sono queste:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GFMDAT  = data standard, con 2 caratteri per giorno, 2 per il mese , 2 per l’anno&lt;br /&gt;
GFMDAT4 = data con l’anno a 4 cifre&lt;br /&gt;
GFMDAT3 = data con il mese espresso con tre lettere&lt;br /&gt;
GFMDAT9 = data con il mese scritto in lettere&lt;br /&gt;
GFMMOI  = mese-anno&lt;br /&gt;
GFMMOI4 = mese-anno con anno a 4 cifre&lt;br /&gt;
GFMJOU  = giorno-mese&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(per maggiori info dall'help di Sage, Riquadro sviluppo-&amp;gt;sottoprogrammi -&amp;gt;Modulo Supervisore)&lt;br /&gt;
&lt;br /&gt;
== Videate ==&lt;br /&gt;
Per visualizzare un campo che in tabella è di tipo ADATIM (per esempio UPDDATTIM), in maschera utilizzare tipo dato &amp;quot;A&amp;quot; con lunghezza 19.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Data_ora&amp;diff=1109</id>
		<title>Data ora</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Data_ora&amp;diff=1109"/>
		<updated>2024-12-05T09:13:32Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Per ottenere la data corrente in una variabile Date si usa la funzione &amp;lt;code&amp;gt;date$&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Allo stesso modo per avere data e ora correnti in una variabile Datetime si usa la funzione &amp;lt;code&amp;gt;datetime$&amp;lt;/code&amp;gt; (solo dalla V7).&lt;br /&gt;
&lt;br /&gt;
La forma canonica per rappresentare data e ora con una stringa è:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;YYYY-MM-DDThh:mm:ssZ           #attenzione alle lettere &amp;quot;in più&amp;quot; T e Z&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data e ora hanno formato &amp;quot;YYYY-MM-DDThh:mm:ss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attenzione: la variabile &amp;lt;code&amp;gt;adxdcs&amp;lt;/code&amp;gt; contiene l'anno pivot, usato per capire a quale secolo fare riferimento (anno 41- &amp;gt; 1941 o 2041?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
num$(date$)                   #Per ottenere come stringa la data odierna&lt;br /&gt;
num$(time$)                   #Per ottenere come stringa l'ora corrente&lt;br /&gt;
num$(datetime$)               #Per ottenere come stringa canonica la data e ora odierna&lt;br /&gt;
&lt;br /&gt;
year(data)                    #Per ottenere l'anno di una data&lt;br /&gt;
month(data)                   #Per ottenere il numero del mese di una data&lt;br /&gt;
month$(data)                  #Per ottenere il nome del mese di una data nella lingua corrente&lt;br /&gt;
day(data)                     #Per ottenere il numero del giorno del mese (1-31)&lt;br /&gt;
day$(data)                    #Per ottenere il nome del giorno della settimana&lt;br /&gt;
dayn(data)                    #Per ottenere il numero del giorno della settimana (1=lunedì, 7=domenica)&lt;br /&gt;
week(data)                    #Per ottenere il numero della settimana (1-53)&lt;br /&gt;
aweek(settimana,anno)         #Per ottenere il primo giorno (lunedì) della settimana specificata&lt;br /&gt;
nday(data)                    #Per ottenere il numero di giorni passati dal 1 gennaio 1600&lt;br /&gt;
nday$(NUM)                    #Per ottenere una data successiva di NUM giorni dal 1 gennaio 1600&lt;br /&gt;
eomonth(data)                 #Per ottenere l'ultimo giorno del mese di una data&lt;br /&gt;
addmonth(data,mesi)           #Per ottenere una data sommando n mesi alla data specificata&lt;br /&gt;
&lt;br /&gt;
gdat$(DAY,MONTH,YEAR)         #Per ottenere una data dati giorno, mese e anno&lt;br /&gt;
gdatetime$(str)               #Per ottenere una variabile Datetime da una stringa in forma canonica&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ottenere come stringa con formato a piacere: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;format$(&amp;quot;D:YYYYMMDD[_]hhmmss&amp;quot;,date$)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il 31 dicembre 2018 alle 12.30 e 56 secondi corrisponderà a “20181231_123056”.&lt;br /&gt;
&lt;br /&gt;
Notare che per inserire uno spazio o altri elementi costanti si usano le parentesi quadre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;FORMATO = &amp;quot;DD[ ]MM[ ]YY&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== gdatetime$: da stringa canonica a dateTime ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Date DATA&lt;br /&gt;
Local Char STR_DATETIME(20)&lt;br /&gt;
STR_DATETIME=&amp;quot;2011-05-23T04:43:53Z&amp;quot;  #la stringa deve avere 20 caratteri nel formato canonico&lt;br /&gt;
gdatetime$(str)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
YYYY-MM-DDThh:mm:ssZ&lt;br /&gt;
=== Esempi ===&lt;br /&gt;
Eseguire anche delle semplici operazioni:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Date DATA,DATA1&lt;br /&gt;
DATA=[1/2/2015]+5         #DATA conterrà [06/02/2015]&lt;br /&gt;
DATA1=[1/2/2015]-1        #DATA conterrà [31/01/2015]&lt;br /&gt;
NUMGIORNI=DATA-DATA1      #giorni di differenza tra due date&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fare una conversione implicita da data a testo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Char DATA_STR(30)                 # dichiaro una stringa&lt;br /&gt;
Local Date DATA                         # dichiaro una data&lt;br /&gt;
DATA=[31/12/2019]                       # imposto una data iniziale&lt;br /&gt;
DATA_STR = DATA                         # conversione implicita: DATA_STR = &amp;quot;20191231&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conversione da data a stringa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;format$(&amp;quot;DD2&amp;quot;,date$)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ottenere ultimo giorno di un mese: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local date LASTDATE&lt;br /&gt;
LASTDATE = eomonth([1/2/2015])&lt;br /&gt;
Infbox num$(LASTDATE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ottenere come stringa formattata: usare AFNC.FDH, per esempio &amp;lt;code&amp;gt;func AFNC.FDH(date$,&amp;quot;121531&amp;quot;)&amp;lt;/code&amp;gt; restituirà, il primo giugno 2018: &amp;lt;code&amp;gt;01/06/18 12:15:31&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variabili globali contenenti stringhe di formattazione ==&lt;br /&gt;
Sono preimpostate in base alle varie parametrizzazioni predefinite.&lt;br /&gt;
Sono utili per mantenere uno standard che si adatta in base ai vari utenti, siti, ecc.&lt;br /&gt;
&lt;br /&gt;
L’ordine giorno-mese-anno di queste formattazioni dipende appunto dalla localizzazione e dalle impostazioni utente.&lt;br /&gt;
&lt;br /&gt;
Le variabili sono queste:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GFMDAT  = data standard, con 2 caratteri per giorno, 2 per il mese , 2 per l’anno&lt;br /&gt;
GFMDAT4 = data con l’anno a 4 cifre&lt;br /&gt;
GFMDAT3 = data con il mese espresso con tre lettere&lt;br /&gt;
GFMDAT9 = data con il mese scritto in lettere&lt;br /&gt;
GFMMOI  = mese-anno&lt;br /&gt;
GFMMOI4 = mese-anno con anno a 4 cifre&lt;br /&gt;
GFMJOU  = giorno-mese&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(per maggiori info dall'help di Sage, Riquadro sviluppo-&amp;gt;sottoprogrammi -&amp;gt;Modulo Supervisore)&lt;br /&gt;
&lt;br /&gt;
== Videate ==&lt;br /&gt;
Per visualizzare un campo che in tabella è di tipo ADATIM (per esempio UPDDATTIM), in maschera utilizzare tipo dato &amp;quot;A&amp;quot; con lunghezza 19.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Data_ora&amp;diff=1108</id>
		<title>Data ora</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Data_ora&amp;diff=1108"/>
		<updated>2024-12-05T08:59:23Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Per ottenere la data corrente in una variabile Date si usa la funzione &amp;lt;code&amp;gt;date$&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Allo stesso modo per avere data e ora correnti in una variabile Datetime si usa la funzione &amp;lt;code&amp;gt;datetime$&amp;lt;/code&amp;gt; (solo dalla V7).&lt;br /&gt;
&lt;br /&gt;
La forma canonica per rappresentare data e ora con una stringa è:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;YYYY-MM-DDThh:mm:ssZ           #attenzione alle lettere &amp;quot;in più&amp;quot; T e Z&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data e ora hanno formato &amp;quot;YYYY-MM-DDThh:mm:ss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attenzione: la variabile &amp;lt;code&amp;gt;adxdcs&amp;lt;/code&amp;gt; contiene l'anno pivot, usato per capire a quale secolo fare riferimento (anno 41- &amp;gt; 1941 o 2041?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
num$(date$)                   #Per ottenere come stringa la data odierna&lt;br /&gt;
num$(time$)                   #Per ottenere come stringa l'ora corrente&lt;br /&gt;
num$(datetime$)               #Per ottenere come stringa canonica la data e ora odierna&lt;br /&gt;
gdat$(DAY,MONTH,YEAR)         #Per ottenere una data dati giorno, mese e anno&lt;br /&gt;
gdatetime$(str)               #Per ottenere una variabile Datetime da una stringa in forma canonica&lt;br /&gt;
year(data)                    #Per ottenere l'anno di una data&lt;br /&gt;
month(data)                   #Per ottenere il numero del mese di una data&lt;br /&gt;
month$(data)                  #Per ottenere il nome del mese di una data nella lingua corrente&lt;br /&gt;
day(data)                     #Per ottenere il numero del giorno del mese (1-31)&lt;br /&gt;
day$(data)                    #Per ottenere il nome del giorno della settimana&lt;br /&gt;
dayn(data)                    #Per ottenere il numero del giorno della settimana (1=lunedì, 7=domenica)&lt;br /&gt;
week(data)                    #Per ottenere il numero della settimana (1-53)&lt;br /&gt;
aweek(settimana,anno)         #Per ottenere il primo giorno (lunedì) della settimana specificata&lt;br /&gt;
nday(data)                    #Per ottenere il numero di giorni passati dal 1 gennaio 1600&lt;br /&gt;
nday$(NUM)                    #Per ottenere una data successiva di NUM giorni dal 1 gennaio 1600&lt;br /&gt;
eomonth(data)                 #Per ottenere l'ultimo giorno del mese di una data&lt;br /&gt;
addmonth(data,mesi)           #Per ottenere una data sommando n mesi alla data specificata&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ottenere come stringa con formato a piacere: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;format$(&amp;quot;D:YYYYMMDD[_]hhmmss&amp;quot;,date$)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il 31 dicembre 2018 alle 12.30 e 56 secondi corrisponderà a “20181231_123056”.&lt;br /&gt;
&lt;br /&gt;
Notare che per inserire uno spazio o altri elementi costanti si usano le parentesi quadre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;FORMATO = &amp;quot;DD[ ]MM[ ]YY&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Esempi ===&lt;br /&gt;
Eseguire anche delle semplici operazioni:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Date DATA,DATA1&lt;br /&gt;
DATA=[1/2/2015]+5         #DATA conterrà [06/02/2015]&lt;br /&gt;
DATA1=[1/2/2015]-1        #DATA conterrà [31/01/2015]&lt;br /&gt;
NUMGIORNI=DATA-DATA1      #giorni di differenza tra due date&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fare una conversione implicita da data a testo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Char DATA_STR(30)                 # dichiaro una stringa&lt;br /&gt;
Local Date DATA                         # dichiaro una data&lt;br /&gt;
DATA=[31/12/2019]                       # imposto una data iniziale&lt;br /&gt;
DATA_STR = DATA                         # conversione implicita: DATA_STR = &amp;quot;20191231&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conversione da data a stringa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;format$(&amp;quot;DD2&amp;quot;,date$)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ottenere ultimo giorno di un mese: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local date LASTDATE&lt;br /&gt;
LASTDATE = eomonth([1/2/2015])&lt;br /&gt;
Infbox num$(LASTDATE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ottenere come stringa formattata: usare AFNC.FDH, per esempio &amp;lt;code&amp;gt;func AFNC.FDH(date$,&amp;quot;121531&amp;quot;)&amp;lt;/code&amp;gt; restituirà, il primo giugno 2018: &amp;lt;code&amp;gt;01/06/18 12:15:31&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variabili globali contenenti stringhe di formattazione ==&lt;br /&gt;
Sono preimpostate in base alle varie parametrizzazioni predefinite.&lt;br /&gt;
Sono utili per mantenere uno standard che si adatta in base ai vari utenti, siti, ecc.&lt;br /&gt;
&lt;br /&gt;
L’ordine giorno-mese-anno di queste formattazioni dipende appunto dalla localizzazione e dalle impostazioni utente.&lt;br /&gt;
&lt;br /&gt;
Le variabili sono queste:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GFMDAT  = data standard, con 2 caratteri per giorno, 2 per il mese , 2 per l’anno&lt;br /&gt;
GFMDAT4 = data con l’anno a 4 cifre&lt;br /&gt;
GFMDAT3 = data con il mese espresso con tre lettere&lt;br /&gt;
GFMDAT9 = data con il mese scritto in lettere&lt;br /&gt;
GFMMOI  = mese-anno&lt;br /&gt;
GFMMOI4 = mese-anno con anno a 4 cifre&lt;br /&gt;
GFMJOU  = giorno-mese&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(per maggiori info dall'help di Sage, Riquadro sviluppo-&amp;gt;sottoprogrammi -&amp;gt;Modulo Supervisore)&lt;br /&gt;
&lt;br /&gt;
== Videate ==&lt;br /&gt;
Per visualizzare un campo che in tabella è di tipo ADATIM (per esempio UPDDATTIM), in maschera utilizzare tipo dato &amp;quot;A&amp;quot; con lunghezza 19.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Data_ora&amp;diff=1107</id>
		<title>Data ora</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Data_ora&amp;diff=1107"/>
		<updated>2024-12-05T08:56:50Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* Esempi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Per ottenere la data corrente in una variabile Date si usa la funzione &amp;lt;code&amp;gt;date$&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Allo stesso modo per avere data e ora correnti in una variabile Datetime si usa la funzione &amp;lt;code&amp;gt;datetime$&amp;lt;/code&amp;gt; (solo dalla V7).&lt;br /&gt;
&lt;br /&gt;
La forma canonica per rappresentare data e ora con una stringa è:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;YYYY-MM-DDThh:mm:ssZ           #attenzione alle lettere &amp;quot;in più&amp;quot; T e Z&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data e ora hanno formato &amp;quot;YYYY-MM-DDThh:mm:ss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attenzione: la variabile &amp;lt;code&amp;gt;adxdcs&amp;lt;/code&amp;gt; contiene l'anno pivot, usato per capire a quale secolo fare riferimento (anno 41- &amp;gt; 1941 o 2041?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
num$(date$)                   #Per ottenere come stringa la data odierna&lt;br /&gt;
num$(time$)                   #Per ottenere come stringa l'ora corrente&lt;br /&gt;
num$(datetime$)               #Per ottenere come stringa canonica la data e ora odierna&lt;br /&gt;
gdat$(DAY,MONTH,YEAR)         #Per ottenere una data dati giorno, mese e anno&lt;br /&gt;
gdatetime$(str)               #Per ottenere una variabile Datetime da una stringa in forma canonica&lt;br /&gt;
year(data)                    #Per ottenere l'anno di una data&lt;br /&gt;
month(data)                   #Per ottenere il numero del mese di una data&lt;br /&gt;
month$(data)                  #Per ottenere il nome del mese di una data nella lingua corrente&lt;br /&gt;
day(data)                     #Per ottenere il numero del giorno del mese (1-31)&lt;br /&gt;
day$(data)                    #Per ottenere il nome del giorno della settimana&lt;br /&gt;
dayn(data)                    #Per ottenere il numero del giorno della settimana (1=lunedì, 7=domenica)&lt;br /&gt;
week(data)                    #Per ottenere il numero della settimana (1-53)&lt;br /&gt;
aweek(settimana,anno)         #Per ottenere il primo giorno (lunedì) della settimana specificata&lt;br /&gt;
nday(data)                    #Per ottenere il numero di giorni passati dal 1 gennaio 1600&lt;br /&gt;
nday$(NUM)                    #Per ottenere una data successiva di NUM giorni dal 1 gennaio 1600&lt;br /&gt;
eomonth(data)                 #Per ottenere l'ultimo giorno del mese di una data&lt;br /&gt;
addmonth(data,mesi)           #Per ottenere una data sommando n mesi alla data specificata&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ottenere come stringa con formato a piacere: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;format$(&amp;quot;D:YYYYMMDD[_]hhmmss&amp;quot;,date$)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il 31 dicembre 2018 alle 12.30 e 56 secondi corrisponderà a “20181231_123056”.&lt;br /&gt;
&lt;br /&gt;
Notare che per inserire uno spazio o altri elementi costanti si usano le parentesi quadre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;FORMATO = &amp;quot;DD[ ]MM[ ]YY&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;format$(&amp;quot;DD2&amp;quot;,date$)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Esempi ===&lt;br /&gt;
Eseguire anche delle semplici operazioni:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Date DATA,DATA1&lt;br /&gt;
DATA=[1/2/2015]+5         #DATA conterrà [06/02/2015]&lt;br /&gt;
DATA1=[1/2/2015]-1        #DATA conterrà [31/01/2015]&lt;br /&gt;
NUMGIORNI=DATA-DATA1      #giorni di differenza tra due date&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fare una conversione implicita da data a testo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Char DATA_STR(30)                 # dichiaro una stringa&lt;br /&gt;
Local Date DATA                         # dichiaro una data&lt;br /&gt;
DATA=[31/12/2019]                       # imposto una data iniziale&lt;br /&gt;
DATA_STR = DATA                         # conversione implicita: DATA_STR = &amp;quot;20191231&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ottenere ultimo giorno di un mese: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local date LASTDATE&lt;br /&gt;
LASTDATE = eomonth([1/2/2015])&lt;br /&gt;
Infbox num$(LASTDATE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ottenere come stringa formattata: usare AFNC.FDH, per esempio &amp;lt;code&amp;gt;func AFNC.FDH(date$,&amp;quot;121531&amp;quot;)&amp;lt;/code&amp;gt; restituirà, il primo giugno 2018: &amp;lt;code&amp;gt;01/06/18 12:15:31&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variabili globali contenenti stringhe di formattazione ==&lt;br /&gt;
Sono preimpostate in base alle varie parametrizzazioni predefinite.&lt;br /&gt;
Sono utili per mantenere uno standard che si adatta in base ai vari utenti, siti, ecc.&lt;br /&gt;
&lt;br /&gt;
L’ordine giorno-mese-anno di queste formattazioni dipende appunto dalla localizzazione e dalle impostazioni utente.&lt;br /&gt;
&lt;br /&gt;
Le variabili sono queste:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GFMDAT  = data standard, con 2 caratteri per giorno, 2 per il mese , 2 per l’anno&lt;br /&gt;
GFMDAT4 = data con l’anno a 4 cifre&lt;br /&gt;
GFMDAT3 = data con il mese espresso con tre lettere&lt;br /&gt;
GFMDAT9 = data con il mese scritto in lettere&lt;br /&gt;
GFMMOI  = mese-anno&lt;br /&gt;
GFMMOI4 = mese-anno con anno a 4 cifre&lt;br /&gt;
GFMJOU  = giorno-mese&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(per maggiori info dall'help di Sage, Riquadro sviluppo-&amp;gt;sottoprogrammi -&amp;gt;Modulo Supervisore)&lt;br /&gt;
&lt;br /&gt;
== Videate ==&lt;br /&gt;
Per visualizzare un campo che in tabella è di tipo ADATIM (per esempio UPDDATTIM), in maschera utilizzare tipo dato &amp;quot;A&amp;quot; con lunghezza 19.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Data_ora&amp;diff=1106</id>
		<title>Data ora</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Data_ora&amp;diff=1106"/>
		<updated>2024-12-05T08:35:09Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Per ottenere la data corrente in una variabile Date si usa la funzione &amp;lt;code&amp;gt;date$&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Allo stesso modo per avere data e ora correnti in una variabile Datetime si usa la funzione &amp;lt;code&amp;gt;datetime$&amp;lt;/code&amp;gt; (solo dalla V7).&lt;br /&gt;
&lt;br /&gt;
La forma canonica per rappresentare data e ora con una stringa è:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;YYYY-MM-DDThh:mm:ssZ           #attenzione alle lettere &amp;quot;in più&amp;quot; T e Z&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data e ora hanno formato &amp;quot;YYYY-MM-DDThh:mm:ss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attenzione: la variabile &amp;lt;code&amp;gt;adxdcs&amp;lt;/code&amp;gt; contiene l'anno pivot, usato per capire a quale secolo fare riferimento (anno 41- &amp;gt; 1941 o 2041?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
num$(date$)                   #Per ottenere come stringa la data odierna&lt;br /&gt;
num$(time$)                   #Per ottenere come stringa l'ora corrente&lt;br /&gt;
num$(datetime$)               #Per ottenere come stringa canonica la data e ora odierna&lt;br /&gt;
gdat$(DAY,MONTH,YEAR)         #Per ottenere una data dati giorno, mese e anno&lt;br /&gt;
gdatetime$(str)               #Per ottenere una variabile Datetime da una stringa in forma canonica&lt;br /&gt;
year(data)                    #Per ottenere l'anno di una data&lt;br /&gt;
month(data)                   #Per ottenere il numero del mese di una data&lt;br /&gt;
month$(data)                  #Per ottenere il nome del mese di una data nella lingua corrente&lt;br /&gt;
day(data)                     #Per ottenere il numero del giorno del mese (1-31)&lt;br /&gt;
day$(data)                    #Per ottenere il nome del giorno della settimana&lt;br /&gt;
dayn(data)                    #Per ottenere il numero del giorno della settimana (1=lunedì, 7=domenica)&lt;br /&gt;
week(data)                    #Per ottenere il numero della settimana (1-53)&lt;br /&gt;
aweek(settimana,anno)         #Per ottenere il primo giorno (lunedì) della settimana specificata&lt;br /&gt;
nday(data)                    #Per ottenere il numero di giorni passati dal 1 gennaio 1600&lt;br /&gt;
nday$(NUM)                    #Per ottenere una data successiva di NUM giorni dal 1 gennaio 1600&lt;br /&gt;
eomonth(data)                 #Per ottenere l'ultimo giorno del mese di una data&lt;br /&gt;
addmonth(data,mesi)           #Per ottenere una data sommando n mesi alla data specificata&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ottenere come stringa con formato a piacere: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;format$(&amp;quot;D:YYYYMMDD[_]hhmmss&amp;quot;,date$)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il 31 dicembre 2018 alle 12.30 e 56 secondi corrisponderà a “20181231_123056”.&lt;br /&gt;
&lt;br /&gt;
Notare che per inserire uno spazio o altri elementi costanti si usano le parentesi quadre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;FORMATO = &amp;quot;DD[ ]MM[ ]YY&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;format$(&amp;quot;DD2&amp;quot;,date$)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Esempi ===&lt;br /&gt;
Eseguire anche delle semplici operazioni:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Date DATA,DATA1&lt;br /&gt;
DATA=[1/2/2015]+5        #DATA conterrà [06/02/2015]&lt;br /&gt;
DATA1=[1/2/2015]-1        #DATA conterrà [31/01/2015]&lt;br /&gt;
NUMGIORNI=DATA-DATA1      #giorni di differenza tra due date&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fare una conversione implicita da data a testo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Char DATA_STR(30)                 # dichiaro una stringa&lt;br /&gt;
Local Date DATA                         # dichiaro una data&lt;br /&gt;
DATA=[31/12/2019]                       # imposto una data iniziale&lt;br /&gt;
DATA_STR = DATA                         # conversione implicita: DATA_STR = &amp;quot;20191231&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ottenere ultimo giorno di un mese: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local date LASTDATE&lt;br /&gt;
LASTDATE = eomonth([1/2/2015])&lt;br /&gt;
Infbox num$(LASTDATE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ottenere come stringa formattata: usare AFNC.FDH, per esempio &amp;lt;code&amp;gt;func AFNC.FDH(date$,&amp;quot;121531&amp;quot;)&amp;lt;/code&amp;gt; restituirà, il primo giugno 2018: &amp;lt;code&amp;gt;01/06/18 12:15:31&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variabili globali contenenti stringhe di formattazione ==&lt;br /&gt;
Sono preimpostate in base alle varie parametrizzazioni predefinite.&lt;br /&gt;
Sono utili per mantenere uno standard che si adatta in base ai vari utenti, siti, ecc.&lt;br /&gt;
&lt;br /&gt;
L’ordine giorno-mese-anno di queste formattazioni dipende appunto dalla localizzazione e dalle impostazioni utente.&lt;br /&gt;
&lt;br /&gt;
Le variabili sono queste:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GFMDAT  = data standard, con 2 caratteri per giorno, 2 per il mese , 2 per l’anno&lt;br /&gt;
GFMDAT4 = data con l’anno a 4 cifre&lt;br /&gt;
GFMDAT3 = data con il mese espresso con tre lettere&lt;br /&gt;
GFMDAT9 = data con il mese scritto in lettere&lt;br /&gt;
GFMMOI  = mese-anno&lt;br /&gt;
GFMMOI4 = mese-anno con anno a 4 cifre&lt;br /&gt;
GFMJOU  = giorno-mese&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(per maggiori info dall'help di Sage, Riquadro sviluppo-&amp;gt;sottoprogrammi -&amp;gt;Modulo Supervisore)&lt;br /&gt;
&lt;br /&gt;
== Videate ==&lt;br /&gt;
Per visualizzare un campo che in tabella è di tipo ADATIM (per esempio UPDDATTIM), in maschera utilizzare tipo dato &amp;quot;A&amp;quot; con lunghezza 19.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Crystal_Report&amp;diff=1105</id>
		<title>Crystal Report</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Crystal_Report&amp;diff=1105"/>
		<updated>2024-12-05T08:23:50Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Le istruzioni devono terminare con un &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;, eccetto l'ultima per cui è facoltativo. L'ultima istruzione rappresenta il valore di ritorno di una formula.&lt;br /&gt;
&lt;br /&gt;
In caso di istruzioni raggruppate con parentesi tonde (come per esempio negli &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;), tale gruppo rappresenta un'istruzione e in caso di istruizioni successive deve anch'esso essere seguito da un &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Condizioni ==&lt;br /&gt;
&lt;br /&gt;
if &amp;lt;condition&amp;gt; &lt;br /&gt;
then &amp;lt;then&amp;gt; &lt;br /&gt;
else &amp;lt;else&amp;gt; &lt;br /&gt;
&lt;br /&gt;
dove &amp;lt;condition&amp;gt;, &amp;lt;then&amp;gt; e &amp;lt;else&amp;gt; sono tutte espressioni singole. Se dopo &amp;lt;then&amp;gt; o &amp;lt;else&amp;gt; sono presenti più espressioni, convertirle in singole espressioni racchiudendole tra parentesi. Ad esempio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if {SDELIVERY_1.YSDHNUM_0}&amp;lt;&amp;gt;&amp;quot;&amp;quot; then&lt;br /&gt;
(&lt;br /&gt;
  lastValue := {Branch_View.Branch_ID};&lt;br /&gt;
  crRed;&lt;br /&gt;
)&lt;br /&gt;
else&lt;br /&gt;
  lastValue := {Branch_View.Branch_ID};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condizioni particolari ===&lt;br /&gt;
&lt;br /&gt;
Se un testo deve comparire solo se è l'ultimo record di dettaglio dell'ordine, per esempio la dicitura &amp;quot;NON APPROVATO&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (OnLastRecord or (Next({PORDER.POHNUM_0}) &amp;lt;&amp;gt; {PORDER.POHNUM_0})) then&lt;br /&gt;
    //siamo dopo l'ultimo record di dettaglio dell'ordine&lt;br /&gt;
    if {PORDER.APPFLG_0}&amp;gt;=3 then&lt;br /&gt;
        //l'ordine è stato approvato, quindi sopprimo questa sezione&lt;br /&gt;
        true&lt;br /&gt;
    else&lt;br /&gt;
        //l'ordine NON è stato approvato, quindi questa sezione deve comparire, NON devo sopprimerla&lt;br /&gt;
        false&lt;br /&gt;
else &lt;br /&gt;
// non è l'ultimo record dell'ordine; sopprimo la sezione&lt;br /&gt;
    true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per far comparire un'intestazione solo sulla prima pagina del gruppo, mettere nella condizione Sopprimi della sezione l'istruzione:&lt;br /&gt;
&amp;lt;pre&amp;gt;InRepeatedGroupHeader&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per far comparire qualcosa solo nell'ultima pagina, mettere nella condizione Ometti:&lt;br /&gt;
&amp;lt;pre&amp;gt;PageNumber &amp;lt;&amp;gt; TotalPageCount&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversioni ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Totext(number)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trasforma una variabile numerica in testo: 100 -&amp;gt;&amp;quot;100&amp;quot;&lt;br /&gt;
Stessa cosa di Cstr()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ToWord(NUmero, decimali)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
trasforma un numero nella sua rappresentazione in lettere: 110-&amp;gt; &amp;quot;centodieci&amp;quot;-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;AmountToWord(Dossier, Lingua, CodiceValuta, Importo)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
permette di convertire in lettere nella lingua voluta, un importo numerico&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;AmountToDigit(Dossier, Lingua, CodiceValuta, ImportoInLettere&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
permette di convertire in lettere nella lingua voluta, un importo espresso in stringa numerica&lt;br /&gt;
&lt;br /&gt;
== Formule ==&lt;br /&gt;
Per inserire un a capo in una stringa:&lt;br /&gt;
&amp;lt;code&amp;gt;testo := testo &amp;amp; ChrW (10)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per inserire una formula in un'altra formula usare la sintassi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{@ySageDev_Formula}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esempio: &amp;lt;code&amp;gt;RiferimentoDDT := RiferimentoDDT &amp;amp; &amp;quot;  -  &amp;quot; &amp;amp; {@ySageDev_RiferimentoPCKLIST}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempio di indirizzo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
whilePrintingRecords;&lt;br /&gt;
global stringVar Indirizzo;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Indirizzo:=  trim({SORDER.BPDADDLIG_0}) &amp;amp; &amp;quot;  &amp;quot; &amp;amp; trim({SORDER.BPDADDLIG_1});&lt;br /&gt;
&lt;br /&gt;
if trim({SORDER.BPDADDLIG_2})&amp;lt;&amp;gt;&amp;quot;&amp;quot;  then &lt;br /&gt;
    Indirizzo:=  Indirizzo &amp;amp; chrw(10) &amp;amp; chrw(13) &amp;amp; trim({SORDER.BPDADDLIG_2});&lt;br /&gt;
&lt;br /&gt;
Indirizzo:=  Indirizzo &amp;amp; chrw(10) &amp;amp; chrw(13) &amp;amp; {SORDER.BPDPOSCOD_0} &amp;amp; &amp;quot;  &amp;quot; &amp;amp; {SORDER.BPDCTY_0} &amp;amp; &amp;quot;  &amp;quot; &amp;amp; {SORDER.BPDCRYNAM_0};&lt;br /&gt;
//&amp;amp; {SORDER.BPDSAT_0} &lt;br /&gt;
//&amp;amp; {SORDER.BPDCRY_0}&lt;br /&gt;
&lt;br /&gt;
Indirizzo:=  Indirizzo &amp;amp; chrw(10) &amp;amp; chrw(13) &amp;amp; {SORDER.BPDPOSCOD_0} &amp;amp; &amp;quot;  &amp;quot; &amp;amp; {SORDER.BPDCTY_0} &amp;amp; &amp;quot;  &amp;quot; &amp;amp; {SORDER.BPDCRYNAM_0};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Momento di valutazione ===&lt;br /&gt;
&lt;br /&gt;
BeforeReadingRecords: prima di recuperare i record dal database&lt;br /&gt;
WhileReadingRecords: durante la lettura dei record del database ma prima del raggruppamento, dell’ordinamento e del riepilogo &lt;br /&gt;
WhilePrintingRecords: durante la stampa dei record (raggruppamento, ordinmento e riepilogo)&lt;br /&gt;
EvaluateAfter()&lt;br /&gt;
&lt;br /&gt;
== Formato Date ==&lt;br /&gt;
Se il valore data è in un campo:&lt;br /&gt;
ToText({MYFIELDNAME }, &amp;quot;dd-MMM-yyyy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Se è il risultato di una formula:&lt;br /&gt;
CSTR({?@ck_date}, &amp;quot;dddd, MMMM d, yyyy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
ToText({Command.EffectiveDate} , &amp;quot;dd-MM-yyyy hh:mm:ss&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
I vari formati d dd ddd dddd M MM MMM MMMM yy yyyy&lt;br /&gt;
&lt;br /&gt;
== Barcode ==&lt;br /&gt;
Vai qui: [[CrystalReport_Barcode | Barcode]]&lt;br /&gt;
&lt;br /&gt;
== Traduzioni ==&lt;br /&gt;
=== Avviso ===&lt;br /&gt;
Le formule qui esposte di Crystal Repor recuperano le traduzioni dai file &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\DOSSIERS\&amp;lt;nome dossier&amp;gt;\textraita&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(se italiano) oppure &amp;lt;code&amp;gt;textrafra&amp;lt;/code&amp;gt; se francese, ecc. &lt;br /&gt;
&lt;br /&gt;
Affinché questi file siano aggiornati (quindi ogni volta dopo modifiche su campi di tipo AXX) e’ necessario eseguire la funzione di aggiornamento:&lt;br /&gt;
&lt;br /&gt;
'''''Sviluppo-&amp;gt;Strumenti-&amp;gt;Diversi-&amp;gt;Aggiornamento Testi traducibili'''''&lt;br /&gt;
&lt;br /&gt;
Le tabelle contenenti i campi traducibili usati in Crystal devono avere il '''flag &amp;quot;Generazione testi traducibili&amp;quot;''' attivo.&lt;br /&gt;
&lt;br /&gt;
=== Testi traducibili (tabella ATEXTRA) ===&lt;br /&gt;
;X3TranslatedText&lt;br /&gt;
(Questa funzione è contenuta nella libreria u212ltext.dll)&lt;br /&gt;
&lt;br /&gt;
Per recuperare una traduzione dalla tabella '''''ATEXTRA''''' utilizzare la seguente sintassi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;stringVar X3TEX := &amp;quot;NOMETABELLA~NOMECAMPO~&amp;quot;+VALORECAMPO+&amp;quot;~~&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In caso di dubbi verificare direttamente nella tabella ATEXTRA i vari campi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;stringVar X3TEX := &amp;quot;CODFIC_0~ZONE_0~IDENT1_0~IDENT2_0~&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempio:&lt;br /&gt;
&amp;lt;pre&amp;gt;stringVar X3TEX := &amp;quot;TABCOUNTRY~CRYDES~&amp;quot;+{SINVOICEV.BPDCRY_0}+&amp;quot;~~&amp;quot;;&lt;br /&gt;
stringVar PaeseTradotto := X3TranslatedText ({?X3DOS}, lang_trad, X3TEX);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Altro esempio con il testo da recuperare che consiste in un valore di una '''tabella diversa''' (vedi funzione '''''GESADI''''' da F7 in sage):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WhilePrintingRecords;&lt;br /&gt;
stringVar X3TEX := &amp;quot;ATABDIV~LNGDES~20~&amp;quot;+{SORDERP.TSICOD_0}+&amp;quot;~&amp;quot;;&lt;br /&gt;
X3TranslatedText ({?X3DOS}, {@P_lang_trad},X3TEX)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Invece di ''LNGDES'' mettere ''SHODES'' se si vuole la descrizione breve.&lt;br /&gt;
&lt;br /&gt;
=== Menù locali (tabella APLSTD) ===&lt;br /&gt;
;TextOfChapter (accesso diretto, con i numeri)&lt;br /&gt;
&lt;br /&gt;
Nella formula '''''TextOfChapter''''' si trovano in genere tutte le istruzioni per recuperare le traduzioni necessarie, con righe del tipo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;global stringVar txtcondiV1 := TextOfChapter ({?X3DOS},   lang_trad,2281,50);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove lang_trad è la variabile che contiene la lingua in cui tradurre, 2281 è il capitolo del menu (vedi funzione '''''TXT''''' da F7 in sage), e 50 è l'indice del testo da recuperare.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;TextForCode (con nome campo)&lt;br /&gt;
Per recuperare la descrizione associata ad un valore di menu locale (nella lingua dell'utente):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TextForCode(&amp;quot;Dossier;server;porta;versione&amp;quot;, &amp;quot;Tabella.Campo&amp;quot;, Valore)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per recuperare una traduzione nella lingua voluta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TranslatedTextForCode( Dossier, Lingua, &amp;quot;Tabella.Campo&amp;quot;, Valore)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esempio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TranslatedTextForCode( {?X3DOS}, {?X3LAN}, &amp;quot;{ITMMASTER.STOMGTCOD_0}&amp;quot;, ITMMASTER.STOMGTCOD_0 )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formattazioni ==&lt;br /&gt;
&lt;br /&gt;
=== Stili ===&lt;br /&gt;
&lt;br /&gt;
Costanti di stile delle linea: si possono usare all'interno delle formule&lt;br /&gt;
&lt;br /&gt;
* ''crNoLine''  Nessuna linea di bordo&lt;br /&gt;
* ''crSingleLine''  Una sola linea di bordo&lt;br /&gt;
* ''crDoubleLine''  Doppia linea di bordo &lt;br /&gt;
* ''crDashedLine''  Linea di bordo tratteggiata&lt;br /&gt;
* ''crDottedLine''  Linea di bordo punteggiata&lt;br /&gt;
&lt;br /&gt;
== Connessione ODBC ==&lt;br /&gt;
&lt;br /&gt;
Da esperto database, tab Dati, su Connessioni personali, cliccare sul + della connessione voluta; nella finestra che esce:&lt;br /&gt;
* selezionare l'origine dati voluta e cliccare AVANTI&lt;br /&gt;
* come ID utente mettere il nome del dossier (attenzione a maiuscolo/minuscolo)&lt;br /&gt;
* cliccare FINE e attendere che il db compaia sotto la connessione personale scelta&lt;br /&gt;
* inserire la solita password&lt;br /&gt;
&lt;br /&gt;
=== Usare una direttamente  query ===&lt;br /&gt;
&lt;br /&gt;
Se si vuole usare una direttamente una query bisogna aggiungere un comando:&lt;br /&gt;
&lt;br /&gt;
[[File:Crystal Report Query.png]]&lt;br /&gt;
&lt;br /&gt;
== Cause di lentezza ==&lt;br /&gt;
&lt;br /&gt;
* una possibile causa di estrema lentezza può essere un'istruzione &amp;quot;WhilePrintingReports&amp;quot; su un campo di dettaglio; meglio puntare su una vista ben relazionata che risolve molte cose in modo più performante.&lt;br /&gt;
&lt;br /&gt;
== Pagine in appendice (tipo Termini e Condizioni) ==&lt;br /&gt;
&lt;br /&gt;
Impostare in &amp;quot;Piè di pagina Report&amp;quot;, &amp;quot;Nuova pagina prima&amp;quot; (da &amp;quot;Esperto sezione&amp;quot;, selezionare &amp;quot;Piè di pagina Report&amp;quot; , scheda &amp;quot;Paging&amp;quot;). &lt;br /&gt;
Scrivi la tua appendice nella sezione &amp;quot;Piè di pagina Report&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Se c'è già una sezione &amp;quot;Piè di pagina Report&amp;quot;, aggiungere una sottosezione e impostare questa come appena detto.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Crystal_Report&amp;diff=1104</id>
		<title>Crystal Report</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Crystal_Report&amp;diff=1104"/>
		<updated>2024-12-05T08:22:40Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Le istruzioni devono terminare con un &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;, eccetto l'ultima per cui è facoltativo. L'ultima istruzione rappresenta il valore di ritorno di una formula.&lt;br /&gt;
&lt;br /&gt;
In caso di istruzioni raggruppate con parentesi tonde (come per esempio negli &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;), tale gruppo rappresenta un'istruzione e in caso di istruizioni successive deve anch'esso essere seguito da un &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Condizioni ==&lt;br /&gt;
&lt;br /&gt;
if &amp;lt;condition&amp;gt; &lt;br /&gt;
then &amp;lt;then&amp;gt; &lt;br /&gt;
else &amp;lt;else&amp;gt; &lt;br /&gt;
&lt;br /&gt;
dove &amp;lt;condition&amp;gt;, &amp;lt;then&amp;gt; e &amp;lt;else&amp;gt; sono tutte espressioni singole. Se dopo &amp;lt;then&amp;gt; o &amp;lt;else&amp;gt; sono presenti più espressioni, convertirle in singole espressioni racchiudendole tra parentesi. Ad esempio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if {SDELIVERY_1.YSDHNUM_0}&amp;lt;&amp;gt;&amp;quot;&amp;quot; then&lt;br /&gt;
(&lt;br /&gt;
  lastValue := {Branch_View.Branch_ID};&lt;br /&gt;
  crRed;&lt;br /&gt;
)&lt;br /&gt;
else&lt;br /&gt;
  lastValue := {Branch_View.Branch_ID};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condizioni particolari ===&lt;br /&gt;
&lt;br /&gt;
Se un testo deve comparire solo se è l'ultimo record di dettaglio dell'ordine, per esempio la dicitura &amp;quot;NON APPROVATO&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (OnLastRecord or (Next({PORDER.POHNUM_0}) &amp;lt;&amp;gt; {PORDER.POHNUM_0})) then&lt;br /&gt;
    //siamo dopo l'ultimo record di dettaglio dell'ordine&lt;br /&gt;
    if {PORDER.APPFLG_0}&amp;gt;=3 then&lt;br /&gt;
        //l'ordine è stato approvato, quindi sopprimo questa sezione&lt;br /&gt;
        true&lt;br /&gt;
    else&lt;br /&gt;
        //l'ordine NON è stato approvato, quindi questa sezione deve comparire, NON devo sopprimerla&lt;br /&gt;
        false&lt;br /&gt;
else &lt;br /&gt;
// non è l'ultimo record dell'ordine; sopprimo la sezione&lt;br /&gt;
    true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per far comparire un'intestazione solo sulla prima pagina del gruppo, mettere nella condizione Sopprimi della sezione l'istruzione:&lt;br /&gt;
&amp;lt;pre&amp;gt;InRepeatedGroupHeader&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per far comparire qualcosa solo nell'ultima pagina, mettere nella condizione Ometti:&lt;br /&gt;
&amp;lt;pre&amp;gt;PageNumber &amp;lt;&amp;gt; TotalPageCount&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversioni ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Totext(number)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trasforma una variabile numerica in testo: 100 -&amp;gt;&amp;quot;100&amp;quot;&lt;br /&gt;
Stessa cosa di Cstr()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ToWord(NUmero, decimali)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
trasforma un numero nella sua rappresentazione in lettere: 110-&amp;gt; &amp;quot;centodieci&amp;quot;-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;AmountToWord(Dossier, Lingua, CodiceValuta, Importo)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
permette di convertire in lettere nella lingua voluta, un importo numerico&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;AmountToDigit(Dossier, Lingua, CodiceValuta, ImportoInLettere&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
permette di convertire in lettere nella lingua voluta, un importo espresso in stringa numerica&lt;br /&gt;
&lt;br /&gt;
== Formule ==&lt;br /&gt;
Per inserire un a capo in una stringa:&lt;br /&gt;
&amp;lt;code&amp;gt;testo := testo &amp;amp; ChrW (10)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per inserire una formula in un'altra formula usare la sintassi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{@ySageDev_Formula}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esempio: &amp;lt;code&amp;gt;RiferimentoDDT := RiferimentoDDT &amp;amp; &amp;quot;  -  &amp;quot; &amp;amp; {@ySageDev_RiferimentoPCKLIST}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempio di indirizzo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
whilePrintingRecords;&lt;br /&gt;
global stringVar Indirizzo;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Indirizzo:=  trim({SORDER.BPDADDLIG_0}) &amp;amp; &amp;quot;  &amp;quot; &amp;amp; trim({SORDER.BPDADDLIG_1});&lt;br /&gt;
&lt;br /&gt;
if trim({SORDER.BPDADDLIG_2})&amp;lt;&amp;gt;&amp;quot;&amp;quot;  then &lt;br /&gt;
    Indirizzo:=  Indirizzo &amp;amp; chrw(10) &amp;amp; chrw(13) &amp;amp; trim({SORDER.BPDADDLIG_2});&lt;br /&gt;
&lt;br /&gt;
Indirizzo:=  Indirizzo &amp;amp; chrw(10) &amp;amp; chrw(13) &amp;amp; {SORDER.BPDPOSCOD_0} &amp;amp; &amp;quot;  &amp;quot; &amp;amp; {SORDER.BPDCTY_0} &amp;amp; &amp;quot;  &amp;quot; &amp;amp; {SORDER.BPDCRYNAM_0};&lt;br /&gt;
//&amp;amp; {SORDER.BPDSAT_0} &lt;br /&gt;
//&amp;amp; {SORDER.BPDCRY_0}&lt;br /&gt;
&lt;br /&gt;
Indirizzo:=  Indirizzo &amp;amp; chrw(10) &amp;amp; chrw(13) &amp;amp; {SORDER.BPDPOSCOD_0} &amp;amp; &amp;quot;  &amp;quot; &amp;amp; {SORDER.BPDCTY_0} &amp;amp; &amp;quot;  &amp;quot; &amp;amp; {SORDER.BPDCRYNAM_0};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Momento di valutazione ===&lt;br /&gt;
&lt;br /&gt;
BeforeReadingRecords: prima di recuperare i record dal database&lt;br /&gt;
WhileReadingRecords: durante la lettura dei record del database ma prima del raggruppamento, dell’ordinamento e del riepilogo &lt;br /&gt;
WhilePrintingRecords: durante la stampa dei record (raggruppamento, ordinmento e riepilogo)&lt;br /&gt;
EvaluateAfter()&lt;br /&gt;
&lt;br /&gt;
== Formato Date ==&lt;br /&gt;
Se il valore data è in un campo:&lt;br /&gt;
ToText({MYFIELDNAME }, &amp;quot;dd-MMM-yyyy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Se è il risultato di una formula:&lt;br /&gt;
CSTR({?@ck_date}, &amp;quot;dddd, MMMM d, yyyy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
ToText({Command.EffectiveDate} , &amp;quot;dd-MM-yyyy hh:mm:ss&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
I vari formati d dd ddd dddd M MM MMM MMMM yy yyyy&lt;br /&gt;
&lt;br /&gt;
== Barcode ==&lt;br /&gt;
Vai qui: [[CrystalReport_Barcode | Barcode]]&lt;br /&gt;
&lt;br /&gt;
== Traduzioni ==&lt;br /&gt;
=== Avviso ===&lt;br /&gt;
Le formule qui esposte di Crystal Repor recuperano le traduzioni dai file &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\DOSSIERS\&amp;lt;nome dossier&amp;gt;\textraita&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(se italiano) oppure &amp;lt;code&amp;gt;textrafra&amp;lt;/code&amp;gt; se francese, ecc. &lt;br /&gt;
&lt;br /&gt;
Affinché questi file siano aggiornati (quindi ogni volta dopo modifiche su campi di tipo AXX) e’ necessario eseguire la funzione di aggiornamento:&lt;br /&gt;
&lt;br /&gt;
'''''Sviluppo-&amp;gt;Strumenti-&amp;gt;Diversi-&amp;gt;Aggiornamento Testi traducibili'''''&lt;br /&gt;
&lt;br /&gt;
Le tabelle contenenti i campi traducibili usati in Crystal devono avere il '''flag &amp;quot;Generazione testi traducibili&amp;quot;''' attivo.&lt;br /&gt;
&lt;br /&gt;
=== Testi traducibili (tabella ATEXTRA) ===&lt;br /&gt;
;X3TranslatedText&lt;br /&gt;
(Questa funzione è contenuta nella libreria u212ltext.dll)&lt;br /&gt;
&lt;br /&gt;
Per recuperare una traduzione dalla tabella '''''ATEXTRA''''' utilizzare la seguente sintassi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;stringVar X3TEX := &amp;quot;NOMETABELLA~NOMECAMPO~&amp;quot;+VALORECAMPO+&amp;quot;~~&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In caso di dubbi verificare direttamente nella tabella ATEXTRA i vari campi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;stringVar X3TEX := &amp;quot;CODFIC_0~ZONE_0~IDENT1_0~IDENT2_0~&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempio:&lt;br /&gt;
&amp;lt;pre&amp;gt;stringVar X3TEX := &amp;quot;TABCOUNTRY~CRYDES~&amp;quot;+{SINVOICEV.BPDCRY_0}+&amp;quot;~~&amp;quot;;&lt;br /&gt;
stringVar PaeseTradotto := X3TranslatedText ({?X3DOS}, lang_trad, X3TEX);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Altro esempio con il testo da recuperare che consiste in un valore di una '''tabella diversa''' (vedi funzione '''''GESADI''''' da F7 in sage):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WhilePrintingRecords;&lt;br /&gt;
stringVar X3TEX := &amp;quot;ATABDIV~LNGDES~20~&amp;quot;+{SORDERP.TSICOD_0}+&amp;quot;~&amp;quot;;&lt;br /&gt;
X3TranslatedText ({?X3DOS}, {@P_lang_trad},X3TEX)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Invece di ''LNGDES'' mettere ''SHODES'' se si vuole la descrizione breve.&lt;br /&gt;
&lt;br /&gt;
=== Menù locali (tabella APLSTD) ===&lt;br /&gt;
;TextOfChapter (accesso diretto, con i numeri)&lt;br /&gt;
&lt;br /&gt;
Nella formula '''''TextOfChapter''''' si trovano in genere tutte le istruzioni per recuperare le traduzioni necessarie, con righe del tipo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;global stringVar txtcondiV1 := TextOfChapter ({?X3DOS},   lang_trad,2281,50);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove lang_trad è la variabile che contiene la lingua in cui tradurre, 2281 è il capitolo del menu (vedi funzione '''''TXT''''' da F7 in sage), e 50 è l'indice del testo da recuperare.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;TextForCode (con nome campo)&lt;br /&gt;
Per recuperare la descrizione associata ad un valore di menu locale (nella lingua dell'utente):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TextForCode(&amp;quot;Dossier;server;porta;versione&amp;quot;, &amp;quot;Tabella.Campo&amp;quot;, Valore)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per recuperare una traduzione nella lingua voluta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TranslatedTextForCode( Dossier, Lingua, &amp;quot;Tabella.Campo&amp;quot;, Valore)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esempio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TranslatedTextForCode( {?X3DOS}, {?X3LAN}, &amp;quot;{ITMMASTER.STOMGTCOD_0}&amp;quot;, ITMMASTER.STOMGTCOD_0 )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formattazioni ==&lt;br /&gt;
&lt;br /&gt;
=== Stili ===&lt;br /&gt;
&lt;br /&gt;
Costanti di stile delle linea: si possono usare all'interno delle formule&lt;br /&gt;
&lt;br /&gt;
* ''crNoLine''  Nessuna linea di bordo&lt;br /&gt;
* ''crSingleLine''  Una sola linea di bordo&lt;br /&gt;
* ''crDoubleLine''  Doppia linea di bordo &lt;br /&gt;
* ''crDashedLine''  Linea di bordo tratteggiata&lt;br /&gt;
* ''crDottedLine''  Linea di bordo punteggiata&lt;br /&gt;
&lt;br /&gt;
== Connessione ODBC ==&lt;br /&gt;
&lt;br /&gt;
Da esperto database, tab Dati, su Connessioni personali, cliccare sul + della connessione voluta; nella finestra che esce:&lt;br /&gt;
* selezionare l'origine dati voluta e cliccare AVANTI&lt;br /&gt;
* come ID utente mettere il nome del dossier (attenzione a maiuscolo/minuscolo)&lt;br /&gt;
* cliccare FINE e attendere che il db compaia sotto la connessione personale scelta&lt;br /&gt;
* inserire la solita password&lt;br /&gt;
&lt;br /&gt;
=== Usare una direttamente  query ===&lt;br /&gt;
&lt;br /&gt;
Se si vuole usare una direttamente una query bisogna aggiungere un comando :&lt;br /&gt;
[[File:Crystal Report Query.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
== Cause di lentezza ==&lt;br /&gt;
&lt;br /&gt;
* una possibile causa di estrema lentezza può essere un'istruzione &amp;quot;WhilePrintingReports&amp;quot; su un campo di dettaglio; meglio puntare su una vista ben relazionata che risolve molte cose in modo più performante.&lt;br /&gt;
&lt;br /&gt;
== Pagine in appendice (tipo Termini e Condizioni) ==&lt;br /&gt;
&lt;br /&gt;
Impostare in &amp;quot;Piè di pagina Report&amp;quot;, &amp;quot;Nuova pagina prima&amp;quot; (da &amp;quot;Esperto sezione&amp;quot;, selezionare &amp;quot;Piè di pagina Report&amp;quot; , scheda &amp;quot;Paging&amp;quot;). &lt;br /&gt;
Scrivi la tua appendice nella sezione &amp;quot;Piè di pagina Report&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Se c'è già una sezione &amp;quot;Piè di pagina Report&amp;quot;, aggiungere una sottosezione e impostare questa come appena detto.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:Crystal_Report_Query.png&amp;diff=1103</id>
		<title>File:Crystal Report Query.png</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:Crystal_Report_Query.png&amp;diff=1103"/>
		<updated>2024-12-05T08:19:27Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How to use a query in Crystal report&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Variabili_globali&amp;diff=426</id>
		<title>Variabili globali</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Variabili_globali&amp;diff=426"/>
		<updated>2021-07-22T12:58:58Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* Variabili speciali */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Variabili globali ==&lt;br /&gt;
Ci sono delle variabili definite globalmente che permettono di gestire le diverse condizioni che sovvengono nelle varie fasi di esecuzione del codice.&lt;br /&gt;
&lt;br /&gt;
Per vederle tutte vai alla funzione [[GESAGB]].&lt;br /&gt;
&lt;br /&gt;
* '''GREP''': &lt;br /&gt;
*# vuoto,&amp;quot;&amp;quot;, quando l'utente sta visualizzando i dati&lt;br /&gt;
*# vale &amp;quot;C&amp;quot; se siamo in creazione (quando viene premuto il pulsante &amp;lt;code&amp;gt;Crea&amp;lt;/code&amp;gt;)&lt;br /&gt;
*# vale &amp;quot;M&amp;quot; se siamo in visualizzazione/modifica (quando è attivo e viene premuto il pulsante &amp;lt;code&amp;gt;Registra&amp;lt;/code&amp;gt;)&lt;br /&gt;
*# vale &amp;quot;D&amp;quot; se siamo in duplicazione (quando viene premuto il pulsante &amp;lt;code&amp;gt;Duplica&amp;lt;/code&amp;gt;)&lt;br /&gt;
*# vale &amp;quot;A&amp;quot; se siamo in annullamento (quando viene premuto il pulsante &amp;lt;code&amp;gt;Annulla&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''GIMPORT''': variabile utilizzata per gestire la fase di [[ImportExport|importazione/esportazione]]; se vale 1 vuol dire che si è in fase di importazione/esportazione&lt;br /&gt;
* '''GIMP()''': vedi [[ImportExport#Programmazione| Programmazione per Import/Export]]&lt;br /&gt;
* '''GSILENCE''': se vale 0 indica che sono abilitati i messaggi di errore; quando viene impostata a 1 l'utente non vedrà più tali messaggi; utile in programmi non interattivi, va poi rimessa a 0&lt;br /&gt;
* '''GERR''': indica/imposta se c'è un messaggio d'errore&lt;br /&gt;
*# 1: messaggio d'errore&lt;br /&gt;
*# 2: messaggio informativo&lt;br /&gt;
*# 3: messaggio di avviso&lt;br /&gt;
*# 4: messaggio in fondo alla videata&lt;br /&gt;
* '''GMESSAGE''': contiene un eventuale messaggio di errore&lt;br /&gt;
* '''GSERVEUR''': indica se l'esecuzione è in modalità interattiva o batch (0 interattivo, 1 batch); se in batch non si creano file di log&lt;br /&gt;
* '''GWEBSERV''': indica modalità Web Services&lt;br /&gt;
* '''GUSER''': codice utente corrente&lt;br /&gt;
* '''GNOMUSER''': nome utente corrente&lt;br /&gt;
* '''GPROFIL''': profilo funzione &lt;br /&gt;
* '''GTRACE''': indica il nome del file traccia attivo, vuoto se non c'è un file di traccia attivo (vedi [[Gestione tracce]])&lt;br /&gt;
* '''GFONCTION''': indica la funzione corrente&lt;br /&gt;
* '''GFONCTION1''': indica la funzione chiamante solo in caso di tunnel o chiamante da un oggetto all'altro, come la precedente (o vuota?) altrimenti&lt;br /&gt;
* '''GFONC1''': indica sempre la funzione precedente, in ogni caso (quindi anche quando una funzione viene aperta tramite F7)&lt;br /&gt;
* '''GLANDEF''': lingua default&lt;br /&gt;
* '''GLANGUE''': lingua della sessione corrente&lt;br /&gt;
* '''GFLAG''': transazione corrente&lt;br /&gt;
* '''GBOITE''': finestra corrente&lt;br /&gt;
* '''GABREV''': abbreviazione oggetto corrente&lt;br /&gt;
* '''GFCYDEF(n)''': sito di default per i vari moduli; vengono impostati in [[GESAFT]]&lt;br /&gt;
* PULSANTI&lt;br /&gt;
** '''GSTACRE''': pulsante standard &amp;quot;Crea&amp;quot;&lt;br /&gt;
** '''GSTANEW''': pulsante standard &amp;quot;Nuovo&amp;quot;&lt;br /&gt;
** '''GSTAENR''': pulsante standard &amp;quot;Registra&amp;quot;&lt;br /&gt;
** '''GSTAANU''': pulsante standard &amp;quot;Elimina&amp;quot;&lt;br /&gt;
** '''GSTAFIN''': pulsante standard &amp;quot;Annulla&amp;quot;&lt;br /&gt;
** '''GSTARET''': pulsante standard &amp;quot;return&amp;quot;&lt;br /&gt;
** '''GSTAOK''': pulsante standard &amp;quot;Ok&amp;quot;&lt;br /&gt;
** '''GBOUT1''','''GBOUT2''',...'''GBOUT20''': contengono le etichette dei pulsanti di riquadro di videata (vedi [[Gestione Bottoni]])&lt;br /&gt;
* '''GREPORT1 e GREPORT2''': contengono il codice stampa scheda e il codice stampa liste, vedi Help funzione da GESAFC (campi Stampa RPT1 e Liste RPT2)&lt;br /&gt;
* '''GSTALIT''': per [[forzare la rilettura di un record visualizzato]]&lt;br /&gt;
* '''GOBJET''': flag gestione oggetto; usato per capire all'interno di alcune chiamate (vedi per esempio file W1ITM0.src) se si è in [[GESAOB|gestione oggetto]] o meno&lt;br /&gt;
* '''GDECPRI''': numer decimali per i prezzi; &lt;br /&gt;
* '''GCURLEG''': legislazione corrente&lt;br /&gt;
* '''GSOCIETE''': società corrente&lt;br /&gt;
&lt;br /&gt;
Esempi:&lt;br /&gt;
&amp;lt;pre&amp;gt;If GREP = &amp;quot;C&amp;quot; and !GIMPORT&lt;br /&gt;
   # azione da eseguire se siamo in fase di creazione ma non in fase di importazione&lt;br /&gt;
Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
If !GSERVEUR          &lt;br /&gt;
    #siamo in modalità interattiva: posso chiedere conferma all'utente&lt;br /&gt;
    Local Integer YESNO : Raz YESNO&lt;br /&gt;
    Call OUINON('Import ODA/ODV da AS400?',YESNO) From GESECRAN&lt;br /&gt;
    If YESNO=1 : Infbox 'Elaborazione bloccata!' : Return : Endif  &lt;br /&gt;
Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Far eseguire in modalità batch del codice (e non generare log)&lt;br /&gt;
GSERVEUR = 1&lt;br /&gt;
  Call ...&lt;br /&gt;
  Call ...&lt;br /&gt;
  Call ...&lt;br /&gt;
GSERVEUR = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestione tipica ==&lt;br /&gt;
&lt;br /&gt;
Lo standard in generale fa queste due chiamate all'apertura e alla chiusura di una finestra (sorgenti SUB*.src):&lt;br /&gt;
&lt;br /&gt;
Dentro $OUVRE&lt;br /&gt;
&amp;lt;pre&amp;gt;#Salva l'attuale situazione delle variabili globali&lt;br /&gt;
Gosub SAUV_GLOB From TRTX3GLOB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dentro $FERME&lt;br /&gt;
&amp;lt;pre&amp;gt;#Ripristina le variabili globali&lt;br /&gt;
Gosub REST_GLOB From TRTX3GLOB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variabili speciali ==&lt;br /&gt;
&lt;br /&gt;
* '''zc''' contiene il valore del campo corrente, o il valore di una formula corrente o altro in base al contesto &amp;lt;br /&amp;gt;da non confondere con &lt;br /&gt;
** CZ, variabile attiva in base all'azione, per es. in APRES_MODIF; contiene il valore del campo corrente&lt;br /&gt;
* '''zoncou''' contiene il nome del campo corrente in inserimento nella videata &amp;lt;br /&amp;gt;da non confondere con &lt;br /&gt;
** COUZON, variabile attiva in base all'azione, per es. in APRES_MODIF; contiene il nome del campo corrente&lt;br /&gt;
** COUIND variabile attiva in base all'azione, per es. in APRES_MODIF; contiene l'indice del campo corrente, se apppartiene ad un riquadro.&lt;br /&gt;
** [[ZONSUI]], variabile che permette di indicare il prossimo campo su cui mettere il focus (per es.:&amp;lt;code&amp;gt;zonsui = &amp;quot;[M:PTH1]YNUMPEZZI(&amp;quot;+num$(nolign-1)+&amp;quot;)&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''zonsor''' è una variabile alfanumerica in cui si trova il nome dell'ultimo campo in inserimento nella videata&lt;br /&gt;
* '''maskcou''' contiene l'abbreviazione della videata corrente&lt;br /&gt;
* '''masknam()''' restituisce il nome, per esempio &amp;lt;code&amp;gt;masknam([M:YWY4])&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''masknbf([ITM0]))''' restituisce il numero di campi presenti nella videata ITM0 (se è aperta)&lt;br /&gt;
* '''masklev()''' restituisce il livello di nidificazione della videata; 0 significa che la videata non è aperta; 1 che è aperta all'interno di un processo; N che è aperta dalla N-esima subroutine nidificata in una istruzione Call.&lt;br /&gt;
* '''trtcou''' contiene il nome del programma corrente&lt;br /&gt;
* '''adxpno''' restituisce i nomi dei programmi accodati (il livello 0 è il livello corrente, il livello 1 è quello del programma chiamante, ecc)&lt;br /&gt;
* '''datesyst''' data di sistema (pag.30 di Linguaggio.pdf)&lt;br /&gt;
* '''mkstat''' stato quando si esce da un campo&lt;br /&gt;
* '''fstat''' stato dopo un'operazione su una tabella&lt;br /&gt;
* '''currbox''' : contiene il valore del browser corrente (GAU_CHE browser principale, GAU_CHE1...GAU_CHE8, GAU_CHE9 ultimi letti)&lt;br /&gt;
&lt;br /&gt;
Poco usate&lt;br /&gt;
* '''maskabr(i)''' contiene le abbreviazioni delle videate aperte&lt;br /&gt;
* '''maskrk(&amp;lt;class | num_exp&amp;gt;, row_exp)''' returns the rows of the fields for an open screen&lt;br /&gt;
* '''masksiz(i)''' numero di bytes usati dalla i-esima videata (il cui nome è &amp;lt;code&amp;gt;masknam(i)&amp;lt;/code&amp;gt;)&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Variabili_globali&amp;diff=425</id>
		<title>Variabili globali</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Variabili_globali&amp;diff=425"/>
		<updated>2021-07-22T12:51:40Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* Variabili globali */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Variabili globali ==&lt;br /&gt;
Ci sono delle variabili definite globalmente che permettono di gestire le diverse condizioni che sovvengono nelle varie fasi di esecuzione del codice.&lt;br /&gt;
&lt;br /&gt;
Per vederle tutte vai alla funzione [[GESAGB]].&lt;br /&gt;
&lt;br /&gt;
* '''GREP''': &lt;br /&gt;
*# vuoto,&amp;quot;&amp;quot;, quando l'utente sta visualizzando i dati&lt;br /&gt;
*# vale &amp;quot;C&amp;quot; se siamo in creazione (quando viene premuto il pulsante &amp;lt;code&amp;gt;Crea&amp;lt;/code&amp;gt;)&lt;br /&gt;
*# vale &amp;quot;M&amp;quot; se siamo in visualizzazione/modifica (quando è attivo e viene premuto il pulsante &amp;lt;code&amp;gt;Registra&amp;lt;/code&amp;gt;)&lt;br /&gt;
*# vale &amp;quot;D&amp;quot; se siamo in duplicazione (quando viene premuto il pulsante &amp;lt;code&amp;gt;Duplica&amp;lt;/code&amp;gt;)&lt;br /&gt;
*# vale &amp;quot;A&amp;quot; se siamo in annullamento (quando viene premuto il pulsante &amp;lt;code&amp;gt;Annulla&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''GIMPORT''': variabile utilizzata per gestire la fase di [[ImportExport|importazione/esportazione]]; se vale 1 vuol dire che si è in fase di importazione/esportazione&lt;br /&gt;
* '''GIMP()''': vedi [[ImportExport#Programmazione| Programmazione per Import/Export]]&lt;br /&gt;
* '''GSILENCE''': se vale 0 indica che sono abilitati i messaggi di errore; quando viene impostata a 1 l'utente non vedrà più tali messaggi; utile in programmi non interattivi, va poi rimessa a 0&lt;br /&gt;
* '''GERR''': indica/imposta se c'è un messaggio d'errore&lt;br /&gt;
*# 1: messaggio d'errore&lt;br /&gt;
*# 2: messaggio informativo&lt;br /&gt;
*# 3: messaggio di avviso&lt;br /&gt;
*# 4: messaggio in fondo alla videata&lt;br /&gt;
* '''GMESSAGE''': contiene un eventuale messaggio di errore&lt;br /&gt;
* '''GSERVEUR''': indica se l'esecuzione è in modalità interattiva o batch (0 interattivo, 1 batch); se in batch non si creano file di log&lt;br /&gt;
* '''GWEBSERV''': indica modalità Web Services&lt;br /&gt;
* '''GUSER''': codice utente corrente&lt;br /&gt;
* '''GNOMUSER''': nome utente corrente&lt;br /&gt;
* '''GPROFIL''': profilo funzione &lt;br /&gt;
* '''GTRACE''': indica il nome del file traccia attivo, vuoto se non c'è un file di traccia attivo (vedi [[Gestione tracce]])&lt;br /&gt;
* '''GFONCTION''': indica la funzione corrente&lt;br /&gt;
* '''GFONCTION1''': indica la funzione chiamante solo in caso di tunnel o chiamante da un oggetto all'altro, come la precedente (o vuota?) altrimenti&lt;br /&gt;
* '''GFONC1''': indica sempre la funzione precedente, in ogni caso (quindi anche quando una funzione viene aperta tramite F7)&lt;br /&gt;
* '''GLANDEF''': lingua default&lt;br /&gt;
* '''GLANGUE''': lingua della sessione corrente&lt;br /&gt;
* '''GFLAG''': transazione corrente&lt;br /&gt;
* '''GBOITE''': finestra corrente&lt;br /&gt;
* '''GABREV''': abbreviazione oggetto corrente&lt;br /&gt;
* '''GFCYDEF(n)''': sito di default per i vari moduli; vengono impostati in [[GESAFT]]&lt;br /&gt;
* PULSANTI&lt;br /&gt;
** '''GSTACRE''': pulsante standard &amp;quot;Crea&amp;quot;&lt;br /&gt;
** '''GSTANEW''': pulsante standard &amp;quot;Nuovo&amp;quot;&lt;br /&gt;
** '''GSTAENR''': pulsante standard &amp;quot;Registra&amp;quot;&lt;br /&gt;
** '''GSTAANU''': pulsante standard &amp;quot;Elimina&amp;quot;&lt;br /&gt;
** '''GSTAFIN''': pulsante standard &amp;quot;Annulla&amp;quot;&lt;br /&gt;
** '''GSTARET''': pulsante standard &amp;quot;return&amp;quot;&lt;br /&gt;
** '''GSTAOK''': pulsante standard &amp;quot;Ok&amp;quot;&lt;br /&gt;
** '''GBOUT1''','''GBOUT2''',...'''GBOUT20''': contengono le etichette dei pulsanti di riquadro di videata (vedi [[Gestione Bottoni]])&lt;br /&gt;
* '''GREPORT1 e GREPORT2''': contengono il codice stampa scheda e il codice stampa liste, vedi Help funzione da GESAFC (campi Stampa RPT1 e Liste RPT2)&lt;br /&gt;
* '''GSTALIT''': per [[forzare la rilettura di un record visualizzato]]&lt;br /&gt;
* '''GOBJET''': flag gestione oggetto; usato per capire all'interno di alcune chiamate (vedi per esempio file W1ITM0.src) se si è in [[GESAOB|gestione oggetto]] o meno&lt;br /&gt;
* '''GDECPRI''': numer decimali per i prezzi; &lt;br /&gt;
* '''GCURLEG''': legislazione corrente&lt;br /&gt;
* '''GSOCIETE''': società corrente&lt;br /&gt;
&lt;br /&gt;
Esempi:&lt;br /&gt;
&amp;lt;pre&amp;gt;If GREP = &amp;quot;C&amp;quot; and !GIMPORT&lt;br /&gt;
   # azione da eseguire se siamo in fase di creazione ma non in fase di importazione&lt;br /&gt;
Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
If !GSERVEUR          &lt;br /&gt;
    #siamo in modalità interattiva: posso chiedere conferma all'utente&lt;br /&gt;
    Local Integer YESNO : Raz YESNO&lt;br /&gt;
    Call OUINON('Import ODA/ODV da AS400?',YESNO) From GESECRAN&lt;br /&gt;
    If YESNO=1 : Infbox 'Elaborazione bloccata!' : Return : Endif  &lt;br /&gt;
Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Far eseguire in modalità batch del codice (e non generare log)&lt;br /&gt;
GSERVEUR = 1&lt;br /&gt;
  Call ...&lt;br /&gt;
  Call ...&lt;br /&gt;
  Call ...&lt;br /&gt;
GSERVEUR = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestione tipica ==&lt;br /&gt;
&lt;br /&gt;
Lo standard in generale fa queste due chiamate all'apertura e alla chiusura di una finestra (sorgenti SUB*.src):&lt;br /&gt;
&lt;br /&gt;
Dentro $OUVRE&lt;br /&gt;
&amp;lt;pre&amp;gt;#Salva l'attuale situazione delle variabili globali&lt;br /&gt;
Gosub SAUV_GLOB From TRTX3GLOB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dentro $FERME&lt;br /&gt;
&amp;lt;pre&amp;gt;#Ripristina le variabili globali&lt;br /&gt;
Gosub REST_GLOB From TRTX3GLOB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variabili speciali ==&lt;br /&gt;
&lt;br /&gt;
* '''zc''' contiene il valore del campo corrente, o il valore di una formula corrente o altro in base al contesto &amp;lt;br /&amp;gt;da non confondere con &lt;br /&gt;
** CZ, variabile attiva in base all'azione, per es. in APRES_MODIF; contiene il valore del campo corrente&lt;br /&gt;
* '''zoncou''' contiene il nome del campo corrente in inserimento nella videata &amp;lt;br /&amp;gt;da non confondere con &lt;br /&gt;
** COUZON, variabile attiva in base all'azione, per es. in APRES_MODIF; contiene il nome del campo corrente&lt;br /&gt;
** COUIND variabile attiva in base all'azione, per es. in APRES_MODIF; contiene l'indice del campo corrente, se apppartiene ad un riquadro.&lt;br /&gt;
** [[ZONSUI]], variabile che permette di indicare il prossimo campo su cui mettere il focus (per es.:&amp;lt;code&amp;gt;zonsui = &amp;quot;[M:PTH1]YNUMPEZZI(&amp;quot;+num$(nolign-1)+&amp;quot;)&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''zonsor''' è una variabile alfanumerica in cui si trova il nome dell'ultimo campo in inserimento nella videata&lt;br /&gt;
* '''maskcou''' contiene l'abbreviazione della videata corrente&lt;br /&gt;
* '''masknam()''' restituisce il nome, per esempio &amp;lt;code&amp;gt;masknam([M:YWY4])&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''masknbf([ITM0]))''' restituisce il numero di campi presenti nella videata ITM0 (se è aperta)&lt;br /&gt;
* '''masklev()''' restituisce il livello di nidificazione della videata; 0 significa che la videata non è aperta; 1 che è aperta all'interno di un processo; N che è aperta dalla N-esima subroutine nidificata in una istruzione Call.&lt;br /&gt;
* '''trtcou''' contiene il nome del programma corrente&lt;br /&gt;
* '''adxpno''' restituisce i nomi dei programmi accodati (il livello 0 è il livello corrente, il livello 1 è quello del programma chiamante, ecc)&lt;br /&gt;
* '''datesyst''' data di sistema (pag.30 di Linguaggio.pdf)&lt;br /&gt;
* '''mkstat''' stato quando si esce da un campo&lt;br /&gt;
* '''fstat''' stato dopo un'operazione su una tabella&lt;br /&gt;
&lt;br /&gt;
Poco usate&lt;br /&gt;
* '''maskabr(i)''' contiene le abbreviazioni delle videate aperte&lt;br /&gt;
* '''maskrk(&amp;lt;class | num_exp&amp;gt;, row_exp)''' returns the rows of the fields for an open screen&lt;br /&gt;
* '''masksiz(i)''' numero di bytes usati dalla i-esima videata (il cui nome è &amp;lt;code&amp;gt;masknam(i)&amp;lt;/code&amp;gt;)&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Variabili_globali&amp;diff=419</id>
		<title>Variabili globali</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Variabili_globali&amp;diff=419"/>
		<updated>2021-04-16T14:25:51Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Variabili globali ==&lt;br /&gt;
Ci sono delle variabili definite globalmente che permettono di gestire le diverse condizioni che sovvengono nelle varie fasi di esecuzione del codice.&lt;br /&gt;
&lt;br /&gt;
Per vederle tutte vai alla funzione [[GESAGB]].&lt;br /&gt;
&lt;br /&gt;
* '''GREP''': &lt;br /&gt;
*# vuoto,&amp;quot;&amp;quot;, quando l'utente sta visualizzando i dati&lt;br /&gt;
*# vale &amp;quot;C&amp;quot; se siamo in creazione (quando viene premuto il pulsante &amp;lt;code&amp;gt;Crea&amp;lt;/code&amp;gt;)&lt;br /&gt;
*# vale &amp;quot;M&amp;quot; se siamo in visualizzazione/modifica (quando è attivo e viene premuto il pulsante &amp;lt;code&amp;gt;Registra&amp;lt;/code&amp;gt;)&lt;br /&gt;
*# vale &amp;quot;D&amp;quot; se siamo in duplicazione (quando viene premuto il pulsante &amp;lt;code&amp;gt;Duplica&amp;lt;/code&amp;gt;)&lt;br /&gt;
*# vale &amp;quot;A&amp;quot; se siamo in annullamento (quando viene premuto il pulsante &amp;lt;code&amp;gt;Annulla&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''GIMPORT''': variabile utilizzata per gestire la fase di [[ImportExport|importazione/esportazione]]; se vale 1 vuol dire che si è in fase di importazione/esportazione&lt;br /&gt;
* '''GIMP()''': vedi [[ImportExport#Programmazione| Programmazione per Import/Export]]&lt;br /&gt;
* '''GSILENCE''': se vale 0 indica che sono abilitati i messaggi di errore; quando viene impostata a 1 l'utente non vedrà più tali messaggi; utile in programmi non interattivi, va poi rimessa a 0&lt;br /&gt;
* '''GERR''': indica/imposta se c'è un messaggio d'errore&lt;br /&gt;
*# 1: messaggio d'errore&lt;br /&gt;
*# 2: messaggio informativo&lt;br /&gt;
*# 3: messaggio di avviso&lt;br /&gt;
*# 4: messaggio in fondo alla videata&lt;br /&gt;
* '''GMESSAGE''': contiene un eventuale messaggio di errore&lt;br /&gt;
* '''GSERVEUR''': indica se l'esecuzione è in modalità interattiva o batch (0 interattivo, 1 batch); se in batch non si creano file di log&lt;br /&gt;
* '''GWEBSERV''': indica modalità Web Services&lt;br /&gt;
* '''GUSER''': codice utente corrente&lt;br /&gt;
* '''GNOMUSER''': nome utente corrente&lt;br /&gt;
* '''GPROFIL''': profilo funzione &lt;br /&gt;
* '''GTRACE''': indica il nome del file traccia attivo, vuoto se non c'è un file di traccia attivo (vedi [[Gestione tracce]])&lt;br /&gt;
* '''GFONCTION''': indica la funzione corrente&lt;br /&gt;
* '''GFONCTION1''': indica la funzione chiamante solo in caso di tunnel o chiamante da un oggetto all'altro, come la precedente (o vuota?) altrimenti&lt;br /&gt;
* '''GFONC1''': indica sempre la funzione precedente, in ogni caso (quindi anche quando una funzione viene aperta tramite F7)&lt;br /&gt;
* '''GLANDEF''': lingua default&lt;br /&gt;
* '''GLANGUE''': lingua della sessione corrente&lt;br /&gt;
* '''GFLAG''': transazione corrente&lt;br /&gt;
* '''GFCYDEF(n)''': sito di default per i vari moduli; vengono impostati in [[GESAFT]]&lt;br /&gt;
* PULSANTI&lt;br /&gt;
** '''GSTACRE''': pulsante standard &amp;quot;Crea&amp;quot;&lt;br /&gt;
** '''GSTANEW''': pulsante standard &amp;quot;Nuovo&amp;quot;&lt;br /&gt;
** '''GSTAENR''': pulsante standard &amp;quot;Registra&amp;quot;&lt;br /&gt;
** '''GSTAANU''': pulsante standard &amp;quot;Elimina&amp;quot;&lt;br /&gt;
** '''GSTAFIN''': pulsante standard &amp;quot;Annulla&amp;quot;&lt;br /&gt;
** '''GSTARET''': pulsante standard &amp;quot;return&amp;quot;&lt;br /&gt;
** '''GSTAOK''': pulsante standard &amp;quot;Ok&amp;quot;&lt;br /&gt;
** '''GBOUT1''','''GBOUT2''',...'''GBOUT20''': contengono le etichette dei pulsanti di riquadro di videata (vedi [[Gestione Bottoni]])&lt;br /&gt;
* '''GREPORT1 e GREPORT2''': contengono il codice stampa scheda e il codice stampa liste, vedi Help funzione da GESAFC (campi Stampa RPT1 e Liste RPT2)&lt;br /&gt;
* '''GSTALIT''': per [[forzare la rilettura di un record visualizzato]]&lt;br /&gt;
* '''GOBJET''': flag gestione oggetto; usato per capire all'interno di alcune chiamate (vedi per esempio file W1ITM0.src) se si è in [[GESAOB|gestione oggetto]] o meno&lt;br /&gt;
* '''GDECPRI''': numer decimali per i prezzi; &lt;br /&gt;
* '''GCURLEG''': legislazione corrente&lt;br /&gt;
* '''GSOCIETE''': società corrente&lt;br /&gt;
&lt;br /&gt;
Esempi:&lt;br /&gt;
&amp;lt;pre&amp;gt;If GREP = &amp;quot;C&amp;quot; and !GIMPORT&lt;br /&gt;
   # azione da eseguire se siamo in fase di creazione ma non in fase di importazione&lt;br /&gt;
Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
If !GSERVEUR          &lt;br /&gt;
    #siamo in modalità interattiva: posso chiedere conferma all'utente&lt;br /&gt;
    Local Integer YESNO : Raz YESNO&lt;br /&gt;
    Call OUINON('Import ODA/ODV da AS400?',YESNO) From GESECRAN&lt;br /&gt;
    If YESNO=1 : Infbox 'Elaborazione bloccata!' : Return : Endif  &lt;br /&gt;
Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Far eseguire in modalità batch del codice (e non generare log)&lt;br /&gt;
GSERVEUR = 1&lt;br /&gt;
  Call ...&lt;br /&gt;
  Call ...&lt;br /&gt;
  Call ...&lt;br /&gt;
GSERVEUR = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestione tipica ==&lt;br /&gt;
&lt;br /&gt;
Lo standard in generale fa queste due chiamate all'apertura e alla chiusura di una finestra (sorgenti SUB*.src):&lt;br /&gt;
&lt;br /&gt;
Dentro $OUVRE&lt;br /&gt;
&amp;lt;pre&amp;gt;#Salva l'attuale situazione delle variabili globali&lt;br /&gt;
Gosub SAUV_GLOB From TRTX3GLOB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dentro $FERME&lt;br /&gt;
&amp;lt;pre&amp;gt;#Ripristina le variabili globali&lt;br /&gt;
Gosub REST_GLOB From TRTX3GLOB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variabili speciali ==&lt;br /&gt;
&lt;br /&gt;
* '''zc''' contiene il valore del campo corrente, o il valore di una formula corrente o altro in base al contesto &amp;lt;br /&amp;gt;da non confondere con &lt;br /&gt;
** CZ, variabile attiva in base all'azione, per es. in APRES_MODIF; contiene il valore del campo corrente&lt;br /&gt;
* '''zoncou''' contiene il nome del campo corrente in inserimento nella videata &amp;lt;br /&amp;gt;da non confondere con &lt;br /&gt;
** COUZON, variabile attiva in base all'azione, per es. in APRES_MODIF; contiene il nome del campo corrente&lt;br /&gt;
** COUIND variabile attiva in base all'azione, per es. in APRES_MODIF; contiene l'indice del campo corrente, se apppartiene ad un riquadro.&lt;br /&gt;
** [[ZONSUI]], variabile che permette di indicare il prossimo campo su cui mettere il focus (per es.:&amp;lt;code&amp;gt;zonsui = &amp;quot;[M:PTH1]YNUMPEZZI(&amp;quot;+num$(nolign-1)+&amp;quot;)&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''zonsor''' è una variabile alfanumerica in cui si trova il nome dell'ultimo campo in inserimento nella videata&lt;br /&gt;
* '''maskcou''' contiene l'abbreviazione della videata corrente&lt;br /&gt;
* '''masknam()''' restituisce il nome, per esempio &amp;lt;code&amp;gt;masknam([M:YWY4])&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''masknbf([ITM0]))''' restituisce il numero di campi presenti nella videata ITM0 (se è aperta)&lt;br /&gt;
* '''masklev()''' restituisce il livello di nidificazione della videata; 0 significa che la videata non è aperta; 1 che è aperta all'interno di un processo; N che è aperta dalla N-esima subroutine nidificata in una istruzione Call.&lt;br /&gt;
* '''trtcou''' contiene il nome del programma corrente&lt;br /&gt;
* '''adxpno''' restituisce i nomi dei programmi accodati (il livello 0 è il livello corrente, il livello 1 è quello del programma chiamante, ecc)&lt;br /&gt;
* '''datesyst''' data di sistema (pag.30 di Linguaggio.pdf)&lt;br /&gt;
* '''mkstat''' stato quando si esce da un campo&lt;br /&gt;
* '''fstat''' stato dopo un'operazione su una tabella&lt;br /&gt;
&lt;br /&gt;
Poco usate&lt;br /&gt;
* '''maskabr(i)''' contiene le abbreviazioni delle videate aperte&lt;br /&gt;
* '''maskrk(&amp;lt;class | num_exp&amp;gt;, row_exp)''' returns the rows of the fields for an open screen&lt;br /&gt;
* '''masksiz(i)''' numero di bytes usati dalla i-esima videata (il cui nome è &amp;lt;code&amp;gt;masknam(i)&amp;lt;/code&amp;gt;)&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=AVOCAB&amp;diff=418</id>
		<title>AVOCAB</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=AVOCAB&amp;diff=418"/>
		<updated>2021-03-29T14:30:16Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* Personalizzazione vocabolario */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Personalizzazione vocabolario ==&lt;br /&gt;
Questa funzione permette di sostituire delle traduzioni presenti a standard.&lt;br /&gt;
&lt;br /&gt;
Le modifiche inserite qui non vengono sovrascritte in caso di rivalidazione dossier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Personalizzazione vocabolario .png|Personalizzazione vocabolario .png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Personalizzazione vocabolario esempio.png|Personalizzazione vocabolario esempio.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Personalizzazione vocabolario validazione .png|Personalizzazione vocabolario validazione .png]]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=AVOCAB&amp;diff=417</id>
		<title>AVOCAB</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=AVOCAB&amp;diff=417"/>
		<updated>2021-03-29T14:30:00Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* Personalizzazione vocabolario */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Personalizzazione vocabolario ==&lt;br /&gt;
Questa funzione permette di sostituire delle traduzioni presenti a standard.&lt;br /&gt;
&lt;br /&gt;
Le modifiche inserite qui non vengono sovrascritte in caso di rivalidazione dossier.&lt;br /&gt;
[[File:Personalizzazione vocabolario .png|Personalizzazione vocabolario .png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Personalizzazione vocabolario esempio.png|Personalizzazione vocabolario esempio.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Personalizzazione vocabolario validazione .png|Personalizzazione vocabolario validazione .png]]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:Personalizzazione_vocabolario_validazione_.png&amp;diff=416</id>
		<title>File:Personalizzazione vocabolario validazione .png</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:Personalizzazione_vocabolario_validazione_.png&amp;diff=416"/>
		<updated>2021-03-29T14:29:37Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Personalizzazione vocabolario valid&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:Personalizzazione_vocabolario_esempio.png&amp;diff=415</id>
		<title>File:Personalizzazione vocabolario esempio.png</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:Personalizzazione_vocabolario_esempio.png&amp;diff=415"/>
		<updated>2021-03-29T14:28:02Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Personalizzazione vocabolario esempio [AVOCAB]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:Personalizzazione_vocabolario_.png&amp;diff=414</id>
		<title>File:Personalizzazione vocabolario .png</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:Personalizzazione_vocabolario_.png&amp;diff=414"/>
		<updated>2021-03-29T14:27:19Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Personalizzazione vocabolario [AVOCAB]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=GESTRN&amp;diff=409</id>
		<title>GESTRN</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=GESTRN&amp;diff=409"/>
		<updated>2021-03-17T15:14:07Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* Regole d'arrotondamento */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Regole d'arrotondamento ==&lt;br /&gt;
&lt;br /&gt;
tabella TABROUND&lt;br /&gt;
&lt;br /&gt;
tipo dati RND, da RECHTYP non risulta nessun uso&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Arrotondamenti_Prezzi&amp;diff=408</id>
		<title>Arrotondamenti Prezzi</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Arrotondamenti_Prezzi&amp;diff=408"/>
		<updated>2021-03-17T14:57:09Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Per gestire l'arrotondamento dei prezzi ci sono diverse variabili in gioco.&lt;br /&gt;
La [[Variabili_globali|variabile globale]] '''GDECPRI'''&lt;br /&gt;
&lt;br /&gt;
Il parametro SALRND definibile per società:&lt;br /&gt;
&lt;br /&gt;
[[File:SALRND.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli arrotondamenti definiti sulla valuta:&lt;br /&gt;
&lt;br /&gt;
[[File:Currency_round.png]]&lt;br /&gt;
&lt;br /&gt;
Il formato2 serve per un importo corto (prezzo unitario, sconto). L'Help su campo inoltre avvisa che &lt;br /&gt;
&amp;quot;il numero di decimali effettivi dei prezzi unitari è determinato dalla variabile GDECPRI.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
La voce arrotondamento vale per qualsiasi valore espresso in quella valuta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vedere i vari help su campo per maggiori dettagli&lt;br /&gt;
&lt;br /&gt;
Ci sarebbe da capire poi cosa si può fare con la funzione [[GESTRN]]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Variabili_globali&amp;diff=407</id>
		<title>Variabili globali</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Variabili_globali&amp;diff=407"/>
		<updated>2021-03-17T14:56:33Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* Variabili globali */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Variabili globali ==&lt;br /&gt;
Ci sono delle variabili definite globalmente che permettono di gestire le diverse condizioni che sovvengono nelle varie fasi di esecuzione del codice.&lt;br /&gt;
&lt;br /&gt;
Per vederle tutte vai alla funzione [[GESAGB]].&lt;br /&gt;
&lt;br /&gt;
* '''GREP''': &lt;br /&gt;
*# vuoto,&amp;quot;&amp;quot;, quando l'utente sta visualizzando i dati&lt;br /&gt;
*# vale &amp;quot;C&amp;quot; se siamo in creazione (quando viene premuto il pulsante &amp;lt;code&amp;gt;Crea&amp;lt;/code&amp;gt;)&lt;br /&gt;
*# vale &amp;quot;M&amp;quot; se siamo in visualizzazione/modifica (quando è attivo e viene premuto il pulsante &amp;lt;code&amp;gt;Registra&amp;lt;/code&amp;gt;)&lt;br /&gt;
*# vale &amp;quot;D&amp;quot; se siamo in duplicazione (quando viene premuto il pulsante &amp;lt;code&amp;gt;Duplica&amp;lt;/code&amp;gt;)&lt;br /&gt;
*# vale &amp;quot;A&amp;quot; se siamo in annullamento (quando viene premuto il pulsante &amp;lt;code&amp;gt;Annulla&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''GIMPORT''': variabile utilizzata per gestire la fase di [[ImportExport|importazione/esportazione]]; se vale 1 vuol dire che si è in fase di importazione/esportazione&lt;br /&gt;
* '''GIMP()''': vedi [[ImportExport#Programmazione| Programmazione per Import/Export]]&lt;br /&gt;
* '''GSILENCE''': se vale 0 indica che sono abilitati i messaggi di errore; quando viene impostata a 1 l'utente non vedrà più tali messaggi; utile in programmi non interattivi, va poi rimessa a 0&lt;br /&gt;
* '''GERR''': indica/imposta se c'è un messaggio d'errore&lt;br /&gt;
*# 1: messaggio d'errore&lt;br /&gt;
*# 2: messaggio informativo&lt;br /&gt;
*# 3: messaggio di avviso&lt;br /&gt;
*# 4: messaggio in fondo alla videata&lt;br /&gt;
* '''GMESSAGE''': contiene un eventuale messaggio di errore&lt;br /&gt;
* '''GSERVEUR''': indica se l'esecuzione è in modalità interattiva o batch (0 interattivo, 1 batch); se in batch non si creano file di log&lt;br /&gt;
* '''GWEBSERV''': indica modalità Web Services&lt;br /&gt;
* '''GUSER''': codice utente corrente&lt;br /&gt;
* '''GNOMUSER''': nome utente corrente&lt;br /&gt;
* '''GPROFIL''': profilo funzione &lt;br /&gt;
* '''GTRACE''': indica il nome del file traccia attivo, vuoto se non c'è un file di traccia attivo (vedi [[Gestione tracce]])&lt;br /&gt;
* '''GFONCTION''': indica la funzione corrente&lt;br /&gt;
* '''GFONCTION1''': indica la funzione chiamante solo in caso di tunnel o chiamante da un oggetto all'altro, come la precedente (o vuota?) altrimenti&lt;br /&gt;
* '''GFONC1''': indica sempre la funzione precedente, in ogni caso (quindi anche quando una funzione viene aperta tramite F7)&lt;br /&gt;
* '''GLANDEF''': lingua default&lt;br /&gt;
* '''GLANGUE''': lingua della sessione corrente&lt;br /&gt;
* '''GFLAG''': transazione corrente&lt;br /&gt;
* '''GFCYDEF(n)''': sito di default per i vari moduli; vengono impostati in [[GESAFT]]&lt;br /&gt;
* PULSANTI&lt;br /&gt;
** '''GSTACRE''': pulsante standard &amp;quot;Crea&amp;quot;&lt;br /&gt;
** '''GSTANEW''': pulsante standard &amp;quot;Nuovo&amp;quot;&lt;br /&gt;
** '''GSTAENR''': pulsante standard &amp;quot;Registra&amp;quot;&lt;br /&gt;
** '''GSTAANU''': pulsante standard &amp;quot;Elimina&amp;quot;&lt;br /&gt;
** '''GSTAFIN''': pulsante standard &amp;quot;Annulla&amp;quot;&lt;br /&gt;
** '''GSTARET''': pulsante standard &amp;quot;return&amp;quot;&lt;br /&gt;
** '''GSTAOK''': pulsante standard &amp;quot;Ok&amp;quot;&lt;br /&gt;
** '''GBOUT1''','''GBOUT2''',...'''GBOUT20''': contengono le etichette dei pulsanti di riquadro di videata (vedi [[Gestione Bottoni]])&lt;br /&gt;
* '''GREPORT1 e GREPORT2''': contengono il codice stampa scheda e il codice stampa liste, vedi Help funzione da GESAFC (campi Stampa RPT1 e Liste RPT2)&lt;br /&gt;
* '''GSTALIT''': per [[forzare la rilettura di un record visualizzato]]&lt;br /&gt;
* '''GOBJET''': flag gestione oggetto; usato per capire all'interno di alcune chiamate (vedi per esempio file W1ITM0.src) se si è in [[GESAOB|gestione oggetto]] o meno&lt;br /&gt;
* '''GDECPRI''': numer decimali per i prezzi; &lt;br /&gt;
&lt;br /&gt;
Esempi:&lt;br /&gt;
&amp;lt;pre&amp;gt;If GREP = &amp;quot;C&amp;quot; and !GIMPORT&lt;br /&gt;
   # azione da eseguire se siamo in fase di creazione ma non in fase di importazione&lt;br /&gt;
Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
If !GSERVEUR          &lt;br /&gt;
    #siamo in modalità interattiva: posso chiedere conferma all'utente&lt;br /&gt;
    Local Integer YESNO : Raz YESNO&lt;br /&gt;
    Call OUINON('Import ODA/ODV da AS400?',YESNO) From GESECRAN&lt;br /&gt;
    If YESNO=1 : Infbox 'Elaborazione bloccata!' : Return : Endif  &lt;br /&gt;
Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Far eseguire in modalità batch del codice (e non generare log)&lt;br /&gt;
GSERVEUR = 1&lt;br /&gt;
  Call ...&lt;br /&gt;
  Call ...&lt;br /&gt;
  Call ...&lt;br /&gt;
GSERVEUR = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestione tipica ==&lt;br /&gt;
&lt;br /&gt;
Lo standard in generale fa queste due chiamate all'apertura e alla chiusura di una finestra (sorgenti SUB*.src):&lt;br /&gt;
&lt;br /&gt;
Dentro $OUVRE&lt;br /&gt;
&amp;lt;pre&amp;gt;#Salva l'attuale situazione delle variabili globali&lt;br /&gt;
Gosub SAUV_GLOB From TRTX3GLOB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dentro $FERME&lt;br /&gt;
&amp;lt;pre&amp;gt;#Ripristina le variabili globali&lt;br /&gt;
Gosub REST_GLOB From TRTX3GLOB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variabili speciali ==&lt;br /&gt;
&lt;br /&gt;
* '''zc''' contiene il valore del campo corrente, o il valore di una formula corrente o altro in base al contesto &amp;lt;br /&amp;gt;da non confondere con &lt;br /&gt;
** CZ, variabile attiva in base all'azione, per es. in APRES_MODIF; contiene il valore del campo corrente&lt;br /&gt;
* '''zoncou''' contiene il nome del campo corrente in inserimento nella videata &amp;lt;br /&amp;gt;da non confondere con &lt;br /&gt;
** COUZON, variabile attiva in base all'azione, per es. in APRES_MODIF; contiene il nome del campo corrente&lt;br /&gt;
** COUIND variabile attiva in base all'azione, per es. in APRES_MODIF; contiene l'indice del campo corrente, se apppartiene ad un riquadro.&lt;br /&gt;
** [[ZONSUI]], variabile che permette di indicare il prossimo campo su cui mettere il focus (per es.:&amp;lt;code&amp;gt;zonsui = &amp;quot;[M:PTH1]YNUMPEZZI(&amp;quot;+num$(nolign-1)+&amp;quot;)&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''zonsor''' è una variabile alfanumerica in cui si trova il nome dell'ultimo campo in inserimento nella videata&lt;br /&gt;
* '''maskcou''' contiene l'abbreviazione della videata corrente&lt;br /&gt;
* '''masknam()''' restituisce il nome, per esempio &amp;lt;code&amp;gt;masknam([M:YWY4])&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''masknbf([ITM0]))''' restituisce il numero di campi presenti nella videata ITM0 (se è aperta)&lt;br /&gt;
* '''masklev()''' restituisce il livello di nidificazione della videata; 0 significa che la videata non è aperta; 1 che è aperta all'interno di un processo; N che è aperta dalla N-esima subroutine nidificata in una istruzione Call.&lt;br /&gt;
* '''trtcou''' contiene il nome del programma corrente&lt;br /&gt;
* '''adxpno''' restituisce i nomi dei programmi accodati (il livello 0 è il livello corrente, il livello 1 è quello del programma chiamante, ecc)&lt;br /&gt;
* '''datesyst''' data di sistema (pag.30 di Linguaggio.pdf)&lt;br /&gt;
* '''mkstat''' stato quando si esce da un campo&lt;br /&gt;
* '''fstat''' stato dopo un'operazione su una tabella&lt;br /&gt;
&lt;br /&gt;
Poco usate&lt;br /&gt;
* '''maskabr(i)''' contiene le abbreviazioni delle videate aperte&lt;br /&gt;
* '''maskrk(&amp;lt;class | num_exp&amp;gt;, row_exp)''' returns the rows of the fields for an open screen&lt;br /&gt;
* '''masksiz(i)''' numero di bytes usati dalla i-esima videata (il cui nome è &amp;lt;code&amp;gt;masknam(i)&amp;lt;/code&amp;gt;)&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Arrotondamenti_Prezzi&amp;diff=406</id>
		<title>Arrotondamenti Prezzi</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Arrotondamenti_Prezzi&amp;diff=406"/>
		<updated>2021-03-17T14:53:09Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Per gestire l'arrotondamento dei prezzi ci sono diverse variabili in gioco.&lt;br /&gt;
La variabile globale '''GDECPRI'''&lt;br /&gt;
&lt;br /&gt;
Il parametro SALRND definibile per società:&lt;br /&gt;
&lt;br /&gt;
[[File:SALRND.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli arrotondamenti definiti sulla valuta:&lt;br /&gt;
&lt;br /&gt;
[[File:Currency_round.png]]&lt;br /&gt;
&lt;br /&gt;
Il formato2 serve per un importo corto (prezzo unitario, sconto). L'Help su campo inoltre avvisa che &lt;br /&gt;
&amp;quot;il numero di decimali effettivi dei prezzi unitari è determinato dalla variabile GDECPRI.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
La voce arrotondamento vale per qualsiasi valore espresso in quella valuta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vedere i vari help su campo per maggiori dettagli&lt;br /&gt;
&lt;br /&gt;
Ci sarebbe da capire poi cosa si può fare con la funzione [[GESTRN]]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Arrotondamenti_Prezzi&amp;diff=405</id>
		<title>Arrotondamenti Prezzi</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Arrotondamenti_Prezzi&amp;diff=405"/>
		<updated>2021-03-17T14:40:26Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Per gestire l'arrotondamento dei prezzi ci sono diverse variabili in gioco.&lt;br /&gt;
La variabile globale '''GDECPRI'''&lt;br /&gt;
&lt;br /&gt;
Il parametro SALRND definibile per società:&lt;br /&gt;
&lt;br /&gt;
[[File:SALRND.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli arrotondamenti definiti sulla valuta:&lt;br /&gt;
&lt;br /&gt;
[[File:Currency_round.png]]&lt;br /&gt;
&lt;br /&gt;
Il formato2 serve per un importo corto (prezzo unitario, sconto).&lt;br /&gt;
&lt;br /&gt;
La voce arrotondamento vale per qualsiasi valore espresso in quella valuta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vedere i vari help su campo per maggiori dettagli&lt;br /&gt;
&lt;br /&gt;
Ci sarebbe da capire poi cosa si può fare con la funzione [[GESTRN]]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=GESTRN&amp;diff=404</id>
		<title>GESTRN</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=GESTRN&amp;diff=404"/>
		<updated>2021-03-17T14:40:16Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: Created page with &amp;quot;== Regole d'arrotondamento ==&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Regole d'arrotondamento ==&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Arrotondamenti_Prezzi&amp;diff=403</id>
		<title>Arrotondamenti Prezzi</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Arrotondamenti_Prezzi&amp;diff=403"/>
		<updated>2021-03-17T14:35:44Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: Created page with &amp;quot; Per gestire l'arrotondamento dei prezzi ci sono diverse variabili in gioco. La variabile globale '''GDECPRI'''  Il parametro SALRND definibile per società:  File:SALRND.pn...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Per gestire l'arrotondamento dei prezzi ci sono diverse variabili in gioco.&lt;br /&gt;
La variabile globale '''GDECPRI'''&lt;br /&gt;
&lt;br /&gt;
Il parametro SALRND definibile per società:&lt;br /&gt;
&lt;br /&gt;
[[File:SALRND.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli arrotondamenti definiti sulla valuta:&lt;br /&gt;
&lt;br /&gt;
[[File:Currency_round.png]]&lt;br /&gt;
&lt;br /&gt;
Vedere i vari help su campo per maggiori dettagli&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:Currency_round.png&amp;diff=402</id>
		<title>File:Currency round.png</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:Currency_round.png&amp;diff=402"/>
		<updated>2021-03-17T14:33:20Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Arrotondamenti legati alla valuta&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:SALRND.png&amp;diff=401</id>
		<title>File:SALRND.png</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:SALRND.png&amp;diff=401"/>
		<updated>2021-03-17T14:32:04Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Parametro Arrotondamento prezzo unitario&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Parametrizzazioni_Funzionali&amp;diff=400</id>
		<title>Parametrizzazioni Funzionali</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Parametrizzazioni_Funzionali&amp;diff=400"/>
		<updated>2021-03-17T14:30:07Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* Vendite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parametrizzazioni Funzionali ==&lt;br /&gt;
&lt;br /&gt;
=== Vendite ===&lt;br /&gt;
[[Arrotondamenti_Prezzi|Arrotondamenti Prezzi]]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Parametrizzazioni_Funzionali&amp;diff=399</id>
		<title>Parametrizzazioni Funzionali</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Parametrizzazioni_Funzionali&amp;diff=399"/>
		<updated>2021-03-17T14:29:59Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* Vendite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parametrizzazioni Funzionali ==&lt;br /&gt;
&lt;br /&gt;
=== Vendite ===&lt;br /&gt;
[[Arrotondamenti_Prezzi|Arrotondamenti Prezzi]]&lt;br /&gt;
GDECPRI&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Parametrizzazioni_Funzionali&amp;diff=398</id>
		<title>Parametrizzazioni Funzionali</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Parametrizzazioni_Funzionali&amp;diff=398"/>
		<updated>2021-03-17T14:29:51Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* Vendite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parametrizzazioni Funzionali ==&lt;br /&gt;
&lt;br /&gt;
=== Vendite ===&lt;br /&gt;
Arrotondamenti_Prezzi|Arrotondamenti Prezzi]]&lt;br /&gt;
GDECPRI&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Parametrizzazioni_Funzionali&amp;diff=397</id>
		<title>Parametrizzazioni Funzionali</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Parametrizzazioni_Funzionali&amp;diff=397"/>
		<updated>2021-03-17T14:29:26Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* Vendite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parametrizzazioni Funzionali ==&lt;br /&gt;
&lt;br /&gt;
=== Vendite ===&lt;br /&gt;
[[Vendite Arrotondamenti Prezzi]]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Parametrizzazioni_Funzionali&amp;diff=396</id>
		<title>Parametrizzazioni Funzionali</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Parametrizzazioni_Funzionali&amp;diff=396"/>
		<updated>2021-03-17T14:29:16Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: Created page with &amp;quot;== Parametrizzazioni Funzionali ==  === Vendite === Vendite_Arrotondamenti_Prezzi&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parametrizzazioni Funzionali ==&lt;br /&gt;
&lt;br /&gt;
=== Vendite ===&lt;br /&gt;
[[Vendite_Arrotondamenti_Prezzi]]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Main_Page&amp;diff=395</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Main_Page&amp;diff=395"/>
		<updated>2021-03-17T14:28:25Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* per tecnici */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;Benvenuti in SageDev KB!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il wiki italiano su Sage X3&lt;br /&gt;
&lt;br /&gt;
Chiunque può contribuire!&lt;br /&gt;
&lt;br /&gt;
Buon lavoro&lt;br /&gt;
&lt;br /&gt;
== Parti da qui ==&lt;br /&gt;
=== per utenti finali ===&lt;br /&gt;
* [[UtentiFinali| Utenti finali]]&lt;br /&gt;
&lt;br /&gt;
=== per tecnici ===&lt;br /&gt;
&lt;br /&gt;
* [[Sistema|Sistema]]: Informazioni relative allo configurazione del Sistema Sage&lt;br /&gt;
* [[Syracuse]]&lt;br /&gt;
* [[Menu principale]]&lt;br /&gt;
* [[Parametrizzazione|Parametrizzazione]]: Informazioni relative allo sviluppo parametrico&lt;br /&gt;
* [[Programmazione|Programmazione]]: Informazioni relative allo sviluppo software&lt;br /&gt;
* [[Web Services]]&lt;br /&gt;
* [[Crystal Report]]&lt;br /&gt;
* [[Eclipse|Eclipse]]&lt;br /&gt;
* [[Parametrizzazioni Funzionali]]&lt;br /&gt;
* [[Risorse]]&lt;br /&gt;
* [[Supporto Formula|Supporto Formula]]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Troubleshooting_picking_ricevimenti_da_creazione_fattura_acquisto&amp;diff=394</id>
		<title>Troubleshooting picking ricevimenti da creazione fattura acquisto</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Troubleshooting_picking_ricevimenti_da_creazione_fattura_acquisto&amp;diff=394"/>
		<updated>2021-03-16T09:40:31Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quando si crea una fattura di acquisto si può andare in picking dal browser &amp;quot;Selezione ricevimenti&amp;quot; (oggetto PT1)&lt;br /&gt;
&lt;br /&gt;
Il browser &amp;quot;Selezione ricevimenti&amp;quot; è gestito dai sorgente SUBPIH (standard) e da SPVPIH (verticale italiano). &lt;br /&gt;
La prima condizione di filtro è che la riga di ricevimento NON sia fatturata (non completamente fatturata) &amp;lt;code&amp;gt;PRECEIPTD.LININVFLG = 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:FILGAUSUP.jpg|FILGAUSUP.jpg]]&lt;br /&gt;
&lt;br /&gt;
in SUBPIHA, dove viene impostato FILGAUSUP, troviamo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $OUVRE_BOITE&lt;br /&gt;
 #-------------------------------#&lt;br /&gt;
 # Après ouverture de la fenêtre #&lt;br /&gt;
 #-------------------------------#&lt;br /&gt;
 #----- Chargement des noms des Currbox de chaque tiroir -----#&lt;br /&gt;
 Global Char GBOXPI2(10), GBOXPO1(10), GBOXPT1(10), GBOXPI1(10), GBOXPN1(10), GBOXSI2(10), GBOXLO1(10)&lt;br /&gt;
 GBOXPI2=&amp;quot;GAU_CHE&amp;quot;+num$(find(&amp;quot;PI2&amp;quot;,OBJLIS(1..8))) : # Liste des factures par fournisseur&lt;br /&gt;
 GBOXPO1=&amp;quot;GAU_CHE&amp;quot;+num$(find(&amp;quot;PO1&amp;quot;,OBJLIS(1..8))) : # Picking des commandes&lt;br /&gt;
 GBOXPT1=&amp;quot;GAU_CHE&amp;quot;+num$(find(&amp;quot;PT1&amp;quot;,OBJLIS(1..8))) : # Picking des réceptions&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [...]&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 $FILGAUCHE&lt;br /&gt;
 #----------------------------------------------#&lt;br /&gt;
 # Filtrer les enregistrements listes de gauche #&lt;br /&gt;
 #----------------------------------------------#  &lt;br /&gt;
 &lt;br /&gt;
 [...]&lt;br /&gt;
 &lt;br /&gt;
  Elsif currbox=GBOXPT1 : # Picking des réceptions&lt;br /&gt;
    If [M:PIH0]PIHTYP&amp;lt;&amp;gt;1&lt;br /&gt;
      FILGAUSUP(0) =&amp;quot;[F:PTD]LININVFLG=9&amp;quot; : FILGAUSUP(1)=&amp;quot;&amp;quot;&lt;br /&gt;
    Else&lt;br /&gt;
      FILGAUSUP(0) =&amp;quot;[F:PTD]LININVFLG=1 &amp;amp; [F:PTD]BPSINV=[M:PIH0]BPR&amp;quot;&lt;br /&gt;
      If [M:PCIW]WITMREF&amp;lt;&amp;gt;&amp;quot;&amp;quot; FILGAUSUP(0)+=&amp;quot; &amp;amp; pat([F:PTD]ITMREF,[M:PCIW]WITMREF)&amp;lt;&amp;gt;0&amp;quot; : Endif&lt;br /&gt;
      If [M:PCIW]WNUMRCP&amp;lt;&amp;gt;&amp;quot;&amp;quot; FILGAUSUP(0)+=&amp;quot; &amp;amp; pat([F:PTD]PTHNUM,[M:PCIW]WNUMRCP)&amp;lt;&amp;gt;0&amp;quot; : Endif&lt;br /&gt;
      If [M:PCIW]WNUMCDE&amp;lt;&amp;gt;&amp;quot;&amp;quot; FILGAUSUP(0)+=&amp;quot; &amp;amp; pat([F:PTD]POHNUM,[M:PCIW]WNUMCDE)&amp;lt;&amp;gt;0&amp;quot; : Endif&lt;br /&gt;
      FILGAUSUP(0)-=&amp;quot;&amp;amp; [F:PTD]LINTYP&amp;lt;3&amp;quot;&lt;br /&gt;
      If [M:PCIW]WBPSNDE&amp;lt;&amp;gt;&amp;quot;&amp;quot;&lt;br /&gt;
        FILGAUSUP(0)+=&amp;quot; &amp;amp; pat([F:PTH]BPSNDE,[M:PCIW]WBPSNDE)&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
      Endif&lt;br /&gt;
      FILGAUSUP(1)=&amp;quot;&amp;amp; [F:FCY]LEGCPY=GSOCIETE&amp;quot;&lt;br /&gt;
      If GCTLDATORI=2  FILGAUSUP(1)-=&amp;quot;&amp;amp; (([F:PTH]NDEDAT=[0/0/0] &amp;amp; [F:PTH]RCPDAT&amp;lt;=[M:PIH0]ACCDAT)|([F:PTH]NDEDAT&amp;lt;&amp;gt;[0/0/0] &amp;amp; min([F:PTH]NDEDAT,[F:PTH]RCPDAT)&amp;lt;=[M:PIH0]ACCDAT))&amp;quot; &lt;br /&gt;
      Endif&lt;br /&gt;
      FILGAUSUP(1)-=&amp;quot;&amp;amp; ([F:PTH]BETFCY&amp;lt;&amp;gt;2  | [F:PTH]BETCPY=2)&amp;quot;&lt;br /&gt;
      GBIDC3=&amp;quot;&amp;quot; : Call FILROLE(&amp;quot;PTH&amp;quot;,GBIDC3) From SUBARL&lt;br /&gt;
      If GPIHQTYRET = 1&lt;br /&gt;
        FILGAUSUP(3) =&amp;quot;&amp;amp; [F:PTD]RTNQTYPUU&amp;lt;[F:PTD]QTYPUU&amp;quot;&lt;br /&gt;
        FILGAUSUP(3) -=&amp;quot;&amp;amp; &amp;quot;+GBIDC3&lt;br /&gt;
      Else&lt;br /&gt;
        FILGAUSUP(3) =&amp;quot;&amp;amp; &amp;quot;+GBIDC3&lt;br /&gt;
      Endif&lt;br /&gt;
    Endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Andando in Situazione riga:&lt;br /&gt;
&lt;br /&gt;
[[File:PTH Situazione riga.gif|PTH Situazione riga.gif]]&lt;br /&gt;
&lt;br /&gt;
si possono vedere le qta fatturate; se il totale supera la qta ricevuta ovviamente la riga non comparirà perchè è già stato fatturato tutto.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Troubleshooting_picking_ricevimenti_da_creazione_fattura_acquisto&amp;diff=393</id>
		<title>Troubleshooting picking ricevimenti da creazione fattura acquisto</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Troubleshooting_picking_ricevimenti_da_creazione_fattura_acquisto&amp;diff=393"/>
		<updated>2021-03-16T09:23:50Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quando si crea una fattura di acquisto si può andare in picking dal browser &amp;quot;Selezione ricevimenti&amp;quot; (oggetto PT1)&lt;br /&gt;
&lt;br /&gt;
Il browser &amp;quot;Selezione ricevimenti&amp;quot; è gestito dai sorgente SUBPIH (standard) e da SPVPIH (verticale italiano). &lt;br /&gt;
La prima condizione di filtro è che la riga di ricevimento NON sia fatturata (non completamente fatturata) &amp;lt;code&amp;gt;PRECEIPTD.LININVFLG = 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:FILGAUSUP.jpg|FILGAUSUP.jpg]]&lt;br /&gt;
&lt;br /&gt;
in SUBPIHA, dove viene impostato FILGAUSUP, troviamo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
$OUVRE_BOITE&lt;br /&gt;
#-------------------------------#&lt;br /&gt;
# Après ouverture de la fenêtre #&lt;br /&gt;
#-------------------------------#&lt;br /&gt;
#----- Chargement des noms des Currbox de chaque tiroir -----#&lt;br /&gt;
Global Char GBOXPI2(10), GBOXPO1(10), GBOXPT1(10), GBOXPI1(10), GBOXPN1(10), GBOXSI2(10), GBOXLO1(10)&lt;br /&gt;
GBOXPI2=&amp;quot;GAU_CHE&amp;quot;+num$(find(&amp;quot;PI2&amp;quot;,OBJLIS(1..8))) : # Liste des factures par fournisseur&lt;br /&gt;
GBOXPO1=&amp;quot;GAU_CHE&amp;quot;+num$(find(&amp;quot;PO1&amp;quot;,OBJLIS(1..8))) : # Picking des commandes&lt;br /&gt;
GBOXPT1=&amp;quot;GAU_CHE&amp;quot;+num$(find(&amp;quot;PT1&amp;quot;,OBJLIS(1..8))) : # Picking des réceptions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$FILGAUCHE&lt;br /&gt;
#----------------------------------------------#&lt;br /&gt;
# Filtrer les enregistrements listes de gauche #&lt;br /&gt;
#----------------------------------------------#&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
  Elsif currbox=GBOXPT1 : # Picking des réceptions&lt;br /&gt;
    If [M:PIH0]PIHTYP&amp;lt;&amp;gt;1&lt;br /&gt;
      FILGAUSUP(0) =&amp;quot;[F:PTD]LININVFLG=9&amp;quot; : FILGAUSUP(1)=&amp;quot;&amp;quot;&lt;br /&gt;
    Else&lt;br /&gt;
      FILGAUSUP(0) =&amp;quot;[F:PTD]LININVFLG=1 &amp;amp; [F:PTD]BPSINV=[M:PIH0]BPR&amp;quot;&lt;br /&gt;
      If [M:PCIW]WITMREF&amp;lt;&amp;gt;&amp;quot;&amp;quot; FILGAUSUP(0)+=&amp;quot; &amp;amp; pat([F:PTD]ITMREF,[M:PCIW]WITMREF)&amp;lt;&amp;gt;0&amp;quot; : Endif&lt;br /&gt;
      If [M:PCIW]WNUMRCP&amp;lt;&amp;gt;&amp;quot;&amp;quot; FILGAUSUP(0)+=&amp;quot; &amp;amp; pat([F:PTD]PTHNUM,[M:PCIW]WNUMRCP)&amp;lt;&amp;gt;0&amp;quot; : Endif&lt;br /&gt;
      If [M:PCIW]WNUMCDE&amp;lt;&amp;gt;&amp;quot;&amp;quot; FILGAUSUP(0)+=&amp;quot; &amp;amp; pat([F:PTD]POHNUM,[M:PCIW]WNUMCDE)&amp;lt;&amp;gt;0&amp;quot; : Endif&lt;br /&gt;
     #FILGAUSUP(0)-=&amp;quot;&amp;amp; ([F:PTD]QTYPUU&amp;gt;[F:PTD]INVQTYPUU | [F:PTD]QTYSTU&amp;gt;[F:PTD]INVQTYSTU)&amp;quot;&lt;br /&gt;
      FILGAUSUP(0)-=&amp;quot;&amp;amp; [F:PTD]LINTYP&amp;lt;3&amp;quot;&lt;br /&gt;
      If [M:PCIW]WBPSNDE&amp;lt;&amp;gt;&amp;quot;&amp;quot;&lt;br /&gt;
        FILGAUSUP(0)+=&amp;quot; &amp;amp; pat([F:PTH]BPSNDE,[M:PCIW]WBPSNDE)&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
      Endif&lt;br /&gt;
      FILGAUSUP(1)=&amp;quot;&amp;amp; [F:FCY]LEGCPY=GSOCIETE&amp;quot;&lt;br /&gt;
      #VPO 21/04/11 73382 ajout ctl DATORI aussi avec date BL&lt;br /&gt;
      #If GCTLDATORI=2  FILGAUSUP(1)-=&amp;quot;&amp;amp; [F:PTH]RCPDAT&amp;lt;=[M:PIH0]ACCDAT&amp;quot; : Endif&lt;br /&gt;
      If GCTLDATORI=2  FILGAUSUP(1)-=&amp;quot;&amp;amp; (([F:PTH]NDEDAT=[0/0/0] &amp;amp; [F:PTH]RCPDAT&amp;lt;=[M:PIH0]ACCDAT)|([F:PTH]NDEDAT&amp;lt;&amp;gt;[0/0/0] &amp;amp; min([F:PTH]NDEDAT,[F:PTH]RCPDAT)&amp;lt;=[M:PIH0]ACCDAT))&amp;quot; : Endif&lt;br /&gt;
      # Issue 95534 - 2013-12-31 by SR : Réceptions Inter société sont toujours facurables&lt;br /&gt;
      #FILGAUSUP(1)-=&amp;quot;&amp;amp; ([F:PTH]BETFCY&amp;lt;&amp;gt;2 | ([F:PTH]BETCPY=2 &amp;amp; ([F:PTD]VERFLG=2 | [F:PTD]SDHNUM='')))&amp;quot;&lt;br /&gt;
      FILGAUSUP(1)-=&amp;quot;&amp;amp; ([F:PTH]BETFCY&amp;lt;&amp;gt;2  | [F:PTH]BETCPY=2)&amp;quot;&lt;br /&gt;
      GBIDC3=&amp;quot;&amp;quot; : Call FILROLE(&amp;quot;PTH&amp;quot;,GBIDC3) From SUBARL&lt;br /&gt;
      # Issue 70507 - 2012-01-18 by MUARN : qté facturable non nulle&lt;br /&gt;
      If GPIHQTYRET = 1&lt;br /&gt;
        FILGAUSUP(3) =&amp;quot;&amp;amp; [F:PTD]RTNQTYPUU&amp;lt;[F:PTD]QTYPUU&amp;quot;&lt;br /&gt;
        FILGAUSUP(3) -=&amp;quot;&amp;amp; &amp;quot;+GBIDC3&lt;br /&gt;
      Else&lt;br /&gt;
        FILGAUSUP(3) =&amp;quot;&amp;amp; &amp;quot;+GBIDC3&lt;br /&gt;
      Endif&lt;br /&gt;
    Endif&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Andando in Situazione riga:&lt;br /&gt;
&lt;br /&gt;
[[File:PTH Situazione riga.gif|PTH Situazione riga.gif]]&lt;br /&gt;
&lt;br /&gt;
si pussono vedere le qta fatturate; se il totale supera la qta ricevuta ovviamente la riga non comparirà perchè è già stato fatturato tutto.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Troubleshooting_picking_ricevimenti_da_creazione_fattura_acquisto&amp;diff=392</id>
		<title>Troubleshooting picking ricevimenti da creazione fattura acquisto</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Troubleshooting_picking_ricevimenti_da_creazione_fattura_acquisto&amp;diff=392"/>
		<updated>2021-03-16T09:21:16Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quando si crea una fattura di acquisto si può andare in picking dal browser &amp;quot;Selezione ricevimenti&amp;quot; (oggetto PT1)&lt;br /&gt;
&lt;br /&gt;
Il browser &amp;quot;Selezione ricevimenti&amp;quot; è gestito dai sorgente SUBPIH (standard) e da SPVPIH (verticale italiano). &lt;br /&gt;
La prima condizione di filtro è che la riga di ricevimento NON sia fatturata (non completamente fatturata) &amp;lt;code&amp;gt;PRECEIPTD.LININVFLG = 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:FILGAUSUP.jpg|FILGAUSUP.jpg]]&lt;br /&gt;
&lt;br /&gt;
in SUBPIHA troviamo una cosa simile, dove viene impostato FILGAUSUP&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  Elsif currbox=GBOXPT1 : # Picking des réceptions&lt;br /&gt;
    If [M:PIH0]PIHTYP&amp;lt;&amp;gt;1&lt;br /&gt;
      FILGAUSUP(0) =&amp;quot;[F:PTD]LININVFLG=9&amp;quot; : FILGAUSUP(1)=&amp;quot;&amp;quot;&lt;br /&gt;
    Else&lt;br /&gt;
      FILGAUSUP(0) =&amp;quot;[F:PTD]LININVFLG=1 &amp;amp; [F:PTD]BPSINV=[M:PIH0]BPR&amp;quot;&lt;br /&gt;
      If [M:PCIW]WITMREF&amp;lt;&amp;gt;&amp;quot;&amp;quot; FILGAUSUP(0)+=&amp;quot; &amp;amp; pat([F:PTD]ITMREF,[M:PCIW]WITMREF)&amp;lt;&amp;gt;0&amp;quot; : Endif&lt;br /&gt;
      If [M:PCIW]WNUMRCP&amp;lt;&amp;gt;&amp;quot;&amp;quot; FILGAUSUP(0)+=&amp;quot; &amp;amp; pat([F:PTD]PTHNUM,[M:PCIW]WNUMRCP)&amp;lt;&amp;gt;0&amp;quot; : Endif&lt;br /&gt;
      If [M:PCIW]WNUMCDE&amp;lt;&amp;gt;&amp;quot;&amp;quot; FILGAUSUP(0)+=&amp;quot; &amp;amp; pat([F:PTD]POHNUM,[M:PCIW]WNUMCDE)&amp;lt;&amp;gt;0&amp;quot; : Endif&lt;br /&gt;
     #FILGAUSUP(0)-=&amp;quot;&amp;amp; ([F:PTD]QTYPUU&amp;gt;[F:PTD]INVQTYPUU | [F:PTD]QTYSTU&amp;gt;[F:PTD]INVQTYSTU)&amp;quot;&lt;br /&gt;
      FILGAUSUP(0)-=&amp;quot;&amp;amp; [F:PTD]LINTYP&amp;lt;3&amp;quot;&lt;br /&gt;
      If [M:PCIW]WBPSNDE&amp;lt;&amp;gt;&amp;quot;&amp;quot;&lt;br /&gt;
        FILGAUSUP(0)+=&amp;quot; &amp;amp; pat([F:PTH]BPSNDE,[M:PCIW]WBPSNDE)&amp;lt;&amp;gt;0&amp;quot;&lt;br /&gt;
      Endif&lt;br /&gt;
      FILGAUSUP(1)=&amp;quot;&amp;amp; [F:FCY]LEGCPY=GSOCIETE&amp;quot;&lt;br /&gt;
      #VPO 21/04/11 73382 ajout ctl DATORI aussi avec date BL&lt;br /&gt;
      #If GCTLDATORI=2  FILGAUSUP(1)-=&amp;quot;&amp;amp; [F:PTH]RCPDAT&amp;lt;=[M:PIH0]ACCDAT&amp;quot; : Endif&lt;br /&gt;
      If GCTLDATORI=2  FILGAUSUP(1)-=&amp;quot;&amp;amp; (([F:PTH]NDEDAT=[0/0/0] &amp;amp; [F:PTH]RCPDAT&amp;lt;=[M:PIH0]ACCDAT)|([F:PTH]NDEDAT&amp;lt;&amp;gt;[0/0/0] &amp;amp; min([F:PTH]NDEDAT,[F:PTH]RCPDAT)&amp;lt;=[M:PIH0]ACCDAT))&amp;quot; : Endif&lt;br /&gt;
      # Issue 95534 - 2013-12-31 by SR : Réceptions Inter société sont toujours facurables&lt;br /&gt;
      #FILGAUSUP(1)-=&amp;quot;&amp;amp; ([F:PTH]BETFCY&amp;lt;&amp;gt;2 | ([F:PTH]BETCPY=2 &amp;amp; ([F:PTD]VERFLG=2 | [F:PTD]SDHNUM='')))&amp;quot;&lt;br /&gt;
      FILGAUSUP(1)-=&amp;quot;&amp;amp; ([F:PTH]BETFCY&amp;lt;&amp;gt;2  | [F:PTH]BETCPY=2)&amp;quot;&lt;br /&gt;
      GBIDC3=&amp;quot;&amp;quot; : Call FILROLE(&amp;quot;PTH&amp;quot;,GBIDC3) From SUBARL&lt;br /&gt;
      # Issue 70507 - 2012-01-18 by MUARN : qté facturable non nulle&lt;br /&gt;
      If GPIHQTYRET = 1&lt;br /&gt;
        FILGAUSUP(3) =&amp;quot;&amp;amp; [F:PTD]RTNQTYPUU&amp;lt;[F:PTD]QTYPUU&amp;quot;&lt;br /&gt;
        FILGAUSUP(3) -=&amp;quot;&amp;amp; &amp;quot;+GBIDC3&lt;br /&gt;
      Else&lt;br /&gt;
        FILGAUSUP(3) =&amp;quot;&amp;amp; &amp;quot;+GBIDC3&lt;br /&gt;
      Endif&lt;br /&gt;
    Endif&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Andando in Situazione riga:&lt;br /&gt;
&lt;br /&gt;
[[File:PTH Situazione riga.gif|PTH Situazione riga.gif]]&lt;br /&gt;
&lt;br /&gt;
si pussono vedere le qta fatturate; se il totale supera la qta ricevuta ovviamente la riga non comparirà perchè è già stato fatturato tutto.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Troubleshooting_picking_ricevimenti_da_creazione_fattura_acquisto&amp;diff=391</id>
		<title>Troubleshooting picking ricevimenti da creazione fattura acquisto</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Troubleshooting_picking_ricevimenti_da_creazione_fattura_acquisto&amp;diff=391"/>
		<updated>2021-03-16T09:08:07Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quando si crea una fattura di acquisto si può andare in picking dal browser &amp;quot;Selezione ricevimenti&amp;quot; (oggetto PT1)&lt;br /&gt;
&lt;br /&gt;
Il browser &amp;quot;Selezione ricevimenti&amp;quot; è gestito dai sorgente SUBPIH (standard) e da SPVPIH (verticale italiano). &lt;br /&gt;
La prima condizione di filtro è che la riga di ricevimento NON sia fatturata (non completamente fatturata) &amp;lt;code&amp;gt;PRECEIPTD.LININVFLG = 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:FILGAUSUP.jpg|FILGAUSUP.jpg]]&lt;br /&gt;
&lt;br /&gt;
Andando in Situazione riga:&lt;br /&gt;
&lt;br /&gt;
[[File:PTH Situazione riga.gif|PTH Situazione riga.gif]]&lt;br /&gt;
&lt;br /&gt;
si pussono vedere le qta fatturate; se il totale supera la qta ricevuta ovviamente la riga non comparirà perchè è già stato fatturato tutto.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Troubleshooting_picking_ricevimenti_da_creazione_fattura_acquisto&amp;diff=390</id>
		<title>Troubleshooting picking ricevimenti da creazione fattura acquisto</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Troubleshooting_picking_ricevimenti_da_creazione_fattura_acquisto&amp;diff=390"/>
		<updated>2021-03-16T09:07:51Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: Created page with &amp;quot;Quando si crea una fattura di acquisto si può andare in picking dal browser &amp;quot;Selezione ricevimenti&amp;quot; (oggetto PT1)  Il browser &amp;quot;Selezione ricevimenti&amp;quot; è gestito dai sorgente...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quando si crea una fattura di acquisto si può andare in picking dal browser &amp;quot;Selezione ricevimenti&amp;quot; (oggetto PT1)&lt;br /&gt;
&lt;br /&gt;
Il browser &amp;quot;Selezione ricevimenti&amp;quot; è gestito dai sorgente SUBPIH (standard) e da SPVPIH (verticale italiano). &lt;br /&gt;
La prima condizione di filtro è che la riga di ricevimento NON sia fatturata (non completamente fatturata) &amp;lt;code&amp;gt;PRECEIPTD.LININVFLG = 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:FILGAUSUP.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
Andando in Situazione riga:&lt;br /&gt;
&lt;br /&gt;
[[File:PTH Situazione riga.gif|thumb]]&lt;br /&gt;
&lt;br /&gt;
si pussono vedere le qta fatturate; se il totale supera la qta ricevuta ovviamente la riga non comparirà perchè è già stato fatturato tutto.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:FILGAUSUP.jpg&amp;diff=389</id>
		<title>File:FILGAUSUP.jpg</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:FILGAUSUP.jpg&amp;diff=389"/>
		<updated>2021-03-16T09:06:15Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filtro righe ricevimenti in picking fattura acquisto&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:PTH_Situazione_riga.gif&amp;diff=388</id>
		<title>File:PTH Situazione riga.gif</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:PTH_Situazione_riga.gif&amp;diff=388"/>
		<updated>2021-03-16T08:51:05Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Situazione riga di un ricevimento&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=GESAFC&amp;diff=383</id>
		<title>GESAFC</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=GESAFC&amp;diff=383"/>
		<updated>2021-03-01T21:28:01Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: /* Dizionario funzioni */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Dizionario funzioni ==&lt;br /&gt;
&lt;br /&gt;
=== Opzioni ===&lt;br /&gt;
&lt;br /&gt;
Nel riquadro Opzioni è possibile specificare uno o più codici opzione.&lt;br /&gt;
Questi codici poi saranno utilizzabili nella parametrizzazione delle [[GESFAP|abilitazioni]] dei profili funzione.&lt;br /&gt;
&lt;br /&gt;
Esempio presente a standard è la funzione GESITM,che presenta due opzioni, Listino e Costo:&lt;br /&gt;
&lt;br /&gt;
[[File:SD_Opzioni_funzione_GESITM.png]]&lt;br /&gt;
&lt;br /&gt;
Qui vedi dove usarle:&lt;br /&gt;
&lt;br /&gt;
[[File:SD_Opzioni_funzione_GESITM_abil_funz.png]]&lt;br /&gt;
&lt;br /&gt;
Se è attiva l'autorizzaione per sito come in GESITF:&lt;br /&gt;
&lt;br /&gt;
[[File:SD_Funzione_Aut_Sito_GESITF.png]]&lt;br /&gt;
&lt;br /&gt;
l'opzione si può dare sito per sito.&lt;br /&gt;
&lt;br /&gt;
[[File:SD_Opzioni_funzione_HELP.png]]&lt;br /&gt;
&lt;br /&gt;
In pratica il sistema carica queste variabili globali:&lt;br /&gt;
GNBAUZ numero di siti presenti&lt;br /&gt;
GUSRFCY(1..GNBAUZ) nomi dei siti&lt;br /&gt;
GUSRAUZ(i)   opzioni attive sull'i-esimo sito&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aggiungiamo per esempio un'opzione 'm' ad una funzione.&lt;br /&gt;
AAA: inserire il codice attività se la funzione è standard!&lt;br /&gt;
AAA: usare una lettera minuscola, come specificato nell'Help.&lt;br /&gt;
&lt;br /&gt;
Supponiamo di voler attivare/disattivare un bottone, pertanto ci posizioniamo nella SETBOUT.&lt;br /&gt;
Nel sorgente specifico, il cosiddetto SPE, dovrai inserire un pezzo di codice simile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$SETBOUT&lt;br /&gt;
 #nel campo [M]FCY  ci sia il sito dell'oggetto corrente&lt;br /&gt;
 #recupero l'indice del sito relativo all'oggetto corrente:&lt;br /&gt;
 ISITE = find([M]STOFCY,GUSRFCY(1..GNBAUZ))&lt;br /&gt;
 If ISITE&lt;br /&gt;
  #recupero autorizzazioni per quel sito:&lt;br /&gt;
  AUZ = GUSRAUZ(ISITE)&lt;br /&gt;
  #verifico l'autorizzazione&lt;br /&gt;
  If instr(1,AUZ,'m')=0&lt;br /&gt;
      # quello che vuoi:&lt;br /&gt;
      # Call VIREBOUT(CHAINE,...) From GOBJET&lt;br /&gt;
  Endif&lt;br /&gt;
 Endif&lt;br /&gt;
Return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se non è attiva l'autorizzazione per sito allora tutti i siti hanno le stesse opzioni,&lt;br /&gt;
basta quindi fare la verifica su GUSRFCY(1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SD_Var_global_GUSRFCY.png]]&lt;br /&gt;
[[File:SD_Opzioni_funzione_GUSRAUZ_calc.png]]&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:SD_Var_global_GUSRFCY.png&amp;diff=382</id>
		<title>File:SD Var global GUSRFCY.png</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:SD_Var_global_GUSRFCY.png&amp;diff=382"/>
		<updated>2021-03-01T20:52:04Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: Definizione Variabile globale GUSRFCY&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Definizione Variabile globale GUSRFCY&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:SD_Funzione_Aut_Sito_GESITF.png&amp;diff=381</id>
		<title>File:SD Funzione Aut Sito GESITF.png</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:SD_Funzione_Aut_Sito_GESITF.png&amp;diff=381"/>
		<updated>2021-03-01T20:51:31Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: Opzioni funzione [GESAFC] con autorizzaione per sito: esempio di GESITF (Articolo sito)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Opzioni funzione [GESAFC] con autorizzaione per sito: esempio di GESITF (Articolo sito)&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:SD_Opzioni_funzione_GESITM.png&amp;diff=380</id>
		<title>File:SD Opzioni funzione GESITM.png</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:SD_Opzioni_funzione_GESITM.png&amp;diff=380"/>
		<updated>2021-03-01T20:50:55Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: Opzioni funzione [GESAFC]: esempio di GESITM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Opzioni funzione [GESAFC]: esempio di GESITM&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:SD_Opzioni_funzione_GUSRAUZ_calc.png&amp;diff=379</id>
		<title>File:SD Opzioni funzione GUSRAUZ calc.png</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:SD_Opzioni_funzione_GUSRAUZ_calc.png&amp;diff=379"/>
		<updated>2021-03-01T20:50:35Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: Opzioni funzione [GESAFC], variabile globale GUSRAUZ, esempio con calcolatrice&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Opzioni funzione [GESAFC], variabile globale GUSRAUZ, esempio con calcolatrice&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:SD_Opzioni_funzione_HELP.png&amp;diff=378</id>
		<title>File:SD Opzioni funzione HELP.png</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:SD_Opzioni_funzione_HELP.png&amp;diff=378"/>
		<updated>2021-03-01T20:50:01Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: Opzioni funzione [GESAFC] l'help in linea&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Opzioni funzione [GESAFC] l'help in linea&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=File:SD_Opzioni_funzione_GESITM_abil_funz.png&amp;diff=377</id>
		<title>File:SD Opzioni funzione GESITM abil funz.png</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=File:SD_Opzioni_funzione_GESITM_abil_funz.png&amp;diff=377"/>
		<updated>2021-03-01T20:49:35Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: Opzioni funzione [GESAFC] usate nelle abilitazioni funzionali : esempio di GESITM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Opzioni funzione [GESAFC] usate nelle abilitazioni funzionali : esempio di GESITM&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Regole_sviluppo&amp;diff=375</id>
		<title>Regole sviluppo</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Regole_sviluppo&amp;diff=375"/>
		<updated>2021-02-19T16:38:03Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Help modello oggetto.png|Help modello oggetto.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Help modello oggetto 2.png|Help modello oggetto 2.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Help modello oggetto 3.png|Help modello oggetto 3.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Help regole sviluppo .png||]]&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE: testo copiato dall'HELP di Sage X3 per comodità&lt;br /&gt;
&lt;br /&gt;
Quando si devono realizzare degli sviluppi specifici, bisogna organizzarsi affinchè questi siano più perenni possibili a fronte dei cambi di versione. La prima parte di questo documento dettaglia i modi di agire.&lt;br /&gt;
&lt;br /&gt;
Indipendentemente da questo primo punto, è possibile che ci si ponga una domanda di organizzazione tecnica dei dossier in cui gli sviluppi vengono fatti. Questo quesito viene affrontato nella seconda parte della documentazione.&lt;br /&gt;
&lt;br /&gt;
== Protezione delle modifiche fatte ==&lt;br /&gt;
&lt;br /&gt;
Il software permette di inglobare degli sviluppi specifici all'interno dello standard, principalmente modificando ad un livello di dettaglio alcuni elementi dello standard per rispondere ad esigenze che lo standard non copre.&lt;br /&gt;
&lt;br /&gt;
Per facilitare la manutenzione di questi specifici perennizzandoli finc quando è possibile, vanno rispettate un certo numero di regole. Queste regole sono 5 e sono riportate qui sotto. Il loro rispetto permetterà di limitare al massimo i problemi in caso di patch o di aggiornamento.&lt;br /&gt;
&lt;br /&gt;
Ma prima di cominciare, occorre sapere che esistono dei limiti insuperabili. A prescindere dalla sofisticazione del sistema dei codici attività, vi sono degli sviluppi che è meglio realizzare riscrivendoli invece che con modifica di un oggetto standard. Così, se una videata è stata modificata così pesantemente (in particolare se i blocchi sono stati modificati) che diventa difficile da mantenere per differenza con la videata standard, è forse meglio crearne una nuova. Lo stesso se una funzione standard è modificata in modo radicale, è forse meglio riscrivere una funzione specifica, basandosi su sotto-programmi standard documentati da ADONIX.&lt;br /&gt;
&lt;br /&gt;
Si tratta di un elemento da considerare prima di ogni sviluppo specifico: è meglio riscrivere o modificare gli elementi forniti dallo standard?&lt;br /&gt;
&lt;br /&gt;
Una volta somposta questa domanda caso per caso, le regole di perennizzazione sono le seguenti:&lt;br /&gt;
&lt;br /&gt;
=== Regola numero 1: Non modificare mai un sorgente standard ===&lt;br /&gt;
&lt;br /&gt;
Il non rispetto di questa regola è il modo migliore per ottenere un dossier impossibile da mantenere.&lt;br /&gt;
&lt;br /&gt;
Infatti, il fatto che un sorgente standard sia consegnato non significa che questo sorgente debba essere modificato. I sorgenti standard consegnati sono per fini di consultazione.&lt;br /&gt;
&lt;br /&gt;
Questo limite non è pertanto un limite che crea disturbo. Infatti, nella maggior parte dei casi, si chiama un programma specifico dedicato, quando questo esiste. E' generalmente il caso:&lt;br /&gt;
&lt;br /&gt;
* in gestione oggetto, a lato del programma SUBXXX, dove XXX è il codice dell'oggetto, esiste un programma SPEXXX per gestire lo specifico.&lt;br /&gt;
&lt;br /&gt;
* in consultazione, a lato del programma standard (chiamato in generale CNSXXXSTD, dove XXX è il codice della consultazione), è possibile indicare il nome di un programma specifico (in generale CNSXXXSPE).&lt;br /&gt;
&lt;br /&gt;
* nel dizionario delle azioni, se l’azione è di tipo Programma standard e il nome del programma comincia per SUB, si può anche utilizzare il programma equivalente che comincia per SPE; se il nome del programma (TRAITE per esempio) non comincia per SUB, il programma specifico associato si chiama XYTRAITE e permette quindi di realizzare degli specifici senza toccare il codice di origine.&lt;br /&gt;
&lt;br /&gt;
* nel dizionario delle azioni, se l’azione è di tipo Inserimento finestra, la finestra principale si chiama per esempio FENETRE, un programma specifico, di nome XWFENETRE, permette di realizzare degli specifici senza toccare il codice di origine.&lt;br /&gt;
&lt;br /&gt;
Inoltre se, per intervenire, uno specifico ha bisogno della modifica di un programma standard, l'unica maniera ammissibile per risolvere i problemi di perennizzazione consiste nel richiedere un entry point ad ADONIX.&lt;br /&gt;
=== Regola numero 2: utilizzare strettamente le regole per battezzare tutti gli elementi aggiunti ===&lt;br /&gt;
&lt;br /&gt;
Per evitare eventuali collisioni con versioni future del software, è obbligatorio chiamare gli elementi aggiunti con nomi che cominciano con X, Y o Z. Per elemento si intende tutto ciò che si trova nel seguente riquadro:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Caption text&lt;br /&gt;
|-&lt;br /&gt;
! Funzione di definizione !! Descrizione&lt;br /&gt;
|-&lt;br /&gt;
| GESATY|| Tipi di dati&lt;br /&gt;
|-&lt;br /&gt;
| GESATB||Tabelle&lt;br /&gt;
|-&lt;br /&gt;
| GESACV||Codici attività&lt;br /&gt;
|-&lt;br /&gt;
| GESAMK||Videate&lt;br /&gt;
|-&lt;br /&gt;
| GESAWI (*)||Finestre &lt;br /&gt;
|-&lt;br /&gt;
| GESAOB||Oggetti&lt;br /&gt;
|-&lt;br /&gt;
| GESACN||Consultazioni&lt;br /&gt;
|-&lt;br /&gt;
| GESACT||Azioni&lt;br /&gt;
|-&lt;br /&gt;
| ADOTRT||Programmi&lt;br /&gt;
|-&lt;br /&gt;
| GESARP||Stampe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(*) Fatta eccezione per le finestre che cominciano per O, che sono associate ad un oggetto il cui nome comincia con X, Y o Z.&lt;br /&gt;
&lt;br /&gt;
Per alcuni elementi esistono delle regole per dare un nome. Infatti:&lt;br /&gt;
&lt;br /&gt;
* vanno per forza aggiunti dei parametri specifici in capitoli dedicati, il cui codice deve cominciare per X, Y, o Z.&lt;br /&gt;
&lt;br /&gt;
* vanno per forza aggiunti dei messaggi specifici nei capitoli il cui numero è compreso tra 160 e 169.&lt;br /&gt;
&lt;br /&gt;
* i menù locali specifici e le tabelle diverse specifiche devono utilizzare le porzioni di numerazione comprese tra 1000 e 1999.&lt;br /&gt;
&lt;br /&gt;
Infine, il nome dei campi aggiunti in tabelle o videate standard devono cominciare con X_, Y_, o Z_.&lt;br /&gt;
=== Regola numero 3: proteggere con un codice attività, ma al livello più di dettaglio possibile ===&lt;br /&gt;
&lt;br /&gt;
Il rispetto delle regole per dare un nome non basta a perennizzare degli elementi. Occorre anche proteggerli con un codice attività che cominci con X, Y o Z. Ma si consiglia di proteggere solo le modifiche fatte a livello di dettaglio più sottile, per beneficiare al massimo delle evoluzioni apportate sugli altri elementi di un elemento del software. Così è possibile proteggere:&lt;br /&gt;
&lt;br /&gt;
* Una videata intera o una tabella intera. In questo caso, ogni modifica apportata sulla videata o sulla tabella da una patch verrà ignorata. Questo tipo di protezione viene consigliato solo per le nuove videate o tabelle o in caso di modifica totale di una videata o di una tabella. Diventa allora inutile mettere un codice attività specifico ai livelli sottostanti, salvo si desideri servirsi di un codice attività per disporre di varianti nella videata o nella tabella.&lt;br /&gt;
&lt;br /&gt;
* Il blocco di una videata. In caso di patch non viene modificato nessuno dei campi del blocco. Anche qui si tratta di un livello abbastanza alto di protezione, poiché tutti i campi del blocco non vengono più modificati in caso di patch. Bisogna quindi proteggere in modo più sottile quando ciò è possibile. Resta il fatto che si tratta dell'unico livello accettabile se si modifica il posizionamento di un blocco standard, o se si cerca di rendere configurabile alla gestione di dossier il numero di righe di un riquadro che altrimenti sarebbe fisso.&lt;br /&gt;
&lt;br /&gt;
* Il campo di una videata o il campo di una tabella o l'indice di una tabella. E' il livello da utilizzare nel caso in cui si modifichino le caratteristiche di un campo (formato, tipo, descrizione, lunghezza...). Questo livello di protezione è molto sottile, sapendo che il solo conflitto potenziale in caso di patch verte sui campi protetti.&lt;br /&gt;
&lt;br /&gt;
* Una tabella collegata, un folder, una lista di selezione in un oggetto (è preferibile ad una protezione globale dell'oggetto).&lt;br /&gt;
&lt;br /&gt;
* Un'opzione, una variabile associata ad una funzione (è preferibile ad una protezione globale della funzione).&lt;br /&gt;
&lt;br /&gt;
Alcuni elementi non possono essere protetti in modo dettagliato (è il caso delle stampe). In questo caso, l'unica soluzione è quella di proteggere globalmente la stampa, installando il file con estensione rpt a livello del dossier di produzione, sapendo che sarà anche possibile decidere di rinominarlo.&lt;br /&gt;
&lt;br /&gt;
C'è tutta una serie di casi in cui i codici attività non sono utili, soprattutto sui campi delle videate:&lt;br /&gt;
&lt;br /&gt;
* Se si vuole aggiungere un controllo supplementare su un campo e se questo controllo può essere definito da una tabella di controllo, è meglio implementarlo così: si tratta infatti di una parametrizzazione che non ha bisogno di essere protetta.&lt;br /&gt;
&lt;br /&gt;
* Lo stesso se si vuole limitare l'accesso al campo in funzione di un utente: le assegnazioni di codici di accesso consistono parametrizzazione.&lt;br /&gt;
&lt;br /&gt;
* Lo stesso se si vuole cambiare interamente gli attributi del tipo di dati associato al campo, è meglio modificare il tipo di dati e proteggerlo da un codice attività: la protezione del campo è allora inutile.&lt;br /&gt;
&lt;br /&gt;
* Se si vogliono aggiungere delle azioni dette « specifiche » (chiamate SPE o SPX), occorre sapere che queste azioni rimangano invariate in caso di patch, anche se il campo non è protetto. Quindi non è utile aggiungere un codice attività sul campo se non sono state fatte altre modifiche. Se delle azioni specifiche impongono di aprire una finestra, queste azioni devono essere catalogate nel dizionario delle azioni. D'altronde, non appena il codice dell'azione comincia per X, Y o Z, questa è protetta allo stesso modo senza che sia necessario proteggere il campo. In compenso è necessario proteggere l'azione con un codice attività (sarà richiamata solo se il codice è Attivo).&lt;br /&gt;
&lt;br /&gt;
* Se si vuole cancellare un'azione standard su un campo, è più semplice completarla con un'azione chiamata SPX invece che cancellarla (così, la protezione tramite codice attività non sarà necessaria sul campo).&lt;br /&gt;
=== Regola numero 4: Attenzione agli inserimenti su dei sotto elementi esistenti ===&lt;br /&gt;
&lt;br /&gt;
Gli inserimenti di sotto elementi in un elemento non permettono, in alcuni casi, la perennizzazione. Questo riguarda i seguenti casi:&lt;br /&gt;
&lt;br /&gt;
* aggiungere un indice in una tabella standard deve essere fatto alla fine dell'elenco degli indici e soprattutto non all'inizio di tale elenco (il primo indice è l'indice di default). In compenso non vi sono vincoli sui campi. Si consiglia comunque di non chiamarli in modo consecutivo nel formato ABBRn, dove ABBR è l'abbreviazione della tabella e n il numero di riga (infatti è possibile che un'evoluzione dello standard necessiti dell'aggiunta di un indice standard).&lt;br /&gt;
&lt;br /&gt;
* i blocchi di una videata sono conosciuti solo tramite il loro numero. Così, se si desidera aggiungere un blocco in una videata, occorre sempre metterlo alla fine (giocare sulle posizioni di inserimento). Nemmeno qui vi sono vincoli sui campi.&lt;br /&gt;
&lt;br /&gt;
* lo stesso vale per i folder di una tabella, le liste di selezione di un oggetto (in versione 140 si differenzia l'ordine del loro ordine di apparizione, poiché esiste una campo rank).&lt;br /&gt;
=== Regola numero 5: Prima dell'installazione di ogni patch o di ogni versione, utilizzare il tester di patch ===&lt;br /&gt;
&lt;br /&gt;
Questo strumento è stato realizzato per permettere di evidenziare i potenziali conflitti al momento dell'installazione di patch. Infatti, legge la testata dei file di patch presenti in una data directory e visualizza in una traccia l'elenco degli elementi presenti in questa lista e che sono oggetto di specifici. Se l'elenco in questione è vuoto, non vi è rischio di conflitti. Al contrario, l'elenco degli elementi in conflitto è generalmente scarso e basta allora esaminare in dettaglio i pochi elementi che vi si trovano.&lt;br /&gt;
&lt;br /&gt;
Quando si installa una versione tramite un CD, (in una directory dipendente dal software, sulla versione 130 di ADONIX X3 ad esempio, si trovano nella directory X3Patch\X3V130_technical) vi sono una serie di cartelle chiamate in funzione delle versioni intermedie del software (P131, P132, P133…), che contengono dei file chiamati List_nnn.dat. Questi file contengono solo la testata degli elementi contenuti nelle patch consecutive che permettono di passare da una versione all'altra. E' quindi possibile utilizzare questi file nello stesso modo con il tester di patch, per assicurarsi dei potenziali conflitti (si partirà dalla lista seguendo la lista corrente installata sul dossier da aggiornare).&lt;br /&gt;
== Organizzazione dei dossier in due o tre livelli ==&lt;br /&gt;
&lt;br /&gt;
Al momento dell'esecuzione del software, il motore adonix carica ed esegue dei file che contengono un codice intermedio (il p-code) indipendente dall'ambiente. Questi file possono essere dei programmi, delle descrizioni di videate, la descrizione delle tabelle (per fare una consultazione sulla tabella in questione). Questi file vengono cercati nel dossier in corso di esecuzione. Ma se un file non esisten nel dossier, il motore adonix lo cercherà nel dossier padre di primo livello, poi nel dossier di secondo livello... Il motore adonix può così risalire una gerarchia di 8 dossier successivi, ma per ragioni pratiche, ci si limita a 3 livelli (la gestione di dossier ne gestisce solo 3).&lt;br /&gt;
&lt;br /&gt;
La conseguenza di questa struttura è la seguente: un dossier utente creato nel software dipenderà sia dal dossier supervisore, sia da un dossier che dipende esso stesso dal dossier supervisore. Infatti, se ciò non avvenisse, non sarebbero più accessibili gli elementi indispensabili al funzionamento del dossier e della sua parametrizzazione, che sono presenti solo nel dossier supervisore. I due schemi possibili per un dossier di produzione sono i seguenti:&lt;br /&gt;
&lt;br /&gt;
Il dossier di riferimento intermedio è in generale chiamato dossier di sviluppo, perché una delle possibili implementazioni delle gerarchie di dossier consiste nell'installarvi gli sviluppi specifici.&lt;br /&gt;
&lt;br /&gt;
La gerarchia a 3 livelli è pesante da mantenere. Infatti, l'esistenza di questa gerarchia a tre livelli ha delle conseguenze pratiche: trasferire un dossier di produzione da un server ad un altro presuppone che, affinché il dossier trasferito possa funzionare, la gerarchia sia stata anch'essa trasferita. Nel caso di una gerarchia a due livelli, nessun problema, poiché il dossier supervisore è forzatamente presente in un ambiente in cui è installato il software. In compenso, nel caso di una gerarchia a 3 livelli, occorre anche trasferire il dossier di sviluppo.&lt;br /&gt;
&lt;br /&gt;
Il principio di eredità, se permette di trasferire semplicemente degli sviluppi fatti tramite rivalidazione del dossier di produzione, presenta comunque degli effetti particolari, nella misura in cui l'eredità è immediata se si modifica un programma nel dossier di sviluppo... ma differita per tutti gli elementi del dizionario, che saranno trasferiti solo in caso di rivalidazione. Quindi si rischia di ritrovarsi con delle incoerenze temporanee nel dossier di produzione, dato che si lavora in un dossier di sviluppo.&lt;br /&gt;
&lt;br /&gt;
Questa gerarchia è quindi consigliata solo nei seguenti casi:&lt;br /&gt;
&lt;br /&gt;
* il cliente finale vuole sviluppare i propri specifici e si desidera che lo faccia in modo ben isolato nel dossier di produzione; sapendo che si vogliono degli sviluppi fatti da un partner ADONIX nel dossier intermedio.&lt;br /&gt;
&lt;br /&gt;
* ci si trova in un ambiente di sviluppo di verticali e si desiderano utilizzare dei dossier di produzione a dei fini di test.&lt;br /&gt;
&lt;br /&gt;
In tutti gli altri casi, si consiglia di utilizzare una gerarchia a due livelli. In questo caso, occorre utilizzare un dossier di test a fianco del dossier di produzione, se si desiderano realizzare degli sviluppi in corso di gestione e testarli prima di installarli (tramite copia o patch) nel dossier di produzione. L'utilizzo della funzione di patch è spesso preferibile: infatti permette di creare dei « packages » applicativi dal dossier di sviluppo e di integrarli in blocco nel dossier di produzione. Inoltre, la versione 130 integra una nuova funzione di creazione di una patch incrementale. Infatti è possibile creare una patch che contiene tutto ciò che è stato modificato su un dossier da una determinata data. Questo permette molto facilmente di isolare gli sviluppi e le parametrizzazioni realizzate tra due fasi di un'implementazione.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Regole_sviluppo&amp;diff=374</id>
		<title>Regole sviluppo</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Regole_sviluppo&amp;diff=374"/>
		<updated>2021-02-19T16:36:43Z</updated>

		<summary type="html">&lt;p&gt;Mwadmin: Created page with &amp;quot;File:Help modello oggetto.png|  File:Help modello oggetto 2.png|  File:Help modello oggetto 3.png|  |    Quando si devono realiz...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Help modello oggetto.png|Help modello oggetto.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Help modello oggetto 2.png|Help modello oggetto 2.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Help modello oggetto 3.png|Help modello oggetto 3.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Help regole sviluppo .png||]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quando si devono realizzare degli sviluppi specifici, bisogna organizzarsi affinchè questi siano più perenni possibili a fronte dei cambi di versione. La prima parte di questo documento dettaglia i modi di agire.&lt;br /&gt;
&lt;br /&gt;
Indipendentemente da questo primo punto, è possibile che ci si ponga una domanda di organizzazione tecnica dei dossier in cui gli sviluppi vengono fatti. Questo quesito viene affrontato nella seconda parte della documentazione.&lt;br /&gt;
&lt;br /&gt;
== Protezione delle modifiche fatte ==&lt;br /&gt;
&lt;br /&gt;
Il software permette di inglobare degli sviluppi specifici all'interno dello standard, principalmente modificando ad un livello di dettaglio alcuni elementi dello standard per rispondere ad esigenze che lo standard non copre.&lt;br /&gt;
&lt;br /&gt;
Per facilitare la manutenzione di questi specifici perennizzandoli finc quando è possibile, vanno rispettate un certo numero di regole. Queste regole sono 5 e sono riportate qui sotto. Il loro rispetto permetterà di limitare al massimo i problemi in caso di patch o di aggiornamento.&lt;br /&gt;
&lt;br /&gt;
Ma prima di cominciare, occorre sapere che esistono dei limiti insuperabili. A prescindere dalla sofisticazione del sistema dei codici attività, vi sono degli sviluppi che è meglio realizzare riscrivendoli invece che con modifica di un oggetto standard. Così, se una videata è stata modificata così pesantemente (in particolare se i blocchi sono stati modificati) che diventa difficile da mantenere per differenza con la videata standard, è forse meglio crearne una nuova. Lo stesso se una funzione standard è modificata in modo radicale, è forse meglio riscrivere una funzione specifica, basandosi su sotto-programmi standard documentati da ADONIX.&lt;br /&gt;
&lt;br /&gt;
Si tratta di un elemento da considerare prima di ogni sviluppo specifico: è meglio riscrivere o modificare gli elementi forniti dallo standard?&lt;br /&gt;
&lt;br /&gt;
Una volta somposta questa domanda caso per caso, le regole di perennizzazione sono le seguenti:&lt;br /&gt;
&lt;br /&gt;
=== Regola numero 1: Non modificare mai un sorgente standard ===&lt;br /&gt;
&lt;br /&gt;
Il non rispetto di questa regola è il modo migliore per ottenere un dossier impossibile da mantenere.&lt;br /&gt;
&lt;br /&gt;
Infatti, il fatto che un sorgente standard sia consegnato non significa che questo sorgente debba essere modificato. I sorgenti standard consegnati sono per fini di consultazione.&lt;br /&gt;
&lt;br /&gt;
Questo limite non è pertanto un limite che crea disturbo. Infatti, nella maggior parte dei casi, si chiama un programma specifico dedicato, quando questo esiste. E' generalmente il caso:&lt;br /&gt;
&lt;br /&gt;
* in gestione oggetto, a lato del programma SUBXXX, dove XXX è il codice dell'oggetto, esiste un programma SPEXXX per gestire lo specifico.&lt;br /&gt;
&lt;br /&gt;
* in consultazione, a lato del programma standard (chiamato in generale CNSXXXSTD, dove XXX è il codice della consultazione), è possibile indicare il nome di un programma specifico (in generale CNSXXXSPE).&lt;br /&gt;
&lt;br /&gt;
* nel dizionario delle azioni, se l’azione è di tipo Programma standard e il nome del programma comincia per SUB, si può anche utilizzare il programma equivalente che comincia per SPE; se il nome del programma (TRAITE per esempio) non comincia per SUB, il programma specifico associato si chiama XYTRAITE e permette quindi di realizzare degli specifici senza toccare il codice di origine.&lt;br /&gt;
&lt;br /&gt;
* nel dizionario delle azioni, se l’azione è di tipo Inserimento finestra, la finestra principale si chiama per esempio FENETRE, un programma specifico, di nome XWFENETRE, permette di realizzare degli specifici senza toccare il codice di origine.&lt;br /&gt;
&lt;br /&gt;
Inoltre se, per intervenire, uno specifico ha bisogno della modifica di un programma standard, l'unica maniera ammissibile per risolvere i problemi di perennizzazione consiste nel richiedere un entry point ad ADONIX.&lt;br /&gt;
=== Regola numero 2: utilizzare strettamente le regole per battezzare tutti gli elementi aggiunti ===&lt;br /&gt;
&lt;br /&gt;
Per evitare eventuali collisioni con versioni future del software, è obbligatorio chiamare gli elementi aggiunti con nomi che cominciano con X, Y o Z. Per elemento si intende tutto ciò che si trova nel seguente riquadro:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Caption text&lt;br /&gt;
|-&lt;br /&gt;
! Funzione di definizione !! Descrizione&lt;br /&gt;
|-&lt;br /&gt;
| GESATY|| Tipi di dati&lt;br /&gt;
|-&lt;br /&gt;
| GESATB||Tabelle&lt;br /&gt;
|-&lt;br /&gt;
| GESACV||Codici attività&lt;br /&gt;
|-&lt;br /&gt;
| GESAMK||Videate&lt;br /&gt;
|-&lt;br /&gt;
| GESAWI (*)||Finestre &lt;br /&gt;
|-&lt;br /&gt;
| GESAOB||Oggetti&lt;br /&gt;
|-&lt;br /&gt;
| GESACN||Consultazioni&lt;br /&gt;
|-&lt;br /&gt;
| GESACT||Azioni&lt;br /&gt;
|-&lt;br /&gt;
| ADOTRT||Programmi&lt;br /&gt;
|-&lt;br /&gt;
| GESARP||Stampe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(*) Fatta eccezione per le finestre che cominciano per O, che sono associate ad un oggetto il cui nome comincia con X, Y o Z.&lt;br /&gt;
&lt;br /&gt;
Per alcuni elementi esistono delle regole per dare un nome. Infatti:&lt;br /&gt;
&lt;br /&gt;
* vanno per forza aggiunti dei parametri specifici in capitoli dedicati, il cui codice deve cominciare per X, Y, o Z.&lt;br /&gt;
&lt;br /&gt;
* vanno per forza aggiunti dei messaggi specifici nei capitoli il cui numero è compreso tra 160 e 169.&lt;br /&gt;
&lt;br /&gt;
* i menù locali specifici e le tabelle diverse specifiche devono utilizzare le porzioni di numerazione comprese tra 1000 e 1999.&lt;br /&gt;
&lt;br /&gt;
Infine, il nome dei campi aggiunti in tabelle o videate standard devono cominciare con X_, Y_, o Z_.&lt;br /&gt;
=== Regola numero 3: proteggere con un codice attività, ma al livello più di dettaglio possibile ===&lt;br /&gt;
&lt;br /&gt;
Il rispetto delle regole per dare un nome non basta a perennizzare degli elementi. Occorre anche proteggerli con un codice attività che cominci con X, Y o Z. Ma si consiglia di proteggere solo le modifiche fatte a livello di dettaglio più sottile, per beneficiare al massimo delle evoluzioni apportate sugli altri elementi di un elemento del software. Così è possibile proteggere:&lt;br /&gt;
&lt;br /&gt;
* Una videata intera o una tabella intera. In questo caso, ogni modifica apportata sulla videata o sulla tabella da una patch verrà ignorata. Questo tipo di protezione viene consigliato solo per le nuove videate o tabelle o in caso di modifica totale di una videata o di una tabella. Diventa allora inutile mettere un codice attività specifico ai livelli sottostanti, salvo si desideri servirsi di un codice attività per disporre di varianti nella videata o nella tabella.&lt;br /&gt;
&lt;br /&gt;
* Il blocco di una videata. In caso di patch non viene modificato nessuno dei campi del blocco. Anche qui si tratta di un livello abbastanza alto di protezione, poiché tutti i campi del blocco non vengono più modificati in caso di patch. Bisogna quindi proteggere in modo più sottile quando ciò è possibile. Resta il fatto che si tratta dell'unico livello accettabile se si modifica il posizionamento di un blocco standard, o se si cerca di rendere configurabile alla gestione di dossier il numero di righe di un riquadro che altrimenti sarebbe fisso.&lt;br /&gt;
&lt;br /&gt;
* Il campo di una videata o il campo di una tabella o l'indice di una tabella. E' il livello da utilizzare nel caso in cui si modifichino le caratteristiche di un campo (formato, tipo, descrizione, lunghezza...). Questo livello di protezione è molto sottile, sapendo che il solo conflitto potenziale in caso di patch verte sui campi protetti.&lt;br /&gt;
&lt;br /&gt;
* Una tabella collegata, un folder, una lista di selezione in un oggetto (è preferibile ad una protezione globale dell'oggetto).&lt;br /&gt;
&lt;br /&gt;
* Un'opzione, una variabile associata ad una funzione (è preferibile ad una protezione globale della funzione).&lt;br /&gt;
&lt;br /&gt;
Alcuni elementi non possono essere protetti in modo dettagliato (è il caso delle stampe). In questo caso, l'unica soluzione è quella di proteggere globalmente la stampa, installando il file con estensione rpt a livello del dossier di produzione, sapendo che sarà anche possibile decidere di rinominarlo.&lt;br /&gt;
&lt;br /&gt;
C'è tutta una serie di casi in cui i codici attività non sono utili, soprattutto sui campi delle videate:&lt;br /&gt;
&lt;br /&gt;
* Se si vuole aggiungere un controllo supplementare su un campo e se questo controllo può essere definito da una tabella di controllo, è meglio implementarlo così: si tratta infatti di una parametrizzazione che non ha bisogno di essere protetta.&lt;br /&gt;
&lt;br /&gt;
* Lo stesso se si vuole limitare l'accesso al campo in funzione di un utente: le assegnazioni di codici di accesso consistono parametrizzazione.&lt;br /&gt;
&lt;br /&gt;
* Lo stesso se si vuole cambiare interamente gli attributi del tipo di dati associato al campo, è meglio modificare il tipo di dati e proteggerlo da un codice attività: la protezione del campo è allora inutile.&lt;br /&gt;
&lt;br /&gt;
* Se si vogliono aggiungere delle azioni dette « specifiche » (chiamate SPE o SPX), occorre sapere che queste azioni rimangano invariate in caso di patch, anche se il campo non è protetto. Quindi non è utile aggiungere un codice attività sul campo se non sono state fatte altre modifiche. Se delle azioni specifiche impongono di aprire una finestra, queste azioni devono essere catalogate nel dizionario delle azioni. D'altronde, non appena il codice dell'azione comincia per X, Y o Z, questa è protetta allo stesso modo senza che sia necessario proteggere il campo. In compenso è necessario proteggere l'azione con un codice attività (sarà richiamata solo se il codice è Attivo).&lt;br /&gt;
&lt;br /&gt;
* Se si vuole cancellare un'azione standard su un campo, è più semplice completarla con un'azione chiamata SPX invece che cancellarla (così, la protezione tramite codice attività non sarà necessaria sul campo).&lt;br /&gt;
=== Regola numero 4: Attenzione agli inserimenti su dei sotto elementi esistenti ===&lt;br /&gt;
&lt;br /&gt;
Gli inserimenti di sotto elementi in un elemento non permettono, in alcuni casi, la perennizzazione. Questo riguarda i seguenti casi:&lt;br /&gt;
&lt;br /&gt;
* aggiungere un indice in una tabella standard deve essere fatto alla fine dell'elenco degli indici e soprattutto non all'inizio di tale elenco (il primo indice è l'indice di default). In compenso non vi sono vincoli sui campi. Si consiglia comunque di non chiamarli in modo consecutivo nel formato ABBRn, dove ABBR è l'abbreviazione della tabella e n il numero di riga (infatti è possibile che un'evoluzione dello standard necessiti dell'aggiunta di un indice standard).&lt;br /&gt;
&lt;br /&gt;
* i blocchi di una videata sono conosciuti solo tramite il loro numero. Così, se si desidera aggiungere un blocco in una videata, occorre sempre metterlo alla fine (giocare sulle posizioni di inserimento). Nemmeno qui vi sono vincoli sui campi.&lt;br /&gt;
&lt;br /&gt;
* lo stesso vale per i folder di una tabella, le liste di selezione di un oggetto (in versione 140 si differenzia l'ordine del loro ordine di apparizione, poiché esiste una campo rank).&lt;br /&gt;
=== Regola numero 5: Prima dell'installazione di ogni patch o di ogni versione, utilizzare il tester di patch ===&lt;br /&gt;
&lt;br /&gt;
Questo strumento è stato realizzato per permettere di evidenziare i potenziali conflitti al momento dell'installazione di patch. Infatti, legge la testata dei file di patch presenti in una data directory e visualizza in una traccia l'elenco degli elementi presenti in questa lista e che sono oggetto di specifici. Se l'elenco in questione è vuoto, non vi è rischio di conflitti. Al contrario, l'elenco degli elementi in conflitto è generalmente scarso e basta allora esaminare in dettaglio i pochi elementi che vi si trovano.&lt;br /&gt;
&lt;br /&gt;
Quando si installa una versione tramite un CD, (in una directory dipendente dal software, sulla versione 130 di ADONIX X3 ad esempio, si trovano nella directory X3Patch\X3V130_technical) vi sono una serie di cartelle chiamate in funzione delle versioni intermedie del software (P131, P132, P133…), che contengono dei file chiamati List_nnn.dat. Questi file contengono solo la testata degli elementi contenuti nelle patch consecutive che permettono di passare da una versione all'altra. E' quindi possibile utilizzare questi file nello stesso modo con il tester di patch, per assicurarsi dei potenziali conflitti (si partirà dalla lista seguendo la lista corrente installata sul dossier da aggiornare).&lt;br /&gt;
== Organizzazione dei dossier in due o tre livelli ==&lt;br /&gt;
&lt;br /&gt;
Al momento dell'esecuzione del software, il motore adonix carica ed esegue dei file che contengono un codice intermedio (il p-code) indipendente dall'ambiente. Questi file possono essere dei programmi, delle descrizioni di videate, la descrizione delle tabelle (per fare una consultazione sulla tabella in questione). Questi file vengono cercati nel dossier in corso di esecuzione. Ma se un file non esisten nel dossier, il motore adonix lo cercherà nel dossier padre di primo livello, poi nel dossier di secondo livello... Il motore adonix può così risalire una gerarchia di 8 dossier successivi, ma per ragioni pratiche, ci si limita a 3 livelli (la gestione di dossier ne gestisce solo 3).&lt;br /&gt;
&lt;br /&gt;
La conseguenza di questa struttura è la seguente: un dossier utente creato nel software dipenderà sia dal dossier supervisore, sia da un dossier che dipende esso stesso dal dossier supervisore. Infatti, se ciò non avvenisse, non sarebbero più accessibili gli elementi indispensabili al funzionamento del dossier e della sua parametrizzazione, che sono presenti solo nel dossier supervisore. I due schemi possibili per un dossier di produzione sono i seguenti:&lt;br /&gt;
&lt;br /&gt;
Il dossier di riferimento intermedio è in generale chiamato dossier di sviluppo, perché una delle possibili implementazioni delle gerarchie di dossier consiste nell'installarvi gli sviluppi specifici.&lt;br /&gt;
&lt;br /&gt;
La gerarchia a 3 livelli è pesante da mantenere. Infatti, l'esistenza di questa gerarchia a tre livelli ha delle conseguenze pratiche: trasferire un dossier di produzione da un server ad un altro presuppone che, affinché il dossier trasferito possa funzionare, la gerarchia sia stata anch'essa trasferita. Nel caso di una gerarchia a due livelli, nessun problema, poiché il dossier supervisore è forzatamente presente in un ambiente in cui è installato il software. In compenso, nel caso di una gerarchia a 3 livelli, occorre anche trasferire il dossier di sviluppo.&lt;br /&gt;
&lt;br /&gt;
Il principio di eredità, se permette di trasferire semplicemente degli sviluppi fatti tramite rivalidazione del dossier di produzione, presenta comunque degli effetti particolari, nella misura in cui l'eredità è immediata se si modifica un programma nel dossier di sviluppo... ma differita per tutti gli elementi del dizionario, che saranno trasferiti solo in caso di rivalidazione. Quindi si rischia di ritrovarsi con delle incoerenze temporanee nel dossier di produzione, dato che si lavora in un dossier di sviluppo.&lt;br /&gt;
&lt;br /&gt;
Questa gerarchia è quindi consigliata solo nei seguenti casi:&lt;br /&gt;
&lt;br /&gt;
* il cliente finale vuole sviluppare i propri specifici e si desidera che lo faccia in modo ben isolato nel dossier di produzione; sapendo che si vogliono degli sviluppi fatti da un partner ADONIX nel dossier intermedio.&lt;br /&gt;
&lt;br /&gt;
* ci si trova in un ambiente di sviluppo di verticali e si desiderano utilizzare dei dossier di produzione a dei fini di test.&lt;br /&gt;
&lt;br /&gt;
In tutti gli altri casi, si consiglia di utilizzare una gerarchia a due livelli. In questo caso, occorre utilizzare un dossier di test a fianco del dossier di produzione, se si desiderano realizzare degli sviluppi in corso di gestione e testarli prima di installarli (tramite copia o patch) nel dossier di produzione. L'utilizzo della funzione di patch è spesso preferibile: infatti permette di creare dei « packages » applicativi dal dossier di sviluppo e di integrarli in blocco nel dossier di produzione. Inoltre, la versione 130 integra una nuova funzione di creazione di una patch incrementale. Infatti è possibile creare una patch che contiene tutto ciò che è stato modificato su un dossier da una determinata data. Questo permette molto facilmente di isolare gli sviluppi e le parametrizzazioni realizzate tra due fasi di un'implementazione.&lt;/div&gt;</summary>
		<author><name>Mwadmin</name></author>
	</entry>
</feed>