2009-09-02 8 views
2

J'ai une requête enregistrée dans la section des requêtes. Je cours la requête de VBA. Est-il possible d'enregistrer les résultats de cette requête dans une chaîne?ms-access sauvegarde la requête dans une chaîne

+0

Quelle est votre requête de retour? Un ensemble d'enregistrements ou un seul article? – Patrick

+0

un jeu d'enregistrements à partir d'une table –

+0

Vous devez clarifier votre question: avez-vous besoin d'en-têtes? ce qui sépare les valeurs des champs retournés? Les colonnes devraient-elles être de largeur fixe ou non? Qu'est-ce qui sépare les rangées? Est-ce pour l'affichage ou pour l'enregistrement dans un fichier? –

Répondre

4

Un jeu d'enregistrements ADO a une méthode GetString qui pourrait être utile pour vous.

J'ai une requête nommée qryListTables qui ressemble à ceci:

SELECT m.Name AS tbl_name 
FROM MSysObjects AS m 
WHERE 
     (((m.Name) Not Like "msys%" 
    And (m.Name) Not Like "~%") 
    AND ((m.Type)=1)) 
ORDER BY m.Name; 

Notez que la requête utilise % au lieu de * que le caractère générique. La raison de ce choix est que ADO requiert des caractères génériques ANSI (% et _ au lieu de * et ?).

je peux utiliser la fonction suivante pour cracher une chaîne contenant les noms cités des tables régulières dans ma base de données, séparés par des points-virgules, en appelant comme ceci:

? DemoGetString("qryListTables", True) 

Public Function DemoGetString(ByVal pQueryName As String, _ 
    Optional ByVal AddQuotes As Boolean = False) As Variant 
    '* early binding requires a reference to Microsoft ActiveX 
    '* Data Objects Library 
    'Dim rs As ADODB.Recordset 
    'Set rs = New ADODB.Recordset 

    '* use late binding; no referenced needed 
    Dim rs As Object 
    Set rs = CreateObject("ADODB.Recordset") 

    Dim varOut As Variant 
    rs.Open pQueryName, CurrentProject.Connection 
    If AddQuotes Then 
     varOut = """" & rs.GetString(2, , , """;""") '2 = adClipString 
     ' strip off last quote 
     If Len(varOut & vbNullString) > 0 Then 
      varOut = Left(varOut, Len(varOut) - 1) 
     End If 
    Else 
     varOut = rs.GetString(2, , , ";") '2 = adClipString 
    End If 
    rs.Close 
    Set rs = Nothing 
    DemoGetString = varOut 
End Function 
+1

Dans les jeux d'enregistrements DAO, vous pouvez faire la même chose en plaçant la sortie de GetRows dans un tableau, puis en utilisant Join() pour convertir le tableau en liste délimitée. –

+0

Merci. J'ai d'abord cherché GetString dans DAO avant de réaliser que c'est seulement disponible dans ADO.Mais je préfère habituellement DAO, donc j'apprécie votre suggestion. – HansUp

+0

Puisque tant de gens ici sur SO utilisent ADO, j'essaie de m'assurer que la version DAO de toutes les solutions ADO est publiée (là où cela a du sens), puisque DAO est l'interface Access-appropriée. –

3

Ok .. prendre un coup de feu dans l'obscurité complète ici ...

La requête que vous utilisez est littéralement une question ... penser comme sa table ... PROPRE il peut être référencé que vous serait une autre table, et peut être interrogé contre.

Si vous essayez de retourner un seul élément de chaîne basée sur un seul critère votre meilleur pari est un Dlookup:

Lookup = Nz(DLookup(string Field, string Table, string Criteria), "") 

Si vous cherchez un groupe d'enregistrements:

dim tsSQL as string 
stSQL = "SELECT * FROM table WHERE field=criteria" 
dim toRecordset as new ADODB.Recordset 
toRecordset.open stSQL, CurrentProject.AccessConnection, int Keyset, int Lock 

Ensuite, vous pouvez directement accéder aux champs par:

If toRecordset.RecordCount > 0 then 
    String = toRecordset!FieldName 
End If 

Plus d'informations ... que c'est ... En outre, il fonctionne dans l'autre sens aussi bien ..

Vous pouvez faire:

toRecordset.AddNew 
toRecordset!Field = Value 
toRecordset.Update 

J'espère que quelque part il y a une réponse pour vous.

Pour toute requête, vous pouvez modifier l'instruction select d'exemple, un à « SELECT * FROM nom de la requête » et qui devrait tirer la chose dans.

Questions connexes