Página 7 de 10

cor no tbrowse

Enviado: 03 Set 2021 01:02
por cjp
Vamos separar mais ainda:
Uma dúvida: é pra usar somente este código? Ou o restante do código também?

Testei da primeira forma, deu erro no fields().

Testei da segunda forma, deu erro no SET. Tirei os SETs, deu erro no B_SINGLE.

Não sei o que fazer.

cor no tbrowse

Enviado: 03 Set 2021 06:57
por JoséQuintas
cjp escreveu:Uma dúvida: é pra usar somente este código? Ou o restante do código também?
Testei da primeira forma, deu erro no fields().
Testei da segunda forma, deu erro no SET. Tirei os SETs, deu erro no B_SINGLE.
Não sei o que fazer.
Apenas foi dividida a função BrowseADO() em duas partes.
O restante continua fazendo parte.
E os erros é por ter apagado as outras coisas.

Nota: o copiar/colar continua, deixa na dúvida se precisa de ajuda ou se precisa de funcionário.

cor no tbrowse

Enviado: 03 Set 2021 09:24
por cjp
Realmente eu tinha esquecido de recolocar os includes iniciais. Peço desculpas.
Testei agora de novo, está dando erro na função de usuário: Error BASE/1070 Erro nos parâmetros: ==
Até onde eu pude apurar, parece que o erro é por causa da nkey, que está entrando vazia na função de usuário, teclando qualquer coisa.
Achei estranho que a nkey não está definida na tbrowseado inicial (ela é definida como local em tbrowseado2), embora esteja sendo usada em tBrowseADO2( oRs, aCamposList, { | aCamposList, nKey | bRotinaUsuario( oRs, aCamposList, nkey ) } )
Até testei defini-la como private na tbrowseado inicial, mas dá ambiguos reference na compilação. Então, deixei como estava originalmente.
Posto a função completa como está agora para conferência:

Código: Selecionar todos

/*
Exibição das linhas de um Record set ADO usando TBrowseDB()
Alexandre Santos
Compilar: Hbmk2 tbado hbwin.hbc
*/

#pragma -w3
#pragma -es2
#include "tbrowse.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "hbgtinfo.ch"
#include "box.ch"
#include "set.ch"
#include "hbclass.ch"

REQUEST HB_CODEPAGE_PTISO

FUNCTION Tbrowseado(cSql)
   LOCAL oRs, aCamposList
   LOCAL oCN :=ConexaoMySQL( "xxx.com.br", "xxx", "xxx", "xxx" )
   local tela :=savescreen(0,0,maxrow(),maxcol())

   Set( _SET_CODEPAGE, "PTISO" )
   Set( _SET_EVENTMASK, INKEY_ALL + HB_INKEY_GTEVENT - INKEY_MOVE )
   SET DATE BRITISH

*   hb_gtInfo( HB_GTI_WINTITLE , "TBrowse colorBlock() com Acesso ao MySQL via ADO" )
*   hb_gtInfo( HB_GTI_FONTNAME , "Lucida Console" )
   SetColor( "W/B","N/W",,,"W/B" )
   CLS

   oCn:open()

   DO WHILE .T.
      @ 4, MaxRow() SAY Padr( "Obtendo informações...", 22 ) COLOR "W/W"
      oRs := oCn:Execute( cSql )
      SuperADO( oRs )
      IF oRs == NIL .OR. oRs:Eof()
         Hb_Alert( "Não foi possível obter dados para exibição",, "W+/B" )
         EXIT
      ENDIF
      aCamposList := { ;
         { "DATA",       { || oRs:ToDate( "DATA" ) } }, ;
         { "HORA",       { || oRs:ToString( "HORA", 8 ) } }, ;
         { "COMIDA",     { || oRs:ToString( "COMIDA", 30 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
         { "QUANTIDADE", { || oRs:ToString( "QUANTIDADE", 20 )  } }, ;
         { "PONTOS",     { || oRs:ToStr( "PONTOS", 6 ) } }, ;
         { "ID",         { || oRs:ToStr( "ID", 6 ) } } }

		 
      tBrowseADO2( oRs, aCamposList, { | aCamposList, nKey | bRotinaUsuario( oRs, aCamposList, nkey ) } )
*      IF Alert( "Fechar?", { " Não ", " Sim " }, "W+/N" ) == 2
         oRs:Close()
         EXIT
*      ENDIF
*      EXIT
   ENDDO
   oCn:close()

   rest scre from tela
RETURN Nil


FUNCTION TBrowseADO2( oRs, aCamposList, bRotinaUsuario )
   LOCAL oBrowse, nKey

   oBrowse := CriaBrowse( oRs, aCamposList )

   DispBox( oBrowse:nTop - 1, oBrowse:nLeft - 1, oBrowse:nBottom + 3, oBrowse:nRight + 1, B_SINGLE )

   DO WHILE .T.

      oBrowse:refreshCurrent()
      DO WHILE ! oBrowse:Stable()
         oBrowse:Stabilize()
      ENDDO
      // Paint TBrowse current line...
      //oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:LeftVisible, oBrowse:RowPos, oBrowse:RightVisible }, { 2, 1 } )

      @ MaxRow() - 1, 3 SAY Padr( " Registro " + Ltrim( Str( oRs:AbsolutePosition ) ) + " de " + Ltrim( Str( oRs:recordCount ) ) + " ", 20 ) COLOR "N/W"

      nKey := Inkey(0)
      IF oBrowse:applyKey( nKey ) == TBR_EXIT
         EXIT
      ENDIF
      IF bRotinaUsuario != NIL
         DO WHILE ! oBrowse:Stable
            oBrowse:Stabilize()
         ENDDO
         Eval( bRotinaUsuario, oBrowse, oRs, nKey )
         oBrowse:RefreshAll()
      ENDIF

   ENDDO

   RETURN Nil

STATIC FUNCTION CriaBrowse( oRs, aCamposList )
   LOCAL oBrowse, oColumn, aItem, nLen, nCont

   oBrowse := TBrowse():new( 02, 3, MaxRow() - 3, MaxCol() - 3 )
   oBrowse:headSep       := Chr(196) + Chr(194) + Chr(196)
   oBrowse:colSep        := " " + Chr(179) + " "
   oBrowse:footSep       := Chr(196) + Chr(193) + Chr(196)
   oBrowse:goTopBlock    := { || oRs:moveFirst() }
   oBrowse:goBottomBlock := { || oRs:moveLast() }
   oBrowse:skipBlock     := { |n| ADORecordSetSkipper( oRs,n ) }
   oBrowse:colorSpec     := "W/B,W+/N,N/W*,W+/R,R+/B,R/W*"

   IF aCamposList == Nil
      nLen := oRs:fields():count() - 1
      FOR nCont := 0 TO nLen
         oColumn := TBColumnNew( oRs:fields( nCont ):name(), ADORecordSetFieldBlock( oRs, nCont ) )
         oColumn:width := Max( Min( oRs:Fields( nCont ):definedSize,50), Len( oRs:fields( nCont ):name ) ) + 5
         oBrowse:addColumn( oColumn )
      NEXT
   ELSE
      FOR EACH aItem IN aCamposList
         oColumn := TBColumnNew( aItem[1], aItem[2] )
         IF Len( aItem ) > 2
            oColumn:ColorBlock := aItem[3]
         ENDIF
         oBrowse:AddColumn( oColumn )
      NEXT
   ENDIF
RETURN oBrowse

STATIC FUNCTION ADORecordSetFieldBlock( oRs, i, xVal )
   LOCAL bRet

   IF xVal == NIL
      IF oRs:Eof()
         bRet := { || Space( Max( oRs:Fields( i ):DefinedSize , Len( oRs:Fields( i ):name ) ) ) }
      ELSE
         bRet := { || oRs:Fields( i ):value }
      ENDIF
   ELSE
      bRet := { |xVal| oRs:Fields( i ):Value := xVal }
   ENDIF

RETURN bRet

STATIC FUNCTION ADORecordSetSkipper(oRecordSet,nSkip)
   LOCAL nRec := oRecordSet:AbsolutePosition

   IF ! ( oRecordSet:eof )
      oRecordSet:Move( nSkip )

      IF oRecordSet:eof
         oRecordSet:moveLast()
      ENDIF

      IF oRecordSet:bof
         oRecordSet:moveFirst()
      ENDIF
   ENDIF

RETURN (oRecordSet:AbsolutePosition - nRec)

   
STATIC FUNCTION ConexaoMySQL( cServer, cDatabase, cUser, cPassword )

   LOCAL oCn := win_OleCreateObject("ADODB.Connection")

   oCn:ConnectionString := "DRIVER={MariaDB ODBC 3.1 Driver};TCPIP=1;SERVER=" + ;
      cServer + ";Database=" + cDatabase + ";UID=" + cUser + ";PWD=" + cPassword + ";PORT=3306"
   oCn:CursorLocation   := 3

RETURN oCn


FUNCTION SuperADO( oRs )

   __ObjAddMethod( oRs, "TOSTRING", @ADOToString() )
   __ObjAddMethod( oRs, "TONUMBER", @ADOToNumber() )
   __ObjAddMethod( oRs, "TODATE",   @ADOToDate() )
   __ObjAddMethod( oRs, "TOSTR",    @ADOToStr() )

RETURN Nil

STATIC FUNCTION ADOToDate( cField )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "D"
      x := Ctod("")
   ENDIF
RETURN x

STATIC FUNCTION ADOToString( cField, nLen )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "C"
      x := ""
   ENDIF
   IF nLen != Nil
      x := Pad( x, nLen )
   ENDIF
RETURN x

STATIC FUNCTION ADOToNumber( cField )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "N"
      x := 0
   ENDIF

RETURN x

STATIC FUNCTION ADOToStr( cField, nLen, nDec )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "N"
      x := 0
   ENDIF
   IF nLen == Nil
      x := Str( x )
   ELSEIF nDec == Nil
      x := Str( x, nLen )
   ELSE
      x := Str( x, nLen, nDec )
   ENDIF

RETURN x

STATIC FUNCTION bRotinaUsuario( oBrowse, aCamposList, nKey )
   IF nKey == K_F5
      Alert( "Foi teclado F5" )
      Alert( oBrowse:ToString( "COMIDA" ) )
      aCamposList:RefreshAll()
   ENDIF

RETURN 1

   

cor no tbrowse

Enviado: 03 Set 2021 12:26
por JoséQuintas
ERRO MEU.

O codeblock é intermediário entre o browse e a rotina de usuário.

Código: Selecionar todos

 { | oBrowse, nKey | RotinaUsuario( oRs, oBrowse, nkey ) }
Ele recebe apenas DOIS parâmetros.
A rotina de usuário é que vai receber TRES.


Altere na chamada pra isto, igual ao codeblock, repassando 2 parâmetros pro codeblock

Código: Selecionar todos

 Eval( bFuncaoUsuario, oBrowse, nKey )
E a função de usuário ok, vai receber 3.

Código: Selecionar todos

STATIC FUNCTION RotinaUsuario( oRs, oBrowse, nKey )

   IF nKey == K_F5
      Alert( "Foi teclado F5" )
      Alert( oRs:ToString( "COMIDA" ) )
      oBrowse:RefreshAll()
   ENDIF
	 
   RETURN 1
Pra não confundir de novo, talvez alterar o nome de bFuncaoUsuario pra bExecutaFuncaoUsuario, porque é isso que o codeblock faz.
Ele NÃO é a função de usuário, ele é só o intermediário de chamada.

Como foram parâmetros diferentes, foi por isso que deu erro em nkey.

só atenção ao nome da função de usuário, não precisa o B nem na definição de codeblock, nem na própria função.
função de usuário é uma coisa, A VARIÁVEL do codeblock é outra.

Código: Selecionar todos

 { | oBrowse, nKey | RotinaUsuario( oRs, oBrowse, nkey ) }
...
Eval( bExecutaFuncaoUsuario, oBrowse, nKey )
...
FUNCTION RotinaUsuario( oRs, oBrowse, nKey )

cor no tbrowse

Enviado: 03 Set 2021 12:43
por JoséQuintas
Ajustada e separada, sobre o que pertence ao browse ou ao aplicativo.
browseado.zip
(2.71 KiB) Baixado 74 vezes

cor no tbrowse

Enviado: 03 Set 2021 12:45
por JoséQuintas
Em todo caso:
Aqui a rotina de browse, e mais algumas de ADO, que vão ser usadas em todo aplicativo.

Código: Selecionar todos

#pragma -w3
#pragma -es2

#include "tbrowse.ch"
#include "inkey.ch"
#include "box.ch"

FUNCTION TBrowseADO2( oRs, aCamposList, bExecutaRotinaUsuario )
   LOCAL oBrowse, nKey

   oBrowse := CriaBrowse( oRs, aCamposList )

   DispBox( oBrowse:nTop - 1, oBrowse:nLeft - 1, oBrowse:nBottom + 3, oBrowse:nRight + 1, B_SINGLE )

   DO WHILE .T.

      oBrowse:refreshCurrent()
      DO WHILE ! oBrowse:Stable()
         oBrowse:Stabilize()
      ENDDO
      // Paint TBrowse current line...
      //oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:LeftVisible, oBrowse:RowPos, oBrowse:RightVisible }, { 2, 1 } )

      @ MaxRow() - 1, 3 SAY Padr( " Registro " + Ltrim( Str( oRs:AbsolutePosition ) ) + " de " + Ltrim( Str( oRs:recordCount ) ) + " ", 20 ) COLOR "N/W"

      nKey := Inkey(0)
      IF oBrowse:applyKey( nKey ) == TBR_EXIT
         EXIT
      ENDIF
      IF bExecutaRotinaUsuario != NIL
         DO WHILE ! oBrowse:Stable
            oBrowse:Stabilize()
         ENDDO
         Eval( bExecutaRotinaUsuario, oBrowse, nKey )
         oBrowse:RefreshAll()
      ENDIF

   ENDDO

   RETURN Nil

STATIC FUNCTION CriaBrowse( oRs, aCamposList )
   LOCAL oBrowse, oColumn, aItem, nLen, nCont

   oBrowse := TBrowse():new( 02, 3, MaxRow() - 3, MaxCol() - 3 )
   oBrowse:headSep       := Chr(196) + Chr(194) + Chr(196)
   oBrowse:colSep        := " " + Chr(179) + " "
   oBrowse:footSep       := Chr(196) + Chr(193) + Chr(196)
   oBrowse:goTopBlock    := { || oRs:moveFirst() }
   oBrowse:goBottomBlock := { || oRs:moveLast() }
   oBrowse:skipBlock     := { |n| ADORecordSetSkipper( oRs,n ) }
   oBrowse:colorSpec     := "W/B,W+/N,N/W*,W+/R,R+/B,R/W*"

   IF aCamposList == Nil
      nLen := oRs:fields():count() - 1
      FOR nCont := 0 TO nLen
         oColumn := TBColumnNew( oRs:fields( nCont ):name(), ADORecordSetFieldBlock( oRs, nCont ) )
         oColumn:width := Max( Min( oRs:Fields( nCont ):definedSize,50), Len( oRs:fields( nCont ):name ) ) + 5
         oBrowse:addColumn( oColumn )
      NEXT
   ELSE
      FOR EACH aItem IN aCamposList
         oColumn := TBColumnNew( aItem[1], aItem[2] )
         IF Len( aItem ) > 2
            oColumn:ColorBlock := aItem[3]
         ENDIF
         oBrowse:AddColumn( oColumn )
      NEXT
   ENDIF
RETURN oBrowse

STATIC FUNCTION ADORecordSetFieldBlock( oRs, i, xVal )
   LOCAL bRet

   IF xVal == NIL
      IF oRs:Eof()
         bRet := { || Space( Max( oRs:Fields( i ):DefinedSize , Len( oRs:Fields( i ):name ) ) ) }
      ELSE
         bRet := { || oRs:Fields( i ):value }
      ENDIF
   ELSE
      bRet := { |xVal| oRs:Fields( i ):Value := xVal }
   ENDIF

RETURN bRet

STATIC FUNCTION ADORecordSetSkipper(oRecordSet,nSkip)
   LOCAL nRec := oRecordSet:AbsolutePosition

   IF ! ( oRecordSet:eof )
      oRecordSet:Move( nSkip )

      IF oRecordSet:eof
         oRecordSet:moveLast()
      ENDIF

      IF oRecordSet:bof
         oRecordSet:moveFirst()
      ENDIF
   ENDIF

RETURN (oRecordSet:AbsolutePosition - nRec)


FUNCTION SuperADO( oRs )

   __ObjAddMethod( oRs, "TOSTRING", @ADOToString() )
   __ObjAddMethod( oRs, "TONUMBER", @ADOToNumber() )
   __ObjAddMethod( oRs, "TODATE",   @ADOToDate() )
   __ObjAddMethod( oRs, "TOSTR",    @ADOToStr() )

RETURN Nil

STATIC FUNCTION ADOToDate( cField )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "D"
      x := Ctod("")
   ENDIF
RETURN x

STATIC FUNCTION ADOToString( cField, nLen )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "C"
      x := ""
   ENDIF
   IF nLen != Nil
      x := Pad( x, nLen )
   ENDIF
RETURN x

STATIC FUNCTION ADOToNumber( cField )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "N"
      x := 0
   ENDIF

RETURN x

STATIC FUNCTION ADOToStr( cField, nLen, nDec )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "N"
      x := 0
   ENDIF
   IF nLen == Nil
      x := Str( x )
   ELSEIF nDec == Nil
      x := Str( x, nLen )
   ELSE
      x := Str( x, nLen, nDec )
   ENDIF

RETURN x
Aqui o que é específico desse "módulo"/browse.

Código: Selecionar todos

/*
Exibição das linhas de um Record set ADO usando TBrowseDB()
Alexandre Santos
Compilar: Hbmk2 tbado hbwin.hbc
*/

#pragma -w3
#pragma -es2
#include "tbrowse.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "hbgtinfo.ch"
#include "set.ch"
#include "hbclass.ch"

REQUEST HB_CODEPAGE_PTISO

FUNCTION Tbrowseado(cSql)
   LOCAL oRs, aCamposList
   LOCAL oCN := ConexaoMySQL( "mysql.xxx.com.br", "xxx", "xxx", "xxx" )
   local tela :=savescreen(0,0,maxrow(),maxcol())

   Set( _SET_CODEPAGE, "PTISO" )
   Set( _SET_EVENTMASK, INKEY_ALL + HB_INKEY_GTEVENT - INKEY_MOVE )
   SET DATE BRITISH

*   hb_gtInfo( HB_GTI_WINTITLE , "TBrowse colorBlock() com Acesso ao MySQL via ADO" )
*   hb_gtInfo( HB_GTI_FONTNAME , "Lucida Console" )
   SetColor( "W/B","N/W",,,"W/B" )
   CLS

   oCn:open()

   DO WHILE .T.
      @ 4, MaxRow() SAY Padr( "Obtendo informações...", 22 ) COLOR "W/W"
      oRs := oCn:Execute( cSql )
      SuperADO( oRs )
      IF oRs == NIL .OR. oRs:Eof()
         Hb_Alert( "Não foi possível obter dados para exibição",, "W+/B" )
         EXIT
      ENDIF
      aCamposList := { ;
         { "DATA",       { || oRs:ToDate( "DATA" ) } }, ;
         { "HORA",       { || oRs:ToString( "HORA", 8 ) } }, ;
         { "COMIDA",     { || oRs:ToString( "COMIDA", 30 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
         { "QUANTIDADE", { || oRs:ToString( "QUANTIDADE", 20 )  } }, ;
         { "PONTOS",     { || oRs:ToStr( "PONTOS", 6 ) } }, ;
         { "ID",         { || oRs:ToStr( "ID", 6 ) } } }


      tBrowseADO2( oRs, aCamposList, { | oBrowse, nKey | RotinaUsuario( oRs, oBrowse, nkey ) } )
*      IF Alert( "Fechar?", { " Não ", " Sim " }, "W+/N" ) == 2
         oRs:Close()
         EXIT
*      ENDIF
*      EXIT
   ENDDO
   oCn:close()

   rest scre from tela
RETURN Nil


STATIC FUNCTION ConexaoMySQL( cServer, cDatabase, cUser, cPassword )

   LOCAL oCn := win_OleCreateObject("ADODB.Connection")

   oCn:ConnectionString := "DRIVER={MariaDB ODBC 3.1 Driver};TCPIP=1;SERVER=" + ;
      cServer + ";Database=" + cDatabase + ";UID=" + cUser + ";PWD=" + cPassword + ";PORT=3306"
   oCn:CursorLocation   := 3

RETURN oCn

STATIC FUNCTION RotinaUsuario( oRs, oBrowse, nKey )
   IF nKey == K_F5
      Alert( "Foi teclado F5" )
      Alert( oRs:ToString( "COMIDA" ) )
      oBrowse:RefreshAll()
   ENDIF

RETURN 1

cor no tbrowse

Enviado: 03 Set 2021 13:38
por JoséQuintas
Ainda não entendi porque browseADO() vai receber um comando SQL e chamar browseADO2()
Tá me parecendo que vai fazer a mesma coisa que antes, e embolar tudo no browseADO().


Voltando ao browse, ainda falta o assunto do post nele.

Se olhar CriaBrowse, ela vai definir a tabela de cores

Código: Selecionar todos

   oBrowse:colorSpec     := "W/B,W+/N,N/W*,W+/R,R+/B,R/W*"
E vai usar o terceiro parâmetro de aCamposList, como o codeblock da cor

Código: Selecionar todos

         IF Len( aItem ) > 2
            oColumn:ColorBlock := aItem[3]
         ENDIF
O único lugar que precisa mexer agora é no browse propriamente dito.

Código: Selecionar todos

FUNCTION TBrowseADO2( oRs, aCamposList, bExecutaRotinaUsuario )
   LOCAL oBrowse, nKey

   oBrowse := CriaBrowse( oRs, aCamposList )

   DispBox( oBrowse:nTop - 1, oBrowse:nLeft - 1, oBrowse:nBottom + 3, oBrowse:nRight + 1, B_SINGLE )

   DO WHILE .T.

      oBrowse:refreshCurrent()
      DO WHILE ! oBrowse:Stable()
         oBrowse:Stabilize()
      ENDDO
      // Paint TBrowse current line...
      //oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:LeftVisible, oBrowse:RowPos, oBrowse:RightVisible }, { 2, 1 } )

      @ MaxRow() - 1, 3 SAY Padr( " Registro " + Ltrim( Str( oRs:AbsolutePosition ) ) + " de " + Ltrim( Str( oRs:recordCount ) ) + " ", 20 ) COLOR "N/W"

      nKey := Inkey(0)
      IF oBrowse:applyKey( nKey ) == TBR_EXIT
         EXIT
      ENDIF
      IF bExecutaRotinaUsuario != NIL
         DO WHILE ! oBrowse:Stable
            oBrowse:Stabilize()
         ENDDO
         Eval( bExecutaRotinaUsuario, oBrowse, nKey )
         oBrowse:RefreshAll()
      ENDIF

   ENDDO

   RETURN Nil
Na rotina acima, é onde vai ser feito o tratamento da "pintura", é ela quem faz todo trabalho de navegação/pintura/atualização de tela/etc
Tem até anotado um ColorRect()

Na verdade nem sei se vai precisar mexer, já que a cor fica na coluna. faça os testes.

cor no tbrowse

Enviado: 03 Set 2021 15:26
por cjp
Agora funcionou.
Mas ainda tenho dois problemas que eu já havia relatado antes: 1) o erro no colation, que ocorre em outras partes do meu sistema depois que eu uso esta função; 2) o erro de acentuação no meu sistema, também depois de usar esta função.
Imagino que isso possa estar ocorrendo por causa do REQUEST HB_CODEPAGE_PTISO. Seria isso? Como resolvo isto?

cor no tbrowse

Enviado: 03 Set 2021 18:57
por JoséQuintas
Tá brincando né?

BrowseADO() seria a rotina do seu aplicativo, não tem nada a ver com a rotina de browse.

apague isto

Código: Selecionar todos

  Set( _SET_CODEPAGE, "PTISO" )
   Set( _SET_EVENTMASK, INKEY_ALL + HB_INKEY_GTEVENT - INKEY_MOVE )
   SET DATE BRITISH

*   hb_gtInfo( HB_GTI_WINTITLE , "TBrowse colorBlock() com Acesso ao MySQL via ADO" )
*   hb_gtInfo( HB_GTI_FONTNAME , "Lucida Console" )
   SetColor( "W/B","N/W",,,"W/B" )
   CLS
Provavelmente também a conexão deve ser outra.

cor no tbrowse

Enviado: 03 Set 2021 19:02
por JoséQuintas
Isto seria seu fonte normal, do seu aplicativo, é com você.

Código: Selecionar todos

#include "inkey.ch"

FUNCTION Tbrowseado(cSql)
   LOCAL oRs, aCamposList
   LOCAL oCN := ConexaoMySQL( "mysql.xxx.com.br", "xxx", "xxx", "xxx" )
   local tela :=savescreen(0,0,maxrow(),maxcol())

   oCn:open()

   DO WHILE .T.
      @ 4, MaxRow() SAY Padr( "Obtendo informações...", 22 ) COLOR "W/W"
      oRs := oCn:Execute( cSql )
      SuperADO( oRs )
      IF oRs == NIL .OR. oRs:Eof()
         Hb_Alert( "Não foi possível obter dados para exibição",, "W+/B" )
         EXIT
      ENDIF
      aCamposList := { ;
         { "DATA",       { || oRs:ToDate( "DATA" ) } }, ;
         { "HORA",       { || oRs:ToString( "HORA", 8 ) } }, ;
         { "COMIDA",     { || oRs:ToString( "COMIDA", 30 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
         { "QUANTIDADE", { || oRs:ToString( "QUANTIDADE", 20 )  } }, ;
         { "PONTOS",     { || oRs:ToStr( "PONTOS", 6 ) } }, ;
         { "ID",         { || oRs:ToStr( "ID", 6 ) } } }

      tBrowseADO2( oRs, aCamposList, { | oBrowse, nKey | RotinaUsuario( oRs, oBrowse, nkey ) } )
         oRs:Close()
         EXIT
   ENDDO
   oCn:close()

   rest scre from tela
RETURN Nil

STATIC FUNCTION RotinaUsuario( oRs, oBrowse, nKey )
   IF nKey == K_F5
      Alert( "Foi teclado F5" )
      Alert( oRs:ToString( "COMIDA" ) )
      oBrowse:RefreshAll()
   ENDIF

RETURN 1

cor no tbrowse

Enviado: 03 Set 2021 19:04
por JoséQuintas
E aí já dá pra ver outra coisa pra melhorar.

Vai ficar testando se Rs == Nil em tudo que é rotina que chama o browse ?
É colocar isso direto no BrowseADO2() e pronto.
Também pode colocar o superADO() no browseADO2()

NÃO CONFUNDA o browse, com suas rotinas de pesquisa.
O browse genérico é pra eliminar fonte, sem ter particularidades de nenhuma consulta.
Qualquer coisa que precise diferente, é usar o aCamposList e o codeblock bExecuteRotinaUsuario.

De novo: tá parecendo que vai fazer uma BrowseADO() pra todas as consultas do aplicativo, e ficar colocando toda configuração aí, o que volta na estaca ZERO, e todo esse trabalho não serviu pra nada.

cor no tbrowse

Enviado: 03 Set 2021 20:06
por cjp
Vamos ver se consigo ser mais claro nessa questão:

Eu coloquei esta função tbrowseado() que acabamos de acertar no meu sistema, que tem dezenas de outras funções. Mas, por ora, estou usando ela para apenas uma aplicação, uma situação apenas, não a tornei genérica ainda (gostaria de fazer isso, para substituir a outra genérica que já tenho, que foi feita também com base em ensinamentos teus, e que está com alguns problemas, mas ainda não sei bem como fazer isso).

Pois bem, quando uso esta função, ao sair dela (permanecendo no meu sistema), dava os dois problemas que te mencionei nas demais funções da minha aplicação. Mas agora, depois que excluí a parte da tbrowseado() que vc recomendou, os dois erros deixaram de ocorrer. Portanto, problema resolvido, obrigado.

Agora eu só preciso ver como tornar essa função genérica, para uso em toda a minha aplicação, como a antiga, mas sem virar a confusão que a antiga virou. Vou ter que estudar melhor isso.

De qualquer forma, reitero o agradecimento por toda a ajuda neste tópico. Agora a questão da cor (que deu início a este tópico gigante) foi finalmente resolvida.

cor no tbrowse

Enviado: 04 Set 2021 01:37
por cjp
Estou tentando fazer a função de usuário, mas está dando erro na compilação. Teria algo errado nisto:

Código: Selecionar todos

STATIC FUNCTION RotinaUsuario( oRs, oBrowse, nKey )
       local nPt
	   
   IF nKey == K_F5
      Alert( "Foi teclado F5" )
      Alert( oRs:ToString( "COMIDA" ) )
      oBrowse:RefreshAll()
   elseif nkey ==13
	  nPt=0
	  @ maxrow()-4,35 say "Pontos:"get nPt pict "999.99"
	  read 
	  if lastkey()#27
		 exqado("update pontos set pontos="+alltrim(str(nPt))+" where id="+alltrim(str(cod)))
	  endif
	  @ maxrow()-4,35 clear to maxrow()-4,77
			 
   ENDIF

RETURN 1   
Uma outra dúvida, por favor: tentei colocar o campo PONTOS também em vermelho na mesma linha do total, mas sei como fazer isto.

Tentei o óbvio:

Código: Selecionar todos

         { "PONTOS",     { || oRs:ToStr( "PONTOS", 6 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
Mas assim não funcionou.

Como ainda não entendi esse codeblock, não soube adaptar. Pode me ajudar?

cor no tbrowse

Enviado: 04 Set 2021 07:11
por JoséQuintas
cjp escreveu:Eu coloquei esta função tbrowseado() que acabamos de acertar no meu sistema
ISSO NÃO É A FUNÇÃO DE BROWSE.
Você chamou a função de browseado2().

cor no tbrowse

Enviado: 04 Set 2021 07:13
por JoséQuintas
cjp escreveu:Estou tentando fazer a função de usuário, mas está dando erro na compilação. Teria algo errado nisto:
Se está dando erro de compilação, a mensagem da compilação já deve estar dizendo do que se trata.