Pular para o conteúdo principal

TP_CAMPOSBLOQPED — Campos do Pedido Bloqueados para Edição

Tela de configuração: MFA001 — Parâmetros de Faturamento Localização: Parâmetros → Pedidos → Opção 1 → GroupBox "Bloqueio de Campos do Pedido" (UMFA001.dfm linhas 9010–9044) Tabela: PARMFATUR.TP_CAMPOSBLOQPED Tipo: VARCHAR(30) — conjunto de flags de 1 caractere concatenadas (tabela UdmMFA001.dfm linha 1607–1611, Size = 30) Valor padrão: X (nenhum campo bloqueado) — aplicado em Verifica_CamposPedBloq('I') dentro de tabPARMFATURAfterInsert (UdmMFA001.pas linha 504, fallback 'X' nas linhas 937–938 e 1942–1943)

Componente visual: TCheckListBox chkTP_CAMPOSBLOQPED com 1 item — "Fornecedor/Cliente" (UMFA001.dfm linhas 9026–9043). Cada item marcado grava uma letra no campo; quando nenhum está marcado, o sistema grava 'X' como marcador de "vazio/nenhum".

Telas impactadas​

MóduloCódigoArquivoPapel
Parâmetros FaturamentoMFA001UMFA001.pas, UdmMFA001.pasProdutora — cadastra/edita o TCheckListBox e grava a string de flags em PARMFATUR.TP_CAMPOSBLOQPED
Pedido de CompraMPD001UMPD001.pasConsumidora — lê o parâmetro (UMPD001.pas linhas 1141–1150 e 1237–1245) e aplica ReadOnly no campo PEDIDO.CD_PESSOA (Fornecedor) quando a flag P está ativa
Pedido de VendaMPD002UMPD002.pasConsumidora — lê via ParmFatur.Values['TP_CAMPOSBLOQPED'] (linhas 4438–4444) e aplica ReadOnly no campo PEDIDO.CD_PESSOA (Cliente) quando a flag P está ativa. Também influencia a tecla F9 (troca de pessoa via popup) em UMPD002.pas linha 3732

Procedures impactadas​

Nenhuma. grep em Scripts/ não retornou ocorrências — o parâmetro é consumido exclusivamente pelo front Delphi (MPD001 e MPD002).

Campos envolvidos​

CampoTabelaDescrição
TP_CAMPOSBLOQPEDPARMFATUREste parâmetro. String de até 30 caracteres; cada caractere é uma flag independente. Hoje apenas a letra P está mapeada; X representa "nenhum campo bloqueado"
CD_PESSOAPEDIDOCampo Fornecedor (MPD001) / Cliente (MPD002) do cabeçalho do pedido — é o único campo do pedido cuja edição é controlada por este parâmetro
CdPessoaROvariável DelphiFlag Boolean calculada em MPD001 (UdmMPD001.pas linha 187) e MPD002 (UdmMPD002.pas linha 493) a partir de POSITION('P', TP_CAMPOSBLOQPED). Alimenta tabPEDIDOCD_PESSOA.ReadOnly

Flags / Opções disponíveis​

ValorNomeO que faz
PFornecedor/ClienteTorna o campo CD_PESSOA ReadOnly em MPD001 (Fornecedor) e MPD002 (Cliente), independente do estado do pedido (Aberto, Bloqueado, etc.). Também impede uso da tecla F9 (troca de pessoa) em MPD002
X(Nenhum — valor padrão)Marcador gravado quando nenhum item do CheckListBox está marcado (UdmMFA001.pas linhas 1942–1943 e 937–938). O campo Fornecedor/Cliente permanece editável normalmente

Observação técnica: o TCheckListBox contém apenas 1 item visível ("Fornecedor/Cliente" → letra P). A arquitetura do campo (VARCHAR(30) + concatenação de letras no padrão TP_OBSNOTA/TP_OBSORDEMCARREG) prevê expansão futura para outros campos bloqueáveis, mas hoje só a flag P está implementada.


P — Fornecedor/Cliente (idx 0)​

O que fazDetalhe
OrigemUdmMFA001.pas linha 1939 — if (frmMFA001.chkTP_CAMPOSBLOQPED.Checked[0]) then IO := IO + 'P'
Leitura em MPD001UMPD001.pas linhas 1141–1150 (tabPEDIDOBeforeEdit) e 1237–1245 (edtNR_PEDIDOExit) — SELECT TP_CAMPOSBLOQPED FROM PARMFATUR WHERE CD_EMPRESA = <sessao> e itera Copy(Resultado[0], I, 1) = 'P' → CdPessoaRO := True
Leitura em MPD002UMPD002.pas linhas 4438–4444 — for I := 1 to Length(ParmFatur.Values['TP_CAMPOSBLOQPED']) do if (Copy(ParmFatur.Values['TP_CAMPOSBLOQPED'], I, 1) = 'P') then CdPessoaRO := True
Efeito visualdmMPD001.tabPEDIDOCD_PESSOA.ReadOnly := CdPessoaRO (MPD001 linha 1152) / dmMPD002.tabPEDIDOCD_PESSOA.ReadOnly := CdPessoaRO (MPD002 linha 4444) — o campo CD_PESSOA fica cinza/bloqueado na grade e no edit
Interação com F9 em MPD002UMPD002.pas linha 3732 — a consulta de pessoas via F9 exige (not CdPessoaRO); com flag P ativa, F9 fica inoperante no campo Cliente
EscopoIndependente do estado do pedido (Aberto A, Bloqueado B, Orçamento O, etc.). Comentário explícito no código: {Verifica campos à serem bloqueados pela MFA001 independente do estado do pedido}

Simulação passo a passo​

  1. Em MFA001 → aba Parâmetros → sub-aba Pedidos → Opção 1 → localize o GroupBox "Bloqueio de Campos do Pedido".
  2. Marque o item "Fornecedor/Cliente". O evento chkTP_CAMPOSBLOQPEDClickCheck (UMFA001.pas linha 2317) chama Verifica_CamposPedBloq('I') e grava TP_CAMPOSBLOQPED = 'P'.
  3. Salve (F6).
  4. Abra MPD001 (Pedido de Compra) ou MPD002 (Pedido de Venda) e carregue qualquer pedido existente ou inicie um novo.
  5. O campo Fornecedor (MPD001) / Cliente (MPD002) aparece bloqueado — não aceita digitação, não aceita F9 (MPD002).

Resultado esperado: após carregar um pedido, o operador pode alterar quantidade, preço, itens, condições de pagamento etc., mas não pode trocar o Fornecedor/Cliente do cabeçalho. Útil em operações onde a troca de cliente em pedido já emitido é risco (rastreabilidade fiscal, comissão por vendedor, tabela de preço vinculada ao cliente).


X — Nenhum campo bloqueado (valor padrão)​

O que fazDetalhe
OrigemUdmMFA001.pas linhas 1942–1943 — if (IO = '') then IO := 'X' (gravado quando o CheckListBox não tem itens marcados)
Fallback adicionalUdmMFA001.pas linhas 937–938 — em tabPARMFATURBeforePost, se o campo estiver vazio/trim, grava 'X'
Efeito em MPD001/MPD002Nenhum — os loops Copy(..., I, 1) = 'P' percorrem a string 'X' e nunca encontram P, portanto CdPessoaRO permanece False e CD_PESSOA.ReadOnly = False

Simulação passo a passo​

  1. Em MFA001 → Pedidos → Opção 1 → GroupBox "Bloqueio de Campos do Pedido" → desmarque todos os itens.
  2. Salve (F6). O campo é gravado como 'X' (nunca vazio — é o marcador explícito de "nenhum").
  3. Em MPD001 ou MPD002, abra qualquer pedido.
  4. O campo Fornecedor/Cliente permanece editável (observadas as demais regras — ST_ALTERAPEDIDO, ST_ALTERAPEDIDOBLOQ, status do pedido, etc.).

Resultado esperado: comportamento "livre" — TP_CAMPOSBLOQPED não participa do bloqueio de nenhum campo. O controle da edição do cabeçalho fica por conta dos demais parâmetros (ST_ALTERAPEDIDO, ST_ALTERAPEDIDOBLOQ, ST_BLOQUEIOPED).


Interação com ST_ALTERAPEDIDOBLOQ / ST_BLOQUEIOPED​

TP_CAMPOSBLOQPED atua em camada diferente dos parâmetros de bloqueio de pedido:

ParâmetroEscopoQuando avalia
ST_BLOQUEIOPEDDecide se o pedido inteiro nasce bloqueado (ST_PEDIDO = 'B') e precisa de liberaçãoNo INSERT do pedido
ST_ALTERAPEDIDOPermite/proíbe alterar um pedido já impresso/confirmadoEm BeforePost / salvamento
ST_ALTERAPEDIDOBLOQExceção: permite alterar pedido cujo ST_PEDIDO = 'B'Em BeforePost + consulta por NR_PEDIDO
TP_CAMPOSBLOQPEDBloqueia campos específicos (hoje só CD_PESSOA) independente do estado do pedidoEm BeforeEdit / carregamento do pedido (MPD001) e após AfterScroll (MPD002)

Casos combinados​

  • TP_CAMPOSBLOQPED = 'P' + ST_ALTERAPEDIDO = 'N': pedido é editável (outros campos liberados), mas Fornecedor/Cliente bloqueado em TODO pedido.
  • TP_CAMPOSBLOQPED = 'P' + ST_BLOQUEIOPED = 'S': mesmo em pedido com ST_PEDIDO = 'B' (aguardando liberação), o campo CD_PESSOA fica bloqueado por esta regra (independente de autorização), enquanto os demais campos seguem as regras de ST_ALTERAPEDIDOBLOQ.
  • TP_CAMPOSBLOQPED = 'X': comportamento de CD_PESSOA passa a depender do estado do pedido e dos demais parâmetros de alteração (padrão "livre").

Ordem de avaliação no MPD001​

  1. Ao abrir pedido → tabPEDIDOBeforeEdit → executa o SELECT de TP_CAMPOSBLOQPED (linhas 1141–1146) → seta CdPessoaRO → aplica ReadOnly.
  2. Ao digitar número do pedido em edtNR_PEDIDO e dar Enter → edtNR_PEDIDOExit → re-executa a lógica (linhas 1237–1245).
  3. Independentemente do resultado, ST_ALTERAPEDIDO e ST_ALTERAPEDIDOBLOQ continuam valendo para os demais campos do pedido.

Ordem de avaliação no MPD002​

  1. Após tabITEMPEDIDOAfterScroll → bloco linhas 4437–4445 → re-avalia CdPessoaRO via ParmFatur.Values['TP_CAMPOSBLOQPED'] (cache em memória da struct ParmFatur).
  2. Ao pressionar F9 no campo Cliente → linha 3732 exige (not CdPessoaRO) → com flag P ativa, a tela de consulta de pessoas nem é aberta.

Tabela Comparativa Resumida​

LetraDescriçãoEfeito em MPD001Efeito em MPD002Outros módulos
PFornecedor/ClientetabPEDIDOCD_PESSOA.ReadOnly = True (linha 1152, 1245)tabPEDIDOCD_PESSOA.ReadOnly = True (linha 4444) + F9 desativado (linha 3732)—
XNenhum (padrão)Sem efeitoSem efeito—

Reservado para expansão: o campo é VARCHAR(30) e a rotina Verifica_CamposPedBloq (UdmMFA001.pas linhas 1931–1959) está estruturada no mesmo padrão de Verifica_TipoObsNota — basta adicionar itens ao TCheckListBox chkTP_CAMPOSBLOQPED e letras correspondentes na procedure para bloquear outros campos do cabeçalho do pedido sem mudança de schema.


Referências no Código Fonte​

Delphi — Tela MFA001 (produtora)​

ArquivoLinhasPapel
source/MFA001/UMFA001.dfm9010–9044TGroupBox GroupBox6 (Caption " Bloqueio de Campos do Pedido ") contendo TCheckListBox chkTP_CAMPOSBLOQPED com 1 item "Fornecedor/Cliente" e OnClickCheck = chkTP_CAMPOSBLOQPEDClickCheck
source/MFA001/UMFA001.pas328Declaração chkTP_CAMPOSBLOQPED: TCheckListBox
source/MFA001/UMFA001.pas808, 2317–2320procedure chkTP_CAMPOSBLOQPEDClickCheck → chama Verifica_CamposPedBloq('I')
source/MFA001/UMFA001.pas1058Em validação: se TP_CAMPOSBLOQPED vazio, força Edit do dataset (garante persistência do 'X')
source/MFA001/UMFA001.pas1156–1160Navegação por Shift+Enter: quando ActiveControl = chkTP_CAMPOSBLOQPED, muda para pagPedidoOp2 e foca dbedtCD_MOVIMENTACAOPED
source/MFA001/UdmMFA001.pas219Declaração tabPARMFATURTP_CAMPOSBLOQPED: TStringField
source/MFA001/UdmMFA001.pas504AfterInsert — chama Verifica_CamposPedBloq('I') para inicializar o CheckListBox (grava 'X' porque nenhum item está marcado)
source/MFA001/UdmMFA001.pas937–938BeforePost — fallback: if Trim(...) = '' then ... := 'X'
source/MFA001/UdmMFA001.pas1931–1959Procedure Verifica_CamposPedBloq(IO: String) — converte TCheckListBox ↔ string de flags: 'I' (In) lê do combo e monta a string; 'O' (Out) lê do banco e marca os Checked
source/MFA001/UdmMFA001.dfm233, 1607–1611, 2411, 2579, 2738, 3113TP_CAMPOSBLOQPED nos SQLs do tabPARMFATUR (SelectSQL, InsertSQL, ModifySQL) e no TStringField tabPARMFATURTP_CAMPOSBLOQPED (Size = 30)

Delphi — Consumidores (leem PARMFATUR.TP_CAMPOSBLOQPED)​

ArquivoLinhasPapel
source/MPD001/UdmMPD001.pas187Declaração CdPessoaRO: Boolean (variável de unit)
source/MPD001/UMPD001.pas1139–1152Em tabPEDIDOBeforeEdit — SELECT TP_CAMPOSBLOQPED FROM PARMFATUR WHERE CD_EMPRESA = <sessao>, itera Copy(...) = 'P', seta tabPEDIDOCD_PESSOA.ReadOnly := CdPessoaRO
source/MPD001/UMPD001.pas1235–1245Em edtNR_PEDIDOExit — repete o mesmo SQL ao consultar pedido por número
source/MPD002/UdmMPD002.pas493Declaração CdPessoaRO, stPermissaoCancelamento: Boolean (variável de unit)
source/MPD002/UdmMPD002.pas5755SELECT ... P.TP_CAMPOSBLOQPED ... FROM PARMFATUR P — carrega parâmetros na inicialização do formulário (popula ParmFatur.Values)
source/MPD002/UMPD002.pas4437–4445Bloco {Verifica campos à serem bloqueados pela MFA001 independente do estado do pedido} — itera ParmFatur.Values['TP_CAMPOSBLOQPED'], seta CdPessoaRO, aplica tabPEDIDOCD_PESSOA.ReadOnly := CdPessoaRO
source/MPD002/UMPD002.pas3732F9 no campo pessoa — exige (not CdPessoaRO) para abrir popup de consulta

SQL — Procedures (Firebird)​

Nenhuma. O parâmetro não é referenciado em nenhuma procedure/view/trigger em Scripts/.