Como saber se um field é chave?

Delphi

01/09/2006

Olá pessoal!

Tenho um ClientDataSet e preciso saber quais dos fields que ele carrega fazem parte da chave primária. Isso é possível saber pelo clientDataSet ou existiriam outras formas?

Falows!!!


Alissonmelo

Alissonmelo

Curtidas 0

Respostas

Cristiano Alves

Cristiano Alves

01/09/2006

Bom quando o Campo é Chave, o TField fica com a propriedade required com [b:c9d2a8b4e3]TRUE[/b:c9d2a8b4e3], é claro que nada impede de vc marcar outros tFields com Required´s.

Vc pode verificar tmb Providers Flags, coloque o Campo chave como pflnKey = True

Acho que isso da pra resolver

[]s


GOSTEI 0
Macario

Macario

01/09/2006

Completando as informações do nosso colega [b:9d7350d43d]cmainfor[/b:9d7350d43d]


if (pfInKey in ClientDataset.field[x].ProviderFlags) then
  Showmessage(´Este campo é ou faz parte da chave primaria´);




if (pfInKey in ClientDataset.fieldByName(´NomeCampo´).ProviderFlags) then
  Showmessage(´Este campo é ou faz parte da chave primaria´);





Espero ter ajudado.


GOSTEI 0
Alissonmelo

Alissonmelo

01/09/2006

Valeu galera, mas acho q não vai funcionar. Adicionei os fields na minha query/clientDataSet e e quando seleciono um field que faz parte da minha chave, a propriedade pfLnKey fica com valor ´false´


GOSTEI 0
Alissonmelo

Alissonmelo

01/09/2006

Valeu galera, mas acho q não vai funcionar. Adicionei os fields na minha query/clientDataSet e e quando seleciono um field que faz parte da minha chave, a propriedade pfLnKey fica com valor ´false´


GOSTEI 0
Marco Salles

Marco Salles

01/09/2006

Tenho um ClientDataSet e preciso saber quais dos fields que ele carrega fazem parte da chave primária. Isso é possível saber pelo clientDataSet ou existiriam outras formas?


No dbExpress, a interface responsável pela obtenção de metadados é a ISQLMetaData, declarada na unit DBXpress.pas

Existem vários métodos aonde podemos recuperar praticamente qualquer informação do catálogo do BD, como nomes de tabelas, tipos e nomes de campos, informações sobre Stored Procedures etc....

[b:ac845f4e3a]Para usar essa interface, devemos usar o método SetSchemaInfo de um DataSet do dbExpress.[/b:ac845f4e3a]

exemplo:

//campo que voce quer saber
//tb:Tabela que voce quer

function TForm1.verificaIndice(Campo,tb:string):Boolean;
begin
result:=False;
ClientDataSet1.Close;
SQLQuery2.SetSchemaInfo(stIndexes,tb,´´);
ClientDataSet1.Open;
While not Form1.ClientDataSet1.eof do
begin
if ClientDataSet1.FieldByName(´COLUMN_NAME´).AsString = campo then
begin
result:=True;
Break;
end
else
ClientDataSet1.next;
end;
end;


GOSTEI 0
Macario

Macario

01/09/2006

Valeu galera, mas acho q não vai funcionar. Adicionei os fields na minha query/clientDataSet e e quando seleciono um field que faz parte da minha chave, a propriedade pfLnKey fica com valor ´false´



Se ele faz parte da [b:10770cfbcc]PK[/b:10770cfbcc], então mude a propriedade para [b:10770cfbcc]True[/b:10770cfbcc]


GOSTEI 0
Marco Salles

Marco Salles

01/09/2006

cara , voce sabe como é , a gente atende telefone , faz diversas atividades e muita das vezes não presta a devida atenção na pergunta dos amigos :oops: :oops:

Quando voce disse clientDataset eu rapidamete associei ao DbExpress


Quando voce disse chave primária eu rapidamente associei aos Indices

foi uma distração minha , que venho aqui corrigir ..Pensei que estivesse usando os componentes Dbexpress , não sei porque , acho que é cansaço mesmo.. Sexta feira etc...

Porem deixo aqui registrado que o que falei para o dbexpress e verdade:

No dbExpress, a interface responsável pela obtenção de metadados é a ISQLMetaData, declarada na unit DBXpress.pas Existem vários métodos aonde podemos recuperar praticamente qualquer informação do catálogo do BD, como nomes de tabelas, tipos e nomes de campos, informações sobre Stored Procedures etc.... Para usar essa interface, devemos usar o método SetSchemaInfo de um DataSet do dbExpress.


Por exemplo para saber qual é a chave primária de uma tabela , batsa executar a função abaixo:

procedure TForm1.Button1Click(Sender: TObject);
var
tb:String;
begin
tb:=´NOME DA SUA TABELA´
ClientDataSet1.Close;
SQLQuery1.SetSchemaInfo(stIndexes,tb,´´);
ClientDataSet1.Open;
While not ClientDataSet1.eof do
  begin
     if not ClientDataSet1.FieldByName(´PKEY_NAME´).IsNull Then
       begin
         Showmessage(´O Campo Chave para esta tabela é :´+
         ClientDataSet1.FieldByName(´COLUMN_NAME´).asString);
         Break;
       end
     else
       ClientDataSet1.Next;
  end;
end;


enfim , recuperar MetaDados no DbExpress é mole :lol: :lol:


GOSTEI 0
Alissonmelo

Alissonmelo

01/09/2006

Esquenta não. Posso ligar um clientDataset à um SQLQuery do DbExpress e recuperar a informação usando setSchemaInfo, porém á uma demora muito grande na hora de retornar as informações e fica inviável de utilizar, mesmo pq estou desenvolvendo uma FrameWork e esse tipo de demora não seria bom.

Mesmo assim valeu!


GOSTEI 0
POSTAR