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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | //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.