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.


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 (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

4 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.

Deixe uma resposta