Problema no mater/detail
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
Curtidas 0
Respostas
Igomes
13/04/2005
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!
GOSTEI 0