Página 1 de 2

Browse Filter - Array Filter

Enviado: 06 Mar 2020 06:47
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

Browse Filter - Array Filter

Enviado: 06 Mar 2020 10:08
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()


Browse Filter - Array Filter

Enviado: 06 Mar 2020 10:42
por gilbertosilverio
Simões,

Obrigado, vou testar...

Browse Filter - Array Filter

Enviado: 06 Mar 2020 11:33
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()


Browse Filter - Array Filter

Enviado: 06 Mar 2020 20:37
por JoséQuintas
Console com ADO seria uma maravilha, talvez dê pra fazer igual em HWGUI.

Browse Filter - Array Filter

Enviado: 07 Mar 2020 12:56
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 !

Browse Filter - Array Filter

Enviado: 09 Mar 2020 11:17
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.

Browse Filter - Array Filter

Enviado: 09 Mar 2020 19:35
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

Browse Filter - Array Filter

Enviado: 10 Mar 2020 09:53
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.

Browse Filter - Array Filter

Enviado: 10 Mar 2020 15:50
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

Browse Filter - Array Filter

Enviado: 10 Mar 2020 17:47
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

Browse Filter - Array Filter

Enviado: 10 Mar 2020 18:10
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.

Browse Filter - Array Filter

Enviado: 10 Mar 2020 19:03
por asimoes
Offtopic: Documentação do ADS
Onde baixar o driver ADS
https://devzone.advantagedatabase.com/d ... Product=15

Browse Filter - Array Filter

Enviado: 11 Mar 2020 09:50
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.

Browse Filter - Array Filter

Enviado: 11 Mar 2020 10:03
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