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.dfmlinhas 9010–9044) Tabela:PARMFATUR.TP_CAMPOSBLOQPEDTipo:VARCHAR(30)— conjunto de flags de 1 caractere concatenadas (tabelaUdmMFA001.dfmlinha 1607–1611,Size = 30) Valor padrão:X(nenhum campo bloqueado) — aplicado emVerifica_CamposPedBloq('I')dentro detabPARMFATURAfterInsert(UdmMFA001.paslinha 504, fallback'X'nas linhas 937–938 e 1942–1943)
Componente visual:
TCheckListBox chkTP_CAMPOSBLOQPEDcom 1 item —"Fornecedor/Cliente"(UMFA001.dfmlinhas 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ódulo | Código | Arquivo | Papel |
|---|---|---|---|
| Parâmetros Faturamento | MFA001 | UMFA001.pas, UdmMFA001.pas | Produtora — cadastra/edita o TCheckListBox e grava a string de flags em PARMFATUR.TP_CAMPOSBLOQPED |
| Pedido de Compra | MPD001 | UMPD001.pas | Consumidora — 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 Venda | MPD002 | UMPD002.pas | Consumidora — 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
| Campo | Tabela | Descrição |
|---|---|---|
TP_CAMPOSBLOQPED | PARMFATUR | Este 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_PESSOA | PEDIDO | Campo Fornecedor (MPD001) / Cliente (MPD002) do cabeçalho do pedido — é o único campo do pedido cuja edição é controlada por este parâmetro |
CdPessoaRO | variável Delphi | Flag 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
| Valor | Nome | O que faz |
|---|---|---|
P | Fornecedor/Cliente | Torna 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
TCheckListBoxcontém apenas 1 item visível ("Fornecedor/Cliente"→ letraP). A arquitetura do campo (VARCHAR(30)+ concatenação de letras no padrãoTP_OBSNOTA/TP_OBSORDEMCARREG) prevê expansão futura para outros campos bloqueáveis, mas hoje só a flagPestá implementada.
P — Fornecedor/Cliente (idx 0)
| O que faz | Detalhe |
|---|---|
| Origem | UdmMFA001.pas linha 1939 — if (frmMFA001.chkTP_CAMPOSBLOQPED.Checked[0]) then IO := IO + 'P' |
| Leitura em MPD001 | UMPD001.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 MPD002 | UMPD002.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 visual | dmMPD001.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 MPD002 | UMPD002.pas linha 3732 — a consulta de pessoas via F9 exige (not CdPessoaRO); com flag P ativa, F9 fica inoperante no campo Cliente |
| Escopo | Independente 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
- Em MFA001 → aba Parâmetros → sub-aba Pedidos → Opção 1 → localize o GroupBox "Bloqueio de Campos do Pedido".
- Marque o item
"Fornecedor/Cliente". O eventochkTP_CAMPOSBLOQPEDClickCheck(UMFA001.paslinha 2317) chamaVerifica_CamposPedBloq('I')e gravaTP_CAMPOSBLOQPED = 'P'. - Salve (F6).
- Abra MPD001 (Pedido de Compra) ou MPD002 (Pedido de Venda) e carregue qualquer pedido existente ou inicie um novo.
- 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 faz | Detalhe |
|---|---|
| Origem | UdmMFA001.pas linhas 1942–1943 — if (IO = '') then IO := 'X' (gravado quando o CheckListBox não tem itens marcados) |
| Fallback adicional | UdmMFA001.pas linhas 937–938 — em tabPARMFATURBeforePost, se o campo estiver vazio/trim, grava 'X' |
| Efeito em MPD001/MPD002 | Nenhum — 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
- Em MFA001 → Pedidos → Opção 1 → GroupBox "Bloqueio de Campos do Pedido" → desmarque todos os itens.
- Salve (F6). O campo é gravado como
'X'(nunca vazio — é o marcador explícito de "nenhum"). - Em MPD001 ou MPD002, abra qualquer pedido.
- 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âmetro | Escopo | Quando avalia |
|---|---|---|
ST_BLOQUEIOPED | Decide se o pedido inteiro nasce bloqueado (ST_PEDIDO = 'B') e precisa de liberação | No INSERT do pedido |
ST_ALTERAPEDIDO | Permite/proíbe alterar um pedido já impresso/confirmado | Em BeforePost / salvamento |
ST_ALTERAPEDIDOBLOQ | Exceção: permite alterar pedido cujo ST_PEDIDO = 'B' | Em BeforePost + consulta por NR_PEDIDO |
TP_CAMPOSBLOQPED | Bloqueia campos específicos (hoje só CD_PESSOA) independente do estado do pedido | Em 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 comST_PEDIDO = 'B'(aguardando liberação), o campoCD_PESSOAfica bloqueado por esta regra (independente de autorização), enquanto os demais campos seguem as regras deST_ALTERAPEDIDOBLOQ.TP_CAMPOSBLOQPED = 'X': comportamento deCD_PESSOApassa a depender do estado do pedido e dos demais parâmetros de alteração (padrão "livre").
Ordem de avaliação no MPD001
- Ao abrir pedido →
tabPEDIDOBeforeEdit→ executa o SELECT deTP_CAMPOSBLOQPED(linhas 1141–1146) → setaCdPessoaRO→ aplicaReadOnly. - Ao digitar número do pedido em
edtNR_PEDIDOe dar Enter →edtNR_PEDIDOExit→ re-executa a lógica (linhas 1237–1245). - Independentemente do resultado,
ST_ALTERAPEDIDOeST_ALTERAPEDIDOBLOQcontinuam valendo para os demais campos do pedido.
Ordem de avaliação no MPD002
- Após
tabITEMPEDIDOAfterScroll→ bloco linhas 4437–4445 → re-avaliaCdPessoaROviaParmFatur.Values['TP_CAMPOSBLOQPED'](cache em memória da structParmFatur). - Ao pressionar F9 no campo Cliente → linha 3732 exige
(not CdPessoaRO)→ com flagPativa, a tela de consulta de pessoas nem é aberta.
Tabela Comparativa Resumida
| Letra | Descrição | Efeito em MPD001 | Efeito em MPD002 | Outros módulos |
|---|---|---|---|---|
P | Fornecedor/Cliente | tabPEDIDOCD_PESSOA.ReadOnly = True (linha 1152, 1245) | tabPEDIDOCD_PESSOA.ReadOnly = True (linha 4444) + F9 desativado (linha 3732) | — |
X | Nenhum (padrão) | Sem efeito | Sem efeito | — |
Reservado para expansão: o campo é
VARCHAR(30)e a rotinaVerifica_CamposPedBloq(UdmMFA001.paslinhas 1931–1959) está estruturada no mesmo padrão deVerifica_TipoObsNota— basta adicionar itens aoTCheckListBox chkTP_CAMPOSBLOQPEDe 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)
| Arquivo | Linhas | Papel |
|---|---|---|
source/MFA001/UMFA001.dfm | 9010–9044 | TGroupBox GroupBox6 (Caption " Bloqueio de Campos do Pedido ") contendo TCheckListBox chkTP_CAMPOSBLOQPED com 1 item "Fornecedor/Cliente" e OnClickCheck = chkTP_CAMPOSBLOQPEDClickCheck |
source/MFA001/UMFA001.pas | 328 | Declaração chkTP_CAMPOSBLOQPED: TCheckListBox |
source/MFA001/UMFA001.pas | 808, 2317–2320 | procedure chkTP_CAMPOSBLOQPEDClickCheck → chama Verifica_CamposPedBloq('I') |
source/MFA001/UMFA001.pas | 1058 | Em validação: se TP_CAMPOSBLOQPED vazio, força Edit do dataset (garante persistência do 'X') |
source/MFA001/UMFA001.pas | 1156–1160 | Navegação por Shift+Enter: quando ActiveControl = chkTP_CAMPOSBLOQPED, muda para pagPedidoOp2 e foca dbedtCD_MOVIMENTACAOPED |
source/MFA001/UdmMFA001.pas | 219 | Declaração tabPARMFATURTP_CAMPOSBLOQPED: TStringField |
source/MFA001/UdmMFA001.pas | 504 | AfterInsert — chama Verifica_CamposPedBloq('I') para inicializar o CheckListBox (grava 'X' porque nenhum item está marcado) |
source/MFA001/UdmMFA001.pas | 937–938 | BeforePost — fallback: if Trim(...) = '' then ... := 'X' |
source/MFA001/UdmMFA001.pas | 1931–1959 | Procedure 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.dfm | 233, 1607–1611, 2411, 2579, 2738, 3113 | TP_CAMPOSBLOQPED nos SQLs do tabPARMFATUR (SelectSQL, InsertSQL, ModifySQL) e no TStringField tabPARMFATURTP_CAMPOSBLOQPED (Size = 30) |
Delphi — Consumidores (leem PARMFATUR.TP_CAMPOSBLOQPED)
| Arquivo | Linhas | Papel |
|---|---|---|
source/MPD001/UdmMPD001.pas | 187 | Declaração CdPessoaRO: Boolean (variável de unit) |
source/MPD001/UMPD001.pas | 1139–1152 | Em tabPEDIDOBeforeEdit — SELECT TP_CAMPOSBLOQPED FROM PARMFATUR WHERE CD_EMPRESA = <sessao>, itera Copy(...) = 'P', seta tabPEDIDOCD_PESSOA.ReadOnly := CdPessoaRO |
source/MPD001/UMPD001.pas | 1235–1245 | Em edtNR_PEDIDOExit — repete o mesmo SQL ao consultar pedido por número |
source/MPD002/UdmMPD002.pas | 493 | Declaração CdPessoaRO, stPermissaoCancelamento: Boolean (variável de unit) |
source/MPD002/UdmMPD002.pas | 5755 | SELECT ... P.TP_CAMPOSBLOQPED ... FROM PARMFATUR P — carrega parâmetros na inicialização do formulário (popula ParmFatur.Values) |
source/MPD002/UMPD002.pas | 4437–4445 | Bloco {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.pas | 3732 | F9 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/.