Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/12/2010, 09h27   #1
Membre à l'essai
 
Avatar de ouflala
 
Inscription : novembre 2005
Messages : 108
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 108
Points : 20
Points : 20
Par défaut Faire un plan des locaux sous access.

Bonjour,

Je gère un petit parc info et j'ai fait une base sous access pour m'aider. Il y a, entres autres, dans cette base, le nom de l'agent et le nom netbios de son pc.

Je voudrais faire un plan de l'étage et des bureaux où je bosse (un plan tres simpliste, juste avec des traits).
A l'interieur de chaque carré du plan (symbolisant un bureau), mettre 2 champs (nom_agent et nom_ordi)

J'ai donc fait mon plan dans un état, mais forcement, il ne me mets pas un nom différent dans chaque bureau...
J'ai X états différents (car X agents) et sur chaque état, tjs le même nom de l'agent et de son ordi

Comment faire pour avoir un seul état (mon plan) et un nom différent dans chaque bureau???

J'espère que j'ai été clair, c'est pas évidant d'expliquer ce que l'on a en tête...

Merci d'avance pour votre aide...
ouflala est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 10h06   #2
Membre confirmé
 
Avatar de spaiku
 
Chef de projet MOA
Inscription : septembre 2007
Messages : 191
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2007
Messages : 191
Points : 250
Points : 250
J'imagine que tu as spécifié une source pour ton formulaire qui doit correspondre à une table ou une requête. Avec cette solution, tu ne pourras effectivement pas y arriver.

Tu peux en revanche alimenter manuellement tes champs à l'ouverture de ton formulaire. Du genre :

Code :
1
2
3
4
5
6
7
8
9
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset(marequete)
rs.MoveFirst
While Not rs.EOF
    Me.monchamp = rs(monchamp)
    rs.MoveNext
Wend
Pour rendre la chose plus maintenable, tu peux nommer les champs de ton formulaire en fonction de valeurs que tu trouveras dans ta table. Je prends l'exemple d'une requête à 3 champs :
Poste | Employe | Netbios
Compta | Dupont| NB1
Info | Durand | NB2

Ensuite, tu nommes tes champs sur le formulaire :
Compta_Poste
Compta_Employe
Compta_NetBios

Avec ça, pour alimenter tes champs tu peux écrire :
Code :
1
2
3
4
5
6
7
 
While Not rs.EOF
    For Each Fld in rs.Fields
        Me.Controls(rs("Poste") & "_" &  Fld.Name) = Fld.Value
    Next Fld
    rs.MoveNext
Wend
De cette manière, si tu dois rajouter un poste sur ton plan, tu as juste à créer les champs et leur donner le nom qui va bien, et le tour est joué. Si tu veux ajouter d'autres contrôles pour chaque poste, tu as juste à faire matcher le nom de tes nouveaux contrôles et celui du nouveau champ dans la requête.
spaiku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 10h24   #3
Membre à l'essai
 
Avatar de ouflala
 
Inscription : novembre 2005
Messages : 108
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 108
Points : 20
Points : 20
Salut...


Wahoooooooooooooooo

Merci pour la reponse precise et rapide!
Bon j'avoue , j'ai pas trop compris grand chose dans ton code...Mais je vais vite tester ca....
Effectivement, mon formulaire (ou etat) pointe vers une requete ... et donc apparemment c'est impossible à faire avec cette methode!

Encore merci...

Ps: donc avec ta méthode, mon formulaire ne doit avoir aucune source, c'est bien ça?
ouflala est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 11h16   #4
Membre confirmé
 
Avatar de spaiku
 
Chef de projet MOA
Inscription : septembre 2007
Messages : 191
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2007
Messages : 191
Points : 250
Points : 250
Oui, avec cette solution, l'état n'a pas de source particulière. C'est ta fonction qui va manuellement alimenter chaque champ.

Si tu es perdu avec le code, n'hésite pas à faire un tour du côté des tutos pour re(voir) les bases de la programmation Access.
spaiku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 11h38   #5
Membre à l'essai
 
Avatar de ouflala
 
Inscription : novembre 2005
Messages : 108
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 108
Points : 20
Points : 20
Oui, bonne idée pour les tuto, j'y vais de ce pas...
ouflala est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 13h50   #6
Membre à l'essai
 
Avatar de ouflala
 
Inscription : novembre 2005
Messages : 108
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 108
Points : 20
Points : 20
Il y a un petit souci.. Lorsque j'exécute le code,
j'ai Db as Databse qui est surligné et j'ai le message
"Type defini par l'utilisateur non defini"

Faut il que je nomme Database ou CurrentDb par le nom exact d'une de mes tables??
ouflala est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 14h00   #7
Membre confirmé
 
Avatar de spaiku
 
Chef de projet MOA
Inscription : septembre 2007
Messages : 191
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2007
Messages : 191
Points : 250
Points : 250
Dim db As Databse

T'as pas l'impression qu'il manque un a ?

Je vais te donner des devoirs

Rends-toi sur l'excellent tuto de Tofalu (http://warin.developpez.com/access/dao/), et lit en priorité les parties suivantes :
Partie 1 & 2
Partie 3.3
Partie 4.3, 4.4 et 4.7
Partie 5

Evidemment, je t'engage à lire le reste, mais avec ces éléments, tu auras vraiment le pied à l'étrier pour l'accès et la manipulation de tes données sous Access.
spaiku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 16h50   #8
Membre à l'essai
 
Avatar de ouflala
 
Inscription : novembre 2005
Messages : 108
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 108
Points : 20
Points : 20
C'était une faute de frappe dans mon post...

J'ai lu le tuto de Tofalu...Effectivement il est tres bien...Complexe, mais tres bien!
Bon, j'ai un peu avancé...

Voila mon code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
Dim db As Database
Dim rs As Recordset
 
Set db = CurrentDb
Set rs = db.OpenRecordset(Ordiagent)
rs.MoveFirst
 
While Not rs.EOF
 
    Me.Agent1 = rs(Agent.Nom)
    rs.MoveNext
 
    Me.Ordi1 = rs(Nom_Ordinateur.Nom)
    rs.MoveNext
 
    Me.Agent2 = rs(Agent.Nom)
    rs.MoveNext
 
    Me.Ordi2 = rs(Nom_Ordinateur.Nom)
    rs.MoveNext
 
    Me.Agent3 = rs(Agent.Nom)
    rs.MoveNext
 
    Me.Ordi3 = rs(Nom_Ordinateur.Nom)
    rs.MoveNext
 
Wend
OrdiX et AgentX sont les champs de mon formulaire (Je fais un test que sur 6 champs)
Agent.Nom et Nom_Ordinateur.Nom sont les 2 champs de ma requete (Ordiagent)

Tous a l'air Ok, mais quand j'execute le code j'ai ce message d'erreur

Erreur 3078 : Microsoft Jet ne peut trouver la table ou requête. assurez vous quelle existe et qu'elle est bien orthographiée"


Pourtant ma requete se nomme bien Ordiagent
Je cherche mais je seche...

Alors si quelqu'un avait une piste....
ouflala est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 21h57   #9
Membre confirmé
 
Avatar de spaiku
 
Chef de projet MOA
Inscription : septembre 2007
Messages : 191
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2007
Messages : 191
Points : 250
Points : 250
Il suffit que tu mettes OrdiAgent entre guillemets. Rassure toi, c'est une erreur de débutant classique. Les guillemets signifient : ce qui est dedans est une chaîne de caractères. Sinon, c'est le nom de quelque chose, une variable par exemple. Autrement dit, le code suivant fonctionnerait :

Code :
1
2
3
Dim toto as String
toto = "OrdiAgent"
Set rs = db.OpenRecordset(toto)
Bon courage pour la suite !
spaiku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 10h22   #10
Membre à l'essai
 
Avatar de ouflala
 
Inscription : novembre 2005
Messages : 108
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 108
Points : 20
Points : 20
Bonjour Spaiku

Tout d'abord merci pour ttes tes réponses...

J'ai rajouté les guillemets et voila maintenant qu'il me met "erreur13: incompatibilité de type" sur la meme ligne
Code :
1
2
 
Set rs = db.OpenRecordset("Ordiagent")
J'ai cherché sur le net, apparemment d'après ce que j'ai compris, le Openrecordset renvoi une valeur qui ne va pas à rs qui est déclaré en recordset

Bon c'est ce que j'ai compris, ca vaut ce que ca vaut...

Pourtant recordset peut etre des chiffres ou des llettres non?!?

Dans la requête Ordiagent, j'ai deux champs texte.
J'ai fait un test en remplaçant la requête par une table à 2 colonnes de 3 valeurs chacune, même pb...

Si quelqu'un avait une piste...
ouflala est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 11h20   #11
Membre confirmé
 
Avatar de spaiku
 
Chef de projet MOA
Inscription : septembre 2007
Messages : 191
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2007
Messages : 191
Points : 250
Points : 250
Bonjour,

il faudrait que tu postes l'intégralité de ta fonction pour que je puisse comprendre ce qui se passe.

A propos de ce qu'est un recordset, ce n'est ni du texte, ni une valeur numérique, mais un objet. Pour la définition d'un objet en programmation, voici une explication lumineuse : http://plasserre.developpez.com/cour...rincipe#LIII-A

La méthode OpenRecordset renvoie bien un objet Recordset, et non une variable String, Integer ou autre, donc tu ne devrais pas avoir de problème de type. C'est pour ça qu'il me faudrait l'intégralité de la fonction.

Autre chose sur ton post précédent : tu écris un rs.MoveNext après l'alimentation de chaque champ. Tu vas avoir des problèmes !

- Il faut comprendre qu'un Recordset est un tableau contenant des données. Il y a donc des lignes et des colonnes (qu'on appelle champs).
- Dans ta requête, nous sommes d'accord qu'une ligne représente un poste de travail, et une colonne, un type d'information pour chaque poste.
- Si donc j'ai 3 infos pour chaque poste, j'aurai 3 champs sur chaque ligne de mon Recordset, dont je devrai écrire la valeur dans 3 contrôles différents sur mon formulaire.
- La méthode MoveNext du recordset dit à celui-ci "passe à la ligne suivante".
- Tu ne dois donc l'utiliser qu'une fois que tu as traité tes 3 champs pour une ligne donnée. Sinon, tu ne récupères qu'une info par ligne de ton recordset
- Le code correct sera donc du type :
Code :
1
2
3
4
5
6
7
rs.MoveFirst 'Va sur la 1ere ligne
While Not rs.EOF 'Jusqu'à ce que tu aies tout traité
    Me.Controle1 = rs("Champ1") 'Affiche la valeur de la colonne 1 dans le contrôle 1
    Me.Controle2 = rs("Champ2") 'Affiche la valeur de la colonne 2 dans le contrôle 2
    'etc...
    rs.MoveNext 'Maintenant que tu as traité tous les champs, tu peux passer à la ligne suivante.
Wend
spaiku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 11h59   #12
Membre à l'essai
 
Avatar de ouflala
 
Inscription : novembre 2005
Messages : 108
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 108
Points : 20
Points : 20
Ta réponse a éclairci pas mal de chose...

Voici ma fonction avec les modif que j'ai pu y apporter (merci pour les Movenext...)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim db As Database
Dim rs As Recordset
 
Set db = CurrentDb
Set rs = db.OpenRecordset("Ordiagent")
 
rs.MoveFirst
 
While Not rs.EOF
 
    Me.Agent1 = rs("Agent.Nom")
    Me.Ordi1 = rs("Nom Ordinateur.Nom")
        rs.MoveNext
 
    Me.Agent2 = rs("Agent.Nom")
    Me.Ordi2 = rs("Nom Ordinateur.Nom")
        rs.MoveNext
 
    Me.Agent3 = rs("Agent.Nom")
    Me.Ordi3 = rs("Nom Ordinateur.Nom")
        rs.MoveNext
Wend
Dans ma requete je n'ai que 2 colonnes (nom de l'agent et nom de l'ordi) et 3 ligne ca donne:

nom agent nom ordi
dupont 001
durant 002
martin 003

MAIS (tres important je pense) ma requte est basée en fait sur 4 champs nom agent / nom ordi / un champ texte / un champ vrai-faux.
Comme j'ai besoin des 2 premiers, j'ai mis les 2 derniers en invisible dans la requete.

Du coup l'objet Recordset est un objet à 2 colonnes ou 4 colonnes? Recordset prend il en compte les colonnes invisibles?
Peut etre que le pb vient de là???
ouflala est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 12h15   #13
Membre confirmé
 
Avatar de spaiku
 
Chef de projet MOA
Inscription : septembre 2007
Messages : 191
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2007
Messages : 191
Points : 250
Points : 250
Je ne vois pas très bien ce que tu appelles champs invisibles, mais ça n'a pas d'incidence sur ce qui nous occupe, à savoir ton problème d'incompatibilité de type. Je ne vois pas de problème particulier dans ton code. Envoie-moi ton .mdb si tu veux. Mais je ne pourrai pas te donner de retour avant ce soir : je n'ai pas Access sur mon poste au boulot.

Autre chose : je vois que tu as des noms qui comporte des espaces. C'est à proscrire, de même que les caractères spéciaux ou accentués. Au lieu de Nom Ordinateur, tu peux écrire :
Nom_Ordinateur
ou
NomOrdinateur
spaiku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 12h41   #14
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Bonjour,

Citation:
Envoyé par spaiku
Je ne vois pas de problème particulier dans ton code
Bah moi, j'en vois un lol. Y'a 3 movenext dans ta boucle While...Tu risques d'avoir un ptit souci.

Par contre, la permière idée était pas mal du tout :

Code :
1
2
3
4
5
6
While Not rs.EOF
    For Each Fld in rs.Fields
        Me.Controls(rs("Poste") & "_" &  Fld.Name) = Fld.Value
    Next Fld
    rs.MoveNext
Wend
Pour quoi tu ne fais pas ça ouflala ?
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 13h21   #15
Membre confirmé
 
Avatar de spaiku
 
Chef de projet MOA
Inscription : septembre 2007
Messages : 191
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2007
Messages : 191
Points : 250
Points : 250
Bonjour paidge,

ce n'est pas du problème de gestion du curseur que je parlais, mais de celui d'incompatibilité de type à l'ouverture du recordset (voir quelques messages plus haut). Il n'a pas eu le temps de se rendre compte de son erreur plus bas, vu qu'il n'arrive pas encore à accéder aux données.

ouflala, paidge a raison, ton code pour alimenter tes champs n'est pas encore au point. Mais j'ai prévu de te corriger ça dans le .mdb. c'est vrai que quand on est débutant, c'est difficile de comprendre comment fonctionne le code sans avoir vu le résultat.
spaiku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 13h54   #16
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Oui c'est sûr que pour le problème d'incompatibilté de type, il vaut mieux avoir tous les éléments pour trouver d'où ça vient

Quand je me suis penché sur le fonctionnement des recordset, j'ai pas mal appris avec bien sûr le tuto de Tofalu mais aussi avec ce site que je te conseille ouflala

Bonne chance pour la suite

EDIT : ah oui ! et celui-là aussi ^^
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 16h33   #17
Membre à l'essai
 
Avatar de ouflala
 
Inscription : novembre 2005
Messages : 108
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 108
Points : 20
Points : 20
bon alors je vais repondre dans l'ordre...

Quand je dis champs invisible, c'est quand, dans une requete en mode creation tu coches la case qui te permet de ne pas voir la colonne en question dans ton resultat.

Ok, je t'envoie le .mdb ou je fais le test!


Paidge, effectivement il y avait un pb dans les movenext que j'ai rectifié sur les conseils avisés de spaiku.

Pour l'instant je m'interesse qu'a la 1ere partieb du code . Dès que ca marche et que je l'aurai assimilé, je m'interesserai à la 2e partie!

Merci pour tout vos lien que je suis en train de lire, mais il y a tellement d'info que je ne sais pas trop quoi prendre pour résoudre mes pb...Enfin heureusement que vous etes là...
Fichiers attachés
Type de fichier : zip test.zip (180,0 Ko, 16 affichages)
ouflala est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 16h42   #18
Membre à l'essai
 
Avatar de ouflala
 
Inscription : novembre 2005
Messages : 108
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 108
Points : 20
Points : 20
le .mdb ne passait pas. Je l'ai juste renommé en .zip
ouflala est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 16h44   #19
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
lol ok...Je comprenais pas qu'il ne veuille pas s'ouvrir Je vais prendre ma pause et j'y jetterai un coup d'oeil
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 17h23   #20
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
J'ai trouvé d'où venait ton incompatibilité de type...Un caprice d'Access apparemment

Déclare ta variable recordset comme ça et ça devrait le faire, je viens d'essayer et c'est bon
Code :
Dim rs as DAO.recordset
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h20.


 
 
 
 
Partenaires

Hébergement Web