Bom dia Fabio, tudo bem?
Tive uma situação parecida porém na DA1, onde eu precisava mostrar a marca dos produtos, e a marca se repetia a primeira para todos os produtos, consegui resolver usando os P.E. em MVC, segue um exemplo:
PS: Lembrando que a user function deverá ter o mesmo nome da rotina padrão porém você deverá alterar o nome do arquivo, aqui costumo usar o nome da user function + _PE.PRW ficando assim TMKA260_PE.PRW. Para essa situação eu uso o P.E. que cria botão na enchoicebar (último ElseIf) nele voce consegue acessar os dados da grid alem de criar o botão, basta voce fazer uma função para percorrer o grid e obtiver o conteudo dos campos que precisa para assim realizar o posicione.
User Function OMSA010()
Local aArea := GetArea()
Local aParam := PARAMIXB
Local xRet := .T.
Local oObj := ''
Local cIdPonto := ''
Local cIdModel := ''
If aParam <> NIL
oObj := aParam[1]
cIdPonto := aParam[2]
cIdModel := aParam[3]
If cIdPonto == 'MODELPOS' // Na validação total do modelo.
xRet := .T.
ElseIf cIdPonto == 'MODELPRE' // Antes da alteração de qualquer campo do modelo.
xRet := .T.
ElseIf cIdPonto == 'FORMPRE' // Antes da alteração de qualquer campo do formulário.
xRet := .T.
ElseIf cIdPonto == 'FORMPOS' // Na validação total do formulário.
xRet := .T.
ElseIf cIdPonto == 'FORMLINEPRE' // Antes da alteração da linha do formulário FWFORMGRID.
xRet := .T.
ElseIf cIdPonto == 'FORMLINEPOS' // Na validação total da linha do formulário FWFORMGRID.
xRet := .T.
ElseIf cIdPonto == 'MODELCANCEL' // No cancelamento do botão.
xRet := .T.
ElseIf cIdPonto == 'FORMCOMMITTTSPRE' // Antes da gravação da tabela do formulário.
xRet := .T.
ElseIf cIdPonto == 'FORMCOMMITTTSPOS' // Após a gravação da tabela do formulário.
xRet := .T.
ElseIf cIdPonto == 'MODELCOMMITTTS' // Após a gravação total do modelo e dentro da transação.
xRet := .T.
ElseIf cIdPonto == 'MODELCOMMITNTTS' // Após a gravação total do modelo e fora da transação.
xRet := .T.
ElseIf cIdPonto == 'BUTTONBAR' // Acessar os dados do Grid em Rotinas MVC e criar botão na enchoicebar
xRet := .T.
oView := FWViewActive()
oModel := FWModelActive()
oMdlDA1 := oModel:GetModel('DA1DETAIL')
nOperacao := oModel:nOperation
U_MARCADA1(oMdlDA1)
EndIF
EndIF
RestArea(aArea)
Return(xRet)
User Function MARCADA1()
Local cMarca := ''
Local cAlias
Local cProd
Local nFor := 1
Local lGrade := .F.
Local cSql := ''
Local cDesc := ''
Local cTab := ""
Default oMdlDA1 := NIL
If type("oMdlDA1") == "U"
oView := FWViewActive()
oModel := FWModelActive()
oMdlDA1 := oModel:GetModel('DA1DETAIL')
nOperacao := oModel:nOperation
ENDIF
ProcRegua(oMdlDA1:GetQtdLine())
For nFor := 1 To oMdlDA1:Length()
oMdlDA1:GoLine(nFor)
cProd := oMdlDA1:GetValue("DA1_CODPRO")
IncProc("Carregando tabela de preço, produto: " + cProd)
cAlias := GetNextAlias()
BeginSQL alias cAlias
SELECT
B1_XDESCM MARCA
FROM %Table:SB1%
WHERE B1_COD = %Exp:cProd%
EndSQL
IF !(cAlias)->(EOF())
cMarca := (cAlias)->MARCA
EndIf
IF Select(cAlias)> 0
(cAlias)->(dbCloseArea())
EndIF
oMdlDA1:LoadValue("DA1_XMARCA", cMarca)
Next
oMdlDA1:Goline(1)
oView:Refresh()
Return()