Ouvrir un formulaire Access dans deux onglets

thiefer -  
 thiefer -
Bonjour à tous,

j'ai un formulaire de menu [f_principal] composé d'un contrôle "CtlTab0" avec 5 onglets numérotés de 0 à 4.
Je souhaite ouvrir un second formulaire [f_gl] soit en mode ajout dans l'onglet 2, soit en mode modification / Suppression dans l'onglet 3
Je fais un traitement de recherche en onglet 0 et récupère mes résultats dans une zone de liste.
Au double click sur une ligne de la zone de liste, je récupère l'identifiant de mon enregistrement et programme :
docmd.openform "f_gl", acnormal,,strcriteria
cela fonctionne mais m'ouvre [f_gl] comme une fenêtre indépendante et je n'arrive absolument pas à le faire ouvrir en onglet 3.
Comment m'y prendre svp tout en sachant que lorsque je clique sur mon onglet 2, je souhaite ouvrir [f_gl] en mode ajout ?
La cerise sur le gâteau serait de pouvoir ne pas afficher les barres de navigation entre enregistrements ssi je suis dans ce mode ajout !!! Mais là, ce sera pour plus tard, c'est pas le plus important...

En tous les cas, si vous pouviez m'aider à résoudre mon problème parce que je planche dessus depuis plusieurs semaines sans trouver d'issue.
Donc même s'il fallait une solution alternative, je suis preneur de tout ce qui peut me sortir de là !!!

@ très bientôt et mille mercis par avance

TF
Configuration: Windows XP
Firefox 3.0.1

11 réponses

  1. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    Bon, j'ai une bonne nouvelle: En mode Entrée de données, tu es seulement en mode ajout, sans boutons de déplacement. Donc le point qui t'intéressait le moins est résolu...

    Pour le reste, je ne comprends pas trop. Qu'appelles-tu "fenêtre indépendante"? Comment voudrais tu que F_gl apparaisse? Parce que pour activer l'onglet 3, il suffit de d'atteindre un des contrôles qui s'y trouvent...
    0
  2. thiefer
     
    Salut Lately Geek et merci pour ton retour,

    alors je vais essayer de faire simple,
    sur f_principal, j'ai un onglet n°2 qui s'appelle Ajouter.
    en cliquant sur l'onglet, j'accède à f_gl, en mode ajout seulement (et sans les boutons de déplacement ;-) )
    en double cliquant sur une ligne de ma zone de liste lst_resultat en onglet n°0, recherche, je souhaite accéder à mon même formulaire f_gl mais sur l'onglet n°3 simplement en mode modif, suppr (allowadd = False ??). Je souhaite accéder donc à l'enregistrement que j'ai double cliqué don passage de la clef en paramètre strCriteria.

    C'est en fait cette utilisation une fois en mode add, une fois en mode edit, une fois en ouverture simple en cliquant sur mon onglet, une fois par Docmd.OpenForm que je n'arrive pas à résoudre.

    Comment dois-je m'y prendre stp ?

    Merci par avance

    TF
    0
  3. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    Après ta ligne DoCmd.OpenForm, tu ajoutes:

    Me.AllowAdditions = False pour empêcher les ajouts
    Me.AllowDeletions = False pour empêcher les suppressions ou
    Me.DataEntry = True pour mettre le formulaire en mode Entrée de Données.
    0
  4. thiefer
     
    Salut LatelyGeek,

    désolé pour le silence, j'ai eu maille à partir avec mon fournisseur d'accès, free pour ne pas le nommer...
    Me voici à nouveau connecté donc et je te reviens car j'ai remis un peu d'ordre dans mes formulaires et codes depuis ton assistance.
    Je commence à voir bcp plus clair mais il reste encore quelques points que je ne parviens pas à résoudre.
    Peut-être en te mentionnant quelques unes de mes lignes de codes pourras-tu me permettre de boucler la question.

    Voici donc le code du formulaire menu, f_principal qui me permet de naviguer d'onglet en onglet :
    Private Sub CtlTab0_Change()
        ' On récupère l'indice de l'onglet actif
        Select Case Me.CtlTab0
            Case 0  ' Rechercher
                Me.lbl_No_Onglet.Caption = Me.CtlTab0
                Me.ong_edit.Visible = False
                Me.ong_add_record.Visible = True
                
            Case 1  ' Statistiques
                Me.lbl_No_Onglet.Caption = Me.CtlTab0
                Me.ong_edit.Visible = False
                Me.ong_add_record.Visible = True
                
            Case 2  ' Ajouter un enregistrement
                Me.lbl_No_Onglet.Caption = Me.CtlTab0
                
                Me.AllowEdits = False
                Me.AllowDeletions = False
                Me.AllowAdditions = True
                Me.Dataentry = True
            
            Case 3  ' Modifier, Supprimer
                Me.lbl_No_Onglet.Caption = Me.CtlTab0
            
            Case 4  ' Quitter
                ' Maintien en affichage de l'onglet appelant = comportement Bouton
                If (Me.lbl_No_Onglet.Caption = "NoOnglet") Then
                    Me.CtlTab0 = 0
                    Else
                    Me.CtlTab0 = Me.lbl_No_Onglet.Caption
                End If
                
                ' Demande de validation cloture ou maintien de l'application ouverte
                If MsgBox("Souhaitez-vous quitter l'application en cours ?", vbApplicationModal + vbMsgBoxSetForeground + vbExclamation + vbYesNo + vbDefaultButton1, "Fermeture de l'application ") = vbYes Then
                    DoCmd.Close
                End If
        End Select
    End Sub


    le contrôle onglet ong_edit contient mon formulaire de traitement des données en mode édition avec les propriétés nom = f_editrecords et source = f_records
    le contrôle onglet ong_add contient mon formulaire de traitement des données en mode ajout avec les propriétés nom = f_addrecords et source = f_records

    Lorsque l'un de ces deux contrôles est actif, l'autre devient invisible et vice versa. Ce point fonctionne nickel.

    Le propriété par défaut de f_records sont :
    AllowEdits = False
    AllowDeletions = False
    AllowAdditions = True
    Dataentry = True

    Du code de mon formulaire de recherche (case 0) f_search :
    Private Sub lst_resultat_DblClick(Cancel As Integer)
    
    Dim rst As Recordset
    Dim strCriteria As String
    
    Set rst = CurrentDb.OpenRecordset("tbl_TempLstFrm", dbOpenSnapshot)
    ' recherche les informations de la table
    rst.FindFirst ("Table='" & Me.cbo_table & "'")
    
    If rst.NoMatch Then ' non trouvé
        MsgBox "Cette table ne possède pas de formulaire. Veuillez renseigner la table des paramètres.", _
                vbCritical + vbOKOnly, "formulaire de Recherche"
        Exit Sub
    Else ' trouvé
        If lf_GetTypeField(Me.cbo_table, rst.Fields("Champ")) = dbText Then 'la clef est Texte
             strCriteria = "'" & Me.lst_resultat & "'"
        Else 'la clef est numérique
            strCriteria = Me.lst_resultat
        End If
    
            Forms!f_principal!ong_edit.Visible = True
            Forms!f_principal!ong_add_record.Visible = False
            
            Forms!f_principal!CtlTab0.Value = 3
            
            Forms!f_principal!f_editrecord!No_enreg.Value = strCriteria
            Forms!f_principal.f_editrecord.Form.AllowEdits = True
            Forms!f_principal.f_editrecord.Form.AllowDeletions = True
            Forms!f_principal.f_editrecord.Form.AllowAdditions = False
            Forms!f_principal.f_editrecord.Form.Dataentry = False
    
            
    End If
    
    End Sub


    Lorsque je doucle click sur une ligne de ma zone de liste résultat de recherche, je récupère le numéro de l'enregistrement en strCriteria, j'active l'onglet d'édition et rend invisible celui d'ajout puis je cherche à affecter de nouvelles valeurs aux propriétés allow....

    Ce qui ne fonctionne pas :
    Il semble que, comme mon formulaire de traitement des données se trouve inclu dans un contrôle (l'onglet) du formulaire principal, je n'ai jamais aucun événement au niveau du formulaire d'édition.
    Je ne parviens donc pas à activer sur un quelconque événement une action de test dans mon formulaire pour savoir si j'accède en mode add ou edit.
    Donc, je ne sais pas non plus affecter ma variable strCriteria pour une éventuelle clause Select de positionnement sur l'enregistrement appelé.

    Suis-je bien clair...
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    Oh là, je viens ENFIN de comprendre que tu ouvres les formulaires dans les onglets. Je ne suis certaine que ça soit le plus simple.
    As tu essayé par exemple de mettre tous les formulaires dans le formulaire principal, sans onglets, avec les propriétés Add, Edit etc qui t'intéressent, par défaut invisibles et de les rendre visibles quand tu en as besoin?

    Ca ne correspond peut-être pas à ce que tu recherches, mais vu que je ne sais même pas de quoi traite ta base, je suis un peu à tâtons...
    0
  7. thiefer
     
    Salut LatelyGeek,

    Ma base reprend les données de mes entraînements et compétitions sportives pour les activités que je pratique.

    Au début, j'avais une structure classique avec un formulaire menu qui à l'aide de boutons appelaient successivement les formulaires dont j'avais besoin par des Docmd.OpenForm en mode add ou edit, selon le besoin.
    Cela fonctionnait bien mais j'ai voulu rendre l'appli un peu plus sexy ;-)
    Du coup je me frotte pour la première fois au contrôle onglet et je ne maîtrise pas franchement...

    J'ai positionné des msgbox pour comprendre les événements activés.
    Il se trouve donc que mon formulaire de traitement des données, f_recors est bien ouvert et activé par deux fois donc par l'onglet ong_add et par l'onglet ong_edit.
    Comme dans chacun des deux cas il a un nom différent, cela fonctionne.

    Maintenant, ce que je ne parviens pas à faire, c'est d'en modifier les propriété car je ne sais pas, ni où, ni quand, ni comment le faire.
    De plus, si je suis par exemple en mode ajout, j'aimerai en sélectionnant mon parcours qu'il me propose un distance moyenne calculée des anciennes course sur ce trajet, chose à ne pas reproduite en mode edit où il doit afficher l'enregistrement appelé tel qu'il figure en bdd.
    Juste cet exemple pour dire que mon point est de parvenir à détecter soit le mode appelant soit le type de fonctionnement pour déclencher ou non un traitement ou un appel via select...

    Suis-je tjs clair ??? !!! .....

    Même moi je finis par me demander, c'est dire...

    TF
    0
  8. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    Noralement, si tu fais Me!f_editrecord.Form.DataEntry = False, ça devrait fonctionner. Chez moi, ça fonctionne en tout cas.
    0
  9. thiefer
     
    C'était aussi une des hypothèse que j'avais testé.
    Malheureusement, il me popup erreur d'exécution 2465
    "Impossible de trouver le champ 'f_editrecord' auquel il est fait référence dans votre expression

    Sighhh !!
    Je vais pas m'en sortir de ce bousin !!!

    Code du module form_f_search
            Forms!f_principal!ong_edit.Visible = True
            Forms!f_principal!ong_add_record.Visible = False
            
            Forms!f_principal!CtlTab0.Value = 3
            
            'Forms!f_principal!f_editrecord!No_enreg.Value = strCriteria
    
            Me!f_editrecord.Form.AllowEdits = True
            Me!f_editrecord.Form.AllowDeletions = True
            Me!f_editrecord.Form.AllowAdditions = False
            Me!f_editrecord.Form.Dataentry = False
    0
  10. thiefer
     
    rectificatif,

    cela fonctione en remplaçant Me. par Forms!f_principal.

    Donc mon code est devenu
            Forms!f_principal!ong_edit.Visible = True
            Forms!f_principal!ong_add_record.Visible = False
            
            Forms!f_principal!CtlTab0.Value = 3
            
            'Forms!f_principal!f_editrecord!No_enreg.Value = strCriteria
            Forms!f_principal!f_editrecord.Form.AllowEdits = True
            Forms!f_principal!f_editrecord.Form.AllowDeletions = True
            Forms!f_principal!f_editrecord.Form.AllowAdditions = False
            Forms!f_principal!f_editrecord.Form.Dataentry = False


    Mille mercis !!

    un dernier bon geste m'sieurs dames ;-)

    Comme tu le vois, j'ai laissé en commentaire le passage de critère.
    En effet, lorsque je l'active il me mentionne erreur 3164, le champ ne peut pas être mis à jour.
    Ben je sais !!! C'est pas c'que j'te demande !!!
    J'veux juste que tu te positionnes sur l'enregistrement.

    En fait je lui passe en commentaire la clef de l'enregistrement que je souhaite atteindre.

    Est-ce que tu saurais d quelle façon je dois m'y prendre.
    J'avais l'habitude de critère du Docmd.OpenForm pour cela mais je n'ai plus l'option.

    En fait, il faudrait que je puisse lui dire quelques chose dans le genre
    select * from tbl_donnees where no_enreg = strCriteria
    0
  11. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    Est ce que tu as essayé de baser f_editrecord sur une requête prenant le N°enregistrement comme critère, et faire un DoCmd.ShowAllRecords Après MAJ de ta liste?
    0
  12. thiefer
     
    Salut à tous et un grand merci à toi, LatelyGeek,

    Tout fonctionne parfaitement à présent,
    la solution consistait à utiliser la propriété de formulaire filter.

    La structure est donc la suivante :
    un formulaire f_principal contenant des sous-formulaire indépendants dans chacun de ses onglets.
    Le sous formulaire f_search contient une zone de liste.
    en double cliquant sur l'un de ces enregistrements, on affiche le sous-formulaire f_records en mode édition
            Forms!f_principal!ong_edit.Visible = True
            Forms!f_principal!ong_add_record.Visible = False
    
            Forms!f_principal!CtlTab0.Value = 3
    
            Forms!f_principal!f_editrecord.Form.AllowEdits = True
            Forms!f_principal!f_editrecord.Form.AllowDeletions = True
            Forms!f_principal!f_editrecord.Form.AllowAdditions = False
            Forms!f_principal!f_editrecord.Form.Dataentry = False
    
            Forms!f_principal!f_editrecord.Form.Filter = strCriteria
            Forms!f_principal!f_editrecord.Form.FilterOn = True


    Extrait du code de f_principal pour permettre l'utilisation du même sous-formulaire f_records en mode ajout
    Private Sub CtlTab0_Change()
    
        Select Case Me.CtlTab0
    
            Case 0  ' Rechercher
                Me.lbl_No_Onglet.Caption = Me.CtlTab0
                Me.ong_edit.Visible = False
                Me.ong_add_record.Visible = True
                
                Forms!f_principal!f_editrecord.Form.FilterOn = False
    
    
            Case 2  ' Ajouter un enregistrement
                Me.lbl_No_Onglet.Caption = Me.CtlTab0
                
                Forms!f_principal!f_addrecord.Form.AllowEdits = False
                Forms!f_principal!f_addrecord.Form.AllowDeletions = False
                Forms!f_principal!f_addrecord.Form.AllowAdditions = True
                Forms!f_principal!f_addrecord.Form.Dataentry = True
            
    
        End Select
    End Sub
    0