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 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
...la sentencia mágica que ha hecho que funcione todo bien, es la que ha apuntado Caminante (CDS.FieldDefs.Clear)...


Cita:
Empezado por fjcg02
...El problema ocurre cuando cambio los campos que quiero visualizar...Si los campos son los mismos, no hay problema...el ejemplo de nlsgarcia...en el que los campos son siempre los mismos, no reproduce mi problema...


Revisa este código (Solo para complementar):
Código Delphi [-]
unit Unit1;

interface

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

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;
  B : Boolean;

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 aleatorios al CDS
procedure TForm1.Button2Click(Sender: TObject);
begin

   Randomize;

   B := Not B;

   if Assigned(Table) and (Table.State <> dsBrowse) and B then
   begin
      CreateField(Table,'C' + IntToStr(RandomRange(10,19) + 1));
      CreateField(Table,'C' + IntToStr(RandomRange(20,29) + 1));
      CreateField(Table,'C' + IntToStr(RandomRange(30,39) + 1));
      CreateField(Table,'C' + IntToStr(RandomRange(40,49) + 1));
      Table.CreateDataset;
   end;

   if Assigned(Table) and (Table.State <> dsBrowse) and not B then
   begin
      CreateField(Table,'C' + IntToStr(RandomRange(50,59) + 1));
      CreateField(Table,'C' + IntToStr(RandomRange(60,69) + 1));
      CreateField(Table,'C' + IntToStr(RandomRange(70,79) + 1));
      CreateField(Table,'C' + IntToStr(RandomRange(80,89) + 1));
      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 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 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 con campos aleatorios de forma dinámica como se muestra en la siguiente imagen:



Nota: El ejemplo mostrado es básicamente similar al indicado en el Msg #8, la diferencia radica en que los campos creados son aleatorios.

Espero sea útil

Nelson.
Responder Con Cita
  #2  
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
Gracias de nuevo, nlsgarcia.

Buen código, la diferencia que hay con el mío es que yo el TClientDataSet lo tengo ya creado en el formulario, y tú lo creas cada vez que pulsas el botón.

Puede ser una buena alternativa, ya que también me puede valer perfectamente. Lo voy a valorar.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #3  
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.

Otra situación que se te puede presentar, es agregar campos luego de haber creado el ClientDataSet. Para hacerlo sin perder los datos que llevas cargados, podes hacer como en este ejemplo:
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  cds : TClientDataSet;  // (me dan pereza los nombres largos)
  clon: TClientDataSet; // cds auxiliar
  i   : Integer;
begin
  cds  := ClientDataSet1;
  clon := TClientDataSet.Create(nil);
  try
    // Salvar datos anteriores
    clon.CloneCursor(cds, False, True );
    clon.First;
    // Agregar nuevos campos
    cds.Close;
    cds.FieldDefs.Update;
    cds.FieldDefs.Add('Campo3', ftCurrency, 0, False);
    cds.FieldDefs.Add('Campo4', ftFloat, 0, False);
    cds.CreateDataSet;
    cds.Open;
    // Recuperar los datos anteriores
    while not clon.Eof do
    begin
      cds.Append;
      cds.FieldByName('Campo1').AsInteger := clon.FieldByName('Campo1').AsInteger;
      cds.FieldByName('Campo2').AsString  := clon.FieldByName('Campo2').AsString;
      //...
      cds.Post;
      clon.Next;
    end;
    cds.First;
  finally
    clon.Free;
  end;
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
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 Daniel,
el caso que me planteas no se contempla en los casos de uso, ni creo que se dé.

El truco es bueno, clonar el clientdataset, añadir los campos y copiarlos luego.

Gracias, todas las ideas son buenas.

Finalmente he optado por la opción de destruir el clientdataset y volverlo a crear, pero tras hacerlo, ahora los datos que obtengo no son correctos, aunque como dicen los buenos moderadores:

"otro problema, otro hilo"

Ahora me voy a dormir, a ver si después de descansar encuentro el gazapo que antes no tenía.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #5  
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
¡Joder, qué buenas aportaciones! El Club es grande.
Responder Con Cita
  #6  
Antiguo 19-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
Cita:
Empezado por Al González Ver Mensaje
¡Joder, qué buenas aportaciones! El Club es grande.
A veces da miedo preguntar, te responden tanto y tan bueno, que luego estás haciendo deberes varios días.

Al final he hecho un mix, el datasource lo creo en diseño, y el el tclientdataset lo genero , libero y vuelvo a generar tantas veces como necesite. Funciona de maravilla.

A mis compañeros les ha gustado lo que he hecho: Sobre una consulta abierta, seleccionas campos para cabeceras de filas, campo para columnas, campo a utilizar, función de agregado ( count, sum, avg, max, min ) y voilá, te hace una pívot table en vivo y en directo que te muestra tan ricamente.

Gracias a todos y un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
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 13:42:17.


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