Access : Sql & VBA
nippon1944 Messages postés 155 Statut Membre -
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 :/
--
'en panne d'inspiration pour sa signature
joueur invétéré depuis 2003, game-addict depuis 2004, no life depuis peu^^
joueur de WoW depuis 2007
horde: conseil des ombres: mage 74 chevalier de la mort 65
arathi : démoniste 70 chevalier de la mort 58
- Access : Sql & VBA
- Access appdata - Guide
- Acer quick access - Forum Logiciels
- Hns-self-wan-access-ipv6 - Forum Access
- Restructuration base de données access - Forum Access
- Get access - Télécharger - Récupération de données
4 réponses
Une requête d'insertion en VBA Access mêle des INSERT INTO sur deux tables et des concaténations de contrôles, ce qui conduit Access à signaler un point-virgule manquant. Selon les conseils, l'erreur ne vient pas d'un manque de point-virgule mais d'un point-virgule superflu en fin d'expression; il faut retirer le ; et privilégier deux INSERT INTO séparés. D'autres conseils recommandent d'éviter les chaînes longues en une seule requête, et de mettre des contrôles côté formulaire pour gérer les liaisons et éviter les entrées en double entre les tables. Pour éviter les erreurs récurrentes, il peut être utile de normaliser le modèle de données ou d'utiliser une vue ou une procédure stockée et de tester les requêtes sur une base de développement.
"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.
pas de AND pour faire deux INSERT INTO, mais deux INSERT INTO à faire l'un après l'autre (runsql à passer deux fois)...
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 ?
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.
la listebox ça risque de faire sale non ?
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;
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 = 3pourtant je fait ma requête il me dit opérateur manquant dans les INNER JOIN...
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.
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.
Fais un Msgbox avant et tu verras qu'elle a une structure particulière...
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 SubJe 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.