Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #5  
Antiguo 10-02-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por Bauhaus1975 Ver Mensaje
prefiero hacerlo con la función puesto que creo que es más 'portable' a mis casos... He probado cambiar Open por CreateDataSet como dices, pero ahora el error (casi me lo esperaba) es: 'No fields defined'.
¿Tengo que definir los campos previamente, con fielddefs?
Ah, claro, el conjunto de datos cliente (TClientDataSet) debe tener ya los campos que usará (lista de objetos TField en la propiedad Fields) o al menos sus definiciones (propiedad FieldDefs). Olvidé ese pequeño detalle.

Cita:
Empezado por ayuda de Delphi
If the FieldDefs property contains values, these values are used to create field definitions. Otherwise the Fields property is used. One or both of these properties must contain values in order to create a dataset. If neither property is set, CreateDataSet raises an exception.

Cita:
Empezado por Bauhaus1975 Ver Mensaje
¿Hay alguna forma de hacerlo automaticamente, es decir que lo coja del resultado de la query?
Desafortunadamente no existe una solución nativa que te copie (clone) los objetos campos de un conjunto de datos en otro. Es medianamente laborioso implementarla con un ciclo For que recorra la propiedad Fields del conjunto de datos origen (el TIBQuery, en este caso) y por cada campo cree una instancia de la misma clase en el conjunto de datos destino (el nuevo TClientDataSet), además de asignar las propiedades de cada campo copiado (al menos las esenciales como FieldName, Size, etc. y otras que requieras como DisplayFormat, Currency, etc.).

Si estás usando Delphi 7 o 2007 y no tienes inconveniente en emplear una de mis funciones, en GH Freebrary encontrarás un procedimiento llamado ghCopyFields que realiza esa tarea de "reproducción de campos". Tu función quedaría más o menos así (eliminé las sentencias innecesarias):

Código Delphi [-]
Uses
  GHFData;
...
function cloneQuery(ibQuery:TIBQuery):TClientDataSet;
var
    Campo :string;
    i :integer;
    tabla : TClientDataSet;
begin
    tabla:= TClientDataSet.Create(nil); // Creamos clientdataset y definimos propiedades
    ghCopyFields (ibQuery, tabla);  // Le creamos los mismos campos que a ibQuery
    tabla.CreateDataSet;  // Abrimos el conjunto de datos vacío

    // En esta sentencia se ejecuta la query que traerá los datos
    with ibQuery do
        begin
        Open;
        while not EOF do // Iteramos para ir insertando cada registro
          begin
          tabla.Append;
          for i := 0 to FieldCount-1 do
            begin
            Campo := Fields[i].FieldName;
            tabla[Campo] := ibQuery[Campo];
          end;
          tabla.Post;
          Next;
        end;
        Close;
    end;

    { Este es el "Close" que sugiero quitar.  Si acabas de crear y rellenar
      el clon, cerrarlo antes de usarlo no tiene sentido.  Ciérralo
      después, fuera de esta función, cuando ya no vayas a usarlo . }
//    tabla.Close;

    result := tabla;
end;


Cita:
Empezado por Bauhaus1975 Ver Mensaje
Otra cosa que me ronda la cabeza es lo que comentas de no poder cerrar ¿Te refieres al clientdataset?... puf, entonces la funcionalidad queda bastante reducida, ¿no?
Me refiero al Close prematuro que comenté arriba, en la función. Lo normal sería cerrar el nuevo conjunto de datos cuando ya no lo necesites (mejor aún, destruirlo por completo), pero no cuando acabas de crearlo. Lo usual sería algo como esto:
Código Delphi [-]
MiCDS := cloneQuery (QueryX);

Try
  // Uso de MiCDS
Finally
  MiCDS.Free;
End;

Espero te sirva lo escrito y mi código. Coméntanos cómo te resulta.

Un saludo.

Al González.

Última edición por Al González fecha: 10-02-2009 a las 01:21:59.
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problemas copiando y pegando documentos mixtos sue23cr Varios 1 13-07-2007 10:32:21
Problemas al actualizar un TClientDataset y ADO PEDRO_PASAMAR Conexión con bases de datos 1 30-11-2004 10:52:46
Problemas con TClientDataSet dmasson Conexión con bases de datos 5 30-05-2004 21:17:28
Problemas con In en TIBQuery Rabata Conexión con bases de datos 1 15-10-2003 13:56:59
Problemas con In en TIBQuery Rabata SQL 1 15-10-2003 13:56:59


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


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi