Nesse vídeo demonstraremos em como ativar o controle de transações no banco de dados através dos comandos Begin Transaction e End Transaction.
Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} User Function zExe065 Exemplo de como realizar gravações, mas em caso de falha seja abortado @type Function @author Atilio @since 06/12/2022 @see https://tdn.totvs.com/display/public/framework/BEGIN+TRANSACTION @obs **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao **** /*/ User Function zExe065() Local aArea := FWGetArea() //Iniciando controle de transações Begin Transaction //Inclui um novo produto RecLock('SBM', .T.) SBM->BM_GRUPO := "TST1" SBM->BM_DESC := "Teste " + Time() SBM->(MsUnlock()) //Se a pergunta foi confirmada, cancela os lançamentos na transação If FWAlertYesNo("Deseja cancelar e disarmar a transação?", "Atenção") DisarmTransaction() EndIf //Finalizando controle de transações End Transaction FWRestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Olá, Daniel!
Existe alguma forma de eu utilizar o controle de transações ou alguma outra tratativa que armazene as alterações que eu quero realizar no banco em cash, para só após a finalização do laço de fato executar todas as inserções?
Begin Transaction
While SZ6->(!Eof()) .And. SZ6->Z6_PRODUTO == SZ7->Z7_PRODUTO .And. Alltrim(SZ6->Z6_CAIXA) == Alltrim(cCxNova)
RecLock(“SZ6”,.F.)
SZ6->Z6_PEDIDO := (cAliasTMP)->XX_PEDIDO
SZ6->Z6_TSEPARA := cTipo
If cCtrlMac == ‘S’
SZ6->Z6_PEDREM:= cPedRem
EndIf
If nCont > nBipPend
DisarmTransaction()
Return .F.
EndIf
MsUnLock()
SZ6->(DbSkip())
End
End Transaction
O que acontece nesse código é na verdade o cancelamento da alteração da linha corrente caso caia no If após o reclock. Mas o que eu pretendia que acontecesse é que ele cancelasse todas as alterações visto o fato de o laço estar dentro da estrutura de controle de transação.
Bom dia Arthur, tudo joia?
Sim, o próprio controle de transações já faz isso, mas você não pode encerrar ele no meio (como com esse return .F. no meio do processo).
O que você precisa fazer, é controlar por exemplo, numa variável, e no fim da transação você valida. Ai o laço, você interrompe ele com um Exit, algo +- assim:
Tenha uma ótima e abençoada quinta feira.
Um forte abraço.