Access Clé primaire Format Spécial

cathodique

XLDnaute Barbatruc
Bonsoir,

J'ai l'intention de faire une petite application sous access 2010.
Je vais faire mes premiers pas. Je voudrais savoir si on pouvait configurer une clé primaire qui s'auto-incrémente avec un format spécial comme par exemple année+3chiffres. Si oui, comment procède-t-on?

Merci par avance.
Bonne soirée
 

dysorthographie

XLDnaute Accro
Bonsoir,
Tu peux créer une table

SQL:
CREATE TABLE TableNumerotation (
    Libelle VARCHAR(255) NOT NULL,
    Annee INT NOT NULL,
    Increment INT NOT NULL,
    PRIMARY KEY (Libelle, Annee)
);
tu peux gérer l'auto-incrément via un fonction

Code:
Public Function GenererNumero(Libelle As String) As String
    Dim rs As DAO.Recordset

    ' Ouvrir le recordset pour vérifier l'existence du libellé pour l'année courante
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM TableNumerotation WHERE Libelle = '" & Libelle & "' AND Annee = " & Year(Date), dbOpenDynaset)

    If rs.EOF Then
        ' Si le libellé n'existe pas pour l'année courante, ajouter un nouvel enregistrement
        rs.AddNew
        rs!Libelle = Libelle
        rs!Annee = Year(Date)
        rs!Increment = 1
        rs.Update
    Else
        ' Si le libellé existe, incrémenter ou réinitialiser selon l'année
        rs.Edit
        rs!Increment = IIf(rs!Annee <> Year(Date), 1, rs!Increment + 1) ' Réinitialiser ou incrémenter
        rs!Annee = Year(Date)
        rs.Update
    End If

    ' Retourner le numéro généré
    GenererNumero = Year(Date) & "-" & Format( rs!Increment,"000")

    ' Fermer le recordset
    rs.Close
    Set rs = Nothing
End Function
Utilisation
Code:
sub test()
Dim Numero As String
Numero = GenererNumero("MonLibelle")
MsgBox "Numéro généré : " & Numero
End Sub

il n'est pas possible de créer son propre Auto-Incrémént dans Access en revanche ma méhtode fonctionne. tu peux utiliser le nom de la table en lieu et place de "MonLibelle"
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonjour @dysorthographie ;),

Je t'avoue que je ne m'attendais plus à avoir un retour à mon fil.
Je te remercie beaucoup.
En fait, je débute sur Access. Je suis encore au stade du MCD que je n'arrive pas à bien organiser.
je suis entrain de suivre des tutos sur Merise. J'ai téléchargé AnalyseSi qui aide à faire des choses plus proprement qu'avec un crayon et du papier.
Pour renseigner un champ dans une table, par exemple sexe, est-ce que je dois créer une table Sexes où il n'y aura que: Mâles, Femelle.
J'ai aussi d'autres champs concernés par des listes de choix non évolutives dans les temps.

Merci.

Bonne journée
 

crocrocro

XLDnaute Impliqué
Bonjour @cathodique , @dysorthographie
@cathodique, concernant votre question,
Pour renseigner un champ dans une table, par exemple sexe, est-ce que je dois créer une table Sexes où il n'y aura que: Mâles, Femelle.
Pour les informations de type binaire (Masculin-Féminin, Oui-Non ...) il n'est pas utile de créer une table.
Un simple contrôle de validité lors de la saisie est suffisant. Pour Oui-Non, il existe, je crois un type Oui-Non dans Access.
Un suggestion :
Commencez à construire votre modèle dans Access (pas toutes les tables ni toutes les informations)
Postez le diagramme du MCD et la définition des tables.
Vous aurez des retours ici-même.
Selon votre niveau, apparemment débutant en ce qui concerne la conception de bases de données relationnelles, sélectionnez le niveau des tutos en conséquence, il vaut mieux débuter sur du plat que par une côte à 20 % ;)
Tapez par exemple concevoir une base de données relationnelle dans votre navigateur et laissez-vous guider ...
 

cathodique

XLDnaute Barbatruc
Bonjour @crocrocro ;) ,

Tapez par exemple concevoir une base de données relationnelle dans votre navigateur et laissez-vous guider ...
Il y a tellement de proposition que je me noie.

Pour Access, je suis vraiment débutant. J'avais fais quelques essais mis à la poubelle.
Postez le diagramme du MCD et la définition des tables.
J'ai fait du n'importe quoi. Il ne vous servira pas à grand chose.

Je vais essayer de décrire le plus correctement les tenants et aboutissants de cette bd.
J'aide bénévolement et gracieusement une association de Recueil d'animaux abandonnés.

Merci beaucoup.

Par anticipation, je vous souhaite joyeuses fêtes de fin d'année.
 

crocrocro

XLDnaute Impliqué
Il y a tellement de proposition que je me noie.
Oui, c'est le problème quand on débute, savoir reconnaitre l'essentiel (du moment).
(Re)Connaitre ce qui est nécessaire au niveau des concepts, les mettre en pratique et rentrer dans la technique mais là aussi, juste ce qui est utile. Et, dans un 2ème, 3ème ... temps, approfondir.
J'ai ouvert 2 ou 3 liens de la recherche que je vous ai proposée.
Celui-ci par exemple : Concepts et langages des Bases de Données Relationnelles
Survolez le début,
lire à partir de la page 14 à 22 (Le modèle Entité-Association)
page 28 à 30 LE MODÈLE RELATIONNEL
Dans le Chapitre 2 Le modèle relationnel :
page 41 à 52,
page 53 en 58 en survolant ce qui vous parait compliqué.
Et ,quand vous aurez défini votre modèle de données
Dans le Chapitre 3 Présentation des données (ciblé Access) page 59 à 68
Plus tard vous pourrez lire dans le Chapitre 4 L’algèbre relationnelle page 69 à 85 Les opérations
 

cathodique

XLDnaute Barbatruc
Oui, c'est le problème quand on débute, savoir reconnaitre l'essentiel (du moment).
(Re)Connaitre ce qui est nécessaire au niveau des concepts, les mettre en pratique et rentrer dans la technique mais là aussi, juste ce qui est utile. Et, dans un 2ème, 3ème ... temps, approfondir.
J'ai ouvert 2 ou 3 liens de la recherche que je vous ai proposée.
Celui-ci par exemple : Concepts et langages des Bases de Données Relationnelles
Survolez le début,
lire à partir de la page 14 à 22 (Le modèle Entité-Association)
page 28 à 30 LE MODÈLE RELATIONNEL
Dans le Chapitre 2 Le modèle relationnel :
page 41 à 52,
page 53 en 58 en survolant ce qui vous parait compliqué.
Et ,quand vous aurez défini votre modèle de données
Dans le Chapitre 3 Présentation des données (ciblé Access) page 59 à 68
Plus tard vous pourrez lire dans le Chapitre 4 L’algèbre relationnelle page 69 à 85 Les opérations
Re,

Merci beaucoup. Je vais avoir beaucoup de pain sur la planche.
Depuis le temps, je dois faire comme pour Excel. Plongé dans Access, j'apprendrai de mes erreurs.

Entre temps, j'ai essayé de rédiger une partie du projet. Ci-joint dans un pdf.

Encore merci, sympa de ta part.
 

Pièces jointes

  • Descriptif BD.pdf
    98.1 KB · Affichages: 1
  • MCD.png
    MCD.png
    8.2 KB · Affichages: 5
  • MPD.png
    MPD.png
    9 KB · Affichages: 2

crocrocro

XLDnaute Impliqué
@cathodique,
c'est pas mal !
Voir les 2 liens suivants peut-être plus adaptés que celui que j'ai indiqué précédemment Concepts de base sur la conception d'une base de données et Présentation des tables

Une petite mise au point de vocabulaire
MCD Modèle Conceptuel de Données
Entité dans le MCD = Table (dans la base Access)
Attribut dans le MCD = Champ
Identifiant dans le MCD = Clé Primaire
Pour les Relations (1,1 -> 1,N ou 1,1 -> 0,N ou 0,1 -> 0,N) du MCD :
La clé primaire de la table correspondant à l'entité côté 0,N migre dans la table correspondant à l'entité de côté 1,1. C'est la Clé étrangère.
Pour les Relations (1,N-> 1,N ou 0,N -> 1,N ou 0,1) :
Elles sont transformées en Tables de Liens avec pour identifiant la concaténation des clés primaires des 2 tables correspondant aux 2 entités.

Quelques remarques :
- Comme je l'ai déjà écrit inutile d'avoir une Table pour le Sexe. F et M directement dans la Table Animaux avec un contrôle de valeur.
- Concernant l'Entité (niveau MCD) Rôle, il y a un identifiant (IdRôle) et son libellé qui prend 3 valeurs possibles (Adoptant, Cédant,Fa ?) et non 3 attributs

Les clés primaires
- Une clé primaire doit être unique pour la Table concernée. C'est évident.
- Une clé primaire doit être figée dans le temps (sauf exception). Prenons par exemple la table des villes ou plutôt des Communes, on pourrait indiquer le nom de la commune comme clé primaire, mais comme c'est déjà arrivé, le nom peut changer.
Supposons que le nom de la commune change alors que votre application est en service depuis quelques temps.
Il faudra le changer dans la table Communes mais aussi, pour toutes les valeurs correspondantes (les clés étrangères de la table Personnes. Or, Access veille à conserver l'intégrité de la Base de Données et va vous signaler que ce n'est pas possible. Il y a des moyens techniques (je n'en parle pas ici).

Il y a d'autres conditions pour le choix d'une clé primaire. Par exemple, du nombre d'enregistrements de la table, de la manière dont on y accède, de ce que l'on veut privilégier, rapidité d'accès, simplification de mise en œuvre, lisibilité ...
Dans votre cas, la base de données est simple, il n'y aura pas des centaines de milliers d'enregistrements, d'avoir un résultat affiché dans la seconde. On pourra donc se permettre quelques libertés.
Prenons par exemple la table Espèce.
Elle contient 2 informations, l'identifiant et le Nom de l'Espèce.
On pourrait, le nom de l'espèce étant une donnée stable, utiliser celui-ci comme clé primaire.
Un clé interne (définie par Access) sera plus performante, prendra moins de place pour ce qui est de la clé étrangère dans la table Animaux. Mais ici, est-ce bien utile ?
Au concepteur de décider, à condition de connaitre les paramètres en jeu (ici le nombre d'enregistrements dans les tables Espèce mais surtout Animaux)

Bonne continuation ;)
 

cathodique

XLDnaute Barbatruc
@cathodique,
c'est pas mal !
Voir les 2 liens suivants peut-être plus adaptés que celui que j'ai indiqué précédemment Concepts de base sur la conception d'une base de données et Présentation des tables

Une petite mise au point de vocabulaire
MCD Modèle Conceptuel de Données
Entité dans le MCD = Table (dans la base Access)
Attribut dans le MCD = Champ
Identifiant dans le MCD = Clé Primaire
Pour les Relations (1,1 -> 1,N ou 1,1 -> 0,N ou 0,1 -> 0,N) du MCD :
La clé primaire de la table correspondant à l'entité côté 0,N migre dans la table correspondant à l'entité de côté 1,1. C'est la Clé étrangère.
Pour les Relations (1,N-> 1,N ou 0,N -> 1,N ou 0,1) :
Elles sont transformées en Tables de Liens avec pour identifiant la concaténation des clés primaires des 2 tables correspondant aux 2 entités.

Quelques remarques :
- Comme je l'ai déjà écrit inutile d'avoir une Table pour le Sexe. F et M directement dans la Table Animaux avec un contrôle de valeur.
- Concernant l'Entité (niveau MCD) Rôle, il y a un identifiant (IdRôle) et son libellé qui prend 3 valeurs possibles (Adoptant, Cédant,Fa ?) et non 3 attributs

Les clés primaires
- Une clé primaire doit être unique pour la Table concernée. C'est évident.
- Une clé primaire doit être figée dans le temps (sauf exception). Prenons par exemple la table des villes ou plutôt des Communes, on pourrait indiquer le nom de la commune comme clé primaire, mais comme c'est déjà arrivé, le nom peut changer.
Supposons que le nom de la commune change alors que votre application est en service depuis quelques temps.
Il faudra le changer dans la table Communes mais aussi, pour toutes les valeurs correspondantes (les clés étrangères de la table Personnes. Or, Access veille à conserver l'intégrité de la Base de Données et va vous signaler que ce n'est pas possible. Il y a des moyens techniques (je n'en parle pas ici).

Il y a d'autres conditions pour le choix d'une clé primaire. Par exemple, du nombre d'enregistrements de la table, de la manière dont on y accède, de ce que l'on veut privilégier, rapidité d'accès, simplification de mise en œuvre, lisibilité ...
Dans votre cas, la base de données est simple, il n'y aura pas des centaines de milliers d'enregistrements, d'avoir un résultat affiché dans la seconde. On pourra donc se permettre quelques libertés.
Prenons par exemple la table Espèce.
Elle contient 2 informations, l'identifiant et le Nom de l'Espèce.
On pourrait, le nom de l'espèce étant une donnée stable, utiliser celui-ci comme clé primaire.
Un clé interne (définie par Access) sera plus performante, prendra moins de place pour ce qui est de la clé étrangère dans la table Animaux. Mais ici, est-ce bien utile ?
Au concepteur de décider, à condition de connaitre les paramètres en jeu (ici le nombre d'enregistrements dans les tables Espèce mais surtout Animaux)

Bonne continuation ;)
Je te remercie infiniment. Je sais que je vais faire beaucoup de bêtises comme j'en ai fais sur excel.
En fait, beaucoup de choses sont encore confuses dans ma petite tête.
Mais cette fois-ci, je suis décidé de m'y mettre à Access.

Merci encore.

Bonne soirée
 

dysorthographie

XLDnaute Accro
Bonjour,
Je t'invite à être plus clair dans tes identifiants.
ID pour l'identifiant de la table et ID_provenance pour les identifiants externe.

Tu utilises idrole_roles ce qui me semble vouloir dire id role de la table rôles .

Personnellement je dirais que c'est ID implicitemt de la table rôles et dans la table etre ID_Roles vue qu'il fait allusion à l'id de la table rôles et la flèche de liaison externe est dans l'autre sens.

Notes que dans Access tu peux affecter le contenu d'une liste à un champ.

Par exemple le champ sex peut contenir une liste (Mâle, Femelle).
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonsoir,
Tu peux créer une table

SQL:
CREATE TABLE TableNumerotation (
    Libelle VARCHAR(255) NOT NULL,
    Annee INT NOT NULL,
    Increment INT NOT NULL,
    PRIMARY KEY (Libelle, Annee)
);
tu peux gérer l'auto-incrément via un fonction

Code:
Public Function GenererNumero(Libelle As String) As String
    Dim rs As DAO.Recordset

    ' Ouvrir le recordset pour vérifier l'existence du libellé pour l'année courante
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM TableNumerotation WHERE Libelle = '" & Libelle & "' AND Annee = " & Year(Date), dbOpenDynaset)

    If rs.EOF Then
        ' Si le libellé n'existe pas pour l'année courante, ajouter un nouvel enregistrement
        rs.AddNew
        rs!Libelle = Libelle
        rs!Annee = Year(Date)
        rs!Increment = 1
        rs.Update
    Else
        ' Si le libellé existe, incrémenter ou réinitialiser selon l'année
        rs.Edit
        rs!Increment = IIf(rs!Annee <> Year(Date), 1, rs!Increment + 1) ' Réinitialiser ou incrémenter
        rs!Annee = Year(Date)
        rs.Update
    End If

    ' Retourner le numéro généré
    GenererNumero = Year(Date) & "-" & Format( rs!Increment,"000")

    ' Fermer le recordset
    rs.Close
    Set rs = Nothing
End Function
Utilisation
Code:
sub test()
Dim Numero As String
Numero = GenererNumero("MonLibelle")
MsgBox "Numéro généré : " & Numero
End Sub

il n'est pas possible de créer son propre Auto-Incrémént dans Access en revanche ma méhtode fonctionne. tu peux utiliser le nom de la table en lieu et place de "MonLibelle"
Bonjour @dysorthographie ;),

Désolé d'avoir pris tout ce temps pour venir faire un retour.
Je fais mes premiers pas sous Access (2010).
J'ai réussi à trouver où éditer le code Sql. Ton code a bien créé la table.
Je ne me suis pas encore habitué à tous les menus et commandes d'Access, je patauge.
Je ne suis pas encore parvenu à utiliser ta fonction.
En fait, je me suis trompé en disant que je saisis l'année mais plutôt une date. Et cette devrait être une date de l'année en cours, sinon la rejeter et avertir l'utilisateur.

Je reviendrai lorsque j'aurai trouvé comment utiliser ta fonction. Je ne sais pas si dans Access les champs ont l'évènement Exit comme pour Les contrôles de formulaire d'Excel, pour appeler ta fonction.

Merci beaucoup.

Joyeuses fêtes de fin d'année.
 

cathodique

XLDnaute Barbatruc
Bonjour,
Je t'invite à être plus clair dans tes identifiants.
ID pour l'identifiant de la table et ID_provenance pour les identifiants externe.

Tu utilises idrole_roles ce qui me semble vouloir dire id role de la table rôles .

Personnellement je dirais que c'est ID implicitemt de la table rôles et dans la table etre ID_Roles vue qu'il fait allusion à l'id de la table rôles et la flèche de liaison externe est dans l'autre sens.

Notes que dans Access tu peux affecter le contenu d'une liste à un champ.

Par exemple le champ sex peut contenir une liste (Mâle, Femelle).
Encore désolé, je n'avais pas vu ce post (pas rafraichi la page).
Je te remercie pour tes conseils. Je fais en effet n'importe quoi?
Si j'ai bien compris je peux mettre "Id" dans toutes les tables et implicitement chaque Id sera lié à sa propre table.
Notes que dans Access tu peux affecter le contenu d'une liste à un champ.
Par exemple le champ sex peut contenir une liste (Mâle, Femelle).
Merci. Cependant, au stade du MCD est-ce que je crée une table "Sexe"? Pour rester en conformité des règles de Merise (pour lequel, je fais mes débuts. J'ai suivi plusieurs tutos sur youtube).

Je trouve qu'Access est beaucoup plus compliqué à maîtriser qu'Excel. Il n'offre pas beaucoup de souplesse d'essai. Les différents messages que je reçois me déroutent. Il faut beaucoup de rigueur. J'ai abandonné plusieurs apprentissage d'Access, cette fois-ci je compte ne pas abandonner.

Merci beaucoup.
 

dysorthographie

XLDnaute Accro
Non pas besoin d'une table sex.

Dans ta table tu mets un champ sex sur l'onglet liste de ce même Champ tu sais
Mâle
Femelle

Sachant que chaque ligne représente une valeur de ta liste.

Quand ta table sera en mode saisie tu auras une combobox qui te proposera Mâle/Femelle.

Ceci dit Access dispose d'un assistant qui permet de faire tout et n'importe quoi ce que ne dispose pas Excel.

Tu peux créer un table via l'assistant, créer une requête Via l'assistant, un formulaire toujours via l'assistant. Faire ça dans excel 😭
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 124
Messages
2 116 461
Membres
112 756
dernier inscrit
amar13