Pular para o conteúdo principal

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 visivelComponenteDataFieldObservacoes
Nº SequênciaTDBEditNR_SEQUENCIASomente leitura, gerado por GERA_SEQUENCIA
Região ComercialTDBEdit + TDBEditCD_REGIAOCOMERCIAL / DS_REGIAOCOMERCIALF9 abre Pesquisa sobre REGIAOCOMERCIAL
PessoaTDBEdit + TDBEditCD_PESSOA / NM_PESSOAF9 abre Pesquisa sobre PESSOA (somente ST_ATIVA='S')
GrupoTDBEdit + TDBEditCD_GRUPO / DS_GRUPOF9 abre Pesquisa sobre GRUPO
MarcaTDBEdit + TDBEditCD_MARCA / DS_MARCAF9 abre Pesquisa sobre MARCA
ProdutoTDBEdit + TDBEditCD_ITEM / DS_ITEMF9 abre Pesquisa sobre ITEM (somente ST_ATIVO='S')
VendedorTDBEdit + TDBEditCD_VENDEDOR / NM_VENDEDORF9 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ítuloFieldNameLargura
Seq.NR_SEQUENCIA40
RegiãoCD_REGIAOCOMERCIAL80
PessoaCD_PESSOA80
GrupoCD_GRUPO80
MarcaCD_MARCA80
ProdutoCD_ITEM80
VendedorCD_VENDEDOR75

Toolbar lateral​

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):

FonteCampoEfeito
TPrograma (jMenu / jSeguranca)tpAcessoQuando = 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âmetroResumo
CD_GRUPOFiltro de Grupo (Parâmetros de Vendedor) - PARMVENDEDOR
CD_ITEMProduto do Parâmetro de Vendedor - PARMVENDEDOR
CD_MARCAParâmetros de Vendedor (Marca) - PARMVENDEDOR
CD_PESSOAPessoa (Filtro de Parâmetros de Vendedor) - PARMVENDEDOR
CD_REGIAOCOMERCIALRegião Comercial do Parâmetro de Vendedor - PARMVENDEDOR
CD_VENDEDORParâmetro de Vendedor - PARMVENDEDOR
DT_REGISTROData/Hora do Registro - PARMVENDEDOR
NR_SEQUENCIASequência do Parâmetro de Vendedor - PARMVENDEDOR

Tabelas de Escrita (INSERT/UPDATE/DELETE)​

TabelaOperacoes
PARMVENDEDORDELETE, INSERT, SELECT, UPDATE

Tabelas de Leitura (SELECT)​

TabelaOperacoes
GRUPOSELECT
ITEMSELECT
MARCASELECT
PESSOASELECT
REGIAOCOMERCIALSELECT
VENDEDORSELECT

Procedures Chamadas​

ProcedureTabelas Acessadas
GERA_SEQUENCIASEQUENCIA (SELECT/UPDATE)

Tabelas via Procedures (acesso indireto)​

TabelaOperacoes
SEQUENCIASELECT, UPDATE

Dependencias Aferentes (quem alimenta as tabelas lidas por MFA007)​

Tabela lidaMódulos que escrevem (cadastros T*)
PESSOATFA001, TFA006, TFA015, TFA038, TFA039, TFA045, TFA046, TCB015, TEQ009, TEQ010
VENDEDORTFA001, TFA007, TRD015, TRD019
REGIAOCOMERCIALTFA001, TFA014
GRUPOTFA006, TPO006, TPO027
MARCATFA006, TPO002, TPO027, TPO038
ITEMTFA006, 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.

ConsumidorTabelaObservacao
ATUALIZA_PESSOA (procedure)PARMVENDEDORUPDATE em cascata quando CD_PESSOA/CD_VENDEDOR e substituido