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 emDT_INICIAL - 1viaRETORNA_SALDOESTOQUE - Data Final (periodo de
MOVESTOQUE.DT_LANCAMENTO) — validacoes de consistencia (DT_INICIAL > DT_FINALbloqueia) - Modelo (Evolucao por Produto / Evolucao por Grade) — default "Evolucao por Produto" (
TP_RELATORIO = 'P') - Cod. Barras (texto livre) — ao validar resolve para
CD_ITEMviaSELECT CD_ITEM FROM ITEM WHERE CD_CODIGOBARRAe inclui o produto no grid "Produtos" automaticamente
Filtros de grid (multi-selecao via F9):
- Produtos (grupo "Produtos") F9 — multi-selecao; F9 abre
PesquisarProdutousandoPARMFATUR.TP_LISTAITEM/CD_TABPRECO(carregados noiniciar); constroiMOVESTOQUE.CD_ITEM IN (...) - Operacoes de Estoque (grupo "Operacoes de Estoque") F9 — multi-selecao; F9 lista
OPERACAOcomST_ATIVO = 'S'; constroiMOVESTOQUE.CD_OPERACAO IN (...) - Tipos de Locais (grupo "Tipos de Locais") F9 — multi-selecao; F9 lista
TIPOLOCAL; constroiMOVESTOQUE.CD_TIPOLOCAL IN (...) - Locais de Armazenagem (grupo "Locais de Armazenagem") F9 — multi-selecao; F9 lista
LOCALESTOQUE; constroiMOVESTOQUE.CD_LOCAL IN (...)
Parametros que Influenciam
| Tabela | Campo | Efeito |
|---|---|---|
| PARMFATUR | TP_LISTAITEM | Tipo de lookup carregado no iniciar e usado pelo F9 da grid "Produtos" (PesquisarProduto(..., iTp_ListaItem, ...)) |
| PARMFATUR | CD_TABPRECO | Tabela de precos enviada como parametro [1] do PesquisarProduto no F9 de produtos |
Regras de Negocio
- Default TP_RELATORIO = 'P': no
btnNovoClick, o campoTP_RELATORIOe setado para'P'(Evolucao por Produto), que se torna o modelo padrao. - Empresa obrigatoria:
btnImprimirClickvalidaTrim(edtCD_EMPRESA.Text) = ''e lancaJException"E Obrigatorio Informar a Empresa para Gerar o Relatório!". - Consistencia de datas:
tabEMPRESADT_INICIAL.OnValidateetabEMPRESADT_FINAL.OnValidatebloqueiamDT_INICIAL > DT_FINALcom mensagem especifica para cada lado. - 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. - Tela NAO edita dados:
FormClosesempre fazdmREQ002.transaction.Rollback+dmREQ002.Free; os grids (tabITEM/tabOPERACAO/tabTIPOLOCAL/tabLOCAL) sao datasets auxiliares de filtros, nao persistem no banco. As propriedadesbtnSalvar/btnExcluir/btnProcurar/btnAtualizarestao escondidas em runtime. - Filtro por Código de Barras: quando o operador digita no campo "Cod. Barras",
tabITEMCD_CODIGOBARRAValidateconsultaITEMporCD_CODIGOBARRAe, se encontrar, preencheCD_ITEMno grid; caso contrario, lanca "Código de Barras nao Cadastrado!". - Cancelamentos ignorados: a procedure filtra
MOVESTOQUE.ST_CANCELAMENTO = 'N'— movimentos cancelados nao entram em nenhum saldo. - 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 calcularQT_MOVESTOQUE/VL_MOVESTOQUE/PS_MOVESTOQUE(peso). - Ordem por operacao: o
ORDER BYusaCASE IL.ST_ORDEMCALCULO WHEN 'E' THEN OPERACAO.TP_OPERACAO ELSE 'E' ENDno mesmo dia — e o comportamento que controla se a saida do dia entra antes ou depois da entrada ao recalcular o saldo (parametrizado emITEMLOCAL.ST_ORDEMCALCULO). - Saldo ja calculado:
QT_SALDO/VL_SALDO/VL_PRECOMEDIOsao 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
| Dataset | Descricao | Tabelas/Filtro |
|---|---|---|
tabEMPRESA | Dataset-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 |
tabITEM | Grid 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 |
tabOPERACAO | Grid multi-selecao "Operacoes de Estoque". SQL dummy (WHERE CD_OPERACAO = -1); populado via F9 em gridOPERACAOKeyDown (Pesquisa em OPERACAO filtrando ST_ATIVO = 'S'). | OPERACAO |
tabTIPOLOCAL | Grid multi-selecao "Tipos de Locais". SQL dummy; populado via F9 em gridTIPOLOCALKeyDown (Pesquisa em TIPOLOCAL). | TIPOLOCAL |
tabLOCAL | Grid 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 —
FormClosesempre fazdmREQ002.transaction.Rollback. OsTFDUpdateSQLdeclarados 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)
| Tabela | Operacoes |
|---|---|
| EMPRESA | SELECT |
| ITEM | SELECT |
| LOCALESTOQUE | SELECT |
| OPERACAO | SELECT |
| PARMFATUR | SELECT |
| TIPOLOCAL | SELECT |
Procedures Chamadas
| Procedure | Tabelas Acessadas |
|---|---|
| VIEW_REQ002 | COLUNAGRADE (SELECT), EMPRESA (SELECT), GRADE (SELECT), ITEM (SELECT), ITEMLOCAL (SELECT), LINHAGRADE (SELECT), LOCALESTOQUE (SELECT), MOVESTOQUE (SELECT), OPERACAO (SELECT), TIPOLOCAL (SELECT), RETORNA_SALDOESTOQUE |
| VIEW_REQ002_P | EMPRESA (SELECT), ITEM (SELECT), ITEMLOCAL (SELECT), LOCALESTOQUE (SELECT), MOVESTOQUE (SELECT), OPERACAO (SELECT), TIPOLOCAL (SELECT), RETORNA_SALDOESTOQUE |
Tabelas via Procedures (acesso indireto)
| Tabela | Operacoes |
|---|---|
| COLUNAGRADE | SELECT |
| EMPRESA | SELECT |
| GRADE | SELECT |
| ITEM | SELECT |
| ITEMLOCAL | SELECT |
| LINHAGRADE | SELECT |
| LOCALESTOQUE | SELECT |
| MOVESTOQUE | SELECT |
| OPERACAO | SELECT |
| TIPOLOCAL | SELECT |
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).
| Tela | Título | Tabelas em Comum |
|---|---|---|
| MNF001 | Recebimento de Notas Fiscais de Compra | EMPRESA, ITEM, ITEMLOCAL, MOVESTOQUE |
| TOF007 | Cadastro de Pecas | EMPRESA, ITEM, ITEMLOCAL, MOVESTOQUE |
| CEQ005 | Movimentos Estoque | EMPRESA, ITEM, MOVESTOQUE, OPERACAO |
| CNF001 | Consulta de Notas Fiscais | EMPRESA, ITEM, MOVESTOQUE |
| CNF012 | Consulta de CTRC | EMPRESA, ITEM, MOVESTOQUE |
| MEQ010 | Liberacao de Movimentos de Estoque | EMPRESA, ITEM, MOVESTOQUE |
| MPD004 | Orcamento | EMPRESA, ITEM, ITEMLOCAL |
| MPD007 | Ordem de Serviço - Industria | ITEM, ITEMLOCAL |
| MPD044 | Orcamento de Produto Sob Medida | ITEM, ITEMLOCAL |
| TPO001 | Produtos | ITEM, ITEMLOCAL |
| TPO011 | Grade de Produtos | COLUNAGRADE, GRADE, LINHAGRADE |
| MCA012 | Consulta/Alteracao de Lancamento diario de Leite | EMPRESA, MOVESTOQUE |
| MCO005 | Recebimento de Compras | EMPRESA, MOVESTOQUE |
| MEQ006 | Ordem de Producao | EMPRESA, MOVESTOQUE |
| MEQ020 | Estorno de Movimento de Estoque | EMPRESA, MOVESTOQUE |
| MEQ042 | Liberacao de Movimentos no Estoque | EMPRESA, MOVESTOQUE |
| MNF035 | Conferencia de Notas Fiscais de Entrada | EMPRESA, MOVESTOQUE |
| TPO027 | Cadastro de Cod De Barras Por Item na Grade | EMPRESA, GRADE, ITEM |
| MEQ002 | Lancamento Avulso | MOVESTOQUE |
| MEQ004 | Emprestimo e Devolucao de Produtos | MOVESTOQUE |
| MEQ008 | Transferencia de Local | MOVESTOQUE |
| MEQ012 | Fechamento de Ordem de Producao | MOVESTOQUE |
| MEQ016 | Transferencia de Produtos | MOVESTOQUE |
| MEQ035 | Transferencia entre Locais | MOVESTOQUE |
| MEQ047 | Movimentação de Estoque Consolidada | MOVESTOQUE |
| MEQ052 | Movimentação de Estoque (Grade) | MOVESTOQUE |
| MEQ068 | Fechamento de Ordem Producao - Grade | MOVESTOQUE |
| MTR006 | Consumo do Estoque | MOVESTOQUE |
SATCFe | Emissao SAT-CFe | MOVESTOQUE |
jFaturamento | Shared Unit - Engine fiscal | MOVESTOQUE |
+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.