Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-06-2015
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 19
TOPX Va camino a la fama
Hola,

Eso tiene que ver con la propiedad FieldDefs del TClientDataSet.

Más info en ~
¿Y si utiliza un nuevo ClientDataSet para la nueva estructura? En fin, son gustos.
-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #2  
Antiguo 18-06-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.449
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿No será algún otro componente que tienes "enganchado" a ese ClientDataset, quien está buscando el campo?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 18-06-2015
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 16
Caminante Va camino a la fama
Hola

creo que deberia ser

Código Delphi [-]
Clientdataset1.FieldDefs.clear;
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #4  
Antiguo 18-06-2015
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
Hola Javier.

Recuerda que puedes presionar Ctrl+C ("copiar") cuando te aparezca un mensaje de error. Así es fácil que nos muestres (Ctrl+V) el mensaje de error íntegro.

Saludos.
Responder Con Cita
  #5  
Antiguo 18-06-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
fjcg02,

Cita:
Empezado por fjcg02
...TClientDataset al que le creo en runtime los campos que necesito...me funciona perfectamente...cuando lanzo el proceso por segunda vez, cambiando los campos, me da un error...


Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DBClient, DB, Grids, DBGrids;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    DBGrid1: TDBGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1 : TForm1;
  Table : TClientDataset;
  DS : TDataSource;

implementation

{$R *.dfm}

// Crea campos del CDS
function CreateField(CDS : TClientDataset; FieldName : String) : Boolean;
var
   F : TStringField;

begin

   F := TStringField.Create(CDS);
   F.FieldName := FieldName;
   F.Name := FieldName;
   F.DataSet := CDS;
   F.Size := 100;
   F.DisplayLabel := 'N-' + FieldName;
   F.DisplayWidth := 10;

end;

// Crea el CDS
procedure TForm1.Button1Click(Sender: TObject);
begin
   if not Assigned(Table) then
      Table := TClientDataset.Create(nil);
end;

// Asigna campos al CDS
procedure TForm1.Button2Click(Sender: TObject);
begin
   if Assigned(Table) and (Table.State <> dsBrowse) then
   begin
      CreateField(Table,'C1');
      CreateField(Table,'C2');
      CreateField(Table,'C3');
      CreateField(Table,'C4');
      Table.CreateDataset;
   end;
end;

// Llena los campos del CDS
procedure TForm1.Button3Click(Sender: TObject);
var
   i : Integer;
begin
   if Assigned(Table) and (Table.FieldCount <> 0) then
   begin
     Randomize;
     Table.Open;
     Table.Append;
     for i := 0 to Table.FieldCount - 1 do
        Table.Fields[i].Value := 'Data-' + IntToStr(Random(1000));
     Table.Post;
   end;
end;

// Visualiza el CDS
procedure TForm1.Button4Click(Sender: TObject);
var
   i : Integer;
begin
   if Assigned(Table) then
   begin
      DS := TDataSource.Create(nil);
      DS.DataSet := Table;
      DBGrid1.DataSource := DS;
      for i := 0 to Table.FieldCount - 1 do
         DBGrid1.Columns[i].Width := 100;
   end;
end;

// Libera el CDS
procedure TForm1.Button5Click(Sender: TObject);
var
   i : Integer;

begin

   if Assigned(Table) and (Table.FieldCount <> 0) then
   begin
      DS.DataSet := nil;
      DBGrid1.DataSource := nil;
      for i := Table.Fields.Count - 1 to 0 do
         Table.Fields[i].Free;
      Table.Free;
      Table := nil;
   end;

   if Assigned(Table) then 
   begin
      Table.Free;
      Table := nil;
   end;

end;

// Libera recursos de Form1
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   Action := caFree;
end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, Permite crear y eliminar un TClientDataset de forma dinámica como se muestra en la siguiente imagen:



Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 18-06-2015 a las 17:43:15.
Responder Con Cita
  #6  
Antiguo 18-06-2015
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
Hola amigos, gracias a todos por las respuestas.

Revisando un poco todo lo que habéis puesto, os apunto lo siguiente:

- El problema ocurre cuando cambio los campos que quiero visualizar. Si los campos son los mismos, no hay problema, se ejecuta perfectamente. Por lo tanto, el ejemplo de nlsgarcia, que es una pasada, en el que los campos son siempre los mismos, no reproduce mi problema.
- La solución que me propone Neftali, también la había probado, desactivando el dataset y el dbgrid del TClientDataset.
- Al, el mensaje que me da es el que he puesto, ni más, ni menos.

Finalmente, la sentencia mágica que ha hecho que funcione todo bien, es la que ha apuntado Caminante, demostrando que no hay camino, se hace camino al andar .

Código Delphi [-]
CDS.FieldDefs.Clear;


Por lo tanto , queda resuelto mi problema, ya sólo me queda poner edulcorantes al formulario para tener toda la artillería montada.


Lo dicho, muchas gracias a todos de nuevo y un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #7  
Antiguo 18-06-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola fjcg02.

Fijate si este ejemplo se parece a lo que estas buscando,
Código Delphi [-]
// Crear columna
procedure CrearColumna(ClientDataSet: TClientDataSet; const FieldName: string;
  const FieldType: TFieldType; const FieldSize: Integer = 0);
begin
  with ClientDataSet do
  begin
    with FieldDefs.AddFieldDef do
    begin
      DataType := FieldType;
      Name     := FieldName;
      //...
      if FieldSize > 0 then Size := FieldSize;
    end;
  end;
end;

// Crear unas columnas y cargar (1)
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  with ClientDataSet1 do
  begin
    Close;
    FieldDefs.Clear;
    CrearColumna(ClientDataSet1, 'Integer', ftInteger);
    CrearColumna(ClientDataSet1, 'String', ftString, 30);
    CrearColumna(ClientDataSet1, 'Float', ftFloat);
    CreateDataSet;
    Open;
    for i:= 1 to 1000 do
    begin
      Append;
      FieldByName('Integer').AsInteger := i;
      FieldByName('String').AsString   := 'Valor '+IntToStr(i);
      FieldByName('Float').AsFloat     := PI * i;
      Post;
    end;
    First;
  end;
end;

// Crear unas columnas y cargar (2)
procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
begin
  with ClientDataSet1 do
  begin
    Close;
    FieldDefs.Clear;
    CrearColumna(ClientDataSet1, 'String', ftString, 15);
    CrearColumna(ClientDataSet1, 'DateTime', ftDateTime);
    CrearColumna(ClientDataSet1, 'Currency', ftCurrency);
    CreateDataSet;
    Open;
    for i:= 1 to 1000 do
    begin
      Append;
      FieldByName('String').AsString     := 'Valor '+IntToStr(i);
      FieldByName('DateTime').AsDateTime := Now();
      FieldByName('Currency').AsFloat    := PI * i;
      Post;
    end;
    First;
  end;
end;

Saludos

Edito: Perdón fjcg02, no ví tu último mensaje mientras tenía este abierto.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 18-06-2015 a las 19:04:03.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Creacion de grupos en Runtime Willo Impresión 1 16-11-2012 20:05:41
Problema de creación en Runtime hgiacobone OOP 7 16-09-2011 15:19:35
Creación de TFields en Runtime vinguel Conexión con bases de datos 5 16-11-2010 15:16:18
Creación de jpg en RunTime sierraja Gráficos 4 06-10-2005 04:26:04
Creación de Forms en runtime con Tipo dinámico Aprendiz OOP 2 29-09-2004 10:35:25


La franja horaria es GMT +2. Ahora son las 17:10:55.


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