Criar Tabela Dinamica - ClientDataSet

Delphi

26/04/2007

:?: Olá a todos.
Preciso desenvolver uma rotina que crie tabelas dinamicamente.
Que essa tabela seja criada com a estrutura: SqlDataSet, Provider, ClientDataSet, DataSource.
Desenvolvi uma função que cria uma tabela especifica (com campos definidos) mas não consegui fazer uma função que crie tabelas diversas com a mesma estrutura.
Alguma coisa assim Exemplo:
Crietabela( NomeTabela );
AddCampos( Campo1, Tipo1, Campo2, Tipo2, etc..)
ou
CriaTabela( NomeTabela, Campos,Tipo,etc..)
===
Abaixo a função que uso prara criar uma tabela de Titulos

function CriaTabelaTitulos( NomeTabela:String; NomeDataSource:String) : Boolean;
Var
Campo : Tfield;
Begin

Result := false;

try
Tabela2.Name := NomeTabela;
Tabela2.Close;
Tabela2.Fields.Clear;
Tabela2.FieldDefs.Clear;
with Tabela2.FieldDefs do
begin
Campo := TStringField.Create( Application );
Campo.FieldName := ´Ped_Cod´;
Campo.Name := ´Ped_Cod´;
Campo.DataSet := Tabela2;
Campo.DisplayLabel := ´Pedido´;
//
Campo := TStringField.Create( Application );
Campo.FieldName := ´Cliente´;
Campo.Name := ´Cliente´;
Campo.DataSet := Tabela2;
Campo.DisplayLabel := ´Cliente´;
//
Campo := TFloatField.Create( Application );
Campo.FieldName := ´VlrPedido´;
Campo.Name := ´VlrPedido´;
Campo.DataSet := Tabela2;
Campo.DisplayLabel := ´Vlr. Pedido´;
//
Campo := TStringField.Create( Application );
Campo.FieldName := ´Docto´;
Campo.Name := ´Docto´;
Campo.DataSet := Tabela2;
Campo.DisplayLabel := ´Docto´;
//
Campo := TDateField.Create( Application );
Campo.FieldName := ´Vencto´;
Campo.Name := ´Vencto´;
Campo.DataSet := Tabela2;
Campo.DisplayLabel := ´Vencto´;
end;
Tabela2.CreateDataSet;
Except
begin
MessageDlg(´Error na Criação da Tabela´, mtError, [mbOK],0);
exit;
end;
end;

Result := true;

end;

Abraços a todos.
Neto


Neto

Neto

Curtidas 0

Respostas

Marco Salles

Marco Salles

26/04/2007

não sei se eu entendi mas pode usar POO

type TParametros = class Tipos : TFieldType; Tamanho: integer; Requerido : Boolean; end;


function CriarTabela(cds:TclientDataSet;Lista:TstringList):Boolean; var i:integer; begin try result:=False; with cds do begin Close; Fields.Clear; FieldDefs.Clear; for i:=0 to Lista.Count - 1 do FieldDefs.Add(Lista[i],Tparametros(lista.Objects[i]).Tipos, Tparametros(Lista.Objects[i]).Tamanho, Tparametros(Lista.Objects[i]).Requerido); CreateDataSet; result:=True; end; finally if not result Then MessageDlg(´Error na Criação da Tabela´, mtError, [mbOK],0); end; end;


Carregue assim:

procedure TForm1.Button1Click(Sender: TObject);
var umaLista:TstringList; Parametros:TParametros; i:Integer; begin umaLista:=TstringList.create; // Exemplo... parametros:=Tparametros.Create; parametros.Tipos:=ftString; parametros.Tamanho:=30; parametros.Requerido:=true; umaLista.AddObject(´Ped_Cod´,parametros); bla...bla..bla.. for i:0 to UmaLista.count - 1 do TParametros.(umalIsta.objects[i]).Free; Freeandnil(UmaLista); end;



GOSTEI 0
Marco Salles

Marco Salles

26/04/2007

não sei se eu entendi mas pode usar POO

type TParametros = class Tipos : TFieldType; Tamanho: integer; Requerido : Boolean; end;


function CriarTabela(cds:TclientDataSet;Lista:TstringList):Boolean; var i:integer; begin try result:=False; with cds do begin Close; Fields.Clear; FieldDefs.Clear; for i:=0 to Lista.Count - 1 do FieldDefs.Add(Lista[i],Tparametros(lista.Objects[i]).Tipos, Tparametros(Lista.Objects[i]).Tamanho, Tparametros(Lista.Objects[i]).Requerido); CreateDataSet; result:=True; end; finally if not result Then MessageDlg(´Error na Criação da Tabela´, mtError, [mbOK],0); end; end;


Carregue assim:

procedure TForm1.Button1Click(Sender: TObject);
var umaLista:TstringList; Parametros:TParametros; i:Integer; begin umaLista:=TstringList.create; // Exemplo... parametros:=Tparametros.Create; parametros.Tipos:=ftString; parametros.Tamanho:=30; parametros.Requerido:=true; umaLista.AddObject(´Ped_Cod´,parametros); bla...bla..bla.. CriarTabela(cds,umaLista); for i:=0 to UmaLista.count - 1 do TParametros(umalIsta.objects[i]).Free; umaLista.Free; end;



GOSTEI 0
Neto

Neto

26/04/2007

:idea: Quero tentar usar conforme vc está indicando.
Criei uma nova unit no projeto onde vou colocar as intruções que vc está me ´dizendo´, e quando declaro o type no início da unit (após interface) o delphi retorna:
Undeclared identifier: TFieldType.
Estou fazendo assim.
Tenho um projeto com o formulario principal que ainda não coloquei nada nele. Adicionei uma nova Unit no projeto e estou declarando no início assim:
=================
unit Unit2;

interface

type
TParametros = class
Tipos : TFieldType;
Tamanho: integer;
Requerido : Boolean;
end;

implementation

end.

Como devo fazer para o sistema reconhecer as instruções que vc passou

Abraços
Neto


GOSTEI 0
Marco Salles

Marco Salles

26/04/2007

Como devo fazer para o sistema reconhecer as instruções que vc passou


para o Delphi 7.0 faz assim

interface
uses
DB,DBClient,Classes,QDialogs;



//DB para o TFieldType //DBClient para o TclientDataSet //Classes para o TStringList //QDialogs para o MessageDlg



GOSTEI 0
Neto

Neto

26/04/2007

Ok fiz como vc mandou e deu certo. Bastou declarar no uses da nova Unit.
Agora o próximo problema.

Declarei cds como tipo TClientDataSet no var do Buttom, ai reconheceu
CriarTabela(cds , umaLista);

Aqui no for quando faço Tparameters.Create( >>> aqui quando digito o parenteses o Delphi retorna [ * Np Parameters Expected * ]
for i:=0 to UmaLista.count - 1 do
TParametros.Create(umalIsta.objects[i]).Free

Ai se eu rodo com F9 o sitema retorna:
Too many actual parameters.

Obrigado
Abraços
Neto


GOSTEI 0
Marco Salles

Marco Salles

26/04/2007

Aqui no for quando faço Tparameters.Create( >>> aqui quando digito o parenteses o Delphi retorna [ * Np Parameters Expected * ] for i:=0 to UmaLista.count - 1 do TParametros.Create(umalIsta.objects[i]).Free


Porque [u:1d6af7b566]Create[/u:1d6af7b566] ??????

simplesmente é assim :

for i:=0 to UmaLista.count - 1 do TParametros.(umalIsta.objects[i]).Free


deixo eu usar o meu bom ´Ingles´:

Copy with Atencion


entende....


GOSTEI 0
Neto

Neto

26/04/2007

With Atenção do //// perdão pisei na bola ( atenção )

Obrigado pela ajuda, mas temos mais problemas....

Ao Clicar no botão para executar o sistema retorna erro de exceção.

for i := 0 to UmaLista.count - 1 do
TParametros(umalIsta.objects[i]).Free;

posso enviar o projeto para algum endereço pra vc ver.
Acho que ao criar a nova tabela a rotina não está recebendo parametro.

Desculpe a (imbessssibilidade - burrice), te agradeço.
Abraços e bom domingo (dia do senhor), vamos lá.
Neto


GOSTEI 0
Marco Salles

Marco Salles

26/04/2007

With Atenção do //// perdão pisei na bola ( atenção )


nun precisa pedir perdão nada não e não é burrice não.. eu é que sou brincalhão

posso enviar o projeto para algum endereço pra vc ver. Acho que ao criar a nova tabela a rotina não está recebendo parametro.


nun carece não... Acho que da para resolver aqui mesmo. é so ficar mais calmo e encarar o Bicho.. ele so assusta é igual cavalo ,

´O Computador é igual ao CAVALO : sabe quem ta Montando nele´

Ao Clicar no botão para executar o sistema retorna erro de exceção.


que erro que dá ???
Com voce ta povoando os Objetos desta StringList ????


GOSTEI 0
POSTAR