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— aplicaMOV.ST_MESTRA = 'N') - Excluir Devoluções / Retornos (
ST_DEVOLUCAO— aplicaMOV.ST_DEVOLUCAO = 'N') - Somente Gera Financeiro (
ST_FINANCEIRO— aplicaMOV.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) — adicionaM.DS_MUNICIPIO||' - '||M.SG_ESTADOao SELECT/GROUP/ORDER - Origem Pedido Nota (
ST_ORIGEM) — adiciona sub-select classificando como "ORDEM SERVIÇO" / "PEDIDO" / "AVULSA" - Condição Pagto (
ST_CONDPAGTO) — adicionaC.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_MOVIMENTACAOondeST_ATIVO='S') F9 — multi-seleção; também filtra itens no sub-relatório - Produtos (Pesquisa
DS_ITEMondeST_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 + VENDEDORondeST_ATIVA='S') F9 — multi-seleção; JOIN depende dePARMFATUR.ST_VARIOSVENDEDORES - Usuários (Pesquisa
NM_USUARIOemUSUARIO) 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
| Tabela | Campo | Efeito |
|---|---|---|
| PARMFATUR | ST_VARIOSVENDEDORES | Quando '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)
| Tabela | Operacoes |
|---|---|
| CONDPAGTO | DELETE, INSERT, SELECT, UPDATE |
| EMPRESA | DELETE, INSERT, SELECT, UPDATE |
| ITEM | DELETE, INSERT, SELECT, UPDATE |
| JUNCAOVEICULO | DELETE, INSERT, SELECT, UPDATE |
| MUNICIPIO | DELETE, INSERT, SELECT, UPDATE |
| PARMNOTA | DELETE, INSERT, SELECT, UPDATE |
| PESSOA | DELETE, INSERT, SELECT, UPDATE |
| USUARIO | DELETE, INSERT, SELECT, UPDATE |
Tabelas de Leitura (SELECT)
| Tabela | Operacoes |
|---|---|
| EMBARQUE | SELECT |
| ENDERECOPESSOA | SELECT |
| ESTADO | SELECT |
| FORMAPAGTO | SELECT |
| IMPOSTO | SELECT |
| IMPOSTONOTA | SELECT |
| ITEMNOTA | SELECT |
| ITEMNOTAVENDEDOR | SELECT |
| MODELONF | SELECT |
| MOVIMENTACAO | SELECT |
| NFE | SELECT |
| NOTA | SELECT |
| PARMFATUR | SELECT |
| PEDIDO | SELECT |
| PEDIDONOTA | SELECT |
| TABPRECO | SELECT |
| TIPOPESSOA | SELECT |
| USUARIOEMPRESA | SELECT |
| VEICULO | SELECT |
| VENDEDOR | SELECT |
Procedures Chamadas
| Procedure | Tabelas Acessadas |
|---|---|
| RETORNA_DADOSCADASTRAIS | AREACOMERCIAL (SELECT), ENDERECOPESSOA (SELECT), ESTADO (SELECT), FORMAPAGTO (SELECT), GRUPOPCP (SELECT), MUNICIPIO (SELECT) +4 |
Tabelas via Procedures (acesso indireto)
| Tabela | Operacoes |
|---|---|
| AREACOMERCIAL | SELECT |
| ENDERECOPESSOA | SELECT |
| ESTADO | SELECT |
| FORMAPAGTO | SELECT |
| GRUPOPCP | SELECT |
| MUNICIPIO | SELECT |
| PAISBACEN | SELECT |
| PESSOA | SELECT |
| PESSOAFISICA | SELECT |
| REGIAOCOMERCIAL | SELECT |
Modelos de Relatório
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