Desativando a inserção e exclusão de linhas de uma grid MVC

No artigo de hoje, vamos demonstrar como desativar a inclusão, alteração e/ou a exclusão de linhas em uma grid MVC.

Se você já precisou travar em uma grid para que não haja novas linhas ou alteração de linhas existentes ou exclusão de linhas, saiba que é bem simples fazer, através de 3 métodos no model da sua grid, sendo:

  • SetNoDeleteLine: Método que desativa a exclusão da linha (.T.) ou mantém como sendo possível excluir (.F.)
  • SetNoInsertLine: Método que desativa a inclusão da linha (.T.) ou mantém como sendo possível incluir (.F.)
  • SetNoUpdateLine: Método que desativa a alteração da linha (.T.) ou mantém como sendo possível alterar (.F.)

Para utilizar esses métodos, você intercepta o model da grid, e aciona eles. Abaixo um exemplo fazendo, desativando a exclusão de linhas na ModelDef:

/*/{Protheus.doc} ModelDef
Modelo de dados na funcao zMVC02
@author Daniel Atilio
@since 21/01/2022
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
  
Static Function ModelDef()
    Local oStruPai := FWFormStruct(1, cTabPai)
    Local oStruFilho := FWFormStruct(1, cTabFilho)
    Local aRelation := {}
    Local oModel
    Local bPre := Nil
    Local bPos := Nil
    Local bCommit := Nil
    Local bCancel := Nil
  
  
    //Cria o modelo de dados para cadastro
    oModel := MPFormModel():New("zMVC02M", bPre, bPos, bCommit, bCancel)
    oModel:AddFields("ZD2MASTER", /*cOwner*/, oStruPai)
    oModel:AddGrid("ZD3DETAIL","ZD2MASTER",oStruFilho,/*bLinePre*/, /*bLinePost*/,/*bPre - Grid Inteiro*/,/*bPos - Grid Inteiro*/,/*bLoad - Carga do modelo manualmente*/)
    oModel:SetDescription("Modelo de dados - " + cTitulo)
    oModel:GetModel("ZD2MASTER"):SetDescription( "Dados de - " + cTitulo)
    oModel:GetModel("ZD3DETAIL"):SetDescription( "Grid de - " + cTitulo)
    oModel:SetPrimaryKey({})
  
    //Fazendo o relacionamento
    aAdd(aRelation, {"ZD3_FILIAL", "FWxFilial('ZD3')"} )
    aAdd(aRelation, {"ZD3_CD", "ZD2_CD"})
    oModel:SetRelation("ZD3DETAIL", aRelation, ZD3->(IndexKey(1)))
      
    //Definindo campos unicos da linha
    oModel:GetModel("ZD3DETAIL"):SetUniqueLine({'ZD3_MUSICA'})
  
    //Desativando a exclusão de linhas
    oModel:GetModel("ZD3DETAIL"):SetNoDeleteLine(.T.)
  
Return oModel

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.

4 Responses

  1. Daniel Gonçalves Jr. disse:

    Ficou invertido a descrição dos métodos, veja:
    SetNoDeleteLine: Método que desativa a inclusão da linha (.T.) ou mantém como sendo possível incluir (.F.)
    SetNoInsertLine: Método que desativa a exclusão da linha (.T.) ou mantém como sendo possível excluir (.F.)

    Correto:
    SetNoInsertLine: Método que desativa a inclusão da linha (.T.) ou mantém como sendo possível incluir (.F.)
    SetNoDeleteLine: Método que desativa a exclusão da linha (.T.) ou mantém como sendo possível excluir (.F.)

  2. Mauricio disse:

    Boa Tarde Atilio.
    Esse tratamento funciona muito bem, mas se aplica a todos as linhas do grid. Existe uma forma de tratar individualmente cada linha de um grid. Por exemplo eu tenho um grid que através de alterações que venham a ocorrer ao longo do tempo, ele é atualizado com uma nova linha. Mas eu preciso que somente esse nova linha possa ser alterada…as demais que ja foram incluidas no grid antes, permaneçam sem poder serem alteradas. Tem uma forma pra isso?

    • Bom dia Mauricio, tudo joia?

      Teria duas formas, sendo que a primeira, seria você usar o método SetNoUpdateLine passando como .T.

      A segunda, caso queira fazer algo mais manual, seria:
      1. No seu addGrid da, adicione o bLinePost (que é o LinOk) e nele você coloca um bloco de código para acionar uma validação, exemplo: {|| fSuaValid}
      2. Dentro dessa sua função, você verifica se a linha foi atualizada, similar ao exemplo abaixo:

      Static Function fSuaValid()
      Local aArea := FWGetArea()
      Local lContinua := .T.
      Local oModelPad := FWModelActive()
      Local oModelGrid := oModelPad:GetModel(‘XXXDETAIL’) //substitua o XXXDETAIL pelo nome da sua DETAIL no AddGrid

      //Se a linha foi atualizada, não permite prosseguir
      If oModelGRID:IsUpdated()
      lContinua := .F.
      EndIf
      Return lContinua

      Tenha um ótimo e abençoado fim de semana.

      Um grande abraço.

Deixe uma resposta

Terminal de Informação