Requête SQL sur une base Access

Résolu
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 3 avril 2012 à 18:50
 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

2 réponses

Utilisateur anonyme
4 avril 2012 à 03:16
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.
3
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
3 avril 2012 à 21:52
 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
0
Rejoignez-nous