O que elas tem de diferente?
Ao que me parece, nada de especial.
A primeira, que quase sempre funciona, é chamada assim:
consado("SELECT nrtarefa,assunto,prioridade,data,hora,tarefa FROM tarefas WHERE prioridade>0 AND soluc='N' AND (exibe='N' OR exibe='I') AND (now())>=hrexibe AND vinculo<>'MP' AND data>='"+dtsql(dtapart)+"' GROUP BY nrtarefa ORDER BY prioridade DESC,data,nrtarefa")
A segunda, que quase nunca funciona, está sendo chamada assim:
consado("select * from compras where codprod>0")
Chamadas por SET KEY, ou num prompt, ou misturadas com tbrowse?
Nenhuma delas está sendo chamada por SET KEY, só por prompt.
Lembro daquele fonte que precisou ajuda, onde misturava o tbrowse com rotina de menu.
Não é neste fonte que está dando problema não. É em outro, que eu já tinha feito antes, com base neste post.
Algo como MeuBrowse( linha, coluna, linha, coluna, { || FuncaoDeUsuario() } )
Preciso entender como fazer isso. Estou fazendo uma nova rotina, para não ter mais problema com o cursor, queria fazer já da forma correta.
A nova rotina que fiz está assim:
function ADObrowse(sql)
#include "tbrowse.ch"
LOCAL oColumn, I, nLen, oTBrowse, oRs, nFieldLen
local nKey :=99999 //precisa ser private para o respsql
private conexao
@ 22,25 say "Abrindo consulta..."
do while .t.
if !AdoConecta(nProvAtiv,5)
?"Não conseguiu conectar; tente novamente mais tarde"
inkey(5)
return .f.
else
oRS := Conexao:Execute( sql )
endif
if oRS:Eof()
@ 22,25 say "Não há nenhum item "
inkey(11)
inkey(11)
return .f.
endif
cls
oTBrowse := TBrowseDB():new( 03, 3, MaxRow() - 5, 30 )
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 ) )
nFieldLen := 13
oColumn:Width := Max( nFieldLen, Len( oRs:fields(i):name ) )
oTBrowse:addColumn( oColumn )
NEXT
do while .t.
oTBrowse:forceStable()
oTBrowse:refreshCurrent()
nKey := Inkey(0)
set cursor on
if nkey ==13 .and. procname(2)="CONSATIV" .and. ophrtar=5
ac1=oRs:Fields("acao"):Value
exit
endif
IF oTBrowse:applyKey( nKey ) == TBR_EXIT
EXIT
ENDIF
enddo
exit
ENDDO
oRs:Close()
Conexao:Close()
return .t.
Por enquanto ela está servindo a apenas uma função, e está exibindo o cursor sem problema.
Vou precisar fazê-la para todas as demais funções. Qual é a melhor forma de fazer isso?