Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Contar filas de un DBGrid y comparar un campo especifico (https://www.clubdelphi.com/foros/showthread.php?t=67028)

sisne 24-03-2010 21:38:23

Contar filas de un DBGrid y comparar un campo especifico
 
Hola!
Pueden darme alguna solucion?.
Una vez que tengo llena de datos en el DBGrid2 de datos de la TTablaMaterias, donde estan los campos de IdM, CodigoMateria,NombreMateria, "Calificacion", etc.... Donde en calificacion puede aparecer la informacion de: Aprobado, Reprobado o Ninguno. Y en IdM solo es contador.
Ahora lo que quiero es, contar, cuantas Aprobados , Reprobados y SinNota existen de las materias que se programaron, que esta informacion se encuentra en el DBGrid2?
Intente realizar este codigo:
Código:

    For i:=1 to Tacademico['IdM'] do
      begin
        Kon:=Kon+1;
          if Facademico.Tmateria['CalificacionM']='Aprobado'then A:=A+1
          else
            begin
              if Facademico.Tmateria['CalificacionM']='Reprobado'then R:=R+1
              else N:=N+1;
            end;
      end;

Donde Kon es la variable para saber cuantas materias se programaron, y estan guardadas en el DBGrid2.

Pero con este codigo solo me da como resultado...por decir en el DBGrid2 de Materias tengo 4 materias programas y seleccionado toda la fila "3"
Donde :
IdM "1" Calificacion "Aprobado"
IdM "2" Calificacion "Aprobado"
IdM "3" Calificacion "Reprobado"
IdM "4" Calificacion "SinNota"

Y cuando ejecuto la sentencia pues me da como resultado TtotalProgramadas=3, Aprobadas=0, Reprobadas=3 y SinNota=0.
Cuando deberia dar de resultado: TtotalProgramadas=4, Aprobadas=2, Reprobadas=1 y SinNota=1.

Y por decir esta seleccionado en el DBGrid2 la fila 2.
Y cuando ejecuto la sentencia pues me da como resultado TtotalProgramadas=2, Aprobadas=2, Reprobadas=0 y SinNota=0.

Como te daras cuenta, pues solo cuenta en el mismo lugar nada mas...
Como seria el codigo para contar y comparar cada campo?
Gracias!

ecfisa 25-03-2010 01:44:19

Hola sisne.

Una idea simple, recorrer la tabla y evaluar lo que deses.
Código a modo de ejemplo:
Código:

  Total:= 0; Aprobados:= 0; Reprobados:= 0; SinNota:= 0;
  while not Tabla.Eof do
  begin
    case Tabla.Calificacion of
        '1','2' : Inc(Aprobados);
            '3' : Inc(Reprobados);
            '4' : Inc(SinNota);
    end;
    Inc(Total);  // Perdón sisne, me olvidé esta línea !!!
    Tabla.Next;
  end;

Y tendrás los valores buscados en las variables: Total, Aprobados, Reprobados y SinNota.

Saludos.

roman 25-03-2010 02:32:32

En el ciclo que pones, sisne, realmente no estás recorriendo los registros (fíjate que el contador del ciclo, i, no interviene para nada) y siempre tomas el mismo valor. Como lo hace eficsa es correcto.

Por otra parte, creo más conveniente usar una consulta SQL especial para el conteo:

Código SQL [-]
select calificacion, count(calificacion)
from materias
group by calificacion

De esta manera, no tienes que hacer un ciclo pues la consulta te trae todos los resultados de una sentada.

// Saludos

ecfisa 25-03-2010 22:26:55

Si roman, toda la razón, es mucho más eficiente con la consulta.
Pero eran las 2:30 de la mañana y tenia pocas luces...;) .
Como verás, también cometí un error: Me olvidé de incrementar Total y se le iba a poner difícil promediar sin esa línea...:D

Saludos.

sisne 25-03-2010 22:38:27

Hola!
Les cuento que solucioné ese detalle.
ecfisa, segui tu ayuda y coloqué este código:
Código:

    TMateria.First;
    while not TMateria.Eof do
      begin
        Kon:=Kon+1;
        If Facademico.TmateriaCalificacionM.Text='Aprobado' then inc(A);
        If Facademico.TmateriaCalificacionM.Text='Reprobado' then inc(R);
        If Facademico.TmateriaCalificacionM.Text='Ninguno' then inc(N);
        TMateria.Next;
      end;

El bendito Next me faltaba....Gracias ecfisa.
Roman, si fuese el caso de usar sql como seria su implementacion en delphi? usando un query en sql colocaria ese codigo? y para llamar como tendria que hacerlo? por favor pautas..para no hacer un ciclo como dices.
Gracias Roman.

ecfisa 26-03-2010 01:19:38

De nada sisne, un gusto haber servido de algo.

Caro 26-03-2010 03:16:35

Cita:

Empezado por sisne (Mensaje 358356)
Hola!
Roman, si fuese el caso de usar sql como seria su implementacion en delphi? usando un query en sql colocaria ese codigo? y para llamar como tendria que hacerlo? por favor pautas..para no hacer un ciclo como dices.
Gracias Roman.

Hola sisne, debes utilizar un query para ejecutar la consulta.

Código Delphi [-]
var
 ind : Integer;
begin
  Query.Close;
  Query.Sql.Text := 'select calificacion, count(calificacion) As Cant from materias '+
                           'group by calificacion order by calificacion';
  Query.Open;
  
  ind :=0;
  Query.First;
  While Not Query.Eof do
   begin
    Inc(ind);
    Case ind of
     1: A := Query.FieldByName('Cant').AsInteger;
     2: R := Query.FieldByName('Cant').AsInteger;
     3: N := Query.FieldByName('Cant').AsInteger;
    end;         
    Query.Next 
   end;
  Total := A+R+N;

Saluditos

sisne 26-03-2010 06:35:45

Hola!
Caro gracias por el código, tengo aun dudas (soy una aprendiz) quisiera aprender sobre los Querys en los Form en Delphi (mas ayuda por favor).
La pregunta es el iconito o boton "Query" lo coloco en el form o DataModule (da igual) Osea que debo colocar ese iconito y en sus propiedades de este Query (SQL|(TStrings)) coloco también el codigo de color naranja que me dejaste?:
Código:

select calificacion, count(calificacion) As Cant
from materias
group by calificacion order by calificacion

O tan solo colooco una simple seleccion
Código:

Select *
From materias

Por que hice como me dijiste y coloque el 1er codigo q menciono aqui arribita y no me sale el resultado.... (Select calificacion, count(calificacion)......)
Help, como deberia hacerlo? Por que lo demás si lo coloque y solo me sale un solo resultado repetido para varias personas.
Graaacias

Caro 26-03-2010 13:31:36

Cita:

Empezado por sisne (Mensaje 358421)
La pregunta es el iconito o boton "Query" lo coloco en el form o DataModule (da igual) Osea que debo colocar ese iconito y en sus propiedades de este Query (SQL|(TStrings)) coloco también el codigo de color naranja que me dejaste?:

Hola de nuevo sisne, el Query es un componente de base de datos en este caso de BDE, puedes colocarlo en el form o DataModule, pero mejor que lo hagas en el segundo. Si ejecutas la consulta en diseño como lo estas haciendo, colocas en su propiedad "Sql" la consulta, ademas de colocar la propiedad "Active" a True. Para ver en dideño el resultado, puedes también colocar un DBGrid, un DataSource y los enlazas.

El ejemplo que te puse ejecuta la consulta en tiempo de ejecución.

Cita:

Empezado por sisne (Mensaje 358421)
Código:

select calificacion, count(calificacion) As Cant
from materias
group by calificacion order by calificacion

O tan solo colooco una simple seleccion
Código:

Select *
From materias


Debes colocar la primera consulta, porque la segunda solo te va a devolver todos los registros de tu tabla materias.

Cita:

Empezado por sisne (Mensaje 358421)
Por que hice como me dijiste y coloque el 1er codigo q menciono aqui arribita y no me sale el resultado.... (Select calificacion, count(calificacion)......)
Help, como deberia hacerlo? Por que lo demás si lo coloque y solo me sale un solo resultado repetido para varias personas.

No entiendo eso de que te sale un mismo resultado para varias personas, porque la consulta debería devolverte solo 3 registros, según el ejemplo que nos indicado:

Aprobados xx
Reprobados xx
SinhNota xx

donde xx es la cantidad.

Para poder ayudarte mejor escribe aquí el resultado que te sale al ejecutar la consulta.

Saluditos

sisne 26-03-2010 17:29:53

Hola!
Como me dijeron mas antes coloqué y me sale el resultado. Solo que queria saber algo mas de sql en la programacion de delphi en su codigo y en sus propiedades del query de sql|strings. Es decir en ambos lugares se debe colocar el mismo codigo? este codigo en las propiedades del query (SQL|STRINGS):
Código:

Select calificacion, count(calificacion) As Cant
from materias
group by calificacion order by calificacion

y lo demas como lo dejaste el codigo de naranja.
Pregunto:
Código:

Query.Close;
  Query.Sql.Text := 'select calificacion, count(calificacion) As Cant from materias '+
                          'group by calificacion order by calificacion';
  Query.Open;

En Query.close<--- se esta cerrando la consulta
En Query.open<---abriendo la consulta.
Query.Sql.Text<---esta haciendo la consulta???
Query.Sql.add<--vi en algunos q colocan eso tb...

Gracias!

ecfisa 26-03-2010 17:56:45

Hola sisne.

No veo diferencia entre hacer:

Query.Clear;
Query.Add('...');

o:
Query.Text:='...'

Sólo que Query.Add te permite añadir sentencias a una consulta.

Pero eso desde mi pobre manejo de SQL...

Saludos.

Caro 26-03-2010 20:06:47

Cita:

Empezado por sisne (Mensaje 358503)
Hola!
Como me dijeron mas antes coloqué y me sale el resultado. Solo que queria saber algo mas de sql en la programacion de delphi en su codigo y en sus propiedades del query de sql|strings. Es decir en ambos lugares se debe colocar el mismo codigo? este codigo en las propiedades del query (SQL|STRINGS):

Hola de nuevo sisne, cualquier consulta sql que hagas, debes colocarlo en la propiedad Sql, si quieres lo haces en diseño o en ejecución, pero ya sea en diseño o ejecución es lo mismo.

Cita:

Empezado por sisne (Mensaje 358503)
Pregunto:
Código:

Query.Close;
  Query.Sql.Text := 'select calificacion, count(calificacion) As Cant from materias '+
                          'group by calificacion order by calificacion';
  Query.Open;

En Query.close<--- se esta cerrando la consulta
En Query.open<---abriendo la consulta.
Query.Sql.Text<---esta haciendo la consulta???
Query.Sql.add<--vi en algunos q colocan eso tb...

Siempre que ejecutes una consulta van a ser los mismos pasos:

Query.Close; -> Cierra el Query
Query.Sql.Text o Query.Sql.Add -> Asignas la consulta sql que quieras
Query.Open -> Ejecuta la consulta que tienes en la propiedad Sql.

Y como te ha explicado ecfisa, si utilizas Query.Sql.Add, debes limpiar antes lo que tenías con Query.Clear.

También puedes ejecutar la consulta con la propiedad Active.

Código Delphi [-]
  Query.Active := False;
  Query.Sql.Text := 'tu consulta';
  Query.Active := True;

Saluditos

sisne 26-03-2010 22:04:19

Holaaaa

Gracias! Ahora si tengo en claro...
Muchas gracias.


La franja horaria es GMT +2. Ahora son las 12:41:58.

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