2011-01-25 32 views
13

Tengo una consulta que deseo ejecutar en una tabla. Con los resultados, quiero hacer algo. En mi cabeza, el pseudo código es:Access 2010 VBA consulta una tabla y repite los resultados

var q = "select * from table where some condition"; 
var results = db.getResults(q); 
foreach (row r in results) 
    do something with result 

¿Qué tal algo similar con vba?

Respuesta

25

DAO es nativa a acceder y, con mucho, el mejor para el uso general. ADO tiene su lugar, pero es poco probable que sea esto.

Dim rs As DAO.Recordset 
Dim db As Database 
Dim strSQL as String 

Set db=CurrentDB 

strSQL = "select * from table where some condition" 

Set rs = db.OpenRecordset(strSQL) 

Do While Not rs.EOF 

    rs.Edit 
    rs!SomeField = "Abc" 
    rs!OtherField = 2 
    rs!ADate = Date() 
    rs.Update 

    rs.MoveNext 
Loop 
+0

Solo un comentario de que también prefiero DAO sobre ADO a menos que necesites ejecutar procedimientos almacenados desde SQL Server o algo así. – HK1

+4

Permítanme decir que, en general, caminar un conjunto de registros no es algo que haga con frecuencia para actualizar los datos. Hay varios escenarios de solo lectura en los que está ensamblando datos para usar en algún formato (como la salida a HTML), pero la actualización es algo ng que generalmente se realiza mejor con un comando SQL UPDATE (donde sea posible). –

0

Sé que algunas cosas han cambiado en AC 2010. Sin embargo, el ADODB anticuado es, hasta donde sé, el mejor camino a seguir en VBA. Un ejemplo:

Dim cn As ADODB.Connection 
Dim cmd As ADODB.Command 
Dim prm As ADODB.Parameter 
Dim rs As ADODB.Recordset 
Dim colReturn As New Collection 

Dim SQL As String 
SQL = _ 
    "SELECT c.ClientID, c.LastName, c.FirstName, c.MI, c.DOB, c.SSN, " & _ 
    "c.RaceID, c.EthnicityID, c.GenderID, c.Deleted, c.RecordDate " & _ 
    "FROM tblClient AS c " & _ 
    "WHERE c.ClientID = @ClientID" 

Set cn = New ADODB.Connection 
Set cmd = New ADODB.Command 

With cn 
    .Provider = DataConnection.MyADOProvider 
    .ConnectionString = DataConnection.MyADOConnectionString 
    .Open 
End With 

With cmd 
    .CommandText = SQL 
    .ActiveConnection = cn 
    Set prm = .CreateParameter("@ClientID", adInteger, adParamInput, , mlngClientID) 
    .Parameters.Append prm 
End With 

Set rs = cmd.Execute 

With rs 
    If Not .EOF Then 
     Do Until .EOF 
      mstrLastName = Nz(!LastName, "") 
      mstrFirstName = Nz(!FirstName, "") 
      mstrMI = Nz(!MI, "") 
      mdDOB = !DOB 
      mstrSSN = Nz(!SSN, "") 
      mlngRaceID = Nz(!RaceID, -1) 
      mlngEthnicityID = Nz(!EthnicityID, -1) 
      mlngGenderID = Nz(!GenderID, -1) 
      mbooDeleted = Deleted 
      mdRecordDate = Nz(!RecordDate, "") 

      .MoveNext 
     Loop 
    End If 
    .Close 
End With 

cn.Close 

Set rs = Nothing 
Set cn = Nothing 
+0

Si algo ha cambiado en AC 2010 que invalida lo anterior, me gustaría saberlo. Todavía no me he actualizado de AC 2003 (ya no utilizo Access ...). – XIVSolutions

+0

Debo señalar aquí que mi ejemplo está cargando los resultados de la consulta en un conjunto de variables (en notación pseudohúngara horrible, nada menos) declaradas dentro de un módulo de clase. Sin embargo, uno podría fácilmente cargar en una matriz, completar un formulario, ¿qué tienes? – XIVSolutions

+1

No estoy seguro de por qué no editó esta respuesta en lugar de publicar una nueva respuesta, pero si la nueva es la que desea, debe eliminarla. – Fionnuala

0

Ahh. Porque me perdí el punto de tu publicación inicial, aquí hay un ejemplo que también ITERATES. El primer ejemplo no. En este caso, recupero un conjunto de registros ADODB y luego cargo los datos en una colección, que devuelve la función al código del cliente:

EDITAR: No estoy seguro de qué cometí al pegar el código, pero el formateo es pequeña screwball. ¡Lo siento!

Public Function StatesCollection() As Collection 
Dim cn As ADODB.Connection 
Dim cmd As ADODB.Command 
Dim rs As ADODB.Recordset 
Dim colReturn As New Collection 

Set colReturn = New Collection 

Dim SQL As String 
SQL = _ 
    "SELECT tblState.State, tblState.StateName " & _ 
    "FROM tblState" 

Set cn = New ADODB.Connection 
Set cmd = New ADODB.Command 

With cn 
    .Provider = DataConnection.MyADOProvider 
    .ConnectionString = DataConnection.MyADOConnectionString 
    .Open 
End With 

With cmd 
    .CommandText = SQL 
    .ActiveConnection = cn 
End With 

Set rs = cmd.Execute 

With rs 
    If Not .EOF Then 
    Do Until .EOF 
     colReturn.Add Nz(!State, "") 
     .MoveNext 
    Loop 
    End If 
    .Close 
End With 
cn.Close 

Set rs = Nothing 
Set cn = Nothing 

Set StatesCollection = colReturn 

End Function

+1

ADO no es lo más adecuado para usar con Access. Hay circunstancias especiales en las que es útil, pero para un conjunto de registros ordinario, DAO es nativo y el mejor. – Fionnuala

+0

Estoy respetuosamente en desacuerdo. Obviamente DAO es nativo, que puede haber tenido una menor ventaja de rendimiento en las máquinas más limitadas de hace unos años. Sin embargo, la sintaxis torpe, el mecanismo de conexión arcano y el conjunto limitado de características (en comparación con ADODB) lo hacen más atractivo. Por supuesto, esta es solo mi opinión, y sabes lo que dicen. . . – XIVSolutions

+0

@Remou - Nota: énfasis en "respetuosamente" en mi publicación anterior. Obviamente, prefiero ADO, pero en la reflexión, es también con lo que "crecí", por lo tanto estoy más familiarizado, por lo tanto, a favor de. Punto tomado acerca de la tecnología enative vs. the newer. – XIVSolutions

Cuestiones relacionadas