Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-12-2014
dany2014 dany2014 is offline
Registrado
NULL
 
Registrado: nov 2014
Posts: 2
Poder: 0
dany2014 Va por buen camino
Contar la cantidad de registros de un dbgrid

Hola foristas, soy nuevo en esto del mundo delphi, y necesitaria hacer una consulta. Tengo un dbgrid con los campos de una tabla alumnos, donde tengo los campos idAlum, Año de curso, Materia, y la Nota, lo que deseo es poder contar la cantidad de registros del dbgrid asociado a esa tabla y poder almacenarlo esa cantidad en un dbedit, que esta en el mismo formulario donde se encuentra el dbgrid, y almacenarlo en otra tabla, ya que ese dbedit esta apuntado a una tabla detalle de alumno, donde se almacenara la cantidad de registros del dbgrid. Desde ya gracias por la informacion que me puedan aportar. Saludos
Responder Con Cita
  #2  
Antiguo 09-12-2014
edgargh edgargh is offline
Miembro
 
Registrado: jun 2006
Ubicación: León, Guanajuato
Posts: 25
Poder: 0
edgargh Va por buen camino
que tal dany2014, bienvenido al foro, si lo que necesitas es obtener el numero de registros de tu dbgrid, lo mas comun es hacerlo directamente a traves del dataset asociado (query o table).

ejemplo:

Cita:
Query1.RecordCount;
o si te parece mejor asi:

Cita:
DBGrid1.DataSource.DataSet.RecordCount;
De cualquiera de las 2 maneras obtienes el numero de registros de tu dbgrid y puedes visualizarlo en un edit en lugar de un dbedit.

Por otro lado, no entiendo para que necesitas guardar ese dato en la base de datos, no le veo sentido, ni en la tabla alumnos, mucho menos en la tabla detalle de alumnos.
Responder Con Cita
  #3  
Antiguo 09-12-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Con query.recordcount no funcionará, solamente devolverá el dato correcto si ha posicionado en el último registro, ejemplo query.last
Responder Con Cita
  #4  
Antiguo 09-12-2014
edgargh edgargh is offline
Miembro
 
Registrado: jun 2006
Ubicación: León, Guanajuato
Posts: 25
Poder: 0
edgargh Va por buen camino
Casimiro, claro que funciona, lo he hecho infinidad de veces y ha funcionado, lo he vuelto a hacer (por aquello de que nadie tiene la verdad absoluta) y hace lo que pregunta dany2014 ("lo que deseo es poder contar la cantidad de registros del dbgrid asociado a esa tabla").
Responder Con Cita
  #5  
Antiguo 09-12-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No

Primero hay que aclarar qué base de datos se está usando. Pero en general, cuando ejecutas un query de consulta, recordcount, no sabe cuántos registros has traído, salvo que vayas al último.
Algunas bases de datos te devuelven la cantidad de registros.
Responder Con Cita
  #6  
Antiguo 09-12-2014
edgargh edgargh is offline
Miembro
 
Registrado: jun 2006
Ubicación: León, Guanajuato
Posts: 25
Poder: 0
edgargh Va por buen camino
¿El funcionamiento de la propiedad recordcount de un TDataset en delphi depende del manejador de base de datos que se utilize?, no lo sabia, yo trabajo con sql server y funciona, ignoraba que con otros no. ¿Con que manejador de base de datos no funciona la propiedad recordcount de un Tdataset?
Responder Con Cita
  #7  
Antiguo 09-12-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
O sea, tú ejecutas un query, por ejemplo:
Código Delphi [-]
q.close;
q.sql.text = 'select codigo, nombre from tbClientes where provincia=28';
q.execquery;
showmessage(q.recordcount,"");
¿Eso muestra los registros que ha traido el query?
Responder Con Cita
  #8  
Antiguo 09-12-2014
edgargh edgargh is offline
Miembro
 
Registrado: jun 2006
Ubicación: León, Guanajuato
Posts: 25
Poder: 0
edgargh Va por buen camino
Casimiro, por el uso de la propiedad execquery de tu ejemplo entiendo que utilizas un TIBSQL que se enfoca especificamente a Interbase, no es la manera estandar de trabajar con datasets en delphi, creo que ese es tu problema. Un TDataset no esta limitado a trabajar con un solo manejador de base de datos como interbase. por ejemplo si trabajas con Tdatasets de ADO o DBExpress, que segun yo son los mas comunes y en los cuales puedes hacer la conexion con una infinidad de manejadores de bases de datos (incluyendo interbase), no tendrias el problema que mencionas
Responder Con Cita
  #9  
Antiguo 09-12-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por edgargh Ver Mensaje
Casimiro, por el uso de la propiedad execquery de tu ejemplo entiendo que utilizas un TIBSQL que se enfoca especificamente a Interbase, no es la manera estandar de trabajar con datasets en delphi, creo que ese es tu problema. Un TDataset no esta limitado a trabajar con un solo manejador de base de datos como interbase. por ejemplo si trabajas con Tdatasets de ADO o DBExpress, que segun yo son los mas comunes y en los cuales puedes hacer la conexion con una infinidad de manejadores de bases de datos (incluyendo interbase), no tendrias el problema que mencionas
Bueno, mejor dicho que no es tu forma de trabajar
Y en cuanto a lo estandar, lo mismo digo
Y además, yo no tengo ningún problema
Responder Con Cita
  #10  
Antiguo 09-12-2014
edgargh edgargh is offline
Miembro
 
Registrado: jun 2006
Ubicación: León, Guanajuato
Posts: 25
Poder: 0
edgargh Va por buen camino
jaja, donde estas Neftali?, ayuda a este pobre hombre.
Responder Con Cita
  #11  
Antiguo 10-12-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
A ver, edgargh, un select a una base de datos devuelve una serie de registros, ¿cuántos?, no se puede saber. ¿Por qué el componente que estás usando, y otros también, pueden saberlo?, pues porque han añadido un contador. Pues la única manera de saber cuántos registros hay en una consulta es contarlos, para eso la única forma es hacer un fetch, o sea, ir al último.
Algunos añadidos en algunas bases de datos y componentes, han incorporado código para que cuando se están pasando los registros que ha devuelto la consulta, los vaya contando. Hay diversas maneras, tampoco voy a escribir un tratado de cómo se hace, pero no es lo normal.
Responder Con Cita
  #12  
Antiguo 10-12-2014
orodriguezca orodriguezca is offline
Miembro
 
Registrado: ene 2009
Posts: 221
Poder: 16
orodriguezca Va por buen camino
Casimiro tiene razón. Independiente del tipo de dataset con el que se haga la consulta, a menos que haga Fetch a todos los registros no hay forma de saber cuantos registros retornará la consulta.

Ahora, muchas veces los grids y algunos dataset, para mejorar el rendimiento, suelen recuperar la mayor cantidad posible de filas (en el caso del CXGrid todas las filas) para tenerlas disponibles tan pronto se ejecuta el Open de la consulta. En la mayoría de las ocasiones esto trae como consecuencia que "accidentalmente" todas las filas de la consulta son leídas por el cliente y el dato que obtenemos con Query1.RecordCount es correcto, pero la única forma de saber cuantas filas regresó nuestra consulta es leyéndolas todas, ya sea realizando un Query1.FetchAll o un Query1.Last.

Última edición por orodriguezca fecha: 10-12-2014 a las 16:21:54.
Responder Con Cita
  #13  
Antiguo 10-12-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por orodriguezca Ver Mensaje
..
Exactamente
Aunque no se hace por mejorar el rendimiento, ya que es justo lo contrario, esa forma es lo menos eficiente que existe para traerse datos de una consulta.
Se hace para "facilitar" el uso al usuario, como dices, los componentes que mencionas se trae todos, por defecto, para poder luego hacer filtros y cosas con ellos.
Evidentemente no es la forma correcta de trabajar, y mucho menos para trabajar por internet, ya que se trae todos los registros... ¿y si tienes millones de registros?, o sea, es un despropósito en cuanto a rendimiento.
Responder Con Cita
  #14  
Antiguo 10-12-2014
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Hola,

yo trabajo con Access y también me devuelve el número total de registros sin tener que ir al último o hacer un fetch, simplemente con

Código Delphi [-]
adoquery1.close;
adoquery1.sql.text:='SELECT * FROM clientes';
adoquery1.open;
showmessage(inttostr(adoquery1.recordcount));

me sale el número total de registros que hay en la consulta realizada.

como no he trabajado con otras bases de datos para mi esto también es lo normal.

Saludos.
__________________
Confórmate con lo que tienes pero anhela lo que te falta.
Responder Con Cita
  #15  
Antiguo 10-12-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pues a lo que he comentado antes, ahora hay que añadir que access no es una base de datos relacional, es una base de datos de escritorio, como los dbf de otra época.
Responder Con Cita
  #16  
Antiguo 10-12-2014
orodriguezca orodriguezca is offline
Miembro
 
Registrado: ene 2009
Posts: 221
Poder: 16
orodriguezca Va por buen camino
De Acuerdo casimiro, traer todos los registros de un solo golpe cuando son millones es un total despropósito. Es por esto que cuando se diseñan las consultas se deben acotar lo suficiente para no abrumar con tanta data a el pobre usuario: un millón de registros en la pantalla no sirven para nada.

Por otra parte, la mayoría de las veces, las consultas que realiza una aplicación bien pensada, para interactuar con datos en la pantalla, devuelve un número pequeño de registros, digamos menos de 100 registros. En estos casos, y dependiendo de los drivers y de la base de datos, leer todos los registros en una única operación puede mejorar significativamente el performance al "agrupar" la lectura de varios registros en una sola operación I/O. Por supuesto, esto no siempre aplica y por ello cada escenario que se nos presenta deber ser considerado de forma individual.
Responder Con Cita
  #17  
Antiguo 10-12-2014
orodriguezca orodriguezca is offline
Miembro
 
Registrado: ene 2009
Posts: 221
Poder: 16
orodriguezca Va por buen camino
Cita:
Empezado por ElDioni Ver Mensaje
Hola,

yo trabajo con Access y también me devuelve el número total de registros sin tener que ir al último o hacer un fetch, ...
En estos casos, cuando es una base de datos de escritorio, le toca a ADO o al BDE hacer el papel de Motor de Bases de Datos y por tanto sabe cuantos registros está manipulando/consultando.
Responder Con Cita
  #18  
Antiguo 10-12-2014
edgargh edgargh is offline
Miembro
 
Registrado: jun 2006
Ubicación: León, Guanajuato
Posts: 25
Poder: 0
edgargh Va por buen camino
Cita:
Empezado por orodriguezca Ver Mensaje
Casimiro tiene razón. Independiente del tipo de dataset con el que se haga la consulta, a menos que haga Fetch a todos los registros no hay forma de saber cuantos registros retornará la consulta.

Ahora, muchas veces los grids y algunos dataset, para mejorar el rendimiento, suelen recuperar la mayor cantidad posible de filas (en el caso del CXGrid todas las filas) para tenerlas disponibles tan pronto se ejecuta el Open de la consulta. En la mayoría de las ocasiones esto trae como consecuencia que "accidentalmente" todas las filas de la consulta son leídas por el cliente y el dato que obtenemos con Query1.RecordCount es correcto, pero la única forma de saber cuantas filas regresó nuestra consulta es leyéndolas todas, ya sea realizando un Query1.FetchAll o un Query1.Last.

Te consta lo que dices?, lo haz hecho con un adoquery por ejemplo?, no te ha funcionado el recordcount?
Responder Con Cita
  #19  
Antiguo 10-12-2014
edgargh edgargh is offline
Miembro
 
Registrado: jun 2006
Ubicación: León, Guanajuato
Posts: 25
Poder: 0
edgargh Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
A ver, edgargh, un select a una base de datos devuelve una serie de registros, ¿cuántos?, no se puede saber. ¿Por qué el componente que estás usando, y otros también, pueden saberlo?, pues porque han añadido un contador. Pues la única manera de saber cuántos registros hay en una consulta es contarlos, para eso la única forma es hacer un fetch, o sea, ir al último.
Algunos añadidos en algunas bases de datos y componentes, han incorporado código para que cuando se están pasando los registros que ha devuelto la consulta, los vaya contando. Hay diversas maneras, tampoco voy a escribir un tratado de cómo se hace, pero no es lo normal.

Lo único que te puedo decir porque lo he hecho infinidad de veces y puedo demostrarlo con un ejemplo sencillo si gustas, es que si yo tengo un adoquery por ejemplo, puedo obtener el total de registros a través de la propiedad recordcount. No es algo que este inventando yo (No tengo tanta capacidad) esa es la función de esa propiedad. Desde mi punto de vista la propiedad last se utiliza para ir al ultimo registro no para obtener el total de registros, para eso es la propiedad recordcount de un tdataset y no tiene nada que ver con el manejador de base de datos.

Entiendo la parte de que cada quien puede hacerlo a su manera, pero no estoy de acuerdo que se diga que no funciona algo que me consta que si. Saludos
Responder Con Cita
  #20  
Antiguo 10-12-2014
orodriguezca orodriguezca is offline
Miembro
 
Registrado: ene 2009
Posts: 221
Poder: 16
orodriguezca Va por buen camino
edgargh tienes y no tienes razón. Te explico porque:

Cuando se crea un objeto de la clase TADOQuery por defecto la propiedad CursorLocation se establece a clUseClient. En esta modalidad ADO se comporta en forma "desconectada" y transfiere todas (absolutamente todas) las filas de la consulta al lado del cliente aunque no se haya hecho un FetchAll o un Last. Es por esto que funciona el RecordCount, porque ADO transfiere todas las filas al cliente y las va contando a medida que las va transfiriendo. Si la propiedad CursorLocation se establece a clUseServer las filas solo se transferirán al cliente bajo demanda, ya sea navegando en un Grid o haciendo uso de los métodos Next, Last o FetchAll.

Espero quede aclarado.
Responder Con Cita
Respuesta



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
Contar Registros KAYO SQL 10 22-07-2010 19:47:43
Contar El Numero De Registros Mostrados En Un DBGRID alexey1982 Tablas planas 2 13-06-2008 00:52:35
Contar Cantidad de Items en un ComboBox grone35 Varios 2 07-09-2006 03:06:43
Contar Registros Roilo SQL 10 18-07-2006 21:20:24
Contar Cantidad de ReadOnly brandolin OOP 4 23-01-2006 18:34:12


La franja horaria es GMT +2. Ahora son las 18:38:25.


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