Olá pessoal…
Hoje vou mostrar uma função de testes que desenvolvi para liberar manualmente um pedido de venda em AdvPL.
Artigo Atualizado
Pessoal, a StaticCall foi descontinuada, nós até fizemos um artigo sobre isso – Como substituir StaticCall das customizações
Então a função antiga não tem mais serventia, nós podemos usar no lugar a MaLibDoFat enquanto ela ainda funciona.
Ah Daniel, mas a MaLibDoFat não foi descontinuada? Então jovens, ela foi listada como restrita, ou seja, de uso interno pelo ERP Protheus. Até o momento que estou redigindo essa atualização de artigo (Fevereiro de 2023), ela ainda funciona normalmente.
Caso vocês queiram ver a lista completa de funções citadas como restritas acessem: Cross Segmento – TOTVS Backoffice Linha Protheus – ADVPL – Funções, classes e variáveis de propriedade interna
Abaixo um exemplo de um trecho de função usando a MaLibDoFat:
// ... Posiciona na SC5 antes de começar os passos abaixo ...
DbSelectArea('SC6')
SC6->(DbSetOrder(1)) // C6_FILIAL+C6_NUM+C6_ITEM+C6_PRODUTO
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->( 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
Artigo Original (com StaticCall)
Obs.: Realize testes antes de aplicar em produção, pode ser que haja alguma inconsistência, no caso tive que testar essa liberação na rotina de Transferência de Armazéns.
A rotina recebe por parâmetro o número do pedido, estorna as liberações existentes, e através da StaticCall, chama a função MaGravaSC9 para realizar a liberação.
Abaixo a rotina completa:
//Bibliotecas
#Include "Protheus.ch"
/*/{Protheus.doc} zLibPed
Função para liberação de pedido de venda
@type function
@author Atilio
@since 28/08/2016
@version 1.0
@param cPedido, character, Número do Pedido
@example
u_zLibPed("000001")
@obs Função utilizada para testes!
/*/
User Function zLibPed(cPedido)
Local aArea := GetArea()
Local aAreaC5 := SC5->(GetArea())
Local aAreaC6 := SC6->(GetArea())
Local aAreaC9 := SC9->(GetArea())
Local cPedido := SC5->C5_NUM
Local aAreaAux := {}
Local cBlqCred := " "
Local cBlqEst := " "
Local aLocal := {}
Default cPedido := ""
DbSelectArea('SC5')
SC5->(DbSetOrder(1)) //C5_FILIAL + C5_NUM
SC5->(DbGoTop())
DbSelectArea('SC6')
SC6->(DbSetOrder(1)) //C6_FILIAL + C6_NUM + C6_ITEM
SC6->(DbGoTop())
DbSelectArea('SC9')
SC9->(DbSetOrder(1)) //C9_FILIAL + C9_PEDIDO + C9_ITEM
SC9->(DbGoTop())
//Se conseguir posicionar no pedido
If SC5->(DbSeek(FWxFilial('SC5') + cPedido))
//Se conseguir posicionar nos itens do pedido
If SC6->(DbSeek(FWxFilial('SC6') + cPedido))
aAreaAux := SC6->(GetArea())
//Percorre todos os itens
While ! SC6->(EoF()) .And. SC6->C6_FILIAL = FWxFilial('SC6') .And. SC6->C6_NUM == cPedido
//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
RecLock("SC5", .F.)
C5_LIBEROK := ""
SC5->(MsUnLock())
//Percorre todos os itens
RestArea(aAreaAux)
While ! SC6->(EoF()) .And. SC6->C6_FILIAL = FWxFilial('SC6') .And. SC6->C6_NUM == cPedido
StaticCall(FATXFUN, MaGravaSC9, SC6->C6_QTDVEN, cBlqCred, cBlqEst, aLocal)
SC6->(DbSkip())
EndDo
EndIf
EndIf
RestArea(aAreaC9)
RestArea(aAreaC6)
RestArea(aAreaC5)
RestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Dan_Atilio,
Boa noite
essa função considera que ao liberar o pedido, faz o bloqueio de credito e estoque caso necessário ou preenche os campos da SC9 com branco C9_BLEST E C9_BLCRED
OBRIGADO
Boa tarde Valter, tudo bem?
Essa função faz a liberação do pedido, ou seja, deixa os campos C9_BLEST e C9_BLCRED em branco.
Um grande abraço.
Olá Dan_Atilio, tudo bem?
Saberia me dizer se essa função avalia as regras para bloqueio financeiro? Ou seja, se não houver bloqueio financeiro não gera a SC9 ? Obrigado.
Parabéns pela iniciativa!!
Abraços
Boa noite Felipe, bem graças a Deus e você?
Faz muito tempo que eu desenvolvi esse exemplo, se eu não me engano ela não avalia, por isso que informamos qual é o bloqueio de crédito a ser gerado (na variável cBlqCred), tanto que se passarmos em branco, será gerado o registro sem nenhum bloqueio de crédito.
Eu que agradeço pelo comentário.
Abraços.
Fala Daniel, beleza?
E agora na versão 12.1.33 em diante, como fica já que a TOTVs bloqueou a função StaticCall?
Fala Anderson, tudo sim graças a Deus e você?
Então, por enquanto o ideal é utilizar a função MaLibDoFat, mas pode ser que ela seja bloqueada futuramente pela TOTVS.
Ou usar o ExecAuto de rotinas como Liberação de Crédito e Estoque.
Abraços.