Validação específica de campos usando grid do MVC

Boa noite!

Estou reformulando uma rotina e estou tendo dificuldades ao implementar um controle na grid do MVC.

Estou anexando uma foto e parte do código abaixo:

User Function ELFATA34
Local aArea         := GetArea()
Local oBrowse         := FwMBrowse():New()
Private cCadastro     := 'Conta Corrente de Fornecedores'
Private aRotina        := MenuDef() 

    oBrowse:SetAlias('ZKA')
    oBrowse:OptionReport(.F.)
    oBrowse:SetDescription(cCadastro)
    oBrowse:AddLegend("ZKA_STATUS == '1'", 'BR_VERDE'    , 'Competência em Aberto')
    oBrowse:AddLegend("ZKA_STATUS == '2'", 'BR_VERMELHO', 'Competência Fechada')
    oBrowse:Activate()

    RestArea(aArea)

Return 

Static Function MenuDef()
Local aRotina := {}

    Add Option aRotina Title 'Pesquisar'         Action 'AxPesqui'               Operation 1 Access 0
    Add Option aRotina Title 'Visualizar'         Action 'VIEWDEF.ELFATA34'     Operation 2 Access 0
    Add Option aRotina Title 'Incluir'             Action 'VIEWDEF.ELFATA34'     Operation 3 Access 0
    Add Option aRotina Title 'Alterar'             Action 'VIEWDEF.ELFATA34'     Operation 4 Access 0
    Add Option aRotina Title 'Excluir'             Action 'VIEWDEF.ELFATA34'     Operation 5 Access 0
    Add Option aRotina Title 'Imprimir'         Action 'VIEWDEF.ELFATA34'     Operation 8 Access 0

Return(aRotina)

Static Function ModelDef
Local oModel     := Nil
Local oStruHead    := FwFormStruct(1,'ZKA')
Local oStruGrid := FwFormStruct(1,'ZKB')

    //Monta o modelo principal
    oModel    := MpFormModel():New('CCFMVC',/*Pre-Validacao*/,/*Validação*/,/*Pós-Validação*/)
    oModel:SetDescription(cCadastro)    

    //Monta os dados do cabeçalho
    oModel:AddFields('ModelHead',,oStruHead)
    oModel:SetPrimaryKey({'ZKA_FILIAL','ZKA_MESANO','ZKA_CODFAB'})

    oModel:GetModel('ModelHead'):SetDescription(cCadastro)

    oStruHead:SetProperty('ZKA_MESANO', MODEL_FIELD_WHEN, {|| INCLUI})
    oStruHead:SetProperty('ZKA_CODFAB', MODEL_FIELD_WHEN, {|| INCLUI})

    //Monta os dados dos itens
    oModel:AddGrid('ModelGrid','ModelHead',oStruGrid,,{|oGrid| fLinOK(oGrid)},/*bPreGrid*/,/*bProsGrid*/)
    oModel:SetRelation('ModelGrid',{{'ZKB_FILIAL','ZKA_FILIAL'},{'ZKB_MESANO','ZKA_MESANO'},{'ZKB_CODFAB','ZKA_CODFAB'}}, ZKB->(IndexKey(1)) )

    oModel:GetModel('ModelGrid'):SetDescription('Itens')        
    oModel:GetModel('ModelGrid'):SetDelAllLine(.T.)
    oModel:GetModel('ModelGrid'):SetOptional(.F.)    

Return(oModel)

Static Function ViewDef
Local oView        := Nil
Local oModel    := FwLoadModel('ELFATA34') 
Local oStruHead    := FwFormStruct(2,'ZKA')
Local oStruGrid := FwFormStruct(2,'ZKB')

    //Não exibe o folder visual caso algum campo esteja inserido em um
    oStruHead:SetNoFolder()

    oView:= FwFormView():New() 
    oView:SetModel(oModel)              

    //Crio o cabeçalho e os grids de acordo com o modelo
    oView:AddField('ViewHead', oStruHead, 'ModelHead')
    oView:AddGrid ('ViewGrid', oStruGrid, 'ModelGrid')

    //Crio uma layer com 30% da tela e outra com 70% da tela, similar a FwLayer
    oView:CreateHorizontalBox('MAIN',30)
    oView:CreateHorizontalBox('GRID',70)

    //Informo os devidos títulos das telas
    oView:EnableTitleView('ViewHead','Resumo do Conta Corrente')
    oView:EnableTitleView('ViewGrid','Movimentações do Conta Corrente')

    //Informo a porcentagem da tela que cada view deve ocupar
    oView:SetOwnerView('ViewHead','MAIN')
    oView:SetOwnerView('ViewGrid','GRID')

Return(oView)

Static Function fLinOK(oGrid)
Local nX
Local nValTot     := 0
Local oModel      := FwModelActive()

    oGrid:GoLine(oGrid:nLine)

    If(oGrid:GetValue('ZKB_ORIGEM') == 'A')

        Help(,,'Não é permitida a alteração',,'Não é permitida a alteração de lançamentos de origem automática!',1,0,,,,,,{'Caso necessite, efetue o recálculo dos valores através de Outras Ações > Calc. Moviment.'})
        Return .F.

    Endif

    If(oModel:GetValue('ModelHead','ZKA_STATUS') == '2')

        Help(,,'Não é permitida a alteração',,'Não é permitida a alteração de um conta corrente com competência fechada!',1,0,,,,,,)
        Return .F.

    Endif

    For nX := 1 To oGrid:GetQtdLine()

        oGrid:GoLine(nX)

        If(!oGrid:IsDeleted())

            If(oGrid:GetValue('ZKB_RECPAG') == 'C')

                nValTot += oGrid:GetValue('ZKB_VALOR')

            Else

                nValTot -= oGrid:GetValue('ZKB_VALOR')

            Endif


        Endif

    Next

    oModel:SetValue('ModelHead','ZKA_SALPER',nValTot)
    oModel:SetValue('ModelHead','ZKA_SALATU',oModel:GetValue('ModelHead','ZKA_SALANT') + nValTot)

Return .T.

Observe a imagem em anexo, caso aquela movimentação possuir a origem como A - Automático, o usuário só vai poder alterar o campo Obs. Movime. (ZKB_OBSERV). Demais campos o mesmo não vai poder alterar.

Consegui efetuar um controle de forma que o mesmo não consiga alterar nenhum campo caso a origem seja A, mas preciso também criar uma validação de forma que o sistema não critique caso a mudança seja feita no campo Obs. Movime.

Caso a movimentação possuir a origem for M - Manual, o usuário tem liberdade de alterar qualquer campo que desejar na grid.

Alguém saberia uma forma de como posso estar efetuando essa validação?

Agradeço desde já pela atenção.

compartilhar
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do DevForum TOTVS!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags mvc advpl protheus ou faça a sua própria pergunta.