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:
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.
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.
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
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:
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
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.
Realmente nao consegui, mas esta empresa esta com release 12.1.14, preciso atualizar e testar novamente. Muito obrigada pela atenção!
Entendi Regina, se quiser me adicione no Skype, que talvez podemos tentar te ajudar.
Um grande abraço.
grande mestre, me ajudando como sempre…. ótima função!! abraçosss
Valeu mano Gui.
Um grande abraço.
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?
Bom dia Leandro, tudo bem?
Infelizmente para o Call Center não tenho exemplos =/
Um grande abraço.
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!
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.
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.
Boa tarde Dan, obrigado pelo retorno.
Entendi, é possível utilizar ao Mafis pelo excel? Eu uso bastante relacionamento de tabelas para obter resultados, mas nesse caso não consegui ainda.
Minha intenção é fazer uma pré nota onde eu consiga ver por item o valor que será faturado.
Tem a opção pré nota, mas não mostra detalhado.
Valeu aí pela disposição do seu tempo.
Abraço
Bom dia Elizeu, tudo bem?
Então, pelo Excel não, mas você conseguiria montar um array antes e mandar para FWMSExcel, ou até mesmo montar os dados antes e imprimir, similar a esse link https://terminaldeinformacao.com/2018/01/08/relatorio-grafico-de-pedidos-de-venda/ .
Espero ter ajudado.
Abraços.
Muito obrigado pela ajuda Dan! Não vou conseguir mexer pois o acesso que tenho só me permite criar soluções pelo excel. rs
Mesmo assim muito obrigado!
Opa, eu que agradeço Elizeu.
Abraços jovem.
Esta variável nItAtu tem de ser apenas declarada, ou nItAtu :- SC6->C6_ITEM ?
Obrigado.
Boa noite Ricardo.
Realmente me esqueci de declarar, rs… Basta declarar com 1 e depois ir incrementando conforme o número dos itens.
Um grande abraço.
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.
Na teoria sim.
Você teria que alterar os dados da SC5 e SC6 para as tabelas de orçamento, se eu não me engano, SCJ e SCK.
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.)
Bom dia Leopoldo.
Opa, obrigado pelo comentário, desconhecia essa função.
Grande abraço.
Igor, deu certo pra te? fiz um teste rápido aqui , mas não retornou o valor total do orçamento. 🙁
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
Bom dia Verediana, tudo bem?
O macete é adicionar todos os itens, e depois sim você pegar os valores.
Caso queira, entre em contato via skype ( link – https://atiliosistemas.com/contato/ )
Outro ponto, é que nós disponibilizamos gratuitamente um relatório gráfico de pedido de venda para o Protheus, exclusivo para os assinantes dos cursos ( link – https://terminaldeinformacao.com/2018/01/08/relatorio-grafico-de-pedidos-de-venda/ )
Grande abraço.
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
Opa, muito obrigado pelo comentário Álvaro.
A contribuição será de enorme ajuda.
Grande abraço.
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.
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.
É isso mesmo, IT_DIFAL, não tem “VAL” na frente.
Bom dia Arthur, tudo joia?
Opa, obrigado pelo comentário.
Um grande abraço.
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.
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?
Bom dia Paula, tudo joia?
Primeiramente agradecemos o feedback, é muita generosidade e bondade sua.
Quanto a essa situação, infelizmente ainda não passamos por ela, vamos ficar devendo =(
Ola Daniel tudo bem ?Como esta?
Dentro desse exemplo eu conseguiria trazer só o campo C6_valor sem os imposto no browser?
Bom dia José, tudo joia graças a Deus e você?
Sim, no seu laço da SC6, vá incrementando tudo numa variável, tipo nValSC6 += SC6->C6_VALOR.
Ai depois retorne esse valor, exemplo Return nValSC6.
Para não ficar lento, você poderia comentar todas as outras linhas que tem MaFis*.
Um grande abraço.
Boa noite Mestre, mais uma vez obrigado pela ajuda.
Criei o campo e compilei os 2 programas, no entanto está trazendo valor zerado, oque acha que pode estar acontecendo?
Quando visualizo um pedido e volto pro browser a tela dá uma travada (atualizando) o valores são carregados e depois volta a ficar zerados!!
OBS:
Outra questão, compilei apenas o primeiro códido, sem as demais atualizações.
Bom dia Rodrigo, tudo joia?
Acha, nós que agradecemos pelo comentário.
O campo que você criou esta como Virtual, e no Inic Browse esta como u_zTotPed()?
Se sim, na função zTotPed, antes do Return nValPed, coloca um alert, algo +- assim:
[…]
Alert(“Pedido: ” + cNumPed + “, valor: ” + cValToChar(nValPed))
Return nValPed
[…]
Feito isso, ai você coloca um breakpoint nesse alert, e veja se o valor que está vindo bate com o pedido posicionado ou se o valor esta vindo zerado.
Fico no aguardo.
Tenha uma ótima e abençoada segunda feira.
Um grande abraço.