RESPUESTA A LA PREGUNTA 13148 - POWER BUILDER Si se pueden ejecutar queries dinamicamente adjunto un pequeño codigo y al final econtraras una explicacion: La sintaxis es la siguiente: DECLARE [nom_cur] DYNAMIC CURSOR FOR SQLSA; PREPARE SQLSA FROM :[query_string]; OPEN DYNAMIC [nom_cur]; FETCH [cons] INTO :[variable1],:[variable2]..; Ojo: Para saber el estado de la ejecucion de la query y el numero de renglones no utilice sqlsa.sqlcode y sqlsa.sqlnrows sino sqlca.sqlcode y sqlca.sqlnrows. E aqui un ejemplo: //Inicia codigo DECLARE cons DYNAMIC CURSOR FOR SQLSA ; for i = 1 to tab_1.tabpage_con.lb_query.totalitems() if i = 1 then query = "SELECT DISTINCT pac_clave,sec_fecha FROM sector_salud WHERE " else if ftemp1 then query = "SELECT DISTINCT pac_clave,sec_fecha FROM temp_query2 WHERE " else query = "SELECT DISTINCT pac_clave,sec_fecha FROM temp_query1 WHERE " end if end if cad = tab_1.tabpage_con.lb_query.text(i) tab_1.tabpage_con.dw_query.object.sle_consulta.text = tab_1.tabpage_con.dw_query.object.sle_consulta.text + " "+trim(tab_1.tabpage_con.lb_query.text(i)) cad = trim(cad) car = left(cad,1) preg = "" //Contiene el numero de la pregunta resp = "" //Contiene la descripcion de la respuesta flag = true ctr = 0 if len(cad) > 1 then // Con esto se excluye el Y o el O, es decir siempre sera un AND for j = 1 to len(cad) car = mid(cad,j,1) if isnumber(car) and flag then //Numero de pregunta preg = preg + car else if car = ")" and ctr = 0 then query = query + "pre_num ="+preg+" and res_descrip " //Agregamos el numero de pregunta flag = false ctr = ctr + 1 //Iniciamos la obtencion de la descripcion de la respuesta for k = len(cad) to 1 step -1 car2 = mid(cad,k,1) if car2 = "=" or car2 = ">" or car2 = "<" then k = 1 else resp = car2 + resp end if next resp = trim(resp) else if car = "=" or car = ">" or car = "<" then query = query + car end if end if end if next end if query = query + " '"+resp+"'" //Cerramos una pregunta if len(cad) > 1 then //Corremos la query e insertamos el(los) resultado(s) en los temporales PREPARE SQLSA FROM :query; OPEN DYNAMIC cons; if sqlca.sqlcode <> 0 then messagebox("Consultas a Sector Salud","No se pudo ejecutar la segunda query de prueba"+char(13)+sqlca.sqlerrtext) else DO FETCH cons INTO :clave,:fecha; if sqlca.sqlcode = 0 then //Insertamos el resultado if i = 1 then INSERT INTO temp_query1 SELECT * FROM sector_salud WHERE pac_clave = :clave AND sec_fecha = :fecha; else if ftemp1 then INSERT INTO temp_query1 SELECT * FROM temp_query2 WHERE pac_clave = :clave AND sec_fecha = :fecha; else INSERT INTO temp_query2 SELECT * FROM temp_query1 WHERE pac_clave = :clave AND sec_fecha = :fecha; end if end if if sqlca.sqlcode = -1 then messagebox("Error","No se pudo ejecutar la query que inserta en un temporal"+char(13)+sqlca.sqlerrtext,StopSign!) end if end if LOOP WHILE sqlca.sqlcode = 0 ftemp1 = not ftemp1 end if CLOSE cons; end if next //fin de codigo En si la query debe de recuperar datos de temp1 o temp2 O bserva que la variable query es la que contendra la query, yo la formo obteniendola de un control listbox, para luego insertar estos datos en otros temporal y luego hice una datawindow que recupera de uno o de otro temporal. Espero que te sirva. Saludos Puedes escribirme si lo deseas. P.D. No se puede ejecutar un Retrieve a una DataWindows en forma dinamica. Adolfo Chairez achairez@lajat.com.mx