[firebase-br] Problemas com campos Lookup e DBExpress

Danilo Rogério danilorsa_betta em yahoo.com.br
Dom Maio 29 18:39:29 -03 2005


Grande Fausto, seguinte.. dois pontos a você verificar...
 
1) Tenho quase certeza que a resposta é sim... mas, o código da empresa, que vem do seu ClientDataSet do formulario de pesquisa, está vindo corretamente?
2) Os providers flags...: você modificou apenas do clientdataset??? Eu costumo adicionar os campos na query e remover dela também...
3) você usa o reconcile error no clientdataset para ver o erro??? No caso você adiciona a unit "recerror" que está na pasta Delphi7\ObjRepos e no evento OnReconcileError coloque:
     Action := HandleReconcileError(DataSet, UpdateKind, E);
  E veja qual o real erro que vai te retornar...
 
Mas estou apostando nos providers flags da query e do clientdataset.
 
Um abraço,
Danilo Rogério

Fausto <fausto.s.a em uol.com.br> escreveu:
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
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa

		
---------------------------------
Yahoo! Mail: agora com 1GB de espaço grátis. Abra sua conta!


Mais detalhes sobre a lista de discussão lista