Pular para o conteúdo principal

RNF004 — Relação de Notas Fiscais

Fonte​

  • Source: source/RNF004/

Objetivo​

Gerar a relação de notas fiscais (entrada e saída) emitidas/recebidas pela empresa, com múltiplos filtros (período de emissão, período de recebimento do fornecedor, pessoa, produto, vendedor, usuário, série/espécie, placa de veículo, transportador) e opções de quebra (município, condição de pagamento, origem pedido/nota) para análise fiscal, financeira e logística.

Modelos de Relatorio​

A tela possui um único fluxo de impressão (botão Imprimir <F>) — não há combobox "Modelo". O SQL é montado dinamicamente a partir dos filtros e opções de quebra selecionados. Documentado aqui como "Modelo 1: Padrão".

Modelo 1: Padrão (Relação de Notas Fiscais)​

Quando usado: acionado pelo botão Imprimir <F> — fluxo único do relatório (btnImprimirClick).

Traz, para cada nota no período e filtros informados: empresa, número, data de emissão, pessoa (cliente/fornecedor), CNPJ/CPF, município/estado, forma de pagamento, data de recebimento (DT_FORNECEDOR), placa do veículo, valor e valor líquido (entradas saem com sinal negativo). Quando Mostrar Detalhe da Nota está marcado, uma sub-query traz os itens (ITEMNOTA + ITEM) de cada nota.

Quebras dinâmicas adicionadas ao SELECT/GROUP BY/ORDER BY conforme os checkboxes de quebra marcados: Município, Condição Pagto, Origem Pedido/Nota e Tipo da Nota (quando "Todas"). O JOIN de vendedor muda conforme PARMFATUR.ST_VARIOSVENDEDORES — 'S' ativa JOIN com ITEMNOTAVENDEDOR (multi-vendedor por item); 'N' usa NOTA.CD_VENDEDOR. Situação da NFe filtra através de JOIN condicional com NFE (protocolo nulo = Pendente, CSTAT='302' = Denegadas).

Layout: LNF004 (resolvido pelo GeraRelatorio(... 'RNF004' ...)).

SQL Base (nota principal):

SELECT
-- SELECT dinamico (iSEL) por quebras:
-- Empresa (ou 'Empresas Consolidadas')
-- DS_ORIGEM (se ST_ORIGEM = 'S')
-- DS_MUNICIPIO (se ST_MUNICIPIO = 'S')
-- DS_CONDPAGTO (se ST_CONDPAGTO = 'S')
-- TIPO_NOTA (se TP_NOTA = 'T')
N.CD_EMPRESA, N.NR_LANCAMENTO, N.TP_NOTA, N.CD_SERIE,
N.DT_EMISSAO, COALESCE(N.NR_NOTAFISCAL, N.NR_NOTAFOR) NR_NOTA,
N.CD_PESSOA, P.NM_PESSOA||COALESCE(' - '||P.NM_FANTASIA,'') NM_PESSOA,
M.SG_ESTADO, N.DT_VENCIMENTO, P.NR_CNPJCPF,
F.CD_FORMAPAGTO, F.DS_FORMAPAGTO,
N.DT_FORNECEDOR, B.NR_PLACA,
RE.SG_ESTADO SG_ESTADOORIGEM,
MUN.SG_ESTADO SG_ESTADODESTINO,
N.VL_NOTAFISCAL,
CASE N.TP_NOTA WHEN 'E' THEN N.VL_NOTAFISCAL * -1
ELSE N.VL_NOTAFISCAL END VL_LIQUIDO,
:ST_DETALHE ST_DETALHE
FROM NOTA N
INNER JOIN ITEMNOTA NI ON (N.CD_EMPRESA = NI.CD_EMPRESA
AND N.NR_LANCAMENTO = NI.NR_LANCAMENTO
AND N.CD_SERIE = NI.CD_SERIE
AND N.TP_NOTA = NI.TP_NOTA)
INNER JOIN EMPRESA E ON (N.CD_EMPRESA = E.CD_EMPRESA)
INNER JOIN USUARIOEMPRESA UE ON (UE.CD_EMPRESA = E.CD_EMPRESA
AND UE.CD_USUARIO = :CD_USUARIO)
INNER JOIN PESSOA P ON (N.CD_PESSOA = P.CD_PESSOA)
INNER JOIN CONDPAGTO C ON (N.CD_CONDPAGTO = C.CD_CONDPAGTO)
INNER JOIN ENDERECOPESSOA D ON (N.CD_PESSOA = D.CD_PESSOA
AND N.CD_ENDERECO = D.CD_ENDERECO)
INNER JOIN MUNICIPIO M ON (D.CD_MUNICIPIO = M.CD_MUNICIPIO)
INNER JOIN FORMAPAGTO F ON (N.CD_FORMAPAGTO = F.CD_FORMAPAGTO)
INNER JOIN MOVIMENTACAO MOV ON (MOV.CD_MOVIMENTACAO = NI.CD_MOVIMENTACAO)
INNER JOIN ITEM I ON (I.CD_ITEM = NI.CD_ITEM)
LEFT JOIN ENDERECOPESSOA RC ON (RC.CD_PESSOA = N.CD_PESSOA
AND RC.CD_ENDERECO = N.CD_ENDERECO)
LEFT JOIN MUNICIPIO MUN ON (MUN.CD_MUNICIPIO = RC.CD_MUNICIPIO)
LEFT JOIN RETORNA_DADOSCADASTRAIS(E.CD_PESSOA, NULL) RE ON (1 = 1)
LEFT JOIN EMBARQUE B ON (B.CD_EMPRESA = N.CD_EMPEMB
AND B.NR_EMBARQUE = N.NR_EMBARQUE)
-- JOINs condicionais (iInnerJoin):
-- Vendedor (se multi-selecao):
-- PARMFATUR.ST_VARIOSVENDEDORES='S' -> INNER JOIN ITEMNOTAVENDEDOR INV + PESSOA V
-- senao -> INNER JOIN PESSOA V ON V.CD_PESSOA = N.CD_VENDEDOR
-- Situacao NFe (cmbST_NFE <> 'T'):
-- 'S' (Transmitida) -> INNER JOIN NFE NF ON NF.NR_PROTOCOLOAUT IS NOT NULL
-- 'P' (Pendente) -> INNER JOIN NFE NF ON NF.NR_PROTOCOLOAUT IS NULL AND NF.CSTAT IS NULL
-- 'D' (Denegadas) -> INNER JOIN NFE NF ON NF.NR_PROTOCOLOAUT IS NULL AND NF.CSTAT = '302'
WHERE N.CD_EMPRESA = N.CD_EMPRESA
-- filtros (ver secao Filtros)
AND N.CD_EMPRESA = :CD_EMPRESA -- se informado
AND N.TP_NOTA = :TP_NOTA -- se <> 'T'
AND N.ST_NOTA = :ST_NOTA -- se <> 'T'
AND N.CD_FORMAPAGTO = :CD_FORMAPAGTO -- se informado
AND NI.CD_TABPRECO = :CD_TABPRECO -- se informado
AND M.SG_ESTADO = :SG_ESTADO -- se informado
AND N.DT_EMISSAO BETWEEN :DT_INI AND :DT_FIM -- periodo emissao
AND N.DT_FORNECEDOR BETWEEN :DT_FINI AND :DT_FFIM -- periodo recebimento
AND NI.CD_ITEM IN (...) -- grid Produtos
AND N.CD_PESSOA IN/NOT IN (...) -- grid Pessoas (checkbox Exceto)
AND N.CD_CONDPAGTO IN (...) -- grid Condicoes de Pagamento
AND M.CD_MUNICIPIO IN (...) -- grid Municipios
AND NI.CD_MOVIMENTACAO IN (...) -- grid Movimentacoes
AND N.CD_VENDEDOR IN (...) -- grid Vendedores (quando nao multi)
AND N.CD_USUARIO IN (...) -- grid Usuarios
AND B.NR_PLACA IN (...) -- grid Placas / Veiculos
AND B.CD_TRANSPORTADOR IN (...) -- grid Transportadores
AND COALESCE(TRIM(N.CD_SERIEFOR)||TRIM(N.CD_ESPECIEFOR),
TRIM(N.CD_SERIE)||TRIM(N.CD_ESPECIE))
IN/NOT IN (...) -- grid Serie Nota Fiscal (checkbox Exceto)
AND I.TP_ITEM = 'S' -- Tipo Produto = Serviços
AND I.TP_ITEM <> 'S' -- Tipo Produto = Produtos
AND MOV.ST_MESTRA = 'N' -- Excluir Remessas / Mestras
AND MOV.ST_DEVOLUCAO = 'N' -- Excluir Devolucoes / Retornos
AND MOV.CD_TIPOCONTA IS NOT NULL -- Somente Gera Financeiro
AND P.CD_TIPOPESSOA = :CD_TIPOPESSOA -- se informado
GROUP BY <iORDEM dinamico>, <cmbORDEM.Value>,
N.CD_EMPRESA, N.NR_LANCAMENTO, N.TP_NOTA, N.CD_SERIE,
COALESCE(N.NR_NOTAFISCAL, N.NR_NOTAFOR),
N.CD_PESSOA, P.NM_PESSOA||COALESCE(' - '||P.NM_FANTASIA,''),
M.SG_ESTADO, N.DT_VENCIMENTO, P.NR_CNPJCPF,
F.CD_FORMAPAGTO, F.DS_FORMAPAGTO,
N.DT_FORNECEDOR, B.NR_PLACA, RE.SG_ESTADO, MUN.SG_ESTADO,
N.DT_EMISSAO, N.VL_NOTAFISCAL,
CASE N.TP_NOTA WHEN 'E' THEN N.VL_NOTAFISCAL * -1 ELSE N.VL_NOTAFISCAL END,
:ST_DETALHE
ORDER BY <iORDEM dinamico>, <cmbORDEM.Value>

SQL sub (detalhe de itens — quando Mostrar Detalhe da Nota = 'S'):

SELECT NI.CD_EMPRESA, NI.NR_LANCAMENTO, NI.TP_NOTA, NI.CD_SERIE,
I.DS_ITEM||' - '||I.CD_ITEM DS_ITEM,
NI.PS_ITEMNOTA, NI.QT_ITEMNOTA,
NI.VL_UNITARIO, NI.VL_DESCONTO, NI.VL_TOTAL,
(NI.VL_TOTAL - COALESCE(NI.VL_DESCONTO,0)) VL_LIQUIDO
FROM ITEMNOTA NI
INNER JOIN ITEM I ON (NI.CD_ITEM = I.CD_ITEM)
WHERE NI.CD_EMPRESA = :CD_EMPRESA
AND NI.NR_LANCAMENTO = :NR_LANCAMENTO
AND NI.TP_NOTA = :TP_NOTA
AND NI.CD_SERIE = :CD_SERIE
AND NI.CD_TABPRECO = :CD_TABPRECO -- se informado
AND NI.CD_MOVIMENTACAO IN (...) -- grid Movimentacoes
AND I.TP_ITEM = 'S' | <> 'S' -- Tipo Produto

Filtros​

Campos simples:

  • Empresa (Lista de Empresas do usuário) F9 — default sessao.empresa.cd_empresa
  • Emissão / Recebto De / Até (período de emissão da nota — DT_INICIAL / DT_FINAL)
  • Emissão Fornec. De / Até (período da data do fornecedor — DT_FORNECEDORINI / DT_FORNECEDORFIM)
  • Tipo da Nota (Venda / Compra / Todas) — default "Venda"
  • Situação (Válida / Cancelada / Todas / Excluídas) — default "Válida"
  • NFe (Transmitida / Pendente / Todas / Denegadas) — default "Transmitida"; altera o JOIN com NFE
  • Tipo Produto (Produtos / Serviços / Todos) — default "Todos"
  • Forma de Pagamento (Lista de Formas de Pagamento) F9
  • Tabela de Preço (Lista de Tabelas de Preço) F9
  • Estado (Lista de Estados) F9 — sigla
  • Tipo Pessoa (Lista TIPOPESSOA) F9
  • Exceto Pessoas (checkbox) — inverte o IN da grid Pessoas para NOT IN

Exclusão de Movimentos:

  • Excluir Remessas / Mestras (ST_REMESSA — aplica MOV.ST_MESTRA = 'N')
  • Excluir Devoluções / Retornos (ST_DEVOLUCAO — aplica MOV.ST_DEVOLUCAO = 'N')
  • Somente Gera Financeiro (ST_FINANCEIRO — aplica MOV.CD_TIPOCONTA IS NOT NULL)

Opções de Quebra e Ordem:

  • Mostrar Detalhe da Nota (ST_DETALHE) — inclui sub-relatório de itens
  • Município (ST_MUNICIPIO) — adiciona M.DS_MUNICIPIO||' - '||M.SG_ESTADO ao SELECT/GROUP/ORDER
  • Origem Pedido Nota (ST_ORIGEM) — adiciona sub-select classificando como "ORDEM SERVIÇO" / "PEDIDO" / "AVULSA"
  • Condição Pagto (ST_CONDPAGTO) — adiciona C.DS_CONDPAGTO||' - '||C.CD_CONDPAGTO
  • Ordem (4 opções): Data Emissão -> Nº Nota -> Pessoa (default) / Nº Nota -> Data Emissão -> Pessoa / Pessoa -> Data Emissão -> Nº Nota / Data Fornecedor -> Nº Nota -> Pessoa

Filtros de grid (multi-seleção via F9) — aba "Pessoas/Vendedores/Produtos/Notas":

  • Pessoas Física / Jurídica (Lista de Pessoas Busca 'PESSOA') F9 — multi-seleção; combinada com "Exceto Pessoas" vira NOT IN
  • Municípios (Pesquisa DS_MUNICIPIO||' - '||SG_ESTADO) F9 — multi-seleção
  • Movimentações (Pesquisa DS_MOVIMENTACAO onde ST_ATIVO='S') F9 — multi-seleção; também filtra itens no sub-relatório
  • Produtos (Pesquisa DS_ITEM onde ST_ATIVO='S') F9 — multi-seleção; também filtra itens no sub-relatório
  • Condições de Pagamento (Pesquisa DS_CONDPAGTO) F9 — multi-seleção
  • Vendedores (Pesquisa PESSOA + VENDEDOR onde ST_ATIVA='S') F9 — multi-seleção; JOIN depende de PARMFATUR.ST_VARIOSVENDEDORES
  • Usuários (Pesquisa NM_USUARIO em USUARIO) F9 — multi-seleção
  • Série Nota Fiscal (Busca 'SERIEESPECIE') F9 — multi-seleção por série + espécie; checkbox "Exceto" inverte para NOT IN

Filtros de grid (multi-seleção via F9) — aba "Veículos/Transportadores":

  • Placas / Veículos (Busca 'VEICULOS') F9 — multi-seleção
  • Transportadores (Busca 'PESSOAS') F9 — multi-seleção

Parametros que Influenciam​

TabelaCampoEfeito
PARMFATURST_VARIOSVENDEDORESQuando 'S', o filtro de Vendedores passa a usar JOIN em ITEMNOTAVENDEDOR (vendedor por item) em vez de NOTA.CD_VENDEDOR (vendedor único por nota)

Perguntas Frequentes​

P: Qual e a finalidade da tela RNF004? R: A tela RNF004 e utilizada para gerar listagens e relatorios de notas fiscais com filtros abrangentes. O módulo permite filtrar por empresa, tipo de nota (venda, compra, devolucao, etc.), status da nota (emitida, cancelada, inutilizada), forma de pagamento, tabela de preco, estado, periodo, produto, pessoa fisica/juridica, condicao de pagamento, municipio, movimentação, vendedor, usuario, serie, placa e transportador. Tambem permite filtrar por status de NFe (autorizada, denegada, cancelada, inutilizada). O relatorio exibe informacoes detalhadas das notas fiscais emitidas no periodo e criterios selecionados.


P: Ao gerar o relatorio, o sistema apresenta a mensagem "Nao Foi Encontrado Nenhum Registro!". O que devo fazer? R: A consulta com os filtros informados nao encontrou nenhuma nota fiscal correspondente. Verifique os filtros aplicados e ajuste-os para ampliar a busca. Considere verificar o periodo, a empresa, o tipo e o status da nota.

P: Ao informar a Empresa, recebo a mensagem "O Usuario nao tem Acesso a Empresa! Verifique.". Como resolver? R: O usuario atual nao possui permissao de acesso a empresa informada. Verifique se o codigo da empresa esta correto ou solicite ao administrador do sistema que conceda acesso a empresa desejada na tela ADM001.

P: O sistema exibe a mensagem "A Empresa nao esta Cadastrada! Verifique [ADM002]". Como proceder? R: O codigo de empresa informado nao existe no cadastro do sistema. Verifique o codigo digitado ou utilize a tecla F9 para buscar uma empresa valida na tela ADM002.

P: Recebi a mensagem "O Produto nao esta Ativo [TPO001]!". O que significa? R: O produto informado esta com status inativo no cadastro. Verifique se o codigo esta correto. Caso precise utilizar este produto, acesse a tela TPO001 para verificar e reativar o cadastro.

P: O sistema apresenta a mensagem "O Código do Produto nao esta Cadastrado [TPO001]!". Como resolver? R: O codigo de produto informado nao existe no cadastro de produtos. Verifique o codigo digitado ou use a tecla F9 para buscar um produto valido na tela TPO001.

P: Ao informar as datas, recebo a mensagem "A Data Inicial nao pode ser Maior que a Data Final!". O que devo fazer? R: A data informada no campo "Data Inicial" e posterior a "Data Final". Corrija as datas para que a data inicial seja igual ou anterior a data final.

P: O sistema exibe a mensagem "A Data Final nao pode ser Menor que a Data Inicial!". Como corrigir? R: A data informada no campo "Data Final" e anterior a "Data Inicial". Ajuste a data final para que seja igual ou posterior a data inicial.

P: Ao informar a Pessoa, recebo a mensagem "A Pessoa Fisica / Juridica nao esta Cadastrada [TFA001]!". Como proceder? R: O codigo de pessoa informado nao existe no cadastro de pessoas. Verifique o codigo digitado ou use a tecla F9 para buscar uma pessoa valida na tela TFA001.

P: O sistema apresenta a mensagem "O Municipio nao esta Cadastrado [TFA003]!". Como resolver? R: O codigo de municipio informado nao existe no cadastro de municipios. Verifique o codigo digitado ou use a tecla F9 para buscar um municipio valido na tela TFA003.

P: Recebi a mensagem "A Condicao de Pagamento nao esta Cadastrada [TFC002]!". O que devo fazer? R: O codigo de condicao de pagamento informado nao existe no cadastro. Verifique o codigo digitado ou use a tecla F9 para buscar uma condicao de pagamento valida na tela TFC002.

P: O sistema exibe a mensagem "A Forma de Pagamento nao esta Cadastrada [TFC001]!". Como proceder? R: O codigo de forma de pagamento informado nao existe no cadastro. Verifique o codigo digitado ou use a tecla F9 para buscar uma forma de pagamento valida na tela TFC001.

P: Recebi a mensagem "A Tabela de Preco nao esta Cadastrada [TFA006]!". Como resolver? R: O codigo de tabela de preco informado nao existe no cadastro. Verifique o codigo digitado ou use a tecla F9 para buscar uma tabela de preco valida na tela TFA006.

P: O sistema apresenta a mensagem "A Movimentação nao esta Ativa [TCB001]!". O que significa? R: A movimentação informada existe no cadastro, porem esta com status inativo. Verifique se o codigo esta correto. Caso precise utilizar esta movimentação, acesse a tela TCB001 para verificar e reativar o cadastro.

P: Recebi a mensagem "O Código da Movimentação nao esta Cadastrado [TCB001]!". Como proceder? R: O codigo de movimentação informado nao existe no cadastro. Verifique o codigo digitado ou use a tecla F9 para buscar uma movimentação valida na tela TCB001.

P: Ao informar o Vendedor, o sistema exibe a mensagem "O Vendedor nao esta Cadastrado [TFA007]!". O que devo fazer? R: O codigo de vendedor informado nao existe no cadastro de vendedores. Verifique o codigo digitado ou use a tecla F9 para buscar um vendedor valido na tela TFA007.

P: Recebi a mensagem "O Estado nao esta Cadastrado [TFA004]!". Como resolver? R: O codigo de estado (UF) informado nao existe no cadastro. Verifique o codigo digitado ou use a tecla F9 para buscar um estado valido na tela TFA004.

P: O sistema apresenta a mensagem "O Tipo de Pessoa nao esta Cadastrado [TFA005]!". O que significa? R: O codigo de tipo de pessoa informado nao existe no cadastro. Verifique o codigo digitado ou use a tecla F9 para buscar um tipo de pessoa valido na tela TFA005.

P: Recebi a mensagem "O Código do Usuario nao esta Cadastrado [ADM001]!". Como proceder? R: O codigo de usuario informado nao existe no cadastro de usuarios. Verifique o codigo digitado ou use a tecla F9 para buscar um usuario valido na tela ADM001.

P: O sistema exibe a mensagem "Serie Nao Cadastrada. Verifique! [TFI007]". O que devo fazer? R: O codigo de serie informado nao existe no cadastro de series. Verifique o codigo digitado ou use a tecla F9 para buscar uma serie valida na tela TFI007.

P: Recebi a mensagem "O Transportador nao esta Cadastrado! Verifique [TFA001]". Como resolver? R: O codigo de transportador informado nao existe no cadastro de pessoas/transportadores. Verifique o codigo digitado ou use a tecla F9 para buscar um transportador valido na tela TFA001.

Mensagens exibidas​

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

Mais 22 mensagens com texto literal no código: RNF004.

Tabelas de Escrita (INSERT/UPDATE/DELETE)​

TabelaOperacoes
CONDPAGTODELETE, INSERT, SELECT, UPDATE
EMPRESADELETE, INSERT, SELECT, UPDATE
ITEMDELETE, INSERT, SELECT, UPDATE
JUNCAOVEICULODELETE, INSERT, SELECT, UPDATE
MUNICIPIODELETE, INSERT, SELECT, UPDATE
PARMNOTADELETE, INSERT, SELECT, UPDATE
PESSOADELETE, INSERT, SELECT, UPDATE
USUARIODELETE, INSERT, SELECT, UPDATE

Tabelas de Leitura (SELECT)​

TabelaOperacoes
EMBARQUESELECT
ENDERECOPESSOASELECT
ESTADOSELECT
FORMAPAGTOSELECT
IMPOSTOSELECT
IMPOSTONOTASELECT
ITEMNOTASELECT
ITEMNOTAVENDEDORSELECT
MODELONFSELECT
MOVIMENTACAOSELECT
NFESELECT
NOTASELECT
PARMFATURSELECT
PEDIDOSELECT
PEDIDONOTASELECT
TABPRECOSELECT
TIPOPESSOASELECT
USUARIOEMPRESASELECT
VEICULOSELECT
VENDEDORSELECT

Procedures Chamadas​

ProcedureTabelas Acessadas
RETORNA_DADOSCADASTRAISAREACOMERCIAL (SELECT), ENDERECOPESSOA (SELECT), ESTADO (SELECT), FORMAPAGTO (SELECT), GRUPOPCP (SELECT), MUNICIPIO (SELECT) +4

Tabelas via Procedures (acesso indireto)​

TabelaOperacoes
AREACOMERCIALSELECT
ENDERECOPESSOASELECT
ESTADOSELECT
FORMAPAGTOSELECT
GRUPOPCPSELECT
MUNICIPIOSELECT
PAISBACENSELECT
PESSOASELECT
PESSOAFISICASELECT
REGIAOCOMERCIALSELECT

Modelos de Relatório​

A tela possui um único fluxo de impressão (botão Imprimir &lt;F&gt;) — não há combobox "Modelo". O SQL é montado dinamicamente a partir dos filtros e opções de quebra selecionados. Documentado aqui como "Modelo 1: Padrão".

Modelo 1: Padrão (Relação de Notas Fiscais)​

Quando usado: acionado pelo botão Imprimir &lt;F&gt; — fluxo único do relatório (btnImprimirClick).

Traz, para cada nota no período e filtros informados: empresa, número, data de emissão, pessoa (cliente/fornecedor), CNPJ/CPF, município/estado, forma de pagamento, data de recebimento (DT_FORNECEDOR), placa do veículo, valor e valor líquido (entradas saem com sinal negativo). Quando Mostrar Detalhe da Nota está marcado, uma sub-query traz os itens (ITEMNOTA + ITEM) de cada nota.

Quebras dinâmicas adicionadas ao SELECT/GROUP BY/ORDER BY conforme os checkboxes de quebra marcados: Município, Condição Pagto, Origem Pedido/Nota e Tipo da Nota (quando "Todas"). O JOIN de vendedor muda conforme PARMFATUR.ST_VARIOSVENDEDORES — 'S' ativa JOIN com ITEMNOTAVENDEDOR (multi-vendedor por item); 'N' usa NOTA.CD_VENDEDOR. Situação da NFe filtra através de JOIN condicional com NFE (protocolo nulo = Pendente, CSTAT='302' = Denegadas).

Layout: LNF004 (resolvido pelo GeraRelatorio(... 'RNF004' ...)).

SQL Base (nota principal):

SELECT
-- SELECT dinamico (iSEL) por quebras:
-- Empresa (ou 'Empresas Consolidadas')
-- DS_ORIGEM (se ST_ORIGEM = 'S')
-- DS_MUNICIPIO (se ST_MUNICIPIO = 'S')
-- DS_CONDPAGTO (se ST_CONDPAGTO = 'S')
-- TIPO_NOTA (se TP_NOTA = 'T')
N.CD_EMPRESA, N.NR_LANCAMENTO, N.TP_NOTA, N.CD_SERIE,
N.DT_EMISSAO, COALESCE(N.NR_NOTAFISCAL, N.NR_NOTAFOR) NR_NOTA,
N.CD_PESSOA, P.NM_PESSOA||COALESCE(' - '||P.NM_FANTASIA,'') NM_PESSOA,
M.SG_ESTADO, N.DT_VENCIMENTO, P.NR_CNPJCPF,
F.CD_FORMAPAGTO, F.DS_FORMAPAGTO,
N.DT_FORNECEDOR, B.NR_PLACA,
RE.SG_ESTADO SG_ESTADOORIGEM,
MUN.SG_ESTADO SG_ESTADODESTINO,
N.VL_NOTAFISCAL,
CASE N.TP_NOTA WHEN 'E' THEN N.VL_NOTAFISCAL * -1
ELSE N.VL_NOTAFISCAL END VL_LIQUIDO,
:ST_DETALHE ST_DETALHE
FROM NOTA N
INNER JOIN ITEMNOTA NI ON (N.CD_EMPRESA = NI.CD_EMPRESA
AND N.NR_LANCAMENTO = NI.NR_LANCAMENTO
AND N.CD_SERIE = NI.CD_SERIE
AND N.TP_NOTA = NI.TP_NOTA)
INNER JOIN EMPRESA E ON (N.CD_EMPRESA = E.CD_EMPRESA)
INNER JOIN USUARIOEMPRESA UE ON (UE.CD_EMPRESA = E.CD_EMPRESA
AND UE.CD_USUARIO = :CD_USUARIO)
INNER JOIN PESSOA P ON (N.CD_PESSOA = P.CD_PESSOA)
INNER JOIN CONDPAGTO C ON (N.CD_CONDPAGTO = C.CD_CONDPAGTO)
INNER JOIN ENDERECOPESSOA D ON (N.CD_PESSOA = D.CD_PESSOA
AND N.CD_ENDERECO = D.CD_ENDERECO)
INNER JOIN MUNICIPIO M ON (D.CD_MUNICIPIO = M.CD_MUNICIPIO)
INNER JOIN FORMAPAGTO F ON (N.CD_FORMAPAGTO = F.CD_FORMAPAGTO)
INNER JOIN MOVIMENTACAO MOV ON (MOV.CD_MOVIMENTACAO = NI.CD_MOVIMENTACAO)
INNER JOIN ITEM I ON (I.CD_ITEM = NI.CD_ITEM)
LEFT JOIN ENDERECOPESSOA RC ON (RC.CD_PESSOA = N.CD_PESSOA
AND RC.CD_ENDERECO = N.CD_ENDERECO)
LEFT JOIN MUNICIPIO MUN ON (MUN.CD_MUNICIPIO = RC.CD_MUNICIPIO)
LEFT JOIN RETORNA_DADOSCADASTRAIS(E.CD_PESSOA, NULL) RE ON (1 = 1)
LEFT JOIN EMBARQUE B ON (B.CD_EMPRESA = N.CD_EMPEMB
AND B.NR_EMBARQUE = N.NR_EMBARQUE)
-- JOINs condicionais (iInnerJoin):
-- Vendedor (se multi-selecao):
-- PARMFATUR.ST_VARIOSVENDEDORES='S' -> INNER JOIN ITEMNOTAVENDEDOR INV + PESSOA V
-- senao -> INNER JOIN PESSOA V ON V.CD_PESSOA = N.CD_VENDEDOR
-- Situacao NFe (cmbST_NFE <> 'T'):
-- 'S' (Transmitida) -> INNER JOIN NFE NF ON NF.NR_PROTOCOLOAUT IS NOT NULL
-- 'P' (Pendente) -> INNER JOIN NFE NF ON NF.NR_PROTOCOLOAUT IS NULL AND NF.CSTAT IS NULL
-- 'D' (Denegadas) -> INNER JOIN NFE NF ON NF.NR_PROTOCOLOAUT IS NULL AND NF.CSTAT = '302'
WHERE N.CD_EMPRESA = N.CD_EMPRESA
-- filtros (ver secao Filtros)
AND N.CD_EMPRESA = :CD_EMPRESA -- se informado
AND N.TP_NOTA = :TP_NOTA -- se <> 'T'
AND N.ST_NOTA = :ST_NOTA -- se <> 'T'
AND N.CD_FORMAPAGTO = :CD_FORMAPAGTO -- se informado
AND NI.CD_TABPRECO = :CD_TABPRECO -- se informado
AND M.SG_ESTADO = :SG_ESTADO -- se informado
AND N.DT_EMISSAO BETWEEN :DT_INI AND :DT_FIM -- periodo emissao
AND N.DT_FORNECEDOR BETWEEN :DT_FINI AND :DT_FFIM -- periodo recebimento
AND NI.CD_ITEM IN (...) -- grid Produtos
AND N.CD_PESSOA IN/NOT IN (...) -- grid Pessoas (checkbox Exceto)
AND N.CD_CONDPAGTO IN (...) -- grid Condicoes de Pagamento
AND M.CD_MUNICIPIO IN (...) -- grid Municipios
AND NI.CD_MOVIMENTACAO IN (...) -- grid Movimentacoes
AND N.CD_VENDEDOR IN (...) -- grid Vendedores (quando nao multi)
AND N.CD_USUARIO IN (...) -- grid Usuarios
AND B.NR_PLACA IN (...) -- grid Placas / Veiculos
AND B.CD_TRANSPORTADOR IN (...) -- grid Transportadores
AND COALESCE(TRIM(N.CD_SERIEFOR)||TRIM(N.CD_ESPECIEFOR),
TRIM(N.CD_SERIE)||TRIM(N.CD_ESPECIE))
IN/NOT IN (...) -- grid Serie Nota Fiscal (checkbox Exceto)
AND I.TP_ITEM = 'S' -- Tipo Produto = Serviços
AND I.TP_ITEM <> 'S' -- Tipo Produto = Produtos
AND MOV.ST_MESTRA = 'N' -- Excluir Remessas / Mestras
AND MOV.ST_DEVOLUCAO = 'N' -- Excluir Devolucoes / Retornos
AND MOV.CD_TIPOCONTA IS NOT NULL -- Somente Gera Financeiro
AND P.CD_TIPOPESSOA = :CD_TIPOPESSOA -- se informado
GROUP BY <iORDEM dinamico>, <cmbORDEM.Value>,
N.CD_EMPRESA, N.NR_LANCAMENTO, N.TP_NOTA, N.CD_SERIE,
COALESCE(N.NR_NOTAFISCAL, N.NR_NOTAFOR),
N.CD_PESSOA, P.NM_PESSOA||COALESCE(' - '||P.NM_FANTASIA,''),
M.SG_ESTADO, N.DT_VENCIMENTO, P.NR_CNPJCPF,
F.CD_FORMAPAGTO, F.DS_FORMAPAGTO,
N.DT_FORNECEDOR, B.NR_PLACA, RE.SG_ESTADO, MUN.SG_ESTADO,
N.DT_EMISSAO, N.VL_NOTAFISCAL,
CASE N.TP_NOTA WHEN 'E' THEN N.VL_NOTAFISCAL * -1 ELSE N.VL_NOTAFISCAL END,
:ST_DETALHE
ORDER BY <iORDEM dinamico>, <cmbORDEM.Value>

SQL sub (detalhe de itens — quando Mostrar Detalhe da Nota = 'S'):

SELECT NI.CD_EMPRESA, NI.NR_LANCAMENTO, NI.TP_NOTA, NI.CD_SERIE,
I.DS_ITEM||' - '||I.CD_ITEM DS_ITEM,
NI.PS_ITEMNOTA, NI.QT_ITEMNOTA,
NI.VL_UNITARIO, NI.VL_DESCONTO, NI.VL_TOTAL,
(NI.VL_TOTAL - COALESCE(NI.VL_DESCONTO,0)) VL_LIQUIDO
FROM ITEMNOTA NI
INNER JOIN ITEM I ON (NI.CD_ITEM = I.CD_ITEM)
WHERE NI.CD_EMPRESA = :CD_EMPRESA
AND NI.NR_LANCAMENTO = :NR_LANCAMENTO
AND NI.TP_NOTA = :TP_NOTA
AND NI.CD_SERIE = :CD_SERIE
AND NI.CD_TABPRECO = :CD_TABPRECO -- se informado
AND NI.CD_MOVIMENTACAO IN (...) -- grid Movimentacoes
AND I.TP_ITEM = 'S' | <> 'S' -- Tipo Produto