Pular para o conteúdo principal

RNF020 — Estatística de Vendas por Vendedor

Fonte​

  • Source: source/RNF020/

Modelos de Relatorio​

O combobox "Modelo" (cmbMODELO, DataField = TP_RELATORIO) expõe 10 modelos. Cada opção altera o SQL montado em btnImprimirClick e o layout (RNF020, RNF020_V, RNF020_P, RNF020_Q, RNF020_I, RNF020_M, RNF020_U, RNF020_T, RNF020_A). Os modelos "Vendas por Cliente/Faturamento" ('C'), "Vendas Totalizadas" ('V') e "Vendas Cliente x Vendedor" ('N') compartilham o mesmo pipeline via VIEW_RNF020 com variação de tpRel e layout.

Modelo 1: Vendas por Cliente / Faturamento​

Quando usado: cmbMODELO.Value = 'C' (item "Vendas por Cliente / Faturamento"). Layout RNF020. tpRel = '' (sem trocas) ou 'O' (com trocas, se Mostra Trocas marcado).

Relatório analítico por cliente com 13 colunas mensais de faturamento. Aplica todas as quebras configuradas (Região, Vendedor, Grupo, SubGrupo, Seção, Medida, Município, Empresa) e divide o total pela quantidade de meses do período para obter média.

SQL Base:

SELECT NM_EMPRESA, <SELECT_DINAMICO>, NM_PESSOA, DS_COLUNA1, DS_COLUNA2, ...,
DS_COLUNA13,
SUM(VL_COLUNA1) VL_COLUNA1, ..., SUM(VL_COLUNA12) VL_COLUNA12,
SUM(VL_COLUNA13) / :NR_MESES VL_COLUNA13
FROM VIEW_RNF020(:CD_EMPRESA, :DT_INICIAL, :DT_FINAL,
:iSQL_NOTAS, :TP_REL, :iLEFT,
:iSQL_TROCAS, :iLEFT_TROCAS
[, 'S' se chkEmpresa.Checked])
GROUP BY NM_EMPRESA, <GROUP_DINAMICO>, NM_PESSOA, DS_COLUNA1..DS_COLUNA13
ORDER BY <ORDER_DINAMICO>, [NM_EMPRESA | VL_COLUNA13 DESC], NM_PESSOA

Modelo 2: Vendas Totalizadas​

Quando usado: cmbMODELO.Value = 'V' (item "Vendas Totalizadas"). Layout RNF020_V. tpRel = 'T' (sem trocas) ou 'R' (com trocas). Usa datas em formato dia/mês/ano (diferente dos outros que usam mês/ano).

Totalização consolidada do período informado (De/Até em dd/mm/yyyy, não mensal). Valida que data inicial não pode ser maior que final em granularidade de dia.

SQL Base: mesma estrutura do Modelo 1, trocando VIEW_RNF020 + Layout RNF020_V. Sem divisão por meses.

Modelo 3: Meta x Vendas​

Quando usado: cmbMODELO.Value = 'M' (item "Meta x Vendas"). Layout RNF020_M. SQL específico, não usa VIEW_RNF020. Possui duas variantes conforme PARMFATUR.ST_VARIOSVENDEDORES.

Compara meta cadastrada em METAVENDEDOR (via procedure RETORNA_METAVENDEDOR_MES) com o faturamento líquido descontado de devoluções (procedure RETORNA_SALDONOTADEVOLUCAO). Percentual atingido por vendedor, com opção de quebra por mês (chkQuebraMes).

SQL Base (sem vários vendedores):

SELECT V.CD_VENDEDOR, PV.NM_PESSOA NM_VENDEDOR,
[EXTRACT(MONTH FROM ...) QB_MES, MES.O_DS_MES DS_MES,]
SUM(SN.O_VL_LIQUIDO) VL_NOTAFISCAL,
COALESCE(M.O_VL_META,0) VL_META,
COALESCE(CASE WHEN M.O_VL_META IS NOT NULL
THEN ((SUM(IT.VL_LIQUIDO) - SUM(COALESCE(DV.VL_DEVOLUCAO,0))) * 100)
/ COALESCE(NULLIF(M.O_VL_META,0),1)
ELSE 0 END,0) PC_META
FROM VENDEDOR V
LEFT JOIN METAVENDEDOR ME ON ME.CD_VENDEDOR = V.CD_VENDEDOR
AND ME.DT_META BETWEEN :DT_INICIAL AND ULTIMODIAMES(:DT_FINAL)
INNER JOIN PESSOA PV ON PV.CD_PESSOA = V.CD_VENDEDOR
LEFT JOIN NOTA N ON N.TP_NOTA = 'S' AND N.ST_NOTA NOT IN ('C','E')
AND N.CD_EMPRESA = :CD_EMPRESA
AND N.DT_EMISSAO BETWEEN PRIMEIRODIAMES(ME.DT_META) AND ULTIMODIAMES(ME.DT_META)
AND N.CD_VENDEDOR = V.CD_VENDEDOR
LEFT JOIN RETORNA_METAVENDEDOR_MES(V.CD_VENDEDOR, ...) M ON 1=1
LEFT JOIN ITEMNOTA IT ON IT.CD_EMPRESA = N.CD_EMPRESA AND IT.TP_NOTA = 'S' ...
[INNER JOIN MOVIMENTACAO MP ON MP.CD_MOVIMENTACAO = IT.CD_MOVIMENTACAO
AND MP.ST_RECEITA = 'S'/'N'] -- se cmbGeraReceita <> Todos
LEFT JOIN DEVOLUCAONOTA DV ON DV.CD_EMPRORIG = IT.CD_EMPRESA ...
LEFT JOIN RETORNA_SALDONOTADEVOLUCAO(...) SN ON 1=1
[LEFT JOIN MES_EXTENSO(...) MES ON 1=1] -- se quebra por mês
WHERE 1=1 <FILTROS>
GROUP BY M.O_VL_META, V.CD_VENDEDOR, NM_VENDEDOR [, QB_MES, DS_MES, ANO]
HAVING SUM(COALESCE(IT.VL_LIQUIDO,0)) + SUM(COALESCE(DV.VL_DEVOLUCAO,0))
+ COALESCE(M.O_VL_META,0) > 0
ORDER BY [ANO, QB_MES, DS_MES,] V.CD_VENDEDOR

Variante com ST_VARIOSVENDEDORES='S' acrescenta LEFT JOIN em ITEMNOTAVENDEDOR e troca o predicado de ligação NOTA → VENDEDOR.

Modelo 4: Vendas Cliente x Vendedor​

Quando usado: cmbMODELO.Value = 'N' (item "Vendas Cliente x Vendedor"). Layout RNF020. tpRel = 'N' (sem trocas) ou 'C' (com trocas).

Mesmo pipeline do Modelo 1 (VIEW_RNF020), trocando tpRel para cruzar Cliente x Vendedor. Respeita TP_ORDENACAO (Nome/Crescente/Decrescente).

SQL Base: idêntico ao Modelo 1 com tpRel = 'N' ou 'C'.

Modelo 5: Vendas x Forma de Pagamento​

Quando usado: cmbMODELO.Value = 'T' (item "Vendas x Forma de Pagamento"). Layout RNF020_T. Ignora várias vendedores (warning W-0000 se ST_VARIOSVENDEDORES='S').

Totaliza VL_NOTAFISCAL por vendedor quebrado por forma de pagamento.

SQL Base:

SELECT COALESCE(N.CD_VENDEDOR||' - '||PV.NM_PESSOA,'SEM VENDEDOR') NM_VENDEDOR,
N.CD_FORMAPAGTO||' - '||F.DS_FORMAPAGTO DS_FORMAPAGTO,
SUM(N.VL_NOTAFISCAL) VL_TOTAL
FROM NOTA N
LEFT JOIN VENDEDOR V ON V.CD_VENDEDOR = N.CD_VENDEDOR
LEFT JOIN PESSOA PV ON PV.CD_PESSOA = V.CD_VENDEDOR
INNER JOIN FORMAPAGTO F ON F.CD_FORMAPAGTO = N.CD_FORMAPAGTO
WHERE N.TP_NOTA = 'S'
AND N.DT_EMISSAO >= :DT_INICIAL
AND N.DT_EMISSAO <= ULTIMODIAMES(:DT_FINAL)
<FILTROS>
GROUP BY NM_VENDEDOR, DS_FORMAPAGTO
ORDER BY NM_VENDEDOR, SUM(N.VL_NOTAFISCAL) DESC, DS_FORMAPAGTO

Modelo 6: Vendas Toneladas x Vendedor​

Quando usado: cmbMODELO.Value = 'U' (item "Vendas Toneladas x Vendedor"). Layout RNF020_U. Warning W-0000 se ST_VARIOSVENDEDORES='S'.

Soma quantidade convertida em toneladas (QT_ITEMNOTA * ITEM.PS_LIQUIDOEMB / 100) e VL_NOTAFISCAL por vendedor.

SQL Base:

SELECT (N.CD_VENDEDOR||' - '||PV.NM_PESSOA) NM_VENDEDOR,
SUM((NY.QT_ITEMNOTA * COALESCE(I.PS_LIQUIDOEMB,0) / 100)) QT_TONELADA,
SUM(N.VL_NOTAFISCAL) VL_NOTAFISCAL
FROM NOTA N
INNER JOIN VENDEDOR V ON V.CD_VENDEDOR = N.CD_VENDEDOR
INNER JOIN PESSOA PV ON PV.CD_PESSOA = V.CD_VENDEDOR
INNER JOIN ITEMNOTA NY ON NY.CD_EMPRESA = N.CD_EMPRESA
AND NY.NR_LANCAMENTO = N.NR_LANCAMENTO
AND NY.TP_NOTA = N.TP_NOTA
AND NY.CD_SERIE = N.CD_SERIE
INNER JOIN ITEM I ON I.CD_ITEM = NY.CD_ITEM
WHERE N.DT_EMISSAO >= :DT_INICIAL
AND N.DT_EMISSAO <= ULTIMODIAMES(:DT_FINAL)
<FILTROS>
GROUP BY N.CD_VENDEDOR, NM_VENDEDOR
ORDER BY N.CD_VENDEDOR

Modelo 7: Total Vendas/Mes x Comissao​

Quando usado: cmbMODELO.Value = 'A' (item "Total Vendas/Mês x Comissão"). Layout RNF020_A. Requer Empresa obrigatória. Usa duas queries (principal + sub1) via TListSQLGeraRelatorio.

Cruza VL_TOTAL e VL_COMISSAO por empresa/vendedor (principal) e detalha mês a mês (sub1) usando VIEW_COMISSAO.

SQL Base (principal):

SELECT DISTINCT NM_EMPRESA, NULL NM_EMPRESAQUEBRA, NM_VENDEDOR,
CD_VENDEDOR, CD_EMPRESA,
SUM(CASE COALESCE(NR_LANCAMENTO,0) WHEN 0 THEN 0 ELSE VL_TOTAL END) VL_TOTAL,
SUM(CASE COALESCE(NR_LANCAMENTO,0) WHEN 0 THEN 0 ELSE VL_COMISSAO END) VL_COMISSAO
FROM VIEW_COMISSAO(:SQL_FILTROS, 'N', 'EV', NULL)
GROUP BY NM_EMPRESA, NM_VENDEDOR, CD_VENDEDOR, CD_EMPRESA
ORDER BY NM_EMPRESA, CD_VENDEDOR

SQL Base (sub1 — detalhe mensal):

SELECT NM_EMPRESA, NM_VENDEDOR, CD_VENDEDOR, CD_EMPRESA,
SUM(VL_TOTAL) VL_TOTAL, SUM(VL_SALDO) VL_SALDO,
SUM(VL_LIQUIDO) VL_LIQUIDO,
SUM(VL_COMISSAO) VL_COMISSAO,
SUM(VL_COMISSAOTOTAL) VL_COMISSAOTOTAL,
SUM(VL_COMISSAOPAGA) VL_COMISSAOPAGA,
EXTRACT(MONTH FROM DT_EMISSAO) || '/' || EXTRACT(YEAR FROM DT_EMISSAO) DATA,
M.O_DS_ABREVIACAOMES || '/' || EXTRACT(YEAR FROM DT_EMISSAO) MESANO
FROM VIEW_COMISSAO(:SQL_FILTROS_SUBVEND, 'N', 'EV', NULL)
LEFT JOIN MES_EXTENSO(DT_EMISSAO) M ON 1=1
GROUP BY NM_EMPRESA, NM_VENDEDOR, CD_VENDEDOR, CD_EMPRESA,
EXTRACT(MONTH FROM DT_EMISSAO), EXTRACT(YEAR FROM DT_EMISSAO),
M.O_DS_ABREVIACAOMES
ORDER BY EXTRACT(YEAR FROM DT_EMISSAO), NM_EMPRESA, NM_VENDEDOR,
EXTRACT(MONTH FROM DT_EMISSAO)

Modelo 8: Vendas por Cliente / Quantidade​

Quando usado: cmbMODELO.Value = 'Q' (item "Vendas por Cliente / Quantidade"). Layout RNF020_Q. tpRel = 'X' (sem trocas) ou 'Q' (com trocas). Usa VIEW_RNF020 sem divisão por meses (quantidade, não média).

Mesma estrutura do Modelo 1 mas sem dividir por NR_MESES (soma agregada), ordenação por TP_ORDENACAO aplicada em VL_COLUNA13.

SQL Base: idêntico ao Modelo 1 sem / :NR_MESES.

Modelo 9: Valor de Comissao por Vendedor​

Quando usado: cmbMODELO.Value = 'P' (item "Valor de Comissão por Vendedor"). Layout RNF020_P. tpRel = 'P'.

Variante do Modelo 1 quebrada por vendedor (ao invés de cliente). Se ST_VARIOSVENDEDORES='S', força LEFT JOIN em ITEMNOTAVENDEDOR para buscar comissão. Filtra WHERE VL_COLUNA13 IS NOT NULL AND VL_COLUNA13 > 0.

SQL Base:

SELECT NM_VENDEDOR, DS_COLUNA1..DS_COLUNA13,
SUM(VL_COLUNA1) VL_COLUNA1, ..., SUM(VL_COLUNA12) VL_COLUNA12,
SUM(VL_COLUNA13) / :NR_MESES VL_COLUNA13
FROM VIEW_RNF020(:CD_EMPRESA, :DT_INICIAL, :DT_FINAL,
:iSQL_NOTAS, 'P', :iLEFT,
:iSQL_TROCAS, :iLEFT_TROCAS)
WHERE VL_COLUNA13 IS NOT NULL AND VL_COLUNA13 > 0
GROUP BY NM_VENDEDOR, <GROUP_DINAMICO>, DS_COLUNA1..DS_COLUNA13
ORDER BY NM_VENDEDOR

Modelo 10: Vendas por Produto​

Quando usado: cmbMODELO.Value = 'I' (item "Vendas por Produto"). Layout RNF020_I. tpRel = 'X' (sem trocas) ou 'Q' (com trocas). Usa VIEW_RNF020_V (variante de produto) com 14 colunas.

Agrupa por produto (DS_ITEM) ao invés de cliente. Divide VL_COLUNA14 pela quantidade de meses. Respeita quebra por empresa (chkEmpresa).

SQL Base:

SELECT NM_EMPRESA, <SELECT_DINAMICO>, DS_ITEM, DS_COLUNA1..DS_COLUNA14,
SUM(VL_COLUNA1) VL_COLUNA1, ..., SUM(VL_COLUNA13) VL_COLUNA13,
SUM(VL_COLUNA14) / :NR_MESES VL_COLUNA14
FROM VIEW_RNF020_V(:CD_EMPRESA, :DT_INICIAL, :DT_FINAL,
:iSQL_NOTAS, :TP_REL, :iLEFT,
:iSQL_TROCAS, :iLEFT_TROCAS
[, 'S' se chkEmpresa.Checked])
WHERE DS_ITEM <> ''
GROUP BY NM_EMPRESA, <GROUP_DINAMICO>, DS_ITEM, DS_COLUNA1..DS_COLUNA14
ORDER BY <ORDER_DINAMICO>, <iSqlConsulta>

Filtros​

Campos simples:

  • Empresa (Lista de Empresas) F9 — obrigatória para o Modelo 7 (Total Vendas/Mês x Comissão)
  • Modelo (10 opções: Vendas por Cliente / Faturamento, Vendas Totalizadas, Meta x Vendas, Vendas Cliente x Vendedor, Vendas x Forma de Pagamento, Vendas Toneladas x Vendedor, Total Vendas/Mês x Comissão, Vendas por Cliente / Quantidade, Valor de Comissão por Vendedor, Vendas por Produto) — troca SQL, layout e filtros visíveis
  • Ordem (Empresa / Média de Vendas)
  • Pessoa Física/Jurídica (Ambas / Física / Jurídica) — oculto por padrão (visibilidade controlada por AtualizaFiltro); aplica CHARACTER_LENGTH(P.NR_CNPJCPF) = 14 (Física) ou = 18 (Jurídica)
  • Ordenar (Nome Cliente / Total Crescente / Total Decrescente) — oculto por padrão; afeta ORDER BY quando visível
  • Gera Financ. (Sim / Não / Todos) — adiciona M.CD_TIPOCONTA IS [NOT] NULL ao SQL
  • Gera Receita (Sim / Não / Todos) — adiciona M.ST_RECEITA = 'S'/'N' (ou INNER JOIN MOVIMENTACAO MP no Modelo 3)
  • Período De / Até (meses no formato MM/yyyy, exceto Modelo 2 que usa dd/mm/yyyy) — obrigatório; período máximo de 12 meses

Opções de Quebra (checkboxes — agem no SELECT/GROUP BY/ORDER BY do modelo):

  • Quebra por Região Comercial (chkRegiao) — marcado por default
  • Quebra por Vendedor (chkVendedor) — força LEFT JOIN em ITEMNOTAVENDEDOR quando ST_VARIOSVENDEDORES='S'
  • Quebra Grupo (chkGrupo)
  • Quebra SubGrupo (chkSubGrupo)
  • Quebra por Seção (chkSecao)
  • Quebra por Medida (chkMedida)
  • Quebra por Mês (chkQuebraMes) — aplicável no Modelo 3 (Meta x Vendas)
  • Quebra por Município (chkMunicipio)
  • Quebra por Empresa (chkEmpresa) — só aplicável nos Modelos 1 ('C') e 10 ('I')
  • Mostra Trocas (chkMostraTrocas) — altera tpRel para incluir notas de troca
  • Não listar as Seções informadas (chkIGNORASECAO) — inverte filtro de Seção de IN para NOT IN

Filtros de grid (multi-selecao via F9):

Aba "Clientes / Grupos / Seções":

  • Clientes (Lista de Clientes) F9 — filtra N.CD_PESSOA IN (...)
  • Grupos (Lista de Grupos) F9 — filtra IM.CD_GRUPO IN (...)
  • Sub Grupos (Lista de Sub Grupos) F9 — filtra IM.CD_SUBGRUPO IN (...)
  • Seções (Lista de Seções) F9 — filtra IM.CD_SECAO IN/NOT IN (...) conforme chkIGNORASECAO
  • Perfil de Itens (Lista de Perfil de Itens) F9 — filtra IPRF.CD_PERFIL IN (...) via LEFT JOIN ITEMPERFIL
  • Perfil de Clientes (Lista de Clientes) F9 — oculto por default; filtra PP.CD_PERFIL IN (...) via LEFT JOIN PESSOAPERFIL

Aba "Movimentações / Vendedores / Região Comercial / Município":

  • Movimentações (Lista de Movimentações) F9 — filtra M.CD_MOVIMENTACAO IN (...)
  • Vendedores (Lista de Vendedores) F9 — filtra N.CD_VENDEDOR IN (...) ou ITV.CD_VENDEDOR IN (...) conforme ST_VARIOSVENDEDORES
  • Tipo Vendedor (Lista de Tipo de Vendedores) F9 — visível apenas se ST_VARIOSVENDEDORES='S'; adiciona LEFT JOIN TIPOVENDEDOR + filtra TP.CD_TIPO IN (...)
  • Município (Lista de Municípios) F9 — filtra MU.CD_MUNICIPIO IN (...)
  • Região Comercial (Lista de Regiões Comerciais) F9 — filtra R.CD_REGIAOCOMERCIAL IN (...)

Parametros que Influenciam​

TabelaCampoEfeito
PARMFATURST_VARIOSVENDEDORESQuando 'S', força LEFT JOIN em ITEMNOTAVENDEDOR (comissão rateada entre múltiplos vendedores), habilita o grid "Tipo Vendedor" e troca os predicados de ligação NOTA-VENDEDOR nos Modelos 1, 3, 4, 8, 9 e 10. Nos Modelos 5 ('T'), 6 ('U') e 7 ('A') exibe warning W-0000 alertando que o modelo não funciona corretamente com vários vendedores.

Perguntas Frequentes​

P: O sistema apresenta a mensagem "É Obrigatório Informar a Empresa para Realizar a Consulta!". O que devo fazer? R: Para o modelo de relatório selecionado, o campo Empresa é de preenchimento obrigatório. Informe o código da empresa antes de realizar a consulta.

P: Ao informar o período, o sistema exibe a mensagem "A Data Inicial não pode ser Maior que a Data Final!". Como corrigir? R: O sistema não permite que a Data Inicial (Mês Inicial) seja posterior à Data Final (Mês Final). Corrija o período para que a data inicial seja igual ou anterior à data final.

P: Recebo a mensagem "É Obrigatório Informar o Mês Inicial do Período para Realizar a Consulta!". Como proceder? R: O campo Mês Inicial do período é de preenchimento obrigatório. Informe uma data válida no campo Mês Inicial antes de prosseguir com a consulta.

P: O sistema apresenta a mensagem "É Obrigatório Informar o Mês Final do Período para Realizar a Consulta!". O que significa? R: O campo Mês Final do período é de preenchimento obrigatório. Informe uma data válida no campo Mês Final antes de prosseguir com a consulta.

P: Recebo a mensagem "O Período Máximo Permitido é de 12 meses. Verifique!". O que devo fazer? R: O sistema permite um período máximo de 12 meses entre o Mês Inicial e o Mês Final. Reduza o intervalo de datas para que não ultrapasse 12 meses.

P: O sistema exibe a mensagem "Consulta não retornou registros!". Por que isso acontece? R: Não foram encontrados registros que atendam aos filtros informados. Verifique se os filtros de empresa, período, vendedor, cliente, região comercial e demais critérios estão preenchidos corretamente.

P: Aparece a mensagem "A Empresa não está Cadastrada [ADM002]!". Como resolver? R: O código de empresa informado não foi encontrado no cadastro. Verifique se o código está correto ou acesse a tela de Cadastro de Empresas (ADM002) para confirmar o registro.

P: O sistema apresenta a mensagem "O Vendedor não está Cadastrado [TFA007]!". O que devo verificar? R: O código do vendedor informado não foi localizado no cadastro. Verifique se o código está correto ou acesse a tela de Cadastro de Vendedores (TFA007) para confirmar o registro.

P: Recebo a mensagem "A Região Comercial não está Cadastrada [TFA014]!". O que fazer? R: O código da região comercial informado não existe no cadastro. Verifique o código digitado ou acesse a tela de Cadastro de Regiões Comerciais (TFA014) para consultar as regiões disponíveis.

P: O sistema exibe a mensagem "O Grupo não está Cadastrado [TPO006]!". Como proceder? R: O código do grupo de produtos informado não foi encontrado. Verifique se o código está correto ou acesse a tela de Cadastro de Grupos de Produtos (TPO006) para consultar os grupos disponíveis.

P: Aparece a mensagem "O Cliente não está Cadastrado [TFA001]!". O que devo fazer? R: O código do cliente informado não foi localizado no cadastro. Verifique se o código está correto ou acesse a tela de Cadastro de Pessoas (TFA001) para confirmar o registro.

P: Recebo a mensagem "O Perfil não está Cadastrado [TPO033]!". Como resolver? R: O código do perfil informado não foi encontrado. Verifique se o código está correto ou acesse a tela de Cadastro de Perfis (TPO033) para consultar os perfis disponíveis.

P: O sistema apresenta a mensagem "O SubGrupo não está Cadastrado! [TPO007]". O que significa? R: O código do subgrupo de produtos informado não foi localizado. Verifique se o código está correto ou acesse a tela de Cadastro de Subgrupos (TPO007) para confirmar o registro.

P: Recebo a mensagem "A Movimentação não está Cadastrada! [TCB001]". O que devo verificar? R: O código da movimentação informado não foi encontrado. Verifique se o código está correto ou acesse a tela de Cadastro de Movimentações (TCB001) para confirmar o registro.

P: O sistema exibe a mensagem "A Seção não está Cadastrada! [TPO008]". Como proceder? R: O código da seção informado não foi localizado. Verifique se o código está correto ou acesse a tela de Cadastro de Seções (TPO008) para confirmar o registro.

P: Aparece a mensagem "O tipo de vendedor não está Cadastrado [TFA064]!". O que devo fazer? R: O código do tipo de vendedor informado não foi encontrado. Verifique se o código está correto ou acesse a tela de Cadastro de Tipos de Vendedor (TFA064) para consultar os tipos disponíveis.

P: O sistema apresenta a mensagem "O Município não está Cadastrado [TFA003]!". Como resolver? R: O código do município informado não foi encontrado. Verifique o código digitado ou acesse a tela de Cadastro de Municípios (TFA003) para confirmar o cadastro.

P: Qual é a finalidade da tela RNF020? R: A tela RNF020 é utilizada para gerar relatórios abrangentes de análise de vendas. Oferece mais de 10 modelos de relatório, incluindo vendas por cliente/faturamento, vendas totais, metas de vendas versus realizado, comparativo cliente x vendedor, vendas por forma de pagamento, tonelagem por vendedor, vendas/comissões mensais, quantidade por cliente, valores de comissão e vendas por produto. Os filtros disponíveis incluem empresa, período, cliente, vendedor, região comercial, grupo de produtos, subgrupo, seção, município, perfil e tipo de vendedor.

Mensagens exibidas​

Levantadas de source/RNF020/ pela camada 0 (commit 96fc51e236).

CódigoTipoMensagem
W-0231AvisoA data inicial não pode ser maior que a data final!
W-0232AvisoA data final não pode ser menor que a data inicial!

Mais 24 mensagens com texto literal no código: RNF020.

Parâmetros lidos​

Campos PARM* lidos via values[] em source/RNF020/ (commit 96fc51e236).

ParâmetroTabela
ST_VARIOSVENDEDORESPARMFATUR

Tabelas de Escrita (INSERT/UPDATE/DELETE)​

TabelaOperacoes
EMPRESADELETE, INSERT, SELECT, UPDATE
PESSOADELETE, INSERT, SELECT, UPDATE
REGIAOCOMERCIALDELETE, INSERT, SELECT, UPDATE

Tabelas de Leitura (SELECT)​

TabelaOperacoes
DEVOLUCAONOTASELECT
FORMAPAGTOSELECT
GRUPOSELECT
ITEMSELECT
ITEMNOTASELECT
ITEMNOTAVENDEDORSELECT
ITEMPERFILSELECT
METAVENDEDORSELECT
MOVIMENTACAOSELECT
MUNICIPIOSELECT
NOTASELECT
PARMFATURSELECT
PERFILSELECT
PESSOAPERFILSELECT
SECAOSELECT
SUBGRUPOSELECT
TIPOVENDEDORSELECT
VENDEDORSELECT

Procedures Chamadas​

ProcedureTabelas Acessadas
MES_EXTENSO-
RETORNA_METAVENDEDOR_MESMETAVENDEDOR (SELECT)
RETORNA_SALDONOTADEVOLUCAODEVOLUCAONOTA (SELECT), ITEM (SELECT), ITEMNOTA (SELECT), NOTA (SELECT), TIPOCALCULO (SELECT)
VIEW_COMISSAOEMPRESA (SELECT), PARMFATUR (SELECT), SESSAO (INSERT/SELECT)
VIEW_RNF020EMPRESA (SELECT), ENDERECOPESSOA (SELECT), GRUPO (SELECT), ITEM (SELECT), ITEMNOTA (SELECT), ITEMNOTAVENDEDOR (SELECT) +14
VIEW_RNF020_VEMPRESA (SELECT), ENDERECOPESSOA (SELECT), GRUPO (SELECT), ITEM (SELECT), ITEMNOTA (SELECT), ITEMTROCA (SELECT) +10

Tabelas via Procedures (acesso indireto)​

TabelaOperacoes
DEVOLUCAONOTASELECT
EMPRESASELECT
ENDERECOPESSOASELECT
GRUPOSELECT
ITEMSELECT
ITEMNOTASELECT
ITEMNOTAVENDEDORSELECT
ITEMTROCASELECT
MEDIDAPNEUSELECT
METAVENDEDORSELECT
MOVIMENTACAOSELECT
MUNICIPIOSELECT
NOTASELECT
PARMFATURSELECT
PESSOASELECT
REGIAOCOMERCIALSELECT
SECAOSELECT
SERVICOPNEUSELECT
SESSAOINSERT, SELECT
SUBGRUPOSELECT
...+2 tabelas

Modelos de Relatório​

O combobox "Modelo" (cmbMODELO, DataField = TP_RELATORIO) expõe 10 modelos. Cada opção altera o SQL montado em btnImprimirClick e o layout (RNF020, RNF020_V, RNF020_P, RNF020_Q, RNF020_I, RNF020_M, RNF020_U, RNF020_T, RNF020_A). Os modelos "Vendas por Cliente/Faturamento" ('C'), "Vendas Totalizadas" ('V') e "Vendas Cliente x Vendedor" ('N') compartilham o mesmo pipeline via VIEW_RNF020 com variação de tpRel e layout.

Modelo 1: Vendas por Cliente / Faturamento​

Quando usado: cmbMODELO.Value = 'C' (item "Vendas por Cliente / Faturamento"). Layout RNF020. tpRel = '' (sem trocas) ou 'O' (com trocas, se Mostra Trocas marcado).

Relatório analítico por cliente com 13 colunas mensais de faturamento. Aplica todas as quebras configuradas (Região, Vendedor, Grupo, SubGrupo, Seção, Medida, Município, Empresa) e divide o total pela quantidade de meses do período para obter média.

SQL Base:

SELECT NM_EMPRESA, <SELECT_DINAMICO>, NM_PESSOA, DS_COLUNA1, DS_COLUNA2, ...,
DS_COLUNA13,
SUM(VL_COLUNA1) VL_COLUNA1, ..., SUM(VL_COLUNA12) VL_COLUNA12,
SUM(VL_COLUNA13) / :NR_MESES VL_COLUNA13
FROM VIEW_RNF020(:CD_EMPRESA, :DT_INICIAL, :DT_FINAL,
:iSQL_NOTAS, :TP_REL, :iLEFT,
:iSQL_TROCAS, :iLEFT_TROCAS
[, 'S' se chkEmpresa.Checked])
GROUP BY NM_EMPRESA, <GROUP_DINAMICO>, NM_PESSOA, DS_COLUNA1..DS_COLUNA13
ORDER BY <ORDER_DINAMICO>, [NM_EMPRESA | VL_COLUNA13 DESC], NM_PESSOA

Modelo 2: Vendas Totalizadas​

Quando usado: cmbMODELO.Value = 'V' (item "Vendas Totalizadas"). Layout RNF020_V. tpRel = 'T' (sem trocas) ou 'R' (com trocas). Usa datas em formato dia/mês/ano (diferente dos outros que usam mês/ano).

Totalização consolidada do período informado (De/Até em dd/mm/yyyy, não mensal). Valida que data inicial não pode ser maior que final em granularidade de dia.

SQL Base: mesma estrutura do Modelo 1, trocando VIEW_RNF020 + Layout RNF020_V. Sem divisão por meses.

Modelo 3: Meta x Vendas​

Quando usado: cmbMODELO.Value = 'M' (item "Meta x Vendas"). Layout RNF020_M. SQL específico, não usa VIEW_RNF020. Possui duas variantes conforme PARMFATUR.ST_VARIOSVENDEDORES.

Compara meta cadastrada em METAVENDEDOR (via procedure RETORNA_METAVENDEDOR_MES) com o faturamento líquido descontado de devoluções (procedure RETORNA_SALDONOTADEVOLUCAO). Percentual atingido por vendedor, com opção de quebra por mês (chkQuebraMes).

SQL Base (sem vários vendedores):

SELECT V.CD_VENDEDOR, PV.NM_PESSOA NM_VENDEDOR,
[EXTRACT(MONTH FROM ...) QB_MES, MES.O_DS_MES DS_MES,]
SUM(SN.O_VL_LIQUIDO) VL_NOTAFISCAL,
COALESCE(M.O_VL_META,0) VL_META,
COALESCE(CASE WHEN M.O_VL_META IS NOT NULL
THEN ((SUM(IT.VL_LIQUIDO) - SUM(COALESCE(DV.VL_DEVOLUCAO,0))) * 100)
/ COALESCE(NULLIF(M.O_VL_META,0),1)
ELSE 0 END,0) PC_META
FROM VENDEDOR V
LEFT JOIN METAVENDEDOR ME ON ME.CD_VENDEDOR = V.CD_VENDEDOR
AND ME.DT_META BETWEEN :DT_INICIAL AND ULTIMODIAMES(:DT_FINAL)
INNER JOIN PESSOA PV ON PV.CD_PESSOA = V.CD_VENDEDOR
LEFT JOIN NOTA N ON N.TP_NOTA = 'S' AND N.ST_NOTA NOT IN ('C','E')
AND N.CD_EMPRESA = :CD_EMPRESA
AND N.DT_EMISSAO BETWEEN PRIMEIRODIAMES(ME.DT_META) AND ULTIMODIAMES(ME.DT_META)
AND N.CD_VENDEDOR = V.CD_VENDEDOR
LEFT JOIN RETORNA_METAVENDEDOR_MES(V.CD_VENDEDOR, ...) M ON 1=1
LEFT JOIN ITEMNOTA IT ON IT.CD_EMPRESA = N.CD_EMPRESA AND IT.TP_NOTA = 'S' ...
[INNER JOIN MOVIMENTACAO MP ON MP.CD_MOVIMENTACAO = IT.CD_MOVIMENTACAO
AND MP.ST_RECEITA = 'S'/'N'] -- se cmbGeraReceita <> Todos
LEFT JOIN DEVOLUCAONOTA DV ON DV.CD_EMPRORIG = IT.CD_EMPRESA ...
LEFT JOIN RETORNA_SALDONOTADEVOLUCAO(...) SN ON 1=1
[LEFT JOIN MES_EXTENSO(...) MES ON 1=1] -- se quebra por mês
WHERE 1=1 <FILTROS>
GROUP BY M.O_VL_META, V.CD_VENDEDOR, NM_VENDEDOR [, QB_MES, DS_MES, ANO]
HAVING SUM(COALESCE(IT.VL_LIQUIDO,0)) + SUM(COALESCE(DV.VL_DEVOLUCAO,0))
+ COALESCE(M.O_VL_META,0) > 0
ORDER BY [ANO, QB_MES, DS_MES,] V.CD_VENDEDOR

Variante com ST_VARIOSVENDEDORES='S' acrescenta LEFT JOIN em ITEMNOTAVENDEDOR e troca o predicado de ligação NOTA → VENDEDOR.

Modelo 4: Vendas Cliente x Vendedor​

Quando usado: cmbMODELO.Value = 'N' (item "Vendas Cliente x Vendedor"). Layout RNF020. tpRel = 'N' (sem trocas) ou 'C' (com trocas).

Mesmo pipeline do Modelo 1 (VIEW_RNF020), trocando tpRel para cruzar Cliente x Vendedor. Respeita TP_ORDENACAO (Nome/Crescente/Decrescente).

SQL Base: idêntico ao Modelo 1 com tpRel = 'N' ou 'C'.

Modelo 5: Vendas x Forma de Pagamento​

Quando usado: cmbMODELO.Value = 'T' (item "Vendas x Forma de Pagamento"). Layout RNF020_T. Ignora várias vendedores (warning W-0000 se ST_VARIOSVENDEDORES='S').

Totaliza VL_NOTAFISCAL por vendedor quebrado por forma de pagamento.

SQL Base:

SELECT COALESCE(N.CD_VENDEDOR||' - '||PV.NM_PESSOA,'SEM VENDEDOR') NM_VENDEDOR,
N.CD_FORMAPAGTO||' - '||F.DS_FORMAPAGTO DS_FORMAPAGTO,
SUM(N.VL_NOTAFISCAL) VL_TOTAL
FROM NOTA N
LEFT JOIN VENDEDOR V ON V.CD_VENDEDOR = N.CD_VENDEDOR
LEFT JOIN PESSOA PV ON PV.CD_PESSOA = V.CD_VENDEDOR
INNER JOIN FORMAPAGTO F ON F.CD_FORMAPAGTO = N.CD_FORMAPAGTO
WHERE N.TP_NOTA = 'S'
AND N.DT_EMISSAO >= :DT_INICIAL
AND N.DT_EMISSAO <= ULTIMODIAMES(:DT_FINAL)
<FILTROS>
GROUP BY NM_VENDEDOR, DS_FORMAPAGTO
ORDER BY NM_VENDEDOR, SUM(N.VL_NOTAFISCAL) DESC, DS_FORMAPAGTO

Modelo 6: Vendas Toneladas x Vendedor​

Quando usado: cmbMODELO.Value = 'U' (item "Vendas Toneladas x Vendedor"). Layout RNF020_U. Warning W-0000 se ST_VARIOSVENDEDORES='S'.

Soma quantidade convertida em toneladas (QT_ITEMNOTA * ITEM.PS_LIQUIDOEMB / 100) e VL_NOTAFISCAL por vendedor.

SQL Base:

SELECT (N.CD_VENDEDOR||' - '||PV.NM_PESSOA) NM_VENDEDOR,
SUM((NY.QT_ITEMNOTA * COALESCE(I.PS_LIQUIDOEMB,0) / 100)) QT_TONELADA,
SUM(N.VL_NOTAFISCAL) VL_NOTAFISCAL
FROM NOTA N
INNER JOIN VENDEDOR V ON V.CD_VENDEDOR = N.CD_VENDEDOR
INNER JOIN PESSOA PV ON PV.CD_PESSOA = V.CD_VENDEDOR
INNER JOIN ITEMNOTA NY ON NY.CD_EMPRESA = N.CD_EMPRESA
AND NY.NR_LANCAMENTO = N.NR_LANCAMENTO
AND NY.TP_NOTA = N.TP_NOTA
AND NY.CD_SERIE = N.CD_SERIE
INNER JOIN ITEM I ON I.CD_ITEM = NY.CD_ITEM
WHERE N.DT_EMISSAO >= :DT_INICIAL
AND N.DT_EMISSAO <= ULTIMODIAMES(:DT_FINAL)
<FILTROS>
GROUP BY N.CD_VENDEDOR, NM_VENDEDOR
ORDER BY N.CD_VENDEDOR

Modelo 7: Total Vendas/Mes x Comissao​

Quando usado: cmbMODELO.Value = 'A' (item "Total Vendas/Mês x Comissão"). Layout RNF020_A. Requer Empresa obrigatória. Usa duas queries (principal + sub1) via TListSQLGeraRelatorio.

Cruza VL_TOTAL e VL_COMISSAO por empresa/vendedor (principal) e detalha mês a mês (sub1) usando VIEW_COMISSAO.

SQL Base (principal):

SELECT DISTINCT NM_EMPRESA, NULL NM_EMPRESAQUEBRA, NM_VENDEDOR,
CD_VENDEDOR, CD_EMPRESA,
SUM(CASE COALESCE(NR_LANCAMENTO,0) WHEN 0 THEN 0 ELSE VL_TOTAL END) VL_TOTAL,
SUM(CASE COALESCE(NR_LANCAMENTO,0) WHEN 0 THEN 0 ELSE VL_COMISSAO END) VL_COMISSAO
FROM VIEW_COMISSAO(:SQL_FILTROS, 'N', 'EV', NULL)
GROUP BY NM_EMPRESA, NM_VENDEDOR, CD_VENDEDOR, CD_EMPRESA
ORDER BY NM_EMPRESA, CD_VENDEDOR

SQL Base (sub1 — detalhe mensal):

SELECT NM_EMPRESA, NM_VENDEDOR, CD_VENDEDOR, CD_EMPRESA,
SUM(VL_TOTAL) VL_TOTAL, SUM(VL_SALDO) VL_SALDO,
SUM(VL_LIQUIDO) VL_LIQUIDO,
SUM(VL_COMISSAO) VL_COMISSAO,
SUM(VL_COMISSAOTOTAL) VL_COMISSAOTOTAL,
SUM(VL_COMISSAOPAGA) VL_COMISSAOPAGA,
EXTRACT(MONTH FROM DT_EMISSAO) || '/' || EXTRACT(YEAR FROM DT_EMISSAO) DATA,
M.O_DS_ABREVIACAOMES || '/' || EXTRACT(YEAR FROM DT_EMISSAO) MESANO
FROM VIEW_COMISSAO(:SQL_FILTROS_SUBVEND, 'N', 'EV', NULL)
LEFT JOIN MES_EXTENSO(DT_EMISSAO) M ON 1=1
GROUP BY NM_EMPRESA, NM_VENDEDOR, CD_VENDEDOR, CD_EMPRESA,
EXTRACT(MONTH FROM DT_EMISSAO), EXTRACT(YEAR FROM DT_EMISSAO),
M.O_DS_ABREVIACAOMES
ORDER BY EXTRACT(YEAR FROM DT_EMISSAO), NM_EMPRESA, NM_VENDEDOR,
EXTRACT(MONTH FROM DT_EMISSAO)

Modelo 8: Vendas por Cliente / Quantidade​

Quando usado: cmbMODELO.Value = 'Q' (item "Vendas por Cliente / Quantidade"). Layout RNF020_Q. tpRel = 'X' (sem trocas) ou 'Q' (com trocas). Usa VIEW_RNF020 sem divisão por meses (quantidade, não média).

Mesma estrutura do Modelo 1 mas sem dividir por NR_MESES (soma agregada), ordenação por TP_ORDENACAO aplicada em VL_COLUNA13.

SQL Base: idêntico ao Modelo 1 sem / :NR_MESES.

Modelo 9: Valor de Comissao por Vendedor​

Quando usado: cmbMODELO.Value = 'P' (item "Valor de Comissão por Vendedor"). Layout RNF020_P. tpRel = 'P'.

Variante do Modelo 1 quebrada por vendedor (ao invés de cliente). Se ST_VARIOSVENDEDORES='S', força LEFT JOIN em ITEMNOTAVENDEDOR para buscar comissão. Filtra WHERE VL_COLUNA13 IS NOT NULL AND VL_COLUNA13 > 0.

SQL Base:

SELECT NM_VENDEDOR, DS_COLUNA1..DS_COLUNA13,
SUM(VL_COLUNA1) VL_COLUNA1, ..., SUM(VL_COLUNA12) VL_COLUNA12,
SUM(VL_COLUNA13) / :NR_MESES VL_COLUNA13
FROM VIEW_RNF020(:CD_EMPRESA, :DT_INICIAL, :DT_FINAL,
:iSQL_NOTAS, 'P', :iLEFT,
:iSQL_TROCAS, :iLEFT_TROCAS)
WHERE VL_COLUNA13 IS NOT NULL AND VL_COLUNA13 > 0
GROUP BY NM_VENDEDOR, <GROUP_DINAMICO>, DS_COLUNA1..DS_COLUNA13
ORDER BY NM_VENDEDOR

Modelo 10: Vendas por Produto​

Quando usado: cmbMODELO.Value = 'I' (item "Vendas por Produto"). Layout RNF020_I. tpRel = 'X' (sem trocas) ou 'Q' (com trocas). Usa VIEW_RNF020_V (variante de produto) com 14 colunas.

Agrupa por produto (DS_ITEM) ao invés de cliente. Divide VL_COLUNA14 pela quantidade de meses. Respeita quebra por empresa (chkEmpresa).

SQL Base:

SELECT NM_EMPRESA, <SELECT_DINAMICO>, DS_ITEM, DS_COLUNA1..DS_COLUNA14,
SUM(VL_COLUNA1) VL_COLUNA1, ..., SUM(VL_COLUNA13) VL_COLUNA13,
SUM(VL_COLUNA14) / :NR_MESES VL_COLUNA14
FROM VIEW_RNF020_V(:CD_EMPRESA, :DT_INICIAL, :DT_FINAL,
:iSQL_NOTAS, :TP_REL, :iLEFT,
:iSQL_TROCAS, :iLEFT_TROCAS
[, 'S' se chkEmpresa.Checked])
WHERE DS_ITEM <> ''
GROUP BY NM_EMPRESA, <GROUP_DINAMICO>, DS_ITEM, DS_COLUNA1..DS_COLUNA14
ORDER BY <ORDER_DINAMICO>, <iSqlConsulta>