Buenas Juanra
Pues por darte una pista, yo te diría que en RPG ILE este tipo de cosas 
las hago con SQL dinámico, pero tambien te digo que no tiengo ni idea de 
cómo se mete el SQL diámico en Cobol.



De:     Juan Ramón Garcia <[email protected]>
Para:   "forum.help400" <[email protected]>
Fecha:  12/01/2016 16:21
Asunto: COBOL y SQL embebido IF dentro de WHERE
Enviado por:    [email protected]



Hola a tod@s:

Nunca me he encontrado con este problema pero...siempre hay una primera 
vez.
En un programa COBOL complicadísimo se utiliza SQL embebido para 
seleccionar una serie de registros cuyas características han sido 
seleccionadas por el usuario mediante una pantalla de opciones.
El caso es que quieren cambiar el orden de impresión de los registros 
pero, tal y como está el programa, habría que rehacerlo y utilizar un 
fichero temporal cosa que prefieren que no se haga.
La solución que se me ha ocurrido es condicionar algunas opciones del 
WHERE a si tiene o no tiene datos el campo correspondiente.
Una imagen vale más que mil palabras:

EXEC SQL                  
   DECLARE CUR5 CURSOR FOR
   SELECT B.PTOSERV, B.NPEDWEB, B.RUTA                 
      FROM FSPEDC3 A                                   
      LEFT JOIN FPEDHIPC5 B                            
         ON A.NPEDWEB = B.NPEDWEB                      
      WHERE B.FECENT  = :W-FECHA                       
        AND B.HINIENT = :W-HORAINI                     
        AND B.CODEST IN ("20", "25", "27")             
      ORDER BY A.CCIRCOD, B.HINIENT, B.RUTA, B.NPEDWEB 
END-EXEC.                                              

lo que necesitaría seria algo como esto: (lo escribo en minúsculas para 
que se distinga

EXEC SQL                  
   DECLARE CUR5 CURSOR FOR
   SELECT B.PTOSERV, B.NPEDWEB, B.RUTA                 
      FROM FSPEDC3 A                                   
      LEFT JOIN FPEDHIPC5 B                            
         ON A.NPEDWEB = B.NPEDWEB                      
      WHERE B.FECENT  = :W-FECHA   
if :w-horaini1 <> "    "                    
        AND B.HINIENT = :W-HORAINI1
end-if
if :w-horaini2 <> "    "                    
        AND B.HINIENT = :W-HORAINI2
end-if                       
        AND B.CODEST IN ("20", "25", "27")             
      ORDER BY A.CCIRCOD, B.HINIENT, B.RUTA, B.NPEDWEB 
END-EXEC.    

Evidentemente no funciona y he probado con CASE y otras "cosas" que he 
encontrado por ahí pero no lo consigo y esto simplificaría mi problema.

¿Hay alguna forma de condicionar las sentencias del WHERE?

Un saludo.

Juanra
SqlCobolSaurio

____________________________________________________
Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 © Publicaciones Help400, S.L.
____________________________________________________
Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 © Publicaciones Help400, S.L.

Responder a