Erro em Transaçoes

01/12/2005

[b:3a2f565a04]Tenho dois formulários que aparentemente sao identicos .. Neles eu uso uma mesma estrutura de Transaçoes..[/b:3a2f565a04]
a estrututura e essa

procedure TFormAtualizarFatorContribuicaoInss.FormShow(Sender: TObject);
begin
//bla bla bla ...
modulo.Dbcad.StartTransaction; //aqui eu inicio uma transação
end;


:arrow: so que nesta linha de comando

procedure CarregarNovosValoresParaTabelaEncargos;
var
i:integer;
texto:String;
begin
Modulo.TbEncFun.close;
Modulo.TbEncFun.EmptyTable; //*********Nesta linha de comando
Modulo.tbencfun.open;
bla bla bla...
end;
end;


:cry: :cry: :cry: :cry:
[b:3a2f565a04][color=red:3a2f565a04]eu obtenho um erro , que segue abaixo:[/color:3a2f565a04][/b:3a2f565a04]

[URL=http://imageshack.us][img:3a2f565a04]http://img187.imageshack.us/img187/1238/imagemtabelaparadoxerro6wz.jpg[/img:3a2f565a04][/URL]

Agora tres coisas a acrescentar:

1) se eu tirar a inicialização da transação do show do form e colocar apos a linha que esta dando erro , o programa funfa normalmente. 2)o problema é que eu tenho um outro formulário identico , com esta mesma estrutura e logiga e não da este erro nenhum 3)a unica diferença entre esses dois formulários , é que no formulário que esta dando problema a tabela é detalhe , e no outro formulário a tabela não tem nenhum relacionamento



:?: :?: :?: :?: :?:
:arrow: eu não sei[b:3a2f565a04] se a causa do relacionamento [/b:3a2f565a04]pode ser responsavel por este erro...
:arrow: No fundo estou sem saber o porque e a principio não gostaria de mexer na estrutura do formulário e sim tentar entender o conceito envolvido e o porque do erro...

Muito obrigado... :P :P :P


Marco Salles

Respostas

02/12/2005

Thomaz_prg

Tenta encerrar a transação antes da linha que tá dando erro.


Responder Citar

02/12/2005

Marco Salles

Tenta encerrar a transação antes da linha que tá dando erro.


mas a questão esta ai ... Eu preciso da transação antes desta linha

Porque o que eu faço na verdade é apagar todos os dados desta tabela e inserir novos dados. Eu preciso do inicio da transação antes da linha.. Porque se algo der errado eu consigo recuperar os dados iniciais.

Tres coisas no meu ponto de vista são importantes como eu disse anteriormente

1) se eu tirar a inicialização da transação do show do form e colocar apos a linha que esta dando erro , o programa funfa normalmente. 2)o problema é que eu tenho um outro formulário identico , com esta mesma estrutura e logiga e não da este erro nenhum 3)a unica diferença entre esses dois formulários , é que no formulário que esta dando problema a tabela é detalhe , e no outro formulário a tabela não tem nenhum relacionamento



Responder Citar

02/12/2005

Marco Salles

Olha so , depois desta ultima conversa com o amigo thomaz_prg , resolvi fazer um teste simples , com tres botoes e um novo formulario

Este formulario , não faz nada , alem de abrir uma transação e excluir uns registros e depois cancelar estas alteraçoes

Neste formulario tem tres botoes e um codigo bem simplificado

uses
 UModulo, UForMenu;

{$R *.DFM}


no evento onshow abro as duas tabela s e inicio uma transação
procedure TForm2.FormShow(Sender: TObject);
begin
Modulo.TbEncFun.open;
modulo.tbauxfam.open;
modulo.Dbcad.StartTransaction;
end;


Limpo a tabela EncargosFuncionarios
procedure TForm2.Button1Click(Sender: TObject);
begin
Modulo.TbEncFun.close;
Modulo.TbEncFun.EmptyTable;
Modulo.tbencfun.open;
end;

Limpo a tabela Auxilio Familia******
procedure TForm2.Button3Click(Sender: TObject);
begin
Modulo.TbAuxFam.close;
Modulo.TbAuxFam.EmptyTable;
Modulo.tbAuxFam.open;
end;



Cancelo a transação
procedure TForm2.Button2Click(Sender: TObject);
begin
 modulo.Dbcad.Rollback;
end;


encerro o formulario
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
modulo.tbencfun.Close;
modulo.tbauxfam.close;
end;


Qual a diferença entre clicar o button2 e o button3.. Aparentemente nenhuma diferença

So que no botão 2 temos um erro... Verifiquei mais a fundo e percebi uma diferença nas definiçoes dos dois componentes table

[b:e47599dd81]o componente table1 que aponta para tabela encargos tem na sua definição de DabaseName no objecto inspector um objeto DataBase que aponta para o Aliase
o componente table2 que aponta para tabela SalarioFamilia tem na sua definição de DabaseName no objecto inspector o proprio Aliase [/b:e47599dd81]

Alterei então a definição do DataBase do Table2 -->>> Isto é , apontei tb para o componenente DataBase

Feito isto pude verificar o mesmo tipo de erro

[b:e47599dd81]Conclui então que o método EmptyTable não pode ser aplicado quando a propriedade DataBaseName estiver apontando para um componente DataBase.. A Razão disso eu não sei , talves os mais teoricos possam explicar explicar ou tentar explicar esta conclusão..[/b:e47599dd81]


Responder Citar