PDA

Ver la Versión Completa : TADODataset "salta" la primera tupla del resultado.


Christian24
26-03-2024, 13:53:04
Buenas, foro. Es mi primer mensaje aquí, aunque os llevo leyendo bastante tiempo.

Tengo un problema en una aplicación en la que estoy trabajando en Delphi6. Estoy pasando una serie de módulos de dbf a SQL Server.

Estoy con un módulo de reporting que por una serie de necesidades ya existentes en la aplicación, me fuerza a generar una query con bastantes left join (>15) y bastantes cláusulas en el where según los filtros indicados por el usuario. Hablamos de una tabla que potencialmente (según la instalación), puede tener más de 30 millones de tuplas.

Actualmente, estoy generando dinámicamente un ADODataset, con los siguientes parámetros:

dataset.CommandTimeout := 900;
dataset.CommandText := [query];
dataset.CursorLocation := clUseServer;
dataset.CursorType := ctOpenForwardOnly;
dataset.EnableBCD := False;
dataset.LockType := ltReadOnly;

Y, posteriormente, hago un loadFromDataset para cargarlo en una tKbmMemTable:

memTable.LoadFromDataSet(dataset, [mtcpoProperties]);


Con esto la query ejecuta con ligera rapidez (dentro de las circunstancias). Sin embargo, me encuentro que *siempre* se salta el primer registro. Si copio el commandtext que también genero dinámicamente, y lo ejecuto directamente en el mssms, veo que la primera tupla que me arroja directamente la consulta, nunca me la trae el ADODataset, sólo los registros posteriores.

Si pruebo otras configuraciones, como clUseClient, la query me trae los resultados esperados pero es significativamente más lenta, o incluso me arroja un fuera de memoria sin llegar a traer nada.

Como apunte, es el dataset directamente el que "salta" la primera tupla. Es decir, ocurre antes del loadFromDataSet.

Además, he probado a abrir el dataset antes de cargar en la tabla de memoria, hacer first / next, pero tampoco solventa el problema.

¿Alguien sabría echarme un cable para entender la naturaleza del problema?

Gracias de antemano.

marco3k
26-03-2024, 15:29:05
Hola, no me ha ocurrido ese tipo de inconvenientes y siempre uso los cursores del lado del cliente para hacer llenar el adodataset, si dices que es lento la consulta, quizas algun campo donde ejecutas un where no esta indexado y por eso se ejecuta lento, revisa los campos donde haces where y que esten indexados.

Neftali [Germán.Estévez]
26-03-2024, 17:04:43
es un problema conocido y antiguo de los componentes ADO.
Aquí tienes un par de páginas donde se habla del tema y se dan algunas soluciones. Revísalas con cariño:
https://borland.public.delphi.database.ado.narkive.com/wgDi9C5o/ado-lost-records-with-asynchronous-fetching
https://supportcenter.devexpress.com/ticket/details/b4307/dbtreelist-records-missing-records-displayed-many-times-ado-datasets

Aunque si buscas referencias a este problema seguro que encuentras más fuentes donde se describe.

Christian24
27-03-2024, 16:34:39
;555136']es un problema conocido y antiguo de los componentes ADO.
Aquí tienes un par de páginas donde se habla del tema y se dan algunas soluciones. Revísalas con cariño:

Aunque si buscas referencias a este problema seguro que encuentras más fuentes donde se describe.

¡Muchas gracias, Neftali!

Estuve googleando antes de preguntar por aquí pero no encontré casi nada, el primer enlace que me pasaste me vino de perlas, con eso conseguí solventar el problema.

Un saludo.