Concaténation Access

Fermé
PseudoNana Messages postés 11 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 15 janvier 2009 - 4 avril 2008 à 11:32
LatelyGeek Messages postés 1758 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2023 - 7 avril 2008 à 20:09
Bonjour,
J’ai une question technique concernant une de mes tables sous Access 2003.
La table « Parcelle » comprend trois clés primaires : le n°insee de la commune, le n° de section, et le n°cadastral (ex : 53001, ZA, 123). L’ensemble de ces champs identifie de manière unique une parcelle.
Je tiens à conserver ces trois champs car le n°insee permet de faire le lien avec ma table commune et je trouve que la saisie de trois champs distincts est plus facile qu’un grand comprenant à la fois du texte et du numérique.
Par contre, pour obtenir un lien avec les tables « Relevé » et « Usager », je dois avoir un seul champ identifiant 53001ZA123 ? Si c’est le cas, je dois créer un nouveau champ identifiant dans la table parcelle qui sera la concaténation de mes trois champs qui formaient la clé primaire. Mais comment améliorer la saisie ?
Merci de m’éclairer.

8 réponses

LatelyGeek Messages postés 1758 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2023 550
4 avril 2008 à 13:32
Oui, pour faire le lien il est nettement préférable d'avoir un seul champ. Mais tu en veux trois.

Nous allons donc voir comment avoir le beurre et l'argent du beurre.

Rajoute un champ dans ta table Parcelle, que nous appellerons ici CléId
Pour mettre à jour ce champ pour les parcelles existantes, tu crées une requête MAJ. La mise à jour de CléId se fait avec [N°INSEE]&[N°Section]&[N°Cadastre]

Pour les nouvelles parcelles, dans le formulaire de saisie (Parce que je suppose qui'l y a un formulaire de saisie?) il faudra créer une propriété Après MAJ de ces trois champs (On pourrait se cententer de faire sur le dernier saisi mais sur les trois c'est plus sûr, en cas de modif)
Tu affiches la feuille de propriétés
Dans l'onglet Evenement tu choisis Après MAJ, tu cliques sur le bouton générateur à trois points à droite,
Tu choisis module
Et tu écris entre Sub et End Sub
Me!CléId.Value=Me![N°INSEE].Value&Me![N°Section].Value&Me![N°Cadastre].Value

Et ensuite tu peux mettre la clé de ta table Parcelle sur le champ CléId.

A+
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
4 avril 2008 à 13:36
Bonjour,

J'ai quelques questions. Comment une table peut avoir 3 clés primaires ? et pourquoi vouloir créer un identifiant qui existe déjà ? Si, comme je le suppose, la table Parcelle est une table de relation entre 3 autres tables (Commune, section, cadastre) il faut faire par exemple : "Select * From Releve Where id = (Parcelle.numCommune & Parcelle.numSection & Parcelle.numCadastral)". Il existe la fonction concat en sql mais je ne sais pas si elle fonctionne sur Access.

;o)

polux
0
LatelyGeek Messages postés 1758 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2023 550
4 avril 2008 à 16:31
Je suppose que PseudoNana voulait dire "Clé multi-champ".
Ca peut fonctionner mais c'est pas super pratique, par exemple pour créer un nouveau relevé il faut remplir les trois champs au lieu d'en sélectionner un seul.

D'une manière générale, dans une relation, si on veut utiliser Access sans galères inutiles, il faut que la clé de la table du côté "Un" de la relation porte sur UN seul champ. Mais la concaténation fonctionne.
0
PseudoNana Messages postés 11 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 15 janvier 2009
7 avril 2008 à 12:28
Merci pour ces infos. Ma requête de mise à jour fonctionne bien. Par contre pour mon formulaire, la procédure évenementielle Après Maj ne marche pas.
Je l'applique bien sur les trois champs. Ca bloque sur le mot clé Me.
J'essaie de mon côté de me documenter, car c'est nouveau pour moi VBA.

Private Sub PAinsee_AfterUpdate()
Me!PAid.Value=Me![PAinsee].Value&Me![PAsection].Value&Me![PAnum].Value
End Sub

Private Sub PAsection_AfterUpdate()
Me!PAid.Value=Me![PAinsee].Value&Me![PAsection].Value&Me![PAnum].Value
End Sub

Private Sub PAnum_AfterUpdate()
Me!PAid.Value=Me![PAinsee].Value&Me![PAsection].Value&Me![PAnum].Value
End Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
7 avril 2008 à 12:33
bjr,

Me!PAid.Value=Me![PAinsee].Value&Me![PAsection].Value&Me![PAnum].Value

PAid, PAinsee, PAsection, PAnum sont des TextBoxes de ton formulaire ?
Dans ce cas la syntaxe est :
Me.PAid.Text = Me.PAinsee.Text & Me.PAsection.Text & Me.PAnum.Text


;o)

polux
0
PseudoNana Messages postés 11 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 15 janvier 2009
7 avril 2008 à 16:57
Désolée, mais ça ne fonctionne tjrs pas.
On me marque: Impossible de faire référence à une propriété ou de la définir pour un contrôle si ce dernier n'est pas activé.
J'ai vérifié et l'ensemble de mes zones de texte sont activées.
L'intérêt du code est bien d'obtenir le champ id en saisissant uniquement les trois champs Insse, section, num cadastral dans le formulaire. Ou il faut tout de même passer par la requête de mise à jour?
Pour le moment ça ne me convient pas parce que je ne peux pas attribuer au champ id une clé primaire, car on a une valeur nulle tant que la mise à jour n'est pas faite.
Ne pas hésiter à me poser des questions?
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
7 avril 2008 à 18:45
Essaie avec ça :

Me.PAid.Value = Me.PAinsee.Value & Me.PAsection.Value & Me.PAnum.Value

a tout hasard !!!

polux
0
LatelyGeek Messages postés 1758 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2023 550
7 avril 2008 à 20:09
"...Pour le moment ça ne me convient pas parce que je ne peux pas attribuer au champ id une clé primaire, car on a une valeur nulle tant que la mise à jour n'est pas faite."

C'est exactement pour ça que ça n'est pas pratique d'avoir ta clé sur ces trois champs!!!!!
0