Desativar edição de campos da Solicitação de Compras

No artigo de hoje vamos mostrar como desativar a alteração de campos da grid de Solicitação de Compras via ponto de entrada.

Um aluno recentemente nos perguntou se seria possível desativar alguns campos da grid de Solicitação de Compras (MATA110), sem alterar o Modo De Edição via Configurador e somente para alguns usuários.

 

Pensado nisso, elaboramos a seguinte lógica para esse exemplo:

  1. Vamos validar no ParamIxb desse ponto de entrada MA110TEL, se é uma Alteração
  2. E se o usuário logado estiver contido em um parâmetro
  3. Será feito um laço de repetição na variável aHeader que tem as definições das colunas
  4. Se for alguma das colunas que queremos bloquear, vamos alterar a posição do array relacionada à validação de campo, forçando .F. para que o usuário não consiga alterar o valor

 

Abaixo então como ficou o código fonte:

//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

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação