Partilhar via


Trabalhando com conjuntos de registros

O objeto Recordset tem recursos internos que permitem reorganizar a ordem dos dados no conjunto de resultados, pesquisar um registro específico com base nos critérios fornecidos e até mesmo otimizar essas operações de pesquisa usando índices. Se esses recursos estão disponíveis para uso depende do provedor e, em alguns casos , como o da propriedade Index, a estrutura da própria fonte de dados.

Organizando dados

Com frequência, a maneira mais eficiente de ordenar os dados em seu conjunto de registros é especificando uma cláusula ORDER BY no comando SQL usada para retornar resultados a ele. No entanto, talvez seja necessário alterar a ordem dos dados em um conjunto de registros que já foi criado. Você pode usar a propriedade Sort para estabelecer a ordem na qual linhas de um conjunto de registros são percorridas. Além disso, a propriedade Filter determina quais linhas podem ser acessadas ao atravessar linhas.

A propriedade Classificar define ou retorna um valor de cadeia de caracteres que indica os nomes de campo no conjunto de registros no qual classificar. Cada nome é separado por uma vírgula e, opcionalmente, é seguido por um espaço e a palavra-chave ASC (que classifica o campo em ordem crescente) ou DESC (que classifica o campo em ordem decrescente). Por padrão, se nenhuma palavra-chave for especificada, o campo será classificado em ordem crescente.

A operação de classificação é eficiente porque os dados não são reorganizados fisicamente, mas são acessados na ordem especificada por um índice.

A propriedade Sort requer que a propriedade CursorLocation seja definida como adUseClient. Um índice temporário será criado para cada campo especificado na propriedade Classificar se um índice ainda não existir.

Definir a propriedade Ordenar como uma string vazia redefinirá as linhas para sua ordem original e excluirá os índices temporários. Os índices existentes não serão excluídos.

Suponha que um Recordset contenha três campos chamados firstName, middleInitiale lastName. Defina a propriedade Classificar como a string "lastName DESC, firstName ASC", que ordenará o conjunto de registros por sobrenome em ordem decrescente e, em seguida, pelo nome em ordem crescente. A inicial do meio é ignorada.

Nenhum campo referenciado em uma cadeia de caracteres de critérios de classificação pode ser chamado de "ASC" ou "DESC" porque esses nomes entram em conflito com as palavras-chave ASC e DESC. Dê a um campo que tenha um nome conflitante um alias usando a palavra-chave AS na consulta que retorna o conjunto de registros .

Para obter mais informações sobre a filtragem do Conjunto de Registros , consulte "Filtrando os resultados" mais adiante neste tópico.

Localizando um registro específico

O ADO fornece os métodos Find e Seek para localizar um registro específico em um conjunto de registros . O método Find é suportado por uma variedade de provedores, mas está limitado a um único critério de pesquisa. O método Seek dá suporte à pesquisa em vários critérios, mas não é suportado por muitos provedores.

Índices em campos podem melhorar muito o desempenho do método Find e das propriedades Sort e Filter do objeto Recordset. Você pode criar um índice interno para um objeto Field definindo sua propriedade dinâmica Optimize. Essa propriedade dinâmica é adicionada à coleção Properties do objeto Field quando você define a propriedade CursorLocation como adUseClient. Lembre-se de que esse índice é interno ao ADO – você não pode obter acesso a ele ou usá-lo para qualquer outra finalidade. Além disso, esse índice é distinto da propriedade Index do objeto Recordset.

O método Find localiza rapidamente um valor dentro de uma coluna (campo) de um conjunto de registros . Com frequência, você pode melhorar a velocidade do método Find em uma coluna usando a propriedade Optimize para criar um índice nela.

O método Find limita sua pesquisa ao conteúdo de um campo. O método Seek requer que você tenha um índice e também tenha outras limitações. Se você precisar pesquisar em vários campos que não são a base de um índice ou se o provedor não der suporte a índices, você poderá limitar seus resultados usando a propriedade Filter do objeto Recordset.

Encontrar

O método Find pesquisa um Recordset para a linha que atende a um critério especificado. Opcionalmente, a direção da pesquisa, a linha inicial e o deslocamento a partir da linha inicial podem ser especificados. Se o critério for atendido, a posição da linha atual será definida no registro encontrado; caso contrário, a posição é definida como o final (ou início) do conjunto de registros , dependendo da direção da pesquisa.

Somente um nome de coluna única pode ser especificado para o critério. Em outras palavras, esse método não dá suporte a pesquisas de várias colunas.

O operador de comparação para o critério pode ser ">" (maior que), "<" (menor que), "=" (igual), ">=" (maior ou igual), "<=" (menor ou igual), "<>" (não igual) ou "LIKE" (correspondência de padrão).

O valor do critério pode ser uma cadeia de caracteres, um número de ponto flutuante ou uma data. Os valores de cadeia de caracteres são delimitados com aspas simples ou "#" (sinal de número) (por exemplo, "state = 'WA"" ou "state = #WA#"). Os valores de data são delimitados com marcas "#" (sinal de número) (por exemplo, "start_date > #22/7/97#").

Se o operador de comparação for "like", o valor da cadeia de caracteres poderá conter um asterisco (*) para localizar uma ou mais ocorrências de qualquer caractere ou subcadeia de caracteres. Por exemplo, "estado como 'M*'" corresponde a Maine e Massachusetts. Você também pode usar asteriscos à esquerda e à direita para localizar uma subcadeia de caracteres contida nos valores. Por exemplo, "código de estado como '*as*'" corresponde a Alasca, Arkansas e Massachusetts.

Os asteriscos só podem ser usados no final de uma cadeia de caracteres de critérios ou juntos no início e no final de uma cadeia de caracteres de critérios, conforme mostrado anteriormente. Você não pode usar o asterisco como um curinga inicial ('*str') ou curinga no meio ('s*r'). Isso causará um erro.

Buscar e indexar

Use o método Seek junto com a propriedade Index se o provedor subjacente der suporte a índices no objeto Recordset. Use o método Supports(adSeek) para determinar se o provedor subjacente dá suporte a Seeke o método Supports(adIndex) para determinar se o provedor dá suporte a índices. (Por exemplo, o provedor OLE DB para Microsoft Jet dá suporte a Seek e Index.)

Se Seek não encontrar a linha desejada, nenhum erro ocorrerá e a linha será posicionada no final do Recordset. Defina a propriedade Index para o índice desejado antes de executar esse método.

Este método é compatível apenas com cursores do lado do servidor. Não há suporte para Seek quando o valor da propriedade CursorLocation do objeto Recordset é adUseClient.

Esse método só pode ser usado quando o objeto Recordset tiver sido aberto com um valor CommandTypeEnum de adCmdTableDirect.

Filtrando os resultados

O método Find limita sua pesquisa ao conteúdo de um campo. O método Seek requer que você tenha um índice e também tenha outras limitações. Se você precisar pesquisar em vários campos que não são a base de um índice ou se o provedor não der suporte a índices, você poderá limitar seus resultados usando a propriedade Filter do objeto recordset.

Use a propriedade Filter para filtrar seletivamente os registros em um objeto Recordset. O Recordset filtrado torna-se o cursor atual, o que significa que os registros que não atendem aos critérios de Filtro não estão disponíveis no Recordset até que o Filtro seja removido. Outras propriedades que retornam valores com base no cursor atual são afetadas, como AbsolutePosition, AbsolutePage, RecordCount e PageCount. Isso ocorre porque a configuração da propriedade Filter para um valor específico moverá o registro atual para o primeiro registro que satisfaça o novo valor.

A propriedade Filter usa um argumento variante. Esse valor representa um dos três métodos para usar a propriedade Filter: uma cadeia de caracteres de critérios, uma constante FilterGroupEnum, ou um array de marcadores. Para obter mais informações, consulte Filtragem com Cadeia de Critérios, Filtragem com Constante e Filtragem com Indicadores mais adiante neste tópico.

Nota

Quando você conhece os dados que deseja selecionar, geralmente é mais eficiente abrir um conjunto de registros com uma instrução SQL que filtra efetivamente o conjunto de resultados, em vez de depender da propriedade Filter.

Para remover um filtro de um Recordset , use a constante adFilterNone . Definir a propriedade Filter como uma cadeia de caracteres de comprimento zero ("") tem o mesmo efeito que usar a constante adFilterNone.

Filtragem com uma cadeia de caracteres de critérios

A cadeia de caracteres de critérios consiste em cláusulas na forma FieldName Operador Valor (por exemplo, ""LastName = 'Smith'""). Você pode criar cláusulas compostas concatenando cláusulas individuais com AND (por exemplo, "LastName = 'Smith' AND FirstName = 'John'") e OR (por exemplo, "LastName = 'Smith' OR LastName = 'Jones'"). Use as seguintes diretrizes para cadeias de caracteres de critérios:

  • O nome de campo deve ser válido no Recordset . Se o nome do campo contiver espaços, você deverá colocar o nome entre colchetes.

  • Operador deve ser um dos seguintes: <, >, <=, >=, <>, =ou LIKE.

  • Value é o valor com o qual você comparará os valores de campo (por exemplo, 'Smith', #8/24/95#, 12.345ou $50.00). Use aspas simples (') com cadeias de caracteres e sinais de libra (#) com datas. Para números, você pode usar pontos decimais, sinais de dólar e notação científica. Se Operator for LIKE, Value poderá usar caracteres curinga. Somente os caracteres curinga do asterisco (*) e do sinal percentual (%) são permitidos e devem ser o último caractere na cadeia de caracteres. valor não pode ser nulo.

    Nota

    Para incluir aspas simples (') no filtro Valor, use duas aspas simples para representar uma. Por exemplo, para aplicar um filtro em O'Malley, a cadeia de caracteres de critérios deve ser "col1 = 'O''Malley'". Para incluir aspas simples no início e no final do valor do filtro, coloque a cadeia de caracteres em sinais de libra (#). Por exemplo, para filtrar em '1', a string de critério deve ser "col1 = #'1'#".

Não há precedência entre AND e OR. As cláusulas podem ser agrupadas entre parênteses. No entanto, você não pode agrupar cláusulas combinadas por um OR e, em seguida, conectar o grupo a outra cláusula com um AND, da seguinte maneira.

(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'  

Em vez disso, você construiria esse filtro da seguinte maneira.

(LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')  

Em uma cláusula LIKE, você pode usar um caractere curinga no início e no final do padrão (por exemplo, LastName Like '*mit*') ou apenas no final do padrão (por exemplo, LastName Like 'Smit*').

Filtragem com uma constante

As constantes a seguir estão disponíveis para filtrar os Recordsets.

Constante Descrição
adFilterAffectedRecords Filtros para exibir apenas os registros afetados pela última chamada Excluir, Ressincronizar, UpdateBatch ou CancelBatch.
adFilterConflictingRecords Filtros para exibir os registros que falharam na última atualização em lote.
adFilterFetchedRecords Filtros para exibir os registros no cache atual , ou seja, os resultados da última chamada para recuperar registros do banco de dados.
adFilterNone Remove o filtro atual e restaura todos os registros para exibição.
adFiltrarRegistrosPendentes Filtros para exibir apenas registros que foram alterados, mas ainda não foram enviados para o servidor. Aplicável somente para o modo de atualização em lote.

As constantes de filtro facilitam a resolução de conflitos individuais de registros durante a atualização em lotes, permitindo que você exiba, por exemplo, apenas os registros que foram afetados na última chamada do método UpdateBatch, conforme mostrado no exemplo a seguir.

Attribute VB_Name = "modExaminingData"

Filtragem com Marcadores

Por fim, você pode passar uma matriz variante de marcadores para a propriedade Filter. O cursor resultante conterá apenas os registros cujo marcador foi passado para a propriedade. O exemplo de código a seguir cria um array de indicadores a partir dos registros em um Recordset que têm um "B" no campo ProductName. Em seguida, ele passa a matriz para a propriedade Filtro de e exibe informações sobre o conjunto de registros filtrado resultante.

'BeginFilterBkmk  
Dim vBkmkArray() As Variant  
Dim i As Integer  
  
'Recordset created using "SELECT * FROM Products" as command.  
'So, we will check to see if ProductName has a capital B, and  
'if so, add to the array.  
i = 0  
Do While Not objRs.EOF  
    If InStr(1, objRs("ProductName"), "B") Then  
        ReDim Preserve vBkmkArray(i)  
        vBkmkArray(i) = objRs.Bookmark  
        i = i + 1  
        Debug.Print objRs("ProductName")  
    End If  
    objRs.MoveNext  
Loop  
  
'Filter using the array of bookmarks.  
objRs.Filter = vBkmkArray  
  
objRs.MoveFirst  
Do While Not objRs.EOF  
    Debug.Print objRs("ProductName")  
    objRs.MoveNext  
Loop  
'EndFilterBkmk  

Criando um clone de um conjunto de registros

Use o método Clone para criar vários objetos Recordset duplicados, especialmente se você quiser manter mais de um registro atual em um determinado conjunto de registros. Usar o método Clone é mais eficiente do que criar e abrir um novo objeto Recordset com a mesma definição que o original.

O registro atual de um clone recém-criado é inicialmente definido como o primeiro registro. O ponteiro de registro atual em um conjunto de registros clonado não é sincronizado com o original ou vice-versa. Você pode navegar independentemente em cada Recordset .

As alterações feitas em um objeto Recordset são visíveis em todos os clones, independentemente do tipo de cursor. No entanto, após executar Requery no Recordsetoriginal, os clones não estarão mais sincronizados com o original.

Fechar o conjunto de registros original não fecha suas cópias, e fechar uma cópia não fecha o original nem qualquer outra cópia.

Você pode clonar um objeto Recordset somente se ele der suporte a indicadores. Os valores de marcador são intercambiáveis; ou seja, uma referência de marcador de um objeto Recordset refere-se ao mesmo registro em qualquer um de seus clones.