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.