La operación pes00004 (becas) pareciera que se cuelga

Sé que no se cuelga, pero consume bastante tiempo y resulta bastante molesto que no se actualice el detalle de las becas procesadas (y eso que no son muchos los becados).

La ventana que muestra el avance del proceso se queda en 2% hasta que termina de procesar todo y se cierra.

Pero NO es una queja :smiley:
Solo comentar lo que se me ocurrió y averiguar que piensan…

Recuerdo en VB6 (hayá lejos en el '96) existía la sentencia DoEvents, e intuyo que en PowerBuilder debe haber algo similar.

Aclaro que no soy un experto PB así que les dejo la idea y ya me dirán si se puede hacer algo.

De cualquier manera, buscando en la web hacen referencia a un método de PB llamado Yield() aunque me da la sensación que en PB 7 no existe.
Así que seguí buscando y se podría reemplazar el DoEvents de VB6 por una llamada a la API de Windows. Aquí les dejo un link a una web en que hay un ejemplo aunque el código no es Action Script supongo que de referencia puede ser útil: http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_11199516.html

Diego:

Quizás sería mejor revisar porque te pasa eso a vos, si no son muchos los becados y por lo tanto el archivo .txt de entrada no es muy grande.

En mi caso el proceso fue casi instantaneo. El archivo .txt tendría unos 30 registros y en la base tenemos 15.000 registros en la tabla de personas y 20.000 en la tabla de alumnos.

Saludos

Gustavo

Diego, solo es una cuestion de como ir mostrando el avance del procesamiento.
Adjunto la ventana a donde le agregué el porcentaje de avance en el procesamiento.

Por lo que entiendo la funcion yield() es para poder parar un proceso por cierto tiempo.

Igualmente, si el proceso te tarda significativamente mucho tiempo, fijate de actualizar las estadisticas de los datos de las tablas y volver a procesar.

Probala y avisa si mejoró en algo la visualización. Respecto de la info que genera es la misma, eso no fue modificado.
Saludos.


w_informacion_academica_becas.rar (11.4 KB)

A nosotros nos pasaba lo mismo y pude reducir los tiempos de una hora y media a cinco minutos con el siguiente cambio en la ventana w_informacion_academica_becas:

en la funcion wf_cantidad_materias_aprobadas el cambio esta marcado con " //cambia porque tarda demasiado" pero te mando todas las líneas para que no te pierdas:

Long ll_cant_mat_aprobadas_out_cc, ll_cant_mat_aprobadas_2013_out_cc

ll_cant_mat_aprobadas_out_cc = 0
ll_cant_mat_aprobadas_2013_out_cc = 0
ll_cant_mat_aprobadas_out = 0
ll_cant_mat_aprobadas_2013_out = 0

// Recupero cantidad de materias aprobadas por el alumno
// Materias de la version actual del plan del alumno
SELECT COUNT(*), SUM(CASE year(v.fecha) WHEN :ll_anio THEN 1 ELSE 0 END)
INTO :ll_cant_mat_aprobadas_out, :ll_cant_mat_aprobadas_2013_out
FROM sga_alumnos as a,
sga_planes as p,
sga_atrib_mat_plan as atmp,
vw_hist_academica as v
WHERE a.unidad_academica = :ua
AND a.carrera = :carrera
AND a.legajo = :legajo
AND p.unidad_academica = a.unidad_academica
AND p.carrera = a.carrera
AND p.plan = a.plan

   AND atmp.unidad_academica = a.unidad_academica
	AND atmp.carrera = p.carrera
   AND atmp.plan    = p.plan
	AND atmp.version = p.version_actual
	 
   AND v.unidad_academica = a.unidad_academica
	AND v.carrera = a.carrera
	AND v.legajo = a.legajo
	AND v.materia = atmp.materia
	AND resultado = 'A' 
USING SQLCA;

IF NOT ISNULL(ls_carrera_cc) THEN
// Cuento materias del ciclo comun que no esten contadas por la carrera de grado…
SELECT COUNT(*), SUM(CASE year(vw.fecha) WHEN :ll_anio THEN 1 ELSE 0 END)
INTO :ll_cant_mat_aprobadas_out_cc, :ll_cant_mat_aprobadas_2013_out_cc
FROM sga_alumnos as a,
sga_alumnos as b,
sga_planes as p,
sga_atrib_mat_plan as atmp,
vw_hist_academica as vw
WHERE a.unidad_academica = :ua
AND a.carrera = :carrera
AND a.legajo = :legajo

		//cambia porque tarda demasiado
	   AND b.unidad_academica = a.unidad_academica
		AND b.carrera          = :ls_carrera_cc
	   AND b.legajo = a.legajo

      AND p.unidad_academica = b.unidad_academica
	   AND p.carrera = b.carrera
	   AND p.plan    = b.plan

	   AND atmp.unidad_academica = p.unidad_academica
	   AND atmp.carrera = p.carrera
      AND atmp.plan    = p.plan
	   AND atmp.version = p.version_actual
		
		AND vw.unidad_academica = b.unidad_academica
		AND vw.carrera          = b.carrera
		AND vw.legajo           = b.legajo
		AND vw.materia          = atmp.materia
		AND vw.resultado = 'A' 
		AND vw.materia NOT IN (SELECT vw2.materia
										  FROM sga_alumnos as c,
                                     sga_planes as p,
                          			 sga_atrib_mat_plan as atmp,
                           	       vw_hist_academica as vw2
										 WHERE c.unidad_academica = :ua
											AND c.carrera = :carrera
											AND c.legajo = :legajo

											AND p.unidad_academica = c.unidad_academica
											AND p.carrera = c.carrera
											AND p.plan    = c.plan
									
											AND atmp.unidad_academica = p.unidad_academica
											AND atmp.carrera = p.carrera
											AND atmp.plan    = p.plan
											AND atmp.version = p.version_actual

										   AND vw2.unidad_academica = c.unidad_academica
											AND vw2.carrera = c.carrera
											AND vw2.legajo  = c.legajo
											AND vw2.materia = atmp.materia
											AND vw2.resultado = 'A')
	USING SQLCA;

END IF

IF SQLCA.SQLCode = -1 THEN Return FALSE

// Sumo las materias del ciclo basico
ll_cant_mat_aprobadas_out += ll_cant_mat_aprobadas_out_cc
ll_cant_mat_aprobadas_2013_out += ll_cant_mat_aprobadas_2013_out_cc

if isNull(ll_cant_mat_aprobadas_out) THEN ll_cant_mat_aprobadas_out = 0
if isNull(ll_cant_mat_aprobadas_2013_out) THEN ll_cant_mat_aprobadas_2013_out = 0

Return TRUE

Paula, veo que cambiaste (linea 54):

 		      
           AND b.unidad_academica = a.unidad_academica
	   AND b.nro_inscripcion  = a.nro_inscripcion
	   AND b.carrera          = :ls_carrera_cc

Por:

         
        //cambia porque tarda demasiado
         AND b.unidad_academica = a.unidad_academica
         AND b.carrera          = :ls_carrera_cc
         AND b.legajo = a.legajo

La idea es buscar en la tabla de alumnos la otra carrera donde este esa misma persona pero en la carrera de Ciclo Comun.
Es por ello que se busca por nro de inscripcion y no por legajo.
Este cambio funciona solo si para cada persona definen el mismo nro de legajo en todas las carreras en las que este ese alumno.

No entiendo el porque este tardando esa consulta ya que a la tabla “sga_alumnos as b”, se accede por indice “unidad_academica + nro_inscripcion” y alli busca el registro que contenga la carrera ciclo basico “ls_carrera_cc”
Tal vez no tengan creado ese indice por estos dos campos? Deberia estar creado automáticamente por la foreign key con la tabla de personas (sga_personas)

Podes hacer un sql explain y ver si entra o no por indice?

Estimados, una vez que se ejecuta la operacion además de mostrar los resultados por pantalla genera algun archivo .txt??? porque yo lei que con esta operacion se generan unos archivos que luego hay que enviar, esto es asi? Gracias

Se generan 3 archivos txt pero SOLO si no ocurrió ningún error grave…

Entiendo que el único error aceptado es que no encuentre al alumno, cualquier otro error creo evita que se realice la exportación.

Esos archivos los genera en C: por defecto?

Si, pero tenes la opción de elegir el lugar en donde queres que se generen.

Perdón, se me fué el hilo original del mensaje… retomando:

Cuando dije que son pocos becados, son pocos, en relación con la cantidad total de alumnos… 4748 registros de becas contra 43728 alumnos regulares.

Alejandro ya descargué la modificación que publicaste, lo pruebo (con tiempo) y después cuento.
PD: ¿Ese cambio viene en alguna nueva versión? Si sí, espero pacientemente…

No va en ninguna version.
La versión de la ventana que esta publicada hace lo mismo en cuanto a los calculos e info que genera, pero no visualiza el % de avance del proceso y el alumno que esta procesando.

Ale:

Si es una mejora piola estaría bueno que se incorpore aunque sea como un parche.

Saludos

Gustavo