Olá galera, nesta Quick Tips, irei mostra como podemos trabalhar com transações no Delphi usando a classe TTransactionDesc, localizada na unit SqlExpr. Já adianto que para este exemplo não vamos esquecer de dar uses em SqlExpr.

Vamos adicionar um SQLConnection configurado para o seu banco de dados: não importa qual seja. Logo em seguida vamos adicionar um Button(BtnIncluir), como mostra o exemplo:

Inicialmente vamos criar dois records para ilustrarmos o exemplo. Veja a declaração dos dois records:

type
 RCliente = Record
 IDCliente, Descricao: String;
 End;
  
 RTelefone = Record
 IDTelefone, IDCliente, Descricao: String;
 End;

A estrutura das duas tabelas que irei implementar é:

  • Cliente
    IDCliente
    Descricao
  • Telefone
    IDTelefone
    IDCliente
    Descricao

Na seção private, vamos incluir duas procedures IncluirCliente e IncluirTelefone:

private
 { Private declarations }
 procedure IncluirCliente;
 procedure IncluirTelefone;

Agora vamos implementar cada uma das procedures:

#IncluirCliente 
 procedure TFrmTransacao.IncluirCliente;
 Var
 C : RCliente;
 xQry : TSQLQuery;
 begin
     C.IDCliente := '1';
     C.Descricao := 'Wesley Yamazack';
     xQry := TSQLQuery.Create(Self);
     xQry.SQLConnection := SqlConnectionDevMedia;
     xQry.SQL.Add(' INSERT INTO CLIENTE(IDCLIENTE, DESCRICAO )' );
     xQry.SQL.Add(' VALUES ( '+ C.IDCliente + ' , ' + QuotedStr(C.Descricao) + ' ) ' );
     xQry.ExecSQL;
     ShowMessage('Cliente incluído com sucesso');
 end;
#IncluirTelefone
 procedure TFrmTransacao.IncluirTelefone;
 Var
     T : RTelefone;
     xQry : TSQLQuery;
 begin
     T.IDTelefone := '1';
     T.IDCliente := '1';
     T.Descricao := '3333-3333';
     xQry := TSQLQuery.Create(Self);
     xQry.SQLConnection := SqlConnectionDevMedia;
     xQry.SQL.Add(' INSERT INTO TELEFONE(IDTELEFONE, IDCLIENTE, DESCRICAO ) ' );
     xQry.SQL.Add(' VALUES ( '+ T.IDTelefone + ' , ' + T.IDCliente + ' , ' +         
     QuotedStr(T.Descricao) + ' ) ' );
     xQry.ExecSQL;
     ShowMessage('Telefone incluído com sucesso');
 end;
 end.

E por último vamos a implementação do BtnIncluir:

procedure TFrmTransacao.BtnIncluirClick(Sender: TObject);
 Var
     Trans : TTransactionDesc;
     ID : Integer;
 begin
     SqlConnectionDevMedia.StartTransaction(Trans);
     Trans.TransactionID := Random(ID);
     IncluirCliente;
     IncluirTelefone;
     SqlConnectionDevMedia.Commit(Trans);
 end;

Por que usar transação?

Imagine que você só possa incluir um cliente, se ele tiver um telefone, e por um acaso, deu erro ao incluir um telefone, o seu cliente não poderá ficar sem um telefone. Com a transação o processo só é concluído, ou seja, os dois registros só são criados se ambos estiverem corretos, do contrário nenhum dos dois será incluído.

Fico por aqui ate à próxima Quick Tips. Baixe o exemplo completo neste post.