Hola y gracias de nuevo Al González por tus 'nutridas' respuestas.
Tendré en cuenta la librería que propones, pero seguí probando con la función y se me ocurrió que si ejecuto la query y luego copio los FieldDefs, mantedría la estructura de campos. Así con este enfoque me ha funcionado perfectamente, sólo había un error: La sentencia tabla.Append tuve que cambiarla por tabla.Insert para que añadiera cada nuevo registro.
En cuanto al cierre del DataSet. Si cierro el data set ¡no se pierden los registros! lo he vuelto a abrir y ahí, estan los puedo recorrer y verificar uno a no. Por tanto esto esto funciona según he probado:
Código Delphi
[-]
lista:= cloneQuery(QueryX); while not (lista.EOF) do
begin
showmessage('ID del registro'+lista.FieldByName('ID'));
lista.Next;
end;
lista.Close;
lista.Open;
lista.First;
while not (lista.EOF) do
begin
showmessage('ID del registro'+lista.FieldByName('ID'));
lista.Next;
end;
Y aquí va como ha quedado la ULTIMA versión de la función que hemos estado trabajando:
Código Delphi
[-]
function TEquipoCompTemp.cloneQuery(ibQuery:TIBQuery):TClientDataSet;
var
Campo :string;
i :integer;
tabla : TClientDataSet;
begin
tabla := TClientDataSet.Create(nil);
tabla.ProviderName := '';
tabla.PacketRecords := -1;
tabla.StoreDefs := true;
ibQuery.Open();
tabla.FieldDefs := ibQuery.FieldDefs;
tabla.CreateDataSet;
with ibQuery do
begin
while not EOF do
begin
tabla.Insert; for i := 0 to FieldCount-1 do
begin
Campo := Fields[i].FieldName;
tabla[Campo] := ibQuery[Campo];
end;
tabla.Post;
Next;
end;
Close;
end;
result := tabla;
end;
Un saludo.