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 :

Access ne passe pas à un nouvel enregistrement [AC-2007]


Sujet :

Access

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Access ne passe pas à un nouvel enregistrement
    Bonjour à tous,


    d'abord merci pour ce forum tellement bien fourni, où je trouve en général réponse à chacune de mes questions ! Merci également pour le temps que vous prendrez pour répondre à ma question.


    J'ai créé une application permettant la gestion de factures. Pour faire simple, lorsqu'un utilisateur reçoit une facture papier, il encode les différentes données et les montants dans l'application. Pour ce faire, l'utilisateur se loggue et clique alors dans le menu pour attérir sur le formulaire d'encodage, qui contient un sous-formulaire.

    Lors du login, l'ID de l'utilisateur et le département auquel il appartient sont enregistrés. Lorsqu'il ouvre le formulaire d'encodage, son ID y est transmis. Voici le 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
    Private Sub B_Facture_Click()
    Dim user As String
    Dim id As Integer
    Dim base As DAO.Database
    Dim rec As DAO.Recordset
     
     
     
        user = Forms("frm_Connex").txt_user.Value
     
        Set base = CurrentDb
        Set rec = base.OpenRecordset("SELECT * FROM CODING_SHEET_UTILISATEUR WHERE CODING_SHEET_UTILISATEUR.UTIL_USER = '" & user & "'")
        id = rec("UTIL_ID")
     
        DoCmd.OpenForm "frm_encodage", , , , acFormAdd, , id
     
        Set rec = Nothing
        base.Close
     
    End Sub

    Sur l'évènement "On Load", j'ai alors créé le code suivant :

    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
    Private Sub Form_Load()
    Dim entite
    Call Positionner(Me)
    Me.ShortcutMenu = False
     
    entite = DLookup("[TENT_TRIGRAMME]", "CODING_SHEET_TYPE_ENTITE", "[TENT_ID] = " & Forms("frm_connex").txt_entite.Value & "")
     
     
        If IsNull(Me.OpenArgs) Then ' cette procédure est appelée lorsqu'on charge un document à partir d'un formulaire de recherche
     
            ' rien à faire
        Else ' cette procédure est appelée lorsqu'on crée un nouveau document
            DoCmd.GoToRecord , , acNewRec
     
            initialiser
        End If
    La procédure "initialiser" dans le code précédent permet de remplir les différentes combobox sur base du département et de l'ID de l'utilisateur. Dans cette fonction se trouve également le code " DoCmd.RunCommand acCmdSaveRecord" pour sauver automatiquement l'enregistrement lorsqu'il est créé.


    Mon problème est le suivant. De manière totalement aléatoire, il arrive que lors de l'ouverture du formulaire, c'est le DERNIER ENREGISTREMENT qui apparaît à l'écran.

    Je dispose d'un bouton permettant de passer à un nouvel enregistrement, et en cliquant dessus, là aussi, Access crée bien un nouvel enregistrement, mais il n'y passe pas, il reste sur celui qui est affiché !

    En cherchant la cause de ceci, j'ai remarqué qu'Access crée bien un enregistrement (je le vois dans la table), mais il se repositionne sur un autre !

    Alors en parcourant ce forum (et d'autres), j'ai trouvé des pistes comme :
    - le recordset est en read-only ==> ce n'est pas le cas
    - le champ contenant l'id de la facture est "locked" ==> ce n'est pas le cas
    - il y a un group by dans le recordset du formulaire ==> ce n'est pas le cas
    - la db est en read-only ==> ce n'est pas le cas
    - mettre "doevents" après le gotonext ==> ça ne change rien


    Je ne comprends vraiment pas d'où vient le problème, surtout que, comme dit plus haut, il arrive de manière TOTALEMENT ALEATOIRE (ou en tout cas, je n'ai encore trouvé aucune logique à la survenance du problème).

    Je vous remercie d'avance pour votre aide.

    Baudouin


    Edit : Après d'autres tests, je remarque qu'en cliquant plusieurs fois sur le bouton pour passer à l'enregistrement suivant, Access finit bien par me fait parvenir à un enregistrement vierge. Ce qui me fait m'arracher encore plus les cheveux..

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 808
    Points
    23 808
    Par défaut
    Que fais la procédure Initialiser ?

    Est-ce qu'elle manipule les enregistrements ?

    A+

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonjour, et merci pour votre réponse !

    La procédure Initialiser remplit deux champs, et crée le recordset des ComboBox, voici son 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
    Private Function initialiser()
    Dim user
    Dim rec as DAO.Recordset
    Dim base as DAO.Database
    Dim id
     
        user = Forms("frm_connex").txt_user.Value
     
     
        Set base = CurrentDb
        Set rec = base.OpenRecordset("SELECT * FROM CODING_SHEET_UTILISATEUR WHERE CODING_SHEET_UTILISATEUR.UTIL_USER = '" & user & "'")
        id = rec("UTIL_ID")
     
        Me.txt_util_id = id
     
        Me.cmb_invoice_handler.RowSource = " SELECT CODING_SHEET_UTILISATEUR.UTIL_ALIAS FROM CODING_SHEET_UTILISATEUR WHERE (((CODING_SHEET_UTILISATEUR.UTIL_ID)=" & id & ")); "
        Me.cmb_invoice_handler.Value = Me.cmb_invoice_handler.ItemData(0)
     
        Me.cmb_type_doc.RowSource = " SELECT CODING_SHEET_TYPE_FACT.TFACT_ID, CODING_SHEET_TYPE_FACT.TFACT_TYPE FROM CODING_SHEET_TYPE_FACT WHERE CODING_SHEET_TYPE_FACT.TFACT_ENTITE_ID = " & [Forms]![frm_Connex]![txt_entite] & " ORDER BY CODING_SHEET_TYPE_FACT.TFACT_ID; "
        Me.cmb_type_doc.Value = Me.cmb_type_doc.ItemData(0)
     
        If Me.cmb_contrepartie.Visible = True Then
            Me.cmb_contrepartie.RowSource = " SELECT CODING_SHEET_TYPE_CONTREPARTIE.TCONT_ID, CODING_SHEET_TYPE_CONTREPARTIE.TCONT_NOM, CODING_SHEET_TYPE_CONTREPARTIE.TCONT_FLAG, CODING_SHEET_TYPE_CONTREPARTIE.TCONT_ENTITE_ID FROM CODING_SHEET_TYPE_CONTREPARTIE WHERE (((CODING_SHEET_TYPE_CONTREPARTIE.TCONT_FLAG)=1) And ((CODING_SHEET_TYPE_CONTREPARTIE.TCONT_ENTITE_ID)= " & Forms!frm_Connex!txt_entite & ")) ORDER BY CODING_SHEET_TYPE_CONTREPARTIE.TCONT_NOM; "
        End If
     
        If Me.cmb_fact_description2.Visible = True Then
            Me.cmb_fact_description2.RowSource = "SELECT CODING_SHEET_TYPE_LIBELLE.TLIB_ID, CODING_SHEET_TYPE_LIBELLE.TLIB_LIBELLE, CODING_SHEET_TYPE_CONTREPARTIE.TCONT_ID FROM CODING_SHEET_TYPE_LIBELLE INNER JOIN (CODING_SHEET_TYPE_CONTREPARTIE INNER JOIN CODING_SHEET_LINK_CONTREPARTIE_LIB ON CODING_SHEET_TYPE_CONTREPARTIE.TCONT_ID=CODING_SHEET_LINK_CONTREPARTIE_LIB.LCL_CONTREPARTIE_ID) ON CODING_SHEET_TYPE_LIBELLE.TLIB_ID=CODING_SHEET_LINK_CONTREPARTIE_LIB.LCL_LIBELLE_ID WHERE (((CODING_SHEET_TYPE_CONTREPARTIE.TCONT_ID)= " & [Forms]![frm_encodage]![cmb_contrepartie] & ")); "
        End If
     
        Me.SF_LIGNE.Enabled = True
        Me.txt_valid.Value = 0
        Set rec = Nothing
        base.Close
     
        DoCmd.RunCommand acCmdSaveRecord
    Ce n'est sans doute pas très propre, mais voici l'utilité de cette fonction :
    ==> Je remplis les Combobox via VBA pour alléger l'ouverture du formulaire
    ==> Je met le code 0 pour la zone de texte "txt_valid", qui est un contrôle permettant de verrouiller tous les champs une fois que l'utilisateur juge que l'encodage est correct (le champ passe alors à 1 et une procédure de protection est appelée)
    ==> je mets le sous-formulaire en "enabled", car pour certains types d'encodage, il se trouve "disabled"
    ==> je sauve l'enregistrement en cours avec les quelques données qui y sont remplies dès l'ouverture du formulaire

    Cette procédure est également appelée lorsque je passe à un nouvel enregistrement.

    Donc en effet, deux champs sont réellement remplis par cette fonction, et d'autres ont leur recordset rempli.

    Bien à vous,

    Baudouin

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Pour de nouveaux tests, j'ai mis en commentaire les invocations des fonctions "initialiser" et "protection", le problème se pose toujours malgré cela.

    Serait-il possible que ce soit lié au sous-formulaire? Qu'il rappelle de temps à autre un enregistrement précédent?

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 808
    Points
    23 808
    Par défaut
    Aucune idée dans l'immédiat.

    Ce qui est intriguant c'est la nature aléatoire de la panne.

    A+

  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    En effet, le côté apparemment aléatoire rend le problème assez difficile à cibler..

    Je vais tester une autre façon de faire, et j'ai créé un autre sujet du coup. Je laisse celui-ci ouvert au cas où je trouve ce qui cloche, ça peut toujours aider quelqu'un d'autre !

  7. #7
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 77
    Points : 86
    Points
    86
    Par défaut
    Alors pas d'idée précise sur le probleme, mais un piste peut etre


    Dans ton Form_Load la condition est :
    IsNull(Me.OpenArgs)

    Donc a tester plusieurs fois voir si dans le cas ou tu as ton problème aléatoire, ton openArgs est surement null du coup il ne te positionne pas sur un nouvel enregistrement.
    Si c'est le cas il faut determiner pourquoi il reste null dans certains cas

  8. #8
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonjour Sandrine,

    merci pour ton aide !

    En invoquant le formuaire via le menu, le code renvoie toujours "false" sur "isnull(me.openargs)", car je lui envoie d'office l'ID de la personne qui désire encoder.

    Ceci est "true" uniquement si l'utilisateur a ouvert le formulaire en spécifiant un numéro d'enregistrement, ce qui n'est le cas que via le formulaire de recherche.

    Baudouin

  9. #9
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    je n'ai pas compris réellement ce qui se passait, mais il semblerait que Access dupliquait l'enregistrement au lieu d'en créer un nouveau.

    J'ai résolu ceci en insérant un nouveau champ dans la base de données qui reçoit comme valeur "now()" lorsqu'un enregistrement est créé. De cette façon, je suis certain qu'au moins un champ dans l'enregistrement est différent du précédent, et Access passe bien au nouvel enregistrement du coup.

    Je vous remercie pour vos réponses !

    Baudouin

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

Discussions similaires

  1. [AC-2003] La zone de liste ne restitue pas le nouvel enregistrement
    Par doncamelo dans le forum IHM
    Réponses: 4
    Dernier message: 20/02/2011, 22h32
  2. Réponses: 2
    Dernier message: 08/10/2008, 15h29
  3. Ne pas afficher "Nouvel Enregistrement"
    Par Keuf95 dans le forum Access
    Réponses: 1
    Dernier message: 29/07/2006, 01h37
  4. Réponses: 1
    Dernier message: 13/06/2006, 09h23
  5. ADO et access, ça passe pas.
    Par maximdus dans le forum Bases de données
    Réponses: 4
    Dernier message: 19/09/2005, 22h38

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