Colonne melanger dans une Table ADOX

cs_GASTONLAGAF Messages postés 12 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 23 octobre 2010 - 22 oct. 2010 à 23:56
cs_GASTONLAGAF Messages postés 12 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 23 octobre 2010 - 23 oct. 2010 à 20:40
Bonsoir a tous!

Voila je m'en remets a vous, après seulement 3 jours d'arrachage de cheveux et 5 perruques, pour m'expliquer un comportement un peut bizarre d'une table ADOX
Lorsque j'ajoute une table (ADOX) a un catalogue, les colonnes de ma table ce mélange...
Je met un bout de code pour expliquer

Dim Tbl as new ADOX.Table
Dim Cnx As New ADODB.Connection
Cnx.Open(Me._StrConnection)
Me._CatalogueADOX = New ADOX.Catalog
Me._CatalogueADOX.ActiveConnection = Cnx
Tbl.Name = Table.TableName
Tbl.ParentCatalog = Me._CatalogueADOX
Me.AjoutColonnes(Tbl, LstCol) 'Cette fonction ajoute des colonnes exemple : NUM, NOM, PRENOM
'A ce moment la si je contrôle ma table j'ai bien NUM, NOM, PRENOM
Me._CatalogueADOX.Tables.Append(Tbl) 'J'ajoute ma table
'Une fois le append fais si je contrôle ma table a nouveau et de la même manière j'ai NOM, NUM, PRENOM (Les colonnes sont rangé par ordre alphabétique).

Pour contrôler mes colonne je fais simplement une boucle 'pour' qui passe en revu chaque colonne de la 0 a la dernière.
Mais le truc encore plus étonnant, le boucle me sort les colonne par ordre alphabetique alors que si j'ouvre la table avec access elle est bien rangé comme je l'ai définit au départ (NUM, NOM...)

Voila, je sais pas si j'ai été bien claire mais ma question est : pourquoi mes colonnes de ma table ce retrouve mélangé?

J'utilise une boucle pour créer une commande "INSERT INTO" paramétré mais comme elle me retourne pas les colonnes dans le bon ordre je mets pas les valeurs dans les bonnes colonnes naturellement

Merci d'avance

4 réponses

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
23 oct. 2010 à 02:22
Salut

Sans connaitre le code que tu utilises pour faire ta boucle 'pour', difficile de te dire si c'est correct.
Dans une table, rien ne garantit que les données soient dans un ordre précis.
Malgré tout, les lignes de données doivent et sont solidaires.

"je mets pas les valeurs dans les bonnes colonnes"
De quoi parles-tu en parlant de 'colonne' ?
Pour moi, ce sont les noms des champs qui composent la table, les lignes étant les contenus qu'on y ajoute.

Me.AjoutColonnes(Tbl, LstCol)
Que représente LstCol ? Une chaine, un tableau ? Que contient-elle/il ?
Et pourquoi appelles-tu ça des colonnes, c'est bizarre

Quelle est ta syntaxe de Insert Into ?

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 la partage (Socrate)
0
cs_GASTONLAGAF Messages postés 12 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 23 octobre 2010
23 oct. 2010 à 12:59
Salut,
Merci pour cette réponse rapide.

Alors ma boucle pour connaitre la liste des colonnes est assez simple :
nb = Me._CatalogueADOX.Tables(Tbl.Name).Columns.Count - 1
txt = "Liste colonne" & vbCrLf
For cpt = 0 To nb
txt = txt & "|" & Me._CatalogueADOX.Tables(Tbl.Name).Columns(cpt).Name
Next
MsgBox(txt)

D’ailleurs au passage pour répondre a la question "Pourquoi j'appel ça des colonnes?" ben je sais pas parce que c'est des colonnes d’ailleurs eux y appel aussi colonnes (columns)

Pour la fonction AjoutColonnes, LstCol est un tableau d'une structure que j'ai créé.
Cette structure est simple et permet de savoir le nom de la colonne, le type, si elle s'auto-incremente, si elle peut être null... bref le nécessaire.
Ensuite dans ma fonction je crée une ADOX.Column par rapport a chaque élément du tableau et je les ajoutes a mon ADOX.Table.
Jusque la y a pas de problème si j’exécute ma boucle cité si dessus j'ai bien la liste des colonnes dans le même ordre que celui fournit dans mon tableau LstCol.

La syntaxe de Insert Into maintenant, alors je fais :
INSERT INTO NomTable (Col0,Col1,Col2...) values (Val0,Val1,Val2,...)
MAIS ben oui y a un mais sinon j'aurai pas de soucis , comme je ne connais pas au départ la structure de la table, pour créer cette commande j’exécute la boucle ci dessus pour récupérer la liste des colonnes et remplir la partie Col0,Col1...
Mon soucis c'est que quand je lance la boucle avant le append de la table dans le catalog j'ai bien mes colonne dans le bon ordre et si je relance ma boucle après le append (au moment de la création de la commande) ben les colonnes ne sont plus lu dans l'ordre défini avant mais dans l'ordre alphabétique (par rapport a leurs noms) et comme Val0,Val1... arrive dans un tableau rangé par rapport a l'ordre du départ quand je fais mon insert mes valeurs ne ce retrouvent pas dans les bonnes cases.

Voila tout! Est dire que je fait tout ça pour simplement convertir une DataTable en ADOX.Table tous simplement par ce qu'on peut pas (ou j'ai pas trouvé, ou je suis mauvais peut être...) comment rajouter une DataTable directement dans une base Acces existante...

C'est un peut long pour pas dire un roman mais bon...
Voili, voulou...
Merci pour ton aide .
Yohann.
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
23 oct. 2010 à 15:40
Bon.
Je te l'avoue, je ne connais rien aux particularités de l'objet ADOX sous .Net, mais je pars du principe qu'il n'a pas fondamentalement changé de sa version précédente.

Pourquoi l'ordre dans lesquels se retrouvent les champs (colonnes) te gène t-il ?
Normalement, quand on fait un Insert Into (comme tu l'as fait), le nom des champs précisés dans la première partie doit coïncider avec la liste des valeurs de la dernière partie; peu importe l'ordre; ça n'a aucune influence.
Pour ce qui est de la relecture d'une table, on peut relire la table entière en ne précisant que son nom, auquel cas, les champs apparaitront peut-être dans un ordre qui ne te convient pas, tout dépend comment tu utilises les données ensuite.
Si, par contre, tu utilises une requète SQL, un Select, tu définiras dans cette requète l'ordre dans lequel tu veux relire les champs.
Et, de toute façon, les champs ne perdant pas leurs appellations, il est aisé de rappeler un champ par son nom, au lieu de les lire dans l'ordre dans lesquels il apparaissent.

Tu te fais un noeud au cerveau pour rien, je pense.
Peut-être suffit-il que tu affines la méthode d'accès aux données.
Je pense que les objets ADOX.Table par exemple, se comportent comme des collections et qu'il doit être possible d'appeler un champ comme ceci :
monObjetTable.Columns(x), où x est un index, ou monObjetTable.Columns("le nom du champ")

Dans l'aide de ADOX dans .Net, il y a des exemples comme dans l'aide de la propriété SortOrder de la collection Columns.

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 la partage (Socrate)
0
cs_GASTONLAGAF Messages postés 12 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 23 octobre 2010
23 oct. 2010 à 20:40
Pourquoi l'ordre dans lequel ce retrouvent mes champs me gène, c'est par ce que comme je l'ai dis j'ai pas de structure de table définit au départ, j'ai besoin d'un point de repère et c'est justement cette ordre de création...
Comme je l'ai dit dans mon précèdent message, le but et de traduire une DataTable en Table ADOX, pour cela, je crée les champs de la table en fonction de la liste de champs de ma DataTable. Ensuite je crée ma commande Insert comme décrit ci dessus en récupérant la liste des Champs (sans connaitre encore les valeurs a ajouter) et pour finir je fais une boucle qui recupere chaque enregistrement de ma DataTable et rajoute ces valeurs a ma commande Insert. Je finis par executer cette commande et après en théorie c'est tout bon!
Mais comme ma boucle qui récupère les colonnes ne me les renvoie pas dans le bon ordre je me retrouve avec une commande du style :
INSERT INTO NomTable (Col2,Col1,Col3) values (Val1,Val2,Val3) et donc forcement ça fou le binsse dans ma table...

Je vais essayer de contourner le problème en récupérant directement mes colonnes dans la DataTable, mais bon le code est vraiment pas propre et surtout je n'ai pas Compris d'où venait mon problème et c'est ce qui m’énerve le plus...

Voili,voilou
0
Rejoignez-nous