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 :

Formulaire : requête basée sur le sélecteur


Sujet :

IHM

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut [A-00] Formulaire : requête basée sur le sélecteur
    Bonjour,

    J'ai un formulaire tabulaire.

    J'ai réussi à créer un bouton sur chaque ligne dont l'objectif est de récupérer le contenu du champ de la ligne correspondante.

    J'ai réussi à le faire soit grâce aux assistants Access, soit grâce à du code.

    Dans les deux cas, il suffit de créer une requête qui part d'une table contenant les valeurs du champ souhaité et de mettre comme critère le nom du champ dans le formulaire.

    ça parait vraiment magique comme fonctionnement, car on met bien le nom du champ, qui est donc dupliqué autant de fois qu'il y a de lignes d'enregistrement dans le formulaire tabulaire.

    Il suffit de cliquer sur le bouton qui sur le bouton de la ligne voulu et Access exécute la requête en "devinant" sur quelle ligne le bouton se trouve…

    Ça marche et c'est tant mieux.

    Mais je voudrait aller plus loin.

    Il est possible, dans les formulaire de faire apparaître le sélecteur.

    Il est aussi possible de "sélectionner" plusieurs lignes en cliquant sur le sélecteur de la première ligne et en glissant vers le bas ou le haut. Le sélecteur passe du gris au noir.

    J'aimerais que grâce à un bouton placé d'en l'entête du formulaire, ou sur chaque ligne du formulaire, que toutes les lignes ainsi sélectionnées soient récupérées dans une table.

    Je suis sur que c'est possible exactement comme je l'indique, puisque tout un chacun peut déjà tenter le manip suivante :

    Sélectionner des lignes comme indiqué ci-dessus,
    Cliquer dans le menu Outils>Liaisons Office>Exporter vers MsExcel.

    Seules les lignes sélectionnées sont exportées.

    Je pourrais bien sur recourir à des cases à cocher, mais l'incontestable avantage du sélecteur (le bien nommé…) c'est que l'on peut utiliser la fonction Shift+Clic et qu'il soit volatile…

    Alors que cocher les cases nécessite de toutes les cocher et en plus de toutes les décocher…

    En plus mon formulaire est basé sur une requête qui ne peut, d'après mon expérience, pas comporter de colonne pour une case à cocher. De toutes façon, j'en veux pas, puisque c'est sur, ça marche avec le sélecteur.

    J'ai déjà trouvé une solution : requête avec comme argument de Where Forms.Monformulaire.Moncontrôle, mais ça ne sort que la première ligne de la sélection.

    Une idée ?

    D'avance merci.

    PS : je ne suis qu'un débutant en code, merci de ne pas balancer des lignes de code sans indiquer où les mettre et si elle nécessitent de déclarer des variables ou autre…

  2. #2
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    hello
    tu n'es pas obligé d'avoir un bouton dans le détail, ce qui donneun aspect un peu lourd
    tu peux utiliser l'évènement doubleclick (pour ne pas confondre avec la simple arrivée dans la zone à l'aide de la souris) de n'importe quelle zone de texte
    tu peux aussi utiliser l'évènement clic du détail, ce qui réagira sur le clic dans le sélecteur
    tu peux même utiliser l'évènement clic du formulaire et il récupère tout à fait bien les valeurs de l'enregistrement courant

    par contre, j'ai cherché dans Me et j'ai pas trouvé la variable qui contient le nombre de lignes sélectionnées, le numéro de la première, et celui de la dernière
    peut être aussi que cette propriété est stockée quelque part dans une propriété de chaque record, mais j'ai pas trouvé
    je suis donc à l'écoute des résultats de ce post

    pour info: le code qui provoque l'ouverture d'un autre formulaire filtré sur la ligne en cours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_DblClick(Cancel As Integer)
    DoCmd.OpenForm "Détail_simplifié", , , "[N° de proposition] = forms!devis_détail![N° de proposition]"
    End Sub
    NB: j'ai pas utilisé "[N° de proposition] = " & Me![N° de proposition] à cause de la virgule versus le point [N° de proposition] est décimal
    -------------------Simplifi----------comme si tout était simple--------

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour et merci pour la rapidité de réponse.

    Comme indiqué plus haut, il est évident qu'Access est capable de reconnaître les enregistrements pour lesquels le sélecteur est activé.

    C'est peut être un début de solution, un truc du genre "Where selector activate=True".

    J'ai fini par utiliser la commande "ouvrir un formulaire en n'affichant que les enregistrements correspondants" que l'on peut trouver dans l'assistant création de bouton et dont j'ai récupéré le code.

    Je comprends comment ç a fonctionne dans ce cas.

    Mais je ne vois pas comment une requête, crée avec l'assistant, et avec comme critère le nom du champs du formulaire à retenir, peut être lancée par un bouton qui n'identifie rien du tout et n'est créé qu'une fois (rappelez-vous, c'est un formulaire tabulaire…).

    Comment la requête sait que c'est cette ligne qui m'intéresse et pas celle avant ou celle après…

    Encore merci.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    hello
    simplement parce que forms!mon_fomulaire!ma_zone_de_texte fait référence à la valeur de la zone de texte pour l'enregistrement courant: c'est à dire celui qui a le triangle dans le sélecteur

    PS mon formulaire est aussi en mode tabulaire ! ! !
    -------------------Simplifi----------comme si tout était simple--------

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Euh, Bon OK

    J'ai pas tout pigé concernant la liaison entre formulaire et requête, mais c'est pas grave.

    Le plus important c'est que ça marche !

    Mais surtout que je trouve une solution pour utiliser le selecteur comme... selecteur d'enregistrement ! (wahou ! quelle bonne idée d'utilisation ! )

    Encore une fois, Access doit récupérer l'info quelque part pour permettre l'export de seulement les lignes "sélectionnées" vers Excel...

    Encore merci.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    hello
    je continue de chercher....
    les pistes:
    F1, le pb étant de taper le bon mot
    ce forum, les tutos, par exemple
    http://www.developpez.net/forums/d57...ht=s%E9lecteur

    et de toute façon, je suis bien interessé par le résultat
    -------------------Simplifi----------comme si tout était simple--------

  7. #7
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Dans un formulaire Me.SelTop est le numéro du premier enregistrement dans la sélection d'enregistrements.
    Me.SelHeight est le nombre d'enregistrements sélectionnés.

    Petit problème : Dès qu'un contrôle prends le focus la sélection d'enregistrement disparaît.

    Pour contourner cela on peut mémoriser la dernière sélection d'enregistrements dans deux variables déclarées au début du module de code du formulaire.
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim lngSelTop As Long, lngSelHeight As Long
    Il faut faire cette sauvegarde juste avant que le bouton ne soit activé.
    Le seul événement que j'ai trouvé pour le faire est "sur souris déplacée".
    (Le bouton s'appelle cmdEnrSelectionnes)
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub cmdEnrSelectionnes_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ' Aucun bouton ne doit être enfoncé sinon le bouton
    ' a pris le focus, et la sélection a disparue
    If Button = 0 Then
       lngSelTop = Me.SelTop
       lngSelHeight = Me.SelHeight
    End If
    End Sub

    Et maintenant le code l'événement "Sur clic" du bouton:
    Code vb : 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
    Private Sub cmdEnrSelectionnes_Click()
    Dim i As Long, strMsg As String
     
    If lngSelTop = 0 Then lngSelTop = Me.SelTop
    If lngSelHeight = 0 Then lngSelHeight = Me.SelHeight
     
    If lngSelHeight = 0 Then
       MsgBox "Pas de sélection"
       Exit Sub
    End If
     
    ' Parcour les enregistrements sélectionnés et lit le contrôle F1
    For i = lngSelTop To lngSelTop + lngSelHeight - 1
       DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, i
       strMsg = strMsg & "Enr " & Format(i, "0000000") & " : " & Me.F1 & vbCrLf
    Next
     
    ' Restaure la sélection
    Me.SelTop = lngSelTop
    Me.SelHeight = lngSelHeight
     
    MsgBox strMsg
    End Sub
    C'est de la bidouille mais fonctionne pas trop mal tant que l'évènement "sur souris déplacée" se déclenche.

    A+

  8. #8
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    hello
    je viens de tester ces propriétés et j'ai une bonne nouvelle en rapport avec le clic dans le sélecteur, on peut utiliser les évènements clic ou double clic sur le form
    j'ai testé ça et j'ai toujours eut le message sur clic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Form_Click()
    If Me.SelHeight > 1 Then
    MsgBox "première ligne sélectionnée: " & Me.SelTop & " et " & Me.SelHeight & " lignes sélectionnées par clic"
    End If
    End Sub
     
    Private Sub Form_DblClick(Cancel As Integer)
    If Me.SelHeight > 1 Then
    MsgBox "première ligne sélectionnée: " & Me.SelTop & " et " & Me.SelHeight & " lignes sélectionnées par double clic"
    End If
    End Sub
    D'autre part, dans ce forum, en tapant sélecteur et en cherchant, on trouve la propritété Seltop et bien sûr si on tape seltop dans l'aide alors on trouve tout ce qu'on cherchait.
    donc en gros, quand on sait on trouve ! ! ! !
    c'est pour ça que ce forum est totalement irremplaçable merci LedZepII
    -------------------Simplifi----------comme si tout était simple--------

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Et merci de vous occuper de mon problème, pendant que moi... je suis en congés...

    Bon, OK

    Comme je ne part pas en vacances avec ma base de données (on n'est pas encore assez proches...) je ne peut tester le résultat.

    Par tester le résultat, j'entends essayer d'utiliser ce code en n'oubliant pas des bouts à droite à gauche.

    Parcequ'il est évident que ça fonctionne.

    Par contre, si je pige bien il y a une histoire de message box qui indique la première et la dernière selection ?

    C'est bien quand il y a un truc qui s'affiche à l'écrant genrer "OK, Annuler" ?

    Sauf celle qui dit pas de sélection...

    Je ne pense pas que je retienne cette option.

    Je voudrait que ce soit particulièrement transparent.

    Dès mon retour je vais faire un saut sur l'aide Access.

    Je vous tiens au courant.

    Encore un grand merci.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Un très grand merci à tous et une mention particulière à LedZeppII dont le code fonctionne tel quel (Il faut juste remplacer F1 par le nom du champ à récupérer, ce qui est indiqué dans le code.

    Ainsi, le contenu du champ retenu, des lignes sélectionnées apparaît comme une liste dans une message box.

    Je ne suis pas assez compétent pour supprimer cette message box et la remplacer par la création d'une table.

    En effet, je met à jour d'autre tables à partir de cette sélection (enfin c'est ce que je souhaite faire, parceque pour l'instant, je sais pas...). Pour l'instant, j'aimerais récupérer la sélection dans une table et exécuter successivement des requêtes de mises à jour via la commande DoCmd.OpenQuery basés sur cette table.

    Mais dans un futur plus ou moins proche, je remplacerais ces requêtes "en dur" executées depuis le code par de lignes de codes DoCmd.RunSQL intégrées au code.

    Le mieux serait que je trouve le moyen de mettre à jour une table avec comme source le résultat de la sélection issue du selecteur.

    En fait, je part du principe que l'opération est fiable, ce qui semble être le cas suite aux tests que j'ai effectué, et que l'utilisateur n'a pas besoin de voir une message box pour connaître sa sélection.

    Si j'ai réellement besoin de l'afficher, je préfère une table et/ou un formulaire.

    En revanche, je trouve la message box "Aucune sélection" très utile. Donc il faut que je trouve le moyen de la garder.

    Encore merci.

  11. #11
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Je vais rester sur le même exemple.
    Mon champ clé est le champ "F1".
    J'ai créé une table "tblSelection fm1" qui contient un seul champ (F1) ayant la même définition que celui qui est sur mon formulaire.

    Le code de l'événement "Sur clic" de mon bouton cmdEnrSelectionnes va maintenant remplir la table "tblSelection fm1"
    avec le contenu du champ "F1" des enregistrements sélectionnés sur le formulaire.
    Pour varier les plaisirs, le code parcourt le clône du recordset du formulaire au lieu de se déplacer dans le formulaire.
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Private Sub cmdEnrSelectionnes_Click()
    Dim db As DAO.Database, rs As DAO.Recordset, rsSel As DAO.Recordset
    Dim i As Long
    ' Nom de la Table destinée à contenir la sélection
    Const strTableSelection = "tblSelection fm1"
     
    If lngSelHeight = 0 Then lngSelHeight = Me.SelHeight
     
    If lngSelHeight = 0 Then
       MsgBox "Pas de sélection."
       Exit Sub
    End If
     
    Set db = CurrentDb
    '
    DoCmd.Close acTable, strTableSelection, acSavePrompt
    ' Vider table de sélection
    db.Execute "DELETE FROM [" & strTableSelection & "]"
    ' Ouvrir recordset sur table de sélection
    Set rsSel = db.OpenRecordset(strTableSelection)
    ' référencer le recordset clone du formulaire
    Set rs = Me.RecordsetClone
    ' Aller au premier enregistrement du recordset
    rs.MoveFirst
    ' Aller au premier enregistrement de la sélection (SelTop)
    ' * Enregistrements numéroté de 1 à n dans le formulaire
    ' * Enregistrements numéroté de 0 à n-1 dans le recordset
    rs.Move lngSelTop - 1
    ' Parcourir les enregistrements du formulaire faisant partie
    ' de la sélection et copier le champ "F1" dans la table
    ' des enregistrement sélectionnés (recordset rsSel)
    For i = 0 To lngSelHeight - 1
        If i > 0 Then rs.Move 1
        ' Sécurité au cas ou on sélectionne le dernier enregistrement vide
        If rs.EOF Then Exit For
        ' Ajouter un nouvel enregistrement
        rsSel.AddNew
        ' Copier valeur du champ "F1"
        rsSel.Fields("F1") = rs.Fields("F1")
        ' Sauvegarder nouvel enregistrement
        rsSel.Update
    Next
    ' Fermer le(s) objet(s) / libérer les variables objets
    rsSel.Close
    Set db = Nothing
    Set rs = Nothing
     
    ' Restaurer la sélection
    Me.SelTop = lngSelTop
    Me.SelHeight = lngSelHeight
     
    ' Juste pour l'exemple
    DoCmd.OpenTable strTableSelection
    End Sub
    A la fin de la procédure j'ouvre la table.
    C'est évidement inutile et ça n'est là que pour l'exemple (bien que ça permette de vérifier que la table contient bien ce à quoi on s'attend).
    A la place tu mets ce que tu as à faire (exécution de requêtes actions).


    A+

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.
    Merci de continuer à apporter votre aide.
    Citation Envoyé par LedZeppII Voir le message
    Pour varier les plaisirs, le code parcourt le clône du recordset du formulaire au lieu de se déplacer dans le formulaire.
    Juste par curriosité, celà signifie que c'est une façon de faire ou bien que c'est la façon de faire.

    J'ai recopié le code tel quel, en changeant juste le nom du champ à récupérer. J'ai remplacé tous les F1 par Monchamp.
    J'ai gardé le reste tel quel et j'ai crée la table tblSelection fm1

    J'ai laissé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim lngSelTop As Long, lngSelHeight As Long
    En début du code du formulaire et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ' Aucun bouton ne doit être enfoncé sinon le bouton a pris le focus, et la sélection a disparue
    If Button = 0 Then
       lngSelTop = Me.SelTop
       lngSelHeight = Me.SelHeight
    End If
    End Sub
    En première partie du code.

    Problème :

    Quand je clique sur le bouton de sélection, le débogueur se déclenche :

    Erreur de compilation, Type défini par l'utilisateur non défini.

    Private Sub cmdEnrSelectionnes_Click() surligné en jaune
    db As DAO.Database surligné en bleu.

    Alors comme je suis juste bon à recopier du code, j'en suis pas encore à le dépanner !

    Que faire ?

    D'avance merci...

  13. #13
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour,

    Alt+F11 pour aller dans l'éditeur VBA.

    Menu Outils ==> Références...

    Si tu regardes quelles références sont cochées, il devrait manquer Microsoft DAO X.X Object Library.

    Tu parcours la liste, tu coches la librairie (certainement 3.6) et tu valides par Ok.

    Tu peux compiler ton code pour voir si tu as des erreurs...

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bien joué !

    Effectivement, cocher cette librairie résoud le problème (qui n'en était pas un)

    J'ai lu dans l'aide que cette librairie était un genre de base de travail pour les concepteurs de base Access travaillants sur une version anterieure à Access 2000, et que maintenant la référence serrait ADO.

    Cela doit avoir un impact quelconque (ou pas...) sur la suite à donner aux opérations...

    Bon, et bien c'est très bien, encore merci à tous.

    Maintenant, je vais essayer de mettre à jour une table en prenant comme critère que les enregistrements soient présent dans le recordset.

    C'est à dire :

    Dans le cas présent, je met à jour une table [Sélection], où j'écris en "dur" le contenu de ma sélection issu du sélecteur.

    Ensuite, j'utilise cette table via une requête de mise à jour (soit en "dur", soit en code) pour mettre à jour un champ d'une autre table dont seulements certains enregistrements sont en commun avec la table selection.

    Cela necessite la création et le maintient d'une table en dur pour recevoir la sélection.

    Je penses qu'il doit être possible de se passer de cette table "selection" et de mettre à jour la ou les tables cibles directement depuis la "mémorisation de la sélection.

    Encore merci.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour,

    Bon, he ben, ça marche pas trop comme je veux.

    Ci dessous, un extrait de ce que j'utilise pour faire mes mises à jour pour l'instant (et qui marche, à contrario de mes différents essai de bidouillages infructueux) :

    Il y a la table TABLE_SELECTION qui est issus du système présenté ci-dessus (dans cet exemple elle s'appelle "tblSelection fm1".

    La table cible (celle à mettre à jour) s'appelle ici TABLE_A_MAJ (trop compliqué…) ; le champ à metter à jour : CHAMP_A_MAJ (on va pas y arriver…)

    La liaison se fait sur le champ F1 issu de la table crée grace à la procédure de sélection.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL "UPDATE TABLE_SELECTION INNER JOIN TABLE_A_MAJ ON TABLE_SELECTION.F1 = TABLE_A_MAJ.F1 SET TABLE_A_MAJ .CHAMP_A_MAJ='Vrai';"
    L'idéal serrait que je puisse avoir un élément qui puisse être incorporé dans le code en lieu et place de "l'objet" TABLE_SELECTION.

    Je pourrait ainsi faire des requêtes de création et/ou de mise à jour de tables.

    L'objectif caché (mais je vous le dis quand même) c'est d'avoir le moins de tables "temporaires" possibles.

    Ça passait encore quand je débutais sous Access, mais maintenant que je suis un caïd (en gros je sais tout faire sous Access, sauf ça…) ça le fait moins

    Alors les idées sont les bienvenues.

    D'avance merci.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour et bonne année à tous.

    J'ai vainement essayé de faire la transformation suivante dans le code fournis par LedZepII (Encore merci, le résultat est très impressionnant)

    J'ai essayé de faire en sorte que la table soit mise à jour sans appuyer sur un bouton.

    Ainsi on selectionne les lignes soit en balayant le selecteur de haut en bas soit en faisant un clic sur la première ligne et un CTRL+clic sur la dernière.

    Bref on fini toujours par un clic.

    ALors j'ai tenté de remplacer le Bouton CLick, par un MousseUp (sur souris relaché donc.

    Alors quand on fait une sélection avec CTRL + Click, ça ne marche que pour la première ligne sélectionnée. Normal, puisqu'il faut relacher la souris après le premier clic sur la première ligne de la sélection pour aller faire le CTRL+Clic sur la dernière ligne de la sélection.

    Par ailleurs quand on sélectionne en balayant les lignes à partir du haut, là ça fonctionne (en effet, à la fin du balayage, on relache la souris et la fonction se déclenche)

    Mais il y a une curiosité :
    Quand on sélectionne en balayant, mais en prenant des lignes en milieu de formulaire, c'est à dire n'incluant pas la première ligne, alors là la fonction se déclenche, mais pas correctement.

    Pendant un bref moment le selecteur présente une sélection comportant le même nombre de lignes que celles sélectionnées, mais décalées vers le haut, pour que la premièr ligne de la sélection soit la premièe ligne du formulaire.

    De même la table est mise à jour comme si on avit sélectionné ces lignes.

    Je sais pas si c'est très clair, alors je recommence :
    Selection par balayage : OK à condition que le balayage inclu la première ligne du formulaire.
    Sinon, la sélection et la mise à jour se font sur un nombre de ligne identiques au nombre de lignes balayées par le selecteurs, mais décalées vers le haut pour rattraper la première ligne
    (attention, rien ne change dans le formulaire, c'est seulement la sélection qui se comporte bizarrement, ainsi que la mise à jour de la table pour laquelle on fait cette sélection)

    Bon si je fait tout ça, c'est pas parceque j'aime me prendre le chou, c'est parceque je souhaiterais que dans mon formulaire tabulaire, je puisse sélectionner un groupe de lignes (forcément contigues puisque à ma connaissance on ne peut pas, avec le selecteur, selectionner des lignes à droite et à gauche, comme dans le gestionnaire des fichiers par exemple, combinaison de CTRL+Clic et/ou SHIFT+Clic).

    Ensuite, grace à une mise à jour de la table et du formulaire, une case à cocher passerait à Vrai, indiquant que la ligne est sélectionnée.

    Enfin grace à un bouton sur chaque ligne, je pourrais enlever de la sélection les lignes dont je n'ai pas besoin.

    Si vous avez de meilleurs solutions pour parvenir à ce résultat...

    D'avance merci.

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Heu, personne ne sait comment faire des sélections multiples dans un formulaire, sans avoir à cocher toutes les lignes une par une ?

    Encore merci.

  18. #18
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    hello
    si tu choisis d'utiiser les cases à cocher, tu peux rajouter un bouton pour cocher/décocher tous les enregistrements du formulaire
    on peut aussi imaginer un bouton qui coche/décoche tous les enregistrements entre 2 numéros d'enregistrements, qu'on charge par click
    j'ai bricolé ce genre de comportement
    une case pour stocker le numéro de départ, une autre pour stocker le numéro d'arrivée, un bouton pour exécuter l'action de départ à arrivée
    quand on click sur un enregistrement, on charge d'abord départ, puis arrivée ou bien, en fonction de règles à définir, on recharge arrivée ou on recharge départ et ensuite il suffit de clicker le bouton pour exécuter l'action
    je peux t'envoyer le code de ces trucs là, voir même te bricoler ton formulaire, ou encore un petit exemple
    -------------------Simplifi----------comme si tout était simple--------

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Merci pour l'aide.

    Mon formulaire est à un stade trop imbriqué pour être diffusé sans devoir joindre les 5 ou 6 autres qui travaillent de concert, ainsi qu'un certain nombre de requêtes et surtout de tables.

    Si j'ai bien pigé, on clique sur la première ligne de la sélection, puis sur la dernière, et on peut imaginer que le clic sur le dernier bouton, avec comme condition qu'il y ait déjà eu un bouton de cliqué, que toutes les lignes entre soient considérées comme sélectionnées.

    Cela revient à ce que je peut faire avec mon sélecteur actuel, basé sur le code ci-avant, sauf que quand j'utilise MouseUp en lieu et place d'un bouton individuel pour lancer la procédure, ça débloque.

    En fait je pense que je me suis mal expliqué.

    Dans un gestionnaire de fichiers, quand on sélectionne plusieurs lignes, elle restent sélectionnées même si on déplace la souris pour en sélectionner d'autres, on peut voir qu'elles sont sélectionnées.

    Ce qui permet de faire une ou plusieurs autres opérations de sélection par bloc ou ligne par ligne.

    L'intérêt du sélecteur, c'est qu'on peut faire une sélection de bloc de lignes par balayage.

    Il faudrait juste modifier le code ci-avant pour que le code l'événement "Sur clic" du bouton se déclenche dès que l'on finit la sélection (soit à la fin d'un CTRL Clic), soit à la fin d'un balayage.

    Voilà comment je voyait les choses :

    Avec mon système du sélecteur, je prenais un gros bloc d'un seul tenant, et sur déplacement, cette sélection était mémorisées dans une table qui, grâce à une sélection "cochait" des cases pour indiquer leur sélection de masse.

    Ensuite je n'avais plus qu'à décocher les lignes en trop, ou éventuellement à recommencer une sélection plus bas avec le sélecteur.

    Enfin, une fois satisfait de ma sélection, je pourrais clique sur un bouton pour l'exporter, ou pourquoi pas sur un autre pour vider toute la sélection.

    En fait, il faut un système qui affiche une sélection, mais qui en plus l'écrive en dur dans une table.

    Pour l'instant, grâce au code ci-avant, c'est un bouton qui fait le boulot, et on ne peut sélectionner que soit une seule ligne, soit un bloc, et un seul, de lignes contiguës, et enregistrer tout le résultat dans un table…

    Encore une fois mon objectif est d'avoir un système le plus proche possible de ce qu'il est possible de faire dans un gestionnaire de fichier par exemple (y compris en intégrant des commandes sur CTRL+Clic et/ou SHIFT+Clic…)

    Je pense que ce doit être faisable avec des système du genre If CTRL+CLIC, BlaBlaBla, Then une certaine procédure de traitement, genre mise à jour d'une tables, ainsi les lignes déjà selectionnées ne seront pas recopiées une nouvelle fois…

    Par contre si quelqu'un à un piste, je suis preneur de code.

    Les extraits ci-avant sont tout à fait exploitable tels-quel, encore une fois merci LedZeppII, je vous assure que quand vous balayez 30 lignes, ou que vous en selectionnez 60 avec CTRL+Clic, et qu'avec un bouton, ça y est c'est parti, ça fait très bonne impression en réunion.

    Mais j'aimerais avoir quelque chose de plus souple, et de plus dynamique, bref plus proche des fonction de selection gestionnaire de fichier.

    Encore merci.

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour,
    Toujours dans l'optique de faire un système de sélection simple (pour l'usager du moins), j'ai continué mes tests.

    Pour reprendre l'exemple de LedZepII, j'ai recopié le code.
    Donc voici ce qui se passe :

    Le formulaire s'ouvre avec le focus sur le premier champ de la première ligne.
    On fait la sélection en cliquant sur la première ligne,
    On maintient appuyé et on glisse vers le bas ou vers le haut.
    Le sélecteur passe au noir pour les lignes sélectionnées.

    On appui sur le bouton.
    La table est mise à jour.
    Le sélecteur revient au neutre.
    Le premier champ de la première ligne du formulaire prend le focus.

    Si je clique sur une autre ligne, le focus disparaît, et je peut faire une autre sélection.

    Mon premier objectif :
    Que la sélection soit mémorisée lorsque je la fait et non plus quand je clique sur le bouton.

    J'ai remplacé le bouton par l'événement MouseUp.
    Donc voici ce qui se passe :

    Le formulaire s'ouvre avec le focus sur le premier champ de la première ligne.
    On fait sa sélection en cliquant sur la première ligne,
    On maintient appuyé et on glisse vers le bas ou vers le haut.
    Le sélecteur passe au noir pour les lignes sélectionnées.

    On relâche la souris en fin de sélection
    La table est mise à jour.
    Le sélecteur revient au neutre.
    Le premier champ de la première ligne du formulaire prend le focus.

    PROBLEME :
    En fait, voilà le résultat de ce nouveau mode de sélection : le système donne un résultat correspondant au nombre de lignes sélectionnées, mais à partir de la ligne où se trouvait le focus en début de sélection (soit généralement la première ligne).

    Exemple : si le focus est à la ligne 2, et que je sélectionne les lignes 7 à 11, le résultat sera la identique à la sélection des lignes 2 à 6.

    Si je clique sur une ligne avant d'utiliser le sélecteur, le problème ne se pose pas (enfin, il vaut mieux que je clique sur la première ligne de la sélection que je m'apprette à effectuer, sinon, le problème n'est que déplacé)

    Je n'arrive pas à comprendre pourquoi ça marche avec le bouton et pas avec un MousseUp.

    Je sais que c'est la faute au focus, puisqu'il est bien écrit "Dès qu'un contrôle prends le focus la sélection d'enregistrement disparaît.", mais le problème ne se pose pas quand on utilise un bouton, qui permet de faire des sélection n'importe où, y compris si le focus est sur le premier champ de la première ligne, ce qui se produit en fin de chaque sélection.

    Pourquoi diable, la sélection se fait-elle normalement avec le déclenchement de la précédure sur click, et pas sur MouseUp.
    La sélection est mémorisée en permanence par Form_MouseMove. C'est à dire qu'à tout moment, on peut lancer la mise à jour de la table en appuyant sur le bouton. Et bien moi, j'aimerais que ce soit lorsque je relache la souris.

    Je continue de chercher...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Critères de requêtes basées sur valeur de liste d'un formuliare
    Par 7guizz9 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 22/01/2008, 10h57
  2. une liste ou requête basée sur deux fichiers
    Par chapeau_melon dans le forum WinDev
    Réponses: 8
    Dernier message: 12/11/2007, 20h00
  3. [SimpleXML] comment faire une requête basée sur un namespace d'un attribut ?
    Par hansaplast dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 03/09/2007, 01h18
  4. requête basée sur des intervalles d'heures
    Par lieselotte02 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 02/06/2007, 21h23
  5. une requête basée sur un seul critère ?
    Par rangernoir dans le forum Access
    Réponses: 5
    Dernier message: 07/09/2005, 18h53

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