Como saber a Tabela de um campo do Clientdataset?

Delphi

20/10/2010

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?
Rodrigo Albuquerque

Rodrigo Albuquerque

Curtidas 0

Respostas

Deivison Melo

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
GOSTEI 0
Rodrigo Albuquerque

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.
GOSTEI 0
Rodrigo Albuquerque

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)...
GOSTEI 0
Carlos Júnior

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.
GOSTEI 0
Rodrigo Albuquerque

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

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

Rafapasa

20/10/2010

Vc poderia descrever melhor como vc fez pra pegar o nome da tabela do DataSet;
De onde tirou esse nome?


GOSTEI 0
Rodrigo Albuquerque

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.
GOSTEI 0
Carlos Bernardo

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;
 
GOSTEI 0
Glauber Silva

Glauber Silva

20/10/2010

Faz tempo que você postou, mais ainda hoje foi útil! Obrigado por compartilhar!
GOSTEI 0
Almir Gomes

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.
GOSTEI 0
POSTAR