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.
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