[firebase-br] RES: Transação

Moacir moacir em blusistemas.com.br
Qui Nov 5 13:45:45 -03 2009


Thiago, boa tarde eu tenho assim:

Procedure no Delphi.

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
function AbreTransacao(Fazer :Boolean;Quem : TSqlConnection) :Boolean;
begin
  Result := True;

  if not assigned(Quem) then
    quem := Conexao;

  if (not Quem.InTransaction) and (Fazer) then
    try
      Transa.TransactionID := 1;
      Transa.IsolationLevel := xilREADCOMMITTED;
      Quem.StartTransaction(Transa);
    except
      Result := False;
    end;
end;

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
function ConfirmaTransacao(Fazer :Boolean; Quem : TSqlConnection = nil)
:Boolean;
begin
  Result := True;

  if not assigned(Quem) then
    quem := Conexao;

  if Fazer then
    try
      Quem.Commit(Transa);
    except
      Result := False;
    end;
end;

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
function CancelaTransacao(Fazer :Boolean; Quem : TSqlConnection = nil)
:Boolean;
begin
  Result := True;

  if not assigned(Quem) then
    quem := Conexao;

  if Fazer then
    try
      Quem.Rollback(Transa);
    except
      Result := False;
    end;
end;

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
function ExecutaSQL(Tipo :SmallInt;
                    Mensagem1,
                    Mensagem2,
                    Mensagem3 :String;
                    LSQL :TDataSet): Boolean;
begin
  Result := ExecutaOperacaoBanco(Tipo,Mensagem1,Mensagem2,Mensagem3,LSQL);
end;

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
function ExecutaPROC(Mensagem :String; Proc :TDataSet) :Boolean;
begin
  Result := ExecutaOperacaoBanco(0,Mensagem,'','',Proc);
end;

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
function ExecutaOperacaoBanco(Tipo: SmallInt;
                              Mensagem1,
                              Mensagem2,
                              Mensagem3: String;
                              LSQL: TDataSet): Boolean;
begin
  Result := True;

  try
    if Tipo = 1 then
    begin
      if (LSQL is TSQLDataSet) then
        TSQLDataSet(LSQL).ExecSQL
      else
        if (LSQL is TSQLQuery) then
          TSQLQuery(LSQL).ExecSQL
        else
          if (LSQL is TSimpleDataSet) then
            TSimpleDataSet(LSQL).Execute
          else
            if (LSQL is TClientDataSet) then
              TClientDataSet(LSQL).Execute
            else
              begin
                Mensagem('!!!!! ERRO !!!!!',
                         'Tipo de Data Set Inválido, Rotina ExecutaSQL Tipo
1', 1);
                Exit;
              end;
    end
    else
    if Tipo = 2 then
    begin
      if (LSQL is TSQLQuery) then
        TSQLQuery(LSQL).Open
      else
        if (LSQL is TSimpleDataSet) then
          TSimpleDataSet(LSQL).Open
        else
          if (LSQL is TSQLDataSet) then
            TSQLDataSet(LSQL).Active := True
          else
          if (LSQL is TClientDataSet) then
            TClientDataSet(LSQL).Open
          else
            begin
              Mensagem('!!!!! ERRO !!!!!',
                       'Tipo de Data Set Inválido, Rotina ExecutaSQL Tipo
2', 1);
              Exit;
            end;
    end;
  except
    Result := False;
    Mensagem('!!! ATENÇÃO !!!', Mensagem1+ ':
'+Exception(ExceptObject).Message, 1);
  end;
end;


// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\

Quando vou utilizar faço assim:

procedure TFormQualquer.FazerQualqeurCoisaNobanco;
var
  vOK: Boolean;
begin
  if Messagedlg('Confirma a ........................?', mtConfirmation,
[MbYes, MbNo], 0) = MrYes then
  begin
    // Abre a Transacao
    if (not AbreTransacao(True)) then
      Exit;

    vOk := False;

    try
      try
        //------------   Inicio   ----------------\\

        with fDataM.quGenerica do
        begin
          (* Meu Comando no Banco
             Insert, Delete, Update, procedure o que for,
           *)
        end;
        //------------   Final   ----------------\\

        // Confirma a Transacao
        if (not ConfirmaTransacao(True)) then
          Exit;

        vOk := True;
      finally
        // Cancela a Transacao conforme vOK
        CancelaTransacao(not vOK);
      end;
    except
      // Faz isso pra exibir mensagem depois de Cancelar a Transacao
      on E: Exception do
      begin
        Mensagem('!!! ERRO !!! ', 'Erro ao Executar
............................ Erro: '+ E.Message, 1);
      end;
    end;
  end;
end;

----------------------------------------------------------------------------
---------------------------


-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Thiago Balbino
Enviada em: quinta-feira, 5 de novembro de 2009 13:02
Para: FireBase
Assunto: [firebase-br] Transação

Boa tarde pessoal, possuo o seguite cenário na minha aplicação:
Delphi7 + Firebird -> Usando os componentes DBExpress.

Possuo um StoredProcedure para gravar os pedidos lançados no sistema,
no delphi para executar a procedure faço assim

function GravarPedido : Longint;
begin
  Start;  -> Funcao para inicar a transação

  //  apartir daqui passo os parametros para o componente
TSQLStoredProc da paleta dbExpress
  DMRelatoriosDC.SP_GRAVAR_PEDIDO.Params[0].Value  :=
DMEstoque.cdsPedidoGravarDFIDTRANSFISCAL.Value;
  DMRelatoriosDC.SP_GRAVAR_PEDIDO.Params[4].Value  :=
DMEstoque.cdsPedidoGravarDFIDCARTEIRA.Value;
  DMRelatoriosDC.SP_GRAVAR_PEDIDO.Params[7].Value  :=
DMEstoque.cdsPedidoGravarDFIDUNIDADE.Value;
  ......
   //  Fim dos parametros para o componente  TSQLStoredProc

   //aqui executo a procedure
   DMRelatoriosDC.SP_GRAVAR_PEDIDO.ExecProc;

   Commit;   //Função minha de commit;

end;

var
  TransacaoNF    : TTransactionDesc;

//Meus Procedimentos usados acima

Procedure Start;
begin
  TransacaoNF.TransactionID  := GeraID;
  TransacaoNF.IsolationLevel := xilREADCOMMITTED;
  DM.Conexao.StartTransaction(TransacaoNF);
end;

Procedure Commit;
begin
  DM.Conexao.Commit(TransacaoNF);
end;

Porem as vezes ao dentro da função GravarPedido ocorre o seguinte
erro:  "Transaction not assigned." na hora de ExecProc.

O que pode ser ? o que pode ser o que eu estou fazendo de errado ?

-- 
Thiago de Souza Balbino

Analista de Sistemas / Programador
Meta Tecnologia e Sistemas - Muriaé / MG
(32) 3721 - 8729
(32) 8867 - 8729
MSN: thiagodeb em hotmail.com

______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista