Tenho uma rotina MVC que possui cabeçalho e um grid de itens. A partir de ações realizadas no grid, eu realizo à atualização de alguns campos de outros itens do grid, no entanto, estas informações atualizadas não são apresentadas no grid, isto somente ocorre quando edito algum campo do item\linha em questão.
Tentei utilizar o método REFRESH() da view, o qual resolve à situação, no entanto, quando executo este método o grid é posicionado no item que estou manipulando, ou seja, caso o grid tenha 10 itens e estou no item 7, ao executar o método de atualização da view, o item 7 passa a ser o primeiro item apresentado, sendo seguido pelos outros 2 itens restantes (de um total de 10 itens).
Tem como dar um refresh em um item da grid ou apenas na grid de modo que não ocorra o comportamento descrito acima?
Boa tarde Marcelo, na verdade tu deverá percorrer as linhas do Grid para atualizar os registros, segue um exemplo:
oModel := FWModelActive()
oModelGrid := oModel:GetModel( "ZB6DETAIL" )
*// Retorna o total de linhas, incluindo as deletadas.*
nTotLin := oModelGrid:Length( .F. )
For nLin := 1 To nTotLin
oModelGrid:SetLine( nLin )
If !oModelGrid:IsDeleted( nLin )
oModelGrid:SetValue( "ZB6_HORAMI", cHora )
EndIf
Next
EndIf
*// Força o posicionamento na primeira linha do grid*
oModelGrid:SetLine( 1 )
*// Atualiza toda a tela*
oViewAtivo:Refresh()
O método Refresh() não precisa ser simultâneo à alteração dos valores, assim sendo, você pode fazer todas as alterações necessárias e depois efetuar o refresh quando estiver posicionado na linha inicial, para isso, pegue o estado das linhas atuais com a função FwSaveRows() (passando o submodelo) e restaure com FwRestRows().
Com isso, visualmente as linhas não sofreram alteração de posicionamento.
Guilherme, estou com esse mesmo problema no grid MVC. Tentei fazer da forma que você disse mas sempre que oView:Refresh() é executado, a linha atual vai para a 1a posição do grid. FwRestRows(aSaveRows) parece não ter nenhum efeito nisso.
como acesso o nome da view_da_grid para executar o refresh?
segue parte do meu código:
// carrega o model para a tela produto e fornecedor
oModPrdFor := FWLoadModel("ProdFornec")
oModPrdFor:SetOperation(4) //alteracao pq os dados serao preenchidos automaticamente
oModPrdFor:Activate()
//carrega o browse prodfornec com os dados do xml
oModelGrid:= oModPrdFor:getModel("SA5DETAIL")
//loop para preencher o grid
//Setando a linha atual
oModelGrid:AddLine()
//nLin := Len(oModelGrid:aCols)
oModPrdFor:SetValue("SA5DETAIL", 'A5_CODPRF', xProduto) //cod produto fornecedor
oModPrdFor:SetValue("SA5DETAIL", 'A5_NOMPROD', oDet[nX]:_Prod:_xProd:TEXT)
oModPrdFor:SetValue("SA5DETAIL", 'A5_SITU', "C")
oModPrdFor:SetValue("SA5DETAIL", 'A5_TEMPLIM', 1)
oModPrdFor:SetValue("SA5DETAIL", 'A5_FABREV', "F")
depois preciso executar o refresh antes de chamar o
nRet := FWExecView( "Produto Fornecedor" , "ProdFornec", 4, /*oDlg*/, {|| .T. } ,/*bOk*/ , /*nPercReducao*/,;
/*aEnableButtons*/, /*bCancel*/ , /*cOperatId*/, /*cToolBar*/, oModPrdFor )
Efetuei vários testes com as sugestões acima, com FwSaveRows e FWRestRows mas nada resolveu. A linha em que está posicionado com o cursor sempre sobe para a 1a linha exibida, causando uma movimentação incômoda para quem está digitando. O comportamento é o mesmo na 12.1.17 e 12.1.25. Não consegui resolver.
Efetuei vários testes com as sugestões acima, com FwSaveRows e FWRestRows mas nada resolveu. A linha em que está posicionado com o cursor sempre sobe para a 1a linha exibida, causando uma movimentação incômoda para quem está digitando. O comportamento é o mesmo na 12.1.17 e 12.1.25. Não consegui resolver
Eu tenho uma função que valida o preenchimento de alguns campos e se estiver posicionado na primeira linha, pergunta se o usuário deseja preencher o campo ZA4_INSPE com o mesmo valor nas demais linhas e funciona perfeitamente, no final posicione na primeira linha com o oModel:GoLine(1).
Eu uso essa função na validação da linha, mas acho que consegue usar sem problema com o AddUserButton
Static Function COMP021LPOS( oModel )
Local nOperation := oModel:GetOperation()
Local oView := FWViewActive() //Objeto da View, adicionado para dar refresh após adicioar uma nova linha
Local lRet := .T.
Local nI := 0
Local nQtdLinhas := oModel:GetQtdLine()
Local nLinha := oModel:nLine
Local cInspetor := ""
If nOperation == 3 .or. nOperation == 4
oModel:GoLine(nLinha)
If !(oModel:IsDeleted())
IF(EMPTY(oModel:GetValue('ZA4_PROD')))
Help(,,'Informe codigo do Produto',,'Codigo do produto é obrigatório',1,0,,,,,,{'Consulte o produto via F3 ou atualize os dados digitando o numero da NF no cabeçalho'})
lRet := .F.
ElseIF(EMPTY(oModel:GetValue('ZA4_PRODES')))
Help(,,'Informe a Descrição do Produto',,'Descrição do Produto é obrigatório',1,0,,,,,,{'Consulte o produto via F3 ou atualize os dados digitando o numero da NF no cabeçalho'})
lRet := .F.
//Se estiver na primeira linha, verifica se deseja repicar os dados do inspetor a demais linhas
ElseIF(!EMPTY(oModel:GetValue('ZA4_INSPE')) .and. nLinha == 1)
cInspetor := oModel:GetValue('ZA4_INSPE')
IF MsgYesNo('Deseja replicar o Inspetor para todos os itens?')
For nI := 2 To nQtdLinhas //percorendo grid
oModel:GoLine(nI)
oModel:SetValue('ZA4_INSPE', cInspetor)
NEXT
oModel:GoLine(1)
EndIF
EndIF
EndIF
EndIF
oView:Refresh('VIEW_ZA4')
Return lRet
Tive um problema semelhante em uma Função de validação criada para orçamento MATA415. Para esta rotina, foi criada uma validação que conta os itens e, dessa forma, mostra o número total de itens que estão no GRID. No início, o comportamento era muito parecido com sua descrição. Mas com tanta pesquisa consegui resolvê-lo com as seguintes linhas de código ao final da Validação:
/* É feito um refresh no GRID para atualizar os valores */
GETDREFRESH()
SetFocus(oGetDad:oBrowse:hWnd) /* Atualizacao por linha */
oGetDad:Refresh()
A415LinOk(oGetDad)
Desta forma o comportamento é normal, parecido com o Pedido de Vendas.