Transação Manual para Ações

Ao cadastrar uma ação do tipo "Rotina no Banco de Dados", "Rotina Java" ou "Script (Java Script)" é possível marcar a opção "Controle de transação manual". Essa opção vem desmarcada por padrão.

Caso esteja marcada, o controle de transação com o banco de dados deve ser feito no seu respectivo script, de acordo com sua necessidade.

Se estiver desmarcada, o funcionamento continua da mesma forma que antes, ou seja, o sistema automaticamente controla a transação e faz o commit no final da execução do script e o rollback, caso haja erro na execução do script.

É necessário incluir o "jape.jar" no buildpath para importar o JapeSession e SessionHandle. A seguir, temos um exemplo de script Java para controlar transação manual:

import br.com.sankhya.extensions.actionbutton.AcaoRotinaJava;

import br.com.sankhya.extensions.actionbutton.ContextoAcao;

import br.com.sankhya.extensions.actionbutton.QueryExecutor;

import br.com.sankhya.extensions.actionbutton.Registro;

import br.com.sankhya.jape.core.JapeSession;

import br.com.sankhya.jape.core.JapeSession.SessionHandle;

public class TesteBotaoAcaoGustavo implements AcaoRotinaJava {

 public void doAction(final ContextoAcao ctx) throws Exception {

         SessionHandle hnd = null;

         final Registro[] linhas = ctx.getLinhas();

         try {

                 hnd = JapeSession.open();

                 hnd.execWithTX(new JapeSession.TXBlock() {

                         public void doWithTx() throws Exception {

                                 int i = 0;

                                 while (i < linhas.length) {

                                         linhas[i].setCampo("TESTE", 1);

                                         linhas[i].save();

                                         i++;

                                 }

                         }

                 });

                 hnd.execWithTX(new JapeSession.TXBlock() {

                         public void doWithTx() throws Exception {

                                 int i2 = 0;

                                 while (i2 < linhas.length) {

                                         linhas[i2].setCampo("TESTE", 2);

                                         linhas[i2].save();

ctx.mostraErro("Cancelando alterações, os TESTE devem estar 1.");

                                         i2++;

                                 }

                         }

                 });

         } finally {

                 JapeSession.close(hnd);

         }

 }

}

O código acima utilizará várias linhas de uma tabela adicional que tem um campo TESTE, e coloca todos os TESTE=1, e depois insere 2, daí cancelamos a segunda transação e os campos TESTE são alterados com sucesso para 1, ou seja, mesmo havendo um erro que fará o rollback na segunda transação, a primeira transação que muda o TESTE para 1 é executada e feito commit com sucesso.

Como tirar dúvidas?

Para tirar dúvidas e compartilhar informações, use a sala Botões de Ação da comunidade Sankhya Developer.