Tenemos un problema en el calculo del promedio de algunos alumnos en los Certificados.
Al descubrir que el calculo del promedio no estaba bien en algunos alumnos, empezamos a revisar como se calcula y encontramos lo siguiente:
Encontramos que el sp_prom_alu_resul al calcular el promedio, compara que la nota de la Escala de notas sea igual a la nota del alumno y ahí nos dimos cuenta que en algún momento se cambio el valor de las notas en la escala.
Por ejemplo: paso de 7 a 7.00. Entonces ahora los alumnos que rindieron con esa escala tienen una nota diferente a la actual y el SP no incluye esas notas en el calculo del promedio.
La pregunta es como solucionar esto?
Se puede solucionar por medio del sistema? (Seria la mejor opción para no tocar ni datos ni el SP)
Debido a que el SP esta funcionando bien para el resto de los alumnos y la idea es no modificarlo, salvo que no quede otra opción. O sino cambiar los datos, pero tampoco se que debería cambiar.
Espero puedan ayudarnos porque ya se acerca la epoca donde mas Certificados se piden y no podemos entregarlos con un calculo de promedio erróneo.
Como fue que pudieron cambiar las notas de la escala si ya había sido usada? Por el sistema no lo pueden haber hecho. O usaron 2 escalas de notas distintas en distintos momentos del tiempo?
Cuando te referís a que se cambió el valor de la nota, te referís al valor numérico? O te referís al código de la nota, que es calve en la escala de notas? Si es el valor numérico, es exactamente lo mismo 7 que 7.00, de hecho lo que se guarda es un número que siempre se guarda con decimales. Si es el código de nota, estamos en lo que te preguntaba, que es como lo modificaron.
Si lo modificaron por SQL o bien lo modificaron de alguna manera “non sancta” ya que el sistema no te permite modificarlo una vez que ha sido utilizada en actas, mesas o comisiones, lo que debne hacer es hacer consistentes los datos, para lo cual deberán modificar por SQL todos los datos cambiando el 7 por 7.00
Si son 2 escalas distintas (una vieja y otra la actual) lo único que importa es que las 2 escalas tengan el mismo valor numérico en la nota y que las notas que figuren como 7 tengan en su acta o comisión el código de la escala que tiene el 7 como nota en el detalle de la escala.
Espero se entienda. En conclusión, parece que hay datos alli que no son consistentes y eso no se pudo ingresar por el sistema ni se puede arreglar por sistema, hay que arreglar los datos por SQL.
Sí, se entiende. Lo que creo es que se cambio la nota numérica.
Te paso unas impresiones de pantalla para que veas lo que pasa.
En acta.png te muestro como fue cargada el acta de promoción y te marco uno de los alumnos con su nota 8
En Cert-Materias Aprobadas.png es un fragmento del Certificado de Materias Aprobadas del mismo alumno, donde esta la materia del acta anterior y se muestra sin nota; y también marque otras materias que usan la misma escala de notas pero con notas con decimales. Estas materias con la misma escala pero con decimales fueron hechas luego del cambio en la escala, por eso se muestran bien.
A continuación te paso un fragmento del sp_prom_alu_resul donde se calcula el promedio.
Te marco en negrita donde esta comparando la nota de la escala de notas y la nota del alumno (que fue cargada en una tabla temporal). Antes de calcular el promedio.
Para mi esta filtrando ahí la nota, por eso no se muestra ni se calcula.
– Retornar las sumas de las notas y la cantidad de examenes.
LET nSumExam = 0;
LET nCantExam = 0;
– ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
– Retornar las sumas de las notas y la can
tidad de examenes.
– ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT SUM(sga_det_escala.valor_numerico), COUNT(sga_det_escala.nota)
INTO nSumExam, nCantExam
FROM temp_histacadprom, sga_det_escala
WHERE sga_det_
escala.escala_notas = temp_histacadprom.escala_notas
AND (temp_histacadprom.resultado= pTodas OR pTodas = ‘S’) AND sga_det_escala.nota = temp_histacadprom.nota
AND temp_histacadprom.nota IS NOT NULL
AND sga_det_
escala.valor_numerico IS NOT NULL;
–=========================================================================================================================================================
– calculo el promedio
IF nCantExam > 0 THEN
LET nPromedio = nSumExam/nCantExam;
END IF ;
Es medio difícil entender exactamente la situación sin ver los datos, pero se me hace que hay inconsistencias en los datos, ya que si bien es cierto que el SP del cálculo del promedio hace un join de las tablas por el valor (código) de la nota, no es la única condición del join. También usa el código de escala, de tal manera que si cada nota es consistente con la nota correspondiente en la escala usada en el momento que se usó para calificar, y además las 2 escalas tienen el mismo valor numérico para los códigos con decimales y sin decimales, no debería afectar y no debería haber problemas.
Lo pongo con un ejemplo. Si tuvieron 2 escalas distintas,
Escala 1
Nota Descripción Valor numérico
7 Siete 7.0000000
8 Ocho 8.0000000
Escala 2
Nota Descripción Valor numérico
7.00 Siete 7.0000000
8.00 Ocho 8.0000000
Y en el acta tenés
Acta Escala Nota Resultado
A81 1 7 A
B85 2 7.00 A
Para calcular el promedio solo usa el valor numérico que corresponde a la nota
El problema lo tendrías si las actas están de la siguiente manera:
Acta Escala Nota Resultado
A81 2 7 A
B85 2 7.00 A
Ya que en la primera materia va a buscar la nota 7 en una escala donde solo tiene la nota 7.00, y eso es una inconsistencia de datos.
En el SP tenés que mirar también lo que yo te marco:
SELECT SUM(sga_det_escala.valor_numerico), COUNT(sga_det_escala.nota)
INTO nSumExam, nCantExam
FROM temp_histacadprom, sga_det_escala
WHERE sga_det_escala.escala_notas = temp_histacadprom.escala_notas
AND (temp_histacadprom.resultado= pTodas OR pTodas = ‘S’) AND sga_det_escala.nota = temp_histacadprom.nota
AND temp_histacadprom.nota IS NOT NULL
AND sga_det_
escala.valor_numerico IS NOT NULL;
Cualquier cosa, si necesitás una mano me avisas, coordinamos y me doy una vuelta para resolverlo.
Si vi que también compara con el código de la escala, y el código de la escala es la 3 que es la misma para ambas materias que señalo en la imagen Cert-Materias Aprobadas.png, por eso digo que al comparar con el valor no me toma la nota, porque es distinta.
Lo que estoy tratando de explicar es exactamente el caso que vos planteas.
[b]"Para calcular el promedio solo usa el valor numérico que corresponde a la nota
El problema lo tendrías si las actas están de la siguiente manera:
Acta Escala Nota Resultado
A81 2 7 A
B85 2 7.00 A
Ya que en la primera materia va a buscar la nota 7 en una escala donde solo tiene la nota 7.00, y eso es una inconsistencia de datos."
[/b]
Ese es el caso que marque en la imagen Cert-Materias Aprobadas.png, cuando el SP hace la comparación, la escala es 3, pero encuentra que las notas son distintas.
Te adjunto (detalle_escala.png) que es el query a la tabla sga_det_escala para que veas los datos de la escala 3. Ahora esta con decimales.
Te adjunto (det_acta_promo.png) que es el query de la tabla sga_det_acta_promo donde muestro el acta y te marco al alumno y la nota es sin decimales, que es lo que te mostré en la imagen acta.png
Si necesitas alguna otra información avisame.
El valor numérico lo usa para sumar SUM(sga_det_escala.valor_numerico) pero en la condición usa la nota AND sga_det_escala.nota = temp_histacadprom.nota como no coinciden, no la promedia.
Es como te digo, han “cocinado” los datos y lo hicieron en forma inconsistente. Usando normalmente el sistema es imposible llegar a esa situación. Se ve que luego de haber usado un tiempo la escala sin decimales y haber generado actas y notas, decidieron “cambiar” la escala pero sin usar una escala nueva y le han agregado registros y cambiado el valor a otros para “adaptarla” a la nueva necesidad, para lo cual debieron bajar triggers o hacer alguna cosa rara, el sistema no permite hacer esos cambios.
No se puede modificar una escala una vez que se usó en algún acta. Lo que debieron haber hecho es generar una escala nueva, diferente, con todas las notas con decimales y dejar la escala anterior para las actas que ya estaban generadas.
Ahora tienen que solucionarlo arreglando datos, para lo cual hay varias maneras:
Cambiar por SQL todas las notas sin decimales de esas actas y ponerlas con .00
Agregarle por SQL las notas sin decimales a la escala, y tendrás 2 notas siete, 7 a secas y 7.00
Arreglar todo como debió haber sido, una escala para las notas sin decimales (escala anterior) y otra para las notas con decimales. Arreglar en las actas la escala que corresponde según el tipo de notas que tenga.
Podés elegir la que más te parezca, pero los datos deben quedar consistentes. Personalmente me gusta la última, pero es la más laboriosa de todas.
Saludos
Gustavo
PD: sería importante saber que pasó, no para encontrar culpables pero si para que no vuelva a suceder.
Me imagine que alguna de todas esas cosas tenia que hacer.
Supongo que habremos cambiado la escala por SQL, la verdad que no se como fue en realidad porque fue en el 2010.
No debería existir una nota en un acta de examen o promocion que no se corresponda con la escala de notas del acta. Esto se controla al cerrar cada acta. Por lo que si existe este caso es porque lo modificaron notas accediendo a la base por fuera del sistema.
Fijate de correr estas dos consultas y ver que alumnos son los que tienen notas que no se corresponden con la escala de notas del acta.
Actas de Promoción:
SELECT * FROM sga_det_acta_promo as a, sga_actas_promo as p
WHERE a.nota IS NOT NULL
AND a.unidad_academica = p.unidad_academica
AND a.acta = p.acta
AND NOT EXISTS (SELECT 1 FROM sga_det_escala as d WHERE p.escala_notas = p.escala_notas AND d.nota = a.nota)
Actas de Examen:
SELECT * FROM sga_detalle_acta as a, sga_actas_examen as p
WHERE a.nota IS NOT NULL
AND a.unidad_academica = p.unidad_academica
AND a.tipo_acta = p.tipo_acta
AND a.acta = p.acta
AND NOT EXISTS (SELECT 1 FROM sga_det_escala as d WHERE d.escala_notas = p.escala_notas AND d.nota = a.nota)
Lo que hice fue agegar a la escala de notas de promoción las notas sin decimales y ahora quedo bien. Calcula el promedio bien.
Probé las consultas que me pasaste y la de Actas Promocion no trajo resultados pero si trajo la de Actas de Examene.
El query me trajo como resultado 3 registros de una misma acta que tienen notas sin decimales, pero lo peor es que en la misma acta hay otros alumnos con notas con decimales y no me explico como sucedió eso. No es de la misma epoca del problema anterior ni la misma escala.
Puede ser que haya estado algún control bajo para que el sistema deje guardar notas que no pertenecen a la escala?
Te paso una imagen del acta.
Probé emitir un certificado de uno de los alumnos y no trae la nota que no tiene decimales.
Probé hacer una rectificativa pero no funciono.
Tengo que cambiar los datos del acta por SQL?
Es como dice Alejandro, hicieron cosas por fuera del sistema y no es un control bajo. Si pudo ser o estar siendo algún trigger desactivado, ya que esas cosas se controla por código y/o integridad referencial de la base.
El arreglo en estos casos siempre es por SQL. Supongo que así también habrás agregado las notas en la escala de promoción. Si el sistema te permitió agregar las notas por sistema es seguro que aún tenés triggers deshabilitados.
Podés ejecutar la sentencia:
select * from sysobjstate where state != “E”
Eso te devuelve los triggers deshabilitados. En condiciones normales del sistema NUNCA deberías tener un trigger deshabilitado.
No quiero pensar que hayan borrado (dropped) algún trigger.
Ejecute la consulta de los triggers y no devolvió nada.
La verdad es que no estoy buscando el culpable. Jamas haríamos un drop en una base. Lo único que tratamos de hacer es solucionar los problemas que se presentan.
Es evidente que en el 2010 se debe haber cambiado la escala de notas del caso anterior. Durante mucho tiempo se trabajo con muchos controles bajos por falta de conocimiento, eso pudo haber afectado o por ahí se realizo a mano, no recuerdo, en ese caso pude haber sido yo u otro compañero.
Pero en el 2012 tengo un acta donde hay 3 alumnos con un tipo de nota y otros 3 con otro tipo y no se como se generaron.
Nosotros no cambiamos las notas de las actas a mano, salvo que en el foro me lo indiquen, si no hay otra alternativa. Yo no uso el sistema y no se que permite y que no.
Me llaman cuando hay un problema y para personalizar los reportes.
En este caso no se cual es la solucion, si no se puede hacer por sistema, agrego por sql las notas a la escala? cambio las notas?
begin work;
SET CONSTRAINTS ALL DEFERRED;
set triggers for sga_det_escala disabled;
INSERT INTO sga_det_escala VALUES (3, '8', 'ocho 00/100', 'P', 8, 'Distinguido');
INSERT INTO sga_det_escala VALUES (3, '9', 'nueve 00/100', 'P', 9, 'Distinguido');
set triggers for sga_det_escala enabled;
SET CONSTRAINTS ALL IMMEDIATE;
commit work;