Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Campos creados dinámicamente clientdataset (https://www.clubdelphi.com/foros/showthread.php?t=62078)

sur-se 03-12-2008 14:03:58

Campos creados dinámicamente clientdataset
 
Hola. Utilizo Delphi 5.
Necesito poder crear dinámicamente campos en un clientdataset. Al arrancar la aplicación este dispone de 2 campos, que en función de la operatoria del cliente requiere añadir nuevos. El clientdataset lo utilizo como tabla temporal en memoria no conectada a ningún provider, y lo relleno con insert/post etc.
El problema es que al añadir dinámicamente campos me da un error de "missing provider. ..." que no sé como solucionar. Os dejo aquí el código que utilzo:

Código:

...
private
  col: integer ;  // contador de columnas añadidas
....
// Al crear el form, hacemos el clientdataset.createdataset;
...
// botón para añadir columnas
procedure TForm1.Button2Click(Sender: TObject);
VAR nombrecampo:string;
begin
    button2.Enabled:=false;
    col:=col+1;
    nombrecampo:='C'+formatfloat('00',col);

    ClientDataSet1.close; // sin esto también da error pero se pierden los datos
    with ClientDataSet1.FieldDefs do
    begin
              with AddFieldDef do
                    begin
                        Name := nombrecampo;

                        DataType := ftString;
                        Size := 10;
                        CreateField(ClientDataSet1,nil,nombrecampo);
                    end;
    end;

    cliendataset1.open;  // Aquí salta la exception
end;

// botón para borrar columnas (siempre la última que se añadió)
procedure TForm1.Button3Click(Sender: TObject);
begin
    if col>0 then
    begin
        col:=col-1;
        ClientDataSet1.close;
      ClientDataSet1.Fields.Remove(ClientDataSet1.Fields[ClientDataSet1.Fields.count-1]);
    end;
end;

Al borrar una columna también pasa una cosa extraña y es que si después se trata de añadir de nuevo dice que ya existe una columna con el nombre Cxx (donde xx es el col por el que se va).
Llevo mucho tiempo usando el clientdataset sin problemas pero nunca se me había planteado crear/destruir columnas dinámicamente mientras se mantienen los datos que estuviesen registrados, y necesito que esos datos se mantengan a pesar de los cambios en la estructura. No sé si esto será posible de hacer.
Gracias.

droguerman 03-12-2008 15:46:12

Necesitas llamar al Método CreateDataset antes de hacer open (puesto que no estás usando providers)

sur-se 03-12-2008 16:51:41

Hola. Gracias por la respuesta, pero precisamente ahí está la cuestión. Lo que quiero saber es si hay forma de alterar la estructura del clientdataset sin perder los datos que contiene. Si hago el createdataset, pierdo los datos.
Un saludo.

droguerman 03-12-2008 19:57:28

Creo que te sale más sencillo clonar el dataset temporalmente aqui un ejemplo

sur-se 04-12-2008 12:41:31

Hola. Gracias por la respuesta. No conocía ese método del clonecursor. Me ha venido estupendamente. Clono el clientdataset, modifico la estructura del original y luego restauro los datos. Ya me funciona bien.
Gracias por la ayuda.

Wbarrantes 16-10-2010 02:55:52

hola
 
no se si aun existe alguno de estos usuarios, pero de ser asi, podrias indicarme como hiciste para borrar una columna? tengo los mismos problemas...


gracias

sur-se 18-10-2010 09:43:33

Hola. Pues no encontré la solución, por lo que utilizé el método sugerido de clonar el dataset. Como habitualmente en la tabla tengo como máximo 30 o 40 registros, pues es muy rápido y me fue suficiente con ese sistema. Lo siento, pero no seguí investigando el asunto.
Un saludo.


La franja horaria es GMT +2. Ahora son las 14:49:15.

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