cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 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.
[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.
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 201827 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" ???