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 observacaoDEVOLUCAO MEQ010em uma transacao propria (transactionTransf). - Aplica controle de acesso padrao:
tpAcesso = 2oculta 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)
| Label | DataField | Componente | Observacao |
|---|---|---|---|
| Empresa | CD_EMPRESA / NM_EMPRESA | TDBEdit | Pre-populado com sessao.empresa.cd_empresa; F9 abre Pesquisa de Empresas. |
| Data Inicial | DT_INICIAL | TwwDBDateTimePicker | Filtro MS.DT_LANCAMENTO >=. |
| Data Final | DT_FINAL | TwwDBDateTimePicker | Filtro MS.DT_LANCAMENTO <=. |
| Tipo Local Saida | CD_TIPOLOCALSAI / DS_TIPOLOCALSAI | TDBEdit | F9 = Pesquisa TIPOLOCAL. |
| Local Saida | CD_LOCALSAI / DS_LOCALSAI | TDBEdit | F9 = Pesquisa LOCALESTOQUE. |
| Tipo Local Entrada | CD_TIPOLOCALENT / DS_TIPOLOCALENT | TDBEdit | F9 = Pesquisa TIPOLOCAL. |
| Local Entrada | CD_LOCALENT / DS_LOCALENT | TDBEdit | F9 = Pesquisa LOCALESTOQUE. |
Grupo: Produtos (grpITEM)
gridITEM(TDBGrid, ligado atabITEM) — colunasCódigo(CD_ITEM) eDescricao(DS_ITEM). F9 em cada linha abre Pesquisa de produtos ativos (ITEM.ST_ATIVO = 'S').
Botao: Consultar <F> (btnConsultar) — dispara btnProcurar.Click.
Aba: Transferencias (pagEstoque)
Grupo: Produtos (GroupBox1)
gridTransf(TDBGrid ligado atabTransf, somente leitura exceto pela coluna STATUS) com colunas:
| Título | Campo | Observacao |
|---|---|---|
| (marcador) | STATUS | Wingdings 2; Espaco/clique alterna entre vazio e Å (simbolo de selecionado). |
| Data | DT_LANCAMENTO | |
| Produto | DS_ITEM | DS_ITEM || ' - ' || CD_ITEM. |
| Quantidade | QT_ESTOQUE | |
| UND | SG_UNIDMED | |
| Local Saida | DS_LOCALSAI | |
| Local Entrada | DS_LOCALENT |
Botao: Confirmar <F> (btnCancelar) — dispara btnSalvar.Click (processa o lote selecionado).
Toolbar lateral (visibilidade padrao)
Novo Registro <F>,Cancelar Registro <F>,Consultar <F>,Sair <F>visiveis.Salvar,Excluir,Atualizar,Imprimire separadores associados sao ocultados noiniciar(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.
| Origem | Campo | Efeito |
|---|---|---|
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
- Empresa obrigatoria:
btnProcurarexigeCD_EMPRESApreenchido antes de montar a consulta — caso contrarioJException E-0000"E Obrigatorio Informar a Empresa para Gerar o Relatório!". - Validacao de periodo:
tabEMPRESADT_INICIAL.OnValidateetabEMPRESADT_FINALValidategarantemDT_INICIAL <= DT_FINAL("A Data Inicial nao pode ser Maior que a Data Final!"). - Produto ativo:
tabITEMCD_ITEMValidateexigeITEM.ST_ATIVO = 'S'(referencia[TPO001]). Produto inexistente geraJException"O Produto nao esta Cadastrado [TPO001]!". - 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 geramJExceptioncom referencia ao módulo de cadastro ([ADM002],[TEQ002],[TEQ003]). - Filtro de transferencias ativas: so retornam pares onde AMBOS os lados (
MS= saida,ME= entrada) temTP_DOCUMENTO='TF',ST_CANCELAMENTO='N'e o par esta vinculado porME.CD_EMPRESA = MS.CD_EMPRESA AND ME.NR_DOCUMENTO = MS.NR_LANCAMENTO. - Exclusao do lado de saida: o SQL junta
OPERACAOe exigeO.TP_OPERACAO = 'S'(saida) no movimentoMS, garantindo que cada par seja listado uma unica vez. - Excluir ja devolvidos: registros cujo
MS.DS_OBSERVACAO = 'DEVOLUCAO MEQ010'nao retornam na consulta, impedindo devolucao dupla. - Seleção reversivel: no grid de resultados, Espaco ou clique na coluna STATUS alterna o marcador
Å— representa selecao em memoria do cliente, nao grava. - Confirmacao em transacao propria:
btnSalvarusadmMEQ010.transactionTransf(separada datransactionprincipal). Para cada linha marcada, executa doisUPDATE 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, mensagemI-1546e retorno a aba de consulta. - 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. tabTransf.OnNewRecordcancela qualquer Append: o dataset de resultado e somente para exibicao/marcacao, nao aceita novas linhas.- Consulta vazia: se
tabTransf.Eofapos Open, lancaJException"A Consulta nao Retornou Registros".
Datasets e SQL
dmMEQ010.fdCon (TFDConnection)
Compartilha CliHandle com a sessao (SharedCliHandle := sessao.connection.CliHandle). Transacoes:
transaction— principal, iniciada eminiciare a cadabtnNovo, usada nos datasets de filtro e validacoes (ExecutaConsulta).transactionTransf— transacao dedicada aoUPDATEem lote disparado porbtnSalvar.
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)
| Tabela | Operacoes |
|---|---|
| MOVESTOQUE | UPDATE (carimba DS_OBSERVACAO = 'DEVOLUCAO MEQ010' em pares de transferencia) |
Nota: os datasets
tabEMPRESAetabITEMtemupdEMPRESA/updITEMcom InsertSQL/ModifySQL/DeleteSQL definidos, mas a tela nunca chamaApplyUpdatese 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)
| Tabela | Operacoes |
|---|---|
| EMPRESA | SELECT |
| ITEM | SELECT |
| LOCALESTOQUE | SELECT |
| MOVESTOQUE | SELECT |
| OPERACAO | SELECT |
| TIPOLOCAL | SELECT |
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):
| Tela | Tabela Produzida |
|---|---|
| CEQ005 | MOVESTOQUE |
| CNF001 | MOVESTOQUE |
| CNF012 | MOVESTOQUE |
| MCA012 | MOVESTOQUE |
| MCO005 | MOVESTOQUE |
| MEQ002 | MOVESTOQUE |
| MEQ004 | MOVESTOQUE |
| MEQ006 | MOVESTOQUE |
| MEQ008 | MOVESTOQUE (transferencia — contraparte direta) |
| MEQ012 | MOVESTOQUE |
| MEQ016 | MOVESTOQUE |
| MEQ020 | MOVESTOQUE |
| MEQ035 | MOVESTOQUE |
| MEQ042 | MOVESTOQUE |
| MEQ047 | MOVESTOQUE |
| MEQ052 | MOVESTOQUE |
| MEQ068 | MOVESTOQUE |
| MNF001 | MOVESTOQUE |
| MNF035 | MOVESTOQUE |
| MTR006 | MOVESTOQUE |
SATCFe | MOVESTOQUE |
| TOF007 | MOVESTOQUE |
| ADM002 | EMPRESA |
| TPO001 | ITEM |
| TEQ003 | LOCALESTOQUE |
| TEQ002 | TIPOLOCAL |
| CEQ006 | OPERACAO |
Dependencias Eferentes
Telas que leem MOVESTOQUE (tabela escrita/carimbada por MEQ010) e portanto podem ser impactadas pelo flag DS_OBSERVACAO = 'DEVOLUCAO MEQ010':
| Tela | Tabela Consumida |
|---|---|
| CEQ001 | MOVESTOQUE |
| CEQ002 | MOVESTOQUE |
| CEQ003 | MOVESTOQUE |
| CEQ005 | MOVESTOQUE |
| CNF001 | MOVESTOQUE |
| CNF002 | MOVESTOQUE |
| CNF005 | MOVESTOQUE |
| CNF008 | MOVESTOQUE |
| CNF012 | MOVESTOQUE |
| CPD002 | MOVESTOQUE |
| CRC002 | MOVESTOQUE |
| CTR002 | MOVESTOQUE |
LAE001 | MOVESTOQUE |
LEP001 | MOVESTOQUE |
LOP018 | MOVESTOQUE |
LOP021 | MOVESTOQUE |
LOP029 | MOVESTOQUE |
| MCA010 | MOVESTOQUE |
| MCA012 | MOVESTOQUE |
| MCB017 | MOVESTOQUE |
| MEQ002 | MOVESTOQUE |
| MEQ003 | MOVESTOQUE |
| MEQ004 | MOVESTOQUE |
| MEQ006 | MOVESTOQUE |
| MEQ007 | MOVESTOQUE |
| MEQ008 | MOVESTOQUE |
| MEQ012 | MOVESTOQUE |
| MEQ016 | MOVESTOQUE |
| MEQ035 | MOVESTOQUE |
| MEQ042 | MOVESTOQUE |