Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Que me falta. Ordenar informaciòn (https://www.clubdelphi.com/foros/showthread.php?t=33392)

maravert 05-07-2006 19:21:38

Que me falta. Ordenar informaciòn
 
Hola a todos, mi duda es la siguiente:


Tengo una tabla en Pardox 7 y delphi 7 que se llama datos.db, en ella tengo estos campos (docente : string; apoyo, puntualidad, trato ... : integer) donde los aluknos califican al maestro.

Lo que deseo hacer es obtener la calificaciòn promedio de cada uno de los maestros, en promedio cada maestro tendrá 400 registros, lo que deseo es sumar todas las calificaciones por cada maestro en puntualidad, apoyo, trato, etc, y obtener la calificaciòn promedio general. Luego presentar esta informaciòn en un reporte de mayor a menor.

Pero al procesar los registros mediante una consulta el proceso se queda en un bucle y al parecer no encuentra el fin de registros (EOF)




Estoy ordenando una tabla (datos.db) por docente mediante una consulta y paso los resultados a otra tabla (pordocente.db), me pasa los resultados correctamente pero no sale del ciclo al llegar a EOF.

la tabla la ordeno de la siguiente manera


Código SQL [-]
query1.Close;
Query1.SQL.Text:= 'SELECT * FROM datos order by docente';
 query1.Open;
query1.First;




Cuando quiero procesar la tabla no se sale del segundo while, es decir no llega a esta instrucciòn


Código Delphi [-]
showmessage ('leei todos los archivos');




El codigo es el siguiente:


Código Delphi [-]
procedure TForm2.Grficas1Click(Sender: TObject);
var
anterior : string;
reg, Tdomi, Thabi, Tform, Tpunt, Tpres, TApoy, Ttrat, prom : real;
aperiodo, adocente, aasignatura, asemestre, agrupo: string;
afecha : Tdatetime;
registros, totales, a : integer;
begin
table2.Open;
while not table2.Eof do
   begin
   table2.Delete;
   end;
totales := 0;
a := 1;
query1.Close;
Query1.SQL.Text:= 'SELECT * FROM datos order by docente';
  //   Se guardan los campos a variables
query1.Open;
query1.First;
registros := query1.RecNo;
reg := 0;
totales := 0;
while not query1.Eof do
    begin
      anterior := query1.fieldbyname ('docente').AsString;
      aperiodo    := query1.fieldbyname ('periodo').AsString;
      aasignatura := query1.fieldbyname ('asignatura').AsString;
      asemestre   := query1.fieldbyname ('semestre').AsString;
      agrupo      := query1.fieldbyname ('grupo').AsString;
      afecha      := query1.fieldbyname ('fecha').AsDateTime;
      while anterior = query1.fieldbyname ('docente').AsString do
            begin
             reg :=  reg + 1;
             totales := totales + 1;
             Tdomi := Tdomi + query1.fieldbyname ('dominio').Asinteger;
             Thabi := Thabi + query1.fieldbyname ('habilidad').Asinteger;
             Tform := Tform + query1.fieldbyname ('evaluar').Asinteger;
             Tpunt := Tpunt + query1.fieldbyname ('puntualidad').Asinteger;
             Tpres := Tpres + query1.fieldbyname ('presentacion').Asinteger;
             Tapoy := Tapoy + query1.fieldbyname ('apoyo').Asinteger;
             Ttrat := Ttrat + query1.fieldbyname ('trato').Asinteger;
 
             query1.Next;
 
    end;
    Showmessage ('?sali del while');
    table2.Append;
    table2.FieldByName('periodo').Asstring := aperiodo;
    table2.FieldByName('docente').Asstring := anterior;
    table2.FieldByName('asignatura').Asstring := aasignatura;
    table2.FieldByName('semestre').Asstring := asemestre;
    table2.FieldByName('grupo').Asstring := agrupo;
    table2.FieldByName('fecha').AsDateTime := afecha;
    table2.FieldByName('dominio').AsFloat := Tdomi / reg;
    table2.FieldByName('habilidad').AsFloat := Thabi / reg;
    table2.FieldByName('evaluar').AsFloat := Tform / reg;
    table2.FieldByName('puntualidad').AsFloat := Tpunt / reg;
    table2.FieldByName('presentacion').AsFloat := Tpres / reg;
    table2.FieldByName('apoyo').AsFloat := Tapoy / reg;
    table2.FieldByName('trato').AsFloat := Ttrat / reg;
    prom :=  (  ( Tdomi / reg) +  (Thabi / reg) + (Tform / reg) + (Tpunt / reg) + (Tpres / reg) +  (Tapoy / reg)+ (Ttrat / reg)) / 7;
    table2.FieldByName('promedio').AsFloat := prom;
    table2.Post;
    reg := 0;
    Tdomi := 0; Thabi := 0; Tform := 0; Tpunt := 0; Tpres := 0; Tapoy := 0; Ttrat := 0;
end;
 showmessage ('leei todos los archivos');
 
close;
end;


Podrìa alguin decirme que estoy haciendo mal.

Gracias a todos

marcoszorrilla 05-07-2006 20:06:16

Así a ojo, creo que con un simple SQL lo resolverías:

Código SQL [-]
Select Docente, Avg(Apoyo), Avg(Trato), Avg(puntualidad)
From MiTabla
Group By Docente



Un Saludo.

fra3910 05-07-2006 20:11:34

El problema está aqui
Código Delphi [-]
 
while anterior = query1.fieldbyname ('docente').AsString do
            begin
             reg :=  reg + 1;
             totales := totales + 1;
             Tdomi := Tdomi + query1.fieldbyname ('dominio').Asinteger;
             Thabi := Thabi + query1.fieldbyname ('habilidad').Asinteger;
             Tform := Tform + query1.fieldbyname ('evaluar').Asinteger;
             Tpunt := Tpunt + query1.fieldbyname ('puntualidad').Asinteger;
             Tpres := Tpres + query1.fieldbyname ('presentacion').Asinteger;
             Tapoy := Tapoy + query1.fieldbyname ('apoyo').Asinteger;
             Ttrat := Ttrat + query1.fieldbyname ('trato').Asinteger;
 
             query1.Next;
 
    end;
Este bucle nunca se sale, porque aunque tienes puesto el query1.Next, la condición para el último registro puede hacer que se quede embuclado. Es decir, para el último registro, el next dara EOF pero no se sale del bucle, y en ese caso siempre es anterior = query1.fieldbyname ('docente').AsString

Te valdría con cambiar el while a algo asi

WHILE (anterior = query1.fieldbyname ('docente').AsString) OR (NOT query1.EOF) do
...

Asi se sale del bucle cuando llegue al final de la tabla

Espero haberte ayudado

Saludos

maravert 05-07-2006 20:28:40

Gracias
 
Gracias a todos por su respuesta, voy a probar lo que me han echo saber.

Muy agradecido, Muy agradecido, Muy agradecido

Maravert


La franja horaria es GMT +2. Ahora son las 13:06:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi