IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Incrémentation modifiée par access [AC-2007]


Sujet :

IHM

  1. #1
    Membre du Club

    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2011
    Messages : 83
    Points : 51
    Points
    51
    Billets dans le blog
    1
    Par défaut Incrémentation modifiée par access
    Bonjour à toutes et à tous,

    je viens de terminer la conception d'une base de donnée qui a pris de moi bcp de temps mais malheureusement j'ai remarqué qu'il existe une grande faute, je vous explique ci dessous les détails ce qui s'est passé et je vous demande de bien vouloir m'aider vu l'importance de cette base dans mon travail:
    j'ai un formulaire conçu sur la base d'une requête :
    Nom : Sans titre.jpg
Affichages : 181
Taille : 184,2 Ko

    le champ "n" ajouté dans la requête et dont la fonction n'est pas visible dans l'image ci dessus est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n: VraiFaux([resultat_test]="succes";Format(Nz(CpteDom("N°";"condidat";"( resultat_test ='succes') and code_annee =" & Nz([code_annee];0) & " and [N°]<" & Nz([];0));0)+1;"0000");"")
    La saisie sur mon formulaire se fait de la manière suivante: je commence à saisir les données des candidats dans les champs: cin, date_cin ..... centre
    après dès que je reçois le résultat de test "resultat_test" je reviens sur les données saisies (par un simple recherche de numéro cin) pour ajouter les valeurs des 4 champs qui restent à remplir à savoir: date_test, code_année, resultat_test, date_reception sachant que la valeur du champ "n" est indiquée dans le code ci dessus et code_année qui est l'année en cours est une liste déroulante, de cette manière access incrémente le champ "n" en fonction des valeurs sélectionnées dans les champs resultat_test et code_année, chaque saisie à ce niveau est suivie de l'impression de l'attestation contenant bien évidement la valeur de "n", je dois avoir dans ma table quelque chose comme ça:

    Nom : Sans titre1.jpg
Affichages : 194
Taille : 179,5 Ko

    malheureusement, ce qui se passe par la suite c'est que access modifie automatiquement les valeurs de "n" en fonction de l'ordre de saisie dans la table comme suit:

    Nom : Sans titre2.jpg
Affichages : 162
Taille : 173,2 Ko

    une des conséquences c'est que je vais avoir des candidats dont les valeurs des attestations "n" ne coïncident pas avec les valeurs "n" qui figurent dans la table des statistiques.
    Images attachées Images attachées   

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour et bonne année.

    Désolé mais je ne saisi pas bien ce que le "n" est sensé être.

    L'ordre dans lequel tu entres les résultats ?

    Là comme tu le recalcules en fonctions des données présentes, si le résultat ne te convient pas il faudrait probablement ajouter un critère pour forcer l'ordre de calcul ou alors l'entrer à la main.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre du Club

    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2011
    Messages : 83
    Points : 51
    Points
    51
    Billets dans le blog
    1
    Par défaut
    Bonjour, je te souhaite une nouvelle année pleine de bonheur et de succès,
    "n" est le numéro de l'attestation en cas ou le résultat du test est "succès" , ce numéro doit prendre la forme 0000 il s'incrémente automatiquement de cette manière 0001, 0002, 0003....., 0015....0120.... l'incrémentation de "n" dépend de mon choix dans les deux champs qui précédent à savoir code_année et résultat_test : par exemple code_année=17 et resultat_test=succes la valeur "n" s'incrémente de la manière indiquée ci dessus.
    Au début d'année 2018, le code_année va changer je dois sélectionner 18 et resultat_test=succes, la valeur "n" dans ce cas va recommencer son incrémentation dès le debut à savoir 0001 et ainsi de suite. Il faut ajouter aussi que si le resultat_test =echec alors aucune valeur ne va s'afficher (chose qui est logique vu le candidat n'a pas reussi dans son test)

    En ce qui concerne la deuxième question (ordre de saisie), j'ai voulu montrer que la saisie pour le meme candidat se fait en deux temps: la première saisie se fait lorsque les candidat déposent leur candidature à ce moment là je commence à ajouter ces données sur mon formulaire: cin, date_cin, nom, prénom, date_naissance......... centre. Après avoir saisir les données relatives aux candidats, je vais recevoir chaque jour les résultats de leur test "resultat_test" dans un ordre différent de celui de la première saisie, dans la table liée au formulaire il y aura des lignes où le resultat_test est vide (vu que j'ai pas encore reçu les resultats)de cette manière j'aurais progressivement quelque chose comme ça :

    Nom : Sans titre.jpg
Affichages : 140
Taille : 44,8 Ko



    Malheureusement, ce qui s'est passé c'est que access modifie les valeurs de "n" dans un autre ordre, en fonction de saisie il affecte (par exemple) à Marie le numero 0001, à Vincent 0002 mais pour Nathalie il affectera 0001 et modifie au meme temps Marie qui devient 0002 , Lucien 0003 et Vincent 0004,


    Nom : Sans titre1.jpg
Affichages : 146
Taille : 42,1 Ko

    donc il est clair qu'il prend en considération l’ordre de saisie qui a eu lieu en 1er temps (c'est a dire lors de dépôt de candidature)

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    OK, donc il ne faut pas recalculer le nombre à chaque fois comme tu le fais présentement.
    Il faut le calculer au moment où tu fais la modification et il faut l'enregistrer dans la table.

    Le plus simple est de mettre le code dans l'événement Après MAJ du champ "resultat_test".

    Note que ton code peut poser un problème si plusieurs personnes entre des données en même temps.
    Il y a une très très faible probabilité que les 2 personnes fassent exactement la même action en même temps et que le système calcule 2 fois le même numéro.
    Comme le numéro est relié à l'année, il faudrait ajouter un index unique composé de [code_annee] et [resultat_test] comme cela le système va générer une erreur qu'on peut traiter,

    Au niveau du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    dim num as variant
     
    on error goto Err_MAJNo
     
    if me.resultat_test="Succes" and not isnull(me.code_annee)  then
     
    Reessayer_MAJNo:
     
        num=dmax("N°", "condidat", "[resultat_test]=""Succes"" and [code_annee]=" & me.code_annee) 'trouve le dernier numéro
     
        if isnull(num) then
           num=0
        end if
     
        me.[]=num+1 'Ajoute 1
    end if
     
    Exit_MAJNo:
    Exit Sub
     
    Err_MAJNo:
        select case err.number
           case 3022 'Enregistrement en double
              resume Reessayer_MAJNo
           case else
              msgbox err.number & ", " & err.description, vbExclamation
              resume exit_MAJNo
        end select
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Membre du Club

    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2011
    Messages : 83
    Points : 51
    Points
    51
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    D'abord merci pour ta réponse,
    j'ai oublié de mentionner que j'ai un code deja dans l'evenement apres Maj du champ "resultat_test", le code est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    If Form_condidat.resultat_test = "002" Then
    Form_condidat.n = ""
    Form_condidat.n.Enabled = False
    Form_condidat.code_annee.Enabled = False
    Form_condidat.date_reception.Enabled = False
    Form_condidat.date_test.Enabled = True
    End If
    If Form_condidat.resultat_test = "001" Then
    Form_condidat.n.Enabled = True
    Form_condidat.date_test.Enabled = True
    Form_condidat.code_annee.Enabled = True
    Form_condidat.date_reception.Enabled = True
    End If

    001=succes
    002=echec

    je t'explique aussi comment j'ai procédé mais malheureusement ça marche pas :

    j'ai pris le code que tu m'as envoyé, j'ai modifié "num" par "n" qui représente le numéro de l'attestation puis j'ai collé le code sous l'autre code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Private Sub resultat_test_AfterUpdate()
    If Form_condidat.resultat_test = "002" Then
    Form_condidat.n = ""
    Form_condidat.n.Enabled = False
    Form_condidat.code_annee.Enabled = False
    Form_condidat.date_reception.Enabled = False
    Form_condidat.date_test.Enabled = True
    End If
    If Form_condidat.resultat_test = "001" Then
    Form_condidat.n.Enabled = True
    Form_condidat.date_test.Enabled = True
    Form_condidat.code_annee.Enabled = True
    Form_condidat.date_reception.Enabled = True
    End If
     
    Dim n As Variant
     
    On Error GoTo Err_MAJNo
     
    If Me.resultat_test = "succes" And Not IsNull(Me.code_annee) Then
     
    Reessayer_MAJNo:
     
        n = DMax("N°", "condidat", "[resultat_test]=""succes"" and [code_annee]=" & Me.code_annee) 'trouve le dernier numéro
     
        If IsNull(n) Then
           n = 0
        End If
     
        Me.[] = n + 1 'Ajoute 1
    End If
     
    Exit_MAJNo:
    Exit Sub
     
    Err_MAJNo:
        Select Case Err.Number
           Case 3022 'Enregistrement en double
              Resume Reessayer_MAJNo
           Case Else
              MsgBox Err.Number & ", " & Err.Description, vbExclamation
              Resume Exit_MAJNo
        End Select

    puis j'ai modifié succes par 001 pour voir ce que ça donne et j'ai fait une autre tentative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Private Sub resultat_test_AfterUpdate()
    Dim n As Variant
     
    On Error GoTo Err_MAJNo
     
    If Me.resultat_test = "001" And Not IsNull(Me.code_annee) Then
     
    Reessayer_MAJNo:
     
        n = DMax("N°", "condidat", "[resultat_test]=""001"" and [code_annee]=" & Me.code_annee) 'trouve le dernier numéro
     
        If IsNull(n) Then
           n = 0
        End If
     
        Me.[] = n + 1 'Ajoute 1
    End If
     
    Exit_MAJNo:
    Exit Sub
     
    Err_MAJNo:
        Select Case Err.Number
           Case 3022 'Enregistrement en double
              Resume Reessayer_MAJNo
           Case Else
              MsgBox Err.Number & ", " & Err.Description, vbExclamation
              Resume Exit_MAJNo
        End Select
     
    End Sub

    mais dans les 2 cas il a eu une perturbation au niveau de la valeur de "n" qui ne s’incrémente pas suite à ces modifications

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    As-tu suivi l'exécution du code instruction par instruction.

    Parce-que à priori c'est correct.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Membre du Club

    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2011
    Messages : 83
    Points : 51
    Points
    51
    Billets dans le blog
    1
    Par défaut
    Bonjour,


    ESt ce que je peux t'envoyer l'application avec une petite traduction en français parce qu'il y a des champs sur la table qui sont traduit dans une autre langue

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Non désolé, je ne pourrais pas l'installer sur mon poste (politique de sécurité oblige).

    En exécutant le code pas à pas tu devrais assez vite voir ce qui ne marche pas.
    Ma solution doit être vue comme un guide, pas forcément la réponse parfaite.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PPT-2003] Modifier une image par Access
    Par Deustalos dans le forum VBA PowerPoint
    Réponses: 9
    Dernier message: 17/02/2010, 10h01
  2. [AC-2007] Modifier template du mail envoyé par Access, possible ?
    Par hayabusa63 dans le forum IHM
    Réponses: 1
    Dernier message: 01/08/2009, 18h27
  3. Réponses: 6
    Dernier message: 18/04/2009, 10h45
  4. Réponses: 1
    Dernier message: 25/04/2006, 12h03
  5. Réponses: 3
    Dernier message: 24/10/2005, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo