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 :

[Formulaire] Comment créer des champs correspondant à un critère d'un autre champ? [AC-2003]


Sujet :

IHM

  1. #21
    Membre habitué
    Inscrit en
    Juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    Merci de ta réponse.

    J'ai testé mais le problème ne change pas.
    Il y a toujours les enregistrements fantômes... Qu'est-ce qui provoque ça?

  2. #22
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par buzz73 Voir le message
    Il y a toujours les enregistrements fantômes... Qu'est-ce qui provoque ça?
    As-tu commencé par "nettoyer" la table T_Prevision en effaçant les lignes fantômes ?

    Les fantômes apparaissent parce que le moteur de base de données Jet est très serviable (trop serviable ?) mais n'a pas les moyens de rendre un service correct.

    Jet détecte que la requête sous-jacente est une requête basée sur des jointures externes, sans enregistrement du côté de la table T_Prevision.
    Quand tu veux modifier une ligne du formulaire (donc du jeu de données de la requête sous-jacente), "automatiquement" Jet essaye alors d'ajouter des enregistrements du côté T_Prevision.

    Mais comme la requête ne ramène pas le champ T_Prevision.ID_Article, alors Jet ne peut pas le renseigner, donc le laisse vide, d'où le fantôme.

    En espérant avoir été clair...

    Citation Envoyé par =JBO= Voir le message
    Il s'agirait de créer les 12 enregistrements de T_Previsions quand on se positionne sur une ligne d'un article sans prévisionnel.
    Et c'est tout.
    Il ne faut plus utiliser les procédure événementielles Form_BeforeUpdate et Form_AfterUpdate.
    Veille à les supprimer pour éviter des erreurs.

  3. #23
    Membre habitué
    Inscrit en
    Juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    J'ai supprimé systématiquement les enregistrements fantômes, mis la procédure sur FormCurrent et supprimé les autres procédures.
    Le problème persiste.

    Y a-t-il un moyen de gérer les nouveaux enregistrements que fait Access?
    De cette façon on pourrait vérifier que la clé est bonne sinon lui interdire de faire l'enregistrement?
    Est-ce la bonne façon de voir les choses?

    J'ai aussi penser à supprimer par VBA les enregistrements où l'ID_Article est null mais cela implique que je supprime au préalable ma clé primaire pour permettre les enregistrements avec ID_Article null.
    Le problème c'est que je perds du même coup l'intégrité de ma base.

    Donc si je n'arrive pas à créer ces enregistrements fantômes (c'est dommage j'aime bien le principe, ça semble "propre"), je vais devoir peut-être regarder les contrôles inrépendants (mais je ne sais pas faire...)

  4. #24
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Effectivement, pour que tout fonctionne correctement, il faudrait que dans le Form_Current() on utilise un Me.Requery au lieu de Me.Refresh.
    Mais cela repositionne le formulaire sur le premier enregistrement. Voilà encore un autre problème...

    Alors aux grands maux les grands remèdes !
    Comme tu le suggères, on peut agir au moment de la modification des données.
    Voilà ce que je te propose, pièce jointe à l'appui.

    (1) Créer une requête qui récupère tous les champs qui doivent être renseignés pour éviter les soucis de fantômes:
    ID_Article, ID_Enseigne, Mois en plus de Quantite.
    Code VBA : 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
    Public Sub CréerReqPrévisions()
        Dim oDB As DAO.Database, oQD As DAO.QueryDef
        Dim i As Integer
        Dim sChamps As String, sFrom As String
        Dim sGauche As String, sDroite As String
        Dim SQL As String
     
        Set oDB = CurrentDb
     
        On Error Resume Next
        oDB.QueryDefs.Delete "R_Prev"
     
        On Error GoTo 0
     
        sChamps = "T_Article.ID_Article, T_Article.Prix"
        sFrom = "T_Article"
        sGauche = ""
        sDroite = ""
     
        For i = 1 To 12
            sChamps = sChamps & _
                    ", T_Prevision_" & i & ".ID_Article" & _
                    ", T_Prevision_" & i & ".ID_Enseigne" & _
                    ", T_Prevision_" & i & ".Mois" & _
                    ", T_Prevision_" & i & ".Quantite AS Qte_" & i
     
            sFrom = sGauche & sFrom & sDroite & _
                    " LEFT JOIN (SELECT * FROM T_Prevision WHERE Mois=" & i & ") AS T_Prevision_" & i & _
                    " ON T_Article.ID_Article = T_Prevision_" & i & ".ID_Article"
            sGauche = "("
            sDroite = ") "
        Next i
     
        SQL = "SELECT " & sChamps & " FROM " & sFrom
     
        Set oQD = oDB.CreateQueryDef("R_Prev", SQL)
     
        Application.RefreshDatabaseWindow
     
    End Sub

    (2) Dans le formulaire, réagir à l'événement Si modification pour renseigner correctement toutes les données clés du Recordset sous-jacent au formulaire.

    Code VBA : 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_Dirty(Cancel As Integer)
        Dim i As Integer
        Dim oRS As DAO.Recordset
     
        If DCount("*", "T_Prevision", "ID_Article='" & Me.ID_Article & "'") < 12 Then
            Set oRS = Me.Recordset
            For i = 1 To 12
                oRS.Edit
                oRS.Fields("T_Prevision_" & i & ".ID_Article") = Me.ID_Article
                ' /!\ à compléter
                ' oRS.Fields("T_Prevision_" & i & ".ID_Enseigne") = < ??? >
                oRS.Fields("T_Prevision_" & i & ".Mois") = i
                oRS.Update
            Next i
        End If
     
    End Sub
    Fichiers attachés Fichiers attachés

  5. #25
    Membre habitué
    Inscrit en
    Juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    ça marche impeccable.

    J'ai adapté le code à ma base de donnée et tout fonctionne (j'avais une erreur qui m'a pris pas mal de temps avant de la solutionner).

    Maintenant, je vais essayer de gérer mes articles en fonction de l'enseigne (liste déroulante dans l'en-tête du formulaire).
    Merci!

  6. #26
    Membre habitué
    Inscrit en
    Juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    Bonjour,

    La solution marche très bien.
    J'ai donc tenté d'aller plus loin et j'ai donc un complément de question.

    Maintenant, j'ai aussi des quantités promotionnelles qui sont calculées dans la requête R_Promo.
    J'aimerai les afficher pour chacun des mois.

    J'étais passé, dans un premier temps, par des formules DSUM mais le temps d'exécution a explosé à cause du nombre.
    Donc comment puis-je les relier cette requête à la requête R_Prev créé précédemment.

    Les champs de la requête R_Promo sont :
    • ID_Article
    • ID_Enseigne
    • Mois
    • QtePromo


    Peut-on intégrer le champ QtePromo dans les "petites tables temporaires" créées (donc par mois) ? Au fait comment appelle-t-on ces tables temporaires?
    QtePromo ne dois pas pouvoir être modifié (je verrouille donc sur le formulaire).

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [AC-2007] Comment créer des champs et sous-champs déroulants?
    Par Fibule dans le forum Access
    Réponses: 5
    Dernier message: 15/07/2014, 06h29
  2. Réponses: 2
    Dernier message: 08/06/2014, 21h48
  3. [AC-2010] Comment créer des formulaires et boutons dans un programme Access ?
    Par psycho59179 dans le forum IHM
    Réponses: 5
    Dernier message: 22/05/2013, 16h13
  4. [AC-2003] Comment créer des champs nommés dynamiquement
    Par franz.moraine dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/07/2012, 14h35
  5. Réponses: 1
    Dernier message: 04/10/2006, 14h21

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