Browse Filter - Array Filter

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Browse Filter - Array Filter

Mensagem por gilbertosilverio »

Ola Amigos,

Uso o exemplo de HWGUI browsefilter, para mover duas bases de dados.

Código: Selecionar todos


       @ 13,070 BROWSE oBrw1 DATABASE SIZE 1160,310 STYLE WS_TABSTOP     ;
                ON POSCHANGE {|| EVAL(oBrw2:bFirst), ESTOQUE_onPosChange(), oBrw2:Refresh(), oDlg_Busca:Refresh() }

       oBrw1:nHeadHeight := 25
       oBrw1:alias       := 'xESTOQUE'
       oBrw1:nColumns    := 14
       oBrw1:freeze      := 1
       oBrw1:lDispHead   := .T.
       oBrw1:lSep3d      := .T.
       oBrw1:lAdjRight   := .F.
.....
.....
       SELECT (oBrw1:alias)
       @ 13,390 BROWSE oBrw2 DATABASE SIZE 960,200 STYLE WS_TABSTOP AUTOEDIT                      ;
                FIRST {|| XARDEX->( DBSEEK(xESTOQUE->(SUBSTR(DESCRICAO,1,49)), .F.) ) }           ;
                WHILE {|| XARDEX->(SUBSTR(DESCRICAO,1,49)) == xESTOQUE->(SUBSTR(DESCRICAO,1,49))} ;
                ON UPDATE {|| kardex_onPosChange() }

       oBrw2:nHeadHeight := 24
       oBrw2:alias       := 'xARDEX'
       oBrw2:nColumns    := 4
       Obrw2:freeze      := 1

       SELECT (oBrw2:alias)

Alguém já usou e tem um exemplo da manipulação de dois arrays, isso e possível?

Hoje monto dois arquivo dbfs temporario, mais dependendo do tamanho se torna lento, com arrays e bem mais rapido.

Alguma dica?

Grato
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Browse Filter - Array Filter

Mensagem por asimoes »

Sugestão para trabalhar com Grid Array

Código: Selecionar todos

     
     aVetorPai é o vetor populado a partir de sua tabela, onde axESTOQUE := { {"123", "ABC" }} valores da sua tabela DBF

     aVetorPai := {}
       
     DO WHILE ! EOF()
        aAdd( aVetorPai, {CAMPO1,CAMPO2}) CAMPO DO DBF
     ENDDO

     aVetorFilho := {}
     
     DO WHILE ! EOF()
        aAdd( aVetorFilho, {CAMPO1,CAMPO2}) CAMPO DO DBF
     ENDDO
              
     @ 13,070 BROWSE oBrw1 DATABASE SIZE 1160,310 STYLE WS_TABSTOP 

       oBrw1:nHeadHeight := 25
       oBrw1:aArray      := aVetorPai
       oBrw1:nColumns    := 14
       oBrw1:freeze      := 1
       oBrw1:lDispHead   := .T.
       oBrw1:lSep3d      := .T.
       oBrw1:lAdjRight   := .F.
       
       Carregar a GRID  a partir do dbf

       Não precisa atribuir na grid filho, quem fará isso é o change da primeira grid
              
.....
.....
       @ 13,390 BROWSE oBrw2 DATABASE SIZE 960,200 STYLE WS_TABSTOP AUTOEDIT 
   
       oBrw2:nHeadHeight := 24
       oBrw2:aArray      := {}
       oBrw2:nColumns    := 4
       Obrw2:freeze      := 1

       No change da primeira grid carregar a segunda grid

       nCurrent := oBrw1:nCurrent

       cDescricao := oBrw1:aArray[nCurrent,iPosicao] //iPosicao é a coluna onde está a descrição

       LOOP para popular a segunda grid a partir da primeira

       aGridFilho := {}

       FOR EACH oElemento IN aVetorFilho
          IF oElemento[iPosDescricao] = cDescricao //
             aAdd( aGridFilho, { oElemento[1], oElemento[2], oElemento[3], oElemento[4] } )
          ENDIF
      NEXT 
      
      oBrw2:aArray := aGridFilho 
      
      oBrw2:Refresh()

►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Browse Filter - Array Filter

Mensagem por gilbertosilverio »

Simões,

Obrigado, vou testar...
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Browse Filter - Array Filter

Mensagem por asimoes »

Código: Selecionar todos

Ou, no change da grid principal, fazer um seek na tabela que quer carregar os registros e popular a grid filha, tipo

No change da grid principal

aGridFilha := {}

nCurrent := gridprincipal:nCurrent

seek gridprincipal:aArray[nCurrent, coluna)

do while ! eof() .and. campox  = gridprincipal:aArray[nCurrent, coluna)
   aAdd( aGridFilha, {campo1, campo2}
   skip
enddo

GridFilha:aArray := aGridFilha
GridFilha:Refresh()

►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse Filter - Array Filter

Mensagem por JoséQuintas »

Console com ADO seria uma maravilha, talvez dê pra fazer igual em HWGUI.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

Browse Filter - Array Filter

Mensagem por MSDN »

Usando a API gráfica do Windows ( e de qualquer SO, Linux, Android, etc ) pode-se fazer qualquer coisa, já o contrário não é verdade !
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Browse Filter - Array Filter

Mensagem por Itamar M. Lins Jr. »

Ola!
Eu não uso esse recurso. Eu uso o tradicional mesmo.

Código: Selecionar todos

   browse...
   ON POSCHANGE {||UpGet(nKey,oBrwItens),oBrwNFe:SetFocus()}
...
Static Function UpGet(nKey,oBrwItens)
...
            sb->(OrdSetFocus(1))
            sb->(OrdScope(0,cNF+cModel))
            sb->(OrdScope(1,cNF+cModel))
...
Usando TCP com LetoDbf, não uso SMB(compartilhamento). É instantâneo a movimentação pelos campos. Arquivos de entradas com mais de 100 mil itens por exemplo.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Browse Filter - Array Filter

Mensagem por asimoes »

Eu recomendo o ADS da SYBASE, usa o dbf com sql, muito bom pra aprender SQL e pensar em migrar para um SGBD
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Browse Filter - Array Filter

Mensagem por Itamar M. Lins Jr. »

Ola!
Passa a receita de como usar o ADS. Quais são as restrições...
O LetoDbf, é só baixar os fontes no git, não tem DLL, nenhuma restrição. Provavelmente terá aporte do Pritpal Bedi, que deverá incluir sintaxe SQL... sem data específica pode demorar ou não, o Elch sumiu ele já pediu acesso ao GIT do LetoDbf mas o Elch não respondeu ainda.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Browse Filter - Array Filter

Mensagem por asimoes »

Itamar M. Lins Jr. escreveu:Ola!
Passa a receita de como usar o ADS. Quais são as restrições...
O LetoDbf, é só baixar os fontes no git, não tem DLL, nenhuma restrição. Provavelmente terá aporte do Pritpal Bedi, que deverá incluir sintaxe SQL... sem data específica pode demorar ou não, o Elch sumiu ele já pediu acesso ao GIT do LetoDbf mas o Elch não respondeu ainda.

Saudações,
Itamar M. Lins Jr.
Itamar,

Basicamente eu utilizo uma classe que eu fiz para acessar o banco, muito fácil de usar, já preparada para usar o MariaDb também.
O ADS até onde eu sei é free uso, não exige licença, o seu custo será converter toda sintaxe de dbf para chamadas sql.
Eu levei mais ou menos 30 dias convertendo a sintaxe de dbfpara sql, e 15 dias depois de estar 100% funcionando com o ADS para o MariaDb, o meu sistema está a 72h usando o MariaDB, até agora 0 erro.
Além disso o MAriaDb vem com o HeidiSQL pra brincar com o banco e sinceramente não volto mais para o DBF desde que seja temporário porque este recurso posso usar para relatórios ou não.

Tentei muito usar o LetoDb aconteceram umas coisas esquisitas de acesso, perda de acesso que me obrigou voltar para o DBFCDX, só que mês passado deixei a preguiça de lado e investi o meu tempo para usar o ADS, primeiro criando um programa para testar, vi que funcionava e gravava no DBF comecei a conversão do sistema, fui corrigindo as falhas, principalmente de sintaxe sql até ficar "redondo" o resto foi uma migração tranquila, até usilizando um programa que o Quintas criou para subir os dbf´s
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse Filter - Array Filter

Mensagem por JoséQuintas »

Itamar M. Lins Jr. escreveu:Passa a receita de como usar o ADS. Quais são as restrições...
No 7.0 o limite eram 20 estações, mas no atual podem ter reduzido, precisa confirmar.

No Harbour tem toda parte de usar ADS, mas precisar gerar LIB separada igual faz com libmysql e outras.
Acredito que fazendo isso, o uso fica igual DBF, mesmo se usar comandos SQL.

O ASimões usou ADO.

Outra opção, que você pode gostar: SQLMIX com ODBC, só precisa instalar o ODBC
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse Filter - Array Filter

Mensagem por JoséQuintas »

Só pra recapitular:

Eu usava ADS Local no VB6, e acessava simultâneo com o Clipper e SIXCDX.
NA ÉPOCA, o único problema usando junto é que o ADS trabalha com tudo aberto, então abrir exclusivo no Clipper deixava de ser opção.
Se tiver índice, e otimizar, ele era usado.
Se tiver índice não compatível, ele era desprezado.

Na época diziam que era mais rápido porque o acesso era em 32 bits, e o Clipper em 16 bits.
Mas pelo jeito não tem a ver, porque é muito mais rápido do que o Harbour, ou talvez, pro Harbour ficar compatível com Clipper continue lento igual o Clipper.

Já postaram, talvez aqui ou no harbour-users, que usando a LIB ADS no Harbour dá pra usar comandos SQL.
Vai ter que pesquisar sobre isso, ou perguntar no harbour-users

ADO não precisa de lib nenhuma, só o createobject, mas altera radical os fontes

SQLMIX não precisa de lib nenhuma, se usar a opção por ODBC, e SQLMIX você já conhece.

O ADO é uma exceção, mas os demais, poderia usar rotinas de APPEND/REPLACE pra gravar, e SQL somente pra leitura, desde que use DBF/CDX ou SIXCDX pra gravar.

Pra teste, pode alterar somente rotinas de consultas pra SQL, assim vai ter uma boa visão do resultado de velocidade, que é o que mais interessa.

Pode ser interessante verificar a LIB ADS no Harbour, e a SQLMIX com ODBC, e tentar trazer todos esses programadores que restam usando DBF para o mundo do SQL.

Por último:
A restrição de estações é proposital, porque por ser uma apresentação do ADS, eles deixaram numa quantidade "livre de erros" digamos assim.
Dizem que dá pra aumentar esse limite, conversando com a empresa do ADS. Talvez seja o mesmo esquema dos tempos do VB6.
Mas é lógico... não vai ser tão eficiente quanto usar um cliente/servidor, então pra muitas estações melhor ir direto pra MySQL/MariaDB.
Na época, o máximo que usei foram uns 12 ou 15 usuários, simultâneo com Clipper.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Browse Filter - Array Filter

Mensagem por asimoes »

Offtopic: Documentação do ADS
Onde baixar o driver ADS
https://devzone.advantagedatabase.com/d ... Product=15
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Browse Filter - Array Filter

Mensagem por Itamar M. Lins Jr. »

Ola!
Só para deixar claro, eu estou usando LetoDbf não é o LetoDB.
Não tenho problema com ele. O ADS se for assim, sem restrições, só o fato de usar SQL é uma boa opção, talvez até melhor que o LetoDbf... Mas já vi testes com LetoDBf x ADS e o LetoDBf foi melhor.
Como não estou com pressa nem com problema usando DBF e o LetoDBf, irei usar até precisar mudar.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Browse Filter - Array Filter

Mensagem por asimoes »

Itamar M. Lins Jr. escreveu:Ola!
Só para deixar claro, eu estou usando LetoDbf não é o LetoDB.
Não tenho problema com ele. O ADS se for assim, sem restrições, só o fato de usar SQL é uma boa opção, talvez até melhor que o LetoDbf... Mas já vi testes com LetoDBf x ADS e o LetoDBf foi melhor.
Como não estou com pressa nem com problema usando DBF e o LetoDBf, irei usar até precisar mudar.
Itamar

A questão principal é a segurança e evolução das coisas, com certeza o Leto é mais rápido mas a base ainda é dbf o ADS foi para mim um trampolim para o MariaDB, foi preparar para migrar se não fizesse isso iria ficar no RDD por comodidade
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder