Requête SQL sur une base Access [Résolu]

cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 3 avril 2012 à 18:50 - Dernière réponse :  Utilisateur anonyme
- 4 avril 2012 à 03:16
 Bonsoir à tous,

Je rencontre quelques difficultés sur une requête SQL.


Dans une base Access, je selectionne certaines tables.

Function ReadBase(MyBase)
    Const adSchemaTables = &h14
    Dim Db, Rs
    Set Db = CreateObject("ADODB.Connection")
    Db.Open  "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &_
              cstPathMdb & MyBase & ".MDB" & ";Persist Security Info=False;"
    'Db.Open  "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" &_
    '         cstPathMdb & MyBase & ".MDB" & ";Persist Security Info=False;"
    Set Rs = Db.OpenSchema(adSchemaTables)

    Call ReadTable(Rs, Db)

    Set Db  = Nothing
    Set Rs  = Nothing
End Function



Particularités d'un serveur Windows2008 R2:
Provider Jet si exécution du script en natif
Provider Ace si exécution via tâche planifiée


Puis, je parcours les recordsets.
Si dans ceux-ci je trouve une expression (cstWordError),
je récupère le nom de la table.


Function ReadTable(Rs, Db)
    Dim MyQuery, Rst
    Dim MyArrayList
    
    Set MyArrayList = CreateObject("System.Collections.ArrayList")
 
    Do Until Rs.EOF
       If Left(Rs.Fields("TABLE_NAME").Value, 3) = "E_X" Then
          MyQuery = "SELECT LINE_TEXT FROM " & Rs.Fields("TABLE_NAME").Value 
          
          '& " Where " & Instr(1, MyLine, cstWordError)
          
          Set Rst = CreateObject("ADODB.Recordset")
          Rst.Open MyQuery ,Db
'
          Do While Not Rst.EOF
             If InStr(1, Rst.Fields(0), cstWordError) Then
                MsgBox Rs.Fields("TABLE_NAME") & Space(1) & Rst.Fields(0)
                MyArrayList.Add Rs.Fields("TABLE_NAME") & Space(1) & Rst.Fields(0)
             End If 
             Rst.MoveNext  
          Loop 
          Rst.Close
          Set Rst = Nothing 
       End If 
       Rs.MoveNext     
    Loop
    Rs.Close 
        
    MyArrayList.Sort()

    Call ShowList(MyArrayList) 
    
    Set MyArrayList = Nothing
End Function

Sub ShowList(ByRef arrListName)
Dim strItem, strList
For Each strItem in arrListName
    strList = strList & strItem &vbcrlf
Next
WScript.Echo strList
End Sub



Avec ma collection MyArrayList, je vais devoir relire les tables sélectionnées pour mettre dans un dictionnaire toutes les lignes de chaque recordsets de ma collection , puis sélectionner/omettre certaines lignes.

Question:
Je n'arrive pas à inclure un where dans la requête MyQuery.
Si dans un recordset, une ligne contient le mot "cstWordError", je souhaiterai mémoriser toutes les lignes de ce recordset.


Merci par avance de vos suggestions.






jean-marc
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Utilisateur anonyme - 4 avril 2012 à 03:16
3
Merci
Bonjour,


[i]Particularités d'un serveur Windows2008 R2:
Provider Jet si exécution du script en natif
Provider Ace si exécution via tâche planifiée /i

Et tu fais quoi avec l'injureBox que tu reçois quand quand Access 2007 et Access 2010 en voient ton moteur Jet au diable, ou que les "vieux" Access envoient ton moteur ACE au diable ? Quoi que puisse rêver le Service de Dictature Informatique, ce n'est pas la tâche qui détermine le type de moteur à utiliser, mais la version d'Access :
2003 et avant : moteur Jet
2007 et 2010 : moteur ACE.
C'est amplement documenté sur le site de Microsoft.

Un article qui pourrait t'aider ici

Pour le reste, je ne suis pas assez connaisseur en ADO et en SQL. De plus, je n'ai pas Acces.

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 3 avril 2012 à 21:52
0
Merci
 Bonsoir le Forum,


Avancement progressif


Function ReadBase(MyBase)
    Const adSchemaTables = &h14
    Dim Db, Rs
    Set Db = CreateObject("ADODB.Connection")
    Db.Open  "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &_
              cstPathMdb & MyBase & ".MDB" & ";Persist Security Info=False;"
    'Db.Open  "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" &_
    '         cstPathMdb & MyBase & ".MDB" & ";Persist Security Info=False;"
    Set Rs = Db.OpenSchema(adSchemaTables)

    Call ReadTable(Rs, Db)

    Set Db  = Nothing
    Set Rs  = Nothing
End Function
'############################################################################
Function ReadTable(Rs, Db)
    Dim Rst, MyQuery, MyArrayList
    
    Set MyArrayList = CreateObject("System.Collections.ArrayList")
 
    Do Until Rs.EOF
       If Left(Rs.Fields("TABLE_NAME").Value, 3) = "E_X" Then
          MyQuery = "SELECT LINE_TEXT FROM " & Rs.Fields("TABLE_NAME").Value 
          
          Set Rst = CreateObject("ADODB.Recordset")
          Rst.Open MyQuery ,Db

          Do While Not Rst.EOF
             If InStr(1, Rst.Fields(0), cstWordError) Then
                MyArrayList.Add Rs.Fields("TABLE_NAME").Value
             End If 
             Rst.MoveNext  
          Loop 
          Rst.Close
          Set Rst = Nothing 
       End If 
       Rs.MoveNext     
    Loop
    Rs.Close 

    Call SelectRecorSet(Rs, Db, MyArrayList)
    
    Set MyArrayList = Nothing
End Function

Sub SelectRecorSet(Rs, Db, MyArrayList)
Dim Rst, i
        MsgBox MyArrayList.Count,,"SelectRecorSet"

Set Rst = CreateObject("ADODB.Recordset")

For i=0 To MyArrayList.Count-1
            Rst.Open "SELECT LINE_TEXT FROM " & MyArrayList(i) ,Db	
    Do While Not Rst.EOF
       MsgBox Rst.Fields(0),,"check line IQS"
       'Récupération ok de chaque ligne du recordset comprenant le mot "cstWordError"
       Rst.MoveNext
    Loop
    Rst.Close
Next
Set Rst = Nothing 
End Sub



Est-il possible d'optimiser la requête SQL "MyQuery"
de la fonction "ReadTable" avec une clause "Where" ???



jean-marc
Commenter la réponse de cs_JMO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.