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 :

Cocher N premières lignes d'un sous-formulaire en fonction de la valeur d'un champ calculé


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 55
    Par défaut Cocher N premières lignes d'un sous-formulaire en fonction de la valeur d'un champ calculé
    Bonjour les pros!

    J'espère ne pas vous poser une colle cette fois-ci, même si là je crois que mon problème est VRAIMENT difficile : c'est signe que je m'améliore

    Je vous explique ma petite cuisine...

    - J'ai un formulaire basé sur une requête sélection
    - Dans la section détail de ce formulaire, j'ai la liste des enregistrements retournés par cette requête avec des champs calculés en fonction de saisies de l'utilisateur
    - J'ai ensuite un sous formulaire basé sur une 2ème requête, qui comprend un champ "case à cocher", décoché par défaut
    - Ces deux formulaires sont liées par un champ père et un champ fils : [Boites]

    ...Et ce que je veux faire :

    - l'utilisateur va effectuer une saisie dans un champ de la section détail du formulaire principal
    - Cela va actualiser le champ calculé pour cet enregistrement, qui aura par exemple la valeur N
    - Je souhaite que la case à cocher soit alors cochée pour les N premiers enregistrements du sous formulaire

    Qu'en pensez-vous? Est-ce réalisable?

    Merci pour votre aide!!

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 129
    Par défaut
    Bonsoir,

    Pour ce que j'en comprends il faut faire un update sur les données de la sous-fenêtre lors de l'enregistrement de la saisie de la fenêtre principale (ou lors du calcul du champ calculé)

    Il est probable que la sous-fenêtre n'a pas de compteur de ligne donc pour modifier seulement les N premières lignes le + simple est de le faire ligne à ligne avec un compteur en VBA

  3. #3
    Membre averti
    Femme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 55
    Par défaut
    Merci pour ton aide nico84!
    Seulement, je crois que je n'ai pas encore le niveau pour tout comprendre : comment faire un update sur la 2ème requête? comment cocher les cases en s'aidant du compteur de lignes?
    Désolée pour mon niveau ras des pâquerettes 😩

  4. #4
    Membre averti
    Femme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 55
    Par défaut Système D...qui ne marche pas...
    Salut!

    Vu que personne n'est très motivé par le sujet , je tente des trucs un peu hasardeux...et qui ne marchent pas bien sur...

    L'idée est de
    - Cocher la case à cocher du champ [MaTable].Sélectionner
    - Pour les N premières lignes (ici j'ai mis 3, ensuite ce sera une variable) de cette table
    - Où le champ [MaTable].boites est égal à la valeur d'un contrôle du formulaire qui me renvoie la valeur de ce champ pour l'enregistrement actif.

    Je m'y suis prise comme ça (mais je n'ai jamais fait de requêtes imbriquées, donc c'est sans doute un bazar monstrueux ) :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE [MaTable] SET [MaTable].Sélectionner = True
    WHERE ((([MaTable].Boites) In (SELECT TOP 3 [MaTable].[Libellés
    FROM (SELECT [MaTable].Boites, [MaTable].Libellés, [MaTable].Code, [MaTable].SP, [MaTable].Statut, [MaTable].Sélectionner
    FROM [MaTable] INNER JOIN [Table2] ON [MaTable].Statut = [Table2].Statut
    WHERE ((([MaTable].Boites)=[Formulaires]![MonForm]!TxtActif) AND (([MaTable].Code) Is Not Null) AND (([MaTable].Statut) Is Not Null))
    ORDER BY [Table2].Tri))));

    Et...ça ne fait rien!

    Je continue à chercher, mais si l'un de vous avait une idée pour me pousser dans la bonne direction, ce serait génial, je patauge un peu (mais vous voyez mon code...vous le savez déjà!)

    Bonne soirée!

  5. #5
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 129
    Par défaut
    Citation Envoyé par Capileba Voir le message
    ...ça ne fait rien!
    matable.boites devrait être dans (select top 3 matable.boites from matable where <conditions pour être dans la sous-fenêtre>)

    Mais comme le tri se fait sur la table2 je subodore que l'update devrait se faire sur table2 aussi... (la table de la sous-fenêtre quoi)

    Donc un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update table2 set selection=-1 where cleprimairetable2 in (select top 3 cleprimairetable2 from table2 where <conditions pour être dans la sous-fenêtre> order by <cledetriquivabien>)

  6. #6
    Membre averti
    Femme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 55
    Par défaut Yes!
    Merci pour ton aide nico84 !

    Au final ce n'était pas mon champ Boites qui devait être dans la requête SELECT TOP, mais bien mon champ Libellés. Mais celui-ci devait être juste avant dans la 1ère clause WHERE [MaTable].Libellés.

    Voilà comment j'ai fait, au cas cela pourrait servir à un autre bleu comme moi !

    Mon formulaire est construit comme ça :
    - Un formulaire principal qui renvoie les enregistrements de [MaTable], avec un contrôle dans lequel l'utilisateur peut saisir un chiffre, et un contrôle calculé en fonction de la valeur du chiffre saisi par l'utilisateur (MonControleCalculé).
    - Une sous-fenêtre qui renvoie via une requête des enregistrements de [MaTable], avec un champ case à cocher ([MaTable].Sélectionner)
    - Formulaire principal et sous-fenêtre sont liés par un champ père et un champ fils ([MaTable].Boites)

    L'objectif était de cocher automatiquement dans [MaTable] les N premières lignes renvoyées dans la sous-fenêtre, avec N = MonControleCalculé

    Mon code est mis sur un événement touche relâchée dans le contrôle sur lequel agit l'utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     'Le code qui définit l'action sur le contrôle et qui actualise les données
    On Error Resume Next
    DoCmd.SetWarnings False
    If KeyCode = vbKeyNumpad0 Then 
    'répété pour toutes les touches du pavé numérique : quand l'utilisateur relâche une de ces touches, 
    'MonControleCalculé (qui définit le nombre de lignes à cocher) est actualisé
    DoCmd.RefreshRecord
    Else
    End If
    A la suite, on exécute la première requête, qui va servir à décocher toutes les lignes renvoyées dans la sous-fenêtre du formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    'On commence par tout décocher dans la sous-fenêtre pour pouvoir gérer les modification faites par l'utilisateur 
    'sans conserver les cases cochées précédemment
    DoCmd.RunSQL "UPDATE [MaTable] SET [MaTable].Sélectionner = False
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    'Seulement pour les libellés renvoyés par la requête qui aliment la sous-fenêtre du formulaire :
    WHERE ((([MaTable].[Libellés]) In (SELECT [MaTable].[Libellés] FROM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'Et enfin le code SQL de la requête qui alimente la sous-fenêtre du formulaire : 
    'Le contenu de la sous-fenêtre est lié à l'enregistrement actif dans le formulaire principal
    'Un contrôle [TxtActif] a été créé pour renvoyer la valeur du champ [Boites] pour l'enregistrement actif (alimenté sur l'événement Form_Current)
    (SELECT [MaTable].Boites, [MaTable].[Libellés], [MaTable].Code, [MaTable].[SP], [MaTable].Statut, [MaTable].Sélectionner FROM [MaTable] INNER JOIN [Table2] ON [MaTable].Statut = [Table2].Statut WHERE ((([MaTable].Boites) = [Formulaires]![MonForm]![TxtActif]) And (([MaTable].[Code panier-boîte]) Is Not Null) And (([MaTable].Statut) Is Not Null)) ORDER BY [Table2].Tri))));"
    On va ensuite cocher dans la sous-fenêtre le nombre de lignes renvoyé par MonControleCalculé :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DoCmd.RunSQL "UPDATE [MaTable] SET [MaTable].Sélectionner = True
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    'Seulement pour les N premières lignes de la sous-fenêtre du formulaire (le champ [Libellés] ne doit pas contenir de doublons, 
    'sinon le nombre de cases effectivement cochées pourra être supérieur à la valeur de MonControleCalculé) :
    WHERE ((([MaTable].[Libellés]) In (SELECT TOP " & [MonControleCalculé] & " [MaTable].[Libellés] FROM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'On termine à nouveau par la requête qui alimente la sous-fenêtre du formulaire : 
    (SELECT [MaTable].Boites, [MaTable].[Libellés], [MaTable].Code, [MaTable].[SP], [MaTable].Statut, [MaTable].Sélectionner FROM [MaTable] INNER JOIN [Table2] ON [MaTable].Statut = [Table2].Statut WHERE ((([MaTable].Boites) = [Formulaires]![MonForm]![TxtActif]) And (([MaTable].[Code panier-boîte]) Is Not Null) And (([MaTable].Statut) Is Not Null)) ORDER BY [Table2].Tri))));"
    Merci pour ton aide nico84!
    Bon week-end à tous

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/04/2014, 18h31
  2. Réponses: 1
    Dernier message: 06/07/2010, 14h12
  3. Réponses: 4
    Dernier message: 19/04/2010, 12h41
  4. colorier cellule sous-formulaire en fonction de sa valeur
    Par aba_tarn dans le forum VBA Access
    Réponses: 7
    Dernier message: 07/03/2008, 13h40
  5. Réponses: 17
    Dernier message: 23/05/2007, 14h57

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