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 :

Conflit d'utilisateur et RecordSet [AC-2003]


Sujet :

IHM

  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 76
    Points : 88
    Points
    88
    Par défaut Conflit d'utilisateur et RecordSet
    Bonjour,

    Je developpe actuellement un petit projet sous Access pour gérer et calculer des primes de déplacement.

    Le calcul de la prime n'est pas très compliqué et se fait sous certaines conditions (cas différent si c'est un dimanche et différencier si le déplacement à lieu à l'étranger ou non).
    De plus, la prime se calcul par jour et selon les conditions rencontrés par l'employé en déplacement.

    J'ai créer mes tables, les relations et les requètes sans problèmes. J'ai entamé la création d'un formulaire qui me permettrait de saisir les informations concernant un déplacement et un sous formulaire affichant les données relatives aux jours du déplacement.

    Formulaire en "Mode Formulaire"


    Formulaire en "Mode Création"



    Comme on peut le voir en mode Création. L'ajout de Jour se fait de manière dynamique dans la partie "Détail" (étant donné que les déplacements ont rarement lâ même durée.) Et donc pour faire le calcul de la Prime sans que celles ci ne soit mélangé entre les différents enregistrement, j'utilise un RecordSet dans une fonction VBA.

    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
    Function PrimeC() As Double
     
    Dim Base, Calcul As Double
    Dim D As DAO.Recordset
    Dim myDB As Database
    Dim Nya As Integer
     
    Nya = IdJour
     
    Set myDB = CurrentDb
    Set D = myDB.OpenRecordset("Req_Jour3", DB_OPEN_DYNASET)
     
    Base = 70
     
    D.MoveFirst
     
    Do Until (D.EOF)
        If (D!IdJour = Nya) Then
            If (Dimanche = 0) Then
                    Calcul = Base + TauxZone + TauxCond + TauxDiffVie
                    D.Edit
                    D!Prime = Calcul
                    D.Update
                    PrimeC = D!Prime
            End If
            If (Dimanche = -1) Then
                    Calcul = D![TauxH] * NbHeure
                    D.Edit
                    D!Prime = Calcul
                    D.Update
                    PrimeC = D!Prime
            End If
        End If
    D.MoveNext
    Loop
     
    D.Close
     
    If (IsNull(PrimeC)) Then
        PrimeC = 0
    End If
     
    End Function
    Seulement, ce recordset reprend la requête de mon sous formulaire et en modifie les données.
    J'ai donc le droit à un message d'avertissement qui me previent qu'il y a conflit d'utilisateur.



    Je sais que l'erreur vient du fait que je modifie mes données à l'aide du RecordSet. Mon problème, c'est que je n'ai pas trouvé d'alternative aussi performante que le recordset. En effet, quand je passe par les champs de mon sous formulaire, étant donné que ceci se dupplique, il y a des gros caffouillages de données et je me retrouve avec des primes érronées et en plus aux mauvais endroits.

    Voilà, j'ai essayé d'être aussi claire, concice et précise que possible.

    Maintenant, comment pallier ce problème ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Bonjour

    Je n'ai pas trouvé où été appelée la fonction PrimeC

    L'idéal serait de sauvegarder l'enregistrement avant d'appeler la fonction, mais est-ce possible ?

  3. #3
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 76
    Points : 88
    Points
    88
    Par défaut
    PrimeC est une fonction appelée par PrimeF et PrimeE (qui gèrent les cases de prime étranger et france)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function PrimeF() As Double
     
    If (IdZone = 1) Then
    PrimeF = PrimeC
    End If
    If (IdZone <> 1) Then
    PrimeF = 0
    End If
     
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function PrimeE() As Double
     
    If (IdZone <> 1) Then
    PrimeE = PrimeC
    End If
    If (IdZone = 1) Then
    PrimeE = 0
    End If
     
    End Function
    J'ai essayé de mettre en place un enregistrement automatique (du formulaire, du sous formulaire ou de la requête) avec des before et des afterupdate dés qu'une modification à lieu.
    Et j'ai toujours le message d'erreur de conflit d'utilisateur qui revient.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    J'ai essayé de mettre en place un enregistrement automatique (du formulaire, du sous formulaire ou de la requête) avec des before et des afterupdate dés qu'une modification à lieu.
    Et j'ai toujours le message d'erreur de conflit d'utilisateur qui revient.
    ce qui est normal, puisque les fonctions sont attachées à la propriété Source Control.

    Je pense qu'il faut dissocier les calculs et la mise à jour de l'enregistrement.
    Je m'explique :
    - les fonctions devraient se contenter de faire les calculs (plus de recordset)
    - il faut trouver le moyen de mettre à jour l'enregistrement avec les valeurs calculées (peut être sur l'événement Après MAJ du formulaire)

  5. #5
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 76
    Points : 88
    Points
    88
    Par défaut
    C'est ce que j'avais tenté de faire au début : ne pas utiliser de RecordSet.

    Seulement étant donnée que les zones de textes se dupliquent, cela donne très rapidement quelque chose de très sale.

    Les mauvaises valeurs vont dans les mauvaises zones des texte et ça se propagent sur toutes les primes du voyage affiché par le formulaire.

    EDIT :

    En tentant ce que tu me conseilles :

    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
    Function PrimeF() As Double
     
    If (IdZone = 1) Then
        If (Dimanche = 0) Then
            PrimeF = Base + TauxZone + TauxCond + TauxDiffVie
        End If
        If (Dimanche = -1) Then
            PrimeF = TauxH * NbHeure
        End If
    End If
    If (IdZone <> 1) Then
        PrimeF = 0
    End If
     
    End Function
    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
    Function PrimeE() As Double
     
    If (IdZone <> 1) Then
        If (Dimanche = 0) Then
            PrimeE = Base + TauxZone + TauxCond + TauxDiffVie
        End If
        If (Dimanche = -1) Then
            PrimeE = TauxH * NbHeure
        End If
    End If
    If (IdZone = 1) Then
        PrimeE = 0
    End If
     
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Texte27_AfterUpdate()
     
    If (Texte27 <> 0) Then
    Prime = Texte27
    End If
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Texte28_AfterUpdate()
     
    If (Texte28 <> 0) Then
    Prime = Texte28
    End If
     
    End Sub
    Ca reste propre, les valeurs ne se mélangent pas mais la table n'est pas mise à jour. Donc j'en déduis que mes Sub After_Update ne sont pas correctes.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Bonjour
    J'aurai plutot mis cette mise à jour sur la propriété Avant MAJ du formulaire.
    Tout simplement parce que comme les zones Texte27 et Texte28 sont calculées et non saisies, l'événement MAJ ne se déclenche pas.

  7. #7
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 76
    Points : 88
    Points
    88
    Par défaut
    Quand tu parles du formulaire ? C'est du formulaire ou du sous-formulaire ?^^

    En attendant, voilà le code établi pour le Before Update :

    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
    Private Sub Form_BeforeUpdate(Cancel As Integer)
     
    If (Texte27 <> 0) Then
    Prime = Texte27
    End If
     
    If (Texte28 <> 0) Then
    Prime = Texte27
    End If
     
    If (Texte28 = 0) Then
        If (Texte27 = 0) Then
            Prime = 0
        End If
    End If
     
    End Sub

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Bonjour
    D'après les miniatures d'un des POST, je dirais le sous-formulaire.

  9. #9
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 76
    Points : 88
    Points
    88
    Par défaut
    C'est ce que je me suis dit finalement après coup.

    Alors je viens de tester avec le code que j'ai mis dans mon précédent post et donc la mise à jour s'effectue que lorsque la ligne qui est modifiée et que l'on passe sur une autre ligne.

    Plus de caffouillage de données et encore moins de message de conflit d'utilisateur !

    Un grand merci, Fgiambelluco, pour m'avoir dépanné sur ce coup. Sans toi, je pense que j'aurais lutté encore quelques jours dessus.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/07/2012, 18h04
  2. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 12h27
  3. [ADO] Sauvegarde / lecture de recordset
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 20/09/2002, 16h54
  4. Réponses: 8
    Dernier message: 05/06/2002, 11h55
  5. [Kylix] Sauvegarde de donnée utilisateur....
    Par Eclypse dans le forum EDI
    Réponses: 1
    Dernier message: 11/05/2002, 17h21

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