Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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: 3199
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. smile

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: 3199
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 smile

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: 3199
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

bioteau
Participant occasionnel
Lieu: Rennes
Date d'inscription: 18 Oct 2005
Messages: 23
Site web

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

olive
Participant occasionnel
Lieu: Auch
Date d'inscription: 5 Sep 2005
Messages: 37
Site web

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: 3199
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

bioteau
Participant occasionnel
Lieu: Rennes
Date d'inscription: 18 Oct 2005
Messages: 23
Site web

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

olive
Participant occasionnel
Lieu: Auch
Date d'inscription: 5 Sep 2005
Messages: 37
Site web

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@texte-a-enlever.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

Bruno
Membre du bureau
Lieu: Toulouse
Date d'inscription: 22 Jun 2005
Messages: 11956
Site web

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

Hors ligne

 

#15 Thu 27 September 2007 21:19

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3199
Site web

Re: [VB et ACCESS] Problème de syntaxe ?

Bonjour,

Concernant  le code que j'ai proposé.

olive a écrit:

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.

MSDN (MicroSoft Developer Network Library) a écrit:

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 wink

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


Aide MS ACCESS a écrit:

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 smile ! 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

 

Pied de page des forums

Powered by FluxBB