La Web del Programador: Comunidad de Programadores
 
    Pregunta:  56967 - DYNAMIC CURSOR
Autor:  juan
buenos dias , mire necesito extraer datos de tablas pero en forma dinamica para esto estroy usando los cursores dinamicos

1) trans2 es una variable de transaccion para una data en acces

2) dw_1 es un datawindow donde solo estoy almacenando los valores
extraidos del cursor sgt:

long reg
string ncta,nocta
DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA;
PREPARE SQLSA FROM "SELECT num_cta,nom_cta from enct0108 where len(num_cta)=7 order by num_cta" using trans2;
OPEN DYNAMIC my_cursor ;
FETCH next my_cursor INTO :ncta,:nocta;
do until trans2.sqlcode=100
reg=dw_1.insertrow(0)
dw_1.object.num_cta[reg]=ncta
FETCH my_cursor INTO :ncta,:nocta;
loop
CLOSE my_cursor;
commit using trans2;
messagebox(ncta,'ok')

la recuperacion de datos es exitosa me extraer los datos de la tabla en acces que deseo y los muestra en mi datawindow, ahora el problema es que despues del mensaje de ok, los comandos de mi ventana se bloquean solos, alli tengo un boton buscar y salir y no puedo usarlos, no me permite hacer clic en ningun boton de comando ni escribir en una caja de texto que tb tengo en la ventana;
lo unicvo que me permite es presionar teclas la ej. escape que programe para cerrar la ventana, bueno espero puedas ayudarme, cual crees que pueda ser mi error?? o que podria estasr haciendo mal???

  Respuesta:  Adolfo Chairez
Te envio ejemplos porque yo utilizo los cursores dinĂ¡micos un poco diferente.

ls_query = "SELECT a.emp_id,emp_nom from emp_dat_adi a,gl_emp b WHERE a.emp_cia = "
ls_query = ls_query + string(gi_cia_ot) +" and b.emp_cia = a.emp_cia and Emp_Feb <> ' ' and "
ls_query = ls_query + "niv_descrip = 'SUPERVISOR' and a.emp_id = b.emp_id"

if depto <> 'TODOS' then ls_query = ls_query + " and emp_d03 = '"+depto+"'"

DECLARE cur_sup DYNAMIC CURSOR FOR SQLSA;
PREPARE SQLSA FROM :ls_query;
OPEN cur_sup;

if sqlca.sqlcode = -1 then
messagebox("Error","No se pudo ejecutar la query busca supervisores "+sqlca.sqlerrtext)
else
DO
FETCH cur_sup INTO :ls_numero,:ls_nombre;
if sqlca.sqlcode = 0 then
ddlb_supervisor.additem(ls_nombre)
lb_supervisor.additem(ls_numero)
end if
LOOP WHILE sqlca.sqlcode = 0
CLOSE cur_sup;
end if

/* Si lo que queremos es ejecutar una instruccion para modificar tablas no usar las instrucciones
anteriores sino esta*/
EXECUTE IMMEDIATE :ls_query;
if sqlca.sqlcode = -1 then
messagebox("Error","En el commando EXECUTE IMMEDIATE~n"+sqlca.sqlerrtext)
end if

// Para un segundo canal dinĂ¡mico
En el declare de la window:
DynamicStagingArea SQLSA2

En el open:
SQLSA2 = CREATE DynamicStagingArea

En el close
DESTROY SQLSA2