Mais maneiras de se mover em um conjunto de registros
Os quatro métodos a seguir são usados para se mover ou rolar no Recordset: MoveFirst, MoveLast, MoveNext e MovePrevious. (Alguns desses métodos não estão disponíveis em cursores somente para encaminhamento.)
MoveFirst altera a posição atual do registro para o primeiro registro no Recordset. MoveLast altera a posição atual do registro para o último registro no Recordset. Para usar MoveFirst ou MoveLast, o objeto Recordset deve permitir indicadores ou o movimento de retrocesso do cursor. Caso contrário, a chamada do método gerará um erro.
MoveNext move a posição atual do registro um lugar para a frente. Se você estiver no último registro ao chamar MoveNext, o EOF será definido como True. MovePrevious move a posição atual do registro um lugar para trás. Se você estiver no primeiro registro ao chamar MovePrevious, o BOF será definido como True. É sensato verificar as propriedades EOF e BOF ao usar esses métodos e mover o cursor novamente para uma posição de registro atual válida, se você sair de qualquer uma das extremidades do Recordset, conforme mostrado aqui:
. . .
oRs.MoveNext
If oRs.EOF Then oRs.MoveLast
. . .
Ou, no caso do método MovePrevious:
. . .
oRs.MovePrevious
If oRs.BOF Then oRs.MoveFirst
. . .
Nos casos em que o Recordset foi filtrado ou classificado e os dados do registro atual são alterados, a posição também pode ser alterada. Nesses casos, o método MoveNext funciona normalmente, mas lembre-se de que a posição é movida um registro para a frente em relação à nova posição, não em relação à posição antiga. Por exemplo, alterar os dados no registro atual, de modo que o registro seja movido para o final do Recordset classificado, significaria que chamar MoveNext faz com que ADO defina o registro atual como a posição após o último registro no Recordset (EOF = True).
O comportamento dos vários métodos Move do objeto Recordset depende, até certo ponto, dos dados no Recordset. Os novos registros adicionados ao Recordset são adicionados inicialmente em determinada ordem, que é definida pela fonte de dados e pode depender implícita ou explicitamente dos dados no novo registro. Por exemplo, se uma classificação ou uma junção for feita na consulta que preenche o Recordset, o novo registro será inserido no lugar apropriado no Recordset. Se a ordem não for especificada explicitamente ao criar o Recordset, as alterações na implementação da fonte de dados poderão fazer com que a ordem das linhas retornadas seja alterada inadvertidamente. Além disso, as funções de classificação, filtragem e edição do Recordset podem afetar a ordem e, possivelmente, quais linhas no conjunto de registros ficarão visíveis.
Portanto, MoveNext, MovePrevious, MoveFirst, MoveLast e Move são sensíveis a outras operações executadas no mesmo Recordset. A ADO sempre tentará manter sua posição atual até que você a mova explicitamente, mas, às vezes, alterações intervenientes dificultam a compreensão dos efeitos de um movimento subsequente. Por exemplo, se você chamar MoveFirst para a posição na primeira linha de um Recordset classificado e alterar a classificação de ordem crescente para ordem decrescente, você ainda estará na mesma linha, mas agora será a última linha no Recordset. MoveFirst levará você para uma linha diferente (a nova primeira linha).
Como outro exemplo, se você estiver posicionado em uma linha específica no meio de um Recordset e chamar Delete e, em seguida, chamar MoveNext, agora você estará no registro imediatamente após o registro excluído. Mas chamar MovePrevious faz com que o registro anterior ao que você excluiu seja o registro atual, pois o registro excluído não é mais contado na associação ativa do Recordset.
É especificamente difícil definir uma semântica de movimentação consistente em todos os provedores para métodos que se movem em relação ao registro atual – MovePrevious, MoveNext e Move – mediante a alteração de dados no registro atual. Por exemplo, se você estiver trabalhando com um Recordset classificado e filtrado e alterar os dados no registro atual para que ele preceda todos os outros registros, mas os dados alterados também não correspondem mais ao filtro, não ficará claro para onde uma operação MoveNext deve levá-lo. A conclusão mais segura é que o movimento relativo em um Recordset é mais arriscado do que o movimento absoluto (como usar MoveFirst ou MoveLast), quando os dados estão sendo alterados, enquanto os registros estão sendo editados, adicionados ou excluídos. A classificação e a filtragem devem ser baseadas em uma chave primária ou ID, pois esse tipo de valor não deve ser alterado.