Página 1 de 2
localização e posicionamento do browse usando ADO/recordset
Enviado: 14 Nov 2024 02:11
por cjp
Pessoal, por favor, peço ajuda nesta questão: estou fazendo um browse de uma tabela MySQL usando ADO, com recordset. Ao iniciar o browse, gostaria de posicionar o ponteiro no primeiro registro em que o campo marcacao esteja em branco.
Fiz assiM:
Código: Selecionar todos
do while !oRs:eof()
if oRs:Fields("marcacao"):Value="*" .or. oRs:Fields("marcacao"):Value="-"
oRs:movenext()
else
exit
endif
enddo
Deste jeito, ele está posicionando no registro seguinte ao primeiro em que o campo marcacao esteja em branco, não no registro em si.
Até tentei usar oRs:moveprevious() antes do exit, mas não resolveu.
Também testei usar keyb chr(5), igualmente sem sucesso.
E o pior é que o browse fica estranho, pois, na abertura, dá a impressão que está no primeiro registro, mas, ao teclar seta pra cima ou pra baixo, dá pra ver que o cursor está no registro seguinte ao que eu pretendia.
Alguém poderia me ajudar com isto, por favor?
localização e posicionamento do browse usando ADO/recordset
Enviado: 14 Nov 2024 10:26
por JoséQuintas
Não entendi, perguntou sobre browse mas mostrou um do while pulando registro.
localização e posicionamento do browse usando ADO/recordset
Enviado: 14 Nov 2024 17:13
por cjp
Este do while está na função de usuário do browse. Se precisar, eu posto o código inteiro.
O movefirst(), se não estou enganado, vai mover o cursor para o primeiro registro do browse, né? Não é isso que preciso. Preciso mover para o primeiro registro que tenha o campo marcacao sem *, ou seja, que esteja desmarcado.
localização e posicionamento do browse usando ADO/recordset
Enviado: 14 Nov 2024 17:28
por JoséQuintas
Se está desposicionando com a função de usuário, isso explica o browse ficar maluco.
Na tela está numa posição e internaente está em outra posição.
Com isso, mexer com setas vai atualizar com outro registro diferente do que está na tela.
Talvez precise atualizar o browse a partir dessa função de usuário, pro browse saber que não está mais no mesmo registro.
localização e posicionamento do browse usando ADO/recordset
Enviado: 14 Nov 2024 17:48
por Itamar M. Lins Jr.
Olá!
Use seek
Saudações,
Itamar M. Lins Jr.
localização e posicionamento do browse usando ADO/recordset
Enviado: 14 Nov 2024 19:08
por alxsts
Olá!
O que você deseja é filtrar registros em um record set ADO.
Para isto, utilize recursos disponíveis na própria ferramenta. Configure a propriedade
filter do record set.
https://www.w3schools.com/asp/prop_rs_filter.asp
localização e posicionamento do browse usando ADO/recordset
Enviado: 14 Nov 2024 20:03
por cjp
Se está desposicionando com a função de usuário, isso explica o browse ficar maluco.
Na tela está numa posição e internaente está em outra posição.
Com isso, mexer com setas vai atualizar com outro registro diferente do que está na tela.
Talvez precise atualizar o browse a partir dessa função de usuário, pro browse saber que não está mais no mesmo registro.
É provável que seja isto mesmo.
Sabe me dizer como faço para atualizar o browse?
Olá!
Use seek
Será que o seek funciona em broswse com ado?
A questão não é filtrar registros não.
Eu só quero posicionar o cursor num registro específico, mantendo no browse todos os registros da tabela.
localização e posicionamento do browse usando ADO/recordset
Enviado: 14 Nov 2024 20:15
por JoséQuintas
cjp escreveu:É provável que seja isto mesmo.
Sabe me dizer como faço para atualizar o browse?
Imagino que seja console e não hwgui.
O ADO não tem seek, mas tem FIND, mas no seu caso acho que não vai usar somente pro primeiro
Mas aí vai ter que procurar se tem opção de procurar o próximo, não apenas o primeiro.
aqui:
https://www.w3schools.com/asp/met_rs_find.asp
localização e posicionamento do browse usando ADO/recordset
Enviado: 14 Nov 2024 20:18
por Itamar M. Lins Jr.
Olá!
O ADO não tem seek
https://learn.microsoft.com/pt-br/sql/a ... rver-ver16
Eu não sei! Não uso, mas está ai a referência para uso do seek com ADO...
Parâmetro de parada do ponteiro:
Talvez só com MSSQL... Não se,i como tem ADO, dizendo que aplica-se ao ADO... vai saber.
Saudações,
Itamar M. Lins Jr.
localização e posicionamento do browse usando ADO/recordset
Enviado: 14 Nov 2024 20:27
por JoséQuintas
O problema do SEEK é que talvez dependa de índice, e tem a questão de compatibilidade de array entre harbour e windows.
O find aceita em SQL, campo único, mas como só vai pesquisar a marcacao, vai dar.
localização e posicionamento do browse usando ADO/recordset
Enviado: 14 Nov 2024 20:52
por alxsts
Olá!
Pesquise pela propriedade bookmark do recordset... permite marcar registros do recordset e navegar entre os registros marcados.
localização e posicionamento do browse usando ADO/recordset
Enviado: 14 Nov 2024 23:31
por cjp
Testei o find, mas o browse fica maluco, da mesma forma que eu fiz no início.
Fiz assim:
Tá errado?
Não entendi bem o seek.
localização e posicionamento do browse usando ADO/recordset
Enviado: 15 Nov 2024 00:19
por alxsts
Olá!
O tópico já está se transformando em mais um linguição..
Penso que você deveria explicar melhor o que precisa, postando um exemplo do código usado.
Com ADO ou sem ADO, TBrowse navega pelos registros de forma sequencial. Então não resolve fazer SEEK ou FIND sem tratamento...
Mesmo sem ver o teu código, penso que a solução seja implementar este filtro na função skipper do TBrowse. Creio que você esteja usando a função ADOSkipper(), que escrevi há vários anos.
Não entendi até agora o que quer... tem um conjunto de registros. Quer eliminar registros onde um campo contenha - ou * mas diz que não quer filtrar os registros. Ok... todos os registros tem que aparecer no browser. Mas o que fazer com os registros marcados? Pintar de outra cor ou sei lá o que? Confuso...
localização e posicionamento do browse usando ADO/recordset
Enviado: 15 Nov 2024 01:52
por cjp
Perdão se ainda não fui suficientemente claro.
Não conheço a função ADOSkipper() que vc mencionou. Como faço para ter acesso a ela?
Vou tentar ser bastante claro. O que pretendo é bastante simples: apenas posicionar o cursor no primeiro registro do browse que atenda à condição (campo marcacao sem marca). Note bem: não quero excluir registros do browse, nem filtrar o browse. Apenas posicionar o cursor.
A título de exemplo, imagine um browse assim:
id marcacao tarefa
1 * xxx
2 * yyy
3 * zzz
4 www
5 * aaa
6 bbb
...
Quero apenas que, ao abrir o browse, o cursor fique já posicionado sobre o id 4. Entende?
Vou postar o código inteiro:
Código: Selecionar todos
novaconsado("select * from tarsequencias where id>0",,,,,,,,55,"[ENTER] - marca *; [DEL]-apaga registro","fu_tarsequencias")
function fu_tarsequencias
local nId :=oRs:Fields("id"):Value
local cTar, conf
nVez++
if nVez=1
* oRs:Find("marcacao<>'*'")
/*
do while !oRs:eof()
if oRs:Fields("marcacao"):Value="*" .or. oRs:Fields("marcacao"):Value="-"
oRs:movenext()
else
keyb chr(5)
exit
endif
enddo
*/
endif
if nkey ==13
if oRs:Fields("marcacao"):Value="*"
exqado("update tarsequencias set marcacao=' ' where id="+alltrim(str(nId)),3)
else
exqado("update tarsequencias set marcacao='*' where id="+alltrim(str(nId)),3)
endif
return 1
elseif nkey ==7 //Del
cTar=oRs:Fields("tarefa"):Value
conf="N"
@ 20,5 say "Confirma exclusão deste registro?"get conf pict "@!"
read
if conf="S"
exqado("delete from tarsequencias where id="+alltrim(str(nId)),3)
if pegadado("tarefa","tarsequencias","id="+alltrim(str(nId+1)))="Bíblia" .and. pegadado("marcacao","tarsequencias","id="+alltrim(str(nId+1)))#"*"
exqado("delete from tarsequencias where id="+alltrim(str(nId+1)),3)
endif
do while .t.
nId=pegadado("id","tarsequencias","id>"+alltrim(str(nId))+" and tarefa='"+cTar+"'")
if hb_isnumeric(nId)
exqado("delete from tarsequencias where id="+alltrim(str(nId)),3)
if pegadado("tarefa","tarsequencias","id="+alltrim(str(nId+1)))="Bíblia" .and. pegadado("marcacao","tarsequencias","id="+alltrim(str(nId+1)))#"*"
exqado("delete from tarsequencias where id="+alltrim(str(nId+1)),3)
endif
else
exit
endif
enddo
endif
return 1
endif
return 0
function novaconsado(sql,or,modo,coluna,prov,nTop1,nTop2,nBottom1,nBottom2,cRodape,func_usuario)
#include "tbrowse.ch"
LOCAL retorno, oColumn, nProvAqui, nLen, nLen2, nFieldlen, I // I está em fields(i) abaixo, não sei do que se trata
local nCursor :=setCursor(0)
Local Vez :=0
local cSair :="N"
local rw :=row()
local cl :=col()
private conexao, nkey, oRs, oTBrowse
cls
if Vez=0
@ maxrow()-1,15 say "Abrindo consulta"
endif
if prov=NIL
prov=3
endif
if nTop1=NIL
nTop1=2
endif
if nTop2=NIL
nTop2=2
endif
if nBottom1=NIL
nBottom1=maxrow()-5
endif
if nBottom2=NIL
nBottom2=maxcol()-1
endif
keysec(27,1500,-1,.t.)
if Vez=0
@ maxrow()-1,15 say "Conectando "
endif
do while .t.
bError := ErrorBlock( {|e| Break(e) } )
begin sequence
oRs=ConexaoMySQL(prov)
oRs:open()
recover using e
Vez++
if us="I"
?"Não abriu a conexão; tentando de novo"
inkey(1)
endif
if Vez>3
?"Não abriu a conexão; tente novamente mais tarde"
inkey(1)
cSair="S"
else
loop
endif
endsequence
ErrorBlock( bError )
if cSair="S"
return .f.
endif
Vez=0
if !AdoConecta(prov,7)
@ 12,15 say "Não conseguiu conectar; tente novamente mais tarde"
inkey(5)
return .f.
else
if Vez=0
@ maxrow()-1,15 say "Executando a consulta"
endif
if "FROM ATIV"$upper(sql) .and. prov#18
oRs := Conexao:Execute("SET MAX_JOIN_SIZE=1111111111111")
endif
oRS := Conexao:Execute( sql )
endif
if oRS:Eof()
@ 12,15 say "Não há nenhum item "
inkey(11)
inkey(11)
return .f.
endif
cls
oTBrowse := TBrowseDB():new( nTop1, nTop2, nBottom1, nBottom2 )
if cRodape#NIL
@ maxrow()-2,1 say substr(cRodape,1,maxcol()-5)
@ maxrow()-1,1 say substr(cRodape,maxcol()-4)
endif
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
if procname(1)="LEITURA"
nLen2=nLen
elseif "FROM TAREXTRAS"$upper(sql)
nLen2=nLen-2
else
nLen2=nLen-1
endif
FOR i := 0 TO nLen2
if ("FROM TARDIVIDAS" $ upper(sql)) .and. (upper(oRs:fields(i):name)="MINIMO" .or. upper(oRs:fields(i):name)="OCULTAR")
nFieldlen=oRs:fields(i):definedSize +6
elseif upper(oRs:fields(i):name)="KM"
nFieldlen=10
elseif upper(oRs:fields(i):name)="DATA"
nFieldlen=10
elseif upper(oRs:fields(i):name)="IPCAD"
nFieldlen=15
elseif upper(oRs:fields(i):name)="VLDESP"
nFieldlen=16
elseif upper(oRs:fields(i):name)="LOCAL"
nFieldlen=55
else
nFieldlen=oRs:fields(i):definedSize
endif
oColumn := TBColumnNew( oRs:fields(i):name(), ADORecordSetFieldBlock( oRs, i ) )
ocolumn:Width := Max( nFieldLen, Len( oRs:fields(i):name ) ) // maior valor entre nFieldlen e nome do campo
oTBrowse:addColumn( oColumn )
NEXT
if vez=0 .and. (procname(1)="ADOTARPRINC" .or. procname(2)="ADOTARPRINC")
rw=0
do while .t.
if oRs:Fields("marcacao"):Value="*" .or. oRs:Fields("marcacao"):Value="-"
oRs:movenext()
rw++
else
exit
endif
enddo
endif
DO WHILE .T.
vez++
nCol=oTbrowse:colPos()
oTBrowse:forceStable()
oTBrowse:refreshCurrent()
setCursor(nCursor)
set cursor on
nKey := Inkey(0)
retorno=&(func_usuario)(sql)
if retorno=1
exit
endif
IF oTBrowse:applyKey( nKey ) == TBR_EXIT
cSair="S"
EXIT
ENDIF
ENDDO
if cSair="S"
exit
endif
enddo
oRs:Close()
Conexao:Close()
if cSair="S" .and. procname(1)#"CONSEXPR" .and. procname(2)#"CONSEXPR"
return .f.
endif
return .t.
localização e posicionamento do browse usando ADO/recordset
Enviado: 15 Nov 2024 07:53
por JoséQuintas
Vixe, muita calma nessa hora.
A velha história de 2 tabelas em uma.
Tem delete na mesma tabela que tá fazendo browse.
E mais de um servidor, o que é esquisito.
Vai precisar também refresh na consulta ADO, mas preciso entender melhor esse fonte.
Nota: imagino que esse fonte é apenas um agrupamento de outros fontes pra poder postar, e no aplicativo não se trata de um único fonte.