Clipper On Line • Ver Tópico - browse ADO

browse ADO

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

browse ADO

Mensagempor Itamar M. Lins Jr. » 14 Set 2020 20:02

Ola!
Tô na cola...
Veja;
#include "hwgui.ch"

Function Main
Local oMainWindow

   INIT WINDOW oMainWindow MAIN TITLE "Example" ;
     AT 200,0 SIZE 400,150

   MENU OF oMainWindow
      MENUITEM "&Exit" ACTION hwg_EndWindow()
      MENUITEM "&Dialog" ACTION DlgGet()
   ENDMENU

   ACTIVATE WINDOW oMainWindow
Return Nil

STATIC FUNCTION DlgGet()

   LOCAL oModDlg, oBrw1, cnSQL

   cnSQL := win_OleCreateObject( "ADODB.Recordset" )
   cnSQL:Open( hb_cwd() + "teste.ado" )

   INIT DIALOG oModDlg TITLE "LicenÏ„as" AT 0,0 SIZE 1024,600

   @ 1,1 BROWSE ARRAY oBrw1 SIZE 1022,500 STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL
  oBrw1:bOther := {|oBrw, msg, wParam, lParam| fKeyDown(oBrw, msg, wParam, lParam)}   
     
   @ 500,720 OWNERBUTTON ON CLICK {|| cnSQL:Close(), hwg_EndDialog()} ;
       SIZE 180,36 FLAT                                ;
       TEXT "Close" COLOR hwg_ColorC2N("0000FF")
   oBrw1:aarray := cnSQL
   oBrw1:AddColumn( HColumn():New( "Codigo", { |v,o| (v), o:aArray:Fields( "CODIGO" ):Value },"C",6,0,.F.,DT_CENTER ) )
   oBrw1:AddColumn( HColumn():New( "Nome",   { |v,o| (v), o:aArray:Fields( "NOME" ):Value }, "C",30,0,.T.,DT_CENTER,DT_RIGHT ) )
   oBrw1:aColumns[2]:lResizable := .F.
   oBrw1:bSkip     := { | o, nSkip | ADOSkipper( o:aArray, nSkip ) }
   oBrw1:bGotop    := { | o | o:aArray:MoveFirst() }
   oBrw1:bGobot    := { | o | o:aArray:MoveLast() }
   oBrw1:bEof      := { | o | o:nCurrent > o:aArray:RecordCount() }
   //oBrw1:bBof      := { | o | o:nCurrent == 0 }
   oBrw1:bRcou     := { | o | o:aArray:RecordCount() }
   oBrw1:bRecno    := { | o | o:aArray:AbsolutePosition }
   obrw1:bRecnoLog := obrw1:bRecno
   oBrw1:bGOTO     := { | o, n | (o), o:aArray:Move( n - 1, 1 ) }

   ACTIVATE DIALOG oModDlg
Return Nil

FUNCTION ADOSkipper( cnSQL, nSkip )

   LOCAL nRec := cnSQL:AbsolutePosition()
      IF ! cnSQL:Eof()
         cnSQL:Move( nSkip )
         IF cnSQL:Eof()
            cnSQL:MoveLast()
         ENDIF
         IF cnSQL:Bof()
            cnSQL:MoveFirst()
         ENDIF
      ENDIF
      RETURN cnSQL:AbsolutePosition() - nRec

Static FUNCTION fKeyDown(oBrw, msg, wParam, lParam)
LOCAL nKEY := hwg_PtrToUlong( wParam ) //wParam
IF msg == WM_KEYDOWN
   IF nKey = VK_F2
      hwg_Msginfo("Total: " + Str(oBrw:aArray:RecordCount())+hb_eol() + "Recno:" + Str(oBrw:nCurrent) + hb_eol() + "Absoluto:" + Str(oBrw:aArray:AbsolutePosition)  )
   ENDIF
ENDIF
RETURN .T.

nCurrent sempre com 1
Pressione F2 que vai mostrar, até aqui o fonte da Hwgui está ok. Falta o nCurrent retornar o valor correto, mas ai é adaptação do ADO.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

browse ADO

Mensagempor JoséQuintas » 14 Set 2020 20:11

Não adiantou alterar pra bGoBot

Mas pera aí:
O teste tá errado, de acordo com tbrowse.

FUNCTION ADOSkipper( cnSQL, nSkip )

   LOCAL nRec := cnSQL:AbsolutePosition()
      IF ! cnSQL:Eof()
         cnSQL:Move( nSkip )
         IF cnSQL:Eof()
            cnSQL:MoveLast()
         ENDIF
         IF cnSQL:Bof()
            cnSQL:MoveFirst()
         ENDIF
      ENDIF
      RETURN cnSQL:AbsolutePosition() - nRec


O teste não seria Eof(), mas sim se conseguiu pular os registros que foram indicados

Mas pera aí....
hwgui com tantos anos de uso....
Corrigir um browse, equivalente ao tbrowse, porque não está equivalente ao tbrowse...
Nem sei o que dizer....
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

browse ADO

Mensagempor JoséQuintas » 14 Set 2020 20:17

Olha aí a correção, agora funciona.
E acabei apagando duas linhas do fonte.

METHOD LINEDOWN( lMouse ) CLASS HBrowse

   LOCAL minPos, maxPos, nPos, colpos

   IF Eval( ::bSkip, Self, 1 ) == 0
      Eval( ::bGoBot, Self )


METHOD LINEUP() CLASS HBrowse

   LOCAL minPos, maxPos, nPos

   IF Eval( ::bSkip, Self, -1 ) == 0
      Eval( ::bGoTop, Self )


Agora confuso....
Só comigo deu problema?
Fui direto começar logo com o que tinha problema?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

browse ADO

Mensagempor Itamar M. Lins Jr. » 14 Set 2020 20:29

Ola!
Bom, são muitas coisas.
O browse array usa bSkip que chama a procedure ARSKIP(o,n)
Veja que no seu vc não está atualizando ele.(nCurrent)

PROCEDURE ARSKIP( oBrw, nSkip )

   LOCAL nCurrent1

   IF oBrw:nRecords != 0
      nCurrent1   := oBrw:nCurrent
      oBrw:nCurrent += nSkip + iif( nCurrent1 = 0, 1, 0 )
      IF oBrw:nCurrent < 1
         oBrw:nCurrent := 0
      ELSEIF oBrw:nCurrent > oBrw:nRecords
         oBrw:nCurrent := oBrw:nRecords + 1
      ENDIF
   ENDIF

   RETURN


FUNCTION ADOSkipper( cnSQL, nSkip )

   LOCAL nRec := cnSQL:AbsolutePosition()
      IF ! cnSQL:Eof()
         cnSQL:Move( nSkip )
         IF cnSQL:Eof()
            cnSQL:MoveLast()
         ENDIF
         IF cnSQL:Bof()
            cnSQL:MoveFirst()
         ENDIF
      ENDIF
      RETURN cnSQL:AbsolutePosition() - nRec

Vc substituiu pelo seu ADOSKIPPER, faltou atualizar nCurrent acho que foi isso por enquanto...

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

browse ADO

Mensagempor JoséQuintas » 14 Set 2020 20:43

Discordo totalmente.
Sabemos que array precisa disso, de um indexador, mas não o resto.
E o array pode ser resolvido da mesma forma.
Ou será que é ficar aprendendo tudo de novo, pra ver se funciona do mesmo jeito ????

Aqui postei um exemplo que serve pra ADO, Array e DBF.
Segue as regras do tbrowse.

http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=24436&p=142124&hilit=browse#p142124
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

browse ADO

Mensagempor JoséQuintas » 14 Set 2020 20:46

Ou pra ficar mais claro, só a parte de array:

      oTBrowse:GoTopBlock    := { || nIndex := 1 }
      oTBrowse:GoBottomBlock := { || nIndex := Len( oConsulta ) }
      oTBrowse:SkipBlock     := { | input, temp | temp := nIndex,    ;
         nIndex := Max( 1, Min( Len( oConsulta ), nIndex + input ) ), nIndex - temp }


Array sim, precisa do nCurrent, que nesse caso chamei de nIndex
O retorno é a última parte do codeblock: nIndex - temp
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

browse ADO

Mensagempor JoséQuintas » 14 Set 2020 20:54

Um possível problema que vejo é:

E array vazio?
Normalmente não existe isso, mas talvez exista em hbMySQL.
Não sei qual seria o comportamento do tbrowse normal nesse caso, porque geralmente não fazemos isso.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

browse ADO

Mensagempor Itamar M. Lins Jr. » 14 Set 2020 20:57

Ola!
Pois é!
Para ADO foi agora, array já tinha quem usa ? Eu não uso.
Mas agora já foi corrigido para tudo.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

browse ADO

Mensagempor Itamar M. Lins Jr. » 14 Set 2020 20:59

Ola!
Posso colocar seu exemplo para testes(ADO) na Hwgui ?

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

browse ADO

Mensagempor JoséQuintas » 14 Set 2020 21:01

Resta testar.
Igual ao tbrowse ficaria assim:

PROCEDURE ARSKIP( oBrw, nSkip )

   LOCAL nOld

   nOld          := oBrw:nCurrent
   oBrw:nCurrent := Max( 1, Min( oBrw:nRecords, nOld + nSkip ) )

   RETURN oBrw:nCurrent - nOld


Talvez o sample existente sirva.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

browse ADO

Mensagempor Itamar M. Lins Jr. » 14 Set 2020 21:05

Ola!
É isso, vou fazer um bem bonitinho aqui...
E ver se o pessoal faz commit dele na area de testes da Hwgui.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

browse ADO

Mensagempor JoséQuintas » 14 Set 2020 21:07

Funciona perfeito pra array também, pelo menos no sample.

hwgui.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

browse ADO

Mensagempor JoséQuintas » 14 Set 2020 21:10

Veja isto:

      oldRecno := Eval( oBrw:bRecnoLog, oBrw )
      newRecno := Round( ( oBrw:nRecords - 1 ) * nPos/ ( maxPos - minPos ) + 1, 0 )
      IF newRecno <= 0
         newRecno := 1


Testar se RecNo é menor ou igual a zero?

Acho que estão remendando faz tempo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

browse ADO

Mensagempor JoséQuintas » 14 Set 2020 21:30

FUNCTION hwg_VScrollPos( oBrw, nType, lEof, nPos )

   LOCAL minPos, maxPos, oldRecno, newRecno

   hwg_Getscrollrange( oBrw:handle, SB_VERT, @minPos, @maxPos )
   IF nPos == Nil
      IF nType > 0 .AND. lEof
         Eval( oBrw:bSkip, oBrw, - 1 )
      ENDIF
      nPos := iif( oBrw:nRecords > 1, Round( ( (maxPos - minPos )/(oBrw:nRecords - 1 ) ) * ;
         ( Eval( oBrw:bRecnoLog,oBrw ) - 1 ), 0 ), minPos )
      hwg_Setscrollpos( oBrw:handle, SB_VERT, nPos )
   ELSE
      oldRecno := Eval( oBrw:bRecnoLog, oBrw )
      newRecno := Round( ( oBrw:nRecords - 1 ) * nPos/ ( maxPos - minPos ) + 1, 0 )
      IF newRecno <= 0
         newRecno := 1
      ELSEIF newRecno > oBrw:nRecords
         newRecno := oBrw:nRecords
      ENDIF
      IF nType == SB_THUMBPOSITION
         hwg_Setscrollpos( oBrw:handle, SB_VERT, nPos )
      ENDIF
      IF newRecno != oldRecno
         Eval( oBrw:bSkip, oBrw, newRecno - oldRecno )
         IF oBrw:rowCount - oBrw:rowPos > oBrw:nRecords - newRecno
            oBrw:rowPos := oBrw:rowCount - ( oBrw:nRecords - newRecno )
         ENDIF
         IF oBrw:rowPos > newRecno
            oBrw:rowPos := newRecno
         ENDIF
         oBrw:Refresh( .F. )
      ENDIF
   ENDIF

   RETURN Nil



      ::bRecnoLog := ::bRecno  := { ||( ::alias ) -> ( RecNo() ) }


Tá confuso isso, fazer conta com o RecNo(), e usar RecNo() como referência?
Só se usasse DBF sempre SEM estar indexado.

Então....
Uma vez sugeri que o pessoal falasse sobre ferramentas de uso e modo de trabalho, pra comparações.
De repente a maioria usa array, pra velocidade, e não teve problema com isso.
A minha intenção era justamente tentar preparar pra esse tipo de coisa.
De repente, a ferramenta é ótima pra quem trabalha exatamente daquele jeito.
E quem trabalhar diferente, vai direto justamente testar a parte diferente.
E no meu caso, com certeza é o ADO que é a parte diferente, por isso fui direto nele.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

browse ADO

Mensagempor Itamar M. Lins Jr. » 14 Set 2020 22:24

Ola!
Deu defeito no DBF...O mesmo do ADO, não para no final.
Tô vendo onde é :-(

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Anterior Próximo



Retornar para HwGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 7 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