Dúvida básica em recordset: nr do record atual

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Dúvida básica em recordset: nr do record atual

Mensagem por cjp »

Pessoal, estou com uma dúvida básica sobre recordset (que só comecei a usar há pouco tempo), pesquisei tudo na internet e aqui no fórum, mas não achei.

A dúvida é simples: como pego o nr atual do record? Sei que consigo pegar o nr total de records com oRs:recordcount(). Mas eu quero o atual (ao estilo recno() do Harbour). É possível?
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Dúvida básica em recordset: nr do record atual

Mensagem por JoséQuintas »

Sim e não.

Diferente do Harbour, o RecNo() é o número sequencial dentro do recordset.
Inclusive se aplicar filtro, a numeração fica apenas na parte filtrada, não existe "pular RecNo()"

rs:AbsolutePosition = posição atual
rs:Move( nNumero, nDirecao ) = move n registros a partir do início/final/ou posição atual (parecido com o fSeek() do Harbour)
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Dúvida básica em recordset: nr do record atual

Mensagem por alxsts »

Olá!

Na verdade, FSeek( h, n ) ou FSeek( h, -n ) posiciona o ponteiro do arquivo com handle h para a frente ou para trás n bytes, sem ler o conteúdo.

oRs:move( n, direção ) é equivalente ao DbSkip( n ) ou DbSkip( -n ).
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Dúvida básica em recordset: nr do record atual

Mensagem por JoséQuintas »

alxsts escreveu: Na verdade, FSeek( h, n ) ou FSeek( h, -n ) posiciona o ponteiro do arquivo com handle h para a frente ou para trás n bytes, sem ler o conteúdo.
oRs:move( n, direção ) é equivalente ao DbSkip( n ) ou DbSkip( -n ).
Não é não. Tá mais pra FSeek() mesmo, porque depende do parâmetro.

https://www.w3schools.com/asp/met_rs_move.asp
move.png
Com isso, você pode pular registros, ou ir diretamente a um determinado registro.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Dúvida básica em recordset: nr do record atual

Mensagem por alxsts »

Olá!

Pra mim está bem claro:

FSeek() move bytes:
Changes the position of the file pointer.
Syntax
FSeek( <nFileHandle>, <nBytes>, [<nOrigin>] ) --> nPosition

Arguments
<nFileHandle>
This is a numeric file handle returned from function FOpen(), FCreate(), or HB_FCreate().
<nBytes>
This is a numeric value specifying the number of bytes to move the file pointer. It can be a positive or negative number. Negative numbers move the file pointer backwards (towards the beginning of the file), positive values move it forwards. The value zero is used to position the file pointer exactly at the location specified with <nOrigin>.
<nOrigin>
Optionally, the starting position from where to move the file pointer can be specified. #define constants are available in the FILEIO.CH file that can be used for <nOrigin>. Start positions for moving the file pointer Constant Value Description
FS_SET *) 0 Start at the beginning of the file
FS_RELATIVE 1 Start at the current file pointer position
FS_END 2 Start at the end of the file
*) default

Return
The function returns a numeric value. It is the new position of the file pointer, counted from the beginning of the file (position 0).
rs:move() move registros:
ADO Move Method
The Move method moves the record pointer in a Recordset object.

Note: This method can be used on all Recordset objects.

Syntax
objRecordset.Move numrec,start

Parameter Description
numrec Required. Specifies how many records the record pointer will move.
Example: If this parameter is set to 3, the record pointer moves 3 records forward.

Example: If this parameter is set to -3, the record pointer moves 3 records backward

start Optional. Where to start. Can be a bookmark or a BookmarkEnum value
BookmarkEnum
Constant Value Description
adBookmarkCurrent 0 Starts at the current record
adBookmarkFirst 1 Starts at the first record
adBookmarkLast 2 Starts at the last record
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Dúvida básica em recordset: nr do record atual

Mensagem por JoséQuintas »

Então... Fseek() e Move() movem conforme posição informada, a diferença é que fSeek() faz isso em bytes, e Move() faz isso em registros.

Isso acaba sendo melhor comparação do que SKIP, que apenas move pra frente ou pra trás.

Talvez você esteja considerando apenas o fato de mover ou não registros.

Eu estou considerando o fato de mover a partir de determinada posição, sem considerar que podem ser registros ou bytes.

Apenas usamos pontos de vista diferentes pra fazer a comparação.
- eu usei como referência o tipo de movimento, não importa se registro ou byte
- você usou como referência mover registros, não importa o tipo de movimento
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Dúvida básica em recordset: nr do record atual

Mensagem por alxsts »

Olá!

Ok, vamos em frente, cada um com seu ponto de vista.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Dúvida básica em recordset: nr do record atual

Mensagem por JoséQuintas »

Assim, os pontos de vista ficam mais claros, talvez.

SKIP n, move n registros pra frente
SKIP -n, move n registros pra trás

FSeek( handle, n, PosAtual ) move n nbytes pra frente
FSeek( nHandle, -n, PosAtual ) move nbytes pra trás
FSeek( nHandle, n, Posinicio ) move n bytes pra frente a partir do início
Fseek( nHandle, -n, Posfim ) move n bytes pra trás a partir do final

Move( n, PosAtual ) move n Registros pra frente
Move( n, -PosAtual ) move n Registros pra trás
Move( n, PosInicio ) move n Registros pra frente a partir do início
Move( n, PosFinal ) move n Registros pra trás a partir do final

Então.... Move() faz movimento por registros, igual SKIP
Mas... a forma de movimentar é igual FSeek(), podendo ser do início/final/posição atual

No caso do post, pra ir para um registro, vai usar o move a partir do início.
E obter o registro é absolute position.

Como eu já disse, no ADO, o número é com relação à consulta, e não na base de dados.
ORDER BY CODIGO, o registro 1 vai ser o primeiro código
ORDER BY NOME, o registro 1 vai ser o primeiro nome
E se no resultado fizer um filtro, SORT, etc... a numeração vai seguir a sequência do resultado, sempre começando no 1.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Dúvida básica em recordset: nr do record atual

Mensagem por cjp »

O move eu já conhecia e usava.

O que eu precisava mesmo era o AbsolutePosition, que resolveu meu problema.

Muito obrigado.
Inacio de Carvalho Neto
Responder