Programaba con el Visual Fox Pro y he cambiado al Power Builder. ¿Me puedes ayudar?

Necesito hacer un pequeño programa, pero soy nuevo.
Yo programaba en visual foxpro, y cuando creaba un cursor, todos los records se ivan a dicho cursor, ahora no se como puedo accesar a todos los records al mismo tiempo.
Tu crees que podamos si te es posible hacer algún tiempo de reunión virtual, para hacerte varias preguntas que tengo sobre powerbuilder.
Te agradeceré tu ayuda,
Rafael TEjera

1 Respuesta

Respuesta
1
El manejo de cursores en power builder es bastante sencillo, en principio es muy parecido a la forma en que lo construye una utilidad cualquiera que utilice lenguaje SQL, simplemente declara el cursor y luego lo lee ya sea secuencialmente o en saltos
La sintaxis para construir un cursor es:
DECLARE <nombre cursor> CURSOR FOR
SELECT <columna>,
<columna>,
<columna....>
FROM <tabla>,
<tabla>,
<tabla...>
WHERE <condicion>
USING <objeto transaccion>;
Para iniciar la utilizacion de este hay que abrirlo
OPEN <nombre cursor>;
Para navegar en el:
FETCH <nombre cursor> INTO :<variable>,
:<variable>,
:<variable....>;
y finaliza con el cierre de este:
CLOSE <nombre cursor>;
veamos un ejemplo de manejo de un cursor
BOOLEAN lb_loop
LONG ll_codigo
STRING ls_nombre
STRING ls_direccion
DECLARE cur_cliente CURSOR FOR
SELECT codigo, nombre, direccion
FROM mae_clientes
WHERE (empresa = 1)
USING SQLCA;
OPEN cur_cliente; //--> abre el cursor
DO
FETCH cur_cliente INTO :ll_codigo, :ls_nombre, :ls_direccion
lb_loop = ((SQLCA.SQLCode = 0) AND (SQLCA.SQLDBCode = 0))
IF lb_loop THEN
//--> interrogacion de valores y procedimientos
..
.
.
END IF
LOOP WHILE lb_loop
CLOSE cur_cliente;
EXPLICACION:
*- construyo un cursor con un nombre UNICO. (cur_cliente)
*- utilizo varias variables para recibir los valores generados en el select del cursor, los cuales tienen el mismo tipo en funcion de las columnas seleccionadas.
*- abro el cursor (importante y obligatorio)
*- utilizo el fetch con el nombre del cursor y asigno a las variables declaradas, los valores de este, en el orden que se encuentran solicitadas en el select, separadas por coma, y anteponiendo dos puntos a cada una.
*- utilizo una variable booleana, para percibir un error, el cual puede ser enviado por la base de datos (SQLDBCode )o un error del area dinamica (SQLCode )
*- cuando la variable booleana es TRUE, el proceso que tengo que efectuar, es accionado, de lo contrario rompe el ciclo.
*- finaliza cerrando el cursor ( importante porque puede provocar problemas si no se cierra).
Algo que tener en cuenta:
Cuando creamos un cursor, y dentro de este hacemos una actualización basado en la misma tabla o en una tabla que este integrada en el select del cursor, este se aborta y no es procesado, pues la primera tupla ejecuta un conflicto entre la lectura y la escritura, y aunque no hay error visible, y aparentemente todo funciona bien, y la respuesta debe ser la idónea pero pareciera que esto provoca el que el cursor llegue hasta la ultima linea y salte del inicio al fin sin razón.
Para solucionar el anterior problema, tendrás que crear un nuevo objeto de transacción y basar tu actualización (update) en este, claro esto provoca una nueva conexión y un incremento de trabajo en el servidor, la base de datos, procesos, etc.
Pensar en integrar un cursor en un vector es algo descabellado pues así como puede tener pocos registros puede que no, y como todos sabemos los vectores o arrays se comen la memoria ram disponible.
Entonces como lo soluciono:¿?
Muy fácil, compones un datawindow solo lectura sin actualización activa, etc, integrando el concepto de select que deseas, (compuesto o simple), y lo manejas por medio del DATASTORE, el cual es un DATAWINDOW object pero no maneja la parte visual, y ademas puede ser creado por medio de una instancia y destruida cuando termine el proceso.
Ventajas de usar datastore
Todas,
*- tienes el total de lineas
*- puedes ir hacia adelante o hacia atras
*- en busqueda de datos, puedes usar el datastore las veces que desees, sin necesidad de volver a generar el cursor
*- no tiene conflicto con la acualizacion de datos en alguna tabla incluida en el select.
*- ES MAS RAPIDO
*- no consume mucha memoria
*- no necesitas de una nueva conexion o un nuevo objeto de transacciones
Advertencias:
Si te inclinas por el DATASTORE ( que es lo recomendable), ten cuidado al momento de generar tu ejecutable, puede que en tiempo de desarrollo el programa funcione bien, y en tiempo de ejecución una vez generado el ejecutable, ya no.
Esto puede suceder en el caso en que estés generando librerías dinámicas de power builder tipo pbd y estas incluyendo algunas librerías en el área de ejecución, si esto fuera así, para utilizar los DATASTORE es necesario que TODAS las librerías sean generadas tipo PBD
Si utilizas generación de librerías dinámicas tipo standard DLL, esto no sucede.
El manejo del datastore lo puedes encontrar en la ayuda de pb, y ver como funciona en la demo que viene incluida en la instalación, incluso en esta, tienes fuente para ver como funciona.
Bien, espero que esto pueda servirte de ayuda
saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas