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 :

Comment limiter le nombre d'enregistrements pour un sous formulaire? avec condition


Sujet :

IHM

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Comment limiter le nombre d'enregistrements pour un sous formulaire? avec condition
    Bonjour,

    Je me permets de reprendre cette discussion du mois d'avril car elle répond partiellement à mon bloquage concernant la limitation du nbre d'enregistrement dans un sous formulaire:

    Tu peux utiliser la propriété Avant insertion du formulaire SF_PRESCRIPTION.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Form_BeforeInsert(Cancel As Integer)
     
        'Teste le nombre de prescriptions et limite à 3
        If Me.CurrentRecord > 3 Then
     
            MsgBox "Pas plus de 3 prescriptions, svp !"
     
            Cancel = True
     
        End If
     
    End Sub
    Domi2
    Pour moi je trouve que cette façon de limiter la quantité d'enregistrement est très bien. Ce que je voudrais en plus s'est rajouter des conditions en fonction de plusieurs critères:
    Limiter les enregistrements à 3 si mon champ Objet commence par un A, à 2 s'il commence par un B...
    Mais je ne sais pas comment écrire la condition et s'il suffit juste de rajouter quelques lignes au code ci-dessus,
    Merci pour vos suggestions
    Amstra



    __________________

  2. #2
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Bonjour,

    Tel que tu le décris, tes conditions supposent que l'utilisateur ait saisi l'objet de son nouvel enregistrement avant de faire le test ... Tu ne peux donc pas t'appuyer sur ce code.

    Dans ce cas, tu devras réagir à l'évènement Avant MAJ du formulaire et compter les enregistrements déjà saisis correspondant aux mêmes caractéristiques (même première lettre pour le champ Objet) et refuser la mise à jour (Cancel = True) si la règle n'est pas respectée.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci pour la précision. j'étais bien contente de pouvoir faire une limitation quantitative des enregistrements. Et je ne suis pas encore arrivée à ce stade
    pour le moment car je sèche sur la condition. En attendant j'essaye déjà de faire un cptedom avec 4 conditions mais je bloque sur la dernière.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CpteDom("[T Commandes]![objet]";"T Commandes";" [T Commandes]![Retour validé]=0 AND [T Commandes]![objet] > 'LV1' AND [T Commandes]![objet] < 'LV999999'")
    Car je voudrais en plus faire un regroupement par usager. Avec la condition ci dessous j'ai le total de ma table, mais je voudrais faire un total par usager, c'est à dire :
    pour tel usager, compte les objet s'ils commencent par LV ( je n'ai pas réussi à écrire la condition avec "comme" -c'est un champ texte et je n'arrive pas à l'écrire comme LV****- ni avec "entre") et que le retour validé est 0.
    Et en fonction du résultat (si > à 3) bloqué les enregistrements qui commencent par LV dans le sous formulaire pour l'usager en question.
    J'imagine qu'il faut que j'aille voir du côté des requêtes pour trouver une solution !

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    C'est selon moi simple :
    Sur l'événement After_Update de ton champ Objet, tu affectes à une variable la première lettre de l'occurence inscrite dans le champ, puis tu construits une chaine SQL et tu créées ou mets à jour la requête source du sous-formulaire, ce qui donne :
    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
    Private Sub Objet_AfterUpdate()
    Const QUERY_NAME              As String = "req_Objet_Selectionné"
    Dim oQDF                      As DAO.QueryDef
    Dim strCriteria               As String
    Dim strSQL                    As String
    Dim strMaxRow                 As Integer
     
        strCriteria = UCase$(Left$(Me!Objet, 1))
     
        'A mettre dans une table car en dur, c'est pas maintenable
        Select Case Asc(strCriteria)
            Case 65: strMaxRow = "TOP 3"                        'A
            Case 66: strMaxRow = "TOP 2"                        'B
            Case Else: strMaxRow = vbNullString
        End Select
        'Création de la chaîne SQL
        strSQL = "SELECT " & strMaxRow & " Champ1, Champ2, Champ3, Champn "
        strSQL = strSQL & "FROM [T Commandes] "
        strSQL = strSQL & "WHERE Objet Like " & strCriteria & "*;"
     
        On Error Resume Next
        Set oQDF = CurrentDb.QueryDefs(QUERY_NAME)
        If Err = 0 Then
            'La requête existe, on la met à jour
            oQDF.SQL = strSQL
        Else
            'La requête n'existe pas, on la créer
            Set oQDF = CurrentDb.CreateQueryDef(QUERY_NAME, strSQL)
        End If
     
        'On suppose que ton sous formulaire est rattaché à la requête QUERY_NAME
        Me.TonSousForm.Requery
        Set oQDF =  Nothing
    End Sub
    Argy

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Bonjour Argyronet,

    Merci pour ton aide, mais ça fait une semaine que je regarde sous toutes les coutures ta solution mais malheureusement elle ne me parle pas du tout. Mon niveau en code est pour le moment limité aux fonctions basiques et je n’ai pas réussi à adapter ton code ( la partie que je ne connais pas concerne la fonction Select CASE – pourquoi case 65 et 66 ??) et la partie sur la création de la chaîne ( champ1, champ2…)
    Pour le reste après quelques recherches j’ai compris à quoi ça servait et à peu près comment ça marche.J'ai donc tenté ma chance et dans un premier temps j’ai essayé de copier coller ton code en changeant les noms quand il le fallait mais j’ai une erreur de compilation (type non défini) sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim oQDF                      As DAO.QueryDef
    Même en faisant des recherches et en utilisant l’aide d’access je n’ai pas réussi à comprendre.
    Pourrais-tu me réexpliquer stp ?
    Merci beaucoup
    Amstra

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Le principe est simple...
    On créé ou on enrichi selon qu'elle existe ou non la requête qui va permettre de filtrer tes enregistrements en fonction de ce qui est tapé dans la zone de texte... D'où l'usage du QueryDefs.

    L'erreur que tu rencontres est due au fait qu'il faut que tu références DAO 3.6 Object Library depus le menu Outils/Références...

    Pourquoi un Select Case (voir l'aide) parce que c'est un cas à choix multiples qui t'évites de planter une forêt de If...

    65 et 66 correspondent respectivement au codes ASCII de A et B mais ainsi que je te le précisais et du fait que tu veuille obtenir 3 pour A et 2 pour B etc..., il est préférable de mettre ces lettres dans une table et d'y accoler le nombre correpondant d'enregistrements souhaités.

    Code Table des lettres : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Lettre    Enregistrements
    A         3
    B         2
    C         4
    D....

    Ensuite tu lis la table selon la valeur de la lettre tapée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strMaxRow = "TOP " & DlookUp("[Enregistrements]", "TBLLettres", "[Lettre]=" & strCriteria)
    Cela enrichi le Select Case et c'est plus souple si un jour tu veux modifier le nombre d'enregistrements souhaités pour une lettre donnée.

    Enfin concernant :
    Citation Envoyé par Argy
    strSQL = "SELECT " & strMaxRow & " Champ1, Champ2, Champ3, Champn "
    Ne connaissant pas ta table, j'ai inventé des noms de champ. Toi tu écris ceux que tu souhaites...
    Argy

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Octobre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Une base access
    Bonjour argyronet,

    Avez-vous un exemple de base access pour comprendre le fonctionnement.
    Ce code m'interresse. Je suis débutant, non flémard. Un exemple avec application concrète me permettrait sincérement d'aprendre

    Merci beaucoup

  8. #8
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Désolé kikinus , je n'ai pas de base exemple.
    Lorsque j'ai répondu à cette demande, c'était sur le pouce.

    Et effectivement, si tu débutes, l'approche n'est pas aisée.

    Argy

Discussions similaires

  1. [AC-2007] Comment limiter le nombre d'enregistrements dans une table
    Par arabi91 dans le forum Modélisation
    Réponses: 6
    Dernier message: 24/03/2012, 11h25
  2. Réponses: 4
    Dernier message: 10/04/2009, 11h10
  3. Limite du nombre d'enregistrements pour commiter
    Par calou_33 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 28/01/2009, 14h09
  4. Réponses: 6
    Dernier message: 03/10/2007, 14h58
  5. [CR 9.0]Comment limiter le nombre d'enregistrements sur une page
    Par popol666 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 06/11/2006, 15h27

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