GARANTIR DESCONTO

Fórum Como saber a Tabela de um campo do Clientdataset? #388934

20/10/2010

0

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

Responder

Posts

20/10/2010

Deivison Melo

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
Responder

Gostei + 0

21/10/2010

Rodrigo Albuquerque

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.
Responder

Gostei + 0

22/10/2010

Rodrigo Albuquerque

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)...
Responder

Gostei + 0

23/10/2010

Carlos Júnior

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.
Responder

Gostei + 0

23/10/2010

Rodrigo Albuquerque

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.
Responder

Gostei + 0

24/10/2010

Carlos Júnior

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.    
Responder

Gostei + 0

24/10/2010

Rafapasa

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


Responder

Gostei + 0

29/10/2010

Rodrigo Albuquerque

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.
Responder

Gostei + 0

09/09/2011

Carlos Bernardo

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;
 
Responder

Gostei + 0

16/01/2015

Glauber Silva

Faz tempo que você postou, mais ainda hoje foi útil! Obrigado por compartilhar!
Responder

Gostei + 0

01/09/2015

Almir Gomes

Topico antigo mas ainda ajuda.

Se quando o DataSetProvider estiver no ServerMethods (DataSnap). Como faço para pegar o nome da tabela.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar