Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-03-2010
Avatar de sisne
sisne sisne is offline
Miembro
 
Registrado: mar 2010
Posts: 71
Poder: 15
sisne Va por buen camino
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!
Responder Con Cita
  #2  
Antiguo 25-03-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 25-03-2010 a las 23:20:10.
Responder Con Cita
  #3  
Antiguo 25-03-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 25-03-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 25-03-2010
Avatar de sisne
sisne sisne is offline
Miembro
 
Registrado: mar 2010
Posts: 71
Poder: 15
sisne Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 26-03-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
De nada sisne, un gusto haber servido de algo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 26-03-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por sisne Ver Mensaje
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.

Última edición por Caro fecha: 26-03-2010 a las 04:20:27.
Responder Con Cita
  #8  
Antiguo 26-03-2010
Avatar de sisne
sisne sisne is offline
Miembro
 
Registrado: mar 2010
Posts: 71
Poder: 15
sisne Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 26-03-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por sisne Ver Mensaje
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 Ver Mensaje
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 Ver Mensaje
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #10  
Antiguo 26-03-2010
Avatar de sisne
sisne sisne is offline
Miembro
 
Registrado: mar 2010
Posts: 71
Poder: 15
sisne Va por buen camino
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!
Responder Con Cita
  #11  
Antiguo 26-03-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #12  
Antiguo 26-03-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por sisne Ver Mensaje
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 Ver Mensaje
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #13  
Antiguo 26-03-2010
Avatar de sisne
sisne sisne is offline
Miembro
 
Registrado: mar 2010
Posts: 71
Poder: 15
sisne Va por buen camino
Holaaaa

Gracias! Ahora si tengo en claro...
Muchas gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
mover indicador de un dbgrid a un registro especifico thelibmx Conexión con bases de datos 7 09-11-2007 19:52:51
¿Cómo comparar varios vectores (de filas en Excel)? Nanaky Varios 1 29-08-2007 18:24:15
Como enumerar filas de un DBGrid sin agregar otro campo Velia Varios 2 06-12-2005 09:58:57
Contar filas de un DBGrid santi Varios 5 08-11-2005 21:22:29
Eliminar vision de filas en DBGrid x un campo Sayuri Conexión con bases de datos 6 10-08-2005 13:21:06


La franja horaria es GMT +2. Ahora son las 07:02:53.


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
Copyright 1996-2007 Club Delphi