PLex con DB2

Obsydian, Cool:Plex, Advantage Plex, AllFusion Plex...

Moderadores: Jorge Ubeda, pacopicon

PLex con DB2

Notapor Invitado » Lun Mar 20, 2006 8:46 pm

Hola.
Estamos realizando pruebas para conectar DB2 con plex (actualmente tenemos synos con plex), nuestro problema son los procedimientos almacenados. Si bien podemos llamar a procedimientos los cuales retornen solo un valor (ej. un select count(*) from tabla) nos falta traer un grupo de registros.
En estos momentos estoy probando con cursores pero no se como manejar los registros a traer. (en el antiguo esquema era facil con los objetos current, moredata position,etc.)
el codigo que tengo es el siguiente. (todos source code)

preparo la variable
C/EXEC SQL
C+ PREPARE bloque FROM select * from prueba
C/END-EXEC

Declaro el cursor
C/EXEC SQL
C+ DECLARE C1 CURSOR FOR Bloque
C/END-EXEC

abritr cursor
C/EXEC SQL
C+ OPEN C1
C/END-EXEC

leer cursor (no se como)
C/EXEC SQL
C+ FETCH FROM C1 INTO :&(1), :&(2:)
C/END-EXEC

Cierra Cursor
C/EXEC SQL
C+ CLOSE C1
C/END-EXEC
todo este codigo se encuentra en una funcion de tipo ServerExternal (SQLRPGlV)

se supone que los datos del curson van a una grilla (son 2 campos).

Gracias.

Carlos.
Valparaiso, Chile
Invitado
 

Notapor pacopicon » Lun Mar 20, 2006 10:09 pm

Hola Carlos:

Yo tengo funciones con cursores y me van bien. De hecho es prácticamente como tú expones aquí (bueno yo la sentencia PREPARE no la ejecuto).

Luego lo que tienes que hacer es meterte en un bucle con el FETCH hasta que obtengas SQLCOD distinto de 0 (+100 es cuando no recuperas más filas).

Cada fila recuperada la mueves a la variable FetchedData (que previamente has definido en la función que contiene todas estas setencias).

Si ves que con esto no tienes suficiente, dime algo y en cuanto tenga un poco de tiempo (que es que tengo poco) te informo con más detalle.

Saludos,
Paco Picón
www.metadata.es
pacopicon
 
Mensajes: 121
Registrado: Lun Oct 03, 2005 12:28 pm
Ubicación: Málaga - España

PLex con DB2

Notapor Invitado » Mar Mar 21, 2006 2:54 pm

Gracias por tu respuesta.
Como vez mi problema es el que dices....
todo este codigo lo tengo en una sola funcion RPG. y no se como hacer el manejo de los registros que rescato , en una blockfetch me preocupaba de las variables de retorno pero aca no se como manejarlas... se como dices lo de la SQLCOD, pero no se como manejarla en una funcion . Podrias mandarme algun ejemplo sencillo de como manejas los registroas rescatados y mostrorlos en una grilla...

Gracias.

Carlos
Valparaiso, Chile
Invitado
 

Re: PLex con DB2

Notapor Invitado » Mié Mar 22, 2006 4:02 pm

Anonymous escribió:Gracias por tu respuesta.
Como vez mi problema es el que dices....
todo este codigo lo tengo en una sola funcion RPG. y no se como hacer el manejo de los registros que rescato , en una blockfetch me preocupaba de las variables de retorno pero aca no se como manejarlas... se como dices lo de la SQLCOD, pero no se como manejarla en una funcion . Podrias mandarme algun ejemplo sencillo de como manejas los registroas rescatados y mostrorlos en una grilla...

Gracias.

Carlos
Valparaiso, Chile


Hola.
Ya logro traer los datos. pero ahora tengo problemas con la cantidad de registros, el fetcheddata tiene que tener un lñargo fijo para que funcione. No se como manejar los registros.
Ejemplo.
en mi primer caso, tabla de 12 registros, el fetcheddata es de 64 y muestra sin problemas en la grilla. Para el segundo caso, tabla de 800 Registros, no puedo colocar el occurs, y al sacarlo me muestra solo el ultimo registro 800 veces.

Gracias.
Carlos.
Invitado
 

Notapor pacopicon » Mié Mar 22, 2006 5:30 pm

Hola Carlos:

Tenía pensado ponerte el otro ejemplo, pero todavía no había podido.

Para el caso que dices tienes 2 posibilidades:

- Cambiarle el occurs al fetchedata para que tenga un número de ocurrencias superior a las posibles filas que tú puedas recuperar (no es muy buena solución, porque no es flexible y porque además en muchos casos te encuentras con límites -creo recordar que el RPG por ej. tenía un límite).

- Acceder con tu SQL posicionándote. Define en la sentencia un WHERE donde además de tus criterios de búsqueda controles que las filas recuperadas sean mayor que la CLAVE DESDE. Controla también un parámetro donde puedas controlar que se ha recuperado la última fila (ej. Código retorno EOV). Cuando en la función que está cargando el GRID llegues al último registro (por ej. que ha alcanzado los 64), vuelve a llamar a la función FETCH, pasándole la CLAVE de la ULTIMA fila recuperada, para que vuelva a recuperar desde ahí.

A ver si lo consigues finalmente. Suerte
Paco Picón
www.metadata.es
pacopicon
 
Mensajes: 121
Registrado: Lun Oct 03, 2005 12:28 pm
Ubicación: Málaga - España

Notapor Invitado » Vie Mar 24, 2006 4:28 pm

pacopicon escribió:Hola Carlos:

Tenía pensado ponerte el otro ejemplo, pero todavía no había podido.

Para el caso que dices tienes 2 posibilidades:

- Cambiarle el occurs al fetchedata para que tenga un número de ocurrencias superior a las posibles filas que tú puedas recuperar (no es muy buena solución, porque no es flexible y porque además en muchos casos te encuentras con límites -creo recordar que el RPG por ej. tenía un límite).

- Acceder con tu SQL posicionándote. Define en la sentencia un WHERE donde además de tus criterios de búsqueda controles que las filas recuperadas sean mayor que la CLAVE DESDE. Controla también un parámetro donde puedas controlar que se ha recuperado la última fila (ej. Código retorno EOV). Cuando en la función que está cargando el GRID llegues al último registro (por ej. que ha alcanzado los 64), vuelve a llamar a la función FETCH, pasándole la CLAVE de la ULTIMA fila recuperada, para que vuelva a recuperar desde ahí.

A ver si lo consigues finalmente. Suerte

Gracias ya tengo varias pruebas y me funcionan bien.
Ahora estoy dedicado a desarrollar un estandar, y me nacio otro problema, resulta que vamos a dejar al fetcheddata de largo fijo (100 registros) y para esto debemos desarrollar una paginacion. El punto es como mantener el ultimo registro leido en cada lectura.
probe usarndo una condicion where en la cual paso la ultima clave usada, pero es muy estatica pues si la clave es compuesta no funciona.
bien en eso estoy ahora.....

ejemplo
C/EXEC SQL
C+ Declare C1 CURSOR FOR
C+ SELECT * FROM tabla WHERE clave > :clave
C+ ORDER BY CLAVE
C+ FETCH FIRST 100 ROWS ONLY
C/END-EXEC
esta solucuin es muy costosa pues tendria que ejcutar n veces la consulta para obtener los datos, contando los open delcare, close .
existe otra forma de mantener un control sobre los datos leidos en el curso???.
Por otro lado estamos realizando pruebas para ejecutar procedimientos generados externamente.


Saludos
Invitado
 

Notapor pacopicon » Vie Mar 24, 2006 6:17 pm

Hola Carlos:

Me alegro que vayas avanzando.

Sobre lo que dices de las claves compuestas, también se puede hacer. Es cuestión de utilizar todas las claves, aunque a veces se complica la condición en el WHERE.

Dependiendo del caso lo tendrás que hacer de una u otra forma, por ej. concatenando toda la clave en un solo campo COL1 || COL2 || COL3 (lo conviertes previamente a string si fuese necesario).

Aparte de esto, existen situaciones donde tienes que utilizar dos Declaraciones de CURSOR, una para la primera vez (ya que no conoces los valores más bajos de los datos que quieres recuperar) y otra Declaración para el resto, donde ya puedes ir comprarnado con la última fila recuperada.

Saludos
Paco Picón
www.metadata.es
pacopicon
 
Mensajes: 121
Registrado: Lun Oct 03, 2005 12:28 pm
Ubicación: Málaga - España

PLex con DB2

Notapor Invitado » Mar Abr 04, 2006 3:18 pm

Hola.
Ya tengo resuelto mi problema con los procedimientos, ahora es posible llamar a un procedimiento creado por el navigator que cual use un cursor, tengo pruebas de casos en que devuelve solo un valor (un contador) pero para el caso de cursores no me compila... Cree un procedimiento el cual segun un rut me devuelve unos registros, pero al hacer el fetch se cae, creo que el error es que no encuentra el cursor, pues fue creado fuera del programa plex.

Saludos.
nota.. en el procedimiento dejo abierto el cursor, pero igual no lo puedo leer.
Invitado
 

Notapor ornate » Mar May 02, 2006 2:03 pm

Buenas.
Pedimos ayuda a CA, pero al parecer ellos tampoco tienen resulto el problema de SP con retorno de multiples registros, asi que ahora estoy en pleno con java ...... y ya se logro la conexion.

Saludos.
ornate
 
Mensajes: 16
Registrado: Jue Oct 20, 2005 6:50 pm
Ubicación: Chile

Notapor Invitado » Mié May 24, 2006 3:43 pm

Y si yo quiero llamar a una funcion dentro del procedimiento, como seria.... tengo este caso.

C/EXEC SQL
C+ DECLARE C1 CURSOR FOR
C+ SELECT
C+ A.CD_UNIDAD_DESTINO, A.NR_RUT_EMPLEADO_DESTINO,
C+PERSONAL/FOBTNMFUN(A.NR_RUT_EMPLEADO_DESTINO)
C+ FROM WFL/WFL_ESTADO A,
C+ WHERE A.NR_OT_PADRE = :&(1:) AND
C+ A.NR_OT_HIJO = :&(2:) AND
C+ A.CD_TIPO_ESTADO = B.CD_TIPO_ESTADO
C+ ORDER BY A.NR_SECUENCIA_ESTADO
C/END-EXEC

y no me compila.
Invitado
 

Notapor pacopicon » Mié May 24, 2006 3:55 pm

Entre las posibles causas que pueden ocurrir para que no te compile, puede estar:

- Cuando pones un parámetro de la forma

C+ WHERE A.NR_OT_PADRE = :&(1: ) AND

tienes que dejar algunos espacios detrás de ")" porque el generador va a sustituir ":&(1: )" por el nombre de una variable RPG (creo recordar que de 6 caracteres de longitud) y entonces se te puede solapar con la siguiente palabra clave (en este caso AND). Esto lo puedes ver en el código generado.

En la línea C+PERSONAL/FOBTNMFUN(A.NR_RUT_EMPLEADO_DESTINO) veo:
- No sé si la "P" de PERSONAL puede estar junto a "+"
- Además, creo que la línea completa está mal. PERSONAL/FOBTNMFUN supongo que será un fichero, no?.
NR_RUT_EMPLEADO_DESTINO es un campo de PERSONAL/FOBTNMFUN?

Contéstame a estas dos cuestiones y si quieres te mando como debería quedar la sentencia.

Saludos,
Paco Picón
www.metadata.es
pacopicon
 
Mensajes: 121
Registrado: Lun Oct 03, 2005 12:28 pm
Ubicación: Málaga - España

Notapor Invitado » Jue May 25, 2006 5:20 pm

Hola.
lo solucione agregando la lib personal a mi jobd, y funciono, pero etengo problemas con los campos nulos.
Ej. segun el codigo me devuielve 3 registros, pero si agrego un campo mas al select que esta nulo me devuelve puros ceros, para el registro que tiene nulo un campo. (sigue devolviendo 3 registros)
me devuelve
0 0 0 0
6112 3 4 12
6114 22 4 45

Por un campo que este nulo deja todo el registro sin datos.
Invitado
 


Volver a Plex

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron