Grid - Carregamento Lento

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
FFreire
Usuário Nível 3
Usuário Nível 3
Mensagens: 113
Registrado em: 19 Mai 2013 16:16
Localização: Andirá-PR / Itaporanga-SP

Grid - Carregamento Lento

Mensagem 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
Harbour 3.2.0+MiniGui Extended 16.02+BCC5 / HWGdebug / SIXCDX / PostgreSQL 9.5 / LetoDB 2.15 / Java8
fabiano@ffsoft.com.br
Avatar do usuário
FFreire
Usuário Nível 3
Usuário Nível 3
Mensagens: 113
Registrado em: 19 Mai 2013 16:16
Localização: Andirá-PR / Itaporanga-SP

Grid - Carregamento Lento

Mensagem 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...
Harbour 3.2.0+MiniGui Extended 16.02+BCC5 / HWGdebug / SIXCDX / PostgreSQL 9.5 / LetoDB 2.15 / Java8
fabiano@ffsoft.com.br
Avatar do usuário
JAIR RANGEL
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 19 Jul 2005 16:01
Localização: RIO DE JANEIRO
Contato:

Grid - Carregamento Lento

Mensagem 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
MINIGUI + HARBOUR + BRMAKE + CDX
CLIPPER 5.2E + VISUALLIB 2 + BLINKER
Avatar do usuário
JAIR RANGEL
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 19 Jul 2005 16:01
Localização: RIO DE JANEIRO
Contato:

Grid - Carregamento Lento

Mensagem 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
MINIGUI + HARBOUR + BRMAKE + CDX
CLIPPER 5.2E + VISUALLIB 2 + BLINKER
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Grid - Carregamento Lento

Mensagem 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.
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar do usuário
carlaoonline
Usuário Nível 3
Usuário Nível 3
Mensagens: 190
Registrado em: 24 Ago 2014 22:38
Localização: Porto Alegre-RS

Grid - Carregamento Lento

Mensagem 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.
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Grid - Carregamento Lento

Mensagem 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)
Avatar do usuário
carlaoonline
Usuário Nível 3
Usuário Nível 3
Mensagens: 190
Registrado em: 24 Ago 2014 22:38
Localização: Porto Alegre-RS

Grid - Carregamento Lento

Mensagem 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.
Avatar do usuário
carlaoonline
Usuário Nível 3
Usuário Nível 3
Mensagens: 190
Registrado em: 24 Ago 2014 22:38
Localização: Porto Alegre-RS

Grid - Carregamento Lento

Mensagem 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.
Responder