2 Stimmen

Wie verknüpfe ich Formulare in Access? (Werte zwischen ihnen weitergeben)

Ich verwende Access 2007 und habe ein Datenmodell wie folgt...

Passagier - Buchungen - Ziele

Also kann ein Passagier viele Buchungen haben, jeweils für ein Ziel.

Mein Problem...

Ich kann ein Formular erstellen, um die Eingabe von Passagierdetails zu ermöglichen, aber dann möchte ich eine NÄCHSTE Schaltfläche hinzufügen, um mich zu einem Formular zu bringen, um die Details der Buchung einzugeben (d.h. nur eine einfache Dropdown-Liste der Ziele). Ich habe die NÄCHSTE Schaltfläche hinzugefügt und sie hat die Ereignisse von

RunCommand SaveRecord
OpenForm   Destination_form

ABER, ich kann nicht herausfinden, wie ich den Primärschlüssel des Passagiers, der gerade eingegeben wurde (PassagierID), an das neue Formular übergeben kann.

Ich würde gerne nur ein Formular haben, das die Eingabe der Passagierdetails und die Auswahl eines Ziels ermöglicht, um dann die Einträge in den 2 Tabellen (Passagier & Buchungen) zu erstellen, aber ich bekomme es auch nicht hin.

Kann mir bitte jemand helfen?

Danke Jeff Porter

7voto

Albert D. Kallal Punkte 30379

Eigentlich ist der beste Vorschlag, den ich hier geben kann, tatsächlich, keine Parameter zu übergeben. Einfach in Ihrem Formular im on-Open Event oder noch besser im späteren onLoad Event ist es einfach, eine Referenz in Ihrem Code zum VORHERIGEN aufrufenden Formular zu nutzen. Das Schöne an diesem Ansatz ist, dass wenn Sie im Laufe der Zeit von einem Parameter auf 10 Parameter gehen, dann müssen Sie den Parameter-Analysecode nicht ändern und müssen noch nicht einmal den Aufrufcode ändern. Tatsächlich gibt es überhaupt keinen Code zu ändern, wenn Sie sich dazu entscheiden, vorherige Werte aus dem aufrufenden Formular zu untersuchen.

Also, denken Sie daran, die Verwendung von offenen Argumenten ist nur eine Einbahnstraße. Sie können es nicht verwenden, um Werte an das aufrufende Formular zurückzugeben. Außerdem müssen alle offenen Argumentparameter Zeichenfolgen sein. Sie verlieren also die Möglichkeit, Datentypen wie Ganzzahlen oder sogar Datum- und Zeitformatierungen zu verwenden, was ziemlich problematisch zu analysieren sein kann. Und wie Sie im Beispiel sehen können, kann der Code zum Analysieren von Zeichenfolgen ein wenig unordentlich werden.

Die einfache Lösung besteht darin, in jedem Formular, in dem Sie Werte aus dem VORHERIGEN Formular benötigen, eine Modulniveau-Variable wie folgt zu deklarieren

Dim frmPrevous as Form.

Dann in Ihrem Formular im onLoad-Event heben Sie ganz einfach den Namen des vorherigen Formulars auf:

Set frmPrevious = Screen.ActiveForm

Das ist es. Wir sind fertig!

Wir haben hier nur eine Zeile Code geschrieben (ok, zwei, wenn man die Deklarationsanweisung mitzählt). Ab diesem Punkt können Sie in jedem Teil Ihres Formularcodes auf die Ereigniseigenschaften, Felder oder Werte im vorherigen Formular verweisen, indem Sie folgendes tun

Msgbox "Primärschlüssel-ID des vorherigen Formulars = " & frmPrevious.ID

Und nehmen wir an, aus irgendeinem Grund möchten Sie, dass das vorherige Formular Datensätze neu lädt, wie in einem fortlaufenden Formular. Dann können wir gehen:

frmPrevious.NeuAbfragen

Oder, zwingen Sie eine Datenspeicherung:

frmPrevious.Dirty = false

Also wird das oben Genannte fast so natürlich und praktisch wie die Verwendung von "ME" in Ihrem aktuellen Code. Ich finde das so einfach und einfach, dass ich denke, dass dies von vornherein Teil von Access sein sollte.

Und wie erwähnt, sind die Anwendungsmöglichkeiten endlos, ich kann JEDE Spalte oder jeden Wert aus dem aufrufenden Formular überprüfen. Sie können sogar Variablen und Funktionen als öffentlich deklarieren, und dann können sie verwendet werden.

Und beachten Sie, dass dies BEIDEN WEGE funktioniert. Ich kann Werte im aufrufenden Formular speichern und ändern. So kann ich den Wert einer beliebigen Spalte/Steuerung im aufrufenden Formular aktualisieren oder ändern.

Und es ist absolut keine Analyse erforderlich. Darüber hinaus funktioniert der obige Code-Schritt selbst dann, wenn dasselbe vorhandene Formular von verschiedenen Formularen aufgerufen wird. In allen Fällen kann die aufrufende ID des Formulars ohne Änderung Ihres Codes abgerufen werden.

Und sogar im Falle, dass ich viele verschiedene Formulare starte und dieses bestimmte Formular aufrufe, können Sie die ID-Spalte immer noch herausziehen. Und wenn die Spalten aus verschiedenen Formen unterschiedlich sein könnten, können Sie einfach öffentliche Variablen oder öffentliche Funktionen in den aufrufenden Formularen mit dem GLEICHEN Namen deklarieren. Dann können wir gehen:

Msgbox "Erstellungsdatum des aufrufenden Formulars Datensatz = " & frmPrevous.DateCreated

Also kann das Erstellungsdatum eine öffentliche Variable oder eine öffentliche Funktion im vorherigen Formular sein, die jede erdenkliche Spalte aus der Datenbank sein kann.

Übergeben Sie also keine Werte zwischen Formularen, sondern übergeben Sie einfach eine Referenz zum aufrufenden Formular. Dies ist nicht nur spektakulär flexibler als die hier gezeigten anderen Methoden, sondern auch ein objektorientierter Ansatz, bei dem Sie nicht auf die Übertragung von Werten beschränkt sind.

Sie können AUCH Werte im aufrufenden Formular zurückgeben, indem Sie einfach den Wert einer beliebigen Steuerung festlegen, die Sie möchten (frmPrevous.SomeContorlName).

Und wie erwähnt, sind Sie nicht auf das Übertragen von Werten beschränkt, sondern haben vollen Zugriff auf Code, Eigenschaften wie Dirty und alles andere, was im aufrufenden Formular vorhanden ist.

Ich habe als Standard-Codierungspraxis das oben Genannte für fast jedes Formular übernommen. Ich deklariere und richte einfach die Formularreferenz ein. Dadurch erhalten Sie eine praktische vorherige Formulareferenz, die beim Schreiben von Code genauso nützlich ist wie die "ME"-Referenz.

Mit diesem Codierungsstandard kann ich den Code zwischen verschiedenen Formularen mit unterschiedlichen Namen kopieren und einfügen, und im Allgemeinen wird mein Code weiterhin ohne Änderung ausgeführt.

Und als weiteres Beispiel haben alle meine Formulare eine öffentliche Funktion namens MyDelete, die natürlich den Datensatz im Formular löscht. Wenn ich also aus irgendeinem Grund den Datensatz im vorherigen aufrufenden Formular löschen möchte, ist es ein einfaches Vorgehen, das Folgende zu tun

frmPrevious.MyDelete

Ich kann also Daten im vorherigen Formular speichern. Ich kann das vorherige Formular neu abfragen, ich kann Code im vorherigen Formular ausführen, ich kann Werte an das vorherige Formular zurückgeben, ich kann Werte und ALLE Spalten untersuchen, und das alles für den Preis von nur einer einzigen lächerlichen Codezeile, die eine Referenz zum aufrufenden Formular setzt.

1voto

Carlos Punkte 11

Das mache ich, indem ich Eigenschaften im Formular mit "Property Let" und "Property Get" definiere und Werte an diese Eigenschaften übergebe, nachdem das Formular geöffnet wurde, wie folgt:

im Zielformular:

Dim strCallingForm As String
Dim lngKey As Long

Public Property Get callingform() As String
    callingform = strCallingForm
End Property

Public Property Let callingform(NewValue As String)
    strCallingForm = NewValue
End Property

Public Property Let PrimaryKey(NewValue As Long)
    lngKey = NewValue
End Property

im aufrufenden Formular:

Sub btnGo_Click()
    Const cform As String = "frmDestinationForm"
    DoCmd.OpenForm cform
    Forms(cform).callingform = Me.Name
    Forms(cform).PrimaryKey = Me.PrimaryKey
    Me.Visible = False

(end)

0voto

Kevin Ross Punkte 7105

Ich würde die openargs Methode des Formulars verwenden. Auf diese Weise können Sie ein Datenstück zum neuen Formular von jedem anderen Formular aus übergeben. Sie können dies auch erweitern, indem Sie einen durch Trennzeichen getrennten String von Argumenten senden und sie dann aufteilen. Zum Beispiel habe ich ein Formular zur Bearbeitung der Aktivitäten des Agenten, das das Datum, den Namen des Agenten, die Agenten-ID und das Team in den offenen Argumenten übergibt

DoCmd.OpenForm "frmEdit_agent_activity", , , , , acDialog, Item & "|" & Me.txtDate & "|" & Item.ListSubItems(1) & "|" & Item.ListSubItems(2)

Das Formular verwendet dies dann, um die Steuerelemente vorzubelegen

Private Sub Form_Load()
If IsMissing(Me.OpenArgs) = True Or IsNull(Me.OpenArgs) = True Then
    'keine Argumente, Formular beenden
    DoCmd.Close acForm, "frmEdit_agent_activity", acSaveNo
Else
    'dieses Formular hat 4 offene Argumente
    '1 Mitarbeiter-ID
    '2 Datum
    '3 Team_ID
    '4 Mitarbeitername
    Me.txtStaff_ID = GetDelimitedField(1, Me.OpenArgs, "|")
    Me.txtDate = GetDelimitedField(2, Me.OpenArgs, "|")
    Me.txtTeam_ID = GetDelimitedField(3, Me.OpenArgs, "|")
    Me.txtStaff_name = GetDelimitedField(4, Me.OpenArgs, "|")
End If

End Sub

Ach ja, hier ist die GetDelimitedField Funktion

Function GetDelimitedField(FieldNum As Integer, DelimitedString As String, Delimiter As String) As String
Dim NewPos As Integer
Dim FieldCounter As Integer
Dim FieldData As String
Dim RightLength As Integer
Dim NextDelimiter As Integer
If (DelimitedString = "") Or (Delimiter = "") Or (FieldNum = 0) Then
    GetDelimitedField = ""
    Exit Function
End If
NewPos = 1
FieldCounter = 1
While (FieldCounter < FieldNum) And (NewPos <> 0)
    NewPos = InStr(NewPos, DelimitedString, Delimiter, vbTextCompare)
    If NewPos <> 0 Then
        FieldCounter = FieldCounter + 1
        NewPos = NewPos + 1
    End If
Wend
RightLength = Len(DelimitedString) - NewPos + 1
FieldData = Right$(DelimitedString, RightLength)
NextDelimiter = InStr(1, FieldData, Delimiter, vbTextCompare)
If NextDelimiter <> 0 Then
FieldData = Left$(FieldData, NextDelimiter - 1)
End If
GetDelimitedField = FieldData
End Function

0voto

Fionnuala Punkte 89346

Haben Sie schon über Unterformulare nachgedacht? Diese sind ideal für Eins-zu-vielen-Beziehungen. Das/die Link-Felder wird/werden automatisch aus dem/den Master-Link-Feld(ern) ausgefüllt.

Wenn Sie ein Beispiel für Unterformulare in Aktion benötigen, wird die Northwind-Datenbank mit allen Versionen von Access mitgeliefert, oder Sie können die jeweils relevante herunterladen.

2007 http://office.microsoft.com/en-us/templates/TC012289971033.aspx?CategoryID=CT102115771033

2000 http://www.microsoft.com/downloads/details.aspx?familyid=c6661372-8dbe-422b-8676-c632d66c529c&displaylang=en

0voto

iDevlop Punkte 24046

Sie können OpenArgs verwenden.
Aber ich würde auch vorschlagen, dass Sie auch die Verwendung einer Registersteuerung in Betracht ziehen. Das ermöglicht es Ihnen, verschiedene Sets von Steuerelementen auf dem gleichen "Bildschirmplatz" zu haben, indem Sie nur einen einzelnen Datensatz verwenden oder Unterformulare verwenden, um untergeordnete Datensätze anzuzeigen.
In diesem Fall könnten Sie die Schaltfläche "Weiter" verwenden, um einfach zur nächsten Seite Ihrer Registersteuerung zu wechseln.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X