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 :

Clé étrangère vide = formulaire qui plante


Sujet :

Access

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 13
    Points
    13
    Par défaut Clé étrangère vide = formulaire qui plante
    C'est peut être une erreur bête mais je n'arrive pas à la résoudre, et ça m'ennerve un peu

    Je vous explique

    J'ai deux tables, une MB_SECURITE (membre de la sécurité), et l'autre SCENE



    Un membre de la sécurité est affecté à une seule scène durant toute la durée du festival (si bien sur il a les competences pour)

    Ma table MB_SECURITE se présente ainsi

    MB_SECURITE(CODE_MB,NOM_MB,PRENOM_MB......,#CODE_SCENE)

    Dans ma table, pour chaque occurence du membre, le champs CODE_SCENE est vide ou non suivant si je lui ai déja attribué une scene


    DOnc voila, maintenant que le décor est posé, maitenant le problème =)

    J'ai donc fais un formulaire pour affecter un membre de la sécurité à une scène.


    Le problème est que, dans ma liste déroulante, j'affiche tous les membres de la sécurité de ma bdd, y compris ceux qui ont déja une scene attitré.
    Je voulais donc que si le membre que je selectionne dans ma liste déroulante a déja une scene, afficher un message d'erreur pour prévenir que ça écrasera l'ancien enregistrement sinon pas de message.

    Le problème c'est qu'il ne me prend pas le fait que mon CODE_SCENE="" ou =Null si vous préférez, pour lui c'est ou tout bon ou tout pas bon.

    J'ai fais un

    dim str as string
    str="select cODE_SCENE from MB_SECURITE where CODE_MB=' " & lst_mb.value & " ';"

    if (str="") ((ou str=Null j'ai essayé aussi bien sur) then
    et_message.visible=true
    et_message.caption= "Passe pas"
    else
    et_message.visible=False

    C'est pas compliqué comme procédé, seulement je voudrais savoir si cela vient du fait que je test une clé étrangère? ou c'est mon raisonnement qui vaut rien? :p

  2. #2
    Membre averti Avatar de temar
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 316
    Points : 300
    Points
    300
    Par défaut
    salut !

    Déja, au niveau de ta modélisation, j'aurais fait autrement.
    Plutôt que de mettre le numéro de la scène en clé étrangère dans la table SECURITE_MB, j'aurais créé une table supplémentaire AFFECTER, qui contiendrait la clé de la SCENE et la clé de SECURITE_MB

    Comme ça, si le gars n'est pas affecté a une scène, il n'apparait pas dans la table AFFECTER, et tu peux t'en sortir avec un NOT IN (SELECT * FROM AFFECTER)

    Sinon, avec ta modélisation, ça doit surement pouvoir fonctionner quand meme.

    Sinon, je comprends pas trop le code que tu mets à la fin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     dim str as string
    str="select cODE_SCENE from MB_SECURITE where CODE_MB=' " & lst_mb.value & " ';"
     
    if (str="") ((ou str=Null j'ai essayé aussi bien sur) then
    et_message.visible=true
    et_message.caption= "Passe pas"
    else
    et_message.visible=False
    Tu définis une chaine str avec ta requete, et tu regardes si cette chaine est vide ?

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Oui, seulement avec ta proposition de créer une autre table (AFFECTER), cela aurait voulu dire que pour un membre de la sécurité je pouvais l'affecter à plusieurs scènes, or je ne veux lui attitré qu'une seule scène pendant toute la durée du festival.

    Et pour ton autre question, oui c'est ça =)

  4. #4
    Membre averti Avatar de temar
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 316
    Points : 300
    Points
    300
    Par défaut
    Ok si un membre est affecté a une seule scène...

    Par contre, pour le coup de définir un String, et de voir si elle est vide, je comprends toujours pas...

    Tu nous as tout mis la ? Dans le code que tu nous montres, la requete n'est pas exécuté.

    Et sauf si j'ai rien compris, si tu affectes quelque chose dans ta chaine str, elle risque pas d'etre vide pour ton test Tu peux m'éclairer stp ?

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Excuse moi, c'est vrai que si je montre que ce qui pour moi me pose problème, peut être que vous allez pas tout comprendre.

    Je te montre l'intégralité de mon formulaire, je sais pas exactement ce que tu veux alors je mets tous (vaut mieux en avoir trop que pas assez =p)





    Private Sub Form_Load()
    Dim str As String
    Dim str2 As String

    'visibilité des champs
    zmb_scene.Visible = False
    zmb_back.Visible = False
    zmb_necessaire_scene.Visible = False
    zmb_necessaire_back.Visible = False
    znom.Visible = False
    zprenom.Visible = False
    lst_compet.Visible = False
    et_message.Visible = False
    Cadre16.Visible = False
    Cadre24.Visible = False
    zselection.Visible = False
    lst_scene.Value = "Selectionnez !"
    lst_mb.Value = "Selectionnez !"
    zselection.Locked = True
    et_1.Visible = False
    et_2.Visible = False

    str = "select CODE_MB, NOM_MB, PRENOM_MB FROM MB_SECURITE ;"
    lst_mb.RowSource = str

    str2 = "SELECT CODE_SCENE, NOMSCENE FROM SCENE;"
    lst_scene.RowSource = str2


    End Sub


    Private Sub lst_mb_Click()
    'ZONE DE LISTE DEROULANTE = MB_SECURITE
    Dim str As String
    Dim str2 As String
    Dim str3 As String
    Dim str4 As String

    znom.Visible = True
    zprenom.Visible = True
    lst_compet.Visible = True
    zselection.Visible = True
    et_1.Visible = True
    et_2.Visible = True


    str = "select NOM_MB from MB_SECURITE where CODE_MB ='" & lst_mb.Value & "';"
    znom.RowSource = str

    str2 = "select PRENOM_MB from MB_SECURITE where CODE_MB ='" & lst_mb.Value & "';"
    zprenom.RowSource = str2

    str3 = "select C.CODE_COMPE, DESIGN_COMPE from POSSEDER P,COMPETENCES C where (C.CODE_COMPE=P.CODE_COMPE) AND (P.CODE_MB ='" & lst_mb.Value & "');"
    lst_compet.RowSource = str3


    'si le membre de la sécurité a déja été affecté à une scène :
    'afficher l'étiquette pour le signaler

    str4 = "select CODE_SCENE from MB_SECURITE where CODE_MB ='" & lst_mb.Value & "';"
    Liste76.RowSource = str4

    If (Liste76.Value = Null) Then
    et_message.Visible = False
    et_message.Caption = ""
    Else
    et_message.Visible = True
    et_message.Caption = "ATTENTION! Le membre de la sécurité que vous avez selectionné a déjà été affecté à une scène. Si vous validez ce choix, l'affectation de ce membre changera pour celle que vous avez selectionné."


    End If



    End Sub

    Private Sub lst_scene_Click()
    'ZONE DE LISTE DEROULANTE = SCENE
    Dim str As String
    Dim str1 As String
    Dim mb_type As String
    Dim mb_type2 As String
    Dim scene As String


    zmb_scene.Visible = True
    zmb_back.Visible = True
    zmb_necessaire_scene.Visible = True
    zmb_necessaire_back.Visible = True
    Cadre16.Visible = True
    Cadre24.Visible = True

    scene = lst_scene.Value

    'membres affectés reelement à cette scene
    str = "select MB_SCENE from SCENE where CODE_SCENE = '" & scene & "' ;"
    str1 = "select MB_BACKSTAGE from SCENE where CODE_SCENE = '" & scene & "' ;"
    zmb_scene.RowSource = str
    zmb_back.RowSource = str1


    'membres qu'il faudrait réelement à cette scene
    mb_type = "select MB_EFFSCENE from TYPE_SCENE where CODE_TYPE = (select CODE_TYPE from SCENE where CODE_SCENE = '" & scene & "') ;"
    mb_type2 = "select MB_EFFBACKSTAGE from TYPE_SCENE where CODE_TYPE = (select CODE_TYPE from SCENE where CODE_SCENE = '" & scene & "') ;"
    zmb_necessaire_scene.RowSource = mb_type
    zmb_necessaire_back.RowSource = mb_type2

    End Sub

    Private Sub btn_fermer_Click()
    DoCmd.Close
    DoCmd.OpenForm "MENU_GENERAL"
    End Sub


    Private Sub btn_valider_Click()

    'MEMBRE REELEMENT AFFECTEE A LA SCENE =+1
    'ATTENTION SI ON CHANGE FAIRE GAFFE DE RENTIRER UN A LA SCENE PRECEDEMMENT SELECTIONNEE
    Dim SQl As String
    If (zselection = "") Or (lst_mb = "") Or (lst_scene = "") Then
    et_message.Visible = True
    et_message.Caption = ("Veuillez entrer tous les champs avant de pouvoir valider l'affectation ")
    Else

    SQl = "Update MB_SECURITE Set CODE_SCENE = '" & lst_scene.Value & "' where CODE_MB = '" & lst_mb.Value & "'; "
    DoCmd.RunSQL SQl


    MsgBox ("Enregistrement Effectué")


    ' une fois enregistrée remise des champs à zéro
    'visibilité des champs comme à l'ouverture
    zmb_scene.Visible = False
    zmb_back.Visible = False
    zmb_necessaire_scene.Visible = False
    zmb_necessaire_back.Visible = False
    znom.Visible = False
    zprenom.Visible = False
    lst_compet.Visible = False
    et_message.Visible = False
    Cadre16.Visible = False
    Cadre24.Visible = False
    zselection.Visible = False
    lst_scene.Value = "Selectionnez !"
    lst_mb.Value = "Selectionnez !"
    End Sub

  6. #6
    Membre averti Avatar de temar
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 316
    Points : 300
    Points
    300
    Par défaut
    Ok, je comprend mieux comme ça

    Essaye en remplaçant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (Liste76.Value = Null) then
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If isNull(Liste76.Value) then
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If isEmpty(Liste76.Value) then

    Sinon, pourquoi ne pas afficher dans ta liste déroulante que les membres qui ne sont pas encore affectés ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     str = "select CODE_MB, NOM_MB, PRENOM_MB FROM MB_SECURITE
    WHERE ((CODE_SCENE) Is Null) ;"
    lst_mb.RowSource = str

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Mouarf, aucune des solutions que tu as proposé ne fonctionne , c'est à s'arracher les cheveux.


    Pour répondre à ta question, j'ai voulu procéder ainsi pour laisser la possiblité "d'écraser" un ancien enregistrement (changer l'affectation d'un mb), et ainsi ne pas avoir à créer un autre formulaire pour les changer les affectations des membres, du deux en un un peu =)

  8. #8
    Membre averti Avatar de temar
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 316
    Points : 300
    Points
    300
    Par défaut
    Ce coup la, j'ai testé avant de te répondre

    Alors, ça fonctionnera si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsNull(Liste76) Then
    En fait, fallait pas mettre le .Value...

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Ce qui marche bien chez toi , ne marche pas du tout chez moi

    Je vais finir par croire que c'est mon appli qui m'en veux , c'est pas compliqué quand même de tester si un champs est vide ou pas

  10. #10
    Membre averti Avatar de temar
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 316
    Points : 300
    Points
    300
    Par défaut
    Hum...

    Copie le contenu de ton champ dans une variable, et regarde un peu le contenu de cette variable en faisant des Debug.Print.

  11. #11
    Membre averti Avatar de temar
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 316
    Points : 300
    Points
    300
    Par défaut
    Sinon, essaye de créer un champ texte temporaire, pour vérifier si le code que je t'ai dit tout a l'heure fonctionne.

    Ya pas de raison que ça marche chez moi, et pas chez toi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If (IsNull(monChamp)) Then
            MsgBox "vide"
    Else
            MsgBox "pas vide"
    End If

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Je crois que j'ai cerné le problème, le champs que je teste est une zone de liste, donc elle n'est pas "active" quand j'entre une donnée, d'où le fait qu'en testant elle me mette toujours "vide".

    Comment je l'active quand je rentre une donnée ou si elle est vide? Je dois plutôt utiliser une zone de texte, mais à ce moment la, elle ne m'affiche pas le contenude la requête mais la requête en elle même

    Qu'en penses tu?

  13. #13
    Membre averti Avatar de temar
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 316
    Points : 300
    Points
    300
    Par défaut
    Je pense que tu devrais faire ça avec un champ texte.

    monChamp.text=DLookup("[CODE_SCENE]", "SECURITE_MB", "CODE_MB ='" & lst_mb.Value & "'")

    et après tu testes si ton champ text est vide.

  14. #14
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Pfiiiou merci de ta patience, ça marche impec et en prime j'ai appris une nouvelle fonction

    Merci temar


    Juste petit rectificatif, c'est monchamps.value, pas text pour que cela fonctionne


    =)

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

Discussions similaires

  1. [AC-2010] Vérification champs texte vide (formulaire)
    Par lguez dans le forum IHM
    Réponses: 6
    Dernier message: 22/11/2013, 22h34
  2. [AC-2007] formulaire qui dépasse et crée une autre feuille vide
    Par eliottgiraudo dans le forum IHM
    Réponses: 3
    Dernier message: 29/08/2013, 14h31
  3. [AC-2007] Filtre dans formulaire qui plante
    Par damsmut dans le forum IHM
    Réponses: 16
    Dernier message: 24/09/2010, 16h31
  4. [AC-2003] Formulaire qui plante complètement ACCESS
    Par damsmut dans le forum IHM
    Réponses: 14
    Dernier message: 30/04/2009, 11h22
  5. formulaire qui plante
    Par La_xota dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/09/2007, 10h04

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