Fórum Como fazer o relacionamento dbexpress master detail atraves de datasetfields #376467

27/04/2010

0

Nao sei mais o q fazer tenho sqldatasets e clientdatasets no meu form todos com os campos chaves com a propriedade required pra false mas mesmo assim toda vez q vou gravar da erro de chave.
Nao sei se e pq to fazendo o relacionamento atraves de datasetfields mas todos os compoenentes sqldatasets e clientdatasets estao com o campo chave setado pra false na propriedade required.


como devo fazer? ja segui os videos do site mas nao funciona.



Eduardo Jr

Eduardo Jr

Responder

Posts

28/04/2010

Fábio Cruz

Responder

Gostei + 0

28/04/2010

Ader Santos

Amigo, qual versão do Delphi e DB que está usando?
Responder

Gostei + 0

28/04/2010

Eduardo Jr

Ola!

Delphi 2006 e Firebird 2.1. Eu seto as propriedades required pra false mas mesmo assim ta dndo erro.

obrigado desde ja
Responder

Gostei + 0

28/04/2010

Wilson Junior

Responder

Gostei + 0

28/04/2010

Eduardo Jr

ola Wilson obrigado mas o meu relacionamento ta funcionando o q nao ta funcionando e q ao inserir dois registros ele da erro de chave.Ela ta gravando 2 registros com o mesmo valor pra chave primaria mesmo eu marcando a opcao required pra false ja q meu banco tem um autoiincremento.


obrigado
Responder

Gostei + 0

28/04/2010

Wilson Junior

Post o seu código aqui para analisar-mos e poder lhe ajudar melhor.
Responder

Gostei + 0

28/04/2010

Eduardo Jr

Uso este codigo no botao salvar e no botao fechar eu dou um applyupdates na tabela mae.


    With DM.cdsReceitas do
    Begin
      Insert;
      FieldbyName('COD_CLI').AsInteger := DM.cdsClientes.FieldByName('CODIGO').AsInteger;
      FieldByName('NOME_CLIENTE').AsString := DM.cdsClientes.FieldByName('NOME').AsString;
      FieldByName('MEDICO').AsString := edtMedico.Text;
      FieldByName('DATA').AsString := DateToStr(Now);
      FieldbyName('RECEITA').AsString := mReceita.Text;
      Post;
    end;


obrigado
Responder

Gostei + 0

28/04/2010

Wilson Junior

Qual o seu campo chave? Em que momento você está setando o campo chave?
Responder

Gostei + 0

28/04/2010

Eduardo Jr

Bem meu campo chave da tabela RECEITAs chama COD_RECEITAS e ele é autoincremento.Ja dei duplo clique no clientdataset e no sqldataset e setei a propriedade required pra false conforme ja vi em videos ensinando isso.

obrigado
Responder

Gostei + 0

28/04/2010

Wilson Junior

No Field do ClientDataSet, a propriedade ProviderFlags está com o pfInKey marcada como True?
Responder

Gostei + 0

28/04/2010

Eduardo Jr

Sim, mas dava o erro quando estava em false tambem...Esta tabela RECEITAs ta sendo ligada a tabela clientes atraves do campo COD_CLI usando o sistema de DataSetField. Coloquei um DataSource liguei a propriedade Datasource do sqlReceitas(sqldataset) como é feito normalmente nao e? Mas eu ja desfis o relacionamento apagando o DS e adicionando um datasetprovider e da o mesmo erro

obrigado
Responder

Gostei + 0

28/04/2010

Ader Santos

Bom, já que seu campo é autoinc, entendo que você criou uma trigger para isso. Vou chamar suas tabelas sugestivamente de MASTER e DETAIL:   No formulário, qdo você cria um novo item MASTER, ele deve ser gravado imediatamente na tabela do BD, para que qdo for lançar os itens DETALHE, este campo já esteja efetivado no BD. Ok?   Digo isso porquê, qdo você cria um novo item no formulário, estes dados ainda estão em memória e não foram persistidos na tabela do BD, logo: não tem como inserir itens na DETALHE se o item MASTER ainda não foi gravado! É necessário ter, previamente, o código do item MASTER.   Há várias formas de resolver isto, vou dar idéia em duas: criar um botão no form para gravar o novo item MASTER. criar uma função no form que contém a sqlConnection para gerar o código do item MASTER lá no BD.
Responder

Gostei + 0

28/04/2010

Eduardo Jr

Ola Ader!

So que minha tabela master eu  nao faço inclusao nenhuma nela.Eu uso ela so pra listar os clientes da empresa e a tabela detalhe é onde eu incluo receitas e jogo o codigo do cliente pra depois eu listar as receitas por cliente.Tipo eu clico no cliente rodrigo e ele lista as receitas q foram gravadas pra ele.

obrigado
Responder

Gostei + 0

28/04/2010

Ader Santos

Peraí, num entendi. No sétimo post abaixo, você disse que faz ApplyUpdate na tab. mae...
Responder

Gostei + 0

28/04/2010

Eduardo Jr

sim , pq eu vi nos videos q tinha q dar applyupdates na tabela mae  mas nao to inserindo nada na tabela mae.
Fiz umas mudancas aqui ao inves de usar datasetfield eu fiz a sql do sqldataset(sqlreceitas) select * from receitas where cod_cli =:COD e no onDataChange do datasource q ta ligado a tabela clientes eu pus o codigo:

cdsReceitas.params[0].value := cdsClientes.fieldbyname('codigo').asinteger ja consigo cadastrar varios registros mas ele nao ta mostrando as receitas pra cada cliente entendeu? tipo eu abro outro cliente as receitas pro cliente b aparecem tambem.

obrigado
Responder

Gostei + 0

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

Aceitar