<?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=5.90.138.35</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=5.90.138.35"/>
	<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php/Special:Contributions/5.90.138.35"/>
	<updated>2026-06-10T11:23:51Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Istruzioni_base&amp;diff=1095</id>
		<title>Istruzioni base</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Istruzioni_base&amp;diff=1095"/>
		<updated>2023-11-08T09:02:53Z</updated>

		<summary type="html">&lt;p&gt;5.90.138.35: /* Stringhe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Dichiarazione variabili ==&lt;br /&gt;
* Dichiarazione di una stringa locale (di default è lunga 30 caratteri): &amp;lt;code&amp;gt;Local Char CAR&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* Dichiarazione di una stringa locale lunga 50: &amp;lt;code&amp;gt;Local Char STRINGA(50)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* Dichiarazione di una stringa passata per valore (in una funzione): &amp;lt;code&amp;gt;Value Char STR()&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* Dichiarazione di un intero locale: &amp;lt;code&amp;gt;Local Integer INDEX&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* Dichiarazione di un decimale locale subito inizializzato a 0: &amp;lt;code&amp;gt;Local Decimal DEC : DEC = 0&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* Dichiarazione di un intero passato per valore: &amp;lt;code&amp;gt;Value Integer LENGTH&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* Dichiarazione di un clob locale: &amp;lt;code&amp;gt;Local Clbfile YETI(4)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per sapere se una variabile esiste utilizzare &amp;lt;code&amp;gt;dim&amp;lt;/code&amp;gt;; restituisce -1 se non esiste, 1 se è dichiarata:&lt;br /&gt;
&amp;lt;pre&amp;gt;If Dim(NOMEVAR)&amp;gt;0 &lt;br /&gt;
  #uso la variabile&lt;br /&gt;
Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dichiarare un array ===&lt;br /&gt;
Stringa di 250 caratteri (il massimo è 255): &amp;lt;code&amp;gt;Local Char STRINGA(250)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Array di 1000 stringhe da 30 caratteri: &amp;lt;code&amp;gt;Local Char    LISTAFILE(30)(1..1000)&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;LISTAFILE(1)&amp;lt;/code&amp;gt; è la prima stringa di 30 caratteri&amp;lt;br /&amp;gt;&lt;br /&gt;
Array di interi con indice che va da 5 a 10: &amp;lt;code&amp;gt;Local Integer intarray(5..10)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Array di 20 interi con indice che parte da 0: &amp;lt;code&amp;gt;Local Integer intarray(20)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Matrice di interi: &amp;lt;code&amp;gt;Local Integer intarray(20)(1..3)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per sapere la dimensione di un array utilizzare &amp;lt;code&amp;gt;dim&amp;lt;/code&amp;gt;; nell'esempio seguente &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; avrà valore 250.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Char STRINGA(250)&lt;br /&gt;
Local integer I&lt;br /&gt;
I=dim(STRINGA)&lt;br /&gt;
Infbox num$(I)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dichiarare un array in subroutine ====&lt;br /&gt;
 &lt;br /&gt;
Per dichiarare un array presente come argomento di una subroutine all'interno della stessa basta dichiarare un array senza dimensione: &amp;lt;code&amp;gt;Value char Array()&amp;lt;/code&amp;gt; .&lt;br /&gt;
In questo modo recupera la definizione dal metodo chiamante.&lt;br /&gt;
&lt;br /&gt;
Nel seguente esempio STR nel metodo chiamante sarà una stringa lunga 250.&lt;br /&gt;
&lt;br /&gt;
''Subroutine:''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Funprog INSERT(STR, INDEX, INS)&lt;br /&gt;
    Value Char STR()&lt;br /&gt;
    Value Integer INDEX&lt;br /&gt;
    Value Char INS()&lt;br /&gt;
  ...&lt;br /&gt;
End RET&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Metodo chiamante:''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
Local Char STRINGA(250)&lt;br /&gt;
RIS= func INSERT(STRINGA, INDEX, INS)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nell'help in linea di Sage: andare su riquadro Sviluppo:&lt;br /&gt;
* 4GL, Funzioni&lt;br /&gt;
* Sotto-programma per il programma AFNC (TEXTRA, TEXTE, STAT, MES1, MES2...)&lt;br /&gt;
&lt;br /&gt;
== Stringhe ==&lt;br /&gt;
# Concatenazione di stringhe: si fa con gli operatori &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; e &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; (il secondo aggiunge uno spazio tra le due stringhe): &amp;lt;code&amp;gt;RET=STRING1+STRING2-&amp;quot;ciao&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Lunghezza di una stringa: &amp;lt;code&amp;gt;LENGTH = len(STRINGA)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Conversione di un numero in stringa: &amp;lt;code&amp;gt;STRINGA = num$(LENGTH)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Conversione di una data in stringa: &amp;lt;code&amp;gt;func AFNC.FDH(date$,&amp;quot;121531&amp;quot;)&amp;lt;/code&amp;gt; restituisce &amp;quot;01/06/18 12:15:31&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Parte sinistra di una stringa lunga LENGTH: &amp;lt;code&amp;gt;STRINGA = left$(STRINGA, LENGTH)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Parte destra di una stringa lunga LENGTH: &amp;lt;code&amp;gt;STRINGA = right$(STRINGA, LENGTH)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Cercare una sottostringa a partire da una certa posizione: &amp;lt;code&amp;gt;INDEX=instr(1,STR,OLD)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Togliere gli spazi all'inizio e alla fine (trim): &amp;lt;code&amp;gt;STRINGA = vireblc(STRINGA,2)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Togliere gli spazi multipli: &amp;lt;code&amp;gt;STRINGA = vireblc(STRINGA,5)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Togliere gli spazi multipli, gli spazi all'inizio e alla fine: &amp;lt;code&amp;gt;STRINGA = vireblc(vireblc(STRINGA,2),5)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;Argomenti per il comando vireblc (=modifica spazi)&lt;br /&gt;
#* 0 = elimina spazi all'inizio&lt;br /&gt;
#* 1 = elimina spazi alla fine&lt;br /&gt;
#* 2 = elimina spazi all'inizio e alla fine&lt;br /&gt;
#* 3 = elimina spazi all'inizio e taglia la stringa al primo spazio successivo (estrae la prima parola)&lt;br /&gt;
#* 4 = elimina tutti gli spazi&lt;br /&gt;
#* 5 = elimina tutti gli spazi consecutivi sostituendoli tutti con spazi singoli&lt;br /&gt;
# Riempimento con spazi a destra (padding): &amp;lt;code&amp;gt;format$(&amp;quot;Kb:5X&amp;quot;,[M:YCE0]YCODMAR)&amp;lt;/code&amp;gt;   &amp;quot;IMQ&amp;quot; -&amp;gt; &amp;quot;IMQ  &amp;quot;&lt;br /&gt;
# Padding sinistro:&lt;br /&gt;
&amp;lt;pre&amp;gt;MY_STRING=&amp;quot;This is a string&amp;quot;&lt;br /&gt;
   If len(MY_STRING)&amp;lt;=35&lt;br /&gt;
     LEFT_ALIGNED=MY_STRING+space$(35-len(MY_STRING))&lt;br /&gt;
     RIGHT_ALIGNED=space$(35-len(MY_STRING))+MY_STRING&lt;br /&gt;
   Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;space$(EXP_NB) returns a space containing EXP_NB spaces. &lt;br /&gt;
This function is equivalent to &lt;br /&gt;
string$(EXP_NB,32) &lt;br /&gt;
or &lt;br /&gt;
string$(EXP_NB,&amp;quot; &amp;quot;).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Verificare pattern di una stringa:&lt;br /&gt;
#* &amp;lt;code&amp;gt;If pat(CH1, '*ADONIX*')  :  Infbox 'La stringa CH1 contiene ADONIX!'  : Endif&amp;lt;/code&amp;gt;&lt;br /&gt;
#*Verificare che CH1 contenga una '''lettera''' all'inizio, una '''cifra''' alla fine della stringa ed esattamente 3 caratteri tra i due&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;If pat(CH1, '!???#')  :  Infbox &amp;quot;Test verificato&amp;quot;  : Endif&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clob ===&lt;br /&gt;
Si può passare tra vettore di stringhe a clob e viceversa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Local Char TESTO(250)(1..80)&lt;br /&gt;
Setlob TESTO With CLOB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Local Char TESTO(250)(1..85)&lt;br /&gt;
Setlob CLOB With TESTO(1..85)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Numeri ==&lt;br /&gt;
# Conversione di una stringa in numero: &amp;lt;code&amp;gt;NUMERO = val(&amp;quot;23&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Conversione di un numero in stringa: &amp;lt;code&amp;gt;STRINGA = num$(23)&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
# Riempimento con spazi a sinistra (padding): &amp;lt;code&amp;gt;format$(&amp;quot;N:7&amp;quot;,PAR(IP))&amp;lt;/code&amp;gt;   &amp;quot;12&amp;quot; -&amp;gt; &amp;quot;     12&amp;quot;&lt;br /&gt;
# mettere zero dopo i decimali: &lt;br /&gt;
# * &amp;lt;code&amp;gt;format$(&amp;quot;N:7.4&amp;quot;,PAR(IP))&amp;lt;/code&amp;gt;   &amp;quot;12&amp;quot; -&amp;gt; &amp;quot;     12.0000&amp;quot;&lt;br /&gt;
# * &amp;lt;code&amp;gt;format$(&amp;quot;NZ:7.4&amp;quot;,PAR(IP))&amp;lt;/code&amp;gt;  &amp;quot;12&amp;quot; -&amp;gt; &amp;quot;     12.0000&amp;quot;&lt;br /&gt;
# Riempimento con zeri a sinistra (padding): &amp;lt;code&amp;gt;format$(&amp;quot;N0:7&amp;quot;,PAR(IP))&amp;lt;/code&amp;gt;   &amp;quot;12&amp;quot; -&amp;gt; &amp;quot;0000012&amp;quot;&lt;br /&gt;
# Riempimento con zeri a sinistra (padding): &amp;lt;code&amp;gt;format$(&amp;quot;N0:7.2&amp;quot;,PAR(IP))&amp;lt;/code&amp;gt; &amp;quot;12&amp;quot; -&amp;gt; &amp;quot;0000012.00&amp;quot;&lt;br /&gt;
# Riempimento con massimo 5 zeri a sinistra, taglia i decimali: &amp;lt;code&amp;gt;format$(&amp;quot;N0:#####&amp;quot;,VALEUR)&amp;lt;/code&amp;gt;  77.9 -&amp;gt; &amp;quot;00077&amp;quot;&lt;br /&gt;
# Riempimento con massimo 5 spazi a sinistra, taglia i decimali: &amp;lt;code&amp;gt;format$(&amp;quot;N:5&amp;quot;,VALEUR)&amp;lt;/code&amp;gt;  77.9 -&amp;gt; &amp;quot;   77&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== gestione Bit ===&lt;br /&gt;
Ci sono due istruzioni per impostare o recuperare un bi di un valore intero:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;setbit( Valore, Bit_da_impostare, Valore_da_impostare)&lt;br /&gt;
getBit( Valore, Bit_da_recuperare)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Bit_da_impostare: indice del bit partendo da 1&lt;br /&gt;
* Valore_da_impostare: 1 o 0&lt;br /&gt;
* Bit_da_recuperare: indice del bit partendo da 1&lt;br /&gt;
&lt;br /&gt;
per esempio: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;A=setbit( 0, 3, 1)  #restituisce 4 ( 0000100 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Date e ora ==&lt;br /&gt;
Vai qui [[Data_ora|Gestione data e ora]]&lt;br /&gt;
&lt;br /&gt;
== Cicli e condizioni==&lt;br /&gt;
=== Condizione ===&lt;br /&gt;
Le seguenti forme sono equivalenti:&lt;br /&gt;
&amp;lt;pre&amp;gt;If I=1 Then J=2 Else J=3 : Endif&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;If I=1 : J=2 Else J=3 : Endif&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
If I=1&lt;br /&gt;
  J=2&lt;br /&gt;
Else J=3&lt;br /&gt;
Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nel caso di più condizioni poste in and, le valutazioni vengono fatte nell'ordine scritto, e il programma si ferma alla prima condizione falsa trovata;&lt;br /&gt;
nel caso qui sotto se CondizioneA è falso le altre due condizioni non vengono valutate (quindi in caso di istruzioni non vengono eseguite):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;If CondizioneA &amp;amp; CondizioneB and CondizioneC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempi:&lt;br /&gt;
&lt;br /&gt;
Controllo che una stringa non sia vuota: &lt;br /&gt;
&amp;lt;pre&amp;gt;If [M:YCE1]YSEZFIL &amp;lt;&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
Endif&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Questa riga &lt;br /&gt;
&amp;lt;code&amp;gt; If !clalev([F:YADI]) : Local File ATABDIV [F:YADI] : Endif&amp;lt;/code&amp;gt;  corrisponde al seguente codice&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
If !clalev([F:YADI]) &lt;br /&gt;
  Local File ATABDIV [F:YADI] &lt;br /&gt;
Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cicli ===&lt;br /&gt;
Ciclo su variabile (lo step predefinito è 1):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
For I = 1 To 13 Step 2.5 : Infbox num$(I) : Next I                        # visualizza: 1 3.5 6 8.5 11 FIN=13.5&lt;br /&gt;
For I = 15 To 20 : Infbox I : Next I : Infbox 'FIN='-num$(I)              # 15 16 17 18 19 20&lt;br /&gt;
For I = 15 To 11 Step -1 : Infbox I : Next I : Infbox 'FIN='-num$(I)      # visualizza: 15 14 13 12 11 FIN=10&lt;br /&gt;
&lt;br /&gt;
For  CHN='A','EF','X','ZZZ' : Infbox CHN : Next CHN : Infbox 'FIN='-CHN    # visualizza: A EF X ZZZ FIN=ZZZ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ciclo su file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
For [F:YCE] Where VALORE = X&lt;br /&gt;
  ...&lt;br /&gt;
Next&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;While INDEX&amp;gt;0&lt;br /&gt;
 ...&lt;br /&gt;
Wend&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
E' possibile utilizzare la parola chiave &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; per interrompere il ciclo: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
For [F:YCE]  &lt;br /&gt;
    VALEUR = [F:YCE]YSEQMAR + 1&lt;br /&gt;
    Break&lt;br /&gt;
Next&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condizioni multiple ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Case YI&lt;br /&gt;
When 1 : Infbox '1'&lt;br /&gt;
When 2&lt;br /&gt;
    YFILE = &amp;quot;C:\TEMP\test2.pdf&amp;quot;&lt;br /&gt;
    Infbox '2'&lt;br /&gt;
When 3&lt;br /&gt;
    Local Char V2(250)&lt;br /&gt;
    YFILE = &amp;quot;C:\TEMP\test3.pdf&amp;quot;&lt;br /&gt;
    Infbox '3' - YFILE - V2&lt;br /&gt;
When Default&lt;br /&gt;
Endcase&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ordinamento ==&lt;br /&gt;
Per ordinare un array usare &amp;lt;code&amp;gt;Sorta&amp;lt;/code&amp;gt; con la seguente sintassi :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SORTA NUMVALORI_DAORDINARE ARRAY [Desc]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SORTA NUMVALORI_DAORDINARE ARRAY1, array2 [Desc]&amp;lt;/code&amp;gt;    (array2 ordinato seguendo l'ordine di ARRAY1)&lt;br /&gt;
&lt;br /&gt;
Esempio: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Local Char STR(255)(0..4)&lt;br /&gt;
Local Integer NUMBER(0..4)&lt;br /&gt;
Local Integer D&lt;br /&gt;
&lt;br /&gt;
NUMBER(0) = 3&lt;br /&gt;
NUMBER(1) = 4&lt;br /&gt;
NUMBER(2) = 9&lt;br /&gt;
NUMBER(3) = 5&lt;br /&gt;
NUMBER(4) = 8&lt;br /&gt;
&lt;br /&gt;
STR(0) = &amp;quot;B&amp;quot;&lt;br /&gt;
STR(1) = &amp;quot;E&amp;quot;&lt;br /&gt;
STR(2) = &amp;quot;C&amp;quot;&lt;br /&gt;
STR(3) = &amp;quot;M&amp;quot;&lt;br /&gt;
STR(4) = &amp;quot;A&amp;quot;&lt;br /&gt;
&lt;br /&gt;
D= dim(NUMBER)&lt;br /&gt;
#per ordinare NUMBER in ordine crescente, e le stringhe in base ai numeri di NUMBER&lt;br /&gt;
Sorta D NUMBER,STR&lt;br /&gt;
&lt;br /&gt;
#per ordinare le stringhe in ordine alfabetico&lt;br /&gt;
Sorta 4 STR&lt;br /&gt;
#per ordinare le stringhe in ordine alfabetico, e i numeri in base all'ordine delle stringhe&lt;br /&gt;
Sorta 5 STR,NUMBER&lt;br /&gt;
&lt;br /&gt;
# To sort in descending order&lt;br /&gt;
Sorta 4 STR, NUMBER  Desc     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funzioni Funprog ==&lt;br /&gt;
&lt;br /&gt;
Le funzioni sono delle parti di codice richiamabili anche da programmi esterni; hanno la visibilità dei parametri e delle variabili globali, ma non delle variabili del programma chiamante.&lt;br /&gt;
* Ritornano sempre un valore; &lt;br /&gt;
* L'istruzione &amp;lt;code&amp;gt;End&amp;lt;/code&amp;gt; termina il flusso di esecuzione della funzione; il valore che la segue sarà il risultato della funzione.&lt;br /&gt;
* Possono avere dei parametri.&lt;br /&gt;
* I parametri possono solo essere passati per valore (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; indica che il parametro è passato per valore)&lt;br /&gt;
* si chiamano con &amp;lt;code&amp;gt;func NOMEFILE.NOMEFUNZIONE(...)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dichiarazione dentro il file YESEMPIO:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Funprog FUNZIONEDIPROVA(PARAM1)&lt;br /&gt;
 Value Integer PARAM1&lt;br /&gt;
 If PARAM1 &amp;gt;= 0&lt;br /&gt;
   End 1&lt;br /&gt;
 Else&lt;br /&gt;
   End 0&lt;br /&gt;
 Endif&lt;br /&gt;
End 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizzo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
If func YESEMPIO.FUNZIONEDIPROVA(VALORE1)=1&lt;br /&gt;
 Infbox &amp;quot;Valore positivo&amp;quot;&lt;br /&gt;
Else&lt;br /&gt;
 Infbox &amp;quot;Valore negativo&amp;quot;&lt;br /&gt;
Endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Altro esempio:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Funprog PROVA2(PAR1,PAR2)&lt;br /&gt;
 Value Integer PAR1&lt;br /&gt;
 Value Integer PAR2&lt;br /&gt;
 Local Integer RES&lt;br /&gt;
&lt;br /&gt;
 RES=PAR1*PAR2&lt;br /&gt;
&lt;br /&gt;
End RES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utilizzo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Infbox &amp;quot;il prodotto tra&amp;quot;-num$(VAL1)-&amp;quot;e&amp;quot;-num$(VAL2)-&amp;quot;è:&amp;quot;-num$(func PROVA2(VAL1,VAL2))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sottoprogrammi Subprog ==&lt;br /&gt;
Sono metodi che &lt;br /&gt;
* non restituiscono un valore&lt;br /&gt;
* possono modificare il valore dei parametri passati&lt;br /&gt;
* si chiamano con &amp;lt;code&amp;gt;call NOMESUBPROG(...)&amp;lt;/code&amp;gt; all'interno dello stesso file&lt;br /&gt;
* si chiamano con &amp;lt;code&amp;gt;call NOMESUBPROG(...) From NOMEFILE&amp;lt;/code&amp;gt; da qualsiasi punto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Qui un esempio, che tra l'altro richiama a sua volta un sotto programma dello stesso file sorgente&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Subprog C_ITMREF(VALEUR)&lt;br /&gt;
 Variable Char    VALEUR()&lt;br /&gt;
 Local Integer YERR&lt;br /&gt;
 ...&lt;br /&gt;
 Call YCHK_ART(VALEUR,[M:YPR0]X_NAT,[M:YPR0]YDATAI,[M:YPR0]YDATAF,YERR)&lt;br /&gt;
 ...&lt;br /&gt;
End&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Varie ==&lt;br /&gt;
* Messaggio a video: &amp;lt;code&amp;gt;Infbox &amp;quot;messaggio: &amp;quot;+ &amp;quot;ciao!&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* Per porre una condizione &amp;quot;inline&amp;quot;, per esempio nei campi selezione di un oggetto si può usare ''string$'': &lt;br /&gt;
per esempio per far comparire un valore solo per una certa transazione:&lt;br /&gt;
&amp;lt;code&amp;gt;string$(GFLAG='YOFQ',[F:POH]YPOHORE)&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>5.90.138.35</name></author>
	</entry>
</feed>