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!
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!
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( "" )