Hola,
Yo haría dos sentencias SQL completas y el WHERE lo pondría
fuera. Algo así:
if :w-horaini1 <> " "
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-HORAINI1
AND B.CODEST IN ("20", "25", "27")
ORDER BY A.CCIRCOD, B.HINIENT, B.RUTA, B.NPEDWEB
END-EXEC.
end-if
if :w-horaini2 <> " "
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-HORAINI2
AND B.CODEST IN ("20", "25", "27")
ORDER BY A.CCIRCOD, B.HINIENT, B.RUTA, B.NPEDWEB
END-EXEC.
end-if
Un saludo y espero que funcione.
De: [email protected]
[mailto:[email protected]] En nombre de Juan Ramón Garcia
Enviado el: martes, 12 de enero de 2016 16:04
Para: forum.help400
Asunto: COBOL y SQL embebido IF dentro de WHERE
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
Advertencia Legal Este mensaje, y en su caso, cualquier fichero anexo al
mismo, puede contener informacion confidencial, siendo para uso exclusivo del
destinatario, quedando prohibida su divulgacion copia o distribucion a terceros
sin la autorizacion expresa del remitente. Si Vd. ha recibido este mensaje por
error, le rogamos lo comunique al remitente y borre dicho mensaje y cualquier
documento adjunto que pudiera contener. Gracias por su
colaboracion.<br><br>Legal Advisory This message (including any attachments)
may contain confidential information. It is intended for use by the recipient
only. Any dissemination, copying or distribution to third parties without the
express consent of the sender is strictly prohibited. If you have received this
message in error, please inform the sender and delete the message and
attachments from your system. Thank you for your collaboration.
____________________________________________________
Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 © Publicaciones Help400, S.L.