Ver Mensaje Individual
  #6  
Antiguo 10-02-2009
Bauhaus1975 Bauhaus1975 is offline
Miembro
 
Registrado: may 2005
Ubicación: Málaga
Posts: 135
Reputación: 22
Bauhaus1975 Va por buen camino
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 [-]
// Suponemos QueryX como el TIBQuery con el SQL listo para ejecutar
lista:= cloneQuery(QueryX); // Realizamos query y copia del data set según nuestra función.
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;
    // Realizamos la query
    ibQuery.Open();
    // Copiamos estructura de campos
    tabla.FieldDefs := ibQuery.FieldDefs;
    // Abrimos DataSet
    tabla.CreateDataSet;
    with ibQuery do
        begin
        while not EOF do
          begin
          tabla.Insert; // Hemos cambiado Append por 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.
Responder Con Cita