Pular para o conteúdo principal

RTR001 — Despesas por Período e Veículo

Fonte​

  • Source: source/RTR001/

Objetivo​

Emite relatório consolidado de despesas de frota a partir de notas fiscais de entrada (TP_NOTA='E') dentro de um período informado, cruzando cada nota com a viagem (via NOTAJUNCAO → JUNCAO → VEICULOTRANSPORTE) para identificar placa, modelo, proprietário e itens consumidos. Permite restringir por empresa, veículos, viagens, movimentações e pessoas (proprietário e fornecedor da nota), com opção de quebra por viagem.

Modelos de Relatorio​

Não há combobox "Modelo" nem ramificações condicionais de SQL em btnImprimirClick — o relatório possui um único modelo. O checkbox "Quebra por Viagem" atua apenas como modificador de agrupamento/ordenação (ver Filtros), sem alterar a consulta base.

Modelo 1: Padrao​

Quando usado: sempre (único modelo disponível).

Lista analítica de despesas: para cada item de nota fiscal de entrada (TP_NOTA='E' e ST_NOTA fora de 'C','E') vinculada a uma viagem via NOTAJUNCAO, exibe placa do tracionador, modelo, proprietário, viagem, fornecedor, item, quantidade, valor total do item (líquido de desconto) e número de nota/despesa. Uma coluna calculada NR_PLACA concatena placa + nome do proprietário para exibição.

SQL Base:

SELECT DISTINCT
{sQuebra} -- CAST('S' AS DOM_CHAR1) ST_QUEBRAVIAGEM (se "Quebra por Viagem" marcado)
CAST(VT.NR_PLACA || ' - ' || COALESCE(PROP.NM_PESSOA, '') AS VARCHAR(80)) NR_PLACA,
VT.NR_PLACA PLACA,
N.DT_EMISSAO,
MV.DS_MODELOVEICULO,
V.CD_VIAGEM,
N.VL_NOTAFISCAL,
N.CD_PESSOA,
P.NM_PESSOA NM_FORNECEDOR,
V.DT_INICIO DT_VIAGEM,
I.CD_ITEM,
I.DS_ITEM,
COALESCE(IT.QT_ITEMNOTA, IT.PS_ITEMNOTA) QT_ITEM,
IT.QT_ITEMNOTA,
CAST((IT.VL_TOTAL - COALESCE(IT.VL_DESCONTO, 0)) AS NUMERIC(15,2)) VL_TOTITEM,
IT.DS_SERVICO,
N.NR_NOTAFOR NR_DESPESA,
CAST(COALESCE(N.NR_NOTAFISCAL, N.NR_NOTAFOR) AS INTEGER) NR_NOTA,
NULL KM_INICIAL,
NULL KM_FINAL,
NULL KM_VIAGEM,
NULL DS_DESTINO,
CAST('N' AS VARCHAR(1)) ST_QUEBRAVIAGEM,
IT.DS_SERVICO DS_OBSERVACAO
FROM NOTA N
INNER JOIN ITEMNOTA IT ON (IT.CD_EMPRESA = N.CD_EMPRESA AND IT.NR_LANCAMENTO = N.NR_LANCAMENTO AND IT.CD_SERIE = N.CD_SERIE AND IT.TP_NOTA = N.TP_NOTA)
INNER JOIN ITEM I ON (I.CD_ITEM = IT.CD_ITEM)
INNER JOIN MOVIMENTACAO MT ON (MT.CD_MOVIMENTACAO = IT.CD_MOVIMENTACAO)
INNER JOIN NOTAJUNCAO NJ ON (NJ.CD_EMPRESA = N.CD_EMPRESA AND NJ.NR_LANCAMENTO = N.NR_LANCAMENTO AND NJ.CD_SERIE = N.CD_SERIE AND NJ.TP_NOTA = N.TP_NOTA)
LEFT JOIN VIAGEM V ON (V.CD_EMPRESA = NJ.CD_EMPRVIAGEM AND V.CD_VIAGEM = NJ.CD_VIAGEM)
INNER JOIN JUNCAO JUN ON (JUN.NR_SEQUENCIA = NJ.NR_SEQJUNCAO)
INNER JOIN VEICULOTRANSPORTE VT ON (VT.CD_VEICULO = JUN.CD_TRACIONADOR)
INNER JOIN MODELOVEICULO MV ON (MV.CD_MODELOVEICULO = VT.CD_MODELOVEICULO AND MV.CD_MARCAVEICULO = VT.CD_MARCAVEICULO)
INNER JOIN PESSOA P ON (P.CD_PESSOA = N.CD_PESSOA)
LEFT JOIN PESSOA PROP ON (PROP.CD_PESSOA = VT.CD_PROPRIETARIO)
WHERE N.ST_NOTA NOT IN ('C','E')
AND N.TP_NOTA = 'E'
AND N.DT_EMISSAO BETWEEN :DT_INICIAL AND :DT_FINAL
{AND VT.NR_PLACA IN (...)} -- filtro grid "Veículos"
{AND MT.CD_MOVIMENTACAO IN (...)} -- filtro grid "Movimentações"
{AND V.CD_VIAGEM IN (...)} -- filtro grid "Viagens"
{AND VT.CD_PROPRIETARIO IN (...)} -- filtro grid "Proprietário"
{AND N.CD_PESSOA IN (...)} -- filtro grid "Pessoas" (fornecedor da nota)
ORDER BY PLACA {, V.CD_VIAGEM} -- V.CD_VIAGEM adicionado se "Quebra por Viagem" marcado

A impressão é delegada a GeraRelatorio(transaction, programa.Codigo, Consulta) do jReport, que carrega o layout externo registrado para o programa RTR001 (FastReport/ReportBuilder).

Observação: o DataModule mantém um segundo dataset tabRELATORIO baseado em DESPESAFROTA/ITEMDESPFROTA/VIAGEMROTA/MUNICIPIO com colunas KM_INICIAL/KM_FINAL/KM_VIAGEM/DS_DESTINO, mas ele não é populado pelo handler de impressão atual — o relatório oficial sai pelo SQL acima, baseado em NOTA.

Filtros​

Campos simples:

  • Empresa (F9 — Lista de Empresas) — default = empresa da sessão.
  • Período (De / Até) — obrigatórios; default = (hoje - 1 mês) até hoje. Validação impede Data Final < Data Inicial.
  • Quebra por Viagem (checkbox) — default desmarcado. Quando marcado, adiciona coluna ST_QUEBRAVIAGEM='S' e inclui V.CD_VIAGEM no ORDER BY, permitindo ao layout quebrar grupos por viagem.

Filtros de grid (multi-selecao via F9):

  • Veículos (F9 — lista VEICULO_TRANSPORTE) — multi-seleção; filtra por VT.NR_PLACA IN (...). Se múltiplos veículos compartilham a mesma placa, abre lookup VEICULO_MESMAPLCA para desambiguação.
  • Viagens (F9 — lista VIAGENS_TODAS, parametrizada por empresa quando informada) — multi-seleção; filtra por V.CD_VIAGEM IN (...).
  • Proprietário (F9 — lista PESSOA) — multi-seleção; filtra por VT.CD_PROPRIETARIO IN (...). Aceita digitação A-Z no grid para pré-filtrar a busca.
  • Pessoas (F9 — lista PESSOA) — multi-seleção; filtra por N.CD_PESSOA IN (...) (fornecedor/emitente da nota de despesa). Aceita digitação A-Z no grid.
  • Movimentações (F9 — pesquisa inline sobre MOVIMENTACAO) — multi-seleção; filtra por MT.CD_MOVIMENTACAO IN (...).

Grids vazios não aplicam cláusula IN. Tecla F4 (botão Cancelar) remove a linha corrente do grid focado.

Parametros que Influenciam​

Nenhum parâmetro de PARM*/PARAM*/CONFIG* é lido pelo handler de impressão nem pelas validações do DataModule — o relatório depende apenas dos filtros informados na tela e da empresa da sessão (sessao.empresa.cd_empresa).

Perguntas Frequentes​

P: Ao tentar emitir o relatório, o sistema apresenta a mensagem "E Obrigatório Informar a Data Inicial para Emitir o Relatório!". O que devo fazer? R: Este comportamento ocorre porque o campo "Período" (Data Inicial) não foi preenchido. Para corrigir, informe a data inicial no campo "Período" antes de clicar em Imprimir.

P: Ao tentar emitir o relatório, o sistema apresenta a mensagem "E Obrigatório Informar a Data Final para Emitir o Relatório!". O que devo fazer? R: Este comportamento ocorre porque o campo "Até" (Data Final) não foi preenchido. Para corrigir, informe a data final no campo "Até" antes de clicar em Imprimir.

P: Recebi a mensagem "A Data Final não pode ser Menor que a Data Inicial!". Como devo proceder? R: Esta mensagem indica que a data informada no campo "Até" é anterior à data informada no campo "Período". Corrija a data final para que seja igual ou posterior à data inicial.

P: Recebi a mensagem "Veículo não cadastrado! [TTR001]". O que significa? R: Esta mensagem indica que a placa informada na aba "Veículos" não existe no cadastro de Veículos de Transporte (TTR001). Verifique se a placa está correta ou acesse a tela Cadastro de Veículos de Transporte (TTR001) para registrar o veículo.

P: Recebi a mensagem "Pessoa não Cadastrada!". Como resolver? R: Esta mensagem aparece quando o código de pessoa informado nas abas "Proprietário" ou "Pessoas" não existe no cadastro. Verifique se o código está correto ou acesse a tela Cadastro de Pessoas (TFA001) para registrar a pessoa.

P: Recebi a mensagem "A Movimentação não está Cadastrada [TCB001]!". O que devo fazer? R: Esta mensagem indica que o código de movimentação informado na aba "Movimentações" não existe no cadastro. Verifique se o código está correto ou acesse a tela Cadastro de Movimentações (TCB001) para registrar a movimentação.

P: Recebi a mensagem "Viagem Inválida! Verifique [MTR001].". O que significa? R: Esta mensagem indica que o código da viagem informado na aba "Viagens" não existe no cadastro. Verifique se o código está correto ou acesse a tela Cadastro de Viagens (MTR001) para conferir as viagens disponíveis.

P: Recebi a mensagem "Viagem Cancelada! Verifique.". Como proceder? R: Esta mensagem indica que a viagem informada possui status "Cancelada". Utilize um código de viagem que esteja com status ativo.

Mensagens exibidas​

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

Mais 9 mensagens com texto literal no código: RTR001.

Tabelas de Escrita (INSERT/UPDATE/DELETE)​

TabelaOperacoes
PESSOADELETE, INSERT, SELECT, UPDATE
TIPODESPESADELETE, INSERT, SELECT, UPDATE
VEICULODELETE, INSERT, SELECT, UPDATE

Tabelas de Leitura (SELECT)​

TabelaOperacoes
CATEGORIASELECT
DESPESAFROTASELECT
ITEMSELECT
ITEMDESPFROTASELECT
ITEMNOTASELECT
JUNCAOSELECT
MARCAVEICULOSELECT
MODELOVEICULOSELECT
MOVIMENTACAOSELECT
MUNICIPIOSELECT
NOTASELECT
NOTAJUNCAOSELECT
VEICULOTRANSPORTESELECT
VIAGEMSELECT

Modelos de Relatório​

Não há combobox "Modelo" nem ramificações condicionais de SQL em btnImprimirClick — o relatório possui um único modelo. O checkbox "Quebra por Viagem" atua apenas como modificador de agrupamento/ordenação (ver Filtros), sem alterar a consulta base.

Modelo 1: Padrao​

Quando usado: sempre (único modelo disponível).

Lista analítica de despesas: para cada item de nota fiscal de entrada (TP_NOTA='E' e ST_NOTA fora de 'C','E') vinculada a uma viagem via NOTAJUNCAO, exibe placa do tracionador, modelo, proprietário, viagem, fornecedor, item, quantidade, valor total do item (líquido de desconto) e número de nota/despesa. Uma coluna calculada NR_PLACA concatena placa + nome do proprietário para exibição.

SQL Base:

SELECT DISTINCT
{sQuebra} -- CAST('S' AS DOM_CHAR1) ST_QUEBRAVIAGEM (se "Quebra por Viagem" marcado)
CAST(VT.NR_PLACA || ' - ' || COALESCE(PROP.NM_PESSOA, '') AS VARCHAR(80)) NR_PLACA,
VT.NR_PLACA PLACA,
N.DT_EMISSAO,
MV.DS_MODELOVEICULO,
V.CD_VIAGEM,
N.VL_NOTAFISCAL,
N.CD_PESSOA,
P.NM_PESSOA NM_FORNECEDOR,
V.DT_INICIO DT_VIAGEM,
I.CD_ITEM,
I.DS_ITEM,
COALESCE(IT.QT_ITEMNOTA, IT.PS_ITEMNOTA) QT_ITEM,
IT.QT_ITEMNOTA,
CAST((IT.VL_TOTAL - COALESCE(IT.VL_DESCONTO, 0)) AS NUMERIC(15,2)) VL_TOTITEM,
IT.DS_SERVICO,
N.NR_NOTAFOR NR_DESPESA,
CAST(COALESCE(N.NR_NOTAFISCAL, N.NR_NOTAFOR) AS INTEGER) NR_NOTA,
NULL KM_INICIAL,
NULL KM_FINAL,
NULL KM_VIAGEM,
NULL DS_DESTINO,
CAST('N' AS VARCHAR(1)) ST_QUEBRAVIAGEM,
IT.DS_SERVICO DS_OBSERVACAO
FROM NOTA N
INNER JOIN ITEMNOTA IT ON (IT.CD_EMPRESA = N.CD_EMPRESA AND IT.NR_LANCAMENTO = N.NR_LANCAMENTO AND IT.CD_SERIE = N.CD_SERIE AND IT.TP_NOTA = N.TP_NOTA)
INNER JOIN ITEM I ON (I.CD_ITEM = IT.CD_ITEM)
INNER JOIN MOVIMENTACAO MT ON (MT.CD_MOVIMENTACAO = IT.CD_MOVIMENTACAO)
INNER JOIN NOTAJUNCAO NJ ON (NJ.CD_EMPRESA = N.CD_EMPRESA AND NJ.NR_LANCAMENTO = N.NR_LANCAMENTO AND NJ.CD_SERIE = N.CD_SERIE AND NJ.TP_NOTA = N.TP_NOTA)
LEFT JOIN VIAGEM V ON (V.CD_EMPRESA = NJ.CD_EMPRVIAGEM AND V.CD_VIAGEM = NJ.CD_VIAGEM)
INNER JOIN JUNCAO JUN ON (JUN.NR_SEQUENCIA = NJ.NR_SEQJUNCAO)
INNER JOIN VEICULOTRANSPORTE VT ON (VT.CD_VEICULO = JUN.CD_TRACIONADOR)
INNER JOIN MODELOVEICULO MV ON (MV.CD_MODELOVEICULO = VT.CD_MODELOVEICULO AND MV.CD_MARCAVEICULO = VT.CD_MARCAVEICULO)
INNER JOIN PESSOA P ON (P.CD_PESSOA = N.CD_PESSOA)
LEFT JOIN PESSOA PROP ON (PROP.CD_PESSOA = VT.CD_PROPRIETARIO)
WHERE N.ST_NOTA NOT IN ('C','E')
AND N.TP_NOTA = 'E'
AND N.DT_EMISSAO BETWEEN :DT_INICIAL AND :DT_FINAL
{AND VT.NR_PLACA IN (...)} -- filtro grid "Veículos"
{AND MT.CD_MOVIMENTACAO IN (...)} -- filtro grid "Movimentações"
{AND V.CD_VIAGEM IN (...)} -- filtro grid "Viagens"
{AND VT.CD_PROPRIETARIO IN (...)} -- filtro grid "Proprietário"
{AND N.CD_PESSOA IN (...)} -- filtro grid "Pessoas" (fornecedor da nota)
ORDER BY PLACA {, V.CD_VIAGEM} -- V.CD_VIAGEM adicionado se "Quebra por Viagem" marcado

A impressão é delegada a GeraRelatorio(transaction, programa.Código, Consulta) do jReport, que carrega o layout externo registrado para o programa RTR001 (FastReport/ReportBuilder).

Observação: o DataModule mantém um segundo dataset tabRELATORIO baseado em DESPESAFROTA/ITEMDESPFROTA/VIAGEMROTA/MUNICIPIO com colunas KM_INICIAL/KM_FINAL/KM_VIAGEM/DS_DESTINO, mas ele não é populado pelo handler de impressão atual — o relatório oficial sai pelo SQL acima, baseado em NOTA.