A minha função genérica está assim:
Código: Selecionar todos
FUNCTION TBrowseADO( oRsBrAdo, aCamposList, bExecutaRotinaUsuario )
LOCAL oBrowse, nKey
SuperADO( oRsBrAdo )
oBrowse := CriaBrowse( oRsBrAdo, aCamposList )
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 } )
if us="I"
nKey := Inkey(300)
else
nKey := Inkey(100)
endif
IF nKey == 0
if us="I"
KEYBOARD Chr( K_ESC )
nKey := Inkey(0)
else
KEYBOARD -18
endif
ENDIF
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( oRsBrAdo, aCamposList )
LOCAL oBrowse, oColumn, aItem, nLen, nCont
if procname(2)="BROWSEITEM"
oBrowse := TBrowse():new( 07, 1, MaxRow() - 5, MaxCol() - 1 )
else
oBrowse := TBrowse():new( 02, 3, MaxRow() - 3, MaxCol() - 3 )
endif
oBrowse:headSep := Chr(196) + Chr(194) + Chr(196)
oBrowse:colSep := " " + Chr(179) + " "
oBrowse:footSep := Chr(196) + Chr(193) + Chr(196)
oBrowse:goTopBlock := { || oRsBrAdo:moveFirst() }
oBrowse:goBottomBlock := { || oRsBrAdo:moveLast() }
oBrowse:skipBlock := { |n| ADORecordSetSkipper( oRsBrAdo,n ) }
if us#"I" .and. (procname(1)="ENTERITEM" .or. procname(2)="ENTERITEM" .or. procname(3)="ENTERITEM" .or. procname(4)="ENTERITEM" .or. procname(5)="ENTERITEM" .or. procname(6)="ENTERITEM" .or. procname(7)="ENTERITEM")
keysec(-18,115,-1,.t.)
else
keysec(27,1200,-1,.t.)
endif
IF aCamposList == Nil
nLen := oRsBrAdo:fields():count() - 1
FOR nCont := 0 TO nLen
oColumn := TBColumnNew( oRsBrAdo:fields( nCont ):name(), ADORecordSetFieldBlock( oRsBrAdo, nCont ) )
oColumn:width := Max( Min( oRsBrAdo:Fields( nCont ):definedSize,50), Len( oRsBrAdo: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
FUNCTION SuperADO( oRsBrAdo )
__ObjAddMethod( oRsBrAdo, "TOSTRING", @ADOToString() )
__ObjAddMethod( oRsBrAdo, "TONUMBER", @ADOToNumber() )
__ObjAddMethod( oRsBrAdo, "TODATE", @ADOToDate() )
__ObjAddMethod( oRsBrAdo, "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
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
Alterei oRs para oRsBrAdo para não ter a menor chance de ela ser alterada em nenhuma outra parte do sistema.
Na função de usuário tem também:
LOCAL oCnBrAdo :=ConexaoMySQL( "mysql.meuprovedor.com.br", "xxx", "xxx", "senha" )
A variável conexao2 está como private porque a Adoconecta usa ela, assim:
Código: Selecionar todos
function ADOconecta(nProvedor,nTentativas,nConexao)
local vez :=0
local cRet :="F"
nTentativas=2 // para diminuir tentativas quando não tiver conexão
bError := ErrorBlock( {|e| Break(e) } )
begin sequence
if nProvedor=NIL
nProvedor=3
endif
if nTentativas=NIL
nTentativas=3
endif
recover using e
cMessage := ErrorMessage(e)
logerro()
mandmail1("error.log","Erro na ADOconnecta1 contornado com o recover do begin sequence")
endsequence
ErrorBlock( bError )
do while .t.
bError := ErrorBlock( {|e| Break(e) } )
begin sequence
vez++
if vez>1
@ maxrow()-1,1 say "Tentando conexão com o servidor "+alltrim(str(nProvedor))+" ("+alltrim(str(vez))+"/"+alltrim(str(nTentativas+1))+")"
inkey(5.1)
endif
recover using e
cMessage := ErrorMessage(e)
logerro()
mandmail1("error.log","Erro na ADOconnecta2 contornado com o recover do begin sequence")
endsequence
ErrorBlock( bError )
if vez>nTentativas
if nProvedor=12 .or. nProvedor=1 //.and. ("AGENDA"$Hb_CmdArgArgV() .or. "PROCESSO"$Hb_CmdArgArgV())
mandmail1("","Mudou nProvAtiv para 3 na ADOconecta porque não funcionou no "+alltrim(str(nProvedor)))
nProvAtiv=3
endif
return .f.
endif
bError := ErrorBlock( {|e| Break(e) } )
begin sequence
if nConexao=2
conexao2 := conexADO(nProvedor)
else
conexao := conexADO(nProvedor)
endif
recover using e
cMessage := ErrorMessage(e)
logerro()
mandmail1("error.log","Erro na ADOconnecta3 contornado com o recover do begin sequence")
endsequence
ErrorBlock( bError )
bError := ErrorBlock( {|e| Break(e) } )
begin sequence
IF (nConexao=2 .and. AbreADO(conexao2)) .or. AbreADO( conexao )
if vez>1
@ maxrow()-1,1 clear to maxrow()-1,40
endif
cRet="T"
Endif
recover using e
cMessage := ErrorMessage(e)
logerro()
mandmail1("error.log","Erro na ADOconnecta4 contornado com o recover do begin sequence")
endsequence
ErrorBlock( bError )
if cRet="T"
return .t.
endif
enddo
return .t.
Talvez dê para melhorar isso.
Mas, ao que me parece (me corrija se eu estiver errado), nem a veronus() nem a adoconecta() está encerrando a conexão do browse.
Eu não creio que o problema seja queda de conexão, ou ODBC errado, ou Windows derrubando, pois o problema tem ocorrido somente neste ponto do sistema, e sempre no mesmo ponto. Além disso, só passou a dar este problema depois que eu mudei para este browse genérico (quando eu uso o meu browse anterior, aquele confuso, não ocorre o problema).
Consegue dar uma luz de onde eu poderia procurar o problema? Aqui não estou enxergando nada.