Como saber a Tabela de um campo do Clientdataset?
preciso descobrir, apartir de um campo do clientdataset, qual a tabela que este field se refere. isso em tempo de execução.
já tentei utilizar o propriedade Origin, mas não funciona em todas as circunstâncias.
alguém tem alguma sugestão?
já tentei utilizar o propriedade Origin, mas não funciona em todas as circunstâncias.
alguém tem alguma sugestão?
Rodrigo Albuquerque
Curtidas 0
Respostas
Deivison Melo
20/10/2010
Bom dia raserafim,
Porquê você não procura no banco de dados que você está utilizando e resolver o seu problema com uma consulta através das view dos sgdb´s.
Veja um exemplo:
no oracle você conseguiria isso da seguinte forma:
select *
from all_cons_columns
where upper(column_name) like upper('%valor_a_ser_pesquisado%')
Qualquer coisa estou à disposição!! Emanoel Deivison
from all_cons_columns
where upper(column_name) like upper('%valor_a_ser_pesquisado%')
Qualquer coisa estou à disposição!! Emanoel Deivison
GOSTEI 0
Rodrigo Albuquerque
20/10/2010
na minha aplicação tenho uma rotina padrão que recebe como parâmetros um campo de um clientdataset. com isso estraio o valor deste campo e o nome da tabela (é isso que estou precisando agora). com eles monto uma instrução SQL.
antes esta rotina funcionava normalmente porque era só eu utilizar a propriedade Origin. mas esta propriedade não funciona com qualquer componente. por exemplo, com o DBExpress (que é o que estou utilizando agora) raramente funciona.
preciso encontrar uma forma alternativa ao Origin para saber o nome da tabela e assim poder montar uma instrução SQL dinamicamente.
antes esta rotina funcionava normalmente porque era só eu utilizar a propriedade Origin. mas esta propriedade não funciona com qualquer componente. por exemplo, com o DBExpress (que é o que estou utilizando agora) raramente funciona.
preciso encontrar uma forma alternativa ao Origin para saber o nome da tabela e assim poder montar uma instrução SQL dinamicamente.
GOSTEI 0
Rodrigo Albuquerque
20/10/2010
Emanoel,
não posso fazer como vc sugeriu pois preciso desta informação (tabela ao qual o campo se refere) em tempo de execução, para poder passar como parâmetro para uma procedure e, ela sim montar uma instrução SQL.
se puder me indicar que propriedade consigo extrair esta informação (que não seja a Origin)...
não posso fazer como vc sugeriu pois preciso desta informação (tabela ao qual o campo se refere) em tempo de execução, para poder passar como parâmetro para uma procedure e, ela sim montar uma instrução SQL.
se puder me indicar que propriedade consigo extrair esta informação (que não seja a Origin)...
GOSTEI 0
Carlos Júnior
20/10/2010
Amigo, eu uso a propriedade Origen no ClientDataSet e funciona perfeitamente.
Segue a minha rotinha.
for i := 0 to dsTabelas.DataSet.FieldCount -1 do
begin
if dsTabelas.DataSet.Fields[i].DisplayLabel = CDSFiltroCampos.AsString then
if (dsTabelas.DataSet.Fields[i].ProviderFlags = [pfInUpdate,pfInWhere]) OR
(dsTabelas.DataSet.Fields[i].ProviderFlags = [pfInUpdate,pfInWhere,pfInKey]) then
Campo := nomeTabela + '.' +dsTabelas.DataSet.Fields[i].FieldName
else
Campo := dsTabelas.DataSet.Fields[i].Origin + '.' + dsTabelas.DataSet.Fields[i].FieldName; end; Vê se ajuda. Falous.
begin
if dsTabelas.DataSet.Fields[i].DisplayLabel = CDSFiltroCampos.AsString then
if (dsTabelas.DataSet.Fields[i].ProviderFlags = [pfInUpdate,pfInWhere]) OR
(dsTabelas.DataSet.Fields[i].ProviderFlags = [pfInUpdate,pfInWhere,pfInKey]) then
Campo := nomeTabela + '.' +dsTabelas.DataSet.Fields[i].FieldName
else
Campo := dsTabelas.DataSet.Fields[i].Origin + '.' + dsTabelas.DataSet.Fields[i].FieldName; end; Vê se ajuda. Falous.
GOSTEI 0
Rodrigo Albuquerque
20/10/2010
Carlos,
quando utilizava um outro componente de acesso (ou quando utilizava a Query da BDE) a propriedade Origin funcionava perfeitamente. mas migrri para o dbExpress, e então a propriedade não funciona mais. por isso preciso encontrar uma forma alternativa para encontrar o nome da tabela ao qual o campo faz parte.
GOSTEI 0
Carlos Júnior
20/10/2010
Raserafim, eu também utilizo o DBExpress
Não entendi pq com vc não está funcionando.
Eu fiz assim: Coloquei o nome da tabela na propriedade Origem no clientDatSet.
Mas peguei o valor atravez do DataSet.
TClientDataSet(dsdados.DataSet).Origem
Tenta ai.
GOSTEI 0
Rafapasa
20/10/2010
Vc poderia descrever melhor como vc fez pra pegar o nome da tabela do DataSet;
De onde tirou esse nome?
De onde tirou esse nome?
GOSTEI 0
Rodrigo Albuquerque
20/10/2010
Carlos,
você disse "Coloquei o nome da tabela na propriedade Origem no clientDatSet", então você faz isso manualmente em temo de projeto, certo?
se for assim o meu também funciona. mas aí deixa de ser algo automático, dinâmico.
antes de eu utilizar o dbExpress e o SQLDataSet (antes utilizava a TQuery), aí funcionava perfeitamente. o delphi automaticamente preenchia a propriedade Origin quando colocava os campos.
antes de eu utilizar o dbExpress e o SQLDataSet (antes utilizava a TQuery), aí funcionava perfeitamente. o delphi automaticamente preenchia a propriedade Origin quando colocava os campos.
GOSTEI 0
Carlos Bernardo
20/10/2010
Amigo nao sei se vc ja resolveu, mas como estava com o mesmo problema, corri atras, e uma solucao que eu consegui foi utilizando assim :
function TFModelo.Retorna_Nome_Tabela: string;
VAR s_Provider : STRING;
d_dataset : TSQLDataSet;
begin
d_Dataset := nil;
s_Provider := TClientDataSet(DS_Padrao.DataSet).ProviderName;
d_Dataset := StrProviderNameToSqlDataset(s_Provider);
if assigned(d_dataset) then
result := IProviderSupport(d_Dataset).PSGetTableName;
end; function TFModelo.StrProviderNameToSqlDataset(
sProviderName: string): TSqldataset;
var
i : Integer;
Begin
Result := Nil;
for i:=0 to Dm.ComponentCount-1 do
begin
if (Dm.Components[i] is TDataSetProvider) and (Dm.Components[i].Name = sProviderName) then
begin
Result := (TDataSetProvider(Dm.Components[i]).DataSet as TSQLDataSet);
Continue;
end;
end;
if not(Assigned(Result)) then
Abort;
end;
A unica coisa que ficou foi a dependencia do Datamodule ser DM, mas como meus componentes ficam la nem me importei... procedure TFModelo.Btn_TesteClick(Sender: TObject);
begin showmessage(Retorna_Nome_Tabela);
end;
VAR s_Provider : STRING;
d_dataset : TSQLDataSet;
begin
d_Dataset := nil;
s_Provider := TClientDataSet(DS_Padrao.DataSet).ProviderName;
d_Dataset := StrProviderNameToSqlDataset(s_Provider);
if assigned(d_dataset) then
result := IProviderSupport(d_Dataset).PSGetTableName;
end; function TFModelo.StrProviderNameToSqlDataset(
sProviderName: string): TSqldataset;
var
i : Integer;
Begin
Result := Nil;
for i:=0 to Dm.ComponentCount-1 do
begin
if (Dm.Components[i] is TDataSetProvider) and (Dm.Components[i].Name = sProviderName) then
begin
Result := (TDataSetProvider(Dm.Components[i]).DataSet as TSQLDataSet);
Continue;
end;
end;
if not(Assigned(Result)) then
Abort;
end;
A unica coisa que ficou foi a dependencia do Datamodule ser DM, mas como meus componentes ficam la nem me importei... procedure TFModelo.Btn_TesteClick(Sender: TObject);
begin showmessage(Retorna_Nome_Tabela);
end;
GOSTEI 0
Glauber Silva
20/10/2010
Faz tempo que você postou, mais ainda hoje foi útil! Obrigado por compartilhar!
GOSTEI 0
Almir Gomes
20/10/2010
Topico antigo mas ainda ajuda.
Se quando o DataSetProvider estiver no ServerMethods (DataSnap). Como faço para pegar o nome da tabela.
Se quando o DataSetProvider estiver no ServerMethods (DataSnap). Como faço para pegar o nome da tabela.
GOSTEI 0