Função que retorna o total do pedido de vendas (com impostos) em AdvPL

Olá pessoal…

Hoje vou mostrar uma função que desenvolvi que retorna o valor total do pedido de venda com impostos em AdvPL.


Primeiramente quero agradecer ao meu amigo Rafael Almeida por ter me ajudado na montagem da rotina.

Como exemplo, iremos criar um campo Virtual na SC5, chamado de C5_X_TOTAL, com a propriedade de visualizar, e iremos alterar o Ini Padrão e o Ini Browse, ficando dessa forma:

Ini Padrão e Ini Browse

Ini Padrão e Ini Browse

No Uso, deixe o Browse (caso queira que seja mostrado o total na grid de pedidos) e o Usado (caso queira que mostre um campo para o usuário visualizar).

Se quiser, altere também a ordem, para que ele apareça nos primeiros campos.

Será necessário ter também o Ponto de Entrada M410LIOK (caso você deixe o campo como Usado).

#Include "Protheus.ch"
   
/*------------------------------------------------------------------------------------------------------*
 | P.E.:  M410LIOK                                                                                      |
 | Autor: Daniel Atilio                                                                                 |
 | Data:  25/08/2016                                                                                    |
 | Desc:  Validação da linha do Pedido de Venda                                                         |
 | Links: http://tdn.totvs.com/pages/releaseview.action?pageId=6784149                                  |
 *------------------------------------------------------------------------------------------------------*/
   
User Function M410LIOK()
    Local lRet := .T.
   
    //Atualiza o total
    M->C5_X_TOTAL := u_zTotPed(M->C5_NUM, 2)
    GetDRefresh()
Return lRet

Abaixo um exemplo da tela de pedidos de venda mostrando o total.

Total do Pedido de Venda no Browse

Total do Pedido de Venda no Browse

Abaixo o código fonte completo (A função recebe dois parâmetros, o primeiro é o pedido, e o segundo, é se está fora da tela de alteração do pedido [1] ou dentro dela [2]).

//Bibliotecas
#Include "Protheus.ch"
#Include "TopConn.ch"
   
/*/{Protheus.doc} zTotPed
Função que retorna o valor total do pedido com os impostos
@author Atilio
@since 25/08/2016
@version undefined
@param cNumPed, characters, Número do Pedido
@param nTipo, numérico, 1 == Browse da SC5, 2 == Dentro da tela do Pedido
@type function
/*/
   
User Function zTotPed(cNumPed, nTipo)
    Local aArea     := GetArea()
    Local aAreaC5   := SC5->(GetArea())
    Local aAreaB1   := SC6->(GetArea())
    Local aAreaC6   := SB1->(GetArea())
    Local cQryIte   := ""
    Local nValPed   := 0
    Local nNritem   := 0
    Local nAtu
    Default cNumPed := SC5->C5_NUM
    Default nTipo   := 1
       
    //Se for no Browse, já traz o valor total
    If nTipo == 1
        //Seleciona agora os itens do pedido
        cQryIte := " SELECT "
        cQryIte += "    C6_ITEM, "
        cQryIte += "    C6_PRODUTO "
        cQryIte += " FROM "
        cQryIte += "    "+RetSQLName('SC6')+" SC6 "
        cQryIte += "    LEFT JOIN "+RetSQLName('SB1')+" SB1 ON ( "
        cQryIte += "        B1_FILIAL = '"+FWxFilial('SB1')+"' "
        cQryIte += "        AND B1_COD = SC6.C6_PRODUTO "
        cQryIte += "        AND SB1.D_E_L_E_T_ = ' ' "
        cQryIte += "    ) "
        cQryIte += " WHERE "
        cQryIte += "    C6_FILIAL = '"+FWxFilial('SC6')+"' "
        cQryIte += "    AND C6_NUM = '"+cNumPed+"' "
        cQryIte += "    AND SC6.D_E_L_E_T_ = ' ' "
        cQryIte += " ORDER BY "
        cQryIte += "    C6_ITEM "
        cQryIte := ChangeQuery(cQryIte)
        TCQuery cQryIte New Alias "QRY_ITE"
           
        DbSelectArea('SC5')
        SC5->(DbSetOrder(1))
        SC5->(DbSeek(FWxFilial('SC5') + cNumPed))
        MaFisIni(SC5->C5_CLIENTE,;                    // 1-Codigo Cliente/Fornecedor
            SC5->C5_LOJACLI,;                    // 2-Loja do Cliente/Fornecedor
            If(SC5->C5_TIPO$'DB',"F","C"),;               // 3-C:Cliente , F:Fornecedor
            SC5->C5_TIPO,;                                // 4-Tipo da NF
            SC5->C5_TIPOCLI,;                           // 5-Tipo do Cliente/Fornecedor
            MaFisRelImp("MT100",{"SF2","SD2"}),;        // 6-Relacao de Impostos que suportados no arquivo
            ,;                                               // 7-Tipo de complemento
            ,;                                            // 8-Permite Incluir Impostos no Rodape .T./.F.
            "SB1",;                                        // 9-Alias do Cadastro de Produtos - ("SBI" P/ Front Loja)
            "MATA461")                                    // 10-Nome da rotina que esta utilizando a funcao
           
        //Pega o total de itens
        QRY_ITE->(DbGoTop())
        While ! QRY_ITE->(EoF())
            nNritem++
            QRY_ITE->(DbSkip())
        EndDo
           
        //Preenchendo o valor total
        QRY_ITE->(DbGoTop())
        nTotIPI := 0
        While ! QRY_ITE->(EoF())
            //Pega os tratamentos de impostos
            SB1->(DbSeek(FWxFilial("SB1")+QRY_ITE->C6_PRODUTO))
            SC6->(DbSeek(FWxFilial("SC6")+cNumPed+QRY_ITE->C6_ITEM))
               
            MaFisAdd(    SC6->C6_PRODUTO,;                     // 1-Codigo do Produto                 ( Obrigatorio )
                        SC6->C6_TES,;                         // 2-Codigo do TES                     ( Opcional )
                        SC6->C6_QTDVEN,;                      // 3-Quantidade                     ( Obrigatorio )
                        SC6->C6_PRCVEN,;                      // 4-Preco Unitario                 ( Obrigatorio )
                        SC6->C6_VALDESC,;                    // 5 desconto
                        SC6->C6_NFORI,;                     // 6-Numero da NF Original             ( Devolucao/Benef )
                        SC6->C6_SERIORI,;                    // 7-Serie da NF Original             ( Devolucao/Benef )
                        0,;                                    // 8-RecNo da NF Original no arq SD1/SD2
                        SC5->C5_FRETE/nNritem,;                // 9-Valor do Frete do Item         ( Opcional )
                        SC5->C5_DESPESA/nNritem,;            // 10-Valor da Despesa do item         ( Opcional )
                        SC5->C5_SEGURO/nNritem,;            // 11-Valor do Seguro do item         ( Opcional )
                        0,;                                    // 12-Valor do Frete Autonomo         ( Opcional )
                        SC6->C6_VALOR,;                     // 13-Valor da Mercadoria             ( Obrigatorio )
                        0,;                                    // 14-Valor da Embalagem             ( Opcional )
                        0,;                                     // 15-RecNo do SB1
                        0)                                     // 16-RecNo do SF4
               
            //nItem++
            QRY_ITE->(DbSkip())
        EndDo
           
        //Pegando totais
        nTotIPI   := MaFisRet(,'NF_VALIPI')
        nTotICM   := MaFisRet(,'NF_VALICM')
        nTotNF    := MaFisRet(,'NF_TOTAL')
        nTotFrete := MaFisRet(,'NF_FRETE')
        nTotISS   := MaFisRet(,'NF_VALISS')
           
        QRY_ITE->(DbCloseArea())
        MaFisEnd()
    Else
        MaFisIni(M->C5_CLIENTE,;                    // 1-Codigo Cliente/Fornecedor
            M->C5_LOJACLI,;                    // 2-Loja do Cliente/Fornecedor
            If(M->C5_TIPO$'DB',"F","C"),;               // 3-C:Cliente , F:Fornecedor
            M->C5_TIPO,;                                // 4-Tipo da NF
            M->C5_TIPOCLI,;                           // 5-Tipo do Cliente/Fornecedor
            MaFisRelImp("MT100",{"SF2","SD2"}),;        // 6-Relacao de Impostos que suportados no arquivo
            ,;                                               // 7-Tipo de complemento
            ,;                                            // 8-Permite Incluir Impostos no Rodape .T./.F.
            "SB1",;                                        // 9-Alias do Cadastro de Produtos - ("SBI" P/ Front Loja)
            "MATA461")                                    // 10-Nome da rotina que esta utilizando a funcao
           
           
        nNritem := Len(aCols)
           
        //Preenchendo o valor total
        nTotIPI := 0
        For nAtu := 1 To Len(aCols)
            //Pega os tratamentos de impostos
            SB1->(DbSeek(FWxFilial("SB1")+aCols[nAtu][GDFieldPos("C6_PRODUTO")]))
               
            MaFisAdd(    aCols[nAtu][GDFieldPos("C6_PRODUTO")],;                     // 1-Codigo do Produto                 ( Obrigatorio )
                        aCols[nAtu][GDFieldPos("C6_TES")],;                         // 2-Codigo do TES                     ( Opcional )
                        aCols[nAtu][GDFieldPos("C6_QTDVEN")],;                      // 3-Quantidade                     ( Obrigatorio )
                        aCols[nAtu][GDFieldPos("C6_PRCVEN")],;                      // 4-Preco Unitario                 ( Obrigatorio )
                        aCols[nAtu][GDFieldPos("C6_VALDESC")],;                    // 5 desconto
                        aCols[nAtu][GDFieldPos("C6_NFORI")],;                     // 6-Numero da NF Original             ( Devolucao/Benef )
                        aCols[nAtu][GDFieldPos("C6_SERIORI")],;                    // 7-Serie da NF Original             ( Devolucao/Benef )
                        0,;                                    // 8-RecNo da NF Original no arq SD1/SD2
                        M->C5_FRETE/nNritem,;                // 9-Valor do Frete do Item         ( Opcional )
                        M->C5_DESPESA/nNritem,;            // 10-Valor da Despesa do item         ( Opcional )
                        M->C5_SEGURO/nNritem,;            // 11-Valor do Seguro do item         ( Opcional )
                        0,;                                    // 12-Valor do Frete Autonomo         ( Opcional )
                        aCols[nAtu][GDFieldPos("C6_VALOR")],;                     // 13-Valor da Mercadoria             ( Obrigatorio )
                        0,;                                    // 14-Valor da Embalagem             ( Opcional )
                        0,;                                     // 15-RecNo do SB1
                        0)                                     // 16-RecNo do SF4
               
        Next
           
        //Pegando totais
        nTotIPI   := MaFisRet(,'NF_VALIPI')
        nTotICM   := MaFisRet(,'NF_VALICM')
        nTotNF    := MaFisRet(,'NF_TOTAL')
        nTotFrete := MaFisRet(,'NF_FRETE')
        nTotISS   := MaFisRet(,'NF_VALISS')
           
        MaFisEnd()
    EndIf
       
    //Atualiza o retorno
    nValPed := nTotNF + nTotIPI + nTotFrete + nTotISS
       
    RestArea(aAreaC6)
    RestArea(aAreaB1)
    RestArea(aAreaC5)
    RestArea(aArea)
Return nValPed

Update 07/02/2018

Como muitas pessoas me perguntavam sobre cálculos no pedido de venda, segue abaixo um exemplo de fonte para pegar os impostos corretamente, e um fonte bem simples em que você pode tratar os dados.

//Posicionar na SC5 com DbSeek antes desse trecho
   
MaFisIni(SC5->C5_CLIENTE,;                   // 01 - Codigo Cliente/Fornecedor
    SC5->C5_LOJACLI,;                        // 02 - Loja do Cliente/Fornecedor
    Iif(SC5->C5_TIPO $ "D;B", "F", "C"),;    // 03 - C:Cliente , F:Fornecedor
    SC5->C5_TIPO,;                           // 04 - Tipo da NF
    SC5->C5_TIPOCLI,;                        // 05 - Tipo do Cliente/Fornecedor
    MaFisRelImp("MT100", {"SF2", "SD2"}),;   // 06 - Relacao de Impostos que suportados no arquivo
    ,;                                       // 07 - Tipo de complemento
    ,;                                       // 08 - Permite Incluir Impostos no Rodape .T./.F.
    "SB1",;                                  // 09 - Alias do Cadastro de Produtos - ("SBI" P/ Front Loja)
    "MATA461")                               // 10 - Nome da rotina que esta utilizando a funcao
           
//Enquanto houver itens
SC6->(DbSeek(FWxFilial('SC6') + SC5->C5_NUM))
nItAtu := 0
While ! SC6->(EoF()) .And. SC6->C6_NUM == SC5->C5_NUM
    nItAtu++
  
    //Adiciona o item nos tratamentos de impostos
    SB1->(DbSeek(FWxFilial("SB1")+SC6->C6_PRODUTO))
    MaFisAdd(SC6->C6_PRODUTO,;    // 01 - Codigo do Produto                    ( Obrigatorio )
        SC6->C6_TES,;             // 02 - Codigo do TES                        ( Opcional )
        SC6->C6_QTDVEN,;          // 03 - Quantidade                           ( Obrigatorio )
        SC6->C6_PRCVEN,;          // 04 - Preco Unitario                       ( Obrigatorio )
        SC6->C6_VALDESC,;         // 05 - Desconto
        SC6->C6_NFORI,;           // 06 - Numero da NF Original                ( Devolucao/Benef )
        SC6->C6_SERIORI,;         // 07 - Serie da NF Original                 ( Devolucao/Benef )
        0,;                       // 08 - RecNo da NF Original no arq SD1/SD2
        0,;                       // 09 - Valor do Frete do Item               ( Opcional )
        0,;                       // 10 - Valor da Despesa do item             ( Opcional )
        0,;                       // 11 - Valor do Seguro do item              ( Opcional )
        0,;                       // 12 - Valor do Frete Autonomo              ( Opcional )
        SC6->C6_VALOR,;           // 13 - Valor da Mercadoria                  ( Obrigatorio )
        0,;                       // 14 - Valor da Embalagem                   ( Opcional )
        SB1->(RecNo()),;          // 15 - RecNo do SB1
        0)                        // 16 - RecNo do SF4
       
    MaFisLoad("IT_VALMERC", SC6->C6_VALOR, nItAtu)                
    MaFisAlt("IT_PESO", nQtdPeso, nItAtu)
       
    SC6->(DbSkip())
EndDo
           
//Altera dados do cabeçalho
MaFisAlt("NF_FRETE", SC5->C5_FRETE)
MaFisAlt("NF_SEGURO", SC5->C5_SEGURO)
MaFisAlt("NF_DESPESA", SC5->C5_DESPESA) 
MaFisAlt("NF_AUTONOMO", SC5->C5_FRETAUT)
If SC5->C5_DESCONT > 0
    MaFisAlt("NF_DESCONTO", Min(MaFisRet(, "NF_VALMERC")-0.01, SC5->C5_DESCONT+MaFisRet(, "NF_DESCONTO")) )
EndIf
If SC5->C5_PDESCAB > 0
    MaFisAlt("NF_DESCONTO", A410Arred(MaFisRet(, "NF_VALMERC")*SC5->C5_PDESCAB/100, "C6_VALOR") + MaFisRet(, "NF_DESCONTO"))
EndIf
   
//Agora reposiciona nos itens para poder pegar os dados
SC6->(DbGoTop())
SC6->(DbSeek(FWxFilial('SC6') + SC5->C5_NUM))
nItAtu := 0
While ! SC6->(EoF()) .And. SC6->C6_NUM == SC5->C5_NUM                
    nItAtu++
  
    //Pega os valores
    nBasICM    := MaFisRet(nItAtu, "IT_BASEICM")
    nValICM    := MaFisRet(nItAtu, "IT_VALICM")
    nValIPI    := MaFisRet(nItAtu, "IT_VALIPI")
    nAlqICM    := MaFisRet(nItAtu, "IT_ALIQICM")
    nAlqIPI    := MaFisRet(nItAtu, "IT_ALIQIPI")
    nValSol    := (MaFisRet(nItAtu, "IT_VALSOL") / SC6->C6_QTDVEN) 
    nBasSol    := MaFisRet(nItAtu, "IT_BASESOL")
    nPrcUniSol := SC6->C6_PRCVEN + nValSol
    nTotSol    := nPrcUniSol * SC6->C6_QTDVEN
    nTotalST   += MaFisRet(nItAtu, "IT_VALSOL")
    nTotIPI    += nValIPI
    nValorTot  += SC6->C6_VALOR
       
    SC6->(DbSkip())
EndDo
nTotFrete := MaFisRet(, "NF_FRETE")
nTotVal := MaFisRet(, "NF_TOTAL")
MaFisEnd()
   
Alert(nTotIPI)

Update 01/02/2022:

Caso vocês precisem pegar o PIS e COFINS, utilizem MaFisRet(1, “IT_VALPS2”) e MaFisRet(1, “IT_VALCF2”), dica enviada por Alexandre Brandt.

Update 10/02/2023:

Aparentemente em algumas bases ou LIBs o cálculo não é “resetado” automaticamente, então o que deve ser feito é acionar manualmente a MaFisEnd() antes de iniciar com a MaFisIni(). Dica enviada pelo Daniel Scheeren.

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.

36 Responses

  1. Regina Aranha disse:

    Ola, Dan_atilio, como vai?
    Estou ha horas tentando resolver como faço para pegar o IPI do pedido de vendas sem ter que calcular impostos. Depois de varias tentativas sem sucesso, encontrei seu post. Usei seu codigo, mas recebo o mesmo erro…. quando executo a MAFISINI, o sistema cai com error.log com a seguinte mensagem: variable is not array – Type [U] on MAFISINI(MATXFIS.PRX). Consultando o log encontro a array ARELIMP(A) vazia na MATFISINI. Voce chegou a passar por isso? Como contornou?
    Bem, deixe explicar, estou chamando seu programa a partir do ponto de entrada MTA440C9 (liberação de pedido), na tela de pedido de vendas, fazendo uma alteração ou na liberação de pedidos. Ele tem a finalidade de enviar um email para o gerente financeiro liberar o pedido por credito, caso ele esteja bloqueado por credito.
    Se puder me ajudar, agradeço imensamente.
    Regina

    • Dan_Atilio disse:

      Boa noite Regina, tudo bem?
      Comigo sempre deu certo, segue abaixo um trecho limpo de um código que utilizo na impressão do pedido de venda, veja a variável nTotIPI:

      	//Posicionar na SC5 com DbSeek antes desse trecho
      	
      	MaFisIni(SC5->C5_CLIENTE,;                   // 01 - Codigo Cliente/Fornecedor
      		SC5->C5_LOJACLI,;                        // 02 - Loja do Cliente/Fornecedor
      		Iif(SC5->C5_TIPO $ "D;B", "F", "C"),;    // 03 - C:Cliente , F:Fornecedor
      		SC5->C5_TIPO,;                           // 04 - Tipo da NF
      		SC5->C5_TIPOCLI,;                        // 05 - Tipo do Cliente/Fornecedor
      		MaFisRelImp("MT100", {"SF2", "SD2"}),;   // 06 - Relacao de Impostos que suportados no arquivo
      		,;                                       // 07 - Tipo de complemento
      		,;                                       // 08 - Permite Incluir Impostos no Rodape .T./.F.
      		"SB1",;                                  // 09 - Alias do Cadastro de Produtos - ("SBI" P/ Front Loja)
      		"MATA461")                               // 10 - Nome da rotina que esta utilizando a funcao
      			
      	//Enquanto houver itens
      	SC6->(DbSeek(FWxFilial('SC6') + SC5->C5_NUM))
      	While ! SC6->(EoF()) .And. SC6->C6_NUM == SC5->C5_NUM
      		
      		//Adiciona o item nos tratamentos de impostos
      		SB1->(DbSeek(FWxFilial("SB1")+SC6->C6_PRODUTO))
      		MaFisAdd(SC6->C6_PRODUTO,;    // 01 - Codigo do Produto                    ( Obrigatorio )
      			SC6->C6_TES,;             // 02 - Codigo do TES                        ( Opcional )
      			SC6->C6_QTDVEN,;          // 03 - Quantidade                           ( Obrigatorio )
      			SC6->C6_PRCVEN,;          // 04 - Preco Unitario                       ( Obrigatorio )
      			SC6->C6_VALDESC,;         // 05 - Desconto
      			SC6->C6_NFORI,;           // 06 - Numero da NF Original                ( Devolucao/Benef )
      			SC6->C6_SERIORI,;         // 07 - Serie da NF Original                 ( Devolucao/Benef )
      			0,;                       // 08 - RecNo da NF Original no arq SD1/SD2
      			0,;                       // 09 - Valor do Frete do Item               ( Opcional )
      			0,;                       // 10 - Valor da Despesa do item             ( Opcional )
      			0,;                       // 11 - Valor do Seguro do item              ( Opcional )
      			0,;                       // 12 - Valor do Frete Autonomo              ( Opcional )
      			SC6->C6_VALOR,;           // 13 - Valor da Mercadoria                  ( Obrigatorio )
      			0,;                       // 14 - Valor da Embalagem                   ( Opcional )
      			SB1->(RecNo()),;          // 15 - RecNo do SB1
      			0)                        // 16 - RecNo do SF4
      		
      		MaFisLoad("IT_VALMERC", SC6->C6_VALOR, nItAtu)				
      		MaFisAlt("IT_PESO", nQtdPeso, nItAtu)
      		
      		SC6->(DbSkip())
      	EndDo
      			
      	//Altera dados do cabeçalho
      	MaFisAlt("NF_FRETE", SC5->C5_FRETE)
      	MaFisAlt("NF_SEGURO", SC5->C5_SEGURO)
      	MaFisAlt("NF_DESPESA", SC5->C5_DESPESA) 
      	MaFisAlt("NF_AUTONOMO", SC5->C5_FRETAUT)
      	If SC5->C5_DESCONT > 0
      		MaFisAlt("NF_DESCONTO", Min(MaFisRet(, "NF_VALMERC")-0.01, SC5->C5_DESCONT+MaFisRet(, "NF_DESCONTO")) )
      	EndIf
      	If SC5->C5_PDESCAB > 0
      		MaFisAlt("NF_DESCONTO", A410Arred(MaFisRet(, "NF_VALMERC")*SC5->C5_PDESCAB/100, "C6_VALOR") + MaFisRet(, "NF_DESCONTO"))
      	EndIf
      	
      	//Agora reposiciona nos itens para poder pegar os dados
      	SC6->(DbGoTop())
      	SC6->(DbSeek(FWxFilial('SC6') + SC5->C5_NUM))
      	While ! SC6->(EoF()) .And. SC6->C6_NUM == SC5->C5_NUM				
      		//Pega os valores
      		nBasICM    := MaFisRet(nItAtu, "IT_BASEICM")
      		nValICM    := MaFisRet(nItAtu, "IT_VALICM")
      		nValIPI    := MaFisRet(nItAtu, "IT_VALIPI")
      		nAlqICM    := MaFisRet(nItAtu, "IT_ALIQICM")
      		nAlqIPI    := MaFisRet(nItAtu, "IT_ALIQIPI")
      		nValSol    := (MaFisRet(nItAtu, "IT_VALSOL") / SC6->C6_QTDVEN) 
      		nBasSol    := MaFisRet(nItAtu, "IT_BASESOL")
      		nPrcUniSol := SC6->C6_PRCVEN + nValSol
      		nTotSol    := nPrcUniSol * SC6->C6_QTDVEN
      		nTotalST   += MaFisRet(nItAtu, "IT_VALSOL")
      		nTotIPI    += nValIPI
      		nValorTot  += SC6->C6_VALOR
      		
      		SC6->(DbSkip())
      	EndDo
      	nTotFrete := MaFisRet(, "NF_FRETE")
      	nTotVal := MaFisRet(, "NF_TOTAL")
      	MaFisEnd()
      	
      	Alert(nTotIPI)
      
  2. Regina Aranha disse:

    Entao, nao vai mesmo, ele da erro na MAFISINI ao carregar. Estou acreditando que algo deveria ser feito antes e é a posição 6 do array MaFisRelImp(“MT100”, {“SF2”, “SD2”}).
    Voce sabe me dizer qula deveria ser o conteudo dela, o que a MAFISRELIMP deveria retornar para popular a MAFISINI, por exemplo, “IT_VALIPI”, “NF_VALIPI”, etc. Se souber, vou tentar de novo, senao, o jeito sera calcular na mao mesmo…..
    Obrigada

  3. Regina Aranha disse:

    Realmente nao consegui, mas esta empresa esta com release 12.1.14, preciso atualizar e testar novamente. Muito obrigada pela atenção!

  4. macatubs disse:

    grande mestre, me ajudando como sempre…. ótima função!! abraçosss

  5. Leandro Marquardt disse:

    Boa tarde Dan_Atilio

    Estou trabalhando com o Call Center (SUA e SUB), e eu preciso mostrar no item, um campo com o valor do item mais os impostos. Teria o campo padrão UB_VLRITEM, que é o valor unitário * a quantidade, e eu preciso de um campo novo com o UB_VLRITEM + impostos. Você tem um exemplo de como eu poderia fazer isso?

  6. Elizeu disse:

    Bom dia Dan!
    Eu extraio relatório do pedido de vendas da tabela sc6 para o excel e gostaria de fazer os cálculos de impostos puxando para o excel… você poderia me dizer quais tabelas devo utilizar para relacionar à tabela sc6 e obter os cálculos?
    Obrigado!

  7. Elizeu disse:

    Se eu usar como base os dados fiscais das notas que já foram geradas para o cliente, para calcular os impostos do pedido que não foi faturado ainda, dá certo?
    Importando os pedidos da SC6 para o excel e usando dados fiscais da sf2 e sd2.

    • Dan_Atilio disse:

      Bom dia Elizeu, tudo bem?
      Se você buscar da SD2, ficaria correto, pois a nota já foi gerada.
      Do contrário, se não houver nota, você precisa simular com a MaFisIni, igual eu fiz nesse exemplo no fonte.
      Os impostos não ficam salvos em tabelas no momento da SC6, eles são calculados em tempo de execução, por isso utilizamos as funções MaFis.
      Qualquer dúvida, entre em contato.
      Abraços.

  8. Ricardo Cassolatto disse:

    Esta variável nItAtu tem de ser apenas declarada, ou nItAtu :- SC6->C6_ITEM ?
    Obrigado.

  9. Igor silva disse:

    Funciona também na rotina de orçamento? Tenho um relatório gráfico, que gera o PDF do orçamento e preciso que apareça o total de desconto quando o cliente for da Zona Franca de Manaus.

  10. Leopoldo Leal disse:

    Boa tarde,

    Primeiramente parabéns pela LIB do Excel, hoje utilizo alguns recursos dela, pena que nao dá para deixar duas tabelas lado a lado.
    Uma forma mais padrao para retornar o total do pedido é :

    StaticCall( MATN410B, Ma410Impos, 3, .T.)

  11. Renato Gomes disse:

    Igor, deu certo pra te? fiz um teste rápido aqui , mas não retornou o valor total do orçamento. 🙁

  12. verediana disse:

    Boa tarde,

    Pode me ajudar ?

    Segui seu exemplo, porém não mostra o PIS e Cofins . Vem valor zerado e quando eu vejo na planilha, ele mostra os valores.

    Eu preciso mostrar Item a Item num relatorio qual sera o valor do PIs e Cofins

    Fiz Assim :

    Local aRelImp := MaFisRelImp(“MT100”,{“SF2″,”SD2”})

    dbSelectArea(“SC5”)
    SC5->(DbSeek(FWxFilial(‘SC5’) + cNUM))

    SA1->(DbSeek(FWxFilial(“SA1”)+SC5->C5_CLIENTE))

    MaFisIni(SC5->C5_CLIENTE,; // 01 – Codigo Cliente/Fornecedor
    SC5->C5_LOJACLI,; // 02 – Loja do Cliente/Fornecedor
    Iif(SC5->C5_TIPO $ “D;B”, “F”, “C”),; // 03 – C:Cliente , F:Fornecedor
    SC5->C5_TIPO,; // 04 – Tipo da NF
    SC5->C5_TIPOCLI,; // 05 – Tipo do Cliente/Fornecedor
    aRelImp ,; // 06 – Relacao de Impostos que suportados no arquivo
    ,; // 07 – Tipo de complemento
    ,; // 08 – Permite Incluir Impostos no Rodape .T./.F.
    “SB1”,; // 09 – Alias do Cadastro de Produtos – (“SBI” P/ Front Loja)
    “MATA461”)

    if SC6->(DbSeek(FWxFilial(‘SC6’) + cNUM+cItem+cProduto))

    //Adiciona o item nos tratamentos de impostos
    SB1->(DbSeek(FWxFilial(“SB1”)+SC6->C6_PRODUTO))
    MaFisAdd(SC6->C6_PRODUTO,; // 01 – Codigo do Produto ( Obrigatorio )
    SC6->C6_TES,; // 02 – Codigo do TES ( Opcional )
    SC6->C6_QTDVEN-SC6->C6_QTDENT,; // 03 – Quantidade ( Obrigatorio )
    SC6->C6_PRCVEN,; // 04 – Preco Unitario ( Obrigatorio )
    SC6->C6_VALDESC,; // 05 – Desconto
    0,; // 06 – Numero da NF Original ( Devolucao/Benef )
    0,; // 07 – Serie da NF Original ( Devolucao/Benef )
    0,; // 08 – RecNo da NF Original no arq SD1/SD2
    0,; // 09 – Valor do Frete do Item ( Opcional )
    0,; // 10 – Valor da Despesa do item ( Opcional )
    0,; // 11 – Valor do Seguro do item ( Opcional )
    0,; // 12 – Valor do Frete Autonomo ( Opcional )
    (SC6->C6_QTDVEN-SC6->C6_QTDENT) * SC6->C6_PRCVEN ,; // 13 – Valor da Mercadoria ( Obrigatorio )
    0,; // 14 – Valor da Embalagem ( Opcional )
    0,; // 15 – RecNo do SB1
    0) // 16 – RecNo do SF4

    nValor = (SC6->C6_QTDVEN-SC6->C6_QTDENT) * SC6->C6_PRCVEN

    MaFisLoad(“IT_VALMERC”, nValor, 1)

    endif

    //Altera dados do cabeçalho
    MaFisAlt(“NF_FRETE”, SC5->C5_FRETE)
    MaFisAlt(“NF_SEGURO”, SC5->C5_SEGURO)
    MaFisAlt(“NF_DESPESA”, SC5->C5_DESPESA)
    MaFisAlt(“NF_AUTONOMO”, SC5->C5_FRETAUT)
    If SC5->C5_DESCONT > 0
    MaFisAlt(“NF_DESCONTO”, Min(MaFisRet(, “NF_VALMERC”)-0.01, SC5->C5_DESCONT+MaFisRet(, “NF_DESCONTO”)) )
    EndIf
    If SC5->C5_PDESCAB > 0
    MaFisAlt(“NF_DESCONTO”, A410Arred(MaFisRet(, “NF_VALMERC”)*SC5->C5_PDESCAB/100, “C6_VALOR”) + MaFisRet(, “NF_DESCONTO”))
    EndIf

    //Agora reposiciona nos itens para poder pegar os dados
    SC6->(DbGoTop())
    if SC6->(DbSeek(FWxFilial(‘SC6’) + cNUM+cItem+cProduto))
    //Pega os valores
    nBasICM := MaFisRet(1, “IT_BASEICM”)
    nValICM := MaFisRet(1, “IT_VALICM”)
    nValIPI := MaFisRet(1, “IT_VALIPI”)
    nAlqICM := MaFisRet(1, “IT_ALIQICM”)
    nAlqIPI := MaFisRet(1, “IT_ALIQIPI”)
    nValCof := MaFisRet(1, “IT_VALCOF”)
    nValPis := MaFisRet(1, “IT_VALPIS”)

    _nBaseCOF := MaFisRet(1,”IT_BASECOF”) //Base de calculo do COFINS
    _nAliqCOF := MaFisRet(1,”IT_ALIQCOF”) //Aliquota de calculo do COFINS
    _nValCOF := MaFisRet(1,”IT_VALCOF”) //Valor do COFINS

    endif
    nTotFrete := MaFisRet(, “NF_FRETE”)
    nTotVal := MaFisRet(, “NF_TOTAL”)
    MaFisEnd()

    RestArea(aArea)

    – Os campos que devem carregar os valores de PIS e cofins ficam sempre vazios

    POderia me ajudar ?

    Grata

    Verediana Santos

  13. Álvaro Vieira disse:

    Muito obrigado pelas dicas e gostaria de contribuir com um código que fiz baseado no seu e na documentação da MATXFis.
    Lá, diz que a função MaFisIniLoad é mais rápida que a MaFisAdd por não calcular os impostos no livro fiscal (SF3).
    Link p/ documentação da MTXFIS: https://vdocuments.com.br/matxfis-smartsigacombrwwwsmartsigacombrdownload57advpl470guia-de-utilizacaopdf.html

    Ah, nos comentários alguém diz que não retorna o valor do PIS/COFINS, o problema está no nome do imposto que deve ser IT_VALCF2.
    Parabéns pelo site!
    —-

    User Function PVNEnt2()

    SC5->(DbSeek(FWxFilial(“SC5″)+”006572”))

    MaFisIni(SC5->C5_CLIENTE,; // 01 – Codigo Cliente/Fornecedor
    SC5->C5_LOJACLI,; // 02 – Loja do Cliente/Fornecedor
    Iif(SC5->C5_TIPO $ “D;B”, “F”, “C”),; // 03 – C:Cliente , F:Fornecedor
    SC5->C5_TIPO,; // 04 – Tipo da NF
    SC5->C5_TIPOCLI,; // 05 – Tipo do Cliente/Fornecedor
    MaFisRelImp(“MT100”, {“SF2”, “SD2”}),; // 06 – Relacao de Impostos que suportados no arquivo
    ,; // 07 – Tipo de complemento
    ,; // 08 – Permite Incluir Impostos no Rodape .T./.F.
    “SB1”,; // 09 – Alias do Cadastro de Produtos – (“SBI” P/ Front Loja)
    “MATA461”) // 10 – Nome da rotina que esta utilizando a funcao

    nItem := 0
    nTotCofins := 0

    //Enquanto houver itens
    SC6->(DbSeek(FWxFilial(‘SC6’) + SC5->C5_NUM))
    While ! SC6->(EoF()) .And. SC6->C6_NUM == SC5->C5_NUM
    nItem++
    SB1->(DbSeek(FWxFilial(“SB1”)+SC6->C6_PRODUTO))
    SF4->(DbSeek(FWxFilial(“SF4″)+SC6->C6_TES))

    MaFisIniLoad(nItem,{ SC6->C6_PRODUTO,; //IT_PRODUTO
    SC6->C6_TES,; //IT_TES
    If(SF4->F4_ISS==”S”, SC6->C6_CODISS , ” ” ) ,; //IT_CODISS
    SC6->C6_QTDVEN,; //IT_QUANT
    SC6->C6_NFORI,; //IT_NFORI
    SC6->C6_SERIORI,; //IT_SERIORI
    SB1->(RecNo()),; //IT_RECNOSB1
    SF4->(RecNo()),; //IT_RECNOSF4
    SC6->(RecNo()),; //IT_RECORI
    SC6->C6_LOTECTL,; //IT_LOTECTL
    SC6->C6_NUMLOTE }) //IT_NUMLOTE
    MaFisTes(SC6->C6_TES,SF4->(RecNo()),nItem) // Carrega a TES para a Matxfis

    MaFisLoad(“IT_VALMERC”, SC6->C6_VALOR, nItem)

    MaFisRecal(“”,nItem) // Neste caso o calculo dos impostos é disparado a partir dos valores carregados
    MaFisEndLoad(nItem,2) // Fecha o calculo do item e atualiza os totalizadores do cabeçalho

    nBasICM := MaFisRet(nItem, “IT_BASEICM”)
    nValICM := MaFisRet(nItem, “IT_VALICM”)
    nValIPI := MaFisRet(nItem, “IT_VALIPI”)
    nAlqICM := MaFisRet(nItem, “IT_ALIQICM”)
    nAlqIPI := MaFisRet(nItem, “IT_ALIQIPI”)
    nValSol := (MaFisRet(nItem, “IT_VALSOL”) / SC6->C6_QTDVEN)
    nBasSol := MaFisRet(nItem, “IT_BASESOL”)
    nPrcUniSol := SC6->C6_PRCVEN + nValSol
    nTotSol := nPrcUniSol * SC6->C6_QTDVEN

    nAlqPIS := MaFisRet(nItem, “IT_ALIQPIS”)
    nValPIS := MaFisRet(nItem, “IT_VALPS2”)
    nAlqCOFINS := MaFisRet(nItem, “IT_ALIQCOF”)
    nValCOFINS := MaFisRet(nItem, “IT_VALCF2”)

    nTotCofins += nValCOFINS

    SC6->(DbSkip())
    EndDo

    MaFisEnd()

    Alert(nTotCofins)
    Alert(nValICM)

    Return

  14. Claudio disse:

    Opa, tudo bem? qual a estrutura do campo C5_X_TOTAL? no print só diz que é pra ser virtual.

    • Boa tarde Claudio, tudo sim graças a Deus e você?
      O tipo é numérico, e o número de casas decimais, depende da configuração da sua empresa (pois tem empresas que trabalham com 4 casas, tem empresas que trabalham com 2, etc), mas você pode copiar do C6_TOTAL por exemplo.
      Abraços.

  15. Edson Rene disse:

    Olá, tudo bem? Parabéns pelo conteúdo de grande utilidade. Saberia me dizer como a MATXFIS calcula a DIFAL?

    • Boa tarde Edson, tudo joia graças a Deus e você?

      Primeiramente obrigado pelo feedback.

      Nunca precisei buscar o DIFAL, mas se eu não me engano era algo como IT_DIFAL ou alguma coisa assim.

      Se eu encontrar algo, eu atualizo o artigo. Se você encontrar também, nos mande.

      Um grande abraço.

  16. Iuri disse:

    Boa tarde,
    com o campo virtual a tela ficou bem lenta.

    • Bom dia Iuri, tudo joia?

      Sim, fica lento mesmo, pois imagina, se você tiver 5 pedidos, ele terá que abrir 5 vezes os cálculos fiscais, correr todos os itens, e trazer o resultado.

      Agora imagina se forem 100 pedidos, 200, 500, etc… Quanto mais pedidos e itens, mais lento pode ser a performance.

      Ai ou você pode fazer um ponto de entrada ao abrir o pedido para filtrar e trazer só pedidos em aberto ou um período de data, ou você muda para ser um campo real, e grava o conteúdo através do ponto de entrada após a gravação da sc5 e sc6.

      Um forte abraço.

  17. Paula Linhares disse:

    Olá, bom dia! Seu conteúdo é excelente, muito obrigada!
    Mas estou com um problema aqui quando a base de cálculo do ICMS ST é definido com Valor Bruto da mercadoria no cadastro do TES no campo “Bs.ICMS ST” – F4_STDESC = 2 – Valor Bruto, o “NF_TOTAL” pega como se a base do ICMS ST fosse Valor líquido e dessa forma está incorreto, por acaso você já passou por essa situação?

Deixe uma resposta para macatubsCancelar resposta

Terminal de Informação