Ir para conteúdo
  • Cadastre-se

dev botao

Controle de transações Delphi + Zeoslib


Ver Solução Respondido por marcelo.hp,
  • Este tópico foi criado há 2838 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Pessoal, boa noite.

Gostaria de recorrer a experiência dos colegas do grupo que já utilizam a Zeoslib.

Trabalho atualmente com Delphi Seattle + ADO + SQLServer.

O controle de transações feito pelo aplicativo é bastante convencional.

BeginTrans;
try
    grava tab1
    grava tab2
    grava tabN...
    CommitTrans;    
except
    RollbackTrans;
end

Tentei aplicar a mesma estrutura de controle de transação com a Zeoslib, mas gera os erros “Invalid operation in AutoCommit mode” e “Invalid operation in non AutoCommit mode”.

Possivelmente estou configurando alguma coisa errada no componente.

Tentei trabalhar as propriedades autocommit e o transactisolationlevel, mas os erros permanecem.

Executando a gravação sem a estrutura de controle e deixando como autocommit e tiReadCommitted os dados são gravados corretamente. Mas perco o controle da transação.

Os testes foram feitos com a Zeoslib versão 7.2.

Desde já agradeço.

Editado por marcelo.hp
Link para o comentário
Compartilhar em outros sites

  • Solution

Juliomar, obrigado pelo retorno.

Quando comecei o projeto e identifiquei o problema, fiz alguns estudos com os exemplos. Mas achei melhor revisar novamente depois do seu post.

Confesso que não identifiquei exemplo onde eu consiga aplicar as atualizações realizadas em um único processo, que afetam mais de uma tabela, em uma única transação. Estou baixando do svn http://svn.code.sf.net/p/zeoslib/code-0/branches/testing-7.2. Se você baixa de outra url me avise por favor.

Fiz algumas pesquisas no fórum e li que você tem várias soluções inclusive PDV com Zeos.

No meu caso atendo transportadoras.

Como exemplo, poderia nos dizer como você trata a transação no Zeoslib ao confirmar uma venda (nota, produtos, impostos)?

--

Abaixo o método que fiz para configurar o TZConnection.

function TRDBMS.doBDConfig():WideString;
const
  sPass:String='senha';
var
  sSGDB,sHost,sLib,sDB:String;
  iPort:Integer;
begin
  result := '';
  try
    sSGDB := objUtils.LerIni('DSGD.ini','GESTOR','SGDB','');
    sHost := objUtils.LerIni('DSGD.ini','GESTOR','Host','');
    sLib  := objUtils.LerIni('DSGD.ini','GESTOR','Lib','');
    iPort := objUtils.LerIni('DSGD.ini','GESTOR','Porta',0);
    sDB   := objUtils.LerIni('DSGD.ini','GESTOR','Banco','');
    if Trim(sSGDB) <> ''  then
    begin
      Case AnsiIndexStr(sSGDB,['MSSQL','MYSQL']) of
        0:begin
            objConn.User := 'sa';
            objConn.Protocol := 'mssql';
          end;
        1:begin
            objConn.User := 'root';
            objConn.Protocol := 'mysql-5';
          end;
      End;
      objConn.AutoCommit := True;
      objConn.TransactIsolationLevel := tiReadCommitted;
      objConn.HostName := sHost;
      objConn.LibraryLocation := sLib;
      objConn.Database := sDB;
      objConn.Password := sPass;
      if iPort > 0 then
        objConn.Port := iPort;
    end;
  except on e:exception do
    begin
      result := e.Message;
    end;
  end;
end;

--

Abaixo, parte do código de um teste bastante simples para gravar duas tabelas na mesma transação.
qry = TZQuery;
cds = TClientDataSet;
Como é um teste, tenho um TEdit em tela onde digito a chave de integridade das tabelas.

  app.Banco.Conexao.StartTransaction;
  try
    qry.Post;
    cds.ApplyUpdates(0);
    app.Banco.Conexao.Commit;
    app.Utils.MsgAviso('Gravou!');

  except on e:exception do
    begin
      app.Banco.Conexao.Rollback;
      app.Utils.MsgErro('Erro '+e.Message);
    end;
  end;

 

Editado por marcelo.hp
Link para o comentário
Compartilhar em outros sites

Vc não, necessariamente, precisa usar TClientDataSet, quando vc trabalha com Zeos, a TZQuery, consegue trabalhar off-line.

O seu problema está em:

TZAbstractConnection.StartTransaction; Aqui é chamado a verificação do contador de transação.

Veja aqui: Unit: ZAbstractConnection Classe: TZAbstractConnection Metodo: CheckAutoCommitMode

procedure TZAbstractConnection.CheckAutoCommitMode;
begin
  if not FAutoCommit and (FExplicitTransactionCounter = 0) then
    raise EZDatabaseError.Create(SInvalidOpInNonAutoCommit);
end;      

Em anexo estou deixando um pdf que irá te ajudar.

 

Tutorial_Zeos_Especial_Em_Portugues_BR.rar

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Giquieu, bom dia!

Agradeço o material que disponibilizou, foi de grande ajuda.

Na primeira página do tutorial identifiquei meu erro.

No programa de teste executei uma instrução SELECT e tive o descuido de já em seguida executar o ZConn.StartTransaction.

Depois de corrigido, os testes de integridade funcionaram 100% tanto com instrução DML direta, quanto com o uso dos componentes.

Muito obrigado.

Juliomar, obrigado também.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2838 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.