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