Access : Sql & VBA

nippon1944 Messages postés 140 Date d'inscription   Statut Membre Dernière intervention   -  
nippon1944 Messages postés 140 Date d'inscription   Statut Membre Dernière intervention   -
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

Tessel75
 
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 27137 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Euh.. jusqu'à récemment, on pouvait laisser le ; à la fin d'une requête passée en chaine dans un runsql...
0
Tessel75
 
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   Statut Membre Dernière intervention   3
 
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 27137 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
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   Statut Membre Dernière intervention   3
 
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 27137 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
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   Statut Membre Dernière intervention   3
 
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 27137 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
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   Statut Membre Dernière intervention   3
 
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 27137 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
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   Statut Membre Dernière intervention   3
 
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 27137 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
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   Statut Membre Dernière intervention   3
 
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 27137 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Tout dépend ce que tu veux en faire...
0
nippon1944 Messages postés 140 Date d'inscription   Statut Membre Dernière intervention   3
 
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   Statut Membre Dernière intervention   3
 
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   Statut Membre Dernière intervention   3
 
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 27137 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
As-tu essayé de préfixer les champs avec les noms de table ?
0