Pular para o conteúdo principal

MEQ010 — Movimentação MEQ010

Fonte​

  • source/MEQ010/UMEQ010.pas (form, 522 linhas)
  • source/MEQ010/UMEQ010.dfm (layout visual)
  • source/MEQ010/UdmMEQ010.pas (datamodule, 211 linhas)
  • source/MEQ010/UdmMEQ010.dfm (design-time SQL)
  • source/MEQ010/MEQ010.dpk (package BPL)

Objetivo​

Consultar transferencias internas de estoque (documentos com TP_DOCUMENTO = 'TF') ja efetivadas entre dois locais de armazenagem da mesma empresa e marcar, em lote, os pares de lancamentos (saida + entrada) que devem ser "devolvidos" logicamente. A marcacao nao estorna o saldo fisico: carimba os registros em MOVESTOQUE.DS_OBSERVACAO = 'DEVOLUCAO MEQ010', tirando-os de novas consultas da tela e sinalizando para outros módulos que aquele par de lancamento foi revertido/anulado pelo usuario.

Funcionalidades​

  • Consultar transferencias efetivadas por empresa, periodo, tipo/local de saida e tipo/local de entrada.
  • Restringir a consulta a uma lista de produtos (grid de filtro com suporte a pesquisa F9).
  • Selecionar no grid de resultados, por linha, os pares de transferencia (movimento de saida + seu par de entrada) a serem marcados como devolvidos (tecla Espaco ou clique na coluna de status).
  • Confirmar o lote, atualizando simultaneamente o registro de saida e o registro de entrada vinculado (TF, ST_CANCELAMENTO='N') com a observacao DEVOLUCAO MEQ010 em uma transacao propria (transactionTransf).
  • Aplica controle de acesso padrao: tpAcesso = 2 oculta os botoes de edicao da toolbar (Novo/Salvar/Excluir).

Estrutura da Tela​

Form MDI child (fsMDIChild, BorderStyle=bsSingle) com toolbar lateral padrao (Novo/Salvar/Excluir/Cancelar/Consultar/Atualizar/Imprimir/Sair) e um TPageControl com duas abas.

Aba: Dados para Consulta (pagConsulta)​

Grupo: Dados para Consulta (grpCONSULTA)

LabelDataFieldComponenteObservacao
EmpresaCD_EMPRESA / NM_EMPRESATDBEditPre-populado com sessao.empresa.cd_empresa; F9 abre Pesquisa de Empresas.
Data InicialDT_INICIALTwwDBDateTimePickerFiltro MS.DT_LANCAMENTO >=.
Data FinalDT_FINALTwwDBDateTimePickerFiltro MS.DT_LANCAMENTO <=.
Tipo Local SaidaCD_TIPOLOCALSAI / DS_TIPOLOCALSAITDBEditF9 = Pesquisa TIPOLOCAL.
Local SaidaCD_LOCALSAI / DS_LOCALSAITDBEditF9 = Pesquisa LOCALESTOQUE.
Tipo Local EntradaCD_TIPOLOCALENT / DS_TIPOLOCALENTTDBEditF9 = Pesquisa TIPOLOCAL.
Local EntradaCD_LOCALENT / DS_LOCALENTTDBEditF9 = Pesquisa LOCALESTOQUE.

Grupo: Produtos (grpITEM)

  • gridITEM (TDBGrid, ligado a tabITEM) — colunas Código (CD_ITEM) e Descricao (DS_ITEM). F9 em cada linha abre Pesquisa de produtos ativos (ITEM.ST_ATIVO = 'S').

Botao: Consultar &lt;F&gt; (btnConsultar) — dispara btnProcurar.Click.

Aba: Transferencias (pagEstoque)​

Grupo: Produtos (GroupBox1)

  • gridTransf (TDBGrid ligado a tabTransf, somente leitura exceto pela coluna STATUS) com colunas:
TítuloCampoObservacao
(marcador)STATUSWingdings 2; Espaco/clique alterna entre vazio e Å (simbolo de selecionado).
DataDT_LANCAMENTO
ProdutoDS_ITEMDS_ITEM || ' - ' || CD_ITEM.
QuantidadeQT_ESTOQUE
UNDSG_UNIDMED
Local SaidaDS_LOCALSAI
Local EntradaDS_LOCALENT

Botao: Confirmar &lt;F&gt; (btnCancelar) — dispara btnSalvar.Click (processa o lote selecionado).

Toolbar lateral (visibilidade padrao)​

  • Novo Registro &lt;F&gt;, Cancelar Registro &lt;F&gt;, Consultar &lt;F&gt;, Sair &lt;F&gt; visiveis.
  • Salvar, Excluir, Atualizar, Imprimir e separadores associados sao ocultados no iniciar (a tela salva via botao Confirmar da aba, nao pela toolbar).

Parametros que Influenciam​

Nao foram identificadas referencias a tabelas-parametro (PARM*, PARAM*, CONFIG*) no codigo de MEQ010. A tela nao le PARMFATUR/PARMESTOQUE/PARMUSUARIO: o comportamento depende apenas da sessao (sessao.empresa.cd_empresa) e do programa.tpAcesso.

OrigemCampoEfeito
sessao.empresa.cd_empresa-Empresa default no filtro ao clicar Novo.
programa.tpAcesso-= 2 oculta botoes Novo/Salvar/Excluir da toolbar (nao impede Confirmar).

Regras de Negocio​

  1. Empresa obrigatoria: btnProcurar exige CD_EMPRESA preenchido antes de montar a consulta — caso contrario JException E-0000 "E Obrigatorio Informar a Empresa para Gerar o Relatório!".
  2. Validacao de periodo: tabEMPRESADT_INICIAL.OnValidate e tabEMPRESADT_FINALValidate garantem DT_INICIAL <= DT_FINAL ("A Data Inicial nao pode ser Maior que a Data Final!").
  3. Produto ativo: tabITEMCD_ITEMValidate exige ITEM.ST_ATIVO = 'S' (referencia [TPO001]). Produto inexistente gera JException "O Produto nao esta Cadastrado [TPO001]!".
  4. Lookups de FK preenchem descricao: CD_EMPRESA -> NM_EMPRESA (EMPRESA); CD_LOCALSAI/CD_LOCALENT -> DS_LOCAL (LOCALESTOQUE); CD_TIPOLOCALSAI/CD_TIPOLOCALENT -> DS_TIPOLOCAL (TIPOLOCAL). Codigos invalidos geram JException com referencia ao módulo de cadastro ([ADM002], [TEQ002], [TEQ003]).
  5. Filtro de transferencias ativas: so retornam pares onde AMBOS os lados (MS = saida, ME = entrada) tem TP_DOCUMENTO='TF', ST_CANCELAMENTO='N' e o par esta vinculado por ME.CD_EMPRESA = MS.CD_EMPRESA AND ME.NR_DOCUMENTO = MS.NR_LANCAMENTO.
  6. Exclusao do lado de saida: o SQL junta OPERACAO e exige O.TP_OPERACAO = 'S' (saida) no movimento MS, garantindo que cada par seja listado uma unica vez.
  7. Excluir ja devolvidos: registros cujo MS.DS_OBSERVACAO = 'DEVOLUCAO MEQ010' nao retornam na consulta, impedindo devolucao dupla.
  8. Seleção reversivel: no grid de resultados, Espaco ou clique na coluna STATUS alterna o marcador Å — representa selecao em memoria do cliente, nao grava.
  9. Confirmacao em transacao propria: btnSalvar usa dmMEQ010.transactionTransf (separada da transaction principal). Para cada linha marcada, executa dois UPDATE MOVESTOQUE SET DS_OBSERVACAO = 'DEVOLUCAO MEQ010': um no registro de saida (CD_EMPRESA + NR_LANCAMENTO) e outro no par de entrada (CD_EMPRENT + NR_LANCENT). Commit ao final, mensagem I-1546 e retorno a aba de consulta.
  10. Sem delete fisico: a tela nao exclui registros em MOVESTOQUE; apenas carimba o campo de observacao. Para efeito de saldo, o estoque permanece movimentado — quem consome o carimbo ("DEVOLUCAO MEQ010") e o responsavel por ajustar a logica a jusante.
  11. tabTransf.OnNewRecord cancela qualquer Append: o dataset de resultado e somente para exibicao/marcacao, nao aceita novas linhas.
  12. Consulta vazia: se tabTransf.Eof apos Open, lanca JException "A Consulta nao Retornou Registros".

Datasets e SQL​

dmMEQ010.fdCon (TFDConnection)​

Compartilha CliHandle com a sessao (SharedCliHandle := sessao.connection.CliHandle). Transacoes:

  • transaction — principal, iniciada em iniciar e a cada btnNovo, usada nos datasets de filtro e validacoes (ExecutaConsulta).
  • transactionTransf — transacao dedicada ao UPDATE em lote disparado por btnSalvar.

tabEMPRESA (TFDQuery, in-memory)​

SQL desenho (dummy): SELECT CD_EMPRESA, NM_EMPRESA, DT_REGISTRO DT_INICIAL, DT_REGISTRO DT_FINAL, CD_EMPRESA CD_LOCALSAI, NM_EMPRESA DS_LOCALSAI, ... FROM EMPRESA WHERE CD_EMPRESA = -1. Dataset usado como buffer de filtros (Append em btnNovo); nao executa os updEMPRESA InsertSQL/ModifySQL/DeleteSQL. Campos de data usam mascara dd/mm/yyyy.

tabITEM (TFDQuery, in-memory)​

SQL desenho: SELECT CD_ITEM, DS_ITEM FROM ITEM WHERE CD_ITEM = -1. Preenchido via grid (Append/F9); serve apenas para montar a clausula AND MS.CD_ITEM IN (...) em btnProcurar. InsertSQL do updITEM nao e aplicado.

tabTransf (TFDQuery principal)​

SQL dinamico montado em btnProcurarClick:

SELECT MS.DT_LANCAMENTO, MS.QT_ESTOQUE,
I.DS_ITEM||' - '||I.CD_ITEM DS_ITEM, I.SG_UNIDMED,
TS.DS_TIPOLOCAL||' - '||TS.CD_TIPOLOCAL DS_TIPOLOCALSAI,
LS.DS_LOCAL||' - '||LS.CD_LOCAL DS_LOCALSAI,
TE.DS_TIPOLOCAL||' - '||TE.CD_TIPOLOCAL DS_TIPOLOCALENT,
LE.DS_LOCAL||' - '||LE.CD_LOCAL DS_LOCALENT,
MS.CD_EMPRESA, MS.NR_LANCAMENTO,
ME.CD_EMPRESA CD_EMPRENT, ME.NR_LANCAMENTO NR_LANCENT,
CAST(NULL AS VARCHAR(1)) STATUS
FROM MOVESTOQUE MS
INNER JOIN ITEM I ON (I.CD_ITEM = MS.CD_ITEM)
INNER JOIN OPERACAO O ON (O.CD_OPERACAO = MS.CD_OPERACAO)
INNER JOIN TIPOLOCAL TS ON (TS.CD_TIPOLOCAL = MS.CD_TIPOLOCAL)
INNER JOIN LOCALESTOQUE LS ON (LS.CD_TIPOLOCAL = MS.CD_TIPOLOCAL
AND LS.CD_LOCAL = MS.CD_LOCAL)
INNER JOIN MOVESTOQUE ME ON (ME.CD_EMPRESA = MS.CD_EMPRESA
AND ME.NR_DOCUMENTO = MS.NR_LANCAMENTO
AND ME.TP_DOCUMENTO = 'TF'
AND ME.ST_CANCELAMENTO = 'N')
INNER JOIN TIPOLOCAL TE ON (TE.CD_TIPOLOCAL = ME.CD_TIPOLOCAL)
INNER JOIN LOCALESTOQUE LE ON (LE.CD_TIPOLOCAL = ME.CD_TIPOLOCAL
AND LE.CD_LOCAL = ME.CD_LOCAL)
WHERE MS.TP_DOCUMENTO = 'TF'
AND MS.ST_CANCELAMENTO = 'N'
AND O.TP_OPERACAO = 'S'
AND COALESCE(MS.DS_OBSERVACAO,'') <> 'DEVOLUCAO MEQ010'
AND MS.CD_EMPRESA = :empresa
[ AND MS.DT_LANCAMENTO >= :dt_ini ]
[ AND MS.DT_LANCAMENTO <= :dt_fim ]
[ AND MS.CD_TIPOLOCAL = :tip_sai ]
[ AND MS.CD_LOCAL = :loc_sai ]
[ AND ME.CD_TIPOLOCAL = :tip_ent ]
[ AND ME.CD_LOCAL = :loc_ent ]
[ AND MS.CD_ITEM IN (lista produtos) ]
ORDER BY DS_TIPOLOCALSAI, DS_LOCALSAI, MS.DT_LANCAMENTO, DS_ITEM

Observacao: a montagem usa concatenacao direta (+ edtCD_EMPRESA.Text, + dmMEQ010.tabEMPRESACD_TIPOLOCALSAI.AsString), padrao legado do jDB — SQL injection potencial. Para alteracoes, ver rule database.md (preferir ParamByName).

UPDATE em lote (btnSalvarClick)​

Executado via ExecUpdate(dmMEQ010.transactionTransf, ...) para cada linha marcada:

UPDATE MOVESTOQUE SET DS_OBSERVACAO = 'DEVOLUCAO MEQ010'
WHERE CD_EMPRESA = :CD_EMPRESA AND NR_LANCAMENTO = :NR_LANCAMENTO;

UPDATE MOVESTOQUE SET DS_OBSERVACAO = 'DEVOLUCAO MEQ010'
WHERE CD_EMPRESA = :CD_EMPRENT AND NR_LANCAMENTO = :NR_LANCENT;

Lookups via ExecutaConsulta​

  • SELECT NM_EMPRESA FROM EMPRESA WHERE CD_EMPRESA = ...
  • SELECT DS_ITEM, ST_ATIVO FROM ITEM WHERE CD_ITEM = ...
  • SELECT DS_LOCAL FROM LOCALESTOQUE WHERE CD_LOCAL = ...
  • SELECT DS_TIPOLOCAL FROM TIPOLOCAL WHERE CD_TIPOLOCAL = ...

Pesquisa F9 (Pesquisa de jPesquisa)​

  • Empresas: SELECT NM_EMPRESA, CD_EMPRESA FROM EMPRESA
  • Produtos ativos: SELECT DS_ITEM, CD_ITEM FROM ITEM WHERE ST_ATIVO = 'S'
  • Tipos de local: SELECT DS_TIPOLOCAL, CD_TIPOLOCAL FROM TIPOLOCAL
  • Locais: SELECT DS_LOCAL, CD_LOCAL FROM LOCALESTOQUE

Tabelas de Escrita (INSERT/UPDATE/DELETE)​

TabelaOperacoes
MOVESTOQUEUPDATE (carimba DS_OBSERVACAO = 'DEVOLUCAO MEQ010' em pares de transferencia)

Nota: os datasets tabEMPRESA e tabITEM tem updEMPRESA/updITEM com InsertSQL/ModifySQL/DeleteSQL definidos, mas a tela nunca chama ApplyUpdates e descarta o dataset em memoria. Em tempo de execucao MEQ010 nao escreve em EMPRESA nem em ITEM. O mapeamento estatico (tabela table_screen_map.json) marca essas tabelas como escrita por analise lexica dos SQL de UpdateSQL, mas o comportamento efetivo e somente leitura.

Tabelas de Leitura (SELECT)​

TabelaOperacoes
EMPRESASELECT
ITEMSELECT
LOCALESTOQUESELECT
MOVESTOQUESELECT
OPERACAOSELECT
TIPOLOCALSELECT

Procedures Chamadas​

Nenhuma procedure/trigger/view chamada diretamente pelo módulo.

Tabelas via Procedures​

Nao aplicavel.

Dependencias Aferentes​

Telas que escrevem nas tabelas lidas por MEQ010 (produtoras de MOVESTOQUE, EMPRESA, ITEM, LOCALESTOQUE, OPERACAO, TIPOLOCAL):

TelaTabela Produzida
CEQ005MOVESTOQUE
CNF001MOVESTOQUE
CNF012MOVESTOQUE
MCA012MOVESTOQUE
MCO005MOVESTOQUE
MEQ002MOVESTOQUE
MEQ004MOVESTOQUE
MEQ006MOVESTOQUE
MEQ008MOVESTOQUE (transferencia — contraparte direta)
MEQ012MOVESTOQUE
MEQ016MOVESTOQUE
MEQ020MOVESTOQUE
MEQ035MOVESTOQUE
MEQ042MOVESTOQUE
MEQ047MOVESTOQUE
MEQ052MOVESTOQUE
MEQ068MOVESTOQUE
MNF001MOVESTOQUE
MNF035MOVESTOQUE
MTR006MOVESTOQUE
SATCFeMOVESTOQUE
TOF007MOVESTOQUE
ADM002EMPRESA
TPO001ITEM
TEQ003LOCALESTOQUE
TEQ002TIPOLOCAL
CEQ006OPERACAO

Dependencias Eferentes​

Telas que leem MOVESTOQUE (tabela escrita/carimbada por MEQ010) e portanto podem ser impactadas pelo flag DS_OBSERVACAO = 'DEVOLUCAO MEQ010':

TelaTabela Consumida
CEQ001MOVESTOQUE
CEQ002MOVESTOQUE
CEQ003MOVESTOQUE
CEQ005MOVESTOQUE
CNF001MOVESTOQUE
CNF002MOVESTOQUE
CNF005MOVESTOQUE
CNF008MOVESTOQUE
CNF012MOVESTOQUE
CPD002MOVESTOQUE
CRC002MOVESTOQUE
CTR002MOVESTOQUE
LAE001MOVESTOQUE
LEP001MOVESTOQUE
LOP018MOVESTOQUE
LOP021MOVESTOQUE
LOP029MOVESTOQUE
MCA010MOVESTOQUE
MCA012MOVESTOQUE
MCB017MOVESTOQUE
MEQ002MOVESTOQUE
MEQ003MOVESTOQUE
MEQ004MOVESTOQUE
MEQ006MOVESTOQUE
MEQ007MOVESTOQUE
MEQ008MOVESTOQUE
MEQ012MOVESTOQUE
MEQ016MOVESTOQUE
MEQ035MOVESTOQUE
MEQ042MOVESTOQUE