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

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/AdvPL.

Bom pessoal, por hoje é só.
Abraços e até a próxima.

About Dan_Atilio

Analista e desenvolvedor de sistemas na TOTVS Oeste Paulista Bauru. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

Deixe uma resposta