Fórum Implementar Campo de lookup com DBExpress e FB 1.5 #283216

29/05/2005

0

Boa tarde amigos
Alguém poderia me dar uma dica de como implementar campos lookup com os componente Client DataSet?
Estou portando uma aplicação do Paradox para Client/Server utilizando o Firebird 1.52 e os componentes da paleta DBExpress.
Nos forms de cadastro onde não há FK´s tudo foi normal, mas agora estou chegando no ponto de lidar com tabelas com algumas FK´s e nestas tabelas tenho que fazer o lookup para mostrar o dado que esta contido em outra tabela.
Estou utilizando os seguintes componentes para acesso aos dados..
[b:4cb39d0456]SQLConnection+SQLDataSet+DataSetProvider+ClientDataSet+DataSource. [/b:4cb39d0456]
No caso em questão estou em formulário de Funcionarios onde na tabela tenho o Código do funcionário como Primary Key e o Código da Empresa como Foreign Key (FK), no componente SqlDataSet a propriedade CommandText para esta tabela em questão esta definida assim:

select FUNC.*, EMP.EMPNOM NomeEmpresa
from FUNCIONARIOS FUNC
inner join EMPRESA EMP on EMP.EMPCOD = FUNC.EMPCOD
where FUNC.FUNCOD =:Pfuncod

Eu alterei o ProvidersFlags do campo NomeEmpresa, para que o mesmo não entre nos updates e afins
Quando vou incluir um novo registro tenho uma rotina que pesquisa nas empresas e eu a trato da seguinte forma apos verificar se o result form de pesquisa foi ok..

 CdsFuncEMPCOD.AsInteger := FrmPesq.Cds.FieldByName(´EMPCOD´).AsInteger;
  CdsFuncEMPRESA.AsString := FrmPesq.Cds.FieldByName(´EMPNOM´).AsString;

Até ai tudo bem, é retornado o código e nome da empresa no DBEdit, mas quando vou gravar é levantada uma exception com violação de foreign key com a seguinte mensagem:
´[b:4cb39d0456]Project Pharma.exe raised exception class EDatabaseError with message:
´violation of FOREIGN KEY constraint ´FK_FUNC_EMP´ on table FUNCIONARIO´[/b:4cb39d0456]

Segue parte do script da tabela funcionarios..
CREATE TABLE FUNCIONARIO (
    FUNCOD  INTEGER  NOT NULL
    EMPCOD INTEGER NOT NULL
    FUNNOM VARCHAR(40) NOT NULL  

ALTER TABLE FUNCIONARIO ADD CONSTRAINT PK_FUNCOD PRIMARY KEY (FUNCOD);

ALTER TABLE FUNCIONARIO ADD CONSTRAINT FK_FUNC_EMP FOREIGN KEY (EMPCOD) REFERENCES EMPRESAS (EMPCOD);

CREATE INDEX IDX_FUNNOM ON FUNCIONARIO (FUNNOM);


Se algum amigo puder me dar uma dica sobre como resolver este problema..pois cheguei a pensar em fazer um campo de lookup no ClientDataSet, mas vou ter algumas tabelas que passariam tranquilamente 1000 registros, meu sistema ficaria uma carroça.
Sinceramente estou mais perdido do que cego em tiroteio...

Desde já agradeço e por favor desculpem o tamanho do e-mail...

Fausto


Faustoalves

Faustoalves

Responder

Posts

29/05/2005

Gandalf.nho

Dê uma olhada nesse tópico [url]http://forum.clubedelphi.net/viewtopic.php?t=63107[/url]


Responder

Gostei + 0

29/05/2005

Faustoalves

Me diga o que o tópico que vc mencionou tem haver com Lookup??

Fausto


Responder

Gostei + 0

29/05/2005

Gandalf.nho

Vc pode transformar a sua query base numa view e usar a técnica de triggers que mostro naquele tópico para tornar a view atualizável. Assim vc puxa os campos e pode trabalhar normalmente com a view


Responder

Gostei + 0

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

Aceitar