wake-up-neo.com

Wie kann ich ein Unterformular von einem anderen Formular anfordern?

Ich habe selbst mit diesem Problem zu kämpfen, dann mit etwas Hilfe und suche danach; aber ich hatte kein glück. Also entschied ich mich zu fragen.

Ich habe zwei Formulare in Access 2007 nennen wir sie MainForm und EntryForm.
MainForm verfügt über ein Unterformular und eine Schaltfläche. Die Schaltfläche öffnet die EntryForm im Add-Modus. Was ich tun möchte, ist, wenn die EntryForm den neuen Datensatz speichert, der das Unterformular in MainForm aktualisiert (Requery).

Ich habe diesen Setup-Code ausprobiert

Private Sub cmdSaveAndClose_Click()
    DoCmd.Save

    'requery list
    Forms![MainForm]![subformName].Requery

    '' I've also tried these
    'Forms![MainForm]![subformName].Form.Requery
    'Forms.("MainForm").[subformName].Requery
    'Forms.("MainForm").[subformName].Form.Requery


    DoCmd.Close
End Sub

Keiner dieser Versuche scheint zu funktionieren. Gibt es eine Möglichkeit, diese Anforderung zu erstellen? Vielen Dank für die Hilfe im Voraus.

11
Tony L.

Nur ein Kommentar zur Vorgehensweise:

Sie machen Ihr EntryForm dauerhaft an das Formular gebunden, von dem Sie es anrufen. Ich denke, es ist besser, wenn Formulare nicht an einen solchen Kontext gebunden sind. Ich würde das Requery aus der Save/Close-Routine entfernen und stattdessen die EntryForm mit dem acDialog-Schalter modal öffnen:

  DoCmd.OpenForm "EntryForm", , ,"[ID]=" & Me!SubForm.Form!ID, , acDialog
  Me!SubForm.Form.Requery

Auf diese Weise ist EntryForm nicht auf die Verwendung in einem Kontext beschränkt. Die Alternative besteht darin, EntryForm mit etwas zu verkomplizieren, das kenntlich macht, welches Formular es geöffnet hat und was erneut angefordert werden muss. Ich denke, es ist besser, so etwas in dem Kontext zu halten, in dem es verwendet wird, und den Code des aufgerufenen Formulars so einfach wie möglich zu halten.

Vielleicht ist hier ein Prinzip so, dass jedes Mal, wenn Sie ein Formular mithilfe der Forms-Sammlung aus einem anderen Formular anfordern, etwas für Ihre Architektur nicht stimmt - dies sollte meiner Meinung nach selten vorkommen.

9
David-W-Fenton

Sie müssen den Namen des Unterformular-Steuerelements verwenden, nicht den Namen des Unterformulars, obwohl diese häufig gleich sind:

 Forms![MainForm]![subform control name Name].Form.Requery

Oder wenn Sie sich auf dem Hauptformular befinden:

 Me.[subform control name Name].Form.Requery

Weitere Informationen: http://www.mvps.org/access/forms/frm0031.htm

14
Fionnuala

Ich habe mehrere Lösungen ausprobiert, aber keine Lösung für mein Problem.

Me.subformname.Anfrage

Es hat gut für mich funktioniert. Viel Glück.

2
user1603444

Ich habe gerade festgestellt, dass wenn die Quelltabelle für ein Teilformular mit adodb aktualisiert wird, es eine Weile dauert, bis der Requery die aktualisierten Informationen finden kann. 

In meinem Fall fügte ich einige Datensätze mit 'dbconn.execute "sql"' hinzu und fragte mich, warum der Befehl requery in vba nicht zu funktionieren scheint. Beim Debugging funktionierte der Requery. Ein 2-3 Sekunden langes Warten im Code wurde hinzugefügt, um zu testen, ob es einen Unterschied macht.

Das Ändern auf 'currentdb.execute "sql" hat das Problem jedoch sofort behoben. 

0
Hannu T

Alle Ihre Kontrollen gehören uns!

Fionnuala antwortete richtig, aber Skimmer wie ich würden es leicht finden, den Punkt zu verfehlen.

Sie aktualisieren das Unterformular nicht, Sie aktualisieren das Unterformular CONTROL. Wenn Sie mit allforms () prüfen, wird die Unterform in Bezug auf den Zugriff nicht einmal geladen.

Sehen Sie sich im Hauptformular die Beschriftung an, die der Assistent für Unterformulare bereitgestellt hat, oder wählen Sie das Unterformular aus, indem Sie einmal oder in den Rahmen klicken und in den Eigenschaften auf der Registerkarte "Andere" die Überschrift überprüfen. Dies ist der Name, den Sie für die Anforderung verwenden, nicht der Name des Formulars, das im Navigationsbereich angezeigt wird.

In meinem Fall hatte ich ein Unterformular mit dem Namen frmInvProdSub und habe viele Stunden lang versucht, herauszufinden, warum Access nicht glaubte, dass es existiert. Ich habe aufgegeben, das Formular gelöscht und neu erstellt. Der allerletzte Schritt besteht darin, anzugeben, wie Sie das Steuerelement aufrufen möchten. Ich habe es also frmInvProdSub genannt und den Assistenten beendet. Dann habe ich es versucht und voila, es hat funktioniert!

Als ich mir den Formularnamen im Navigationsfenster ansah, stellte ich fest, dass ich vergessen hatte, "Sub" in den Namen einzufügen! Dann hat es geklickt. Das Steuerelement heißt frmInvProdSub, nicht das Formular, und die Verwendung des Steuerelementnamens funktioniert.

Natürlich, wenn beide Namen identisch sind, dann hatten Sie dieses Problem nicht lol.

0
user3758018

Ich hatte ein ähnliches Problem, aber mit einigen Unterschieden ...

In meinem Fall verfügt mein Hauptformular über ein Steuerelement (Hersteller), welchen Wert ich zum Aktualisieren einer Abfrage in meiner Datenbank verwendet habe, und zwar unter Verwendung des folgenden Codes:

Sub Set_Qry_PedidosRealizadosImportados_frm(Vd As Long)
Dim temp_qry As DAO.QueryDef

'Procedimento para ajustar o codigo do cliente na Qry_Pedidos realizados e importados
'Procedure to adjust the code of the client on Qry_Pedidos realizados e importados
Set temp_qry = CurrentDb.QueryDefs("Qry_Pedidos realizados e importados")
temp_qry.SQL = "SELECT DISTINCT " & _
            "[Qry_Pedidos distintos].[Codigo], " & _
            "[Qry_Pedidos distintos].[Razao social], " & _
            "COUNT([Qry_Pedidos distintos].[Pedido Avante]) As [Pedidos realizados], " & _
            "SUM(IIf(NZ([Qry_Pedidos distintos].[Pedido Flexx], 0) > 1, 1, 0)) As [Pedidos Importados] " & _
            "FROM [Qry_Pedidos distintos] " & _
            "WHERE [Qry_Pedidos distintos].Vd = " & Vd & _
            " Group BY " & _
            "[Qry_Pedidos distintos].[Razao social], " & _
            "[Qry_Pedidos distintos].[Codigo];"
End Sub

Seit dem Beginn war meine Quelle für ein Teilformular die Abfrage "Qry_Pedidos realizados e importados".

Die einzige Möglichkeit, die Daten des Unterformulars im Hauptformularkontext zu aktualisieren, bestand darin, die Datenquelle des Unterformulars für sich selbst zu aktualisieren, wie im Folgenden beschrieben:

Private Sub cmb_vendedor_v1_Exit(Cancel As Integer)
'Codigo para atualizar o comando SQL da query
'Code to update the SQL statement of the query 
    Call Set_Qry_Pedidosrealizadosimportados_frm(Me.cmb_vendedor_v1.Value)

'Codigo para forçar o Access a aceitar o novo comando SQL
'Code to force de Access to accept the new sql statement
    Me!Frm_Pedidos_realizados_importados.Form.RecordSource = "Qry_Pedidos realizados e importados"
End Sub

Schließlich war keine Aktualisierung, Neuberechnung, Neuanforderung usw. erforderlich ...

0
Leo

Beim Schließen und Öffnen führt das Hauptformular normalerweise alle zugehörigen Abfragen (einschließlich der mit dem Unterformular verbundenen) aus. Ich hatte ein ähnliches Problem und habe dieses Problem behoben, indem ich die Schaltfläche zum Speichern des Befehls beim Klickereignis hinzugefügt habe.

DoCmd.Close acForm, "formname", acSaveYes
DoCmd.OpenForm "formname"
0
Vitanov