Aplicación "No Responde" al perder el foco

Hola, tengo un programa en mi aplicación hecha en powerbuilder 12.5, no grabo nada en ninguna BD tengo el siguiente al hacer click en un botón.

dw_1.retrieve() // 200 registros aprox.for i=1 to dw_1.rowcount()     for J=1 to 7      dw_2.retrieve() // el retrieve es con algunos parametros      if dw_2.retrieve()>0 then         ln_row=dw_3.insertrow(0)         ls_dato=dw_2.getitemstring() //// con sus respectivos parametros         dw_3.setitem(ln_row,ls_dato)      end if     nextnext

obvio ese codigo está resumido, lo que quiero hacer es dependiendo de el resultado que me devuelve el dw_2 (una consulta a una BD Sybase) ingreso datos de ese dw a otro dw_3 (un dw tipo external).

El programa funciona OK, veo como en la dw_3 se van agregando datos pero si le doy click a otro lado de la aplicación o si cambio el foco hacia otro programa y regreso a mi aplicación está el "No responde" y se queda así hasta que termina de hacer el proceso (pongo un mensaje "OK" al finalizar).

¿Cómo puedo corregir eso? ... Que al regresar a mi app luego de cambiar el foco continué sin bloquearse, sin ese mensaje "No responde" ... Espero me haya hecho entender y espero me puedan ayudar.

Saludos

1 Respuesta

Respuesta
1

un retrieve dentro de uno o varios for? o.O     horrible horrible!

Lo que debes intentar (en lo posible) es hacer la menor cantidad de acceso a la DB (retrieves)

Ya sea usando un select (más complejo con unions etc )

Y tal vez en ves de insertrows + setitems.. tal vez rowscopy (para copiar por bloques ) y o filtros

Reduciendo en numero de procesos vas a evitar que tu app parezca "colgado"

Hola, gracias por la respuesta, entiendo lo de rowscopy, me parece una buena idea, lo intentaré ... ahora lo de los retrieve's si me parece interesante, ¿cómo hacerlo? ... ¿La misma consulta que está en el DW ponerlo como select en el código? Pero tendría que pasarle los mismo parámetros ... por ejemplo en un dw tengo los "permisos de inasistencia de personal" y le paso como parámetro el código del trabajador es por eso que lo hago dentro de un for para pasarme código por código de trabajador y si tiene algún registro (algún permiso) pasarlo a ese dw_3 que es un external, tiene que ser trabajador por trabajador ... trataré con todos los "permisos" separarlo por fecha (todos los trabbajadores) y lueso usar un find, ¿crees qué sea una buena solución? ¿O sino que me recomiendas?

Muchas gracias, seguiré metiendo mano

Saludos

A ver si te entendí...

¿Quieres listar todos los trabajadores que tengan algún permiso?

... Si es así podrías hacerlo con un nested select.. (select anidado)

SELECT * FROM trabajadores WHERE EXISTS ( SELECT * FROM asistencias WHERE trabajadores.codigo = asistencias.codigotrabajador )

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas