Power Builder - Cursor "nombre_cursor" does not exist

   
Vista:

Cursor "nombre_cursor" does not exist

Publicado por Arturo (6 intervenciones) el 04/08/2010 21:21:42
Hola amigos:

Estoy trabajando con Powerbuilder 11.5 y Postgres 8.3.8

He declarado mi cursor de la siguiente forma:
DECLARE cursor_preliminar CURSOR FOR

SELECT llave,numemp, cvecon, unidades, importe, mc
FROM sis.preliminar
WHERE tponom = :is_tponom AND tpopro = :is_tpopro
FOR UPDATE;

OPEN cursor_preliminar;

do while true
FETCH cursor_preliminar
INTO :ll_llave,:ll_numemp,:ls_cvecon,:ldc_unidades,:ldc_importe,:li_mc;

if sqlca.sqlcode <> 0 then exit

... aqui varias instrucciones hastacalcular ldc_calculado

UPDATE sis.preliminar SET importe = :ldc_calculado
WHERE CURRENT OF cursor_preliminar;

pero al entrar al proceso y querer actualizar la columna "importe" de la tabla que tengo abierta, la tabla que se está leyendo del cursor me marca que no existe el cursor, no obstante que está declarado y abierto, incluso lee información correctamente.

¿A qué se deberá que falla?

Gracias anticipadas por su atención.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Cursor

Publicado por JeinnerH (638 intervenciones) el 04/08/2010 22:08:40
Eduardo, no soy experto en Postgres, es más, hasta ahora veo esa sintaxis que utilizas en el Update.

Eso no es SQL estandar. Has realizado ese tipo de Update en algún otro lugar de tu sistema?

Qué es lo que debiera hacer este Update, además de actualizar el campo Importe?

Disculpa la ignorancia, pero es también para aprender.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cursor "nombre_cursor" does not exist

Publicado por Arturo (6 intervenciones) el 04/08/2010 22:23:12
Hola JeinnerH.

El update solo debe actualizar el campo importe de la tupla en la cual está posicionado el cursor. La sintaxis no tiene nada que ver con postgres, es parte de las instrucciones de Powerbuilder y está en la ayuda:
---------------------------------
Usage

Set the CursorUpdate parameter to 1 to declare updatable cursors if you plan to use either of the following SQL statements in your application (table represents the table name and cursor represents the cursor name):

DELETE FROM table WHERE CURRENT OF cursor
UPDATE table SET set_clause WHERE CURRENT OF cursor

If you are communicating with the database in a PowerBuilder script, you can reset the CursorUpdate value anytime before or after the Transaction object has connected to the database.
When you declare cursors updatable in a database accessed through DirectConnect, the cursor declaration you code must include a FOR UPDATE OF column_list clause.
When you use updatable cursors with the DIR interface and a Gatewayless connection to the mainframe, you must set Block=1 before executing the cursor. You can reset the Block parameter to its default of 100 after you close the cursor within your code.
----------------------

Como puedes observar, es parte de la sintaxis para la instrucción UPDATE cuando estás utilizando un cursor.

Por cierto, no soy Eduardo, soy Arturo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cursor

Publicado por JeinnerH (638 intervenciones) el 04/08/2010 23:51:27
Perdón por la confusión Arturo.

Esto de los Cursores Actualizables es nuevo para mi, nunca lo había utilizado. Ves como se cura la ignorancia... jajajajaja....

Hice una prueba para revisar su funcionamiento con el siguiente código, y me funcionó a las mil maravillas. Mira si hay algo diferente con lo que hago:

Long ll_num_agencia
String ls_trabaja_sabado

DECLARE c_prueba CURSOR FOR
SELECT num_agencia,
trabaja_sabado
FROM MB.Agencias FOR UPDATE;
OPEN c_prueba;
If SQLCA.SQLCode <> 0 Then &
Messagebox('ERROR', 'ERROR('+String(SQLCA.SQLCode)+'): '+SQLCA.SQLErrText)

FETCH c_prueba INTO :ll_num_agencia,
:ls_trabaja_sabado;
Do While SQLCA.SQLCode = 0
If ls_trabaja_sabado = 'S' Then
ls_trabaja_sabado='N'
Else
ls_trabaja_sabado='S'
End If

UPDATE MB.Agencias
Set trabaja_sabado=:ls_trabaja_sabado
WHERE CURRENT OF c_prueba;

If SQLCA.SQLCode <> 0 Then &
Messagebox('ERROR', 'ERROR('+String(SQLCA.SQLCode)+'): '+SQLCA.SQLErrText)

FETCH c_prueba INTO :ll_num_agencia,
:ls_trabaja_sabado;
Loop
COMMIT;
Close c_prueba;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cursor

Publicado por Arturo (6 intervenciones) el 05/08/2010 16:43:32
Hola JeinnerH:

Gracias por contestar.

Fijate que revisé tu código, y en teoría es igual al mio. No encontré algo extraordinario. Sin embargo, a mi me envía el error que ya mencioné en mi pregunta.

He llegado a pensar que tal vez sea por el manejador de base de datos, y que tal vez tengo que hacerlo de otra forma. Con qué base de datos y versión de ella trabajaste? Que versión de PB tienes?

Me gustaría, si lo permites enviarte mi código para que lo pruebes. Te mando estructuras de tablas incluso con información. O como tú me digas.

Te recuerdo que yo estoy trabajando con PB 11.5 y la versión 8.3.8 de posgres.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cursor

Publicado por JeinnerH (638 intervenciones) el 05/08/2010 17:02:44
Con gusto Arturo, para eso estamos, para ayudar en lo que se pueda y aprender.

Yo estoy bien atrás en el tiempo. Tengo PB 6.5 en el trabajo y la 8 en mi casa.

Las pruebas las hice con PB 6.5 y SQL Server 2000

No creo que pueda tener compatibilidad con el PB 11, y tampoco tengo los programas para instalarlo. Así que no te podría ayudar con probarlo.

Has probado hacer la actualización de la tabla de la forma natural, sin utilizar el CursorUpdate? Es decir:
Update sis.preliminar
Set importe=:ldc_calculado
Where llave=:ll_lave;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cursor

Publicado por Arturo (6 intervenciones) el 05/08/2010 18:45:43
Hola JeinnerH :

Fijate que normalmente trato de apegarme a la ayuda de los lenguajes en los que normalmente programo.

En éste caso, para actualizar los datos de una tabla accesada mediante cursores, pues la literatura dice que uses el FOR UPDATE y luego en el UPDATE uses el CURRENT OF. Pues asi lo hice, conforme a las reglas: Y no funcionó.

Pero jamás se me hubiera ocurrido hacerlo en forma natural como me lo recomendaste, y que crees? FUNCIONÓ!!!

La verdad estoy muy agradecido porque con tu ayuda me has ahorrado muchísimo trabajo, pues hubiera tenido que crear otras tablas de paso para lograr mi objetivo.

Gracias por todo. Saludos desde Cuernavaca, Mexico.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cursor

Publicado por JeinnerH (638 intervenciones) el 05/08/2010 21:14:51
Con gusto Arturo. Recuerda nada más quitarle las propiedades de For Update del Cursor, porque no estarían realizando ninguna función en este caso.

Saludos. Un placer.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar