Parâmetro do ClientDataSet não Paramentro no ClientDataSet

Delphi

31/05/2013

Isto e possível e como fazer isto, obrigado.
Gostaria de pegar o nome de um ClientDataSet e jogar em uma variável qualquer depois poder usar ela como se fosse o próprio ClientDataSet:
Ex: tenho um ClientDataSet com o nome de CDSEmpresa
Gostaria de pegar o nome do ClientDataSet que no caso e CDSEmpresa e jogar em uma variável Variavel_Nome para depois usar normalmente como se fosse o próprio clientdataset


Variavel_Nome.First;
while not Variável_Nome.Eof do
Begin
......
End;
Regis Ribeiro

Regis Ribeiro

Curtidas 0

Respostas

Claudia Nogueira

Claudia Nogueira

31/05/2013

Seria alguma coisa mais ou menos assim:

Var
  Variavel_Nome : String;
begin
  Variavel_Nome := 'CDSEmpresa';
  with TClientDataSet(Self.FindComponent(Variavel_Nome)) do
  begin
    First;
    while not Eof do
    begin
      //...
      Next;
    end;
  end;
end;
GOSTEI 0
Regis Ribeiro

Regis Ribeiro

31/05/2013

Bom dia Claudiadnh obrigado mas acho não ser isto.
1 Tenho Um Data Module com vários ClientDataSet
2 Peguei os nomes de cada um dos ClientDataSet e joguei dentro de um ListBox
Que ficou assim Ex:

DM.ClientDataSet001
DM.ClientDataSet002
DM.ClientDataSet003

3 agora quero percorrer o meu ListBox e pegar o nome do primeiro itens encontrado que no meu caso aqui e DM.ClientDataSet001 e jogar em uma variável Ex:
Var
VTabelas : String;
Begin
VTabelas:= ‘DM.ClientDataSet001’;//neste caso estou pegando de um ListBox

4 depois que o nome do meu ClientDataSet já esta dentro da variável poder trabalhar com ele como se fosse o próprio ClientDataSet Ex:

VRecebe.First;
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

31/05/2013

Eu testei antes de te enviar a resposta, mas no caso você tem que passar sem o "DM.", pois o componente mesmo chama "ClientDataSet001" e se coloar o "DM." não é possível localizar o mesmo dentro do DataModule. Ou você tira do ListBox o "DM." ou você dá um Copy pegando da terceira posição da string pra frente.
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

31/05/2013

Ops, teria que usar o Copy pegando da quarta posição pra frente.
GOSTEI 0
Regis Ribeiro

Regis Ribeiro

31/05/2013

Bom dia Claudiadnh novamente, e desculpa minha ignorância olha como esta o meu código uso Delphi 7

Ele copila normalmente, mas da um erro no First.

este codigo esta no form e o ClientDataSet esta Data Module

Var
Variavel_Nome : String;
begin
Variavel_Nome := 'ClientDataSetO0000'; //este ClientDataSet esta Data Module
with TClientDataSet(Self.FindComponent(Variavel_Nome)) do//aque passa normalmente nao da erro
begin
First; //O erro e aqui // Access Violation at address 0048DE4E in module
while not Eof do
begin
ShowMessage('Estou aqui');
Next;
end;
end;
end;
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

31/05/2013

O ClientDataSet está criado?

No meu teste, como não estava, eu criei:

TClientDataSet(Self.FindComponent(Variavel_Nome)).CreateDataSet;
GOSTEI 0
Regis Ribeiro

Regis Ribeiro

31/05/2013

Claudiadnh meu ClientDataSet já estava criado, mas para teste fiz o que você solicitou desliguei ele e mesmo desta maneira esta dando erro, tenho no meu USES DBClient será que esta faltando alguma coisa a mais.

Var
Variavel_Nome : String;
begin
Variavel_Nome := 'ClientDataSetO0000'; //este ClientDataSet esta Data Module
//Coloquei o linha de
TClientDataSet(Self.FindComponent(Variavel_Nome)).CreateDataSet; // agora esta //dando erro aqui = Access Violation at address 0048DE4E in module
with TClientDataSet(Self.FindComponent(Variavel_Nome)) do//aque passa normalmente nao da erro
begin
First;//Aqui da um erro// Access Violation at address 0048DE4E in module
while not Eof do
begin
ShowMessage('Estou aqui');
Next;
end;
end;
end;
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

31/05/2013

Seu ClientDataSet está no DataModule e você está usando o código em um form?
Se for isso, em vez de usar o Self, você tem que usar o DM.

Var
Variavel_Nome : String;
begin
Variavel_Nome := 'ClientDataSetO0000';
with TClientDataSet(DM.FindComponent(Variavel_Nome)) do
begin
First;
while not Eof do
begin
//...
Next;
end;
end;
end;
GOSTEI 0
Regis Ribeiro

Regis Ribeiro

31/05/2013

//Boa tarde Claudiadnh , fiz o que você falou e foi perfeito muito obrigado e //desculpa o transtorno e estou as sua disposição caso precise, espero poder ajudar.
//Agora para os amigos que por ventura precisem disto ai vai como eu fiz com a ajuda //da Claudiadnh.

//1 vale lembrar para verificar se no USES do form tem DBClient

//2 Seu ClientDataSet está em um DataModule e você está usando o //código em um form, Se for isso, em vez de usar o Self, você tem //que usar o DM.
//Ex:
// with TClientDataSet(DM.FindComponent(Variavel_Nome)) do no Caso de //DataModule.
//with TClientDataSet(Self.FindComponent(Variavel_Nome)) do no Caso de estar //usando o código dentro de um form onde esta o seu ClientDataSet.

//No meu caso eu já estou com as tabelas criadas do meu ClientDataSet.
//Mas para Criar o ClientDataSet usar:
//TClientDataSet(Self.FindComponent(Variavel_Nome)).CreateDataSet;
//Respeitando do (Self)se for no form ou (DM) DataModule.

//Vamos ao código:
//No onclick do Botão coloque este código.

Var
W:Integer;
Variavel_Nome : String;
begin
//Coloquei os nomes do meu ClientDataSet em um ListBox
for w := ListBox1.Items.Count - 1 downto 0 do
begin
//Alimento minha variável do no nome do meu ClientDataSet
Variavel_Nome :=ListBox1.Items[w];
// Não tem que constar (DM. ClientDataSetO0000) somente o nome da
//ClientDataSet Ex://'ClientDataSetO0000' mesmo ele estando do seu DataModule.
with TClientDataSet(DM.FindComponent(Variavel_Nome)) do
begin
First;
while not Eof do
begin
ShowMessage(‘Primeiro Registro');
Next;
end;
end;
End;
end;




//para povoar meu ListBox este e o código que uso
Colocar um ListBox no form e um Button depois

procedure TForm.Button7Click(Sender: TObject);
var
n : LongInt;
begin
ListBox1.Clear;
for n := 0 to DM.ComponentCount - 1 do
begin
if (DM.Components[n] is TClientDataSet) then
begin
ListBox1.Items.Add(DM.Components[n].Name);
End;
End;
end;

Bom da mesma forma que sempre fui ajudado por amigos e companheiro deixo aqui o que estou fazendo para que outros possam usufruir, e isto só foi possível graças a ajuda da Cludiadnh muito obrigado mais uma vez.

GOSTEI 0
José

José

31/05/2013

Como a duvida inicial já foi sanada, estou marcando este tópico como concluído.
GOSTEI 0
POSTAR