Istruzioni base

From SageDev KB
Revision as of 11:02, 8 November 2023 by 5.90.138.35 (talk) (→‎Stringhe)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search


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]

  1. Concatenazione di stringhe: si fa con gli operatori + e - (il secondo aggiunge uno spazio tra le due stringhe): RET=STRING1+STRING2-"ciao"
  2. Lunghezza di una stringa: LENGTH = len(STRINGA)
  3. Conversione di un numero in stringa: STRINGA = num$(LENGTH)
  4. Conversione di una data in stringa: func AFNC.FDH(date$,"121531") restituisce "01/06/18 12:15:31"
  5. Parte sinistra di una stringa lunga LENGTH: STRINGA = left$(STRINGA, LENGTH)
  6. Parte destra di una stringa lunga LENGTH: STRINGA = right$(STRINGA, LENGTH)
  7. Cercare una sottostringa a partire da una certa posizione: INDEX=instr(1,STR,OLD)
  8. Togliere gli spazi all'inizio e alla fine (trim): STRINGA = vireblc(STRINGA,2)
  9. Togliere gli spazi multipli: STRINGA = vireblc(STRINGA,5)
  10. 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
  11. Riempimento con spazi a destra (padding): format$("Kb:5X",[M:YCE0]YCODMAR) "IMQ" -> "IMQ "
  12. 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," ").
  1. 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]

  1. Conversione di una stringa in numero: NUMERO = val("23")
  2. Conversione di un numero in stringa: STRINGA = num$(23)
  3. Riempimento con spazi a sinistra (padding): format$("N:7",PAR(IP)) "12" -> " 12"
  4. mettere zero dopo i decimali:
  5. * format$("N:7.4",PAR(IP)) "12" -> " 12.0000"
  6. * format$("NZ:7.4",PAR(IP)) "12" -> " 12.0000"
  7. Riempimento con zeri a sinistra (padding): format$("N0:7",PAR(IP)) "12" -> "0000012"
  8. Riempimento con zeri a sinistra (padding): format$("N0:7.2",PAR(IP)) "12" -> "0000012.00"
  9. Riempimento con massimo 5 zeri a sinistra, taglia i decimali: format$("N0:#####",VALEUR) 77.9 -> "00077"
  10. 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)