Em muitos projetos com o Protheus, surge a necessidade de controlar quem pode alterar certos campos em uma tela — principalmente em rotinas sensíveis como a Solicitação de Compras (MATA110).
No artigo de hoje, vamos mostrar como desativar a alteração de campos da grid da Solicitação de Compras utilizando ponto de entrada, sem precisar mexer no Modo de Edição via Configurador e aplicando a regra apenas para usuários específicos.
O desafio
Um dos nossos alunos perguntou recentemente se seria possível bloquear determinados campos da grid de Solicitação de Compras (MATA110) apenas para alguns usuários, sem alterar o comportamento padrão do configurador.
Essa dúvida é bastante comum — principalmente quando há diferentes níveis de acesso dentro do mesmo processo de compras.
A lógica utilizada
Para resolver o problema, aplicamos a seguinte lógica dentro do ponto de entrada MA110TEL:
- Validamos, via
ParamIxb, se o evento atual é uma alteração; - Conferimos se o usuário logado está dentro de um parâmetro que lista quem pode editar;
- Percorremos a variável
aHeader, que contém as definições das colunas da grid; - Quando encontramos um dos campos que queremos bloquear, forçamos a posição do array que controla a validação do campo para
.F., impedindo a edição.
Assim, os campos ficam visíveis para todos, mas apenas alguns usuários poderão realmente alterá-los.
Código-fonte completo
Abaixo está o código utilizado para implementar essa lógica:
//Bibliotecas
#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;"
//Altera a posição para ".F." para que force a validação para não permitir digitação
aHeader[nAtual][06] := ".F."
EndIf
Next
EndIf
EndIf
FWRestArea(aArea)
Return
Resultado prático
Com essa implementação, usuários não autorizados ficam impossibilitados de alterar campos sensíveis como Quantidade, Preço e Observação — enquanto os demais seguem com acesso normal.
Essa abordagem é simples, segura e reversível, ideal para empresas que precisam reforçar o controle de edição em telas específicas sem alterar o padrão do sistema.
Conclusão
Esse tipo de solução é um ótimo exemplo de como o Protheus permite flexibilidade através de pontos de entrada, sem precisar mexer em estruturas complexas.
Com poucos comandos, você consegue criar regras de negócio personalizadas e deixar o sistema mais alinhado às políticas internas da sua empresa.
Quer aprender mais sobre customizações no Protheus?
Acompanhe o blog da Geeker Company para mais artigos práticos como este — com exemplos reais, explicações passo a passo e códigos prontos para aplicar no seu ambiente.




