web-dev-qa-db-fra.com

Faire en sorte que la fonction "DoCmd.GoToRecord" fonctionne sur un sous-formulaire

J'ai utilisé la fonction DoCmd.GoToRecord , , acNewRec avec succès pour créer et déplacer un nouvel enregistrement dans un sous-formulaire (avec une table comme source). Cependant, lorsque j'essaie de faire la même chose à partir du formulaire parent, cela ne fonctionne pas. J'ai essayé différentes approches, notamment:

Me.sbfrm_subform.Controls("ctrName").SetFocus
DoCmd.GoToRecord , , acNewRec

qui met uniquement le focus sur le contrôle (ctrName), mais ne parvient pas à ajouter et aller à un nouvel enregistrement, ou

DoCmd.GoToRecord acDataForm, Me.sbfrm_subform.Form.Name, acLast

Ce qui renvoie l'erreur d'exécution 2489, "L'objet sbfrm_subform de l'objet n'est pas ouvert."

11
Kambiz

Essayez de placer le code dans le sous-formulaire, puis appelez-le depuis le parent:

Code de sous-formulaire:

Sub GoToNewRecord()
     DoCmd.GoToRecord , , acNewRec
End Sub

Code de formulaire parent:

Me.sbfrm_subform.GoToNewRecord
6
dennythecoder

Essayez de fractionner les opérations: 

Me.[sbfrm_subform].SetFocus
DoCmd.GoToRecord, , acNewRec

Alternativement, vous pouvez essayer de créer un sous-public dans le sous-formulaire, et puisque cela devient une méthode du formulaire, vous pouvez l'utiliser.
En utilisant ceci sur les versions récentes d'Access, vous pouvez même essayer de jouer directement avec le jeu d'enregistrements du formulaire, comme Me.Recordset.Movenext.

9
Patrick Honorez

Comme l'a noté iDevlop, vous pouvez utiliser l'objet Recordset du sous-formulaire pour passer à un nouvel enregistrement. Cependant, vous n'avez pas besoin de créer un sous-public dans le sous-formulaire. Vous faites tout à partir du formulaire principal:

Me.[subform control name].SetFocus
Form_[subform form name].Recordset.AddNew

Pour utiliser la syntaxe Form_ [nom du formulaire], le formulaire doit comporter un module de code VBA. Si le formulaire n'en contient pas et que, pour une raison quelconque, vous êtes opposé à la création d'un formulaire vide, vous pouvez utiliser la syntaxe Forms! MyForm.SubformControl.Form. Mais Form_ [Nom du formulaire] est plus simple.

4
Neil Ginsberg

J'ai fait la procédure événementielle suivante sous la forme principale "On Current":

Private Sub Form_Current()
    Me.SubformName.SetFocus
    Me.SubformName.Requery
    RunCommand acCmdRecordsGoToLast
    DoCmd.GoToRecord , , acNewRec
    Scan.SetFocus
End Sub

Le DoCmd est pour le formulaire principal pour commencer un nouvel enregistrement. Tout ce qui précède consiste à définir le sous-formulaire sur le dernier enregistrement ET à le régénérer pour que les données soient actualisées. 

1
alinakb

Ce qui a fonctionné pour moi est: Après avoir défini le jeu d’enregistrements, j’utilise la fonction AddNew du jeu d’enregistrements.

Public Sub GoToNewRecord()
   Me.<myTextbox>.SetFocus

   Dim rcClone as Recordset
   Set rcClone = Me.Recordset

   rcClone.AddNew
End Sub
0
Matthew McKinney
Private Sub anycotrl()
Me.yoursubformname_subform.SetFocus
DoCmd.GoToControl ("[anycontrolyouneed]")
DoCmd.GoToRecord , , acLast
End Sub
0
Osama Kadora

Voici comment j'ai résolu mon problème ...

le nom du formulaire principal est FRM_Trader_WorkSheet

Le nom du sous-formulaire est Frm_Trader_Worksheet_Sub

Sur l'événement ouvert de mon formulaire principal, j'ai codé comme suit:

Private Sub Form_Open(Cancel As Integer)
  Me.Frm_Trader_Worksheet_Sub.SetFocus   
  DoCmd.GoToRecord , , acLast    
  DoCmd.GoToRecord , , acNext    
End Sub

Étant donné que je ne saisis aucune donnée dans mon formulaire principal, mon formulaire principal s'ouvre et met l'accent sur un nouvel enregistrement de mon sous-formulaire. Je peux maintenant revenir aux enregistrements précédents si nécessaire, mais je suis prêt à saisir de nouvelles données lorsque le formulaire principal est chargé.

Cela dit, vous pouvez obtenir les mêmes résultats en définissant simplement la propriété du sous-formulaire sous l'onglet Données "Saisie de données = OUI. La seule différence est que vous n'aurez plus accès aux enregistrements précédents ...

0
Daniel

La réponse est d'utiliser l'une des lignes suivantes:

DoCmd.RunCommand acRecordsGotoNew
DoCmd.RunCommand acRecordsGotoNext
DoCmd.RunCommand acRecordsGotoPrevious
DoCmd.RunCommand acRecordsGotoFirst
DoCmd.RunCommand acRecordsGotoLast

En fonction de ce que vous voulez faire. Cela revient fonctionnellement à cliquer sur l’un des boutons de navigation s’ils sont laissés visibles.

Si vous appelez l'un de ceux-ci à partir du formulaire parent, vous devez d'abord définir le focus sur le sous-formulaire avec la ligne suivante.

Me.subform_name.SetFocus

Malheureusement, il ne semble pas exister de commande permettant d'accéder à une position absolue dans le jeu d'enregistrements, ce qui compléterait l'ensemble des possibilités.

0
Sean Hare