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

11 réponses

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
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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
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
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
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
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
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