Fórum Problema no mater/detail #277093
13/04/2005
0
Boa tarde pessoal,
Eu com um problema meio confuso em um master/detail
No componente DataSource da query Master, no evento onDataChange eu coloco o seguinte código:
-------------------------------------------------------------
obs: qryMaterial = Master e qryLocalizacao = Detail
-------------------------------------------------------------
if ((qryMaterial.State = dsBrowse) or (qryMaterial.State = dsBrowse)) then
begin
qryLOCALIZACAO.Close;
qryLOCALIZACAO.SQL.Clear;
qryLOCALIZACAO.SQL.ADD(´SELECT * FROM LOCALIZACAO WHERE CODMATERIAL = :CODMATERIAL´);
qryLOCALIZACAO.ParamByName(´CODMATERIAL´).Value := dsMaterial.DataSet.fieldbyname(´CODMATERIAL´).AsString;
qryLOCALIZACAO.Open;
end
else
begin
qryLOCALIZACAO.Close;
qryLOCALIZACAO.SQL.Clear;
qryLOCALIZACAO.SQL.ADD(´SELECT * FROM LOCALIZACAO WHERE CODMATERIAL = 0´);
qryLOCALIZACAO.Open;
end;
Esse código é o que realiza a função do Master/Detail.
Na query qryLocalizacao, na propriedade DataSource eu aponto para o dataSource da tabela Master, no meu caso o dsMaterial.
Até aí tudo ok. Caso eu edite o registro funciona perfeitamente, mas caso eu tente inserir um novo material e associá-lo a um local, na hora de gravar dá um erro de violação de chave estrangeira, como se estive tentando salvar primeiro o detail e o master depois, desta forma, daria o erro, pois o material ainda não existe.
Se eu ativar a opção de CacheUpdate nas querys esse erro não ocorre, mas apenas os dados da tabela master são gravados, enquando os dados da tabela detail não são.
eu gravo da seguinte forma.
Begin
dataBase.applyUpdates([tabelaMaster, tabelaDetal]);
transaction.commitRetaining;
end;
Alguém tem alguma sugestão do que posso fazer pra resolver o problema?
Eu com um problema meio confuso em um master/detail
No componente DataSource da query Master, no evento onDataChange eu coloco o seguinte código:
-------------------------------------------------------------
obs: qryMaterial = Master e qryLocalizacao = Detail
-------------------------------------------------------------
if ((qryMaterial.State = dsBrowse) or (qryMaterial.State = dsBrowse)) then
begin
qryLOCALIZACAO.Close;
qryLOCALIZACAO.SQL.Clear;
qryLOCALIZACAO.SQL.ADD(´SELECT * FROM LOCALIZACAO WHERE CODMATERIAL = :CODMATERIAL´);
qryLOCALIZACAO.ParamByName(´CODMATERIAL´).Value := dsMaterial.DataSet.fieldbyname(´CODMATERIAL´).AsString;
qryLOCALIZACAO.Open;
end
else
begin
qryLOCALIZACAO.Close;
qryLOCALIZACAO.SQL.Clear;
qryLOCALIZACAO.SQL.ADD(´SELECT * FROM LOCALIZACAO WHERE CODMATERIAL = 0´);
qryLOCALIZACAO.Open;
end;
Esse código é o que realiza a função do Master/Detail.
Na query qryLocalizacao, na propriedade DataSource eu aponto para o dataSource da tabela Master, no meu caso o dsMaterial.
Até aí tudo ok. Caso eu edite o registro funciona perfeitamente, mas caso eu tente inserir um novo material e associá-lo a um local, na hora de gravar dá um erro de violação de chave estrangeira, como se estive tentando salvar primeiro o detail e o master depois, desta forma, daria o erro, pois o material ainda não existe.
Se eu ativar a opção de CacheUpdate nas querys esse erro não ocorre, mas apenas os dados da tabela master são gravados, enquando os dados da tabela detail não são.
eu gravo da seguinte forma.
Begin
dataBase.applyUpdates([tabelaMaster, tabelaDetal]);
transaction.commitRetaining;
end;
Alguém tem alguma sugestão do que posso fazer pra resolver o problema?
Igomes
Curtir tópico
+ 0
Responder
Posts
13/04/2005
Igomes
Me desculpem, a linha:
if ((qryMaterial.State = dsBrowse) or (qryMaterial.State = dsBrowse)) then
na verdade é assim:
if ((qryMaterial.State = dsBrowse) or (qryMaterial.State = dsEdit)) then
Eu postei errado!
if ((qryMaterial.State = dsBrowse) or (qryMaterial.State = dsBrowse)) then
na verdade é assim:
if ((qryMaterial.State = dsBrowse) or (qryMaterial.State = dsEdit)) then
Eu postei errado!
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)