Como fazer o relacionamento dbexpress master detail atraves de datasetfields

Delphi

27/04/2010

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

Curtidas 0

Respostas

Fábio Cruz

Fábio Cruz

27/04/2010

GOSTEI 0
Ader Santos

Ader Santos

27/04/2010

Amigo, qual versão do Delphi e DB que está usando?
GOSTEI 0
Eduardo Jr

Eduardo Jr

27/04/2010

Ola!

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

obrigado desde ja
GOSTEI 0
Wilson Junior

Wilson Junior

27/04/2010

GOSTEI 0
Eduardo Jr

Eduardo Jr

27/04/2010

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
GOSTEI 0
Wilson Junior

Wilson Junior

27/04/2010

Post o seu código aqui para analisar-mos e poder lhe ajudar melhor.
GOSTEI 0
Eduardo Jr

Eduardo Jr

27/04/2010

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
GOSTEI 0
Wilson Junior

Wilson Junior

27/04/2010

Qual o seu campo chave? Em que momento você está setando o campo chave?
GOSTEI 0
Eduardo Jr

Eduardo Jr

27/04/2010

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
GOSTEI 0
Wilson Junior

Wilson Junior

27/04/2010

No Field do ClientDataSet, a propriedade ProviderFlags está com o pfInKey marcada como True?
GOSTEI 0
Eduardo Jr

Eduardo Jr

27/04/2010

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
GOSTEI 0
Ader Santos

Ader Santos

27/04/2010

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.
GOSTEI 0
Eduardo Jr

Eduardo Jr

27/04/2010

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
GOSTEI 0
Ader Santos

Ader Santos

27/04/2010

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

Eduardo Jr

27/04/2010

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
GOSTEI 0
Ader Santos

Ader Santos

27/04/2010

Você usando esta sintaxe, ele vai retornar tudo mesmo, pois está setando o parâmetro com todos os ('código') que houver. Tente: cdsReceitas.params[0].value := txtEdit('codigo').asinteger, onde txtEdit é o nome do componente que contém o código do 'paciente' no formulário de 'pacientes'. Não se esqueça de dar uses para o form de 'pacientes'.
GOSTEI 0
Eduardo Jr

Eduardo Jr

27/04/2010

Mas eu nao to usando form e sim um DBGrid conectado ao clientdataset cdsClientes onde a tabela cliente tem um campo codigo que é o codigo do cliente. Eu quero pegar o cliente q ta selecionado no dbgrid.

obrigado
GOSTEI 0
Eduardo Jr

Eduardo Jr

27/04/2010

O que eu nao entende é que de vez em quando eu rodo ai todos os clientes tem receitas cadastradas outra vez eu rodo nenhum tem.

Pra mim entrar na tela de receitas eu tenho q dar um duplo click no dbgrid ai ja tem um cliente selecionado certo?
GOSTEI 0
Ader Santos

Ader Santos

27/04/2010

GOSTEI 0
Eduardo Jr

Eduardo Jr

27/04/2010

Esse video eu ja vi.Ele manda dar o apply na tabela mae é o q eu tava fazendo mesmo assim dando erro de chave. Como eu disse eu ja resolvi o problema da chave primaria agora eu consigo gravar varios registros mas eu desfiz o relacionamento atraves de datasetfield agora to alimentando o parametro da sqldataset no evento ondatachange do datasource ligado ao CDS clientes mas nao ta funcionando pois ele mostra as receitas cadastradas pra 1 cliente ele mostra pra todos clientes.
GOSTEI 0
Ader Santos

Ader Santos

27/04/2010

Posta o código pragente dar uma olhada.
GOSTEI 0
POSTAR