Se você já precisou restringir a edição de campos em uma Solicitação de Compras no Protheus (MATA110), sabe que essa não é exatamente uma tarefa simples — especialmente quando queremos aplicar a regra apenas para determinados usuários, sem mexer no Modo de Edição do Configurador.
Pois é, essa dúvida é mais comum do que parece.
E neste artigo, vamos mostrar como desativar a edição de campos específicos da grid da Solicitação de Compras de forma prática, utilizando um ponto de entrada.
Essa é uma solução leve, segura e totalmente reversível — perfeita para quem quer manter o controle sem alterar o comportamento padrão do sistema.
O desafio
Um dos nossos alunos perguntou recentemente se seria possível bloquear alguns campos da tela de Solicitação de Compras (programa MATA110), mas sem alterar o modo de edição via Configurador — e aplicando isso apenas para determinados usuários.
A resposta é: sim, é possível.
E o segredo está no ponto de entrada MA110TEL, que permite manipular a grid de forma dinâmica.
A lógica por trás da solução
A ideia é simples e elegante:
- Verificamos se o processo é uma alteração (modo 4).
- Checamos se o usuário logado está em uma lista de exceções (definida via parâmetro).
- Percorremos o array aHeader, que contém as definições de cada coluna da grid.
- Identificamos os campos que queremos bloquear.
- Alteramos a posição do array responsável pela validação, forçando o valor para
.F.
, o que impede a digitação.
Assim, apenas os usuários autorizados conseguem editar os campos desejados, e o comportamento da tela se ajusta automaticamente conforme o login.
Código-fonte completo
Abaixo está o código do ponto de entrada, pronto para ser implementado:
#Include "TOTVS.ch"
/*/{Protheus.doc} MT110TEL
Ponto de entrada que manipula a tela de Solicitação de Compras
@type user function
@author Atilio
@since 17/06/2025
@see https://tdn.totvs.com/pages/releaseview.action?pageId=6085447
/*/
User Function MT110TEL()
Local aArea := FWGetArea()
Local nOpc := PARAMIXB[3]
Local cUsrLogad := RetCodUsr()
Local cUsrPodem := SuperGetMV("MV_X_USALT", .F., "000005;000006;000011;")
Local nAtual := 0
Local cCampo := ""
// Se for alteração
If nOpc == 4
// Se o usuário logado NÃO estiver na lista dos que podem alterar
If ! cUsrLogad $ cUsrPodem
// Percorre todos os campos da grid
For nAtual := 1 To Len(aHeader)
cCampo := Alltrim(aHeader[nAtual][02])
// Se for o campo de Quantidade, Preço ou Observação
If cCampo + ";" $ "C1_QUANT;C1_PRECO;C1_OBS;"
// Bloqueia a edição
aHeader[nAtual][06] := ".F."
EndIf
Next
EndIf
EndIf
FWRestArea(aArea)
Return
Como configurar o parâmetro de controle de usuários
No código acima, usamos o parâmetro MV_X_USALT
para definir quais usuários podem alterar os campos.
Basta configurar esse parâmetro no dicionário de dados, separando os códigos dos usuários com ponto e vírgula (;
).
Exemplo:
MV_X_USALT = 000005;000006;000011;
Assim, apenas esses usuários conseguirão editar os campos bloqueados para os demais.
Dica prática
Essa abordagem é ideal para cenários onde:
- Você quer limitar alterações sensíveis (como preço ou quantidade) a perfis específicos;
- Deseja evitar erros de digitação em campos críticos;
- Ou simplesmente quer melhorar o controle interno de compras sem precisar mexer no configurador ou aplicar bloqueios via dicionário.
Além disso, por ser uma customização feita via ponto de entrada, ela é fácil de manter, testar e remover, sem comprometer o ambiente padrão do Protheus.
Conclusão
Bloquear a edição de campos na Solicitação de Compras pode parecer uma tarefa complicada, mas com o ponto de entrada MA110TEL e um pouco de lógica em ADVPL, é possível fazer isso de forma simples, elegante e totalmente segura.
Na Geeker Company, acreditamos que pequenas automações como essa fazem toda a diferença no dia a dia da operação — reduzindo erros, melhorando o controle e dando mais agilidade para o time de compras.
Se você quer levar esse tipo de melhoria para o seu ambiente Protheus, fale com a gente.
Nós ajudamos sua empresa a evoluir com soluções práticas, inteligentes e que fazem o sistema trabalhar a seu favor.