You are on page 1of 8

Armado de un SQL dinamico en SQLRPGLE

Categora : Programacin
Autor : Carlos Robles Espinoza
Ttulo : Armado de un SQL dinamico en SQLRPGLE
Descripcin del truco:
Este truco consiste en el armado de sentencia SQL dinamicamente segun parametros
recibidos que pude ser tambien una pantalla, para el ejemplo se tomo el ingreso por *entry.
Si se ingresa un dato se arma la sentencia con ese dato recibido y asi susecivamente con los
siguientes, aca es la condicion por EQ y AND.
El secreto esta en el SQL sentencias Prepare y Declare. Esto ya esta probado y aceptado
para una aplicacion on-line en desarrollo con mas de 17 opciones de seleccion dinamicas
ademas se le agrego order by. Funciona, con esto no se crean 17 LF.
Esta realizado en SQLRPGLE tiene algo de free, el real esta en desarrollo en free y sub-file.
Espero que les ayude este ejemplo.
H Debug Option(*nodebugio)
*
*
**
Sistema
: Consulta masiva on-line
**
Modulo
:
**
Analisis
: Carlos Robles Espnoza
**
Programacion: Carlos Robles Espinoza
SIDESYS
**
Fecha.......: Octubre 2004 - Argentina
*
**
Descripcin : Arma un SQL dinamicamente segun parametros
**
ingresados.
**
Es un fuente Beta que va a servir como base
**
para una aplicacion on-line de consulta masiva
**
para usuarios finales.
*
*

*
*
*
*
*
*
*
*
*
*
*
*
*

FTCIPICCOUTIF A E
K DISK
rename(CIPICCTI:OUPICCTI)
F
prefix(ou:2) usropn
* ===================================================================
* Auxiliares para SQL
* Variables tipo const
D VarSelect
c
const('select tifecp, tifdpf,
tificcD
,tifrec, tihora, tinnrr, tirrec
D
from tcipicc where ')
D VarEq
c
const(' = ')
D VarAnd
c
const(' and ')

D VarFdpf
c
const(' tifdpf')
D VarFicc
c
const(' tificc')
D VarFecp
c
const(' tifecp')
*
D VarAll
s
1000a
inz(*blanks)
*
* Sentencia para SQL
D Str_sql
s
1000a
inz(*blanks)
* ===============================================================
D
D
D
D

s$_fdpf
s$_ficc
s$_fecp
ip_flag

s
s
s

like(oufdpf) inz(*blanks)
like(ouficc) inz(*zeros)
like(oufecp) inz(*zeros)
DIM(3)

* Definicion de un Prototipo para QCMDEXC


D CmdData
s
80A
inz('Clrpfm *libl/TCIPICCOUT')
D RunSysCmd
D Cmd
D CmdLen
D
D
D
D
D
D
D

PR

extpgm('QCMDEXC')
200A
options(*varsize) const
15P 5 const

SDS

C
C
C
C

Prog
Parms
Pgm_lib
Job_name
User
Job_num

*entry

*proc
*parms
81
244
254
264

90
253
263
269s 0

plist
parm
parm
parm
exsr

ip_fdpf
ip_ficc
ip_fecp
rinicio

* Asigna valores por Num. parametros ingresados


if
ip_fdpf <> *blanks
move
ip_fdpf
s$_fdpf
eval
ip_flag(1) = *on
endif

C
C
C
C
C
C
C
C

if
move
eval
endif

ip_ficc <> *blanks


ip_ficc
s$_ficc
ip_flag(2) = *on

C
C
C
C

if
move
eval
endif

ip_fecp <> *blanks


ip_fecp
s$_fecp
ip_flag(3) = *on

/free
VarAll = VarSelect;
if ip_flag(1);

10
8
8

VarAll = %trimr(VarAll) + VarFdpf + VarEq


+ '''' + s$_fdpf + '''';
endif;
if ip_flag(2);
if VarAll <> VarSelect;
VarAll = %trimr(VarAll) + VarAnd;
endif;
VarAll = %trimr(VarAll) + VarFicc + VarEq
+ %char(s$_ficc);
endif;
if ip_flag(3);
if VarAll <> VarSelect;
VarAll = %trimr(VarAll) + VarAnd;
endif;
VarAll = %trimr(VarAll) + VarFecp + VarEq
+ %char(s$_fecp);
endif;
Str_sql = VarAll;

/end-free
* Prepara y carga variables SQL
C/EXEC SQL
C+ Prepare P1 From : str_sql
C/End-Exec
* Declara Cursor
C/EXEC SQL
C+ DECLARE C1 CURSOR FOR P1
C/END-EXEC
*
C/EXEC SQL
C+ OPEN C1
C/END-EXEC
C
*
*
*

ex_fetch

eval

*inlr = *on

FIN Pgm

C
C

exsr

----------ex_fetch
-----------

------Begsr
-------

C/EXEC SQL FETCH C1 INTO


C+ :oufecp,:oufdpf,:ouficc,:oufrec,:ouhora,:ounnrr,:ourrec
C/END-EXEC
* Graba Mientras no es fin de DB
DOW
SQLCOD = 0

write

OUPICCTI

C/EXEC SQL FETCH C1 INTO


C+ :oufecp,:oufdpf,:ouficc,:oufrec,:ouhora,:ounnrr,:ourrec
C/END-EXEC
C
enddo
C/EXEC SQL CLOSE C1
C/END-EXEC
C

Endsr
-------

*
*

----------rinicio
-----------

------Begsr
-------

* Borra archivo fisico (CLRPFM)


CALLP(E) RunSysCmd(CmdData: %size(CmdData))
Open
TCIPICCOUT

C
C
C

Ver cdigo fuente


Fecha 25-10-2004

Endsr

H Debug Option(*nodebugio)
*
*
**
Sistema
: Consulta masiva on-line
*
**
Modulo
:
*
**
Analisis
: Carlos Robles Espnoza
*
**
Programacion: Carlos Robles Espinoza
SIDESYS
*
**
Fecha.......: Octubre 2004 - Argentina
*
*
*
**
Descripcin : Arma un SQL dinamicamente segun parametros
*
**
ingresados.
*
**
Es un fuente Beta que va a servir como base
*
**
para una aplicacion on-line de consulta masiva para
*
**
usuarios finales.
*
*
*
*
*
FTCIPICCOUTIF A E
K DISK
rename(CIPICCTI:OUPICCTI)
F
prefix(ou:2) usropn
* ===================================================================
* Auxiliares para SQL
* Variables tipo const
D VarSelect
c
const('select tifecp, tifdpf,
tificcD
,tifrec, tihora, tinnrr, tirrec
D
from tcipicc where ')
D VarEq
c
const(' = ')
D VarAnd
c
const(' and ')
D VarFdpf
c
const(' tifdpf')
D VarFicc
c
const(' tificc')
D VarFecp
c
const(' tifecp')
*
D VarAll
s
1000a
inz(*blanks)
*
* Sentencia para SQL
D Str_sql
s
1000a
inz(*blanks)
* ===============================================================
D
D
D
D

s$_fdpf
s$_ficc
s$_fecp
ip_flag

s
s
s

like(oufdpf) inz(*blanks)
like(ouficc) inz(*zeros)
like(oufecp) inz(*zeros)
DIM(3)

* Definicion de un Prototipo para QCMDEXC


D CmdData
s
80A
inz('Clrpfm *libl/TCIPICCOUT')
D RunSysCmd
D Cmd
D CmdLen
D
D
D

PR

extpgm('QCMDEXC')
200A
options(*varsize) const
15P 5 const

SDS
Prog
Parms

*proc
*parms

D
D
D
D
C
C
C
C

Pgm_lib
Job_name
User
Job_num
*entry

81
244
254
264

90
253
263
269s 0

plist
parm
parm
parm
exsr

ip_fdpf
ip_ficc
ip_fecp
rinicio

* Asigna valores por Num. parametros ingresados


if
ip_fdpf <> *blanks
move
ip_fdpf
s$_fdpf
eval
ip_flag(1) = *on
endif

C
C
C
C
C
C
C
C

if
move
eval
endif

ip_ficc <> *blanks


ip_ficc
s$_ficc
ip_flag(2) = *on

C
C
C
C

if
move
eval
endif

ip_fecp <> *blanks


ip_fecp
s$_fecp
ip_flag(3) = *on

/free
VarAll = VarSelect;
if ip_flag(1);
VarAll = %trimr(VarAll) + VarFdpf + VarEq
+ '''' + s$_fdpf + '''';
endif;
if ip_flag(2);
if VarAll <> VarSelect;
VarAll = %trimr(VarAll) + VarAnd;
endif;
VarAll = %trimr(VarAll) + VarFicc + VarEq
+ %char(s$_ficc);
endif;
if ip_flag(3);
if VarAll <> VarSelect;
VarAll = %trimr(VarAll) + VarAnd;
endif;
VarAll = %trimr(VarAll) + VarFecp + VarEq
+ %char(s$_fecp);
endif;
Str_sql = VarAll;

/end-free

10
8
8

* Prepara y carga variables SQL


C/EXEC SQL
C+ Prepare P1 From : str_sql
C/End-Exec
* Declara Cursor
C/EXEC SQL
C+ DECLARE C1 CURSOR FOR P1
C/END-EXEC
*
C/EXEC SQL
C+ OPEN C1
C/END-EXEC
C
*

FIN Pgm
----------ex_fetch
-----------

exsr

ex_fetch

eval

*inlr = *on

------Begsr
-------

C/EXEC SQL FETCH C1 INTO


C+ :oufecp,:oufdpf,:ouficc,:oufrec,:ouhora,:ounnrr,:ourrec
C/END-EXEC
* Graba Mientras no es fin de DB
DOW
SQLCOD = 0
write
OUPICCTI

C
C

C/EXEC SQL FETCH C1 INTO


C+ :oufecp,:oufdpf,:ouficc,:oufrec,:ouhora,:ounnrr,:ourrec
C/END-EXEC
C
enddo
C/EXEC SQL CLOSE C1
C/END-EXEC
C

Endsr
-------

*
*
C

----------rinicio
-----------

------Begsr
-------

* Borra archivo fisico (CLRPFM)


CALLP(E) RunSysCmd(CmdData: %size(CmdData))
Open
TCIPICCOUT

C
C
C

Endsr

You might also like