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 :

Interdire la création d'enregistrement sous condition [AC-2000]


Sujet :

IHM

  1. #1
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Points : 1 683
    Points
    1 683
    Par défaut Interdire la création d'enregistrement sous condition
    Bonjour,

    Dans un sous-formulaire en mode continu, je cherche comment interdire la création d'un nouvel enregistrement si un certain champ de l'enregistrement en cours n'est pas renseigné.

    La solution consistant à définir la propriété Nul interdit du champ à Oui dans la table ne convient pas parce que champ peut ne pas être renseigné dans d'autres conditions (autre enregistrement du formulaire par exemple).

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    As-tu essayé avec l'événement BeforInsert ou BeforeUpdate ?

    Tu pourrais faire un test à ce moment là et cancelé l'innsertion si ce n'est pas valide.

    A+

  3. #3
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Points : 1 683
    Points
    1 683
    Par défaut
    Bonjour

    Oui effectivement, voilà ce sur quoi j'étais arrivé
    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
    Private Sub Form_BeforeInsert(Cancel As Integer)
      Dim oDb As DAO.Database
      Dim oRst As DAO.Recordset
      Dim sSQL As String
      Set oDb = CurrentDb
      ' sSQL correspondont à la requête du sous-formulaire
      sSQL = "SELECT tEVA.evaris, tEVA.evadat, tEVA.evafin " & _
        "FROM tEVA " & _
        "WHERE tEVA.evaris = " & Me.evaris & " ORDER BY tEVA.evadat;"
      Set oRst = oDb.OpenRecordset(sSQL, dbOpenDynaset)
      If oRst.NoMatch Then  ' pas d'enregistrement dans le sous-formulaire
        If DCount("*", "tEVA") = 0 Then   ' s'il n'existe pas d'enregistrement dans la table (évaluation de ID)
          Me.evaid = (utr * 10000000) + 1
        Else                              ' s'il en existe (évaluation de ID)
          Me.evaid = (utr * 10000000) + DMax("evaid", "tEVA") - (Int(DMax("evaid", "tEVA") / 10000000) * 10000000) + 1
        End If
      Else
        oRst.MoveLast
        If Not IsNull(oRst!evafin) Or oRst!evafin <> "" Then  ' création d'un nouvel enregistrement
          Me.evaid = (utr * 10000000) + DMax("evaid", "tEVA") - (Int(DMax("evaid", "tEVA") / 10000000) * 10000000) + 1
        Else
          MsgBox "La création d'une nouvelle évaluation ne sera possible que " & vbNewLine & _
                 "lorsque les nouvelles mesures de prévention auront été mises " & vbNewLine & _
                 "en oeuvre. ", vbExclamation + vbOKOnly, "Création impossible"
          Cancel = True
          oRst.MoveFirst
        End If
      End If
      oRst.Close: oDb.Close: Set oRst = Nothing: Set oDb = Nothing
    End Sub
    Mais le résultat n'a pas l'air probant : je perds (en visuel uniquement) les données du sous-formulaire.

    Il doit peut être exister quelque chose de plus simple...

    Merci de ton aide.

  4. #4
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Points : 1 683
    Points
    1 683
    Par défaut
    Re,

    Bon : j'ai trouvé mais je reste persuadé qu'il doit y avoir beaucoup plus simple.

    Pour ceux que cela intéresse :
    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
    Private Sub Form_BeforeInsert(Cancel As Integer)
      Dim sSQL As String
      Dim db As DAO.Database
      Dim rst As DAO.Recordset
      Set db = CurrentDb
      sSQL = "SELECT TOP 1 tEVA.evaris, tEVA.evadat, tEVA.evafin " & _
        "FROM tEVA " & _
        "WHERE tEVA.evaris = " & Me.evaris & " ORDER BY tEVA.evadat DESC;"
      Set rst = db.OpenRecordset(sSQL, dbOpenDynaset)
      If rst.EOF Then
        ' Pas d'enregistrement, on peut créer un nouvel enregistrement
        If DCount("*", "tEVA") = 0 Then     ' s'il n'existe pas d'enregistrement dans la table (calcul de ID)
          Me.evaid = (utr * 10000000) + 1
        Else                                ' s'il en existe (calcul de ID)
          Me.evaid = (utr * 10000000) + CLng(Right(DMax("evaid", "tEVA"), 7)) + 1
        End If
      Else
        If IsNull(rst!evafin) Or rst!evafin = "" Then
          ' La date du dernier enregistrement est vide, on ne crée pas : on sort !
          MsgBox "La création d'une nouvelle évaluation ne sera possible que " & vbNewLine & _
                 "lorsque les nouvelles mesures de prévention auront été mises " & vbNewLine & _
                 "en oeuvre. ", vbExclamation + vbOKOnly, "Création impossible"
          Cancel = True
          DoCmd.GoToRecord , , acLast
          GoTo sortie
        Else
          ' La date du dernier enregistrement est remplie, on crée."
          Me.evaid = (utr * 10000000) + CLng(Right(DMax("evaid", "tEVA"), 7)) + 1
        End If
      End If
    sortie:
      rst.Close: db.Close: Set rst = Nothing: Set db = Nothing
    End Sub
    Si quelqu'un avait un tuyau avec une meilleure solution... je laisse 2 - 3 jours en attente.

    A+

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

Discussions similaires

  1. [AC-2007] Ajouter des enregistrement sous condition
    Par Gorane dans le forum IHM
    Réponses: 13
    Dernier message: 08/12/2010, 11h14
  2. [AC-2000] Suppression d'enregistrement sous condition
    Par Gabout dans le forum IHM
    Réponses: 5
    Dernier message: 21/07/2009, 11h46
  3. [XL-2007] Création de feuille sous condition
    Par stargates dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/06/2009, 14h49
  4. Enregistrement sous condition
    Par RootsRagga dans le forum VBA Access
    Réponses: 6
    Dernier message: 26/02/2008, 00h15
  5. Requête SQL avec création de table sous condition
    Par misig dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/11/2007, 08h58

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