Concaténation Access
PseudoNana
Messages postés
11
Statut
Membre
-
LatelyGeek Messages postés 1774 Date d'inscription Statut Membre Dernière intervention -
LatelyGeek Messages postés 1774 Date d'inscription Statut Membre Dernière intervention -
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.
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
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+
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+
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
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
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.
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.
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
;o)
polux
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
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?
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?
Essaie avec ça :
Me.PAid.Value = Me.PAinsee.Value & Me.PAsection.Value & Me.PAnum.Value
a tout hasard !!!
polux
Me.PAid.Value = Me.PAinsee.Value & Me.PAsection.Value & Me.PAnum.Value
a tout hasard !!!
polux