Access : Sql & VBA

Fermé
nippon1944 Messages postés 140 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 4 juillet 2013 - 6 juin 2013 à 12:24
nippon1944 Messages postés 140 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 4 juillet 2013 - 4 juil. 2013 à 11:14
Bonjour,

je suis actuellement en stage en entreprise et je doit réaliser une base de donnée sur l'outillage spéficique de l'atelier.
J'en suis à coder le formulaire d'ajout d'outils, j'ai la requête suivante :

Private Sub AddOutilNew_Click()

'requete d'ajout a la base
Dim Sql As String

Sql = "INSERT INTO Outils (numero_plan, type, produit, poste, disponibilite)" & _
        "VALUES (tbxNumPlan, cboType, cboProduit, cboPoste, cboDispo)" & _
        "AND (" & _
            "INSERT INTO Localisation (ou)" & _
            "VALUES (tbxOu)" & _
            "WHERE (Localisation.N°=Disponibilite.intule) AND (Outils.disponibilite=Disponibilite.disponibilite);" & _
        ");"

DoCmd.RunSQL Sql


End Sub

et Access me dit qu'il manque un point virgule, une idée ?

cherche aussi un idée pour simplifier cette usine à gaz, car oui, il y a pas tout les champs :/


4 réponses

Bonsoir,
"Access me dit qu'il manque un point virgule, une idée ? "
Non, il ne manque pas un " ; ", mais il y en a deux qui ne devraient pas y être. C'est ceux de la fin de l'expression.
Quand tu convertit ta requête du mode dit "graphique" en mode SQL, Access a la sale habitude d'ajouter ce fichu " ; " à la fin de l'expression; il ne faut donc pas oublier de le retirer quand tu la recopies dans ton code.
L'expression correcte dans sa partie terminale devrait donc être:
  ..... =Disponibilite.disponibilite)" & ")"

Nonobstant la remarque de Blux, je ne vois pas bien ni l'intérêt ni la nécessité d'écrire une requête-ajout pour entrer des données dans des tables quand il suffirait de passer à la ligne suivante pour avoir le même résultat, et si il se pose un problème de clés et de liaisons entre les tables, il suffit de prévoir des contrôles (cachés) dans ton formulaire pour que les numéros se reproduisent d'une table à l'autre.
2
blux Messages postés 26543 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 21 décembre 2024 3 318
6 juin 2013 à 22:38
Euh.. jusqu'à récemment, on pouvait laisser le ; à la fin d'une requête passée en chaine dans un runsql...
0
Bonsoir Blux,
Le bouquin où j'ai appris ça est: "Le Grand Livre Access 2002" chez Micro-Application. Ou bien "Access VBA pour les Nuls"
J'ai toujours fait comme indiqué.
Maintenant, je ne prétends pas que c'est l'Evangile.
0
nippon1944 Messages postés 140 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 4 juillet 2013 3
Modifié par nippon1944 le 7/06/2013 à 11:05
Bonjour,
merci à tout les deux pour vos réponses, j'ai oublié de préciser que je travaille avec Access 2010.
J'ai mis un " ; " à la fin de la requête cela fonctionne, ne vous battez pas :)

J'ai créé la requête "à la main", je connais les bases en Sql, amateur éclairé dirons-nous, et je sais pas me servir de l'assistant Access. Je me suis déjà servi d'Access mais ça faisait 3 ans que j'y avait pas touché donc les souvenirs sont loin :/

J'ai décomposer ma requête en tapant les mots clés puis les champs un par un puis fait un essai d'ajout, presque tout mes champs fonctionnent, le truc c'est que le deuxième INSERT ne fonctionne pas.
0
blux Messages postés 26543 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 21 décembre 2024 3 318
7 juin 2013 à 11:09
Pour moi, la valeur de ta chaine sql est incohérente pour pouvoir s'exécuter.
Fais un Msgbox avant et tu verras qu'elle a une structure particulière...
0
nippon1944 Messages postés 140 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 4 juillet 2013 3
7 juin 2013 à 11:17
Ayant un peu avancé, ma requête resemble à ça pour l'instant, et il manque 3-4 champs :

Private Sub AddOutilNew_Click()

'requete d'ajout a la base
Dim Part1 As String

Part1 = "INSERT INTO Outils (numero_plan, type, produit, poste, disponibilite, facteur_charge, plage_couple, propriete_Etat," & _
            "date_commande, date_mise_en_service, prix, entreprise, designation, controle, etalonnage)" & _
            "VALUES (tbxNumPlan, cboType, cboProduit, cboPoste, cboDispo, tbxCharge, tbxCouple, cboEtat, tbxCommande, tbxService," & _
            "tbxPrix, tbxEntreprise, tbxdesignation, cboControle, tbxEtalon)" & _
        "INSERT INTO Localisation (ou)" & _
            "VALUES (tbxOu)" & _
            "WHERE (Outils.disponibilite=Disponibilite.disponibilite)" & _
            "AND (Disponibilite.intitule=Localisation.N°);"
                
        

DoCmd.RunSQL Part1
End Sub


Je veux bien essayer de faire plus simple mais comme personne peux m'aider sur mon lieu de stage il me reste que le net pour me dépanner.
0
blux Messages postés 26543 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 21 décembre 2024 3 318
6 juin 2013 à 16:25
Salut,

pas de AND pour faire deux INSERT INTO, mais deux INSERT INTO à faire l'un après l'autre (runsql à passer deux fois)...
1
nippon1944 Messages postés 140 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 4 juillet 2013 3
14 juin 2013 à 12:03
Maintenant je me suis attelé à la requête du module de recherche, j'ai 8 listes déroulantes pour définir les critères, donc ma question est :
je fait 8 requêtes et les imbriques ou j'essaye de faire une seule requête qui prend en compte tout les choix ?
et si je fait 8 requêtes, je les imbrique comment ?
0
blux Messages postés 26543 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 21 décembre 2024 3 318
14 juin 2013 à 12:34
je fait 8 requêtes et les imbriques
'marchera pas !

j'essaye de faire une seule requête qui prend en compte tout les choix ?
Oui, tu vas rebosser du VBA pour bâtir ta requête...
0
nippon1944 Messages postés 140 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 4 juillet 2013 3
14 juin 2013 à 13:17
C'est pas le VBA qui me fait peur, c'est le SQL, mais bon je devrais m'en sortir ce coup là :)

Si question, pour mettre des lien hypertext dans une base, faut des quotes, des doubles quote ou c'est de "type" string ?
0
blux Messages postés 26543 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 21 décembre 2024 3 318
14 juin 2013 à 13:36
Il existe un type de données nommé 'lien hypertexte', ça devrait répondre à ta question et à ton besoin...
0
nippon1944 Messages postés 140 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 4 juillet 2013 3
14 juin 2013 à 14:20
Merci ça j'ai vu, ma question est : c'est de type (pour savoir comment je le rentre dans la base) et accessoirement comment je peux faire pour le faire entrer à l'utilisateur.

Dans un cas idéal : en faisant genre un double clic, ça ouvre la belle boite de dialogue windows, l'utilisateur il cherche son plan (et la photo un peu plus loin mais le principe est le même), il fait "ouvrir" et là paf ça rentre le chemin d'accés du fichier dans la base; et plus tard en mode consultation double clic et paf ça ouvre le fichier direct.
0
blux Messages postés 26543 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 21 décembre 2024 3 318
14 juin 2013 à 14:34
J'avais pas compris la demande...
Quand tu fais une insertion via INSERT INTO VALUES, la seule chose qui importe est le séparateur/limiteur de données, qui est le 'simple-quote' pour toute valeur de type alphanumérique.
0
nippon1944 Messages postés 140 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 4 juillet 2013 3
19 juin 2013 à 15:29
Une question, pour afficher un résultat de recherche, il vaut mieux un sous-formulaire ou un objet de type listebox ?
la listebox ça risque de faire sale non ?
0
blux Messages postés 26543 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 21 décembre 2024 3 318
19 juin 2013 à 15:35
Tout dépend ce que tu veux en faire...
0
nippon1944 Messages postés 140 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 4 juillet 2013 3
19 juin 2013 à 16:01
Après recherche, ça change rien, faut une requête en béton est le résultat sera classe ^^
(exemple trouvé dans une appli fournie par mon tuteur, avec tu INNER JOIN et tout, gros taf en vue).
0
nippon1944 Messages postés 140 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 4 juillet 2013 3
Modifié par nippon1944 le 19/06/2013 à 16:37
argh, au secours, non c'est juste la position des parenthèses sur les INNER JOIN je pense
SELECT Outils.numero_plan, Type.type, Produit.produit, Secteur.secteur, Poste.poste, Disponibilite.intitule, Controle.controle, Propriete_Etat.propriete, Immobilisation.immo

FROM Outils

INNER JOIN Type ON Outils.type=Type.N° (INNER JOIN Produit ON Outils.produit=Produit.N° (INNER JOIN Secteur ON Outils.secteur=Secteur.N° (INNER JOIN Propriete_Etat ON Outils.propriete_Etat.Propriete_Etat (INNER JOIN Immobilisation ON Outils.immobilisation=Immobilisation.N°))))
WHERE (((Outils.type)=[cboRechercheType])) OR (((Outils.produit)=[cboRechercheProduit])) OR (((Outils.secteur)=[cboRechercheSecteur])) OR (((Outils.poste)=[cboRecherchePoste])) OR (((Outils.disponibilite)=[cboRechercheDisponibilite])) OR (((Outils.controle)=[cboRechercheControle])) OR (((Outils.propriete_etat)=[cboRechercheEtat])) OR (((Outils.immobilisation)=[cboRechercheImmo]))

ORDER BY Outils.numero_plan;
0
nippon1944 Messages postés 140 Date d'inscription mardi 10 juin 2008 Statut Membre Dernière intervention 4 juillet 2013 3
Modifié par nippon1944 le 20/06/2013 à 11:36
la syntaxe la plus simple et la plus claire que j'ai pu trouver est
SELECT NOM, PRENOM, AGE, MARQUE, COULEUR
FROM PERSONNES
INNER JOIN PERSONNE_VOITURE 
ON ID_PERSONNE = PERSONNE_ID 
INNER JOIN VOITURES 
ON ID_VOITURE = VOITURE_ID 
INNER JOIN COULEURS 
ON ID_COULEUR = COULEUR_ID 
WHERE ID_PERSONNE = 3 
pourtant je fait ma requête il me dit opérateur manquant dans les INNER JOIN...
0
blux Messages postés 26543 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 21 décembre 2024 3 318
20 juin 2013 à 12:48
As-tu essayé de préfixer les champs avec les noms de table ?
0