Página 1 de 1
Dúvida básica em recordset: nr do record atual
Enviado: 28 Jul 2021 23:24
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?
Dúvida básica em recordset: nr do record atual
Enviado: 28 Jul 2021 23:31
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)
Dúvida básica em recordset: nr do record atual
Enviado: 28 Jul 2021 23:50
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 ).
Dúvida básica em recordset: nr do record atual
Enviado: 29 Jul 2021 00:10
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
Com isso, você pode pular registros, ou ir diretamente a um determinado registro.
Dúvida básica em recordset: nr do record atual
Enviado: 29 Jul 2021 00:26
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
Dúvida básica em recordset: nr do record atual
Enviado: 29 Jul 2021 00:43
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
Dúvida básica em recordset: nr do record atual
Enviado: 31 Jul 2021 17:34
por alxsts
Olá!
Ok, vamos em frente, cada um com seu ponto de vista.
Dúvida básica em recordset: nr do record atual
Enviado: 31 Jul 2021 18:09
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.
Dúvida básica em recordset: nr do record atual
Enviado: 02 Ago 2021 15:41
por cjp
O move eu já conhecia e usava.
O que eu precisava mesmo era o AbsolutePosition, que resolveu meu problema.
Muito obrigado.