COMMENT CRÉER UNE BASE ACCESS, CRÉER TABLE, LIRE COLONNE, EN QUELQUES LIGNES VB5

cs_shivan Messages postés 363 Date d'inscription jeudi 20 décembre 2001 Statut Membre Dernière intervention 25 août 2003 - 2 mars 2002 à 18:50
psy460 Messages postés 10 Date d'inscription mercredi 14 janvier 2009 Statut Membre Dernière intervention 24 avril 2009 - 4 févr. 2009 à 13:28
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/2722-comment-creer-une-base-access-creer-table-lire-colonne-en-quelques-lignes-vb5-vb6

psy460 Messages postés 10 Date d'inscription mercredi 14 janvier 2009 Statut Membre Dernière intervention 24 avril 2009
4 févr. 2009 à 13:28
si dim db as dao.database par exemple il connais, ou dim wks as dao.worspace(s) il commais mais avec set db=dao.* il propose rien et connais rien :s
cs_bigane Messages postés 46 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 12 février 2004
4 févr. 2009 à 08:17
Je suis désolé, ce code fonctionnait avec VB6 et VBA pour Office 97 à 2003.
Microsoft a évolué depuis et avec le temps j'ai abandonné tous leurs produits au profit des produits libres (entendre libre d'accès aux sources et gratuits).

Donc le premier test pour savoir si ce code est toujours d'actualité, c'est DAO. Si cet objet est reconnu (cf : 2- dans le menu projet, menu références, coche : Microsoft DAO 3.5 Object Library ou DAO avec une version supérieure) En saisissant le mot DAO puis le point dans la fenêtre du code, alors la complétion automatique devrait te proposer Workspace(0) ou quelque chose d'approchant. Au pire, il pourrait te proposer le mot OpenDatabase :
DAO.OpenDatabase( ...

Si tu n'arrives pas à avoir cette méthode : càd pas de complétion pour le mot DAO c'est que :
1) soit tu n'as pas mis Microsoft DAO x.y Object Library
2) soit tu n'utilises pas VB ou VBA

Bon courage,
Bigane
psy460 Messages postés 10 Date d'inscription mercredi 14 janvier 2009 Statut Membre Dernière intervention 24 avril 2009
2 févr. 2009 à 22:01
j'ai un problème : il ne reconnait pas workspaces(0) :s

pourquoi il n'en veut pas ??
Reelaxman Messages postés 56 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 9 décembre 2007
8 déc. 2007 à 22:45
Du sur mesure !!!!!!!!!!!!!!
cs_bigane Messages postés 46 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 12 février 2004
25 févr. 2007 à 19:37
Merci,
a ton service et bon code.
a+
Bigane
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
21 févr. 2007 à 20:41
Salut,

Qui cherche, trouve...j'ai cherché...j'ai trouvé !!
Cela ma évité de poser une question sur le forum..
10/10

A+
Exploreur
Munkyubi Messages postés 16 Date d'inscription mardi 24 mai 2005 Statut Membre Dernière intervention 23 mars 2010
12 janv. 2006 à 09:37
Bonjours. Tout d'abord merci beaucoup pour ce code c'est trés sympa et trés bien fait ^^
Par contre j'aimerais savoir. Peut-on, à la manière du DAO, créer des tables, champs etc... sans utiliser de requêtes mais en ADO ? Je sais qu'en DAO il y a déjà des méthodes définies pour le faire mais j'aimerais savoir si en ajoutant une référence ou autre on pourrait le faire en ADO. (Tout simplement parce-que mon boss n'aime pas vraiment les requêtes sql lol)
Merci d'avance ^^
pi_givinchi Messages postés 5 Date d'inscription mardi 8 mars 2005 Statut Membre Dernière intervention 3 juillet 2005
3 juil. 2005 à 00:15
c'est un bon code, et permet moi vous donne une question j'ai utilise déja l'objet data pour me connecter deVB6 avec la BD sur access (j'ai déja convertie ma bd en 97) et j'ai connecté mes zone de text ,et ajouter des boutons de commande parmis la recherche mais il ne fonction pas correctement? si qq peut m'aide par un code standart je serai heureux?
cs_bigane Messages postés 46 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 12 février 2004
2 juil. 2005 à 01:16
Salut Igorois,
Non, désolé je n'ai pas cela. Par contre j'ai déjà eu un problème similaire. C'est réélement complexe.
Tu peux utiliser la commande suivante :
Dim dbEng As DAO.DBEngine
dbEng.CompactDatabase scrName, DstName
Car celle-ci permet de créer une copie compressée de ta base initiale. Un balayage des tables permet ensuite de les vider une à une, et une dernière compression réinitialise les compteurs.
Une seconde méthode consiste à creer une base vide, à énumerer les tables et les colonnes de ta première base pour ensuite les créer dans la suivante. C'est long, mais si tu y arrive tu pourras tout faire avec cette méthode.
A+
igorois Messages postés 1 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 30 juin 2005
30 juin 2005 à 20:35
salut bigane,
moi, j'utilise la methode ADO pour gerer mes bases de donnees et je voudrais savoir si tu as un code qui cree une copie d'1e base de donnee deja concu sous access sans les donnes bien sur(ne pas oublier c'est ADO)
cs_bigane Messages postés 46 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 12 février 2004
2 mai 2005 à 18:51
Salut,

Désolé pour ton problème, mais tu ne peux pas insérer une ligne dans plusieurs tables en une seule requête.
Par contre si tu la décompose (une par table) alors tu devrais pouvoir y arriver.

Pour ton premier problème, voici une solution :
db.Execute "CREATE TABLE [TableA] ( [ColonneX] Long);"

db.Execute "CREATE TABLE [TableB] ( [ColonneX] Number );"

La table A contiendra une colonne de type Long (effecue des tests pour vérifier le type).
La table B contiendra une colonne de type Double, poun insérer une valeur tu feras par exemple :

db.Execute "INSERT INTO TableB ( ColonneX ) values (2.5);"

A+
Bigane
stefdsig Messages postés 4 Date d'inscription dimanche 16 janvier 2005 Statut Membre Dernière intervention 5 mai 2005
2 mai 2005 à 16:27
j'ai trouvé la solution
db.Execute "INSERT INTO ADULTE (LT,B,I) values (""" & tableauA(a).adulteLT1 & """, """ & tableauA(a).adulteB1 & """,""" & tableauA(a).adulteI1 & """ );"

Mais un autre probleme se pose. Je n'arrive pas a renseigner plusieur table. Les valeur sont bonne mais la seconde table ne se rempli pas.
Merci
stefdsig Messages postés 4 Date d'inscription dimanche 16 janvier 2005 Statut Membre Dernière intervention 5 mai 2005
26 avril 2005 à 09:47
Bonjour,
j'ai essayé le code et ca marche mais je n'arrive pas a integrer dans ma base de donné des enregistrements de type numérique. Le text fonctionne et ce place correctement dans les enregistrements mais pas les valeurs numériques.


'Création d'une table avec une requête (simple non ?)
db.Execute "CREATE TABLE [TableY] ( [ColonneX] Text(50) );" ok

'Création d'une table avec une requête (simple non ?)
db.Execute "CREATE TABLE [TableY] ( [ColonneX] single );" non


merci pour le code qui ma bien aidé.
cs_bigane Messages postés 46 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 12 février 2004
20 sept. 2004 à 19:12
Donne plus d'explications :
Une requête ? elle rapatrie un ou plusieurs résultats ?

--> si un seul alors tu intégre les données avec une simple requête d'ajout ou un recordset ouvert sur la table de destination (et rs.addnew comme décrit plus haut).
--> si plusieurs tu peux faire une boucle pour relire les enregsitrements de ta requête un a un et utilisé la méthode utilisée pour un seul.
Sinon tu as encore la possibilité d'effectuer une requête d'insersion "insert into LaTable select xxx" et tu utilise ta fameuse requête comme sources de valeur à écrire dans ta table. Problème : il faut que tes données correspondent exactement à celles de la table de destination.
Cela doit te donner des pistes ... sinon, donne un exemple de requête, le type de tes données, la ou les tables de résultats ...
a+
Bigane.
hastan Messages postés 6 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 20 septembre 2004
20 sept. 2004 à 16:28
hello !! g un ch'tit problem: j ai besoin d exporter un resutlat de requette sql depuis vb vers Acces !! please ! help!!
zeunz Messages postés 200 Date d'inscription jeudi 26 février 2004 Statut Membre Dernière intervention 30 juin 2008
5 mai 2004 à 08:37
merci bigane pr le temps ke tu m'as consacré à ma question. je vais faire un essai avec tt ceci et je te tiendrai au courant.
merci.
zeunz
cs_bigane Messages postés 46 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 12 février 2004
4 mai 2004 à 19:38
salut zeunz,

Voici ce que tu peux faire (par exemple)
Crée une base avec deux tables :
Clients [
idClient : numérique, primarykey
NomClient : Texte
]
Produits [
idProduit : numérique, primarykey ;
idClient : numérique ;
NomProduit : Texte
]

le but de la manip sera alors de relier les champs idClient des deux tables.

Voici le bout de code créant cette relation en ADO :
' Pour simplifier, je désigne db comme
' étant ma base dans la suite du code
Dim db As Database
Set db = CurrentDb()
Dim r As Relation

' Création d'une relation
Set r = New Relation

' Ma relation relie les clients et les produits, d'où ce nom pratique
r.Name = "ClientsProduits"

' J'indique les tables concernées par cette relation
r.Table = "Clients"
r.ForeignTable = "Produits"

' Je désigne le champ de la table "Clients"
r.Fields.Append r.CreateField("idClient")

' ce champ est relié à la table jointe (au champ idClient)
r.Fields("idClient").ForeignName = "idClient"

' J'ajoute la nouvelle relation à la collection de la base
db.Relations.Append r
' validation
db.Relations.Refresh

' libération propre et explicite des pointeurs
set r = nothing
set db = nothing

Au cas où, voici la syntaxe pour supprimer la relation
' db.Relations.Delete "ClientsProduits"

Il est facile pour comprendre les relations de les créer avec l'interface. Puis de regarder le résultat en mode debug avec des espions sur l'objet db.relations par exemple. C'est de cette façon que j'ai créé cet exemple.

A+
Bigane
zeunz Messages postés 200 Date d'inscription jeudi 26 février 2004 Statut Membre Dernière intervention 30 juin 2008
4 mai 2004 à 09:04
salut.
merci pr ton code source ki me sera tres utile. chez moi je possede access 2000 et les reference ne sont pas les memes qu'access97.
dc mnt j'ai les deux.

par contre je voualis te demander si tu sais comment créer les relations ds access (97 et 2000) par l'intermediaire du code vb.

je voudrai en qque sorte créer automatiquement une base de donnees avec des tables et reliée entre elles (par les clefs) des que l'utilisateur execute pr la 1ere fois le programme ke je créé.

sinon pour ta source, bon code propre et bien commentée. ca c'est tres important.

bonne continuation.

zeunz.
capoueidiablo Messages postés 316 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 1 février 2010 1
29 juil. 2003 à 09:30
ba en faite il m'a dis que l'ado reste superficiel et que tu ne peux justement pas tout géré par cette methode et donc qu'il était preferable d'utilisé de l'odbc enfin bref aujourd'hui j'ai une reunion je vais lui en parler et le cogné s'il le faut ;-)
merci bien bigane, quand j'aurai fini mon code je vous fournirai quelques fonctions...
cs_bigane Messages postés 46 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 12 février 2004
28 juil. 2003 à 22:58
Si tu n'utilise pas ADA ou DAO, alors il te reste l'ODBC. Par exemple tu installe mySQL sur un poste, tu crée une source ODBC avec ta base de données Access, et tu interroge ta base avec du PHP. C'est simple, efficace et tu te passes de ADO et DAO. Pour finir, si ton boss veux quand même utiliser les API, qu'il le fasse lui même. Ce n'est pas la peine de réinventer la roue. L'appel aux api ne serait qu'un accès à une source d'ODBC. C'est bien lourd pour un bénéfice zéro. Vu que tu semble débutant, ton code sera approximatif, difficile à maintenir. Tu passeras des heures à réinventer des accès déjà programmés par des équipes de développeurs... bref ton boss va perdre son temps et son argent. Toi, par contre, tu te formera et ton expérience vaudra de l'or (celui de ton boss).
Bon courage,
je serai curieux de connaitre la fin de cette histoire,
ne nous oublie pas.
capoueidiablo Messages postés 316 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 1 février 2010 1
28 juil. 2003 à 14:41
Bon ba je vois que vous êtes tous des grosses têtes :-p alors je vais vous poser une question qui je suis sure est simple pour vous :
bon ba voila je veux faire exactement la meme chose que le code source si dessus mais sans utilisé l'ADO ou la DAO mon boss il m'a dis qu'il ne voulais en aucun cas ces technique de prog et qu'il fallais que j'utilise des API donc j'ai fais des recherche, mais je trouve pas ttes les sources sur les sites dédiés au VB et au base de données parlent de la DAO :'( s'il vous plait aidé moi.....
marchmat Messages postés 1 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 26 mars 2003
26 mars 2003 à 15:11
comment on fait pour creer un index et l'autoincrementer??? il doit y avoir moyen mais je suis débutant alors si tu pouvait me donner un coup de main, ca m'arrangerais fortement...
Merci....
blackwizzard Messages postés 1258 Date d'inscription mercredi 21 mars 2001 Statut Membre Dernière intervention 21 juin 2009 2
10 déc. 2002 à 03:23
T un champion!
tu me sauve la vie! :p
cs_bigane Messages postés 46 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 12 février 2004
25 août 2002 à 14:41
PS: le code source est mis à jour avec un nouveau bouton permettant la création de la table avec les objets DAO au lieu d'une requête.
L'ensemble de l'exemple de mon précédent message y est inclu.

Bon code à tous,
Bigane.
cs_bigane Messages postés 46 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 12 février 2004
25 août 2002 à 13:58
Réponse à programheure:
Oui, je peux aussi utiliser des recordsets au lieu du db.execute.
Voici la syntaxe (de tête, je reviens de vacances...)

Au lieu de la ligne :
'On crée une ligne dans cette table
db.Execute "INSERT INTO TableY ( ColonneX ) values ('Ceci est un test');"

Mettre les lignes suivantes :
'(Ce dim est mal placé, il doit être mis en début de la fonction normalement)
Dim rs As Recordset
'Ouverture de la table en lecture et écriture
'dbOpenTable = indique l'accès à une table en direct,
'le traitement sera plus rapide.
Set rs = db.OpenRecordset("TableY", dbOpenTable)
'Crée une nouvelle ligne dans la table
rs.AddNew

'3 méthodes d'accès à la même donnée:
'------------------------------------

'Méthode 1 : Accède au champ numéroté 0 (colonne 1 de la table)
rs.Fields(0).Value = "Ceci est un test V1"

'Méthode 2 : Accède au champ nommé ColonneX
rs.Fields("ColonneX").Value = "Ceci est un test V2"

'Méthode 3 : Accède au champ nommé ColonneX, mais notation simplifiée
rs!ColonneX.Value = "Ceci est un test V3"

'Méthode 3 bis: les crochets permettent les noms avec les espaces
rs![ColonneX].Value = "Ceci est un test V4"

'Valide toutes les modifications et effectue les tests d'intégrité (si il y en a).
'Seule la dernière modification est effectuée dans la base après cette ligne (V4).
'Durant toutes les modifications précédentes, la ligne était illisible
'par une autre connexion à la base.
rs.Update

'Referme la table proprement
rs.Close

'Voilà, la chose est faite. remplacé la valeur par MaVariable est alors plus simple.
'La lecture est aussi aisée, on ouvre la table de la même façon,
'on se déplace par des rs.MoveNext après avoir traité la première ligne,
'et ceci tant qu'il y a encore quelque chose dans la table :

'Ouverture de la table en lecture écriture
Set rs = db.OpenRecordset("TableY", dbOpenTable)

'Tant qu'il y a des lignes dans la table
Do While Not rs.EOF

'Fait un reste sur une colonne de cette table
'(ce test est un exemple)
If rs.Fields(0).Value <> "Une autre valeur" Then

'Passe en mode modification
rs.Edit

'Modifie cette ligne
rs.Fields("ColonneX").Value = "Correctif"

'Valide la dernière modification
rs.Update

'Sinon...
Else

'Détruit pour toujours cette ligne ignoble !
rs.Delete

End If


'On passe à la prochaine ligne de la table
rs.MoveNext

'Je boucle sur le tant que
Loop

'Referme la table proprement
rs.Close

'Libère l'objet (très important et souvent oublié)
Set rs = Nothing


Des questions ou remarques ?
Bigane.
programheure Messages postés 2 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 22 août 2002
22 août 2002 à 09:50
J'apporte ma propre réponse :

db.Execute "INSERT INTO MaTable ( MonChamp ) values (" & MaVaraible & ");"

Et ça... ça fonctionne !
programheure Messages postés 2 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 22 août 2002
21 août 2002 à 16:07
Salut,

Je débute dans la programmation VB et en m'attaque déjà à l'ADO.. un peu fou le mec mais bref... Voilà ton exemple et très clair et très compréhensible. J'ai cependant essayer de l'adapter à mes besoins en utilisant non pas une chaine de caractère définie mais en passant par une variable dna sle code suivant :

ton code :
'On crée une ligne dans cette table
db.Execute "INSERT INTO TableY ( ColonneX ) values ('Ceci est un test');"

Mon code :
j'ai défini bien entendu correctement la variable utilisisée.
'On crée une ligne dans cette table
db.Execute "INSERT INTO MaTable ( MonChamp ) values (MaVaraible);"

Voici le message d'erreur :
Erreur d'execution '3061'
Too Few parameters. Expected 1

Autre question. Pourquoi n'utilises tu pas les recordsets ? Peux tu donner la version avec l'utilisation d'un recordset STP ?

Merci par avance pour ton aide précieuse.
Leortien Messages postés 6 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 24 juillet 2002
22 juil. 2002 à 11:51
lol moi fo pas me proposer de l'aide je suis un vrai parasite (je ne sais pas si tu connais le terme "boulet" ;op)

****************
en fait je cherche un moyen de mettre un mot de passe sur la base que je crée et j'arrive pas à trouver comment on fait
je crois que je suis po doué (et surtout que je m'y prends mal pour apprendre VB)
****************

bisous aussi
tu veux po être mon papa/ma maman pour visual basic? lol (je suis un vrai gamin et je commence à me croire sur un site de chat :o/ )
cs_bigane Messages postés 46 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 12 février 2004
20 juil. 2002 à 11:06
Merci, bon code et bisous...
Si tu as un souci, écris le ici, je te répondrai, et cela peut dépanner les autres.
A+
Bigane
Leortien Messages postés 6 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 24 juillet 2002
19 juil. 2002 à 12:57
le prend pas mal mais
je t'adore toi
c exactement ce que je cherchais
t un amour
cs_bigane Messages postés 46 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 12 février 2004
8 mai 2002 à 19:57
Facile, ce qu'il te manque c'est le moteur jet (DAO) :
Tu vas dans le menu Projet / Références, et tu coches
Microsoft DAO 3.51 Object Library
(PS: tu peux avoir DAO 3.6, ou un autre suivant ton installation de VB6)
(PS/PS évite DAO 2.5/3.51 qui est une compatibilité pour ancien composant)
A+
safireevil Messages postés 18 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 23 septembre 2002
8 mai 2002 à 18:37
g 1 problème !
y me dit type défini par l'utilisateur non défini à propos de "Dim db As DAO.Database"

qqn peut-il m'aider ?
cs_bigane Messages postés 46 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 12 février 2004
28 mars 2002 à 23:36
Merci pour les notes, oui c'est bien de moi.
106 Messages postés 39 Date d'inscription jeudi 17 janvier 2002 Statut Membre Dernière intervention 14 janvier 2008
28 mars 2002 à 09:40
C'est une solution. Et en plus, elle peut fonctionner avec d'autres types de base de données.
J'utilise une autre méthode, j'essaierai d'en faire un petit extrait.

Aller 9/10 pour pas mettre 10.
cs_shivan Messages postés 363 Date d'inscription jeudi 20 décembre 2001 Statut Membre Dernière intervention 25 août 2003
2 mars 2002 à 18:50
ben si c toi, c parfait !!! je voulais mettre au propre un tutoriel dans le genre, mais la je suis coiffé au poteau !!! ;-)
bon ben un 10/10 pour la clarté !

$hîv@n
Rejoignez-nous