Preencher Volume e Peso no Pedido de Venda via código fonte

No artigo de hoje, nós vamos demonstrar em como preencher o peso, volume e espécie no Pedido de Venda via ponto de entrada.

Quando precisamos enviar o peso e volume para uma nota no Protheus, uma alternativa é preencher no pedido de venda, que ao faturar, ele levará as informações e depois irá para o XML e Danfe.

 

Acontece que, imagina um pedido com 50 itens, e o usuário tendo que fazer as contas na mão, a chance de acontecer algum equívoco é grande.

 

Pensando nisso, uma forma de automatizar esse processo é:

  1. Usar o ponto de entrada MT410TOK, que é ao clicar no botão confirmar do pedido de venda
  2. Percorrer as linhas digitadas na grid
  3. Pegar a Quantidade Vendida e o Código do Produto
  4. Posicionar na SB1, para pegar o peso bruto e líquido no cadastro
  5. Preencher o volume, peso liquido e peso bruto
  6. Se a unidade de medida for CX, será CAIXAS, senão será PACOTES
  7. Gravar essas informações na SC5

 

Abaixo segue o fonte conforme a lógica descrita acima:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function MT410TOK
Ponto de entrada na validação do Pedido de Venda ao clicar no botão confirmar
@type  Function
@author Atilio
@since 22/09/2025
@return lRet, Lógico, Retorna .T. se irá continuar ou .F. se irá barrar
@see https://tdn.totvs.com/pages/releaseview.action?pageId=6784353
/*/

User Function MT410TOK()
    Local aArea      := FWGetArea()
    Local lRet       := .T.
    Local nLinha     := 0
    Local nPosProd   := GDFieldPos("C6_PRODUTO")
    Local nPosQtde   := GDFieldPos("C6_QTDVEN") 
    Local cProduto   := ""
    Local nQtdVenda  := 0
    Local nPesoBruto := 0
    Local nPesoLiqui := 0
    //Local nOpc := PARAMIXB[1]

    DbSelectArea("SB1")
    SB1->(DbSetOrder(1)) // B1_FILIAL + B1_COD

    //Zerando informações do cabeçalho
    M->C5_VOLUME1 := 0
    M->C5_PBRUTO  := 0
    M->C5_PESOL   := 0
    M->C5_ESPECI1 := ""

    //Percorrendo as linhas do browse
    For nLinha := 1 To Len(aCols)
        
        //Se a linha não tiver apagada
        If ! GDDeleted(nLinha)
        
            //Pega o produto e a quantidade
            cProduto  := aCols[nLinha][nPosProd]
            nQtdVenda := aCols[nLinha][nPosQtde]

            //Se conseguir posicionar no produto
            If SB1->(MsSeek(FWxFilial("SB1") + cProduto))

                //Calcula o peso bruto, conforme o que foi vendido vezes o que esta no cadastro
                nPesoBruto := nQtdVenda * SB1->B1_PESBRU
                nPesoLiqui := nQtdVenda * SB1->B1_PESO

                //Incrementa as informações no cabeçalho do pedido
                M->C5_VOLUME1 += nQtdVenda
                M->C5_PBRUTO  += nPesoBruto
                M->C5_PESOL   += nPesoLiqui

                //Se não teve espécie ainda preenchida
                If Empty(M->C5_ESPECI1)

                    //Se for CX, é caixas
                    If SB1->B1_UM == "CX"
                        M->C5_ESPECI1 := "CAIXAS"

                    //Senão, (PT, UN, KG), será pacotes
                    Else
                        M->C5_ESPECI1 := "PACOTES"
                    EndIf
                EndIf

            EndIf
        EndIf
    Next

    FWRestArea(aArea)
Return lRet

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.

Deixe uma resposta

Terminal de Informação