Gatilho entre cabeçalho e grid Protheus MVC

Boa tarde! Gostaria de saber como criar um gatilho entre o cabeçalho e uma grid.

EX: quando eu preencher um campo ZJ_PMEMBA - Peso Emb02 que fica no cabeçalho. Preencher automaticamente o campo ZK_PEMBV - Emb.Vazia que fica na grid.

segue anexo!

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Boa tarde!

Usei em uma rotina minha o inverso, colocando dados na grid e refletindo no cabeçalho. Mas acredito que com algumas modificações serviria para você. Segue exemplo:

Chamei a static fLinOk na validação do Grid.


oModel:AddGrid('ModelGrid','ModelHead',oStruGrid,,{|oGrid| fLinOK(oGrid)},/*bPreGrid*/,/*bProsGrid*/)

Em seguida percorri a grid buscando o valor bruto e de ICMS preenchido nos itens e atualizei os campos do cabeçalho com elas.


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

    For nX := 1 To oGrid:GetQtdLine()

        oGrid:GoLine(nX)

        If(!oGrid:IsDeleted())

            nValTot += oGrid:GetValue('ZD1_VLRTOT')
            nValIcm += oGrid:GetValue('ZD1_VLRICM')

        Endif

    Next

    oModel:SetValue('ModelHead','ZF1_VLRTOT',nValTot)
    oModel:SetValue('ModelHead','ZF1_VLRICM',nValIcm)

Return .T.

Espero ter ajudado.

Giordano, obrigado pelo auxilio.

Fiz as seguintes modificações, porém esta gerando o erro em anexo!

oModel:AddFields('SZJMASTER','SZKDETAIL',oStPai,,{|oMAST| fLinOK(oMAST)},/bPreGrid/,/bProsGrid/)

Static Function fLinOK(oMAST)

Local nX

Local nValTot := 0

//Local nValIcm := 0

Local oModel := FwModelActive()

For nX := 1 To oMAST:GetQtd()

oMAST:Go(nX)

If(!oMAST:IsDeleted())

nValTot += oMAST:GetValue('ZJ_PBM2')

// nValIcm += MASTER:GetValue('ZD1_VLRICM')

Endif

Next

oModel:SetValue('SZKDETAIL','ZK_PEMBV',nValTot)

// oModel:SetValue('ModelHead','ZF1_VLRICM',nValIcm)

Return .T.

Bom dia Antônio, Tu pode utilizar o FwStruTrigger() para criar um gatilho do campo de origem que irá chamar uma função e fazer a validação que tu precisa. Segue abaixo um pedaço das funções que já usei.

Static Function ModelDef() Local oModel, aAux Local oStrZB5 := FWFormStruct(1,'ZB5') Local oStrZB6 := FWFormStruct(1,'ZB6')

// Adiciona nos campos abaixo, a chamada da rotina para atualizar os dados nos grids. aAux := FwStruTrigger("ZB5_TMPMAN","ZB5_TMPMAN","U_SERecaGr()",.F. ,"" ,0 ,"" ,NIL , "ITR01" ) oStrZB5:AddTrigger( aAux[1], aAux[2], aAux[3], aAux[4] ) Return

Aqui tem a declaração da User Function

User Function SERecaGr() Local oGrid, oViewAtivo, nTotLin, nLine, nTotFDGM, oModel oModel := FWModelActive() nTotFDGM := 0 oGrid := oModel:GetModel("ZB6DETAIL") nTotLin := oGrid:Length( .F. )// Retorna o total de linhas incluindo as deletadas. oViewAtivo := FWViewActive() For nLine := 1 To nTotLin // Força o posicionamento na linha do grid oGrid:SetLine( nLine ) // Faz o cálculo apenas para as linhas não deletadas If ! oGrid:IsDeleted( nLine )

// Chama a rotina que vai atualizar os campos da linha do grid nTotFDGM += AtuaLinha( oGrid, nLine, oGrid:GetValue( "ZB6_DOSE", nLine ) )

EndIf

Next // Força o posicionamento na primeira linha do grid oGrid:SetLine( 1 ) FwFldPut( 'ZB5_TOTFDG', nTotFDGM )

// Atualiza a tela inteira oViewAtivo:Refresh() Return( "" )