Versão atual:

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.

Versão (1):

Ver a versão formatada

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

Comentário

new question