Função a460Estorna para estornar as liberações de pedido na SC9 – Maratona AdvPL e TL++ 021

Nesse vídeo demonstraremos em como estornar liberações de pedido de venda na SC9 através da função a460Estorna.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zExe021
Exemplo de função para estornar a liberação de um pedido de venda
@type Function
@author Atilio
@since 26/11/2022
@obs Função a460Estorna
    Parâmetros
        + Identifica se o programa chamador é o pedido de venda
        + Indica se deve atualizar os empenhos
        + Valor a ser adicionado no limite de crédito
        + Tipo da liberação (igual o C5_TIPLIB = "1" por itens e "2" por pedido)
    Retorno
        + Define se o estorno foi executado com sucesso (.T.) ou não (.F.)

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe021()
    Local aArea        := FWGetArea()
    Local cNumPedido   := "000003"

    DbSelectArea("SC5")
	SC5->(DbSetOrder(1)) // C5_FILIAL + C5_NUM
    DbSelectArea('SC6')
	SC6->(DbSetOrder(1)) // C6_FILIAL + C6_NUM + C6_ITEM + C6_PRODUTO
    DbSelectArea('SC9')
	SC9->(DbSetOrder(1)) // C9_FILIAL + C9_PEDIDO + C9_ITEM + C9_SEQUEN + C9_PRODUTO + C9_BLEST + C9_BLCRED

	//Somente se encontrar o pedido
	If SC5->(MsSeek(FWxFilial("SC5") + cNumPedido))
		
        //Posiciona no item do pedido
		If SC6->( MsSeek( SC5->C5_FILIAL + SC5->C5_NUM ) )

            //Percorre todos os itens do pedido de venda
            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 enquanto houver dados estorna a liberação
                SC9->(MsSeek(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
        EndIf
    EndIf

    FWRestArea(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.

2 Responses

  1. Renato Duarte Belo disse:

    Bom dia, tudo bem Atilio.
    Muito interessante este material.
    Fiquei com uma duvida, se o pedido tiver 5 itens distintos, eu posso estornar apenas um item ou tenho que estornar o pedido inteiro sempre.

Deixe uma resposta

Terminal de Informação