Como fazer o relacionamento dbexpress master detail atraves de datasetfields
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.
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
Curtidas 0
Respostas
Fábio Cruz
27/04/2010
Qual video vc seguiu? Pois segui uma video aula e funcionou perfeito
Segue o link
https://www.devmedia.com.br/post-11097-Rad-Studio-2007-DBX4-e-Firebird-2-0-Aplicacao-comercial-de-vendas-do-Inicio-ao-Fim-Parte-12-Relacionamentos-Master-Detail.html
Segue o link
https://www.devmedia.com.br/post-11097-Rad-Studio-2007-DBX4-e-Firebird-2-0-Aplicacao-comercial-de-vendas-do-Inicio-ao-Fim-Parte-12-Relacionamentos-Master-Detail.html
GOSTEI 0
Ader Santos
27/04/2010
Amigo, qual versão do Delphi e DB que está usando?
GOSTEI 0
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
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
27/04/2010
De uma olhada neste link https://www.devmedia.com.br/articles/post-6474-Formulario-Mestre-Detalhes-com-DBExpress-e-Firebird.html
Espero ter colaborado.
Espero ter colaborado.
GOSTEI 0
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
obrigado
GOSTEI 0
Wilson Junior
27/04/2010
Post o seu código aqui para analisar-mos e poder lhe ajudar melhor.
GOSTEI 0
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
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
27/04/2010
Qual o seu campo chave? Em que momento você está setando o campo chave?
GOSTEI 0
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
obrigado
GOSTEI 0
Wilson Junior
27/04/2010
No Field do ClientDataSet, a propriedade ProviderFlags está com o pfInKey marcada como True?
GOSTEI 0
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
obrigado
GOSTEI 0
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
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
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
27/04/2010
Peraí, num entendi. No sétimo post abaixo, você disse que faz ApplyUpdate na tab. mae...
GOSTEI 0
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
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
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
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
obrigado
GOSTEI 0
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?
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
27/04/2010
Amigo, dê uma olhada nesta video aula, vai resolver:
https://www.devmedia.com.br/post-5630-Mini-curso-de-ClientDataSet-Parte-VI--DataSetFields.html
GOSTEI 0
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
27/04/2010
Posta o código pragente dar uma olhada.
GOSTEI 0