Nesse vídeo demonstraremos a utilização da função MaLibDoFat, que serve para liberar pedidos de venda no sistema, assim gerando informações na tabela SC9.
Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:
//Bibliotecas #Include "Totvs.ch" /*/{Protheus.doc} User Function zExe338 Efetua a liberação dos itens de um pedido de venda @type Function @author Atilio @since 12/03/2023 @obs Função MaLibDoFat Parâmetros Recno da SC6 Quantidade a ser liberada Bloqueio de Crédito Bloqueio de Estoque Avaliação do Crédito Avaliação do Estoque Permite Liberação Parcial Transfere Locais Automaticamente Retorno A quantidade liberada para aquele item do pedido **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao **** /*/ User Function zExe338() Local aArea := FWGetArea() Local cPedido := FWInputBox("Digite um número de pedido:") DbSelectArea("SC5") SC5->(DbSetOrder(1)) // C5_FILIAL + C5_NUM DbSelectArea("SC6") SC6->(DbSetOrder(1)) // C6_FILIAL + C6_NUM + C6_ITEM + C6_PRODUTO DbSelectArea("SC9") SC9->(DbSetOrder(1)) // C9_FILIAL + C9_PEDIDO + C9_ITEM + C9_SEQUEN + C9_PRODUTO + C9_BLEST + C9_BLCRED //Somente se encontrar o pedido e ele não tiver tido nota emitida ainda If SC5->(MsSeek(FWxFilial("SC5") + cPedido)) .And. Empty(SC5->C5_NOTA) SC6->(DbGoTop()) SC6->( MsSeek( SC5->C5_FILIAL + SC5->C5_NUM ) ) //Estorna as liberações While ! SC6->(EoF()) .And. SC6->C6_FILIAL = SC5->C5_FILIAL .And. SC6->C6_NUM == SC5->C5_NUM //Posiciona na liberação do item do pedido e estorna a liberação SC9->(DbSeek(FWxFilial('SC9')+SC6->C6_NUM+SC6->C6_ITEM)) While ! SC9->(EoF()) .And. SC9->(C9_FILIAL+C9_PEDIDO+C9_ITEM) == FWxFilial('SC9')+SC6->(C6_NUM+C6_ITEM) SC9->(a460Estorna(.T.)) SC9->(DbSkip()) EndDo SC6->(DbSkip()) EndDo //Define que o pedido foi liberado RecLock("SC5", .F.) SC5->C5_LIBEROK := 'S' SC5->(MsUnlock()) SC6->(DbGoTop()) SC6->( MsSeek( SC5->C5_FILIAL + SC5->C5_NUM ) ) While !SC6->(Eof()) .And. SC5->C5_NUM == SC6->C6_NUM MaLibDoFat(; SC6->(RecNo()),; //nRegSC6 SC6->C6_QTDVEN,; //nQtdaLib ,; //lCredito ,; //lEstoque .T.,; //lAvCred .T.,; //lAvEst .F.,; //lLibPar .F.; //lTrfLocal ) SC6->(DbSkip()) EndDo EndIf FWRestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Boa tarde,
Ótimo Video/Post, parabéns, mas surgiu uma duvida…. E caso duas pessoas entrem para liberar pedidos distintos ao mesmo tempo, o sistema vai travar?
Bom dia Sidney, tudo joia?
Então, pode sim acontecer inconsistências se duas pessoas acionarem ao mesmo tempo a liberação do mesmo pedido.
Para isso, você pode tratar para travar o pedido com SoftLock, conforme esse exemplo: https://terminaldeinformacao.com/2024/04/19/travando-registros-para-atualizacao-com-msunlock-reclock-e-softlock-maratona-advpl-e-tl-365/
Ou se você quiser travar a rotina, você pode usar a LockByName conforme esse exemplo: https://terminaldeinformacao.com/2024/04/03/criando-travas-de-execucao-com-lockbyname-e-unlockbyname-maratona-advpl-e-tl-333/
Um grande abraço.