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

VBA Access Discussion :

Dlookup sur sous-formulaire avec critère sur formulaire principal [AC-2003]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut Dlookup sur sous-formulaire avec critère sur formulaire principal
    Bonjour,

    J'utilise la fonction Dlookup sur l'évenement AVANT MAJ d'un contrôle sur un sous-formulaire. J'ai 2 critère à appliquer, l'un à partir d'un contrôle du sous-formulaire en lui-même et l'autre à partir d'un contrôle du formulaire principal.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = DLookup("QteBUStock", "ReqVolumeEtMontantTotalBU", "[NProduit] =" & Me![NProduit] And "[BU] =" & Forms![FrmSortie]![BU])
    Le premier critère fonctionne (je l'ai testé tout seul) en revanche je n'arrive pas à exprimer le second qui doit aller chercher une valeur du formulaire principal.

    J'ai testé plusieurs syntaxe sans résultats, la dernière en question (dans le code ci-dessus) me donne une erreur "incompatibilité de type.

    Quel est la bonne syntaxe à appliquer pour chercher un contrôle du formulaire principal depuis son sous-formulaire?

    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 357
    Points : 355
    Points
    355
    Par défaut
    Bonjour,

    BU ne serait-il pas de type texte par hasard ?

    si c'est le cas, il faut mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "[BU] ='" & Forms![FrmSortie]![BU] & "'")

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    Effectivement BU est de type texte...

    J'ai changé le code par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = DLookup("QteBUStock", "ReqCalculStockEtLocauxBU", "[NProduit] =" & Me![NProduit] And "[BU] ='" & Forms![FrmSortie]!BU & "'")
    Mais j'ai toujours cette erreur d'incompatibilité de type.

    J'ai fait quelques tests, si je retire le critère sur le N°Produit le code s'execute sans s'arrêter mais avec les 2 critères de nouveau l'erreur.

    Qq précisions sur le contexte : l'entreprise est divisée en plusieurs parties (BU) qui ont chacune leurs produits, ainsi le produit n°1 peut avoir x quantité dans le BU n°1 et xx quantité dans le BU n°2.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 357
    Points : 355
    Points
    355
    Par défaut
    peut-on voir le sql de la requete ReqCalculStockEtLocauxBU SVp ?

    ET en mettant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ?DLookup("QteBUStock", "ReqCalculStockEtLocauxBU", "[NProduit] =" & Me![NProduit] And "[BU] ='" & Forms![FrmSortie]!BU & "'")
    dans la fenetre d'execution et en remplacant les me. par une valeur y a t-il toujours l'erreur ?

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT pl.NProduit, pl.BU, Sum(Nz(pl.QteBULocaux,0)-Nz(ps.QteBUStock)) AS QteBULocaux, Nz(ps.QteBUStock,0) AS QteBUStock
    FROM ReqEntreeMoinsSortieBULocaux AS pl LEFT JOIN ReqEntreeMoinsSortieBUStock AS ps ON (pl.NProduit=ps.NProduit) AND (pl.BU=ps.BU)
    GROUP BY pl.NProduit, pl.BU, ps.QteBUStock;

    Voilà le code sql de la requete , elle même basée sur une autre requete car j'ai plusieurs lieu de stock et plusieurs BU qui doivent chacun avoir leurs produits.

    Qu'entends tu par remplacer le me par une valeur? Du type SsFrmSortieDetail.NProduit ?

    J'ai testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms![SsFrmSortieDetail]![NProduit]
    Mais l'erreur est maintenant qu'il ne trouve pas le formulaire en question

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 357
    Points : 355
    Points
    355
    Par défaut
    Attends, je viens de faire fumer mon neurone unique et la réponse m'est apparue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DLookup("QteBUStock", "ReqCalculStockEtLocauxBU", "[NProduit] =" & Me![NProduit] & " And [BU] ='" & Forms![FrmSortie]!BU & "'")
    Là je pense que ca va mieux marcher

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    Effectivement le code ne fait plus d'erreur grâce à ton neurone (tu le remerciera de ma part d'ailleurs, il me dépanne bien vu que le mien est en vacances à priori !!)

    Mais cela a soulevé plusieurs problèmes, voici tout d'abord le code complet :

    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
    Private Sub QteSortie_BeforeUpdate(Cancel As Integer)
     
    Dim strMsg As String, strTitre As String
    Dim intStyle As Integer
     
    If Forms![FrmSortie]!LieuS = "Stock" Then
     
        a = DLookup("QteBUStock", "ReqCalculStockEtLocauxBU", "[NProduit] =" & Me![NProduit] & " And [BU] ='" & Forms![FrmSortie]!BU & "'")
     
        If Me!QteSortie > a Then
     
            strMsg = "Erreur Quantité sortie supérieur au stock disponible."
            intStyle = vbOKOnly
            strTitre = "Erreur Quantité"
            MsgBox strMsg, intStyle, strTitre
            Cancel = True
     
        End If
     
    End If
     
    End Sub
    1er problème : si la quantité sortie est supérieure au stock disponible ma msgbox ne s'affiche pas.

    2eme problème (le gros) : pour voir pourquoi le message d'erreur ne s'affichait pas j'ai rajouter un "msgbox a" pour voir la valeur relevé par le dlookup.

    Et là, c'est le drame ! Lors de la 1ere saisie des quantités à sortir la valeur relevé par le dlookup est bien la bonne (je ne sais donc toujours pas pourquoi pas de message erreur si je sort une quantité supérieure).

    Mais si l'on modifie la valeur rentrée précédemment sur le même formulaire (ex je met qtité sortie = 2 je passe à un autre contrôle , puis je remet le contrôle sur cette quantité et je met 3) la valeur du dlookup a changée...à priori le 2 a déja été enregistré dans la table alors que le formulaire est resté ouvert!

    Comment faire pour contourner ces problèmes?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 357
    Points : 355
    Points
    355
    Par défaut
    Bonjour,

    Pour ton plus gros probleme, je pense qu'il faut que tu fasses un

    ou un Tu peux aussi essayer de stocker ta qte sortie dans une variable et l'afficher (tu peux aussi te servir de (cf l'aide)

    Essaie de passer le code en pas à pas en mettant des espions (selection de la variable clic droit et ajouter un espion.

  9. #9
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    J'ai travaillé un peu sur le code voir où pouvait se situer le problème. En fin de compte mon problème de valeur enregistrées alors qu'elle ne sont pas validées vient simplement du test que j'avais effectué (ajout de "msgbox a") pour voir si le dlookup fonctionnait, le formulaire s'enregistre en réalité lorsque je clic sur ok sur ma msgbox.

    Mon seul problème est donc le fait que le test de la valeur rentrée par rapport à celle relevée par le dlookup ne fonctionne pas.

    Pourtant le code est sans erreur à l'éxécution et le dlookup remonte bien la bonne valeur...

    J'ai fait un dernier test en changeant simplement le dlookup. Fondé sur une autre requete et avec un seul critère là ça fonctionne...

    Si quelqu'un avait une idée pour faire fonctionner ce test ça me rendrait un énorme service parceque là je dois bien avouer que je sèche dps quelques jours maintenant

    Voici le dernier 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
    Private Sub QteSortie_BeforeUpdate(Cancel As Integer)
     
    Dim strMsg As String, strTitre As String
    Dim intStyle As Integer
     
    If Forms![FrmSortie]!LieuS = "Stock" Then
     
        a = DLookup("QteBUStock", "ReqCalculStockEtLocauxBU", "[NProduit] =" & Me![NProduit] & " And [BU] ='" & Forms![FrmSortie]!BU & "'")
     
     
        If Me!QteSortie > a Then
     
            strMsg = "Erreur Quantité sortie supérieur au stock disponible."
            intStyle = vbOKOnly
            strTitre = "Erreur Quantité"
            MsgBox strMsg, intStyle, strTitre
            Cancel = True
     
        End If
    End If
    End Sub
    Merci d'avance

    PS : on a écrit nos messages en même temps, où placer le me.recalc ? Sur l'évènement afterupdate ?

  10. #10
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    Grâce aux espions j'ai résolu le problème du test. Il ne s'effectuait pas car avec les 2 critères, "a" sortait comme un string donc pas comparable avec un int.

    En rajoutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Me.QteSortie > Int(a) Then
    le test s'effectue bien.

    Reste l'autre problème, si je met une quantité à sortir que je change par le suite, la 1ère valeure a déjà été enregistrée...

    Comment annuler la 1ère valeure saisie?

  11. #11
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    Ça avance! J'ai résolu également le problème d'enregistrement des données. Pour ceux que ça pourrait éventuellement intéresser, je suis passé par une requête de MAJ qui,en cas de modification, passe la quantité précédemment enregistrée à 0 avant d'enregistrer la nouvelle valeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If Not IsNull(Me![NSortie]) Then
     
        sql = "UPDATE SortieDetail SET [QteSortie] = 0 WHERE [NSortie] = " & Me![NSortie] & ";"
        DoCmd.RunSQL (sql)
     
    End If
    Dernier problème (petit cette fois!) : lorsque je modifie une valeure et que la requete de MAJ s'execute la fenêtre suivant apparait :

    "Conflit d'écriture : Cet enregistrement a été modifié par un autre utilisateur depuis que vous avez commencé à le modifier. Si vous enregistrez vos modifications vous remplacerez celles effectuées par l'autre utilisateur (etc....)"

    Avec 3 boutons : "Sauvegarder enregistrement" "Copier dans presse papier" "annuler"

    Comment peut on empêcher cette fenêtre d'apparaitre ou au pire sélectionner le "sauvegarder enregistrement" directement par code? (J'ai déjà supprimé toutes les demande de confirmations dans les options sans succès)

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 357
    Points : 355
    Points
    355
    Par défaut
    Salut,

    J'ai résolu le problème que tu mentionne en reagrdant du coté de Me.dirty il me semble (je ne me souviens plus comment je m'en étais servi. Il me semble que cette propriété te dit si l'enregistrement courant est en cours de modif.

    Voilou

  13. #13
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    J'ai essayé de passer la propriété dirty à false en début de code mais sans succès, as tu une idée de l'évènement sur lequel je peux le placer?

  14. #14
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    Bon on commence à bien s'écarter du topic original, je vais le fermer et en rouvrir un autre plus approprié.

    Merci pour tout Access Newbie.

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

Discussions similaires

  1. 2 formulaires avec VB sur On Timer : 2 process ?
    Par philou22 dans le forum IHM
    Réponses: 5
    Dernier message: 16/10/2007, 08h09
  2. Réponses: 11
    Dernier message: 19/09/2007, 10h20
  3. Réponses: 7
    Dernier message: 07/06/2007, 10h22
  4. Requete SUM sur une table avec critère sur une autre
    Par wail00 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/05/2007, 16h58

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