[firebase-br] Problemas com campos Lookup e DBExpress

Fausto fausto.s.a em uol.com.br
Dom Maio 29 13:56:52 -03 2005


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..
SQLConnection+SQLDataSet+DataSetProvider+ClientDataSet+DataSource. 
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, é retornao 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:
"Project Pharma.exe raised exception class EDatabaseError with message:
'violation of FOREIGN KEY constraint "FK_FUNC_EMP" on table FUNCIONARIO"

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



Mais detalhes sobre a lista de discussão lista