MFA007 — Movimentação MFA007
Fonte
- Source:
source/MFA007/
- BPL requires:
rtl, vcl, dbrtl, vclwinx, vclactnband, vclx, vcldb, FireDAC, FireDACCommonDriver, FireDACCommon, FireDACIBDriver, ipstudiowin, jCommon, jPesquisa
- DDL:
docs/schema/tables/PARMVENDEDOR.sql
Objetivo
Cadastrar combinacoes de parametros de atribuicao de vendedor na tabela PARMVENDEDOR, associando um Vendedor a criterios de Regiao Comercial, Pessoa (cliente), Grupo de produto, Marca e/ou Produto. Cada combinacao gera um registro de sequencia (NR_SEQUENCIA) que serve como regra de roteamento utilizada em movimentacoes comerciais (pedidos, notas fiscais, recebimento) para sugerir automaticamente o vendedor responsavel conforme o perfil do cliente e dos itens da operacao.
Funcionalidades
- Cadastro (Novo / Salvar / Excluir / Cancelar) sobre a tabela
PARMVENDEDOR, com geracao automatica de NR_SEQUENCIA via GERA_SEQUENCIA('SEQ_PARMVENDEDOR').
- Pesquisa avancada sobre os registros existentes (
btnProcurar -> ConsultaAvancada).
- Atalhos de navegacao:
F2 Atualizar, F3 Procurar, F4 Cancelar, F5 Novo, F6 Salvar, F7 Excluir, F8 Imprimir, F12 Sair, PgUp/PgDn primeiro/ultimo, setas Up/Down navegam registros.
- F9 em cada campo de codigo (Vendedor, Regiao Comercial, Pessoa, Grupo, Marca, Produto) abre a
Pesquisa() padrao do framework.
- Ao digitar um codigo, o
OnValidate faz lookup na tabela de dominio e preenche a descricao; bloqueia gravacao se registro nao existe ou o produto esta inativo.
- Detecta registro ja existente para a combinacao (Regiao / Grupo / Marca / Pessoa / Produto) via
ConsultaRegistro, reposicionando o grid no registro ja cadastrado.
- Controle de acesso:
programa.tpAcesso = 2 oculta os botoes Novo, Salvar, Excluir e o separador, deixando a tela em modo somente consulta/impressão.
- Impressao via
GeraRelatorio(transaction, programa.Código, SQL) utilizando o proprio SQL filtrado da tabela.
Estrutura da Tela
GroupBox "Parametros de Vendedor" (grpVENDEDOR)
| Campo visivel | Componente | DataField | Observacoes |
|---|
| Nº Sequência | TDBEdit | NR_SEQUENCIA | Somente leitura, gerado por GERA_SEQUENCIA |
| Região Comercial | TDBEdit + TDBEdit | CD_REGIAOCOMERCIAL / DS_REGIAOCOMERCIAL | F9 abre Pesquisa sobre REGIAOCOMERCIAL |
| Pessoa | TDBEdit + TDBEdit | CD_PESSOA / NM_PESSOA | F9 abre Pesquisa sobre PESSOA (somente ST_ATIVA='S') |
| Grupo | TDBEdit + TDBEdit | CD_GRUPO / DS_GRUPO | F9 abre Pesquisa sobre GRUPO |
| Marca | TDBEdit + TDBEdit | CD_MARCA / DS_MARCA | F9 abre Pesquisa sobre MARCA |
| Produto | TDBEdit + TDBEdit | CD_ITEM / DS_ITEM | F9 abre Pesquisa sobre ITEM (somente ST_ATIVO='S') |
| Vendedor | TDBEdit + TDBEdit | CD_VENDEDOR / NM_VENDEDOR | F9 abre Pesquisa sobre PESSOA INNER JOIN VENDEDOR (somente ST_ATIVA='S'); OnExit dispara ConsultaRegistro |
GroupBox "Consulta" (grpCONSULTA)
TDBGrid gridVENDEDOR em modo dgRowSelect, ReadOnly, bindado em dsPARMVENDEDOR, com colunas:
| Título | FieldName | Largura |
|---|
| Seq. | NR_SEQUENCIA | 40 |
| Região | CD_REGIAOCOMERCIAL | 80 |
| Pessoa | CD_PESSOA | 80 |
| Grupo | CD_GRUPO | 80 |
| Marca | CD_MARCA | 80 |
| Produto | CD_ITEM | 80 |
| Vendedor | CD_VENDEDOR | 75 |
Botoes: Novo <F>, Salvar <F>, Excluir <F>, Cancelar <F>, Consultar <F>, Atualizar <F>, Imprimir <F>, Sair <F>.
Parametros que Influenciam
A tela nao consome tabelas PARM*/PARAM* proprias — o unico parametro externo que altera comportamento e o tpAcesso do TPrograma (menu/seguranca):
| Fonte | Campo | Efeito |
|---|
TPrograma (jMenu / jSeguranca) | tpAcesso | Quando = 2, oculta os botoes Novo, Salvar e Excluir — tela vira somente leitura/impressão |
Regras de Negocio
Validacoes em BeforePost (tabPARMVENDEDORBeforePost)
- Vendedor obrigatorio: se
edtCD_VENDEDOR vazio, foca o campo e lanca JException 'W-0000' com "E Obrigatorio informar o Vendedor!".
- Ao menos um criterio obrigatorio: se Produto, Pessoa, Regiao Comercial e Grupo estiverem todos vazios, foca Regiao Comercial e lanca
JException 'W-0000' com "E Obrigatorio informar a Regiao Comercial, Grupo, Pessoa ou Produto!".
- Geracao de sequencia: se
NR_SEQUENCIA vazio, chama GERA_SEQUENCIA(NULL, 'SEQ_PARMVENDEDOR') retornando V_NR_SEQUENCIA e V_DS_MENSAGEM; se a procedure retorna mensagem, lanca JException 'W-0000' com o texto retornado.
Lookups via OnValidate (preenche descricao + valida existencia/ativo)
CD_GRUPOValidate -> GRUPO (sem check de ativo); erro "O Grupo nao esta Cadastrado [TPO006]!".
CD_VENDEDORValidate -> PESSOA INNER JOIN VENDEDOR; erro "O Vendedor nao esta Cadastrado [TFA007]!".
CD_REGIAOCOMERCIALValidate -> REGIAOCOMERCIAL; erro "A Regiao Comercial nao esta Cadastrada [TFA014]!".
CD_ITEMValidate -> ITEM com ST_ATIVO; lanca "O Produto nao esta Ativo [TPO001]!" se ST_ATIVO = 'N', ou "O Produto nao esta Cadastrado [TPO001]!" se inexistente.
CD_PESSOAValidate -> PESSOA; erro "A Pessoa nao esta Cadastrada [TFA001]!".
CD_MARCAValidate -> MARCA; erro "A Marca nao esta Cadastrada [TPO002]!".
Antiduplicidade (ConsultaRegistro)
No OnExit de edtCD_VENDEDOR, se o dataset esta em dsInsert/dsEdit, executa SELECT NR_SEQUENCIA FROM PARMVENDEDOR WHERE CD_REGIAOCOMERCIAL ... AND CD_GRUPO ... AND CD_MARCA ... AND CD_PESSOA ... AND CD_ITEM ... (usando Nulo() + Se(,,'IS','=') para tratar NULLs). Se achou um registro, reabre a query com WHERE P.NR_SEQUENCIA = :encontrado posicionando o grid sobre a combinacao existente.
Fluxo de transacao
iniciar: StartTransaction + armazena SQL original em isqlPARMVENDEDOR + tabPARMVENDEDOR.Open.
btnSalvar: Post -> Commit -> reabre com SQL original -> Locate('NR_SEQUENCIA', ...) -> msgCodigo('I-0047').
btnExcluir: confirma via msgCodigo('C-0045') -> Delete -> Commit -> StartTransaction -> Open -> msgCodigo('I-0046').
btnAtualizar: Rollback -> restaura isqlPARMVENDEDOR -> StartTransaction -> reabre.
FormClose: se em Insert/Edit e btnSalvar visivel, oferece msgCodigo('C-0048'); depois faz Rollback -> Free(dmMFA007) -> sessao.descarregarPrograma.
Datasets e SQL
tabPARMVENDEDOR (TFDQuery principal; UpdateObject = updPARMVENDEDOR)
SELECT P.NR_SEQUENCIA, P.DT_REGISTRO,
P.CD_GRUPO, G.DS_GRUPO,
P.CD_MARCA, M.DS_MARCA,
P.CD_VENDEDOR, V.NM_PESSOA NM_VENDEDOR,
P.CD_REGIAOCOMERCIAL, R.DS_REGIAOCOMERCIAL,
P.CD_ITEM, I.DS_ITEM, P.CD_PESSOA, S.NM_PESSOA
FROM PARMVENDEDOR P
LEFT JOIN GRUPO G ON (G.CD_GRUPO = P.CD_GRUPO)
LEFT JOIN PESSOA V ON (V.CD_PESSOA = P.CD_VENDEDOR)
LEFT JOIN REGIAOCOMERCIAL R ON (R.CD_REGIAOCOMERCIAL = P.CD_REGIAOCOMERCIAL)
LEFT JOIN PESSOA S ON (S.CD_PESSOA = P.CD_PESSOA)
LEFT JOIN ITEM I ON (I.CD_ITEM = P.CD_ITEM)
LEFT JOIN MARCA M ON (M.CD_MARCA = P.CD_MARCA)
ORDER BY P.NR_SEQUENCIA
updPARMVENDEDOR (TFDUpdateSQL)
- InsertSQL:
insert into PARMVENDEDOR (CD_REGIAOCOMERCIAL, CD_GRUPO, CD_MARCA, CD_VENDEDOR, DT_REGISTRO, NR_SEQUENCIA, CD_ITEM, CD_PESSOA) values (:CD_REGIAOCOMERCIAL, :CD_GRUPO, :CD_MARCA, :CD_VENDEDOR, 'NOW', :NR_SEQUENCIA, :CD_ITEM, :CD_PESSOA)
- ModifySQL: atualiza todos os codigos +
DT_REGISTRO = 'NOW' filtrando por NR_SEQUENCIA = :OLD_NR_SEQUENCIA.
- DeleteSQL:
delete from PARMVENDEDOR where NR_SEQUENCIA = :OLD_NR_SEQUENCIA.
- FetchRowSQL: mesmo SELECT principal com
WHERE P.NR_SEQUENCIA = :NR_SEQUENCIA.
Conexao / transacao
fdCon: TFDConnection Firebird (CharacterSet ISO8859_1), SharedCliHandle := sessao.connection.CliHandle.
transaction: TFDTransaction xiReadCommitted, sem AutoStart/AutoStop — controlada manualmente pelo fluxo de botoes.
Parâmetros Documentados
Parâmetros desta tela documentados pelo agente. Cada execução adiciona ou atualiza o item correspondente.
| Parâmetro | Resumo |
|---|
| CD_GRUPO | Filtro de Grupo (Parâmetros de Vendedor) - PARMVENDEDOR |
| CD_ITEM | Produto do Parâmetro de Vendedor - PARMVENDEDOR |
| CD_MARCA | Parâmetros de Vendedor (Marca) - PARMVENDEDOR |
| CD_PESSOA | Pessoa (Filtro de Parâmetros de Vendedor) - PARMVENDEDOR |
| CD_REGIAOCOMERCIAL | Região Comercial do Parâmetro de Vendedor - PARMVENDEDOR |
| CD_VENDEDOR | Parâmetro de Vendedor - PARMVENDEDOR |
| DT_REGISTRO | Data/Hora do Registro - PARMVENDEDOR |
| NR_SEQUENCIA | Sequência do Parâmetro de Vendedor - PARMVENDEDOR |
Tabelas de Escrita (INSERT/UPDATE/DELETE)
Tabelas de Leitura (SELECT)
Procedures Chamadas
| Procedure | Tabelas Acessadas |
|---|
| GERA_SEQUENCIA | SEQUENCIA (SELECT/UPDATE) |
Tabelas via Procedures (acesso indireto)
| Tabela | Operacoes |
|---|
| SEQUENCIA | SELECT, UPDATE |
Dependencias Aferentes (quem alimenta as tabelas lidas por MFA007)
| Tabela lida | Módulos que escrevem (cadastros T*) |
|---|
| PESSOA | TFA001, TFA006, TFA015, TFA038, TFA039, TFA045, TFA046, TCB015, TEQ009, TEQ010 |
| VENDEDOR | TFA001, TFA007, TRD015, TRD019 |
| REGIAOCOMERCIAL | TFA001, TFA014 |
| GRUPO | TFA006, TPO006, TPO027 |
| MARCA | TFA006, TPO002, TPO027, TPO038 |
| ITEM | TFA006, TFA066, TFA077, TOF007, TPO001, TPO027, TPO038, TPO039, TRC007, TRC012 |
Dependencias Eferentes (quem consome PARMVENDEDOR)
Nao foram identificadas telas consumidoras diretas de PARMVENDEDOR no mapeamento estatico (tools/output/table_screen_map.json). A tabela e atualizada indiretamente pela procedure ATUALIZA_PESSOA (substitui CD_PESSOA e CD_VENDEDOR em cadeia) e e candidata natural a ser consultada por rotinas de atribuicao automatica de vendedor em pedidos/notas — se confirmado uso dinamico, adicionar módulos aqui.
| Consumidor | Tabela | Observacao |
|---|
ATUALIZA_PESSOA (procedure) | PARMVENDEDOR | UPDATE em cascata quando CD_PESSOA/CD_VENDEDOR e substituido |