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 :

Se positionner sur le bon enregistrement [AC-2010]


Sujet :

IHM

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 145
    Points
    145
    Par défaut Se positionner sur le bon enregistrement
    Bonjour,

    J'ai un formulaire continu qui liste les notifications de maintenance d'un site et une variable publique qui stocke la notification en cours d''edition (Vloc.item dans le code ci-dessous). Quand j'ouvre le formulaire, j'aimerais que le curseur aille directement sur l'enregistrement en cours dans la liste. Pour cela, j'utilise, sur l'événement Open du formulaire, le code suivant :

    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
     
        'Déclarations
        Dim Vloc As New ObjVariables
        Dim strSQL As String
        Dim rst As DAO.Recordset
     
        strSQL = "OprMntBox1 = " & Chr(34) & Vloc.Item("VpTwParam1") & Chr(34)
        Me.Filter = strSQL
        Me.FilterOn = True
     
        'Se positionner sur la notification actuelle si elle est correspondante
        Set rst = Me.Recordset
        rst.FindFirst "OprMntKey = " & Chr(34) & Vloc.Item("VpOprRefActuel") & Chr(34)
        If Not rst.NoMatch Then
            'Notification concordante
            Me.Bookmark = rst.Bookmark
        End If
        Me.Parent.OprMntRef = Me.OprMntRef
    Comme on peut le constater, ce formulaire est inclus dans un autre (code me.parent ...).
    Si je piège ma notification, elle est bien trouvée et elle est bonne puisque j'ouvre un autre formulaire à partir justement du code me.parent.oprMntRef. De plus, en debug.print, le numéro de notification est bien trouvé et correct.
    Seulement, mon formulaire continu pointe toujours le premier enregistrement de la liste, disons qu'il pointe un autre enregistrement que celui qu'il trouve avec l'instruction rst.findFisrt .... il se positionne bien mais pointe mal !

    Je ne comprends pas surtout que j'utilise ce code ailleurs dans l'application et que là, ça fonctionne bien !

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 596
    Points
    24 596
    Par défaut
    Bonjour,

    Il y a une raison particulière pour que tu n'utilises pas les propriétés Champs père/Champ fils du container de sous-formulaire au lieu de cette mécanique de Filter ?

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 145
    Points
    145
    Par défaut
    Bonsoir,

    Oui j'utilise bien les liens champs père-fils mais à un autre niveau et c'est d'ailleurs grâce à ce lien que je sais que le rst.findFisrt fonctionne puisque je vois le détail de la notification sélectionnée dans ma liste de notifications s'afficher dans un sous formulaire. En fait, ce sont trois formulaires imbriqués dans un principal et quand je sélectionne une notification dans la liste, je renvoie son identification dans un champ masqué du formulaire parent qui est lui-même père du formulaire détail ...
    Un peu compliqué à écrire mais très facile à comprendre quand on le voit fonctionner.


    En fait, mon incompréhension est ailleurs : si la partie de code qui cale le bon enregistrement fonctionne bien (rst.findfisrt ...) je ne comprends pas pourquoi le pointeur reste sur le premier enregistrement de la liste ... Du coup, j'ai le pointeur dans la liste sur un enregistrement et le détail qui ne correspond pas au pointeur (mais qui correspond à la notification attendue !).
    Je pensais que me.recordset était une manière de manipuler le jeu d'enregistrements du formulaire ...

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 145
    Points
    145
    Par défaut Compléments ...
    Bon, j'explique le fonctionnement en entier et très synthétiquement :

    Je gère des interventions de maintenance (notifications). Chaque notification est découpée en phases.
    J'ai trois sous formulaires dans un formulaire principal. le premier sous formulaire est la liste des notifications (continu), le second est la liste des phases de la notification sélectionnée dans le premier sous formulaire (continu) et le dernier est le detail de la phase sélectionnée dans le second sous formulaire. Tout cela fonctionne très bien.
    Pour animer l'ensemble, j'ai mis un champ masqué au niveau du formulaire principal qui est renseigné quand je clique sur une notification dans la liste. Comme il y a une relation père-fils entre le second sous formulaire et le formulaire principal, le detail des phases s'affiche automatiquement. Quand je clique sur une phase, le troisième sous formulaire est activé avec le contenue de cette phase.

    Moi je cherche simplement à caler, dans la liste, la notification avec laquelle je travaille (qui peut être la 5eme par exemple) à l'ouverture de l'ensemble. Avec le code ci-dessus (ou ci-dessous ... ) , j'ai bien le detail des phases de la 5eme notification mais le sélecteur d'enregistrement dans la liste pointe le premier, c'est peu cohérent ...

    J'ai aussi essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Enrg = Me.CurrentRecord
        Me.Requery
        DoCmd.GoToRecord acActiveDataObject, , acGoTo, Enrg
    Mais je pointe toujours le premier enregistrement de ma liste !!!!

  5. #5
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Points : 8 489
    Points
    8 489
    Par défaut


    Bien que les explications soient claires et permettent de visualiser assez bien le fonctionnement mais j'ai un peu de mal à recréer chez moi ton process.
    Pourrais-tu mettre ta base en pièce jointe avec des données bidons. Ce sera plus simple
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 596
    Points
    24 596
    Par défaut
    Comme le dit Jeannot, c'est pas très clair en effet...
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  7. #7
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 145
    Points
    145
    Par défaut
    Merci à vous deux ...
    Mais vous êtes sûrs ?

    La base fait 25 Mo !!!!
    Elle est en production avec quelques bugs certes mais en production tout de meme ...
    C'est un gros machine maintenant avec plein de menus, bref pas evident si je vous explique pas comment ça fonctionne.

    Bon je vais tenter quelque chose et je vous redis.

    Merci encore pour votre aide ...

  8. #8
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 596
    Points
    24 596
    Par défaut
    Evidement on est pas sur du tout, en fait on aime bien perdre notre temps à demander des explications sur des montages qu'on comprend parfaitement. C'est juste une manière pour nous de consommer du temps inutilement à aider des gens qui sont bloqués dans leur boulot, c'est vrai qu'on rien d'autre à faire de nos journées, on travaille pas.

    Peut-être que si tu postais quelques copies d'écran pour étayer tes explications. Sinon regarde le lien dans ma signature celle en rouge.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  9. #9
    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 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    De ce que j'ai compris, il veut donner le focus à la ligne en cours dans le SF : en d'autres termes, s'il y a 100 lignes dans le sous-formulaire qui ne peut en afficher que 15 à la fois (par exemple) et que l'intervention en cours est la 76ème, il ne la voit pas dans la liste alors qu'elle semble être sélectionnée.

    Son souhait, faire en sorte que les lignes 61 76 (ou 65 à 80 ou...) soit affichées afin que l'intervention N° 76 soit visible...

    Est-ce bien ça ?

    Si oui, eh bien il te suffit sur l'événement Current() :
    • de focaliser le sous formulaire
    • de focaliser le champ clé qui serait utilisé pour localiser la ligne visée
    • de passer à cet événement le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.FindRecord p_strLastRecordValue, acAnywhere, False, acSearchAll, , acAll, True
    • avec une gestion d'erreur idoine (mais silencieuse) et où p_strLastRecordValue est une propriété public qui prend la valeur du champ de l'intervention en cours à chaque clique sur celle-ci ou bien sur un LostFocus ou un Exit (à toi de voir).


    Bon grossièrment, pour presque macher le travail, ça donnerait :
    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
     
    Private Sub Form_Current()
     
        On Error GoTo L_ErrForm_Current
        If Len(p_strLastRecordValue) > 0 Then
            Me.SousFormulaire.SetFocus
            Me.SousFormulaire.Form.ChampClé.SetFocus
            DoCmd.FindRecord p_strLastRecordValue, acAnywhere, False, acSearchAll, , acAll, True
            p_strLastRecordValue = ""
        End If
     
        On Error GoTo 0
    L_ExForm_Current:
        Exit Sub
     
    L_ErrForm_Current:
        Resume L_ExForm_Current
    End Sub
    Bon il existe d'autres méthodes, mais celle-ci est simple à mettre en oeuvre

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  10. #10
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 145
    Points
    145
    Par défaut
    Bonjour à tous,

    Je vous devais une réponse car vous avez été gentils de donner de votre temps pour moi.
    Cela fonctionne parfaitement grâce à la commande me.recordset puis findfirst ... comme écrit au départ !

    Mais comme vous l'aviez, à juste titre souligné, mon process était devenu trop complexe, instable et surtout difficile à maintenir.
    Je suis donc parti, sous votre impulsion, d'une page blanche pour réécrire le code mais en gardant mes imbrications de sous formulaires que je trouve trop sympa à utilizer pour moi.
    Et tout ce petit monde fonctionne très bien, sans défaut et plus rapidement que précédemment.

    Je pense que les dfférents sous formulaires devaient de mettre à jour l'un l'autre produisant ce défaut de calage d'un enregistrement précis.
    A vrai dire, je n'ai pas trouvé la cause réelle, mais je pense qu'une refonte du code était nécessaire.

    Merci à tous.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/08/2010, 16h55
  2. imossible de se positionner sur le dernier enregistrement
    Par adelsunwind dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/06/2009, 20h42
  3. Pointer sur le bon enregistrement Firebird et delphi2007
    Par makaphrodite dans le forum Bases de données
    Réponses: 4
    Dernier message: 22/01/2009, 10h31
  4. Réponses: 6
    Dernier message: 04/07/2006, 12h07
  5. Réponses: 2
    Dernier message: 21/06/2006, 16h18

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