Clipper On Line • Ver Tópico - Browse ADO com problema

Browse ADO com problema

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

Browse ADO com problema

Mensagempor JoséQuintas » 05 Jul 2020 06:37

a que vc me passou está funcionando bem, o problema não é nela; o problema é na que estou fazendo agora, para outra coisa


minha função está assim:


Conexao := Conectado( nProvTar )
               Conexao:Open()
               oRs := conexao:Execute( cSel )

               novobrowseado()
            
            do while .t.
                  oTBrowse:forceStable()
                  oTBrowse:refreshCurrent()
                  nKey := Inkey(0)
             
               if lastkey()=13
                   arq=oRs:Fields("nrtarefa"):Value
                    chmfunc("entersql",arq,"S")
               elseif lastkey()=27
                  @ maxrow()-1,1 prompt "Finalizar consulta"
                 @ maxrow()-1,24 prompt "Reabrir mesmo item"
                 @ maxrow()-1,46 prompt "Refazer mesma consulta"
                 @ maxrow()-1,70 prompt "Incluir sem prioridade"
                 @ maxrow()-1,94 prompt "Incluir solucionados"
                 @ maxrow()-1,116 prompt "Incluir sem prioridade e solucionados"
                 menu to opret
                 do case
                   case opret=0 .or. opret=1
                       cSair="S"
                    case opret=2
                            chmfunc("entersql",arq,"S")
                   case opret=4
                        prmzero="N"
                   case opret=5
                        nsol="S"
                   case opret=6
                        prmzero="N"
                        nsol="T"
                 endcase
                exit
               endif
            enddo


e a função novobrowseado() está assim:


function novobrowseado
         #include "tbrowse.ch"
      
       keysec(27,1000,-1,.t.)
   
            cls
         
            oTBrowse := TBrowseDB():new( 05, 3, MaxRow() - 7, MaxCol() - 2 )

            oTBrowse:goTopBlock    := { || oRs:moveFirst() }
            oTBrowse:goBottomBlock := { || oRs:moveLast() }
            oTBrowse:skipBlock     := { | n | ADORecordSetSkipper( oRs, n ) }
            oTBrowse:HeadSep       := Chr(196)
            oTBrowse:ColSep        := Chr(179)
            oTBrowse:FootSep       := ""

            nLen := oRs:fields():count() - 1
            FOR i := 0 TO nLen
                oColumn       := TBColumnNew( oRs:fields(i):name(), ADORecordSetFieldBlock( oRs, i ) )
              IF ValType( oRs:Fields(i):Value ) == "D"
                   nFieldLen := Len( Dtoc( Date() ) )
                ELSE
                   nFieldLen := Min( oRs:Fields(I):DefinedSize, 50 )
                ENDIF
                oColumn:Width := Max( nFieldLen, Len( oRs:fields(i):name ) )
                oTBrowse:addColumn( oColumn )
            NEXT

           @ 5,5 say "Abrindo consulta..."
return .t.


eu devo estar fazendo algo errado, pois não estou conseguindo mover dentro do browse com as setas
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 com problema

Mensagempor JoséQuintas » 05 Jul 2020 06:49

1 - se a que passei é genérica, e funciona pra qualquer coisa, porque criar uma nova?

2 - mesmo assim, se a outra funciona.... é só olhar na outra, pra ver o que esqueceu de copiar
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 com problema

Mensagempor JoséQuintas » 05 Jul 2020 07:02

Mesmo assim, vamos aproveitar e corrigir o fonte.
O melhor negócio é.... perguntar pro Harbour

hbmk2 -test -w3 -es2
test.prg:5: warning W0001 Ambiguous reference 'NPROVTAR'
test.prg:5: warning W0001 Ambiguous reference 'CONEXAO'
test.prg:6: warning W0001 Ambiguous reference 'CONEXAO'
test.prg:7: warning W0001 Ambiguous reference 'CONEXAO'
test.prg:7: warning W0001 Ambiguous reference 'CSEL'
test.prg:7: warning W0001 Ambiguous reference 'ORS'
test.prg:12: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:13: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:14: warning W0001 Ambiguous reference 'NKEY'
test.prg:17: warning W0001 Ambiguous reference 'ORS'
test.prg:17: warning W0001 Ambiguous reference 'ARQ'
test.prg:18: warning W0001 Ambiguous reference 'ARQ'
test.prg:26: warning W0001 Ambiguous reference 'OPRET'
test.prg:26: warning W0001 Ambiguous reference 'OPRET'
test.prg:26: warning W0001 Ambiguous reference 'OPRET'
test.prg:28: warning W0001 Ambiguous reference 'OPRET'
test.prg:28: warning W0001 Ambiguous reference 'OPRET'
test.prg:29: warning W0001 Ambiguous reference 'CSAIR'
test.prg:30: warning W0001 Ambiguous reference 'OPRET'
test.prg:31: warning W0001 Ambiguous reference 'ARQ'
test.prg:32: warning W0001 Ambiguous reference 'OPRET'
test.prg:33: warning W0001 Ambiguous reference 'PRMZERO'
test.prg:34: warning W0001 Ambiguous reference 'OPRET'
test.prg:35: warning W0001 Ambiguous reference 'NSOL'
test.prg:36: warning W0001 Ambiguous reference 'OPRET'
test.prg:37: warning W0001 Ambiguous reference 'PRMZERO'
test.prg:38: warning W0001 Ambiguous reference 'NSOL'
test.prg:52: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:54: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:54: warning W0001 Ambiguous reference 'ORS'
test.prg:55: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:55: warning W0001 Ambiguous reference 'ORS'
test.prg:56: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:56: warning W0001 Ambiguous reference 'ORS'
test.prg:57: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:58: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:59: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:61: warning W0001 Ambiguous reference 'ORS'
test.prg:61: warning W0001 Ambiguous reference 'NLEN'
test.prg:62: warning W0001 Ambiguous reference 'I'
test.prg:63: warning W0001 Ambiguous reference 'ORS'
test.prg:63: warning W0001 Ambiguous reference 'I'
test.prg:63: warning W0001 Ambiguous reference 'ORS'
test.prg:63: warning W0001 Ambiguous reference 'I'
test.prg:63: warning W0001 Ambiguous reference 'OCOLUMN'
test.prg:64: warning W0001 Ambiguous reference 'ORS'
test.prg:64: warning W0001 Ambiguous reference 'I'
test.prg:65: warning W0001 Ambiguous reference 'NFIELDLEN'
test.prg:67: warning W0001 Ambiguous reference 'ORS'
test.prg:67: warning W0001 Ambiguous reference 'I'
test.prg:67: warning W0001 Ambiguous reference 'NFIELDLEN'
test.prg:69: warning W0001 Ambiguous reference 'OCOLUMN'
test.prg:69: warning W0001 Ambiguous reference 'NFIELDLEN'
test.prg:69: warning W0001 Ambiguous reference 'ORS'
test.prg:69: warning W0001 Ambiguous reference 'I'
test.prg:70: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:70: warning W0001 Ambiguous reference 'OCOLUMN'
test.prg:71: warning W0001 Ambiguous reference 'I'
test.prg:71: warning W0001 Ambiguous reference 'I'
test.prg:71: warning W0001 Ambiguous reference 'NLEN'


ok, variáveis que não se sabe de onde vém, nem pra onde vão.
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 com problema

Mensagempor JoséQuintas » 05 Jul 2020 07:10

Numa formatação e declaração rápida, chega-se nisto:

test.prg:11: warning W0001 Ambiguous reference 'ORS'
test.prg:16: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:17: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:21: warning W0001 Ambiguous reference 'ORS'
test.prg:50: warning W0032 Variable 'NKEY' is assigned but not used in function '18:MAIN'
test.prg:58: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:60: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:60: warning W0001 Ambiguous reference 'ORS'
test.prg:61: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:61: warning W0001 Ambiguous reference 'ORS'
test.prg:62: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:62: warning W0001 Ambiguous reference 'ORS'
test.prg:63: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:64: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:65: warning W0001 Ambiguous reference 'OTBROWSE'
test.prg:67: warning W0001 Ambiguous reference 'ORS'
test.prg:69: warning W0001 Ambiguous reference 'ORS'
test.prg:69: warning W0001 Ambiguous reference 'ORS'
test.prg:70: warning W0001 Ambiguous reference 'ORS'
test.prg:73: warning W0001 Ambiguous reference 'ORS'
test.prg:75: warning W0001 Ambiguous reference 'ORS'
test.prg:76: warning W0001 Ambiguous reference 'OTBROWSE'


Ok, restaram as variáveis usadas no módulo e na função, portanto precisam de solução especial pra existir nos dois.

PRIVATE? NÃO, LOCAL e passar por referência pra função.
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 com problema

Mensagempor JoséQuintas » 05 Jul 2020 07:14

Alteramos aqui:

LOCAL opRet, nKey, csel := "SELECT ...", Conexao, nProvTar := 1, oTBrowse, oRs

aqui

novobrowseado( @oTBrowse, @oRs )

e aqui

FUNCTION novobrowseado( oTBrowse, oRs )

agora só resta esta:

test.prg:50: warning W0032 Variable 'NKEY' is assigned but not used in function '18:MAIN'


É lógico, se atribui nKey a uma variável, pra não usar pra nada.... pra que a variável?
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 com problema

Mensagempor JoséQuintas » 05 Jul 2020 07:16

Então, já que a variável existe, alteramos aqui:

      nKey := Inkey(0)
      IF nKey = K_ENTER
         arq=oRs:Fields("nrtarefa"):Value
         chmfunc("entersql",arq,"S")
      ELSEIF nKey == K_ESC


c:/temp/test.o:test.c:(.data+0x38): undefined reference to `HB_FUN_CONECTADO'
c:/temp/test.o:test.c:(.data+0xd8): undefined reference to `HB_FUN_CHMFUNC'
c:/temp/test.o:test.c:(.data+0x158): undefined reference to `HB_FUN_KEYSEC'
c:/temp/test.o:test.c:(.data+0x208): undefined reference to `HB_FUN_ADORECORDSETSKIPPER'
c:/temp/test.o:test.c:(.data+0x278): undefined reference to `HB_FUN_ADORECORDSETFIELDBLOCK'


Pronto, isso tem a ver com o aplicativo e/ou rotinas que não estão nesse fonte.
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 com problema

Mensagempor JoséQuintas » 05 Jul 2020 07:20

Agora vamos alterar pra genérica.
Primeira coisa que pode mudar: posições

Alteramos aqui:
   novobrowseado( 5, 3, MaxRow() - 7, MaxCol() - 2, @oTBrowse, @oRs )


e aqui:

FUNCTION novobrowseado( nTop, nLeft, nBottom, nRight, oTBrowse, oRs )
   oTBrowse := TBrowseDB():new( nTop, nLeft, nBottom, nRight )
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 com problema

Mensagempor gilbertosilverio » 05 Jul 2020 07:32

Olá Quintas,

do while .t.
oTBrowse:forceStable()
oTBrowse:refreshCurrent()


Nos meus dbedit(), a tempos, tinha um problema parecido, inclui estas linhas e funcionou...

      oBrw:REFRESHALL()
      oBrw:Stabilize()


Tenta pra ver no que da...

Do help do harbour...

:ForceStable() Performs a full stabilization
:GetColumn( nColumn ) Gets a specific TBColumn() object
:Hilite() Highlights the current cell
:InsColumn( nPos, oCol ) Insert a column object in a browse
:Invalidate() Forces entire redraw during next stabilization
:RefreshAll() Causes all data to be recalculated during the next stabilize
:RefreshCurrent() Causes the current row to be refilled and repainted on next stabilize
:SetColumn( nColumn, oCol ) Replaces one TBColumn() object with another
:Stabilize() Performs incremental stabilization


Faz tanto tempo, que não lembro mais onde vi esta sugestão...
gilbertosilverio
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Browse ADO com problema

Mensagempor JoséQuintas » 05 Jul 2020 07:33

é um usuário perguntando pelo whatsapp

A próxima:
O Browse fazer tudo e passar função de usuário:

   novobrowseado( 5, 3, MaxRow() - 7, MaxCol() - 2, @oTBrowse, @oRs, { || RotinaDesteBrowse( tb, k, rs ) )


Pronto.
Agora é ajustar as variáveis para o novo fonte.
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 com problema

Mensagempor JoséQuintas » 05 Jul 2020 07:36

O novo fonte ajustado para um browse genérico.

#include "inkey.ch"

MEMVAR arq, cSair, prmzero, nSol

PROCEDURE Main

   LOCAL csel := "SELECT ...", Conexao, nProvTar := 1, oRs

   Conexao := Conectado( nProvTar )
   Conexao:Open()
   oRs := conexao:Execute( cSel )

   novobrowseado( 5, 3, MaxRow() - 7, MaxCol() - 2, @oRs, { | tb, k, rs | RotinaDesteBrowse( tb, k, rs ) } )

   RETURN

FUNCTION RotinaDesteBrowse( otb, nKey, ors )

   LOCAL opRet

   (otb)
   DO WHILE .t.

      IF nKey = K_ENTER
         arq=oRs:Fields("nrtarefa"):Value
         chmfunc("entersql",arq,"S")
      ELSEIF nKey == K_ESC
         @ maxrow()-1,1 prompt "Finalizar consulta"
         @ maxrow()-1,24 prompt "Reabrir mesmo item"
         @ maxrow()-1,46 prompt "Refazer mesma consulta"
         @ maxrow()-1,70 prompt "Incluir sem prioridade"
         @ maxrow()-1,94 prompt "Incluir solucionados"
         @ maxrow()-1,116 prompt "Incluir sem prioridade e solucionados"
         MENU to opret
         DO CASE
         CASE opret=0 .OR. opret=1
            cSair="S"
         CASE opret=2
            chmfunc("entersql",arq,"S")
         CASE opret=4
            prmzero="N"
         CASE opret=5
            nsol="S"
         CASE opret=6
            prmzero="N"
            nsol="T"
         ENDCASE
         EXIT
      ENDIF
   ENDDO

   RETURN NIL

#include "tbrowse.ch"

FUNCTION novobrowseado( nTop, nLeft, nBottom, nRight, oRs, bFuncao )

   LOCAL I, oColumn, nFieldLen, nLen, nKey, oTBrowse

   keysec(27,1000,-1,.t.)

   CLS

   oTBrowse := TBrowseDB():new( nTop, nLeft, nBottom, nRight )

   oTBrowse:goTopBlock    := { || oRs:moveFirst() }
   oTBrowse:goBottomBlock := { || oRs:moveLast() }
   oTBrowse:skipBlock     := { | n | ADORecordSetSkipper( oRs, n ) }
   oTBrowse:HeadSep       := Chr(196)
   oTBrowse:ColSep        := Chr(179)
   oTBrowse:FootSep       := ""

   nLen := oRs:fields():count() - 1
   FOR i := 0 TO nLen
      oColumn       := TBColumnNew( oRs:fields(i):name(), ADORecordSetFieldBlock( oRs, i ) )
      IF ValType( oRs:Fields(i):Value ) == "D"
         nFieldLen := Len( Dtoc( Date() ) )
      ELSE
         nFieldLen := Min( oRs:Fields(I):DefinedSize, 50 )
      ENDIF
      oColumn:Width := Max( nFieldLen, Len( oRs:fields(i):name ) )
      oTBrowse:addColumn( oColumn )
   NEXT
   DO WHILE .T.
      oTBrowse:forceStable()
      oTBrowse:refreshCurrent()
      nKey := Inkey(0)
      DO CASE
      OTHERWISE
         IF bFuncao != NIL
            Eval( bFuncao, oTBrowse, nKey, oRs )
         ENDIF
      ENDCASE
   ENDDO

   RETURN .t.


E... como eu já disse... só copiar o que falta PARA O BROWSE, da rotina que funciona
Sem tratamento de teclas, não tem funcionamento de teclas... é simples assim.
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 com problema

Mensagempor JoséQuintas » 05 Jul 2020 07:39

Considerações adicionais:

chamar de CSEL, o que é comando SQL.... esquisito....

chamar de Conectado() o que seria uma conexao... esquisito também.

Apenas esquisito, cada um escolhe o nome que quiser.

Ah sim... uma vez que as variáveis são LOCAIS, nada impede de usar o nome que quiser, MESMO QUE EXISTA EM OUTRO FONTE.
Por exemplo, nOpcao ou nOpc pra escolha de opção.
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 com problema

Mensagempor JoséQuintas » 05 Jul 2020 07:56

Uma consideração importante sobre o codeblock:

No Clipper, havia opção de função de usuário, passando como string. "funcao".
O problema de usar assim é que OBRIGA que seja uma função pública e única, para cada browse.
Já usando codeblock, dá pra usar uma função STATIC, que só fica visível no fonte aonde a função foi declarada.
Ou seja, retira a limitação que deixa tudo preso.

Com codeblock, poderia até ter todas as rotinas de browse com mesmo nome, que não seria problema.
Essa é a grande diferença, dá até pra padronizar um nome pra tudo.
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 com problema

Mensagempor JoséQuintas » 05 Jul 2020 13:37

Ficou um erro nisso tudo.
O DO WHILE da função de usuário vai acabar travando tudo.
É decidir como vai tratar essa função de usuário.

Outra opção interessante seria fazer parecido com a tbrowse, mas aí teria que alterar pra classe pra poder acrescentar as opções.

Achei interessante o recurso, que é oBrowse:SetKey( nKey, bCode )

É que desse jeito, ao invés de uma função de usuário tratando tudo que é tecla, teria uma função pra cada tecla.

oBrowse:SetKey( K_ENTER, { || RotinaEnter() } )
oBrowse:SetKey( K_ESC, { || RotinaEsc() } )

O lado ruim seria ter que repetir isso pra maiúscula/minúscula.
O lado bom seria deixar tudo por conta do browse genérico, e dividir o que seria um fonte monstruoso em pequenos fontes.

No browse genérico, talvez algo do tipo:

AEval( aSetKeyList, { | e | iif( nKey == e[ 1 ], Eval( e[ 2 ] ), NIL ) } )

Esse conceito poderia ser usado nas LIBs GUI também, pra configurar teclas para as rotinas de grid/browse/etc.
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 com problema

Mensagempor cjp » 06 Jul 2020 00:29

Em primeiro lugar, obrigado por ter postado aqui o problema e a solução.
Testei exatamente da forma como vc postou, e não funcionou. Nenhuma tecla funciona no browse.

Só para ficar claro, fiz assim:


               Conexao := Conectado( nProvTar )
               Conexao:Open()
               oRs := conexao:Execute( cSel )

               novobrowseado( 5, 3, MaxRow() - 7, MaxCol() - 2, @oRs, { | tb, k, rs | RotinaDesteBrowse( tb, k, rs ) } )

FUNCTION RotinaDesteBrowse( otb, nKey, ors )

   LOCAL opRet

   (otb)
   DO WHILE .t.

      IF nKey = K_ENTER
         arq=oRs:Fields("nrtarefa"):Value
         chmfunc("entersql",arq,"S")
      ELSEIF nKey == K_ESC
         @ maxrow()-1,1 prompt "Finalizar consulta"
         @ maxrow()-1,24 prompt "Reabrir mesmo item"
         @ maxrow()-1,46 prompt "Refazer mesma consulta"
         @ maxrow()-1,70 prompt "Incluir sem prioridade"
         @ maxrow()-1,94 prompt "Incluir solucionados"
         @ maxrow()-1,116 prompt "Incluir sem prioridade e solucionados"
         MENU to opret
         DO CASE
         CASE opret=0 .OR. opret=1
            cSair="S"
         CASE opret=2
            chmfunc("entersql",arq,"S")
         CASE opret=4
            prmzero="N"
         CASE opret=5
            nsol="S"
         CASE opret=6
            prmzero="N"
            nsol="T"
         ENDCASE
         EXIT
      ENDIF
   ENDDO

   RETURN NIL

#include "tbrowse.ch"

FUNCTION novobrowseado( nTop, nLeft, nBottom, nRight, oRs, bFuncao )

   LOCAL I, oColumn, nFieldLen, nLen, nKey, oTBrowse

   keysec(27,1000,-1,.t.)

   CLS

   oTBrowse := TBrowseDB():new( nTop, nLeft, nBottom, nRight )

   oTBrowse:goTopBlock    := { || oRs:moveFirst() }
   oTBrowse:goBottomBlock := { || oRs:moveLast() }
   oTBrowse:skipBlock     := { | n | ADORecordSetSkipper( oRs, n ) }
   oTBrowse:HeadSep       := Chr(196)
   oTBrowse:ColSep        := Chr(179)
   oTBrowse:FootSep       := ""

   nLen := oRs:fields():count() - 1
   FOR i := 0 TO nLen
      oColumn       := TBColumnNew( oRs:fields(i):name(), ADORecordSetFieldBlock( oRs, i ) )
      IF ValType( oRs:Fields(i):Value ) == "D"
         nFieldLen := Len( Dtoc( Date() ) )
      ELSE
         nFieldLen := Min( oRs:Fields(I):DefinedSize, 50 )
      ENDIF
      oColumn:Width := Max( nFieldLen, Len( oRs:fields(i):name ) )
      oTBrowse:addColumn( oColumn )
   NEXT
   DO WHILE .T.
      oTBrowse:forceStable()
      oTBrowse:refreshCurrent()
      nKey := Inkey(0)
      DO CASE
      OTHERWISE
         IF bFuncao != NIL
            Eval( bFuncao, oTBrowse, nKey, oRs )
         ENDIF
      ENDCASE
   ENDDO

   RETURN .t.
   
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Browse ADO com problema

Mensagempor JoséQuintas » 06 Jul 2020 10:52

http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=23720&p=137242&hilit=browse+ado#p137242

browse.png


Mas é confuso isso.
Você JÁ TEM browse ADO no aplicativo funcionando.
Agora tá fazendo outro browse.....

É que essa situação se tornou comum: pergunta e copia fonte, sendo que JÁ TEM FONTE FUNCIONANDO E EM USO.

Tá viciado em baixar fonte da internet, baixou de novo, e nem olhou o que já tinha?
Copiou do que JÁ TEM NO APLICATIVO, e nem conferiu se faltava alguma coisa?

A impressão que dá, é que apenas coloca fontes pra que alguém devolva o fonte corrigido.
Não sei o que pensar.

Nota aos demais: além do fórum tem perguntas via whatsapp, é que considerando apenas pelo fórum pode parecer exagero.
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

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 17 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