2011-07-20 17 views
5

Estoy tratando de obtener el recuento de registros de una tabla, y si el conteo es mayor que 17, cree una nueva tabla.Recuento de registros en la tabla de acceso utilizando VBA

Dim rst As DAO.Recordset 
strSQL = "Select * from SKUS" 
Set rst = db.OpenRecordset(strSQL) 

If rst.RecordCount > 17 Then 
    Set tdf = db.CreateTableDef("161-0363") 

    Set fld = tdf.CreateField("SKUS", dbText, 30) 
    tdf.Fields.Append fld 

    Set fld = tdf.CreateField("Count", dbInteger) 
    tdf.Fields.Append fld 

    db.TableDefs.Append tdf 
End If 

Este código no crea una nueva tabla, pero cuando cambio la sentencia if para esto, funciona:

... 
If rst.RecordCount > 0 Then 
    Set tdf = db.CreateTableDef("161-0363") 
... 

Así que el RecordCount devuelve 1, pienso. ¿Por qué está pasando esto? Sé con certeza que la mesa tiene 18 filas.
¿Alguien puede ayudarme?

Respuesta

7

Debe forzar el conjunto de registros para moverse a través de todas las filas para obtener un conteo preciso. Prueba esto:

... 
Set rst = db.OpenRecordset(strSQL) 

rst.MoveLast 
rst.MoveFirst 
If rst.RecordCount > 17 Then 
... 

A menos que usted está haciendo algo más con el conjunto de registros que no se está mostrando en el fragmento, se puede simplificar el código con sólo hacer una comprobación de la cuenta de registro utilizando la función de recuento de dominio:

If DCount("*", "SKUS") > 17 Then 
+1

Oh tiene! Cuando agregué MoveLast, funcionó. ¡Gracias! – Shubham

+0

Estaba usando una tabla vinculada y una vez que agregué .MoveLast funcionó bien. No tenía .MoveLast antes y funcionaba para cada tabla local pero no para una tabla vinculada. Nunca debería haber más de 300 en mi mesa. Sé que deberías hacer más consultas menos vba pero esto funciona por ahora. Gracias. – RazorSky

3

El problema con strsql es que cuando la cadena representa una consulta de parámetros, el código anterior no funciona.

En este caso me gustaría utilizar un medidor en el código simplificado como a continuación:

rs.movelast 
X = rs.recordcount 
Rs.movefirst 
Do until rs.eof 
    For i = 1 to X 
     If i<=17 then 
      Do things 
     Else 
      Do things 
     End if 
    Next i 
Loop 
+4

¿No te está faltando un 'rs.movenext' en tu loop? – LittleBobbyTables

Cuestiones relacionadas