quarta-feira, 4 de julho de 2007

Rotinas em DELPHI para operacionalização de uma Transação com ADO

Saudações alunos e interessados,

abaixo segue um conjunto de rotinas computacionais cujo principal objetivo é realizar duas tarefas específicas que fazem parte de uma certa transação sobre um banco de dados, por meio dos componentes "ADOConnection" e "ADOQuery".

Basicamente, esta TRANSAÇÃO controla as seguintes atualizações no banco de dados:
Tarefa_1: responsável pela inserção de um novo lançamento contábil de uma receita, cuja conta bancária e conta de nível_4 precisa ser especificada, juntamente com o valor do lançamento, em uma tabela denominada "Lançamentos";
Tarefa_2: responsável pela inserção dos elementos, presentes em uma lista, que representam as atividades que irão participar de um "rateio" e que estão associados ao lançamento inserido na tarefa anterior. Cada rateio mapeia um código exclusivo, uma atividade específica e um valor parcial, na tabela denominada "Rateios".
Então, a transação somente se completará se as duas tarefas forem realizadas com sucesso. Se não, um RollBack_trans é solicitado.

Seguem os artefatos de software:

//==============================================================================
procedure Talx_frm_sgc_lancamentos_receitas.alx_voi_Operar_Transacao_Insercao();
begin
try
alx_frm_data_module.ADOConnection_SGC.BeginTrans();
//----------------
if( self.alx_boo_Tarefa_1_Transacao_Realizada_Com_Sucesso() ) then begin //... insere o novo lançamento ...
if( self.alx_boo_Tarefa_2_Transacao_Realizada_Com_Sucesso() ) then begin //... insere as atividades associadas ...
alx_frm_data_module.ADOConnection_SGC.CommitTrans();
showmessage('O lançamento foi inserido no banco de dados com sucesso!');
end
else begin
alx_frm_data_module.ADOConnection_SGC.RollbackTrans();
showmessage('a transação NÃO completou-se: O lançamento NÃO foi inserido no banco de dados! você deve reespecificá-lo novamente.');
end;
end;
//----------------
//... preparar mensagens e botões adequados à pos-transação (sucesso ou não...)
//----------------
except
on E:Exception do begin
showmessage('Ôpa, ocorreu um erro ao realizar a transação de inserção de nova receita com contas para rateio! Veja: ' + E.Message);
end;
end;
end;
//==============================================================================
function Talx_frm_sgc_lancamentos_receitas.alx_boo_Tarefa_1_Transacao_Realizada_Com_Sucesso(): Boolean;
var
alx_str_sql_text : TStrings;
alx_boo_apoio : Boolean;
alx_int_lan_id : Integer;
alx_dat_lan_data : TDate;
alx_int_lan_cn4_id : Integer;
alx_int_lan_cb_id : Integer;
alx_flo_lan_valor : Real;
alx_str_lan_doc : String;
alx_str_lan_obs : String;
alx_int_lan_user_id: Integer;
begin
try
alx_int_lan_id := self.alx_int_Pegar_Lancamentos_Novo_Id();
alx_dat_lan_data := strtodate(self.Edit3.Text);
alx_int_lan_cn4_id := strtoint(self.Edit1.Text);
alx_int_lan_cb_id := strtoint(self.Edit2.Text);
alx_flo_lan_valor := strtofloat(self.Edit6.Text);
alx_str_lan_doc := self.Edit4.Text;
alx_str_lan_obs := self.Edit5.Text;
alx_int_lan_user_id:= self.alx_int_user_id;
//--------------
alx_str_sql_text := TStringList.Create();
alx_str_sql_text.Add('INSERT INTO LANCAMENTOS VALUES (:, :, :, :, :, :, :, :, True) ; ');
self.ADOQuery_Apoio.Active:= False;
self.ADOQuery_Apoio.SQL.Clear();
self.ADOQuery_Apoio.SQL:= alx_str_sql_text;
self.ADOQuery_Apoio.Parameters[0].Value := alx_int_lan_id;
self.ADOQuery_Apoio.Parameters[1].DataType:= FTDate;
self.ADOQuery_Apoio.Parameters[1].Value := alx_dat_lan_data;
self.ADOQuery_Apoio.Parameters[2].Value := alx_int_lan_cn4_id;
self.ADOQuery_Apoio.Parameters[3].Value := alx_int_lan_cb_id;
self.ADOQuery_Apoio.Parameters[4].DataType:= FTFloat;
self.ADOQuery_Apoio.Parameters[4].Value := alx_flo_lan_valor;
self.ADOQuery_Apoio.Parameters[5].Value := alx_str_lan_doc;
self.ADOQuery_Apoio.Parameters[6].Value := alx_str_lan_obs;
self.ADOQuery_Apoio.Parameters[7].Value := alx_int_user_id;
//--------------
self.ADOQuery_Apoio.ExecSQL();
alx_boo_apoio:= True;
self.Edit10.Text:= inttostr(alx_int_lan_id); //... fornece o verdadeiro id do lançamento que foi inserido ...
//--------------
except
on E: Exception do begin
alx_boo_apoio:= False;
ShowMessage('Ôpa, ocorreu um erro ao realizar a Tarefa_1 da transação que insere um lançamento de receita! Veja: ' + E.Message);
end;
end;
result:= alx_boo_apoio;
end;
//==============================================================================
function Talx_frm_sgc_lancamentos_receitas.alx_boo_Tarefa_2_Transacao_Realizada_Com_Sucesso(): Boolean;
var
alx_int_i : Integer;
alx_int_rateio_lan_id : Integer;
alx_int_rateio_ae_id : Integer;
alx_flo_rateio_parcial: Real;
alx_boo_apoio : Boolean;
begin
try
alx_int_rateio_lan_id := strtoint(self.Edit10.Text);
for alx_int_i:= 0 to (self.alx_lst_lista_atividades.Count - 1) do begin
alx_int_rateio_ae_id := strtoint( (TObject(self.alx_lst_lista_atividades.Items[alx_int_i]) as TStrings).Strings[0] );
alx_flo_rateio_parcial:= strtofloat( (TObject(self.alx_lst_lista_atividades.Items[alx_int_i]) as TStrings).Strings[2] );
if (self.alx_boo_Tarefa_2_Transacao_Rateio_Inserido_Com_Sucesso(alx_int_rateio_lan_id, alx_int_rateio_ae_id, alx_flo_rateio_parcial)) then begin
alx_boo_apoio:= True;
end
else begin
alx_boo_apoio:= False;
break;
end;
end;
except
on E:Exception do begin
alx_boo_apoio:= False;
showmessage('Ôpa, ocorreu um erro ao preparar a Tarefa_2 da transação de lançamento de nova receita! Veja: ' + E.Message);
end;
end;
result:= alx_boo_apoio;
end;
//==============================================================================
function Talx_frm_sgc_lancamentos_receitas.alx_boo_Tarefa_2_Transacao_Rateio_Inserido_Com_Sucesso(alx_int_lan_id: Integer ; alx_int_atividade_id: Integer ; alx_flo_valor: Real ): Boolean;
var
alx_str_sql_text : TStrings;
alx_int_rateio_id: Integer;
alx_boo_apoio : Boolean;
begin
try
alx_int_rateio_id:= self.alx_int_Pegar_Rateios_Novo_Id();
alx_str_sql_text := TStringList.Create();
alx_str_sql_text.Add('INSERT INTO RATEIOS VALUES (:, :, :, :, True); ');
self.ADOQuery_Apoio.Active:= False;
self.ADOQuery_Apoio.SQL.Clear();
self.ADOQuery_Apoio.SQL:= alx_str_sql_text;
self.ADOQuery_Apoio.Parameters[0].Value := alx_int_rateio_id;
self.ADOQuery_Apoio.Parameters[1].Value := alx_int_lan_id;
self.ADOQuery_Apoio.Parameters[2].Value := alx_int_atividade_id;
self.ADOQuery_Apoio.Parameters[3].DataType:= FTFloat;
self.ADOQuery_Apoio.Parameters[3].Value := alx_flo_valor;
//--------------
self.ADOQuery_Apoio.ExecSQL();
alx_boo_apoio:= True;
//--------------
except
on E:Exception do begin
alx_boo_apoio:= False;
showmessage('Ôpa, ocorreu um erro ao inserir um registro em Rateios! Veja: ' + E.Message);
end;
end;
result:= alx_boo_apoio;
end;
//==============================================================================
function Talx_frm_sgc_lancamentos_receitas.alx_int_Pegar_Rateios_Novo_Id(): Integer;
var
alx_str_sql_text: TStrings;
alx_int_apoio : Integer;
begin
try
alx_str_sql_text:= TStringList.Create();
alx_str_sql_text.Add('SELECT MAX(RATEIO_ID) FROM RATEIOS ');
self.ADOQuery_Apoio.Active:= False;
self.ADOQuery_Apoio.SQL.Clear();
self.ADOQuery_Apoio.SQL:= alx_str_sql_text;
self.ADOQuery_Apoio.Active:= True;
//-----------------
alx_int_apoio:= self.ADOQuery_Apoio.Fields[0].AsInteger + 1;
self.ADOQuery_Apoio.Active:= False;
//-----------------
except
on E: Exception do begin
alx_int_apoio:= 0;
showmessage('Ôpa, ocorreu um erro ao buscar o novo código para um Rateio! Veja: ' + E.Message);
end;
end;
result:= alx_int_apoio;
end;
//==============================================================================

Nenhum comentário: