Liberando pedidos de venda com a MaLibDoFat – Maratona AdvPL e TL++ 338

Nesse vídeo demonstraremos a utilização da função MaLibDoFat, que serve para liberar pedidos de venda no sistema, assim gerando informações na tabela SC9.

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

//Bibliotecas
#Include "Totvs.ch"

/*/{Protheus.doc} User Function zExe338
Efetua a liberação dos itens de um pedido de venda
@type Function
@author Atilio
@since 12/03/2023
@obs 

    Função MaLibDoFat
    Parâmetros
        Recno da SC6
        Quantidade a ser liberada
        Bloqueio de Crédito
        Bloqueio de Estoque
        Avaliação do Crédito
        Avaliação do Estoque
        Permite Liberação Parcial
        Transfere Locais Automaticamente
    Retorno
        A quantidade liberada para aquele item do pedido

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

User Function zExe338()
    Local aArea     := FWGetArea()
    Local cPedido   := FWInputBox("Digite um número de pedido:")

    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 e ele não tiver tido nota emitida ainda
    If SC5->(MsSeek(FWxFilial("SC5") + cPedido)) .And. Empty(SC5->C5_NOTA)
        SC6->(DbGoTop())
        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->(DbGoTop())
        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
    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. Sidney Oliveira Almeida disse:

    Boa tarde,

    Ótimo Video/Post, parabéns, mas surgiu uma duvida…. E caso duas pessoas entrem para liberar pedidos distintos ao mesmo tempo, o sistema vai travar?

Deixe uma resposta

Terminal de Informação