Compartilhar via


Método Recordset.GetRows (DAO)

Aplica-se a: Access 2013, Office 2013

Recupera múltiplas linhas de um objeto Recordset.

Sintaxe

expressão . GetRows(NumRows)

expressão Uma variável que representa um objeto Conjunto de registros.

Parâmetros

Nome

Necessária/opcional

Tipo de dados

Descrição

NumRows

Opcional

Variant

O número de linhas a serem recuperadas.

Valor de retorno

Variant

Comentários

Use o método GetRows para copiar registros de um Recordset. GetRows retorna uma matriz bidimensional. A primeira assinatura identifica o campo e a segunda identifica o número da linha. Por exemplo, intField representa o campo, e intRecord identifica o número da linha:

avarRecords(intField, intRecord)

Para obter o primeiro valor do campo na segunda linha retornada, use o código como se segue:

field1 = avarRecords(0,1)

Para obter o segundo valor do campo na primeira linha, use o código como se segue:

field2 = avarRecords(1,0)

A variável avarRecords se torna automaticamente uma matriz bidimensional quando GetRows retorna dados.

Se você solicitar mais linhas do que aquelas disponíveis, GetRows retornará apenas o número de linhas disponíveis. Você pode usar a função UBound do Visual Basic for Applications para determinar quantas linhas GetRows realmente recuperou, porque a matriz deve ajustar-se ao número de linhas retornadas. Por exemplo, se você tiver retornado os resultados em uma Variant chamada varA, poderia usar o código a seguir para determinar quantas linhas foram realmente retornadas:

numReturned = UBound(varA,2) + 1

Você precisa usar "+ 1" porque a primeira linha retornada está no elemento 0 da matriz. O número de linhas que você pode recuperar está restrito pela quantidade de memória disponível. Você não deve usar GetRows para recuperar uma tabela inteira em uma matriz, se ela for grande.

Como GetRows retorna todos os campos do Recordset na matriz, inclusive os campos Memo e Long Binary, é possível usar uma consulta que restrinja os campos retornados.

Depois de chamar GetRows, o registro atual é posicionado na próxima linha não lida. Ou seja, GetRows tem o mesmo efeito no registro atual do que Move numrows.

Se você estiver tentando recuperar todas as linhas utilizando várias chamadas de GetRows, use a propriedade EOF para ter certeza de que está no final do Recordset. GetRows retorna menos que o número solicitado se ele estiver no final de Recordset ou se ele não puder recuperar uma linha no intervalo solicitado. Por exemplo, se você estiver tentando recuperar 10 registros, mas não conseguir recuperar o quinto registro, GetRows retornará quatro registros e tornará o quinto registro o registro atual. Isso não irá gerar nenhum erro de tempo de execução. Isso pode ocorrer se outro usuário excluir um registro em um Recordset tipo dynaset. Consulte o exemplo para obter uma demonstração de como tratar isso.

Exemplo

Este exemplo usa o método GetRows para recuperar um número específico de linhas de um Recordset e para preencher uma matriz com os dados resultantes. O método GetRows retornará menos do que o número de linhas desejado nos dois casos: se EOF tiver sido alcançado ou se GetRows tentou recuperar um registro excluído por outro usuário. A função retornará False somente se o segundo caso ocorrer. A função GetRowsOK é exigida para que este procedimento seja executado.

    Sub GetRowsX() 
     
     Dim dbsNorthwind As Database 
     Dim rstEmployees As Recordset 
     Dim strMessage As String 
     Dim intRows As Integer 
     Dim avarRecords As Variant 
     Dim intRecord As Integer 
     
     Set dbsNorthwind = OpenDatabase("Northwind.mdb") 
     Set rstEmployees = dbsNorthwind.OpenRecordset( _ 
     "SELECT FirstName, LastName, Title " & _ 
     "FROM Employees ORDER BY LastName", dbOpenSnapshot) 
     
     With rstEmployees 
     Do While True 
     ' Get user input for number of rows. 
     strMessage = "Enter number of rows to retrieve." 
     intRows = Val(InputBox(strMessage)) 
     
     If intRows <= 0 Then Exit Do 
     
     ' If GetRowsOK is successful, print the results, 
     ' noting if the end of the file was reached. 
     If GetRowsOK(rstEmployees, intRows, _ 
     avarRecords) Then 
     If intRows > UBound(avarRecords, 2) + 1 Then 
     Debug.Print "(Not enough records in " & _ 
     "Recordset to retrieve " & intRows & _ 
     " rows.)" 
     End If 
     Debug.Print UBound(avarRecords, 2) + 1 & _ 
     " records found." 
     
     ' Print the retrieved data. 
     For intRecord = 0 To UBound(avarRecords, 2) 
     Debug.Print " " & _ 
     avarRecords(0, intRecord) & " " & _ 
     avarRecords(1, intRecord) & ", " & _ 
     avarRecords(2, intRecord) 
     Next intRecord 
     Else 
     ' Assuming the GetRows error was due to data 
     ' changes by another user, use Requery to 
     ' refresh the Recordset and start over. 
     If .Restartable Then 
     If MsgBox("GetRows failed--retry?", _ 
     vbYesNo) = vbYes Then 
     .Requery 
     Else 
     Debug.Print "GetRows failed!" 
     Exit Do 
     End If 
     Else 
     Debug.Print "GetRows failed! " & _ 
     "Recordset not Restartable!" 
     Exit Do 
     End If 
     End If 
     
     ' Because using GetRows leaves the current record 
     ' pointer at the last record accessed, move the 
     ' pointer back to the beginning of the Recordset 
     ' before looping back for another search. 
     .MoveFirst 
     Loop 
     End With 
     
     rstEmployees.Close 
     dbsNorthwind.Close 
     
    End Sub 
     
    Function GetRowsOK(rstTemp As Recordset, _ 
     intNumber As Integer, avarData As Variant) As Boolean 
     
     ' Store results of GetRows method in array. 
     avarData = rstTemp.GetRows(intNumber) 
     ' Return False only if fewer than the desired number of 
     ' rows were returned, but not because the end of the 
     ' Recordset was reached. 
     If intNumber > UBound(avarData, 2) + 1 And _ 
     Not rstTemp.EOF Then 
     GetRowsOK = False 
     Else 
     GetRowsOK = True 
     End If 
     
    End Function