Fórum Erro/duvida transação ibo #43097
16/03/2004
0
Utilizo o Delphi 7, Firebird 1.5.0.4306 e Ibo 4.2.Ie.
Tenho que realizar lançamentos de notas dos alunos de uma determinada turma nas tabelas de histórico escolar, que são duas uma mestre e outra detalhe, eu seja a detalhe recebe o código da tabela mestre.
O problema acontece na hora de inserir os dados na tabela detalhe pela segunda vez, na primeira vez que executo a procedure que realiza a inserção dos dados nas tabelas funciona beleza, mas se tento executar a procedure pela segunda vez da violação de chave estrangeira na tabela detalhe...vou até a tabela mestre e vejo que os dados não foram incluídos e como minha tabela detalhe necessita o código da mestre...então o erro é causado. Notei que se eu sair do programa após executar a procedure retornar e executá-la novamente o erro não aparece...
Penso que nas SQLs o problema não é, visto que na primeira vez o problema não aparece, talvez possa ser na transação (alguma coisa pendente que impeça que o código funcione a partir da 2X que é executado).
Ex código;
Primeiramente defino para todas as query utilizadas no processo com a mesma transação (propriedade IB_transaction ).
Em um certa parte do código a seguinte situação acontecefaço o inserção na tabela mestre através de SQL (insert) e em seguida é realizada a inserção na tabela detalhe que deve receber a chave da tabela mestre. (a inserção tb é feita por SQL - insert)
procedure Tnnota.LanarNotasnoHistrico1Click(Sender: TObject);
begin
dmq2.QinsereHistEsc.IB_Transaction:=dmtran.TranQLancAutoHistEsc;
dmq2.QinsereHistEscDisciplina.IB_Transaction:=dmtran.TranQLancAutoHistEsc;
dmtran.TranQLancAutoHistEsc.StartTransaction;
try
dmq2.qnota.first;
while not(dmq2.Qnota.EOF) do
begin
if (dmc2.QhistEscExiste.IsEmpty) and (dmc2.QhistEscExiste2.IsEmpty) then
begin //==lanca registros na tabela de historico mestre
if not dmq3.SPhistEsc.Prepared then
dmq3.SPhistEsc.Prepare;
dmq3.SPhistEsc.ExecProc;
dmq2.QinsereHistEsc.paramByName(´pcodigo´).AsInteger:=dmq3.SPhistEsc.ParamByName(´ID´).AsInteger;
dmq2.QinsereHistEsc.paramByName(´pcod_aluno´).AsInteger:=dmQ2.Qnotaalunocodigo.Value;
dmq2.QinsereHistEsc.paramByName(´pcod_escola´).AsInteger:=dmc.qescolapadraocodigo.Value;
dmq2.QinsereHistEsc.paramByName(´pcod_curso´).AsInteger:=dmQ.QcursoCodigo.Value;
dmq2.QinsereHistEsc.paramByName(´pcod_serie´).AsInteger:=dmc.QserieCursoCodigo.Value;
dmq2.QinsereHistEsc.paramByName(´pturma´).AsString:=dmc.QTurmaserieTURMA.Value;
dmq2.QinsereHistEsc.paramByName(´pobs´).AsString:=´´;
dmq2.QinsereHistEsc.paramByName(´pano´).AsInteger:=strtoint(edit1.text);
dmq2.QinsereHistEsc.ExecSQL;
dmc2.QHistEscExiste.Close;
dmc2.QHistEscExiste.Open;
//==========lança registros na historicoEscolarDisciplina detalhe
if not dmq3.SPhistEscDisciplina.Prepared then
dmq3.SPhistEscDisciplina.Prepare;
dmq3.SPhistEscDisciplina.ExecProc;
dmq2.QinsereHistEscDisciplina.paramByName(´pcodigo´).AsInteger:= dmq3.SPhistEscD.ParamByName(´ID´).AsInteger;
dmq2.QinsereHistEscDisciplina.paramByName(´cod_historicoEscolar´).AsInteger:=dmc2.QhistEscExistecodigo.Value;
dmq2.QinsereHistEscDisciplina.paramByName(´ano´).AsInteger:=strtoint(edit1.text);
dmq2.QinsereHistEscDisciplina.paramByName(´cargaHoraria´).AsInteger:=dmq2.QhoraAulaExisteHATOTAL.Value;
dmq2.QinsereHistEscDisciplina.paramByName(´cod_disciplina´).AsInteger:=dmc.QdisciplinasSeriecodigo.Value;
dmq2.QinsereHistEscDisciplina.paramByName(´cod_serie´).AsInteger:=dmc.QserieCursoCodigo.Value;
dmq2.QinsereHistEscDisciplina.paramByName(´nota´).AsCurrency:=dmq2.Qnotanotafinal.value;
dmq2.QinsereHistEscDisciplina.paramByName(´obs´).AsString:=´´;
dmq2.QinsereHistEscDisciplina.ExecSQL;
end// end do 1º if
dmq2.Qnota.Next;
end;//end do while
dmtran.TranQLancAutoHistEsc.Commit;
dmq2.Qnota.First;
except
on E: Exception do
begin
dmtran.TranQLancAutoHistEsc.Rollback;
showmessage(E.Message);
dmq2.QinsereHistEsc.IB_Transaction:=nil;
dmq2.QinsereHistEscDisciplina.IB_Transaction:=nil;
end;
end;//end do try}
end.
Trabalho não faz muito tempo com Ibo/Firebird, tenho 2 sistemas que fazem uso dessas tecnologias e só agora um problema como esse apareceu, se alguém tiver alguma idéia ou a própria solução do problema agradeço desde já.
Muito Obrigado!
Tenho que realizar lançamentos de notas dos alunos de uma determinada turma nas tabelas de histórico escolar, que são duas uma mestre e outra detalhe, eu seja a detalhe recebe o código da tabela mestre.
O problema acontece na hora de inserir os dados na tabela detalhe pela segunda vez, na primeira vez que executo a procedure que realiza a inserção dos dados nas tabelas funciona beleza, mas se tento executar a procedure pela segunda vez da violação de chave estrangeira na tabela detalhe...vou até a tabela mestre e vejo que os dados não foram incluídos e como minha tabela detalhe necessita o código da mestre...então o erro é causado. Notei que se eu sair do programa após executar a procedure retornar e executá-la novamente o erro não aparece...
Penso que nas SQLs o problema não é, visto que na primeira vez o problema não aparece, talvez possa ser na transação (alguma coisa pendente que impeça que o código funcione a partir da 2X que é executado).
Ex código;
Primeiramente defino para todas as query utilizadas no processo com a mesma transação (propriedade IB_transaction ).
Em um certa parte do código a seguinte situação acontecefaço o inserção na tabela mestre através de SQL (insert) e em seguida é realizada a inserção na tabela detalhe que deve receber a chave da tabela mestre. (a inserção tb é feita por SQL - insert)
procedure Tnnota.LanarNotasnoHistrico1Click(Sender: TObject);
begin
dmq2.QinsereHistEsc.IB_Transaction:=dmtran.TranQLancAutoHistEsc;
dmq2.QinsereHistEscDisciplina.IB_Transaction:=dmtran.TranQLancAutoHistEsc;
dmtran.TranQLancAutoHistEsc.StartTransaction;
try
dmq2.qnota.first;
while not(dmq2.Qnota.EOF) do
begin
if (dmc2.QhistEscExiste.IsEmpty) and (dmc2.QhistEscExiste2.IsEmpty) then
begin //==lanca registros na tabela de historico mestre
if not dmq3.SPhistEsc.Prepared then
dmq3.SPhistEsc.Prepare;
dmq3.SPhistEsc.ExecProc;
dmq2.QinsereHistEsc.paramByName(´pcodigo´).AsInteger:=dmq3.SPhistEsc.ParamByName(´ID´).AsInteger;
dmq2.QinsereHistEsc.paramByName(´pcod_aluno´).AsInteger:=dmQ2.Qnotaalunocodigo.Value;
dmq2.QinsereHistEsc.paramByName(´pcod_escola´).AsInteger:=dmc.qescolapadraocodigo.Value;
dmq2.QinsereHistEsc.paramByName(´pcod_curso´).AsInteger:=dmQ.QcursoCodigo.Value;
dmq2.QinsereHistEsc.paramByName(´pcod_serie´).AsInteger:=dmc.QserieCursoCodigo.Value;
dmq2.QinsereHistEsc.paramByName(´pturma´).AsString:=dmc.QTurmaserieTURMA.Value;
dmq2.QinsereHistEsc.paramByName(´pobs´).AsString:=´´;
dmq2.QinsereHistEsc.paramByName(´pano´).AsInteger:=strtoint(edit1.text);
dmq2.QinsereHistEsc.ExecSQL;
dmc2.QHistEscExiste.Close;
dmc2.QHistEscExiste.Open;
//==========lança registros na historicoEscolarDisciplina detalhe
if not dmq3.SPhistEscDisciplina.Prepared then
dmq3.SPhistEscDisciplina.Prepare;
dmq3.SPhistEscDisciplina.ExecProc;
dmq2.QinsereHistEscDisciplina.paramByName(´pcodigo´).AsInteger:= dmq3.SPhistEscD.ParamByName(´ID´).AsInteger;
dmq2.QinsereHistEscDisciplina.paramByName(´cod_historicoEscolar´).AsInteger:=dmc2.QhistEscExistecodigo.Value;
dmq2.QinsereHistEscDisciplina.paramByName(´ano´).AsInteger:=strtoint(edit1.text);
dmq2.QinsereHistEscDisciplina.paramByName(´cargaHoraria´).AsInteger:=dmq2.QhoraAulaExisteHATOTAL.Value;
dmq2.QinsereHistEscDisciplina.paramByName(´cod_disciplina´).AsInteger:=dmc.QdisciplinasSeriecodigo.Value;
dmq2.QinsereHistEscDisciplina.paramByName(´cod_serie´).AsInteger:=dmc.QserieCursoCodigo.Value;
dmq2.QinsereHistEscDisciplina.paramByName(´nota´).AsCurrency:=dmq2.Qnotanotafinal.value;
dmq2.QinsereHistEscDisciplina.paramByName(´obs´).AsString:=´´;
dmq2.QinsereHistEscDisciplina.ExecSQL;
end// end do 1º if
dmq2.Qnota.Next;
end;//end do while
dmtran.TranQLancAutoHistEsc.Commit;
dmq2.Qnota.First;
except
on E: Exception do
begin
dmtran.TranQLancAutoHistEsc.Rollback;
showmessage(E.Message);
dmq2.QinsereHistEsc.IB_Transaction:=nil;
dmq2.QinsereHistEscDisciplina.IB_Transaction:=nil;
end;
end;//end do try}
end.
Trabalho não faz muito tempo com Ibo/Firebird, tenho 2 sistemas que fazem uso dessas tecnologias e só agora um problema como esse apareceu, se alguém tiver alguma idéia ou a própria solução do problema agradeço desde já.
Muito Obrigado!
Brahma
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)