Função para liberar manualmente um pedido de venda em AdvPL

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 (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

6 Responses

  1. VALTER disse:

    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

  2. Felipe Helfer disse:

    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

    • Dan_Atilio disse:

      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.

  3. ANDERSON DAVYD ANDRADE DE SOUZA disse:

    Fala Daniel, beleza?
    E agora na versão 12.1.33 em diante, como fica já que a TOTVs bloqueou a função StaticCall?

Deixe uma resposta para Dan_AtilioCancelar resposta

Terminal de Informação