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.
Boa tarde! Sabe dizer se há algo para estornar a liberação do pedido de venda ?
Bom dia Thulio, tudo joia?
Tem a função a460Estorna, pode ser que ela te atenda, segue um exemplo: https://terminaldeinformacao.com/2023/08/29/funcao-a460estorna-para-estornar-as-liberacoes-de-pedido-na-sc9-maratona-advpl-e-tl-021/
Tenha uma ótima e abençoada sexta feira.
Um grande abraço.