Pular para o conteúdo principal

REQ002 — Evolução de Movimentos no Estoque

Fonte​

  • Form: source/REQ002/UREQ002.pas
  • DataModule: source/REQ002/UdmREQ002.pas
  • Package: source/REQ002/REQ002.dpk
  • View "Evolucao por Produto": Scripts/VIEW_REQ002_P.sql
  • View "Evolucao por Grade": Scripts/VIEW_REQ002.sql
  • Menu: source/jCommon/jMenu.pas (REQ.add('REQ002', 'Evolução de Movimentos no Estoque', 1, [erpEstoque, erpGourmetRet]))

Objetivo​

Relatório de evolucao cronologica dos movimentos de estoque (entradas, saidas, transferencias) de produtos em um periodo. Para cada produto/local imprime o saldo inicial (anterior a "Data Inicial"), cada lancamento do periodo (data, nr lancamento, operacao, documento, quantidade/valor do movimento) e o saldo atualizado apos o lancamento, com preco medio. Permite quebras por Produto ou por Produto + Grade/Linha/Coluna.

Modelos de Relatorio​

O combobox "Modelo" (campo TP_RELATORIO da tabEMPRESA) define qual view selectable e layout sao usados. O handler btnImprimirClick em UREQ002.pas chaveia entre as duas opcoes.

Modelo P: Evolucao por Produto​

Quando usado: item "Evolucao por Produto" do combo "Modelo" (TP_RELATORIO = 'P'). Layout REQ002.

E o modelo padrao (selecionado no btnNovoClick com TP_RELATORIO := 'P'). Lista os movimentos agrupando por Empresa + Produto + Tipo Local + Local de Armazenagem. Usa a procedure VIEW_REQ002_P que executa o SELECT dinamico sobre MOVESTOQUE + ITEMLOCAL + LOCALESTOQUE + OPERACAO + ITEM + EMPRESA + TIPOLOCAL e calcula saldo/preco medio corrente.

SQL Base:

SELECT NM_EMPRESA, DS_ITEM, DS_LOCAL, DT_LANCAMENTO, NR_LANCAMENTO,
CD_OPERACAO, DS_OPERACAO, TP_OPERACAO, NR_DOCUMENTO,
QT_MOVESTOQUE, VL_MOVESTOQUE, QT_ESTOQUE, VL_ESTOQUE,
QT_SALDO, VL_SALDO, VL_PRECOMEDIO, DS_INICIAL,
PS_MOVESTOQUE, PS_ESTOQUE, PS_SALDO
FROM VIEW_REQ002_P(:I_FILTRO, :I_QUEBRA, :I_DT_INICIAL, :I_ST_ITENSGRADE)

O I_FILTRO e montado a partir dos filtros da tela (And MOVESTOQUE.CD_EMPRESA = ..., And MOVESTOQUE.DT_LANCAMENTO BETWEEN ..., And MOVESTOQUE.CD_ITEM IN (...), CD_OPERACAO IN (...), CD_TIPOLOCAL IN (...), CD_LOCAL IN (...)). O I_QUEBRA = 'S' forca quebra por local. O I_ST_ITENSGRADE e fixo em 'N' neste modelo.

Dentro da procedure, ao mudar a chave EMPRESA|ITEM|TIPOLOCAL|LOCAL, e emitida uma linha "SALDO INICIAL" consultando RETORNA_SALDOESTOQUE(:CD_EMPRESA, :CD_ITEM, :CD_TIPOLOCAL, :CD_LOCAL, :I_DT_INICIAL - 1). Em cada linha subsequente, soma QT_ESTOQUE/VL_ESTOQUE ao saldo e recalcula VL_PRECOMEDIO = VL_SALDO / QT_SALDO.

Modelo G: Evolucao por Grade​

Quando usado: item "Evolucao por Grade" do combo "Modelo" (TP_RELATORIO = 'G'). Layout REQ002_G.

Variante do modelo P que traz os campos de Grade (DS_GRADE, DS_LINHA, DS_COLUNA) em colunas extras. Usa a procedure VIEW_REQ002 que faz INNER JOIN com GRADE + LINHAGRADE + COLUNAGRADE via MOVESTOQUE.CD_GRADE/NR_LINHA/NR_COLUNA. Para produtos sem grade, os JOINs sao LEFT (controlado pelo parametro interno V_CONDICAO_GRAD).

SQL Base:

SELECT * FROM VIEW_REQ002(:I_FILTRO, :I_QUEBRA, :I_DT_INICIAL, :I_ST_ITENSGRADE)

Mesma logica de filtros e saldo do modelo P. A partir da chamada da tela, I_ST_ITENSGRADE = 'S' forca INNER JOIN com as tabelas de grade — produtos sem grade nao aparecem neste modelo.

Filtros​

Campos simples:

  • Empresa (Lista de Empresas cadastradas) F9 — obrigatorio (default: empresa da sessao)
  • Data Inicial (periodo de MOVESTOQUE.DT_LANCAMENTO) — se informada, gera linha "SALDO INICIAL" com posicao em DT_INICIAL - 1 via RETORNA_SALDOESTOQUE
  • Data Final (periodo de MOVESTOQUE.DT_LANCAMENTO) — validacoes de consistencia (DT_INICIAL > DT_FINAL bloqueia)
  • Modelo (Evolucao por Produto / Evolucao por Grade) — default "Evolucao por Produto" (TP_RELATORIO = 'P')
  • Cod. Barras (texto livre) — ao validar resolve para CD_ITEM via SELECT CD_ITEM FROM ITEM WHERE CD_CODIGOBARRA e inclui o produto no grid "Produtos" automaticamente

Filtros de grid (multi-selecao via F9):

  • Produtos (grupo "Produtos") F9 — multi-selecao; F9 abre PesquisarProduto usando PARMFATUR.TP_LISTAITEM/CD_TABPRECO (carregados no iniciar); constroi MOVESTOQUE.CD_ITEM IN (...)
  • Operacoes de Estoque (grupo "Operacoes de Estoque") F9 — multi-selecao; F9 lista OPERACAO com ST_ATIVO = 'S'; constroi MOVESTOQUE.CD_OPERACAO IN (...)
  • Tipos de Locais (grupo "Tipos de Locais") F9 — multi-selecao; F9 lista TIPOLOCAL; constroi MOVESTOQUE.CD_TIPOLOCAL IN (...)
  • Locais de Armazenagem (grupo "Locais de Armazenagem") F9 — multi-selecao; F9 lista LOCALESTOQUE; constroi MOVESTOQUE.CD_LOCAL IN (...)

Parametros que Influenciam​

TabelaCampoEfeito
PARMFATURTP_LISTAITEMTipo de lookup carregado no iniciar e usado pelo F9 da grid "Produtos" (PesquisarProduto(..., iTp_ListaItem, ...))
PARMFATURCD_TABPRECOTabela de precos enviada como parametro [1] do PesquisarProduto no F9 de produtos

Regras de Negocio​

  1. Default TP_RELATORIO = 'P': no btnNovoClick, o campo TP_RELATORIO e setado para 'P' (Evolucao por Produto), que se torna o modelo padrao.
  2. Empresa obrigatoria: btnImprimirClick valida Trim(edtCD_EMPRESA.Text) = '' e lanca JException "E Obrigatorio Informar a Empresa para Gerar o Relatório!".
  3. Consistencia de datas: tabEMPRESADT_INICIAL.OnValidate e tabEMPRESADT_FINAL.OnValidate bloqueiam DT_INICIAL > DT_FINAL com mensagem especifica para cada lado.
  4. Saldo inicial sob demanda: a procedure VIEW_REQ002/VIEW_REQ002_P so gera a linha "SALDO INICIAL" quando I_DT_INICIAL IS NOT NULL — se o operador deixar "Data Inicial" em branco, o relatorio nao tras posicao historica; mostra so os movimentos filtrados.
  5. Tela NAO edita dados: FormClose sempre faz dmREQ002.transaction.Rollback + dmREQ002.Free; os grids (tabITEM/tabOPERACAO/tabTIPOLOCAL/tabLOCAL) sao datasets auxiliares de filtros, nao persistem no banco. As propriedades btnSalvar/btnExcluir/btnProcurar/btnAtualizar estao escondidas em runtime.
  6. Filtro por Código de Barras: quando o operador digita no campo "Cod. Barras", tabITEMCD_CODIGOBARRAValidate consulta ITEM por CD_CODIGOBARRA e, se encontrar, preenche CD_ITEM no grid; caso contrario, lanca "Código de Barras nao Cadastrado!".
  7. Cancelamentos ignorados: a procedure filtra MOVESTOQUE.ST_CANCELAMENTO = 'N' — movimentos cancelados nao entram em nenhum saldo.
  8. TP_OPERACAO define sinal: dentro da procedure, CASE OPERACAO.TP_OPERACAO WHEN 'E' THEN QT_ESTOQUE ELSE QT_ESTOQUE * -1 END — Entrada soma, Saida subtrai para calcular QT_MOVESTOQUE/VL_MOVESTOQUE/PS_MOVESTOQUE (peso).
  9. Ordem por operacao: o ORDER BY usa CASE IL.ST_ORDEMCALCULO WHEN 'E' THEN OPERACAO.TP_OPERACAO ELSE 'E' END no mesmo dia — e o comportamento que controla se a saida do dia entra antes ou depois da entrada ao recalcular o saldo (parametrizado em ITEMLOCAL.ST_ORDEMCALCULO).
  10. Saldo ja calculado: QT_SALDO/VL_SALDO/VL_PRECOMEDIO sao devolvidos pela propria procedure acumulando em variaveis locais, nao por subquery — por isso a ordenacao no ORDER BY e criticamente importante.

Mensagens exibidas​

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

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

Datasets e SQL​

DatasetDescricaoTabelas/Filtro
tabEMPRESADataset-cabecalho com os filtros gerais (CD_EMPRESA, NM_EMPRESA, DT_INICIAL, DT_FINAL, TP_RELATORIO). Aberto empty via WHERE CD_EMPRESA = -1 e colocado em Append pelo btnNovoClick.EMPRESA
tabITEMGrid multi-selecao "Produtos". SQL dummy (WHERE CD_ITEM = -1); populado via F9 que chama PesquisarProduto ou via leitura do campo Código de Barras.ITEM
tabOPERACAOGrid multi-selecao "Operacoes de Estoque". SQL dummy (WHERE CD_OPERACAO = -1); populado via F9 em gridOPERACAOKeyDown (Pesquisa em OPERACAO filtrando ST_ATIVO = 'S').OPERACAO
tabTIPOLOCALGrid multi-selecao "Tipos de Locais". SQL dummy; populado via F9 em gridTIPOLOCALKeyDown (Pesquisa em TIPOLOCAL).TIPOLOCAL
tabLOCALGrid multi-selecao "Locais de Armazenagem". SQL dummy; populado via F9 em gridLOCALKeyDown (Pesquisa em LOCALESTOQUE).LOCALESTOQUE

Consulta de parametros no iniciar:

SELECT TP_LISTAITEM, CD_TABPRECO FROM PARMFATUR WHERE CD_EMPRESA = :CD_EMPRESA

Os valores ficam em iTp_ListaItem/iCD_TABPRECO e sao reusados pelo F9 de produtos (PesquisarProduto).

Tabelas de Escrita (INSERT/UPDATE/DELETE)​

Tela e somente leitura — FormClose sempre faz dmREQ002.transaction.Rollback. Os TFDUpdateSQL declarados no DataModule (updITEM, updEMPRESA, updOPERACAO, updTIPOLOCAL, updLOCAL) sao artefatos do template de cadastro e nunca chegam a persistir, pois os grids sao populados em memoria e descartados no fechamento.

Nenhuma.

Tabelas de Leitura (SELECT)​

TabelaOperacoes
EMPRESASELECT
ITEMSELECT
LOCALESTOQUESELECT
OPERACAOSELECT
PARMFATURSELECT
TIPOLOCALSELECT

Procedures Chamadas​

ProcedureTabelas Acessadas
VIEW_REQ002COLUNAGRADE (SELECT), EMPRESA (SELECT), GRADE (SELECT), ITEM (SELECT), ITEMLOCAL (SELECT), LINHAGRADE (SELECT), LOCALESTOQUE (SELECT), MOVESTOQUE (SELECT), OPERACAO (SELECT), TIPOLOCAL (SELECT), RETORNA_SALDOESTOQUE
VIEW_REQ002_PEMPRESA (SELECT), ITEM (SELECT), ITEMLOCAL (SELECT), LOCALESTOQUE (SELECT), MOVESTOQUE (SELECT), OPERACAO (SELECT), TIPOLOCAL (SELECT), RETORNA_SALDOESTOQUE

Tabelas via Procedures (acesso indireto)​

TabelaOperacoes
COLUNAGRADESELECT
EMPRESASELECT
GRADESELECT
ITEMSELECT
ITEMLOCALSELECT
LINHAGRADESELECT
LOCALESTOQUESELECT
MOVESTOQUESELECT
OPERACAOSELECT
TIPOLOCALSELECT

Dependencias Aferentes (quem alimenta esta tela)​

Telas que escrevem nas tabelas lidas pelo REQ002 — principalmente quem gera movimentos em MOVESTOQUE, ITEMLOCAL e nos cadastros consumidos pelos filtros (ITEM, OPERACAO, TIPOLOCAL, LOCALESTOQUE, GRADE).

TelaTítuloTabelas em Comum
MNF001Recebimento de Notas Fiscais de CompraEMPRESA, ITEM, ITEMLOCAL, MOVESTOQUE
TOF007Cadastro de PecasEMPRESA, ITEM, ITEMLOCAL, MOVESTOQUE
CEQ005Movimentos EstoqueEMPRESA, ITEM, MOVESTOQUE, OPERACAO
CNF001Consulta de Notas FiscaisEMPRESA, ITEM, MOVESTOQUE
CNF012Consulta de CTRCEMPRESA, ITEM, MOVESTOQUE
MEQ010Liberacao de Movimentos de EstoqueEMPRESA, ITEM, MOVESTOQUE
MPD004OrcamentoEMPRESA, ITEM, ITEMLOCAL
MPD007Ordem de Serviço - IndustriaITEM, ITEMLOCAL
MPD044Orcamento de Produto Sob MedidaITEM, ITEMLOCAL
TPO001ProdutosITEM, ITEMLOCAL
TPO011Grade de ProdutosCOLUNAGRADE, GRADE, LINHAGRADE
MCA012Consulta/Alteracao de Lancamento diario de LeiteEMPRESA, MOVESTOQUE
MCO005Recebimento de ComprasEMPRESA, MOVESTOQUE
MEQ006Ordem de ProducaoEMPRESA, MOVESTOQUE
MEQ020Estorno de Movimento de EstoqueEMPRESA, MOVESTOQUE
MEQ042Liberacao de Movimentos no EstoqueEMPRESA, MOVESTOQUE
MNF035Conferencia de Notas Fiscais de EntradaEMPRESA, MOVESTOQUE
TPO027Cadastro de Cod De Barras Por Item na GradeEMPRESA, GRADE, ITEM
MEQ002Lancamento AvulsoMOVESTOQUE
MEQ004Emprestimo e Devolucao de ProdutosMOVESTOQUE
MEQ008Transferencia de LocalMOVESTOQUE
MEQ012Fechamento de Ordem de ProducaoMOVESTOQUE
MEQ016Transferencia de ProdutosMOVESTOQUE
MEQ035Transferencia entre LocaisMOVESTOQUE
MEQ047Movimentação de Estoque ConsolidadaMOVESTOQUE
MEQ052Movimentação de Estoque (Grade)MOVESTOQUE
MEQ068Fechamento de Ordem Producao - GradeMOVESTOQUE
MTR006Consumo do EstoqueMOVESTOQUE
SATCFeEmissao SAT-CFeMOVESTOQUE
jFaturamentoShared Unit - Engine fiscalMOVESTOQUE

+33 telas adicionais (diversas telas de cadastros como ADM002, TEQ001, TEQ002, TEQ003 alimentam os cadastros EMPRESA/OPERACAO/TIPOLOCAL/LOCALESTOQUE usados nos filtros).

Dependencias Eferentes (quem consome dados desta tela)​

REQ002 e um relatorio final (consumer): nao grava em tabelas persistentes, apenas imprime. Nenhuma outra tela consome dados deste módulo.

Modelos de Relatório​

O combobox "Modelo" (campo TP_RELATORIO da tabEMPRESA) define qual view selectable e layout sao usados. O handler btnImprimirClick em UREQ002.pas chaveia entre as duas opcoes.

Modelo P: Evolucao por Produto​

Quando usado: item "Evolucao por Produto" do combo "Modelo" (TP_RELATORIO = 'P'). Layout REQ002.

E o modelo padrao (selecionado no btnNovoClick com TP_RELATORIO := 'P'). Lista os movimentos agrupando por Empresa + Produto + Tipo Local + Local de Armazenagem. Usa a procedure VIEW_REQ002_P que executa o SELECT dinamico sobre MOVESTOQUE + ITEMLOCAL + LOCALESTOQUE + OPERACAO + ITEM + EMPRESA + TIPOLOCAL e calcula saldo/preco medio corrente.

SQL Base:

SELECT NM_EMPRESA, DS_ITEM, DS_LOCAL, DT_LANCAMENTO, NR_LANCAMENTO,
CD_OPERACAO, DS_OPERACAO, TP_OPERACAO, NR_DOCUMENTO,
QT_MOVESTOQUE, VL_MOVESTOQUE, QT_ESTOQUE, VL_ESTOQUE,
QT_SALDO, VL_SALDO, VL_PRECOMEDIO, DS_INICIAL,
PS_MOVESTOQUE, PS_ESTOQUE, PS_SALDO
FROM VIEW_REQ002_P(:I_FILTRO, :I_QUEBRA, :I_DT_INICIAL, :I_ST_ITENSGRADE)

O I_FILTRO e montado a partir dos filtros da tela (And MOVESTOQUE.CD_EMPRESA = ..., And MOVESTOQUE.DT_LANCAMENTO BETWEEN ..., And MOVESTOQUE.CD_ITEM IN (...), CD_OPERACAO IN (...), CD_TIPOLOCAL IN (...), CD_LOCAL IN (...)). O I_QUEBRA = 'S' forca quebra por local. O I_ST_ITENSGRADE e fixo em 'N' neste modelo.

Dentro da procedure, ao mudar a chave EMPRESA|ITEM|TIPOLOCAL|LOCAL, e emitida uma linha "SALDO INICIAL" consultando RETORNA_SALDOESTOQUE(:CD_EMPRESA, :CD_ITEM, :CD_TIPOLOCAL, :CD_LOCAL, :I_DT_INICIAL - 1). Em cada linha subsequente, soma QT_ESTOQUE/VL_ESTOQUE ao saldo e recalcula VL_PRECOMEDIO = VL_SALDO / QT_SALDO.

Modelo G: Evolucao por Grade​

Quando usado: item "Evolucao por Grade" do combo "Modelo" (TP_RELATORIO = 'G'). Layout REQ002_G.

Variante do modelo P que traz os campos de Grade (DS_GRADE, DS_LINHA, DS_COLUNA) em colunas extras. Usa a procedure VIEW_REQ002 que faz INNER JOIN com GRADE + LINHAGRADE + COLUNAGRADE via MOVESTOQUE.CD_GRADE/NR_LINHA/NR_COLUNA. Para produtos sem grade, os JOINs sao LEFT (controlado pelo parametro interno V_CONDICAO_GRAD).

SQL Base:

SELECT * FROM VIEW_REQ002(:I_FILTRO, :I_QUEBRA, :I_DT_INICIAL, :I_ST_ITENSGRADE)

Mesma logica de filtros e saldo do modelo P. A partir da chamada da tela, I_ST_ITENSGRADE = 'S' forca INNER JOIN com as tabelas de grade — produtos sem grade nao aparecem neste modelo.