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.
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.)
Fala xará, bom dia, tudo joia?
Opa, valeu pelo toque, artigo já corrigido.
Abraços.
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.