Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   RecordCount no devuelve dato real (https://www.clubdelphi.com/foros/showthread.php?t=93829)

oscarac 24-03-2019 19:41:28

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

Casimiro Notevi 24-03-2019 19:49:25

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.

oscarac 24-03-2019 20:12:53

Cita:

Empezado por Casimiro Notevi (Mensaje 531230)
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?

Casimiro Notevi 24-03-2019 20:44:23

Cita:

Empezado por oscarac (Mensaje 531231)
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?

mamcx 24-03-2019 21:48:07

Eso varia por motor. Que motor usas?

oscarac 24-03-2019 22:19:00

SqlServer 2000

Casimiro Notevi 24-03-2019 22:20:28

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?

oscarac 24-03-2019 22:38:47

devuelve cero

Casimiro Notevi 24-03-2019 23:08:23

Cita:

Empezado por oscarac (Mensaje 531237)
devuelve cero

¿Y esa variable result tiene true o false?

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

Casimiro Notevi 24-03-2019 23:11:49

Por lo que leo en la web de embarcadero, trae el código fuente, así que puedes echarle un vistazo.

oscarac 25-03-2019 00:12:01

Cita:

Empezado por Casimiro Notevi (Mensaje 531238)
¿Y esa variable result tiene true o false?

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

falso

tienes el link de embarcadero?

jhonny 25-03-2019 01:12:29

Hola,

¿Te sirve poner la propiedad RecordCountMode en modo cmTotal?, pruébalo, quizá sea lo que buscas.

juniorSoft 25-03-2019 01:14:59

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,

Neftali [Germán.Estévez] 25-03-2019 15:44:59

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.

Casimiro Notevi 25-03-2019 17:57:44

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 531245)
...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.

Neftali [Germán.Estévez] 25-03-2019 20:08:07

Cita:

Empezado por Casimiro Notevi (Mensaje 531249)
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);

Casimiro Notevi 25-03-2019 20:29:50

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 531253)
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 ^\||/

jhonny 26-03-2019 05:06:11

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 531245)

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.

Neftali [Germán.Estévez] 26-03-2019 08:15:19

No conocía esa opción de la propiedad FetchOptions, Jhonny.

^\||/^\||/


La franja horaria es GMT +2. Ahora son las 21:34:00.

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