Jump to content

Controle de transações Delphi + Zeoslib


Go to solution Solved by marcelo.hp,
  • Este tópico foi criado há 2241 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.

Edited by marcelo.hp
Link to comment
Share on other sites

  • Consultores

Bom dia!

conferiu na pasta de exemplos que tem no svn deles??

lembro de ter alguns exemplos e um deles e controle de transação!

Consultor SAC ACBr Juliomar Marchetti
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

Link to comment
Share on other 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;

 

Edited by marcelo.hp
Link to comment
Share on other sites

  • Membros Pro

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

  • Like 2
Link to comment
Share on other 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.

 

  • Like 1
Link to comment
Share on other sites

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.