Lettura tabelle

From SageDev KB
Jump to navigation Jump to search


Gli esempi che seguono indicano con [XXX] l'identificativo di una tabella già aperta.

Per limitare la lettura delle colonne vedi istruzione Columns.

Apertura tabella[edit]

Apertura di una tabella:

If clalev([F:ITM])=0: Local File ITMMASTER [F:ITM] : Endif

Apertura tabella di un dossier diverso dal corrente:

If clalev([F:YFCT])=0: Local File 'X3.AFCTCUR' [F:YFCT] : Endif

Procedura standard di lettura[edit]

In generale, per leggere una tabella:

  1. Si controlla che non sia già aperta con l'istruzione clalev
  2. Se non è aperta si apre indicando un'etichetta con cui poi ci riferiremo alla tabella; in questo modo è possibile aprire due volte la stessa tabella.
  3. Si legge
  4. Si controlla che la lettura sia andata a buon fine attraverso la variabile fstat

Esempio:

If !clalev([F:YADI])           :# controllo che non sia aperta
  Local File ATABDIV [F:YADI]  :# dichiarazione di apertura tabella con etichetta YADI
Endif
Read[F:YADI]CODE = 6052;ABFIC  :# lettura da tabella (in questo caso specifico è una tabella diversa, capitolo 6052)
If fstat                       :# controllo che la lettura sia andata a buon fine
  Infbox "Errore"                  
Else
  InfBox "ok"                  :# se fstat=0 è tutto ok
Endif

Forma breve:

If !clalev([F:YADI]) : Local File ATABDIV [F:YADI] : Endif : #commento

Lettura puntuale di un record[edit]

Read [XXX]indice = KEY1;KEY2

Per sapere come è definito l'indice andare a vedere la tabella da leggere in GESATB, nella scheda indici.

Esempio (attenzione ai doppi apici da mettere per ogni valore scritto direttamente come stringa)

Read [XXX]indice = "STR1";"STR2"

equivalente di

VARIABILE2="STR2"
Read [XXX]indice = "VAL1";VARIABILE2

Lettura sequenziale di record[edit]

 For [XXX] Where CAMPO = CONDIZIONE
Next

Esempio:

 For [F:YCE] Where YCODMAR = [M:YCE0]YCODMAR
   ... 
  NUMERO = [F:YCE]YSEQMAR
 Next

Stability[edit]

Nel caso di tabelle che variano con grande frequenza e solo in caso di un SQL server, con l'istruzione For si può utilizzare l'istruzione With Stability, per esempio

For [FAS] With Stability
...
Next

In pratica fa in modo che il ciclo agisca solo sulle righe già presenti nel db quando il ciclo ha inizio.

Lettura con filtro[edit]

 Filter [F:YCE]      # Azzero eventuale filtro precedente
 Filter [F:YCE] Where YCODMAR = [M:YCE0]YCODMAR Order By YSEQMAR Desc       # applico filtro
 #oppure Where key NOMEINDICE=campo1;campo2;campo3
 # è possibile utilizzare Order by (staccato, non OrderBy), per es. Order By RANG Asc; NOM(1) Desc

 For [F:YCE]  
   Break  #istruzione non necessaria
 Next
 Filter [F:YCE] # tolgo filtro

Se la tabella è aperta con una condizione Where, le condizioni di Filter vengono applicate ai record già selezionati (come fosse in "and").
Nel codice sorgente l'istruzione Link indica una join tra tabelle

E' possibile utilizzare una variabile contenente un criterio:

Local Char CRIT(50)(3)
CRIT(0)="ABREV='Orig' "
CRIT(1)="And MOT>='A'"
Filter [ABR] Where evalue(CRIT)

Si può fare anche Local File AABREV[ABR] where evalue(CRIT)

Lettura metadati tabella[edit]

Riporto un esempio in cui vengono visualizzate le caratteristiche di una tabella.

Call LEGGIDATI_TABELLA("YITMINF")
End 

Subprog LEGGIDATI_TABELLA(TABELLA)
    Value Char TABELLA()
    File = TABELLA [YYLT]

    Infbox 'Ci sono '-num$([G:YYLT]nbzon)-' campi nella tabella CLIENTI:'
    For I = 0 To [G:YYLT]nbzon - 1
        Infbox [G:YYLT]adxfname(I)
    Next I

    Infbox 'Ci sono '-num$([G:YYLT]nbind)-'indici nella tabella CLIENTI:'
    For I = 0 To [G:YYLT]nbind - 1
        Infbox [G:YYLT]keyname(I)
        Case [G:YYLT]keyuniq(I)
        When 0 : Infbox ' (Con Omonimi) '
        When 1 : Infbox ' (Senza Omonimi) '
        When 2 : Infbox ' (Più omonimi) '
        Endcase
        Infbox 'Lunghezza = '-num$([G:YYLT]keylen(I))
        Infbox 'Dimensione totale record = '-num$([G:YYLT]tairec)
    Next I
End

Altro[edit]

  • rowcount() contiene il numero di record di un file appena aperto, e tiene conto dei filtri applicati; per esempio rowcount([F:ITM])
  • nbrecord() returns the number of lines on a table opened by File or Trbegin.
  • adxdlrec contiene il numero di record cancellati con l'istruzione Delete (classe)
  • adxuprec contiene il numero di record modificati con l'istruzione Update (classe)
  • nbrecord() dà il numero di record della tabella passata come parametro (la tabella deve essere aperta)
  • fileabre(5)() abbreviazioni delle tabelle aperte
  • filename(255)() nomi delle tabelle aperte

Classe [G:XXX][edit]

All'apertura di una tabella con l'istruzione File oltre alla classe [F:XXX] viene aperta anche la classe [G:XXX].

Questa classe contiene:

  • Adxfname(0..N) nome dei campi di una tabella
  • Currind numero dell’ultima chiave utilizzata
  • Currlen numero di campi della chiave da considerare
  • Filenume (non utilizzabile)
  • Keylen(0..k) numero di byte utilizzati per ogni chiave
  • Keyname(0..k) nome per ogni chiave
  • Keyuniq(0..k) 1 senza omonimi; 0 con omonimi
  • Nbind numero di chiavi
  • Nbzon numero di campi
  • Tairec dimensione record in numero di byte