Array
(
)

Erro em Transaçoes

Marco Salles
   - 01 dez 2005

Tenho dois formulários que aparentemente sao identicos .. Neles eu uso uma mesma estrutura de Transaçoes..
a estrututura e essa

#Código

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

#Código
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;



eu obtenho um erro , que segue abaixo:

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

Agora tres coisas a acrescentar:


Citação:
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 se a causa do relacionamento 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


Thomaz_prg
   - 02 dez 2005

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


Marco Salles
   - 02 dez 2005


Citação:
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


Citação:
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



Marco Salles
   - 02 dez 2005

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

#Código

uses
UModulo, UForMenu;

{$R *.DFM}


no evento onshow abro as duas tabela s e inicio uma transação
#Código
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******
#Código
procedure TForm2.Button3Click(Sender: TObject);
begin
Modulo.TbAuxFam.close;
Modulo.TbAuxFam.EmptyTable;
Modulo.tbAuxFam.open;
end;



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


encerro o formulario
#Código
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

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

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

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..