#1 Mon 17 September 2007 11:54
- Emil'
- Participant actif
- Lieu: Plaisir
- Date d'inscription: 7 Mar 2007
- Messages: 132
[VB et ACCESS] Problème de syntaxe ?
Bonjour,
Après deux jours de recherches et de galère, je m'en remet aux spécialistes du VB pour me sortir d'affaire.
Dans mon appli ACCESS, j'ai un formulaire de saisie des contacts, lié par l'ID du contact à un formulaire des projets. Je souhaite récupérer automatiquement l'ID du contact dans le champs correspondant du formulaire "projets".
Dans la procédure du bouton "open_form", j'ai, entre autres :
Code:
stDocName = "Saisie_proj" stLinkCriteria = "[ID_Contact]=" & Me![ID_Contact] DoCmd.OpenForm stDocName, , , stLinkCriteria, , , Me.[ID_Contact]
Et à l'ouverture du formulaire "projet" :
Code:
Private Sub Form_Open(Cancel As Integer) If IsNull(Me.OpenArgs) Then Else [b]Me.[ID_Contact] = CLng(Me.OpenArgs)[/b] [i]'<--ligne qui pose pb[/i] End If End Sub
Evidemment, cela ne marche pas, j'obtiens "impossible d'attribuer une valeur à cet objet". L'outil de debug m'indique que l'argument contient bien l'ID, mais il ne l'attribue pas...
Merci d'avance pour votre aide,
Emilien.
Hors ligne
#2 Mon 17 September 2007 15:44
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3197
- Site web
Re: [VB et ACCESS] Problème de syntaxe ?
Bonjour,
Le code que vous soumettez est du VBA. (C'est légérement différent de VB).
Code:
stLinkCriteria = "[ID_Contact]=" & Me![ID_Contact]
Vous récupérez la valeur ID_Contact présente dans le formulaire appelant (conteneur du bouton "open_form").
Ensuite votre Sub Form_Open correspond en VB à un Form_Load, et il est impossible de faire référence au contenu des contrôle d'une feuille (conteneur) avant que celle-ci ai été chargée (procédure Form_Load).
Il est normal que Debug indique que OpenArgs contienne la valeur ID_Contact, car comme l'indique le message d'erreur cette valeur existe mais il est impossible de l'attribuer à Me.[ID_Contact], car le chargement de la feuille n'est pas termniné.
Pour tester si c'est cela définissez une variable public au niveau module, assignez lui la valeur ID_Contact dans le formulaire appelant, puis à l'aide d'un bouton sur le formulaire projet tentez d'assigner cette variable publique à la propriété [Id_Contact] du formulaire projet.
Ensuite
Ceci uniquement pour l'exemple, car il y a peut-être une autre source d'erreur, je n'ai pas de VBA Access sous la main, et ce type de programmation m'est peu familière (il m'est plus facile d'utiliser VB et le moteur Jet, que ACESS et VBA). Ce qui suit est sous réserve:
La propriété Me.[ID_Contact] est en lecture seule. En effet vous fournissez un argument stlinkCriteria qui comme son nom l'indique sert à lier le formulaire "projet" au formulaire appelant. Il me semble donc normal que cette propriété soit en lecture seule. Si c'est le cas elle contient déjà la valeur ID_Contact.
A+
Christophe
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#3 Mon 17 September 2007 16:28
- Emil'
- Participant actif
- Lieu: Plaisir
- Date d'inscription: 7 Mar 2007
- Messages: 132
Re: [VB et ACCESS] Problème de syntaxe ?
Merci beaucoup pour votre aide.
Je vous tiens au courant dès que j'ai réussi à appliquer vos conseils.
Hors ligne
#4 Mon 17 September 2007 17:35
- Emil'
- Participant actif
- Lieu: Plaisir
- Date d'inscription: 7 Mar 2007
- Messages: 132
Re: [VB et ACCESS] Problème de syntaxe ?
Et bien ça marche !
- J'ai créé un module pour déclarer ma variable.
- Je la met à jour lorsqu'on clique sur le bouton qui ouvre l'autre formulaire
- Je récupère la variable au chargement du formulaire et met à jour le champs.
Encore merci Christophe, pour cette méthode. Je commence à mieux comprendre ce langage, maintenant.
Hors ligne
#5 Mon 17 September 2007 20:07
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3197
- Site web
Re: [VB et ACCESS] Problème de syntaxe ?
Re,
Content que cela marche mais ça n'est pas élégant.
Si vous aimez la programmation et que vous vous initiez à VBA ACCESS je vous conseil fortement de migrer vers une solution Langage de prog + Interface Objet Moteur BD ACCESS (Jet). Car vous attendrez vite les limitations en matière d'Interface Utilisateur.
Concernant votre pb:
La solution élégante serait de lier le Sous-formulaire projet au formulaire appelant, en effet pas besoin de mettre à jour l'ID_Contact. Qui s'il porte bien son nom est une clef primaire (et n'a pas vocation à être visible de l'utilisateur).
Il existe plusieur solution VBA pour régler ce type de pb.
Définir le sous formulaire "projet" comme consommateur de données d'une source de donnée ( Propertie DataSource )
Et si mes souvenir sont bons il faut regarder du coté des propriétés LinkMasterFields et LinkChildFields du formulaire, soit , ChampsPere et ChampsFils.
Mieux:
Etudier le modèle Objet MS ACCESS ( F1 + Index ) +
Database
QueryDef
Recordset
Utiliser les formulaires comme interface d'affichage et alimenter leur contenu à l'aide d'un objet recordset que vous contrôlerez par le code.
A+
Christophe
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#6 Thu 20 September 2007 15:34
- Emil'
- Participant actif
- Lieu: Plaisir
- Date d'inscription: 7 Mar 2007
- Messages: 132
Re: [VB et ACCESS] Problème de syntaxe ?
Merci Christophe.
J'ai tenté de comprendre ce que vous me conseillez, mais j'avoue que l'appli fonctionnant et mon stage se terminant dans une semaine, je vais éviter de tout flinguer
Cependant, je m'occupe en essayant de créer un module de statistiques simples accessible par un petit bouton.
Je ne parviens pas à trouver la syntaxe exacte pour entrer du SQL avec VBA. Dans tout ce que j'ai lu, je n'ai pas trouvé deux fois la même utilisation des parenthèses, guillements, apostrophes et compagnie. L'aide "F1" est encore moins compréhensible, je trouve.
J'ai donc tenté l'utilisation de DCount.
Ma ligne est de la forme suivante : ( retour à la ligne pour être lisible en entier)
Code:
Dim Val1 As Integer Val1 = DCount("[Statut_contact]", "Contacts", "[Statut_contact] = particulier")
Evidemment, Val1 retourne "0", malgré tous les essais de syntaxe possibles. Auriez-vous une idée ?
Merci d'avance.
Dernière modification par Emil' (Thu 20 September 2007 15:36)
Hors ligne
#7 Thu 20 September 2007 18:22
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3197
- Site web
Re: [VB et ACCESS] Problème de syntaxe ?
Bonjour,
DCount je connais pas, mais il existe une façon simple d'obtenir ce que vous souhaitez.
Il faut créer les requêtes dont vous avez besoin dans Access, l'interface graphique vous évitera de manipuler le SQL (qui est en plus n'est pas standard pour Access).
Vous utilisez ensuite ces requetes dans votre code.
Je vous donne un exemple en Access97 (si vous êtes sur 2000 ou sup il peut y avoir quelques différences).
Admlettons que vous ayez créer une requête nommée "RQ_Toto"
Vous allez utiliser un objet base de donnée (Bd) au quel vous affectez la base ouverte en cours
ensuite parmis les requete de la base vous prenez celles qui vous interresse ("RQ_Toto"), vous l'ouvrez (ce qui vous donne un objet recordset: rst) vous parcourez ensuite ce recordset pour pouvoir utiliser les valeur contenues dans les champs de la requête sous jacente.
Code:
Private Sub Commande0_Click() Dim rq As QueryDef Dim rst As Recordset Dim bd As Database Set bd = CurrentDb() Set rq = bd.QueryDefs("RQ_Toto") Set rst = rq.OpenRecordset If Not (rst.EOF And rst.BOF) Then rst.MoveFirst Do While Not rst.EOF mavaleur = rst("NomduChamp") rst.MoveNext Loop Else 'il n'y a pas d'enregistrement dans la requete End If End Sub
A+
Christophe
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#8 Thu 20 September 2007 22:52
Re: [VB et ACCESS] Problème de syntaxe ?
Bonjour,
J'ai déjà eu ce genre de problème. Il faut que le dernier critère soit compris comme du texte et indépendamment du nom de champ. Essayez :
Val1 = DCount("[Statut_contact]", "Contacts", "[Statut_contact] = " + "particulier")
Pour info, comment j'avais résolu un problème ou mon champ de critère était en numérique :
Nrec = DCount("[num_parc_agr]", "parcelles", "[code_bv] = " + Str(Choixbv) + "")
Cordialement
Thierry Bioteau
Hors ligne
#9 Fri 21 September 2007 10:17
- Emil'
- Participant actif
- Lieu: Plaisir
- Date d'inscription: 7 Mar 2007
- Messages: 132
Re: [VB et ACCESS] Problème de syntaxe ?
Merci à vous,
@Christophe: J'obtiens une "erreur n°13: incompatibilité de type" sur la ligne
Code:
Set rst = rq.OpenRecordset
Peut-être est-ce dû à ma version (Access 2002) ? J'ai cherché plein de trucs sans succès ....
@bioteau: Le champs "Statut_Contact" est lié par son ID à la table "List_StCtct" afin d'obtenir une liste déroulante de saisie dans le formulaire. Donc le critère est bien une valeur numérique "1" au lieu de "particulier".
Mais cela ne change rien, j'obtiens toujours "0"... J'ai testé plein de syntaxe, mais sans succès.
Enfin, ce n'est pas bien grave. Je vous remercie (je ne me repencherai sur la question que Lundi. Bon week-end à tous.
Emilien.
Juste une dernière question: Je crois qu'il n'est pas conseillé de placer le .mdb sur un serveur pour une utilisation depuis différents postes (même sans utilisation simultanée). Qu'en pensez-vous ?
Dernière modification par Emil' (Fri 21 September 2007 10:39)
Hors ligne
#10 Fri 21 September 2007 15:17
Re: [VB et ACCESS] Problème de syntaxe ?
Il y a une erreur, c’est l’objet database qui appelle la requête … :
Set Rs = db.openRecordset(Rq,dbOpenDynaset)
dbOpenDynaset permet d’ouvrir en lecture/ecriture
dbOpenSnapshot permet d’ouvrir en lecture seule
etc.
deplus, il se peut suivant les versions que vous deviez déclarer l’objet en « forçant » la classe DAO ( à référencer dans le projet –Outils/Références- rajouter si ce n’est pas fait Microsoft DAO 3.6 Object Library) :
dim db as DAO.Database
dim Rs as DAO.Recordset
etc.
bon courage
Olivier Barasz
Olivier Barasz
Responsable du Pôle Cartographie et Décisionnel
Département du Gers
Hors ligne
#11 Fri 21 September 2007 16:29
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3197
- Site web
Re: [VB et ACCESS] Problème de syntaxe ?
Bonjour,
Il y a une erreur, c’est l’objet database qui appelle la requête
Ben peut-être, mais je dois avoir quelques centaines de function VB qui ont cette syntaxe et pas de pb.
Et la methode openrecordset est bien une méthode de l'objet QueryDef et elle renvoie un objet recordset (en DAO 3.6).
A+
Christophe
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#12 Fri 21 September 2007 18:35
Re: [VB et ACCESS] Problème de syntaxe ?
Bonjour,
C'est bien un pb de type numérique au lieu du texte.
Dans ce cas, il faut placer la fonction str si c'est une variable de type numerk
Essayez :
Val1 = DCount("[Statut_contact]", "Contacts", "[Statut_contact] = " + Str(variable) + ""))
Ou plus simplement si pas besoin de passage de variable :
Val1 = DCount("[Statut_contact]", "Contacts", "[Statut_contact] = "'1'"))
Hors ligne
#13 Fri 21 September 2007 18:35
Re: [VB et ACCESS] Problème de syntaxe ?
Il y a une erreur, c'est l'objet database qui appelle la requête ... :
Set Rs = db.openRecordset(Rq,dbOpenDynaset)
dbOpenDynaset permet d'ouvrir en lecture/ecriture
dbOpenSnapshot permet d'ouvrir en lecture seule
etc.
deplus, il se peut suivant les versions que vous deviez déclarer l'objet en « forçant » la classe DAO ( à référencer dans le projet -Outils/Références- rajouter si ce n'est pas fait Microsoft DAO 3.6 Object Library) :
dim db as DAO.Database
dim Rs as DAO.Recordset
etc.
bon courage
Olivier Barasz
Service S.I.G.
DSITC
Conseil Général du Gers
81, Route de Pessan - BP 569 - 32022 Auch Cedex
Tel : 05 62 67 44 64 - Fax : 05 62 67 44 66
Courriel : sig32@ cg32.fr
Olivier Barasz
Responsable du Pôle Cartographie et Décisionnel
Département du Gers
Hors ligne
#14 Wed 26 September 2007 22:35
Re: [VB et ACCESS] Problème de syntaxe ?
Bonsoir,
L'un de vous (Emilien?) peut-il faire partager la bonne réponse, le bon code, pour les abonnés?
Amicalement,
Bruno
En ligne
#15 Thu 27 September 2007 21:19
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3197
- Site web
Re: [VB et ACCESS] Problème de syntaxe ?
Bonjour,
Concernant le code que j'ai proposé.
il se peut suivant les versions que vous deviez déclarer l'objet en « forçant » la classe DAO ( à référencer dans le projet -Outils/Références- rajouter si ce n'est pas fait Microsoft DAO 3.6 Object Library) :
C'est vrai. Mais pour le reste je maintient.
Dans le cadre d'un objet querydef la syntaxe est la suivante :
Code:
Set recordset = object.OpenRecordset (type, options, lockedits)Avec
Type
Facultatif. Constante indiquant le type d'objet Recordset à ouvrir, comme indiqué dans la section Valeurs.
options
Facultatif. Combinaison de constantes indiquant les caractéristiques du nouvel objet Recordset, comme indiqué dans la section Valeurs.
lockedits
Facultatif. Constante définissant le verrouillage de l'objet Recordset, comme indiqué dans la section Valeurs.
J'omets volontairement la section valeurs
Verifiez sous debug la nature de l'objet rq et de l'objet rst.
Concernant la fonction Dcount :
En fait avec le code dont j'ai l'habitude il suffit d'ajouter une variable Count& de type entier long et de l'incrémentée dans la boucle de lecture du recordset pour avoir le nombre d'enregistrement. D'où ma méconnaissance de la fonction.
DCount(expression, domaine[, critère])
Critère
Une expression-chaîne facultative servant à limiter la plage des données sur laquelle porte la fonction CpteDom (DCount). Par exemple, critère est souvent équivalent à la clause WHERE d'une expression SQL sans le mot WHERE. En cas d'omission de critère, la fonction CpteDom évalue expression par rapport à l'intégralité du domaine. Chaque champ compris dans critère doit l'être aussi dans domaine, sans quoi la fonction CpteDom (DCount) retourne la valeur Null.
Exemple:
intX = DCount("[Date d'envoi]", "Commandes",
"[Pays livraison] = 'Royaume-Uni' AND [Date d'envoi] < #1-1-95#")
Donc dans votre cas
Code:
Val1 = DCount("[Statut_contact]", "Contacts", "[Statut_contact] = " & Ltrim$(str$(mavariable)))
LTrim$() (supprime les espaces de gauche d'une chaîne de caractères) :Car la fonction Str$(mavariable) renvoi une chaîne où un caractère est systèmatiquement réservé à gauche:
espace pour mavariable positif
"-" si mavariable est négative
ou si vous utilisez une valeur fixe
Code:
Val1 = DCount("[Statut_contact]", "Contacts", "[Statut_contact] = 1")
A+
Christophe
Dernière modification par DIANA2D.dev (Fri 28 September 2007 16:00)
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#16 Fri 28 September 2007 08:58
- Emil'
- Participant actif
- Lieu: Plaisir
- Date d'inscription: 7 Mar 2007
- Messages: 132
Re: [VB et ACCESS] Problème de syntaxe ?
Désolé, je n'ai pas eu le temps d'approfondir la question. J'ai fait au plus simple et au plus vite pour terminer mon stage sur une appli qui fonctionne.
Et s'ils en veulent plus, ils n'ont qu'à m'embaucher en Janvier ! wait & see...
Merci en tous cas à Christophe et Bioteau et Olivier pour leur aide.
Dernière modification par Emil' (Fri 28 September 2007 09:00)
Hors ligne