Página 1 de 1

Grid - Carregamento Lento

Enviado: 06 Fev 2015 08:29
por FFreire
Prezados...

Estou usando a GRID do minigui extend e lendo dados do postgres...até ai, blz...mas me deparei com uma extrema lentidão...quando faço a QUERY ao postgres, o retorno é praticamente instantâneo, agora, quando entro em um laço para adicionar os registros ao GRID...é o caos...e olha que testei com 500 registros...tenho clientes que tem base de clientes, na ordem de 60 mil registros...talvez esteja fazendo de uma forma errado...por isso...peço o socorro de todos que puderam colaborar...vou postar os fontes...para poderem avaliar...

Aqui...é a montagem da grid no form...toda vez que inicia o form....em ON INIT chamo a função CRGCLI()

Código: Selecionar todos

      DEFINE GRID ogCli
         ROW 10
         COL 10
         WIDTH 1084
         HEIGHT 489
         HEADERS {"Código", "Cliente", "Cidade", "UF", "Expira em"}
         WIDTHS {150,442,318,55,98}
         HEADERIMAGE { IM__ORDUP, IM__ORDDN }
         CELLNAVIGATION .T.
         DYNAMICBACKCOLOR { _gridCor, _gridCor, _gridCor, _gridCor, _gridCor }
         ONHEADCLICK { { || CrgCli('Codigo') }, { || CrgCli('Nome')   }, { || CrgCli('Cidade') }, { || CrgCli('UF')     }, { || CrgCli('Validade') } }
      END GRID
Aqui... a função que carrega os dados e transfere para a grid...

Código: Selecionar todos

//----------------------------
STATIC FUNCTION CrgCli(zordem)
//----------------------------

LOCAL nCnt, oRow, zAscDesc
LOCAL oQuery, cQuery

zAscDesc := MntCtrlOrdem(zordem,@zCtrlOrd)

Clientes.ogCli.HeaderImage(1) := IIF(zordem='Codigo'  ,IIF(zAscDesc='ASC',1,2),0)
Clientes.ogCli.HeaderImage(2) := IIF(zordem='Nome'    ,IIF(zAscDesc='ASC',1,2),0)
Clientes.ogCli.HeaderImage(3) := IIF(zordem='Cidade'  ,IIF(zAscDesc='ASC',1,2),0)
Clientes.ogCli.HeaderImage(4) := IIF(zordem='UF'      ,IIF(zAscDesc='ASC',1,2),0)
Clientes.ogCli.HeaderImage(5) := IIF(zordem='Validade',IIF(zAscDesc='ASC',1,2),0)

cQuery := "SELECT Codigo, Nome, Cidade, UF, Validade FROM Licenciamento ORDER BY "+zordem+" "+zAscDesc
IF EXQuery(cQuery,@oQuery)
   Clientes.ogCli.DeleteAllItems
   aCli := {}
   IF oQuery:Lastrec() > 0
      Clientes.ogCli.DisableUpdate
      FOR nCnt  = 1 TO oQuery:Lastrec()
         oRow := oQuery:GetRow(nCnt)
         Clientes.ogCli.AddItem( { oRow:FieldGet(1), oRow:FieldGet(2), oRow:FieldGet(3), oRow:FieldGet(4), DTOC(oRow:FieldGet(5)) } )
         AADD(aCli, { oRow:FieldGet(1), oRow:FieldGet(2), oRow:FieldGet(3), oRow:FieldGet(4), DTOC(oRow:FieldGet(5)) } )
      NEXT
      Clientes.ogCli.EnableUpdate
   END
END
oQuery:Destroy()

RETURN(NIL)
Quando clico no cabeçario de cada coluna, é executado novamente a CRGCLI, que coloca em ordem da coluna, ascendente ou descendente...

Tenho também um textbox, que conforme digito, ele filtra....que com pouco registros...é maravilhoso....mas acima de um determinado numero...meu DEUS...agora isso...usando matriz....fico imaginando...se tivesse usando DBF com laço WHILE....

o textobox do filtro...

Código: Selecionar todos

      DEFINE LABEL LbBusca
         ROW 518
         COL 10
         WIDTH 58
         HEIGHT 20
         VALUE "Localizar:"
         FONTBOLD .T.
         TRANSPARENT .T.
         VCENTERALIGN .T.
      END LABEL

      DEFINE TEXTBOX eBusca
         ROW 518
         COL 73
         WIDTH 200
         HEIGHT 20
         VCENTERALIGN .T.
         ONCHANGE BuscaGrid('Clientes','ogCli',2,aCli)
      END TEXTBOX
e a função da busca...

Código: Selecionar todos

//-------------------------------------------------
FUNCTION BuscaGrid(zform,zgrid,zbuscapad,zmatdados)
//-------------------------------------------------

// Definir TEXTBOX eBusca, onde estiver a GRID

// Parametros
// zform = nome do form
// zgrid = nome da grid
// zbuscapad = numero da coluna a ser pesquisada
// zmatdados = matriz com os dados que estão sendo exibidos

LOCAL cTxt, nLen, nCnt
LOCAL nCntItens

// Se não houver seleção de coluna, define a zbuscapad, como padrão
nCol := GetProperty( zform, zgrid, 'Value' )
nCol := IIF( nCol[2] = 0, zbuscapad, nCol[2] )

IF nCol > 0
   nCntItens := GetProperty( zform, zgrid, 'Itemcount' )
   IF nCntItens > 0 .OR. LEN(zmatdados) > 0

      // Armazena o que foi digitado
      cTxt := GetProperty( zform, 'eBusca' , 'Value' )
      nLen := LEN( cTxt )

      // Elimina dados da GRID
      DOMethod( zform, zgrid, 'DeleteAllItems' )

      // Desabilita exibição da GRID
      DOMethod( zform, zgrid, 'DisableUpdate' )

      FOR nCnt := 1 To Len( zmatdados )
      // Verifica se o que foi digitado, e armazena na grid qual elemento contem
         IF UPPER( cTxt ) $ UPPER( zmatdados[ nCnt, nCol ] ) .OR. EMPTY(cTxt)
            // Armazena na GRID
            DOMethod( zform, zgrid, 'AddItem', zmatdados[ nCnt ] )
         END
      NEXT

      // Posiciona na GRID
      SetProperty( zform, zgrid, 'Value', {1,nCol} )

      // Habilita exibição da GRID
      DOMethod( zform, zgrid, 'EnableUpdate' )

   END
ELSEIF !EMPTY(cTxt)
   MsgMenu('Selecione a coluna a ser pesquisada !!!',{'OK'},,IM__ERRO,'ERRO',,,'32 ERR CAN',,,_branco_)
END

RETURN(NIL)
Enfim....como sempre, agradeço, de antemão...

F.Freire

Grid - Carregamento Lento

Enviado: 06 Fev 2015 21:39
por FFreire
Respondendo a mim mesmo...o problema é o DYNAMICBACKCOLOR { _gridCor, _gridCor, _gridCor, _gridCor, _gridCor }, que _gridCor é:

_gridCor := { |val, CellRowIndex| IIF( CellRowIndex/2 == INT(CellRowIndex/2) , { 250,250,210 } , { 255,255,255 } ) }

Portanto a cada coluna/registro um codeblock....tornando assim o carregamento lento ! Vou testar com mais registros....dai informo, o que aconteceu...

Grid - Carregamento Lento

Enviado: 11 Fev 2015 18:32
por JAIR RANGEL
Olá, Freire!

Estou com o mesmo problema quando uso uma Grid e configuro o DynamicBackColor.
Ele funciona, mas fica lento.
Tentei usar com um DBF no Browse... ficou lento demais. Até abri um posto sobre o assunto.

Abraço,

Jair Rangel

Grid - Carregamento Lento

Enviado: 12 Mar 2015 11:22
por JAIR RANGEL
Olá, pessoal!

O DynamicBackColor deixa o Browse e o Grid lentos (HMG_3.3.0) "extremamente lentos".
Alguém tem alguma sugestão de como melhorar isso?

Queria compilar todo o sistema com esta versão, mas com essa lentidão tá pegando.

Abraço a todos,

JAIR RANGEL

Grid - Carregamento Lento

Enviado: 12 Mar 2015 13:44
por Claudio Soto
JAIR RANGEL escreveu:Olá, pessoal!

O DynamicBackColor deixa o Browse e o Grid lentos (HMG_3.3.0) "extremamente lentos".
Alguém tem alguma sugestão de como melhorar isso?

Queria compilar todo o sistema com esta versão, mas com essa lentidão tá pegando.

Abraço a todos,

JAIR RANGEL
HMG.3.4.0 http://www.hmgforum.com/viewtopic.php?f ... 176#p39407 posee un Grid mas rápido.

Explicación sobre velocidad el control Grid:
http://www.hmgforum.com/viewtopic.php?f ... =20#p39441

PS: HMG.3.4.0 apareció por error como "test version" pero es muy estable.

Grid - Carregamento Lento

Enviado: 30 Jun 2022 11:08
por carlaoonline
Bom dia!


SEMPRE TEM UMA COISA PRA RESOLVER....

Enquanto uns já passaram por isso, eu tô recém chegando.....

Agora tô na "Lentidão do preenchimento da Grid" ao utilizar DYNAMICBACKCOLOR...

...muito legal, mas com 5.000 linhas e 9 colunas não rolou... de tanto que demora chega a travar o sistema...

Primeiramente até uns 500 ítens demorava mas abria a grid...

Demorei uma cara eliminando diversas coisas na criação da lista de itens pelo banco de dados (achando que era ali o problema, pois com uns 500 registros funcionava, depois travava), achei que era um registro com algum caractere estranho, uma registro truncando o arquivo.... ou sei lá....

depois eliminei a formatação da grid e por fim o DYNAMICBACKCOLOR, daí vingou....


Aqui, entre outros posts, tb sem solução....
https://pctoledo.org/forum/viewto ... 94#p127168

Alguém sabe de uma solução para usar cores dinâmicas sem essa lentidão no MiniGui ?

Grato.

Grid - Carregamento Lento

Enviado: 03 Jul 2022 12:27
por ivanil
Você pode adaptar o exemplo abaixo para seu uso, as pesquisas são instantâneas; apenas invertendo e criando uma saída rápida do range, mas o ideal é que o filtro seja efetuado na consulta.

Percebi um bug no objeto quando é iniciado vazio, passei para o Grigory, mas a forma abaixo é muito rápida; 100 itens já um número grande para ser navegado, mas pode ser personalizado a seu gosto.

Código: Selecionar todos

include "minigui.ch"

Function Main

    Local aRows [20] [3], bColor1, bColor2
    Local i,k,j:=0
    
    aRows [1]	:= {'Simpson','Homer','555-5555'}
    aRows [2]	:= {'Mulder','Fox','324-6432'} 
    aRows [3]	:= {'Smart','Max','432-5892'} 
    aRows [4]	:= {'Grillo','Pepe','894-2332'} 
    aRows [5]	:= {'Kirk','James','346-9873'} 
    aRows [6]	:= {'Barriga','Carlos','394-9654'} 
    aRows [7]	:= {'Flanders','Ned','435-3211'} 
    aRows [8]	:= {'Smith','John','123-1234'} 
    aRows [9]	:= {'Pedemonti','Flavio','000-0000'} 
    aRows [10]	:= {'Gomez','Juan','583-4832'} 
    aRows [11]	:= {'Fernandez','Raul','321-4332'} 
    aRows [12]	:= {'Borges','Javier','326-9430'} 
    aRows [13]	:= {'Alvarez','Alberto','543-7898'} 
    aRows [14]	:= {'Gonzalez','Ambo','437-8473'} 
    aRows [15]	:= {'Batistuta','Gol','485-2843'} 
    aRows [16]	:= {'Vinazzi','Amigo','394-5983'} 
    aRows [17]	:= {'Pedemonti','Flavio','534-7984'} 
    aRows [18]	:= {'Samarbide','Armando','854-7873'} 
    aRows [19]	:= {'Pradon','Alejandra','???-????'} 
    aRows [20]	:= {'Reyes','Monica','432-5836'} 

    use
    DbCreate("test.dbf",{{"cod","c",5,0},{"nome","c",30,0},{"sobrenome","c",30,0},{"fone","c",10,0}})
    use test
    for i=1 to 999
        for k=1 to 20
            j++
            test->(dbappend())
            test->cod       := strzero(j,5)
            Test->nome      := aRows[k,1]
            test->sobrenome := aRows[k,2]
            test->fone      := aRows[k,3]
        next
    Next
    
    aRows:={}
    test->(DbGotop())
    While !Test->(eof())
        AADD(aRows,{test->cod,test->nome,test->sobrenome,test->fone})
        test->(DbSkip())
    enddo

    DEFINE WINDOW Form_1 ;
        AT 0,0 ;
        WIDTH 640 ;
        HEIGHT 450 ;
        TITLE 'Grid Demo based upon a contribution by Mitja Podgornik <yamamoto@rocketmail.com>' ;
        MAIN 


        bColor1 := {|x,nItem| if( nItem/2 == int(nItem/2), RGB(255,255,255), RGB(128,255,255) )}
        bColor2 := {|x,nItem| if( nItem/2 == int(nItem/2), RGB(0,0,255), RGB(0,0,128) )}

        @ 10,10 GRID Grid_1 ;
            WIDTH 620 ;
            HEIGHT 330 ;
            HEADERS {'cod','Last Name','First Name','Phone'} ;
            WIDTHS {40,100,100,70};
            VALUE 1 ;
            TOOLTIP 'Editable Grid Control' ;
            EDIT ;
            JUSTIFY {0, BROWSE_JTFY_LEFT,BROWSE_JTFY_RIGHT, BROWSE_JTFY_RIGHT } ;
            DYNAMICFORECOLOR {bColor1, bColor1, bColor1, bColor1 } ;
            DYNAMICBACKCOLOR {bColor2, bColor2, bColor2, bColor2 }



          Form_1.Grid_1.Cargo := aRows
     
          DEFINE TEXTBOX eBusca
             ROW 350
             COL 10
             WIDTH 200
             HEIGHT 20
             VCENTERALIGN .T.
             ONCHANGE AtualizaGrid()
          END TEXTBOX
          AtualizaGrid()

    END WINDOW

    CENTER WINDOW Form_1

    ACTIVATE WINDOW Form_1

Return Nil


//-------------------------------------------------
FUNCTION AtualizaGrid()
    Local aItem,block,n,nMax:=0
    Local cbusca:=Upper(form_1.ebusca.value)
    form_1.grid_1.DeleteAllItems()
    form_1.grid_1.DisableUpdate()
    for each aItem in form_1.grid_1.cargo
        *if at(cBusca,Upper(aItem[2])) >0 
        if at(cBusca,Upper(aItem[2])) >0 .OR. empty(cBusca)
            nMax++
            form_1.grid_1.addItem(aItem)
        endi
        if nMax>=100
            exit
        endif
    Next
    form_1.grid_1.EnableUpdate()
    RETURN(NIL)

Grid - Carregamento Lento

Enviado: 04 Jul 2022 15:05
por carlaoonline
Tchê, valeu pela luz.

A partir do seu exemplo eu percebi que o problema não era exatamente com o Dynamic/Color e sim quando eu usava 'em conjunto' com o COLUMNCONTROLS ou o INPLACEEDIT, então usando cores dinâmicas com um desses outros dois recursos....pode esquecer.... passou de 500 registros já parece que o PC travou ... e deixando apenas em 100 ou 200 não resolve o problema, preciso de todos registros que satisfaçam as condições no Grid.


No seu exemplo, se tirar as linha 108 a 110 ( if nMax>=100...) , mesmo em um Core 2 Duo mais antigo, demora uns 2 segundos para preencher o Grid com os 20.000 com Dynamic Color, o que está aceitável (considerando 20.000 registros).

Então mantive o Dynamic Color e troquei o COLUMNCONTROLS por COLUMNSORT, pois eu só usava o COLUMNCONTROLS para que o SORT do grid ordenasse corretamente ao clicar no Head de uma coluna com campo data (o que não estava ocorrendo se não usasse COLUMNCONTROLS). Acabei de sair do modo console e Ainda estou me adaptando.


Seria bom se o Grid aplicasse as configurações apenas nos dados visíveis, seria muito mais rápido o carregamento quando com formatações complexas, pois varreria apenas as linha e colunas na tela ao invés do 20.000 registros ou mais da matriz... a atualização das formatações seria atualizada cada vez que entrasse no campo de visão novos dados.

Grid - Carregamento Lento

Enviado: 04 Jul 2022 16:30
por carlaoonline
...fiquei na mesma....


Se NAO usar o COLUMNCONTROL com a formatação {'DATEPICKER','DROPDOWN'} para a coluna com campo data, o SORT do Grid ordena a coluna como texto ao invés de data e dessa forma a ordem não obedece a realidade, pois "23/01/2020" fica sendo maior que "01/01/2030"


Então ou opto por cores ou por opto ordenar colunas...os dois juntos neca pau, pelo menos na forma simples de usar o comando Grid.