Bonjour!
Je suis présentement en train de développer une base de donnée pour la gestion d'un centre de conditionnement physique basée sur Access. J'aurais besoin de votre aide pour ce qui suit :
Dans l'interface principal (formulaire client), j'ai un onglet. Cet onglet contient 5 pages : "Informations personnelles", "Gestionnaire d'entraînement", "Outils divers", "Rapports disponibles" et "Comptes clients". La page "Gestionnaire d'entraînement" comporte un sous-formulaire. Il s'agit en fait d'une liste (formulaire continu) des programmes d'entraînements créés pour le client. Un programme d'entraînement a une certaine durée de vie... Ainsi, au bout d'un certain temps, il devient périmé, on doit alors en créer un nouveau pour le client. L'intérêt d'afficher tous les programmes d'entraînements actifs et périmés est qu'il est possible de consulter ceux-ci à n'importe quel moment.
Or, il est préférable de toujours afficher (sélectionner) le programme d'entraînement actif (ou le dernier actif). Ainsi, j'ai programmé quelques lignes de codes qui permettent de trouver le dernier programme d'entraînement actif pour le client, de sélectionner (focus) le sous-formulaire et d'atteindre l'enregistrement. Ce code s'exécute chaque fois que l'utilisateur change de fiche-client (passe d'un client à un autre dans le formulaire principal). Le code fonctionne très bien, même s'il m'apparaît plutôt lourd.
Pour vous mettre en contexte, l'utilisateur peut se trouver dans n'importe quelle page de l'onglet alors qu'il lance l'évènement. Ainsi, s'il se trouve dans l'onglet "Gestionnaire d'entraînement", tout se passe bien. Mais, s'il se trouve dans un autre onglet, l'onglet "Informations personnelles" par exemple, un problème survient. D'un point de vue technique, tout va bien. Mais, l'exécution du code à cet occasion crée une indésirable apparition du sous-formulaire (liste des programmes d'entraînements) en plein milieu de la page "Informations personnelles", où il ne devrait pas être visible. Ainsi, l'aspect esthétique en prend un coup.
------------------------
------------------------Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Cela s'explique par le fait que, pour atteindre l'enregistrement recherché (programme d'entraînement actif, ou le dernier), je dois d'abord exécuter les lignes de code suivantes : Dim VarRefProgramme As Integer Dim VarRefClients As Integer VarRefClients = Me.Ref_Clients.Value DoCmd.SetWarnings False DoCmd.RunSQL "DELETE * FROM T_Programmes_Temporary" (vide une table temporaire servant à trouver l'enregistrement en question) DoCmd.RunSQL "INSERT INTO T_Programmes_Temporary SELECT T_Programmes.* FROM T_Programmes WHERE T_Programmes.Ref_Programme <> 0 And T_Programmes.Actif like '-1' And T_Programmes.Ref_Clients like '" & VarRefClients & "';" (Sélectionne le dernier programme d'entraînement actif et l'envoie dans la table temporaire "T_Programmes_Temporary" pour indentification) Dim VarDcount As Integer VarDcount = DCount("[Ref_Programme]", "T_Programmes_Temporary") (Vérifi s'il y a un programme d'entraînement actif) SQEL - "SELECT T_Programmes_Temporary.* FROM T_Programmes_Temporary;" Set Bds = CurrentDb Set rdst = Bds.OpenRecordset(SQEL) rdst.MoveFirst VarRefProgramme = rdst.fields("Ref_Programme").Value (stock le numéro du programme d'entraînement dans la variable "VarRefProgramme") rdst.close Set Bds = Nothing
'Ce qui suit pose problème, puisqu'il y a focus du sous-formulaire et donc perturbation de l'interface du formulaire principal si l'onglet est dans une page autre que dans laquelle le sous-formulaire en question se trouve.
Forms!MainForm!SubForm.SetFocus
Forms!MainForm!SubForm!Ref_Programme.SetFocus (champ où je recherche une expression)
DoCmd.FindRecord VarRefAbonnement, ,True, , True (atteindre l'enregistrement stocké dans "VarRefAbonnement")
Quelqu'un pourrait-il me donner une solution ou une piste de solution svp? Il y a des jours que je recherche sur ce sujet et je ne trouve rien.
Pistes de solutions proposées de mon cru (mais j'ignore si c'est possible) :
1. Atteindre l'enregistrement du sous-formulaire sans passer par un SetFocus.
2. Geler l'affichage à l'écran jusqu'à ce que tout soit fin prêt à afficher.
Merci de votre attention!