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-2019
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.009
Poder: 20
oscarac Va por buen camino
RecordCount no devuelve dato real

alguien sabe porque usando Firedac la propiedad RecordCount no devuelve el valor real?

estoy haciendo esta funcion

Código Delphi [-]
Function VerificarAnexo (_Anexo :String; _tipo : Integer) :Boolean;
Var SqlStr : String;
begin
  if _Anexo <> '' then
    Begin
      dmGlobal.qryBuscarAnexo.SQL.Clear;
      SqlStr := 'Select * From tblAnexo where Empresa = ' + QuotedStr(dmGlobal.g_CodigoEmpresa);
      if _tipo = 0 then
        SqlStr := SqlStr + ' and Codigo Like ' + QuotedStr(_Anexo + '%')
      Else
      SqlStr := SqlStr + ' and (Codigo Like ' + QuotedStr(_Anexo + '%') + ' or ' +
                              'RUC Like ' + QuotedStr(_Anexo + '%') + ')';


      SqlStr := SqlStr + ' Order By Codigo';

      dmGlobal.qryBuscarAnexo.SQL.Add(SqlStr);
      dmGlobal.qryBuscarAnexo.Open;
      dmGlobal.qryBuscarAnexo.Last;
      result := dmGlobal.qryBuscarAnexo.RecordCount >= 1;
      dmGlobal.vResultAnexo := dmGlobal.qryBuscarAnexoCodigo.AsString;
      dmGlobal.vResultAnexoRazon := Trim (dmGlobal.qryBuscarAnexoRazonSocial.AsString);
      dmGlobal.vResultAnexoDireccion := Trim(dmGlobal.qryBuscarAnexoDireccion.AsString);
      dmGlobal.vResultAnexoRuc := Trim(dmGlobal.qryBuscarAnexoRuc.AsString);

      dmGlobal.qryBuscarAnexo.Close;
    End
  else
    Result := False;
end;

cuando pruebo el query armado en la cadena en el analizador de consulta, devuelve 10 resultados, pero la linea dmGlobal.qryBuscarAnexo.RecordCount devuelve cero

en el componente TDfQuery he cambiado la propiedad RecorCountMode a cmFetched y tambien a cmTotal y nada sigue devolviendo cero
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #2  
Antiguo 24-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En sql, recordcount no devuelve el valor. Aunque debería de hacerlo tras haber ido a .last
De todas formas, lo lógico es hacerlo con un select count(campo) from tabla.
Responder Con Cita
  #3  
Antiguo 24-03-2019
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.009
Poder: 20
oscarac Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
En sql, recordcount no devuelve el valor. Aunque debería de hacerlo tras haber ido a .last
De todas formas, lo lógico es hacerlo con un select count(campo) from tabla.


pero eso implicaria generar otra consulta adicional y no es lo que quiero
usando ado no hay ese problema, porque en firedac si?
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #4  
Antiguo 24-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por oscarac Ver Mensaje
pero eso implicaria generar otra consulta adicional y no es lo que quiero
usando ado no hay ese problema, porque en firedac si?
No he probado firedac, ¿no hay acceso al código fuente?
Responder Con Cita
  #5  
Antiguo 24-03-2019
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Eso varia por motor. Que motor usas?
__________________
El malabarista.
Responder Con Cita
  #6  
Antiguo 24-03-2019
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.009
Poder: 20
oscarac Va por buen camino
SqlServer 2000
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #7  
Antiguo 24-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En motores sql los encargados suelen ser los componentes. Normalmente hacen un fetch para llegar al final y saber los registros que hay realmente.
En tu caso, con esas líneas debería devolver el número de registros, porque ha llegado al final.
Código Delphi [-]
dmGlobal.qryBuscarAnexo.Open;
dmGlobal.qryBuscarAnexo.Last;
result := dmGlobal.qryBuscarAnexo.RecordCount >= 1;
¿No devuelve el número de registros ese qryBuscarAnexo.RecordCount?
Responder Con Cita
  #8  
Antiguo 24-03-2019
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.009
Poder: 20
oscarac Va por buen camino
devuelve cero
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #9  
Antiguo 25-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por oscarac Ver Mensaje
devuelve cero
¿Y esa variable result tiene true o false?

result := dmGlobal.qryBuscarAnexo.RecordCount >= 1;
Responder Con Cita
  #10  
Antiguo 25-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Por lo que leo en la web de embarcadero, trae el código fuente, así que puedes echarle un vistazo.
Responder Con Cita
  #11  
Antiguo 25-03-2019
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.009
Poder: 20
oscarac Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Y esa variable result tiene true o false?

result := dmGlobal.qryBuscarAnexo.RecordCount >= 1;
falso

tienes el link de embarcadero?
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #12  
Antiguo 25-03-2019
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Hola,

¿Te sirve poner la propiedad RecordCountMode en modo cmTotal?, pruébalo, quizá sea lo que buscas.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #13  
Antiguo 25-03-2019
juniorSoft juniorSoft is offline
Miembro
 
Registrado: abr 2005
Posts: 178
Poder: 19
juniorSoft Va por buen camino
Hola,

Has verificado la propiedad FetchOptions.RowsetSize del FDQuery por defecto tiene asignado 50 por lo cual aunque una consulta que supere la cantidad de registros mayor a 50 mostrara inicialmente 50 registros los demás se obtiene utilizando los métodos correspondientes por ejemplo FetchNext recupera los siguientes 50 registros y los carga en el memoria y así sucesivamente. otro método es el FetchAll que los carga todos en memoria.

Si antes de hacer el RecordCount llamas al metodo FDQuery.FetchAll o le asignas a la propiedad citada el valor -1 debería funcionar.

Saludos,
Responder Con Cita
  #14  
Antiguo 25-03-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Creo que alguien ya lo ha comentado, pero en los Servidores de Base de Datos (a diferencia de las Bases de Datos de escritorio), por defecto no se obtienen todos los registros de una consulta y en consecuencia los componentes de acceso (en esta caso FireDAC) no rellenan la propiedad RecordCount (que suele quedar a -1).

Comentas que no quieres hacer una consulta para realizar el Count, pero en la mayoría de las ocasiones suele ser mucho peor (en cuanto a rendimiento) realizar un Last que realizar una segunda consulta que realiza un Count.

Por último y sólo para comprobar que los filtros son correctos, yo te aconsejaría (aunque sea en Debug) realizar el Count con la misma consulta (incluyando el WHERE) que estás haciendo; Porque me resulta extraño que el valor devuelto sea un cero. No es la primera vez que sin querer implementamos un filtro de forma incorrecta y realmente la consulta está devolviendo 0 registros porque es lo correcto.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #15  
Antiguo 25-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
...Comentas que no quieres hacer una consulta para realizar el Count, pero en la mayoría de las ocasiones suele ser mucho peor (en cuanto a rendimiento) realizar un Last que realizar una segunda consulta que realiza un Count.
Efectivamente, como dices, con last se avanza registro a registro hasta el final. Sin embargo con count usa el índice por lo que la respuesta es instantánea, sin tener que recorrer nada en la base de datos.
Responder Con Cita
  #16  
Antiguo 25-03-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Efectivamente, como dices, con last se avanza registro a registro hasta el final.

Y no sólo que avanza el puntero, sino que se los trae al cliente con el consiguiente trasiego de información innecesaria por la red (que suele ser leeeeennnto);
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #17  
Antiguo 25-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Y no sólo que avanza el puntero, sino que se los trae al cliente con el consiguiente trasiego de información innecesaria por la red (que suele ser leeeeennnto);
Cierto, hay que evitarlo
Responder Con Cita
  #18  
Antiguo 26-03-2019
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje

Comentas que no quieres hacer una consulta para realizar el Count, pero en la mayoría de las ocasiones suele ser mucho peor (en cuanto a rendimiento) realizar un Last que realizar una segunda consulta que realiza un Count.
Es por ello que he sugerido hacer:

Cita:
Empezado por Jhonny
Hola,

¿Te sirve poner la propiedad RecordCountMode en modo cmTotal?, pruébalo, quizá sea lo que buscas.
Firedac hace de manera "automática" un count en ese caso.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #19  
Antiguo 26-03-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
No conocía esa opción de la propiedad FetchOptions, Jhonny.

__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
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
enviar dato real a sql Memo6015 Conexión con bases de datos 10 05-09-2008 08:18:10
dato real no exacto jsanchez Firebird e Interbase 2 06-09-2007 00:01:20
RecordCount me devuelve -1 mayte Conexión con bases de datos 6 11-07-2007 16:40:14
RecordCount incorrecto en TkbmMemTable. Da el real menos 1 Wonni OOP 1 07-06-2007 13:27:08
funcion que devuelve el tipo de dato de un variant samame OOP 3 08-07-2004 17:02:30


La franja horaria es GMT +2. Ahora son las 18:13:22.


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