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))
	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)

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

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

30 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

    • Dan_Atilio disse:

      Boa noite.
      Entendi, então realmente não sei o que pode ser que esteja impactando, o exemplo que mandei funciona perfeitamente.
      Tente ver se não é a alguma atualização do Protheus.

  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.

Deixe uma resposta