Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Problemas con lectura total de registros. (https://www.clubdelphi.com/foros/showthread.php?t=93388)

usuario1000 02-09-2018 19:02:13

Aplicación Distribuida y posible error en el RESULT
 
Buenas tardes a todos.


Tengo un problemilla y no sé si es un error mío o algo que se me escapa. Me explico:


Tengo una aplicación distribuida DataSnap en Windows 10 y con Delphi 10 Seatle. Estoy trabajando con ellas con datos reales y ya alcanza unos 5000 registros la base de datos.


Hago una consulta desde el Cliente al Servidor, con una función previa creada que parece funciona bien con pocos registros, pero cuando tiene que devolver muchos parece que sólo llega hasta 800 registros. ¿Existe un tope para que la funcion result del servidor devuelva registros?. O es ilimitado en el número de registros que tenga que devolver.



Me da la sensación de que existe un tope en cuanto a registros a devolver. ¿alguien me lo puede aclarar? Y si existe este límite, ¿como hago para superarlo, ya que necesito que me devuelva unos 4000 registros o posiblemente más?



gracias.

manelb 03-09-2018 08:33:51

No he tenido problemas en este aspecto en algunas pruebas que he realizado con esta tecnología.

¿Podría ser que fuesen los componentes de acceso a datos que utilizas los que tuvieran esta limitación debido a como los tienes configurados?
¿Qué componentes utilizas?

Saludos a todos.

gatosoft 03-09-2018 16:15:28

¿"posible error en el result" quiere decir que no te genera ningún error, sino que devuelve menos registros de los que esperas?, ¿o no te está devolviendo registros?

Podría ser también que al retornar uno de los registros, el tipo de dato de algún campo o el valor que este tiene, genere problemas con la configuración del componente de acceso a datos que utilizas.... y tu server no esté atrapando la excepción debidamente y no la replique al cliente...


intenta hacer una consulta con otra tabla (otro proceso) que envía mas datos y verás si el problema es de limite de datos

usuario1000 04-09-2018 01:44:01

Problemas con lectura total de registros.
 
Buenas noches,


Llevo unos dias intentando solucionar un problema que me tiene un poco desesperado.


Utilizo firebird y Delphi 10 Seatle con Windows 10.
El tema es que tengo realizada una aplicación DataSnap, Cliente-servidor, resulta que el servidor tiene la siguiente instrucción tan sencilla como esta:
SELECT * FROM TABLA
Eso debería devolver unos 3000 registros, pero mi sorpresa es que al cliente sólo le llegan unos 700. ¿que ocurre?. ¿como hago para que lleguen todos los registros.


Espero haberme explicado, si necesitáis mas datos, no dudéis en pedirmelos.


Gracias por vuestra colaboración, necesito una manita.

Casimiro Notevi 04-09-2018 10:25:34

Cita:

Empezado por usuario1000 (Mensaje 528288)
Buenas noches

No crees un hilo nuevo para preguntar lo mismo, sigue en el que iniciaste, gracias.
He unido ambos hilos.

Soa Pelaez 04-09-2018 15:53:37

Cita:

Empezado por usuario1000 (Mensaje 528288)
Buenas noches,


Llevo unos dias intentando solucionar un problema que me tiene un poco desesperado.


Utilizo firebird y Delphi 10 Seatle con Windows 10.
El tema es que tengo realizada una aplicación DataSnap, Cliente-servidor, resulta que el servidor tiene la siguiente instrucción tan sencilla como esta:
SELECT * FROM TABLA
Eso debería devolver unos 3000 registros, pero mi sorpresa es que al cliente sólo le llegan unos 700. ¿que ocurre?. ¿como hago para que lleguen todos los registros.


Espero haberme explicado, si necesitáis mas datos, no dudéis en pedirmelos.


Gracias por vuestra colaboración, necesito una manita.

Especifica un poco que componentes usas para conexión y para las consultas así puede ser más fácil ayudarte.

Si en el lado del cliente usas ClientDataset coloca la propiedad FetchOnDemand en true y la propiedad PacketRecords en -1.
Así debería traerte todos los registros que arroje tu consulta. Hazlo y me dices como te va.

usuario1000 04-09-2018 18:39:58

Buenas a todos.


Tengo puesto como dices Soa Pelaez así exactamente en el TClientDataSet " la propiedad FetchOnDemand en true y la propiedad PacketRecords en -1."


Por parte del cliente tengo los siguientes componentes para realizar esta consulta: TDataSetClient y TDataSetProvider y ejecuto la siguiente instrucción:


// cargamos datos de COSTES que cumplen los criterios
Código Delphi [-]
   dspCostes.DataSet := funcion.FiltrarCostesResumen(Aux_fecha, Aux_expediente1, Aux_expediente2, Aux_ano1, Aux_ano2,
                                              Aux_empresa1, Aux_empresa2, Aux_obra1, Aux_obra2, Aux_linea1, Aux_linea2);


   cdsCostes.Data := dspCostes.Data;
   cdsCostes.RecordCount;  // aquí me da una cifra que debe corresponder con el número de registros que recibe: 579.


    // siguen más lineas...




En la parte del servidor que es donde se ejecuta la función FiltrarCostesResumen tengo un TFDQuery para ejecutar la consulta y un TDataSetProvider asociado a este TFDQuery:

Código Delphi [-]
function TServerMethods1.FiltrarCostesResumen(fecha, expediente1, expediente2,
  ano1, ano2, empresa1, empresa2, obra1, obra2, linea1, linea2: string): TdataSet;
const
{  linea =  'Select n_expediente, n_ano_exp, tipo_documento, empresa, linea, obra, base, codigo_Cta, subcodigo_cta, '+
           'coste, n_proveedor, n_documento, n_ano_doc, fecha_sie from COSTES '+
           'where n_expediente >= :expediente1 and n_expediente <= :expediente2 ' +
           'and n_ano_exp >= :ano1 and n_ano_exp <= :ano2 ' +
           'and empresa >= :empresa1 and empresa <= :empresa2 ' +
           'and obra >= obra1 and obra <= obra2 ' +
           'and linea >= :linea1 and linea <= :linea2 ' +
           'and coste = :si ' +
           'and fecha_sie <= :fecha ORDER BY FECHA_SIE';   }

  linea = 'select * from costes';  // he puesto esta línea para que haga una consulta sencilla y sin posbiles errores en el filtrado.

begin


  qAuxiliar.Close;
  qAuxiliar.SQL.Clear;
  qAuxiliar.SQL.Add(linea);
{  qAuxiliar.ParamByName('fecha').AsDate := strToDate(fecha);
  qAuxiliar.ParamByName('expediente1').AsInteger := strToInt(expediente1);
  qAuxiliar.ParamByName('expediente2').AsInteger := strToInt(expediente2);
  qAuxiliar.ParamByName('ano1').AsInteger := strToInt(ano1);
  qAuxiliar.ParamByName('ano2').AsInteger := strToInt(ano2);
  qAuxiliar.ParamByName('empresa1').AsInteger := strToInt(empresa1);
  qAuxiliar.ParamByName('empresa2').AsInteger := strToInt(empresa2);
  qAuxiliar.ParamByName('obra1').AsInteger := strToInt(obra1);
  qAuxiliar.ParamByName('obra2').AsInteger := strToInt(obra2);
  qAuxiliar.ParamByName('linea1').AsInteger := strToInt(linea1);
  qAuxiliar.ParamByName('linea2').AsInteger := strToInt(linea2);
  qAuxiliar.ParamByName('si').AsString := 'S';    }

  try
    qAuxiliar.OPEN;
    qAuxiliar.RecordCount; // esta línea la he puesto para comprobar los registros que envía, y siempre marca 50. Es una cifra que he visto que aparece en el RowSetSize y que
                                                           //  he cambiado a 1000 pero no hace nada.
    result := qAuxiliar;
  Except
     // nada
  end;

end;





Ahora mismo ando un poco perdido y no sé como arreglarlo, a ver si alguien me puede decir como hacerlo, el problema es que estoy trabajando con datos reales y necesito que esto funcione para sacar listados.


Gracias a todos.

usuario1000 05-09-2018 00:10:22

¡¡¡¡Encontrada solución!!!!.


En primer lugar agradeceros a todos vuestra ayuda. Sois geniales.


Os comento como lo he solucionado pero todavía tengo que indagar un poco más en por qué me da el problema.


He estado haciendo pruebas y más pruebas y al final todo se resumen en lo siguiente:


Tengo un TDFQuery llamado qAuxiliar en el Servidor, cada vez que tengo que realizar alguna consulta (de la tabla que sea) utilizo este componente. Siempre empiezo de la siguiente forma para eliminar cualquier residuo de busqueda anterior:


Código Delphi [-]
qAuxiliar.Close;
  qAuxiliar.SQL.Clear;
  qAuxiliar.SQL.Add(linea);
  ...


En el cliente realizo varias consultas seguidas utilizando este componente, pero no sé por qué, debe haber alguna interferencia entre una consulta y otra que no arroja el resultado correcto, a pesar de empezar siempre como he dicho anteriormente.


Solución: crear otro componente llamado qAuxuliar1(TDFQuery), y funciona perfecto.


Podría pensarse que el qAuxiliar podría tener alguna propiedad cambiada, pero no es así, porque si elimino el componente qAuxiliar y renombro el qAuxiliar1 a qAuxiliar, vuelve a fallar. Y si le vuelvo a poner qAuxiliar1, funciona nuevamente.


Me quedo con la sensación de no saber como limpiar exactamente una búsqueda anterior para que no interfiera en la siguiente.


Gracias a todos, sigo depurando mi programa y por supuesto cualquier cosa, ya sé que cuento con vosotros.


Un abrazo.

gatosoft 05-09-2018 18:33:46

posiblemente se esté quedando pegado un Filter...

Pero es importante que lo identifiques, pues pueden haber mas problemas similares que no hayas detectado.


La franja horaria es GMT +2. Ahora son las 23:48:24.

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