Création nd'une table access avant connection

cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 - 5 juil. 2013 à 11:41
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 5 juil. 2013 à 16:00
Bonjour

Je souhaite faire une requête sur une table obtenue après un traitement, et mettre les résultats de cette requête dans une autre table. Ca marche bien tant que la table est créée avant la connexion avec un nombre fixe de colonnes, mais je dois créer cette table de résultats dynamiquement car le nombre de colonnes de cette table de requête est lié à la table de résultats. Donc le code de la table contenant les résultats de la requête marche bien avant la connexion mais pas après:

création de la table de résultats:ok
connexion à la base: ok
traitement: ok
update de la table de résultats:ok
création de la table contenant les résultats:KO
Set oTableStat = New adox.Table
oTableStat.Name = "Stat"
oTableStat.Columns.Append "Texte", adVarWChar
oTableStat.Columns.Append "Enonc", adVarWChar
oCatalog.Tables.Append oTableStat

4 réponses

cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 1
5 juil. 2013 à 11:49
Pour être tout-à-fait précis, les tables sont créées dans les deux cas, mais quand le code est après la connexion, le recordset de cette table ne s'ouvre pas, j'en déduis que la table a un problème
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 juil. 2013 à 12:21
Salut

Pas bien compris.
Le code que tu nous montres crée une table. Ok.
Une fois que ta table est créée, elle n'a plus besoin d'être à nouveau redéfinie (j'espère que c'est clair pour toi).
Cette nouvelle table est sensée recevoir tes nouvelles données ? (je pense que oui)

"création de la table de résultats:ok"
Ok, c'est le code que tu nous a montré (supposition)

"connexion à la base: ok"
Bon, j'imagine bien.
Mais, en toute logique, je ne comprends pas comment il serait possible de créer une table (étape précédente) sans s'être initialement connecté à la base.

"traitement: ok"
Traitement ? de quoi ? lecture de données d'une autre table dans un RecordSet ?

"update de la table de résultats:ok"


"création de la table contenant les résultats:KO"
Déjà fait à l'étape 1 ...
"KO" se traduit par quoi ? Code d'erreur ? lequel ? avec quel code ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
0
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 1
5 juil. 2013 à 13:48
je vais mettre le code en résumé, en effet il ne faut pas confondre "table de résultats" et "table contenant les résultats de la requête sur la table de résultats"

1-connexion à une base de données db1.mdb (contenant des patterns de phrases)

2-création de la table "résultats" qui contient les résultats bruts
Set oCatalog = New adox.Catalog
oCatalog.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & nameDicoMod & ";"
Set oTable = New adox.Table
    With oTable
        .Name = "Resultats"
      With .Columns
         .Append "Texte", adVarWChar
         .Append "Enonce", adVarWChar
         .Append "Signification", adVarWChar
         .Append "ValeurARenvoyer", adVarWChar
         .Append "Freqdens", adSmallInt
      End With
   End With
   oCatalog.Tables.Append oTable


3-connexion à la base db2.mdb (qui va contenir les résultats)
je ne comprends pas pourquoi table "résultats" peut être créée avant la connexion, je me disais que c'était le recordset qui s'en chargeait
Set cnxOutput = New ADODB.Connection
    cnxOutput.Provider = "Microsoft.Jet.Oledb.4.0"
    cnxOutput.ConnectionString = App.Path & "\MesOutputs\Output.mdb"
    cnxOutput.Open


4-traitement:
connexion avec db3.mdb (contenant des mots)
comparaison d'un texte avec db1 et db3
update de la table "résultats" sur db2 en utilisant les résultats du traitement et des données de db1
rs.AddNew: rs.Fields(0) = sInputFile
rs.Fields(1) = posenonce
rs.Fields(2) = rsCombi("Signification")
rs.Fields(3) = rsCombi("ValeurARenvoyer")

fin du traitement

5-création de la table "Stat" qui contient les résultats d'une requête sur la table "résultats"
ce code marche s'il est placé avant la connexion à db2 mais pas ici, cad que le recordset ne s'ouvre pas quand le code est ici
or je dois le mettre ici pour définir dynamiquement les colonnes sur base de table "résultats" que j'obtiens après le traitement
Set oTableStat = New adox.Table
oTableStat.Name = "Stat"
oTableStat.Columns.Append "Texte", adVarWChar
oTableStat.Columns.Append "Enonc", adVarWChar
oCatalog.Tables.Append oTableStat


6-requête
reqStates = "TRANSFORM Count(Auto.ValeurARenvoyer) AS CompteDeValeurARenvoyer"
reqStates = reqStates & " SELECT Auto.Texte, Auto.Enonce"
reqStates = reqStates & " From Auto"
reqStates = reqStates & " GROUP BY Auto.Texte, Auto.Enonce"
reqStates = reqStates & " PIVOT Auto.Signification;"
rsReq.Open reqStates, cnxOutput, adOpenKeyset, adLockPessimistic


7-le recordset ne s'ouvre pas quand le code de la table "Stat" est placé avant la connexion à db2
'cependant la table "Stat" est créée dans les 2 cas
rsStat.Open "SELECT * FROM " & "Stat" & " ;", cnxOutput, adOpenKeyset, adLockPessimistic


merci de l'aide
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 juil. 2013 à 16:00
Concernant ta première phrase "Il ne faut pas confondre ..." : c'est à toi d'adapter la présentation des choses pour que la question reste sans ambigüité, et pas au lecteur de comprendre de quoi tu parles.
Il est important que ta question reste générique et ne traite pas d'un sujet particulier dont on ne sait rien.

db1, db2, db3 : Il a fallu qu'on te questionne pour apprendre ce genre de 'détail' : Non, c'est à toi d'expliquer ton environnement (encore quelques heures de perdues)

"je ne comprends pas pourquoi table "résultats" peut être créée avant la connexion"
En fait si, tu as une connexion : celle créée avec ton fichier "nameDicoMod"
Contenu ?
Encore un exemple des détails qui devraient accompagner ta question : Un coup tu parles de db1, db2 ... une autre fois, de variables ou de Output.mdb
Comment veux-tu qu'on y comprenne quelque chose ?

    cnxOutput.Provider = "Microsoft.Jet.Oledb.4.0"
    cnxOutput.ConnectionString = App.Path & "\MesOutputs\Output.mdb"
Bizarrerie.
ConnectionString renferme, normalement, toutes les infos de connexion.
Si tu définis .Provider puis que tu définis .ConnectionString, il y a fort à parier que .Provider ne soit pas pris en compte, écrasé par la redéfinition de .ConnectionString
A vérifier/tester.

"-4-"
"connexion avec db3.mdb"
Bon, on te croit sur parole
"comparaison d'un texte avec db1 et db3"
Pas clair du tout, ça.
"update de la table "résultats" sur db2 en utilisant les résultats du traitement et des données de db1"
... alors que vient faire db3.mdb dans tout ça ?
De toute façon, le code que tu montres ensuite ne représente aucune de ces 3 dernières phrases ...

"5-"
"ce code marche s'il est placé avant la connexion à db2 mais pas ici"
"ici" : très vague.
Le code qui suit montre la création d'une table que tu associes à "oCatalog".
Or, "oCatalog" a été défini dans ton chapitre "2-"
Donc la table dont tu parles appartiendra à "nameDicoMod" (db ... combien, celle-là ?)

Bon, je m'arrête là.
Impossible de jouer aux devinettes tout l'après midi.
Revoit ta question; rends-là compréhensible par des lecteurs qui ne connaissent rien à ton projet.
Oui, ce n'est pas facile, mais c'est aussi comme ça que, quelques fois, on trouve les réponses tout seul !
0
Rejoignez-nous