Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

liste table dans zone de liste

16 réponses
Avatar
denis le breton
Bonjour, voila une bonne semaine que je furête dans les différents sites
(tous excellents), mais ... je ne trouve pas la solution.
J'ai besoin de récupérer le nom d'une table soit dans la BdD active soit
dans une BdD distante, je m'adapterai.
J'aurai aussi besoin de récupérer aussi le nom d'un champ.
En fait je ne cherche pas à lister les tables et les champs, j'ai essayé ça
marche mais cela n'est pas mon objectif.
Pour l'instant j'arrive à récupérer le nom d'une BdD par
Un formulaire, une zone de texte, qui va chercher la fonction adéquat
Private Sub Texte78_Click()
nombdd = OuvrirUnFichier(Me.hwnd, "Parcourir", 1, , "")
Me.Texte78.Value = nombdd
End Sub
...
Public Function OuvrirUnFichier(Handle As Long, Titre As String,
TypeRetour As Byte, Optional TitreFiltre As String, Optional TypeFichier
As String, Optional RepParDefaut As String) As String
...
Je voudrais faire la même chose pour les tables de cette BdD, puis après
avoir sélectionné ma table lister les champs de cette table, pour pouvoir
appliquer un traitement qui fonctionne déjà.
Pour mémoire je suis passé par une création d'une table temporaire pour
récupérer la liste des table
...
Private Sub cherch_tab_Click()
resul = ExistTable("tab_BdD")
If resul = True Then
'Exit Sub
'MonRecordSet.Close
tablbdd = "tab_BdD"
DoCmd.RunSQL "drop table [" & tablbdd & "];"
End If
DoCmd.SetWarnings False
tablbdd = "tab_BdD"
DoCmd.RunSQL "SELECT msysobjects.Name INTO " & tablbdd & " FROM msysobjects
WHERE (((msysobjects.Name) Not Like ""MSys*"") AND ((msysobjects.Name) Not
Like ""tab_BdD"") AND ((msysobjects.Name) Not Like ""~*"") AND
((msysobjects.Type) In (1,6)));"
newcol1 = "Nom"
DoCmd.RunSQL "ALTER TABLE " & tablbdd & " ADD COLUMN " & newcol1 & " TEXT"
DoCmd.RunSQL "UPDATE " & tablbdd & " SET " & tablbdd & "." & newcol1 & " = "
& tablbdd & ".name;"
DoCmd.SetWarnings True
End Sub
...
C'est un peu long mais j'essaye d'être précis
Si vous n'êtes pas toutes et tous parti(e)s en vacances ...
Merci
Denis

6 réponses

1 2
Avatar
denis le breton
Un truc tout bête y a pas en SQL qqch qui liste les champs comme c'est
possible pour les tables ?
comme :
SELECT msysobjects.Name INTO matabl FROM msysobjects WHERE
(((msysobjects.Name) Not Like ""MSys*"") AND ((msysobjects.Name) Not Like
""matable"") AND ((msysobjects.Name) Not Like ""~*"") AND ((msysobjects.Type)
In (1,6)));
cela serait tellement si simple !
A+
Denis


Ne t'inquiète pas, je ne me fâche pas. J'apprends en même temps que
toi. Tout ce qui concerne ADO reste flou pour moi pour l'instant. Je
commence à m'y mettre mais ça surprend souvent. Bref, bon code à toi et
n'hésite pas à revenir !

Dans ton message
Ne te fache point !
DAO et ADO sont pour moi une source d'inspiration mais aussi
d'interrogations profondes. Je suis d'une filière qui a commencé avec le VBA
d'Excel, qui est passé sur les requête puis le vba sur ACCESS, et qui doit
encore progresser pour habiller ce qui tourne bien en simple VBA, de là
besoin de controle de vérification qui me complique la vie, alors de temps en
temps je me marche sur les pieds, je me mélange les pinceaux et patatra je
fais appel aux bonnes volontés dont je te remercie amplement d'ailleurs.
Laisse moi un peu de temps et je reviens sur le fil pour te tenir informé du
problème insurmontable auquel je serai confronté (dans pas longtemps) en
parrallèle je me documente sur les syntaxes, les langages, les codes (et j'ai
un mal de tête ...)
Encore merci, mais cela ne fait que commencer
Denis


J'ai l'impression que tu te compliques la vie avec tout ça. D'un côté, je te
propose du DAO, de l'autre tu utilises ADO, ça fait beaucoup de mélanges, ça
ne facilite ni la compréhension ni la maintenance.

A partir du moment où tu récupères la liste des champs, tu es capable de
tester la présence d'un seul. Par exemple:

Public Function ExisteChampTable(strBase As String, strTable As String,
strChamp As String) As Boolean Dim db As Database, fld As Field
ExisteChampTableúlse
ListeChampsTable=""
Set db = OpenDatabase(strBase)
For Each fld In db.TableDefs(strTable).Fields
If fld.Name=strChamp Then ExisteChampTable=True:Exit For
Next
db.Close: Set db = Nothing
End Function

Tu remarqueras que la structure de la fonction est globalement la même que
celle qui te ramène la liste des champs...

En ce jour mémorable du vendredi 13/07/2007, tu as entrepris la lourde tâche
de taper sur ton clavier :
Pour le dernier Problème j'ai rajouté un byval et c'est mieux
Function ExisteChamp(ByVal NomTable As String, NomChamp As String) As
Boolean Je lache le trombone et je coulisse !
Denis


Thierry je suis encore en vie mais cela ne tient quà un fil (de
discussion) cela tourne aussi autour de mon incomphréhension caractérielle
j'ai aussi un test sur l'existence d'un champ
...
Function ExisteChamp(NomTable As String, NomChamp As String) As Boolean
On Error GoTo err:
Dim MCat As New ADOX.Catalog
Dim MTable As ADOX.Table
Dim MField As ADOX.Column
Set MCat.ActiveConnection = CurrentProject.Connection
Set MTable = MCat.Tables(NomTable)
Set MField = MTable.Columns(NomChamp)
ExisteChamp = True
err:
Set MCat = Nothing
Set MTable = Nothing
Set MField = Nothing
End Function
...
' puis je lance le test
Sub test_existe_chp()
'étape 1 OK
' nom_table,nom_chp
If ExisteChamp("MN322B2", "Cde") = True Then
Else
MsgBox "PB le chp n'existe pas"
End If
'étape 2 génère erreur Type d'argument ByRef incompatble
nombdd = Form_Menu.Nom_tab.Value
MsgBox nombdd
If ExisteChamp(nombdd, "Cde") = True Then
Else
MsgBox "PB le chp n'existe pas"
End If
End Sub
...
l'étape 2 bloque or j'essaie de passer en paramètre le nom de de la table
issu d'un textbox
(Je vais tenter le saut à l'élastique mais comme je n'ai pas d'élastique
sur mon bureau je essayer avec un trombone, cela marchera mieux qu'avec
les fonctions !)
a moins que je finisse par comprendre !
Denis





Je ne veux pas de ta mort sur la conscience, j'explicite donc un peu.

Si j'ai bien compris, tu sais récupérer le chemin de la base distante.
Pour récupérer la liste des tables de ladite base, tu peux mettre, en
source contrôle d'une liste déroulante le résultat de la première
fonction.
taListeDéroulanteTables.RowSource = listeTables(cheminDeLaBase)
Cette ligne est à placer dans le code d'un bouton (par exemple).

Si tu veux récupérer la liste des champs d'une table sélectionnée dans
la liste déroulante précédemment alimentée, tu as juste à placer une
seconde liste déroulante. Dans l'évènement "Sur clic" de la liste
précédente, tu places:

taListeDéroulanteChamps.RowSource = ListerChampsTable(cheminDeLaBase,
taListeDéroulanteTables.Value)


En ce jour mémorable du vendredi 13/07/2007, tu as entrepris la lourde
tâche de taper sur ton clavier :
Fatigue Intellectuelle ou abscence de neurone compatible ? mais je
bloque, je ne sais pas comment utiliser la (les) fonctions, je suis
infoutu de passer les paramètres.
Il ne me reste plus que le gaz ou sauter de mon balcon de rez de
chaussée ! Denis


Hello denis le breton !

J'ai parlé d'utilisation du code, une simple adaptation suffit pour
répondre à ton besoin:

Public Function ListeTables(strBase As String) As String
Dim db As Database
Set db = OpenDatabase(strBase)
ListeTables=""
For Each tdf In db.TableDefs
listeTables=listeTables & tdf.Name & ";"
Next
db.Close: Set db = Nothing
End Function

Et tu récupères la liste des tables séparées par des ";"

Public Function ListerChampsTable(strBase As String, _
strTable As String) As String
Dim db As Database, fld As Field
ListeChampsTable=""
Set db = OpenDatabase(strBase)
For Each fld In db.TableDefs(strTable).Fields
ListerChampsTable=ListerChampsTable & fld.Name & ";"
Next
db.Close: Set db = Nothing
End Function

Et tu récupères la liste des champs de la table en paramètre pour la
base en paramètre.

En ce jour mémorable du vendredi 13/07/2007, tu as entrepris la lourde
tâche de taper sur ton clavier :
Pas tout à fait car ce code nécessite que je connaisse la table (son
nom), or moi je cherche à lister le nom des tables d'une BDD, (et de
récupérer par sélection le nom de l'une d'elles)
Suis je plus clair ?
Merci


Salut denis !

Il me semble qu'en utilisant le code présent ici
http://access.fr.free.fr/articles.php?lng=fr&pgD
tu devrais pouvoir t'en sortir. A partir du moment où tu peux accéder
à la collection TableDefs d'une base externe, tu as accès aux champs
donc à l'info que tu cherches.

Message du vendredi 13/07/2007

Bonjour, voila une bonne semaine que je furête dans les différents
sites (tous excellents), mais ... je ne trouve pas la solution.
J'ai besoin de récupérer le nom d'une table soit dans la BdD active
soit dans une BdD distante, je m'adapterai.
J'aurai aussi besoin de récupérer aussi le nom d'un champ.
En fait je ne cherche pas à lister les tables et les champs, j'ai
essayé ça marche mais cela n'est pas mon objectif.
Pour l'instant j'arrive à récupérer le nom d'une BdD par
Un formulaire, une zone de texte, qui va chercher la fonction
adéquat Private Sub Texte78_Click()
nombdd = OuvrirUnFichier(Me.hwnd, "Parcourir", 1, , "")
Me.Texte78.Value = nombdd
End Sub
...
Public Function OuvrirUnFichier(Handle As Long, Titre As String,
TypeRetour As Byte, Optional TitreFiltre As String,
Optional TypeFichier As String, Optional RepParDefaut As String)
As String ...
Je voudrais faire la même chose pour les tables de cette BdD, puis
après avoir sélectionné ma table lister les champs de cette table,
pour pouvoir appliquer un traitement qui fonctionne déjà.
Pour mémoire je suis passé par une création d'une table temporaire
pour récupérer la liste des table
...
Private Sub cherch_tab_Click()
resul = ExistTable("tab_BdD")
If resul = True Then
'Exit Sub
'MonRecordSet.Close
tablbdd = "tab_BdD"
DoCmd.RunSQL "drop table [" & tablbdd & "];"
End If
DoCmd.SetWarnings False
tablbdd = "tab_BdD"
DoCmd.RunSQL "SELECT msysobjects.Name INTO " & tablbdd & " FROM
msysobjects WHERE (((msysobjects.Name) Not Like ""MSys*"") AND
((msysobjects.Name) Not Like ""tab_BdD"") AND ((msysobjects.Name)
Not Like ""~*"") AND ((msysobjects.Type) In (1,6)));"
newcol1 = "Nom"
DoCmd.RunSQL "ALTER TABLE " & tablbdd & " ADD COLUMN " & newcol1 & "
TEXT" DoCmd.RunSQL "UPDATE " & tablbdd & " SET " & tablbdd & "." &
newcol1 & " = " & tablbdd & ".name;"
DoCmd.SetWarnings True
End Sub
...
C'est un peu long mais j'essaye d'être précis
Si vous n'êtes pas toutes et tous parti(e)s en vacances ...
Merci
Denis


--
Cordialement,
Thierry

Tout pour réussir avec Access :
http://www.mpfa.info






--
Cordialement,
Thierry

Tout pour réussir avec Access :
http://www.mpfa.info






--
Cordialement,
Thierry

Tout pour réussir avec Access :
http://www.mpfa.info







--
Cordialement,
Thierry

Tout pour réussir avec Access :
http://www.mpfa.info






--
Cordialement,
Thierry

Tout pour réussir avec Access :
http://www.mpfa.info















Avatar
Raymond [mvp]
Bonjour.

juste pour illustrer que travailler avec la table msysobjects est une erreur
à long terme sur des bases d'exploitation, que fait-on des sous-tables des
pièces jointes, des champs à valeurs multiples et des historiques de champs
mémos ? toutes les requêtes qui ont été conçues sur cette table système sont
fausses et peuvent provoquer des disfonctionnements.
Quelques lignes de code standard ne prennent pas beaucoup de temps et c'est
tellement plus rassurant.

--
@+
Raymond Access MVP http://www.OfficeSystemAccess.com/
http://officesystem.access.over-blog.com/
http://officesystem.access.free.fr/wiki/
Pour débuter sur le forum: http://www.mpfa.info/

Venez découvrir Open XML, le nouveau format de fichier de la suite Office !
http://www.comscamp.com/Tracker/Redirect.ashx?linkidÿ71c7f3-78e8-4371-abaf-b73c259e58db


"denis le breton" a écrit dans le
message de news:
| Un truc tout bête y a pas en SQL qqch qui liste les champs comme c'est
| possible pour les tables ?
| comme :
| SELECT msysobjects.Name INTO matabl FROM msysobjects WHERE
| (((msysobjects.Name) Not Like ""MSys*"") AND ((msysobjects.Name) Not Like
| ""matable"") AND ((msysobjects.Name) Not Like ""~*"") AND
((msysobjects.Type)
| In (1,6)));
| cela serait tellement si simple !
| A+
| Denis
|
Avatar
denis le breton
Bonjour Raymond et merci d'apporter ton éclairage sur ce fil.
Sans remettre en cause (je n'en ai pas les moyens) le bien fondé de tes
remarques, la puissance de l'outil à son pendant et les questions de comment
puis je le faire et comment vais le faire, font le bonheur de ce forum.
Chacun apporte sa pierre (quelques fois dans la marre de l'autre). Une chose
pratique serait d'ailleurs que les questions soient closes avec la réponse
appliquée par le demandeur initial. Cela sert d'aileurs lors des recherches
avant de poser une question. Crois bien que j'ai passer déjà beaucoup de
temps à me documenter et chercher. Toute idée ou suggestion est bonne à
prendre la mise en application en est la panacée ... jusqu'au problème
suivant.
Merci encore à toi.
Denis


Bonjour.

juste pour illustrer que travailler avec la table msysobjects est une erreur
à long terme sur des bases d'exploitation, que fait-on des sous-tables des
pièces jointes, des champs à valeurs multiples et des historiques de champs
mémos ? toutes les requêtes qui ont été conçues sur cette table système sont
fausses et peuvent provoquer des disfonctionnements.
Quelques lignes de code standard ne prennent pas beaucoup de temps et c'est
tellement plus rassurant.

--
@+
Raymond Access MVP http://www.OfficeSystemAccess.com/
http://officesystem.access.over-blog.com/
http://officesystem.access.free.fr/wiki/
Pour débuter sur le forum: http://www.mpfa.info/

Venez découvrir Open XML, le nouveau format de fichier de la suite Office !
http://www.comscamp.com/Tracker/Redirect.ashx?linkidÿ71c7f3-78e8-4371-abaf-b73c259e58db


"denis le breton" a écrit dans le
message de news:
| Un truc tout bête y a pas en SQL qqch qui liste les champs comme c'est
| possible pour les tables ?
| comme :
| SELECT msysobjects.Name INTO matabl FROM msysobjects WHERE
| (((msysobjects.Name) Not Like ""MSys*"") AND ((msysobjects.Name) Not Like
| ""matable"") AND ((msysobjects.Name) Not Like ""~*"") AND
((msysobjects.Type)
| In (1,6)));
| cela serait tellement si simple !
| A+
| Denis
|





Avatar
3stone
"denis le breton"
[...]
| Une chose pratique serait d'ailleurs que les questions soient closes avec la réponse
| appliquée par le demandeur initial.

"X-Newsreader: Microsoft CDO for Windows 2000"

Pffuittt... Un CDO ;-(

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
Avatar
denis le breton
Hello 3stone, toi aussi tu apportes ta pierre ?
On a le droit de réver, et je puis te dire qu j'ai trouver pas mal de
réponse à mes questions sans vous embéter Ô MVP !
Bon week
Denis


"denis le breton"
[...]
| Une chose pratique serait d'ailleurs que les questions soient closes avec la réponse
| appliquée par le demandeur initial.

"X-Newsreader: Microsoft CDO for Windows 2000"

Pffuittt... Un CDO ;-(

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)




Avatar
3stone
"denis le breton" <
| et je puis te dire qu j'ai trouver pas mal de
| réponse à mes questions sans vous embéter Ô MVP !


Le "Ô MVP" l'est justement devenu parce qu'il a cherché par lui-même ;-))

Quant à *cloturer* les demandes par le demandeur "initial" ne peux venir que de
quelqu'un qui ne fait pas la différence entre forum (web) et un newsgroup pour
lequel on utilise un lecteur de news ;-)

Ô CDO :-)

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
1 2