%%(display:none)
{{{
WikiUp
}}}
/%
[{TableOfContents }]\\
!!! OBIETTIVO\\
Restituisce in formato alfanumerico i risultati di una istruzione SQL Select tramite un cursore
con allocazione dinamica della SQLDA

!!! FUNZIONI E METODI\\

!! CLOSE - Chiude il cursore\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='CLOSE'
|    C                  EVAL      £SQLD_FUNME=*BLANKS
|    C                  EXSR      £SQLD
/%
----

!! OPEN - Prepara lo statement, apre il cursore, dimensiona la SQLDA\\
__Prima di eseguire la funzione 'OPEN' è necessario impostare la variabile £SQLDString con l'istruzione SELECT.__

! NAM  - recuperando i nomi di sistema dei campi in £SQLDCName\\
%%quote
|    C                  EVAL      £SQLDString=SelectSQL
|     * numero di righe per istruzione OPTIMIZE (se 0 assume 5000)
|    C                  EVAL      £SQLDRows=n
|    C                  EVAL      £SQLD_FUNFU='OPEN'
|    C                  EVAL      £SQLD_FUNME='NAM'
|    C                  EXSR      £SQLD
/%
----
! NAMLAB - recuperando i nomi di sistema dei campi in £SQLDCName e le intestazioni in £SQLDCLabel\\
__ ATTENZIONE: COMPORTA UN'ALLOCAZIONE DI MEMORIA TRIPLA__
%%quote
|    C                  EVAL      £SQLDString=SelectSQL
|    C                  EVAL      £SQLD_FUNFU='OPEN'
|    C                  EVAL      £SQLD_FUNME='NAMLAB'
|    C                  EXSR      £SQLD
/%
----
! LAB - recuperando le intestazioni dei campi in £SQLDCName\\
%%quote
|    C                  EVAL      £SQLDString=SelectSQL
|    C                  EVAL      £SQLD_FUNFU='OPEN'
|    C                  EVAL      £SQLD_FUNME='LAB'
|    C                  EXSR      £SQLD
/%
----

!! POS  - Posizionamento cursore\\
! NEXT - al record successivo\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='POS'
|    C                  EVAL      £SQLD_FUNME='NEXT'
|    C                  EXSR      £SQLD
/%
----
! PRIOR - al record precedente\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='POS'
|    C                  EVAL      £SQLD_FUNME='PRIOR'
|    C                  EXSR      £SQLD
/%
----
! FIRST - al primo record\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='POS'
|    C                  EVAL      £SQLD_FUNME='FIRST'
|    C                  EXSR      £SQLD
/%
----
! LAST - all'ultimo record\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='POS'
|    C                  EVAL      £SQLD_FUNME='LAST'
|    C                  EXSR      £SQLD
/%
----
! BEFORE - a BOF\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='POS'
|    C                  EVAL      £SQLD_FUNME='BEFORE'
|    C                  EXSR      £SQLD
/%
----
! AFTER - a EOF\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='POS'
|    C                  EVAL      £SQLD_FUNME='AFTER'
|    C                  EXSR      £SQLD
/%
----
! RELATIVE - relativo al record corrente\\
__(posizionamento relativo al record corrente di +n o -n in base alla variabile £SQLDRows)__
%%quote
|    C                  EVAL      £SQLRel=n
|    C                  EVAL      £SQLD_FUNFU='POS'
|    C                  EVAL      £SQLD_FUNME='RELATIVE'
|    C                  EXSR      £SQLD
/%
----

!! READF - Recupera il Valore della colonna\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='READF'
|    C                  EVAL      £SQLD_FUNME='   '
|    C                  EXSR      £SQLD
/%
----

!! FINDC - Recupera la definizione della colonna\\
! NAM - Ricerca dal nome della colonna in £SQLDCName\\
%%quote
|    C                  EVAL      £SQLDCName=NomeCampo
|    C                  EVAL      £SQLD_FUNFU='FINDC'
|    C                  EVAL      £SQLD_FUNME='NAM'
|    C                  EXSR      £SQLD
/%
----
! LET - Posizionamento\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='FINDC'
|    C                  EVAL      £SQLD_FUNME='POS'
|    C                  EXSR      £SQLD
/%
----
! LET - Lettura\\
%%quote
|     * ciclo sui campi
|    C                  DO        *HIVAL
|    C                  EVAL      £SQLD_FUNFU='FINDC'
|    C                  EVAL      £SQLD_FUNME='LET'
|    C                  EXSR      £SQLD
|    C                  IF        £SQLD35=*ON
|    C                  LEAVE
|    C                  ENDIF
|    C                  ENDDO
/%
----

!! RETREC - Restituisce in £SQLDString l'intero record\\
! G18 - con i campi separati da ' '\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='RETREC'
|    C                  EVAL      £SQLD_FUNME='G18'
|    C                  EXSR      £SQLD
/%
----
! MAT - con i campi separati da '|'\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='RETREC'
|    C                  EVAL      £SQLD_FUNME='MAT'
|    C                  EXSR      £SQLD
/%
----
! CSV - con i campi separati da ';'\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='RETREC'
|    C                  EVAL      £SQLD_FUNME='CSV'
|    C                  EXSR      £SQLD
/%
----

!! RETINT - Restituisce in £SQLDString le intestazioni\\
! G18 - con i campi separati da ' '\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='RETINT'
|    C                  EVAL      £SQLD_FUNME='G18'
|    C                  EXSR      £SQLD
/%
----
! CSV - con i campi separati da ';'\\
%%quote
|    C                  EVAL      £SQLD_FUNFU='RETINT'
|    C                  EVAL      £SQLD_FUNME='CSV'
|    C                  EXSR      £SQLD
/%
----

!!! TIPI DI DATI SUPPORTATI\\
- __Tipo dato RPG__ | __Tipo dato SQL__ | __Tipo dato £IR1__\\
-  A              |  CHAR           |  A\\
-  A (VARYING)    |  VARCHAR        |  A\\
-  05I 0          |  SMALLINT       |  B\\
-  10I 0          |  INTEGER        |  B\\
-  20I 0          |  BIGINT         |  B\\
-  F              |  FLOAT          |  F\\
-  D              |  DATE           |  L\\
-  P              |  DECIMAL        |  P\\
-  S              |  NUMERIC        |  S\\
-  T              |  TIME           |  T\\
-  Z              |  TIMESTAMP      |  Z\\

!!! VARIABILI\\
%%quote
|L(PUN)
|- Stringa istruzione SQL (in INPUT)
|- Record restituito (in OUTPUT con funzione 'RETREC')
|- Valore del campo restituito (in OUTPUT con funzione 'READF')
/%
----
D £SQLDString     S          32766    VARYING
********************************************************************\\
* DS INPUT/OUTPUT\\
D £SQLD_DS1       DS
* INPUT
D* numero in base al quale eseguire il fetch relative (con funzione 'RELATIVE')
D* numero di righe per l'optimize su apertura cursore
D  £SQLDRows                    30P 0
* OUTPUT con info campi (con funzione 'READF')
D* nome colonna (con metodo 'NAM' o 'NAMLAB') o intestazione (con metodo 'LAB')
D  £SQLDCName                   30
D* label (intestazione) colonna (con metodo 'NAMLAB')
D  £SQLDCLabel                  30
D* tipo di dato del campo
D  £SQLDCDType                   5I 0
D* lunghezza campo stringa
D  £SQLDCLen                     5I 0
D* scala campo numerico (numero posizioni decimali)
D  £SQLDCScale                  10I 0
D* precisione campo numerico
D  £SQLDCPrec                   10I 0
D* indice della colonna corrente del record
D  £SQLDCurCol                   7  0
D* numero totale delle colonne del record
D  £SQLDTotCol                   7  0
D* tipo di dato del campo nel formato della £IR1AC
D  £SQLDCDTpIR                   1
****************************************************************\\
* DS OUTPUT Info ERRORE\\
D £SQLD_ERROR     DS
* Indicatore di errore
D  £SQLD35                        N
* SQLCOD
D  £SQLDCOD                      5I 0
* SQLERM
D  £SQLDERM                     80
* %Status (per errori di allocazione di memoria)
D  £SQLDSTATUS                   5S 0
* Variabili per errore non SQL
D  £SQLDVA                      45
!!! ESEMPIO\\
%%quote
|     ESEGUIRE UNA LETTURA DEL BRARTI0F QUERY : SELECT * FROM BRARTI0F
|     C*APRO
|     C                   EVAL      £SQLDString='SELECT * FROM BRARTI0F'
|     C                   EVAL      £SQLD_FUNFU='OPEN'
|     C                   EVAL      £SQLD_FUNME='NAM'
|     C                   EXSR      £SQLD
|1    C                   IF        £SQLD35=*ON
|     C                   LEAVESR
|1e   C                   ENDIF
|     C*posizionamento
|     C                   EVAL      £SQLD_FUNFU='POS'
|     C                   EVAL      £SQLD_FUNME='NEXT'
|     C                   EXSR      £SQLD
|1    C                   IF        £SQLD35=*ON
|     C                   LEAVESR
|1e   C                   ENDIF
|     C*lettura
|     C                   DO        *HIVAL
|     C                   EVAL      £SQLD_FUNFU='RETREC'
|     C                   EVAL      £SQLD_FUNME='MAT'
|     C                   EXSR      £SQLD
|1    C                   IF        £SQLD35=*ON
|     C                   LEAVE
|1e   C                   ENDIF
|     C* £SQLDString  CONTIENE IL RISULTATO DELLA FETCH
|1e   C                   ENDDO
|     C*CHIUDO
|     C                   EVAL      £SQLD_FUNFU='CLOSE'
|     C                   EVAL      £SQLD_FUNME=*BLANKS
|     C                   EXSR      £SQLD
|     C* LA FUNZIONE CLOSE CHIUDE IL CURSORE E PULISCE £SQLDString
/%
----