Clipper On Line • Ver Tópico - Grid - Carregamento Lento

Grid - Carregamento Lento

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Grid - Carregamento Lento

Mensagempor FFreire » 06 Fev 2015 07:29

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

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

//----------------------------
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...

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

//-------------------------------------------------
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 de usuário

FFreire
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 113
Data de registro: 19 Mai 2013 16:16
Cidade/Estado: Andirá-PR / Itaporanga-SP
Curtiu: 0 vez
Mens.Curtidas: 5 vezes

Grid - Carregamento Lento

Mensagempor FFreire » 06 Fev 2015 20:39

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 de usuário

FFreire
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 113
Data de registro: 19 Mai 2013 16:16
Cidade/Estado: Andirá-PR / Itaporanga-SP
Curtiu: 0 vez
Mens.Curtidas: 5 vezes

Grid - Carregamento Lento

Mensagempor JAIR RANGEL » 11 Fev 2015 17:32

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 de usuário

JAIR RANGEL
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 177
Data de registro: 19 Jul 2005 16:01
Cidade/Estado: RIO DE JANEIRO
Curtiu: 1 vez
Mens.Curtidas: 2 vezes

Grid - Carregamento Lento

Mensagempor JAIR RANGEL » 12 Mar 2015 11:22

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
Avatar de usuário

JAIR RANGEL
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 177
Data de registro: 19 Jul 2005 16:01
Cidade/Estado: RIO DE JANEIRO
Curtiu: 1 vez
Mens.Curtidas: 2 vezes

Grid - Carregamento Lento

Mensagempor Claudio Soto » 12 Mar 2015 13:44

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=43&t=4176#p39407 posee un Grid mas rápido.

Explicación sobre velocidad el control Grid:
http://www.hmgforum.com/viewtopic.php?f=43&t=4176&start=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 de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 555
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 35 vezes
Mens.Curtidas: 166 vezes

Grid - Carregamento Lento

Mensagempor carlaoonline » 30 Jun 2022 11:08

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....
http://www.pctoledo.com.br/forum/viewtopic.php?f=45&t=19594#p127168

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

Grato.
Avatar de usuário

carlaoonline
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 190
Data de registro: 24 Ago 2014 22:38
Cidade/Estado: Porto Alegre-RS
Curtiu: 73 vezes
Mens.Curtidas: 22 vezes

Grid - Carregamento Lento

Mensagempor ivanil » 03 Jul 2022 12:27

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.

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)
ivanil
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 119
Data de registro: 11 Set 2004 15:13
Cidade/Estado: Florianópolis/SC
Curtiu: 1 vez
Mens.Curtidas: 12 vezes

Grid - Carregamento Lento

Mensagempor carlaoonline » 04 Jul 2022 15:05

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 de usuário

carlaoonline
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 190
Data de registro: 24 Ago 2014 22:38
Cidade/Estado: Porto Alegre-RS
Curtiu: 73 vezes
Mens.Curtidas: 22 vezes

Grid - Carregamento Lento

Mensagempor carlaoonline » 04 Jul 2022 16:30

...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.
Avatar de usuário

carlaoonline
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 190
Data de registro: 24 Ago 2014 22:38
Cidade/Estado: Porto Alegre-RS
Curtiu: 73 vezes
Mens.Curtidas: 22 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 5 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro