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

Access Discussion :

Sur quel evenement mettre Dmax?


Sujet :

Access

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 20
    Points
    20
    Par défaut Sur quel evenement mettre Dmax?
    Bonjour,

    J'ai mon formulaire principal ou j'incrémente un numéro avec la fonction DMax.
    J'ai mis cet événement sur le "before_insert".

    J'ai également un sous formulaire rattaché.

    Si deux utilisateurs créent en même temps un bon, ils ont les deux même numéros, et le dernier qui passe sur le sous formulaire se fait rejeter car il y a doublons.

    Sur quel evenement dois-je mettre mon Dmax pour que l'insertion se fasse au moment ou je rentre dans le sous formulaire?

    J'ai essayé avec "désactivé", "Sous_form_Enter", mais ca ne fonctionne pas.

    Merci de m'aider.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 44
    Points : 49
    Points
    49
    Par défaut
    Bonjour
    Si j'ai bien compris : 2 utilisateurs créent un bon qui reçoit automatiquement un numéro, ils saisissent un certain nombre d'infos sur le formulaire, passent au sous-formulaire et là un des deux se fait jeter (le plus lent) et son enregistrement ne peut pas être sauvegardé.

    Tu peux sauvegarder l'enregistrement dès que le numéro est attribué et là, si le numéro est déjà pris, un nouveau numéro est généré automatiquement à la place du message d'erreur.

    Est-ce que ça correspond ?

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    Je pourrais, mais mon problème est :
    D'autres champs sont de type obligatoire, donc si je sauvegarde, je vais me faire jetter.

    Et si l'utilisateur quitte sans avoir renseigné le sous formulaire, le n° est caduque, vu qu'aucune ligne ne correspond.

    merci

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Salut,

    Il me semble que l'évènement before Insert de ton form mets à jour ton champ numéro (avec la fonction DMax) exactement au même moment que pour un numéro auto.

    tu ne souhaite pas de numéro auto à la place ??

    Donc en résumé entre le moment 1 ou il interroge le DMax("num","maTable",..)
    et le moment 2 ou l'enrg est mis à jour le contenu de maTable à été changé par l'autre utilisateur.

    Si bien qu'au moment 1, au before insert DMax ne contient pas encore le numéro du 2ème utilisateur, mais au moment 2, au moment after insert le contenu de maTable source de ton form à changé (Matable contient le numéro du 2ème utilisateur), si bien qu'il te signal le doublon.

    Il me semble qu'il te faut décaler la mise à jour de ton champ num=DMax()+1 sur 1 afterInsert 1 beforeUpdate ou quelque chose comme ca..

    Pour être sur que le DMax reflète les dernière mise à jour..

    note que sur beforeupdate tu devras tester le mode ajout pour mettre à jour ton champ avec DMax..

    @+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    Salut,

    C'est exactement ca oui.

    J'avais essayé le numéro auto, mais le problème est qu'il se mettait dès la mise à jour d'un enregistrement, et si l'utilisateur abandonnait, le numéro suivant était décalé de un, ce qui me générait des trous dans la numérotation.

    Je viens d'essayer sur l'evenement Apres Insertion du formulaire, mais lorsque je clique dans mon sous form, il me dit qu'une clé ne peut contenir une valeur nulle.

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    et avec un refresh sur beforeupdate:

    Histoire de signaler immédiatement à l'autre utilisateur que tu as mis à jour ton champ num et la table source avec 1 nouveau numéro ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Form_BeforeInsert(Cancel As Integer)
     
    .....
     
    Me!num = DMax("[num]", "maTable") + 1
     
    Me.Refresh
     
    End Sub
    @+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    Malheureusement, ca ne marche pas non plus.

    J'ai une erreur d'execution 2115 et si je fais débogage, il me surligne Me.refresh.

  8. #8
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    c'est normal tu as mis le code sur beforeUpdate

    Hors je t'ai dit de le mettre sur beforeInsert

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Form_BeforeInsert(Cancel As Integer) 
     
    ..... 
     
    Me!num = DMax("[num]", "maTable") + 1 
     
    Me.Refresh 
     
    End Sub
    A+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    Et ca c'est quoi?
    et avec un refresh sur beforeupdate:
    Bon je viens d'essayer sur before insert, et la j'ai une erreur d'execution 3101.

  10. #10
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    autant pour moi

    ok avec l'erreur 3011:

    Le moteur de base de données Microsoft Jet ne peut pas trouver d'enregistrement dans la table '|2' avec le(s) champ(s) '|1' correspondant à la clé.


    Comme tu l'as dis

    Tu as des champs de type obligatoire, donc si tu sauvegarde (Me.refresh), tu te fais jetter.


    et sur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Form_BeforeUpdate(Cancel As Integer)
     
    .. 
    Me!num = DMax("[num]", "maTable") + 1
     
    End Sub
    sans le refresh c'était quoi le problème
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  11. #11
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    Alors avec ca, le problème est que dès que je rechange une donnée dans mon form principal, il me rechange le numéro et me rajoute 1, je tourne en rond je crois

  12. #12
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    tu n'as qu'a tester si ton num contient déja une valeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_BeforeUpdate(Cancel As Integer) 
     
       if IsNull(Me!Num) Then
       Me!num = DMax("[num]", "maTable") + 1
       End If 
     
    End Sub
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  13. #13
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    Oui mais dans ce cas je reviens au point de départ, cad si une autre personne crée unbon au même moment, un des numéros ne se mettra pas à jour.

    Encore que la c'est juste au moment de passer dans le sous-form, donc les risques sont assez minimes.

  14. #14
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir,

    As-tu essayé sur l'évènement 'sur entrée' du sous formulaire. Tu pourrais vérifier la saisie des champs obligatoire, puis créer le numéro et Refreh dans la foulée ou, si les champs oblig ne sont pas renseignés, sortir du Sf et revenir sur les contrôles correspondants.

    pgz
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  15. #15
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    J'avais essayé en effet sur l'evenement "en entrée" du sous form, mais j'ai un message disant qu'un enregistrement obligatoire n'est pas renseigné...

  16. #16
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Tu peux aussi revenir au code de départ:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_BeforeInsert(Cancel As Integer) 
     
    ..... 
     
    Me!num = DMax("[num]", "maTable") + 1 
     
    End Sub
    et récupérer l'erreur en cas de doublon quand tu passe au sousform:
    sur l'évenement error de ton form:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Form_Error(DataErr As Integer, Response As Integer)
     
        If DataErr = 3022 Then 'erreur doublon
        Response = acDataErrContinue
        Me!num = DMax("[num]", "maTable") + 1  'recalcule le Me!num
     
        End If
     
     
    End Sub
    Sinon désolé j'ai fait ce que j'ai pu pour t'aider !
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  17. #17
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Alors, tu peux essayer de masquer le SF au départ et de mettre un bouton pour le démasquer, en prenant soin de créer l'enregistrement avant.

    C'est pas terrible, mais peut-être mieux que rien...

    pgz
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  18. #18
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    User : je vais essayer ta méthode.

    Pgz : j'y avais pensé en effet à masquer le sous form. Je trouvais pas cette solution terrible, j'essaie la soluce de User et si ca marche pas je ferais peut etre ca.

    Merci en tout cas

  19. #19
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 20
    Points
    20
    Par défaut
    Bon je viens de tester, la soluce de User fonctionne.

    Merci de votre aide.

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

Discussions similaires

  1. Sur quel champ mettre la clé ?
    Par christy1 dans le forum Access
    Réponses: 1
    Dernier message: 07/12/2011, 22h22
  2. Dans quel evenement doit-je mettre le code ?
    Par BERRACHED SAID dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/05/2010, 20h56
  3. Sur quel Evenement mettre mon "rappel"
    Par Orakle dans le forum VBA Access
    Réponses: 4
    Dernier message: 23/05/2008, 09h31
  4. Savoir sur quel boutton on a cliqué ...
    Par Fofone dans le forum Composants VCL
    Réponses: 8
    Dernier message: 10/03/2003, 16h12

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