PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

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 acontecefaç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

Brahma

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar