2008-10-24 5 views
0

J'ai une base de données avec une table qui est pleine de conditions et de messages d'erreur pour vérifier une autre base de données. Je souhaite exécuter une boucle de sorte que chacune de ces conditions soit vérifiée par rapport à toutes les tables de la seconde base de données et génère un rapport qui donne les erreurs.Comment lancer une boucle de requêtes en accès?

Est-ce possible en accès ms?

Par exemple,

table querycrit

id   query         error  
1   speed<25 and speed>56    speed above limit 
2   dist<56 or dist >78    dist within limit 

J'ai plus de 400 requêtes comme celle-ci de différentes variables.

la table contre laquelle je courais les requêtes est

records tableau

id speed  dist accce decele aaa bbb  ccc 
1  33  34  44   33 33  33  33 
2  45  44  55   55 55  22  23 

concernant TTK

Répondre

2

Voici encore un exemple de code. Il illustre l'utilisation de deux types d'enregistrements différents. Vous pouvez lire VBA Traps: Working with Recordsets par Allen Browne et List of reserved words in Access 2002 and in later versions of Access .

Dim rs As DAO.Recordset 
Dim rs2 As ADODB.Recordset 

Set rs = CurrentDb.OpenRecordset("querycrit") 
Set rs2 = CreateObject("ADODB.Recordset") 
rs2.ActiveConnection = CurrentProject.Connection 
For Each tdf In CurrentDb.TableDefs 
'EDIT: TableDefs includes Microsoft System tables and ' 
'these should never be tampered with. They all begin with Msys ' 
'so we can leave them out of the loop here. ' 
    If Left(tdf.Name, 4) <> "msys" And tdf.Name <> "querycrit" Then 
     rs.MoveFirst 
     strSQL = "SELECT * From [" & tdf.Name & "] WHERE " 

     Do While Not rs.EOF 
      On Error Resume Next 
      Debug.Print tdf.Name 
      rs2.Open strSQL & " " & rs![query] 
      If Err.Number = 0 Then 
       On Error GoTo 0 
       If Not rs2.EOF Then 
        Debug.Print rs![Error] 
        Debug.Print rs2.GetString 
       End If 
      End If 
      Err.Clear 
      rs2.Close 
      rs.MoveNext 

     Loop 
    End If 
Next 
End Sub 
+0

ici, je reçois une erreur d'exécution 3734 à Pour chaque tdf Dans CurrentDb.TableDefs j'ai défini tdf comme tabledef – tksy

+0

j'ai un doute dans ce code. Supposons que rs2 ait un certain nombre d'enregistrements à partir d'une table, alors cela va exécuter la requête contre un seul enregistrement rite pas tous les enregistrements? – tksy

0

Quand vous dites "rapport", voulez-vous dire un rapport d'accès, ou si écrire à un fichier ou un formulaire d'accès fonctionne?

Vous pouvez créer une fonction ou un sous-module dans un module pour ce faire. Ouvrez un jeu d'enregistrements sur votre table querycrit et faites défiler les enregistrements dynamiquement en créant et en exécutant le SQL pour la table enregistrements. Vous pouvez écrire les résultats de ces requêtes dynamiques dans un fichier ou un formulaire, ou insérer les résultats dans une table temporaire et générer le rapport d'accès à partir de là.

0

Voici un exemple de code, il est tapé, non testé.

Dim rs AS DAO.Recordset 
Dim rs2 AS DAO.Recordset 

Set rs=CurrentDB.OpenRecordset("querycrit") 

strSQL="SELECT * From Records WHERE " 
Do While Not rs.EOF 
    Set rs2=CurrentDB.OpenRecordset(strSQL & rs![Query]) 
    If Not rs2.EOF Then 
     Debug.Print rs![Error] 
     Debug.Print rs2.Fields(1) 
    End If 

    rs.MoveNext 
Loop 
0

« En fait il y a beaucoup de tables d'enregistrements à vérifier et toutes les requêtes ne peuvent être exécutés sur toutes les tables, par exemple dans une vitesse de la table ne peut pas être là et la distance prochaine table peut ne pas être là. "

Le bon penser à faire, je pense, serait de créer une table des tables et une table de jonction table de requête qui indique les requêtes qui sont à exécuter sur quelle table, par exemple:

TableID QueryID 
1   4 
2   1 
2   3 
3   1 

Cela peut être utilisé pour exécuter le jeu correct de requêtes sur chaque table.

Questions connexes