Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Optionsgruppen in Formularen + Kombination mit Kombinationsfeldern

Begonnen von ChemSim, Februar 11, 2024, 19:44:25

⏪ vorheriges - nächstes ⏩

ChemSim

Hallo,

ZitatDu kannst das auch ganz anders machen (was ich hier bevorzugen würde)

ich habe diese Vorgehensweise umgesetzt. Als Ergebnis habe ich jetzt zwei Kombinationsfelder cboPLZ und cboOrt. Jedes Kombinationsfeld hat drei Spalten, wovon die erste der Primärschlüssel bzw. ID ist und nicht angezeigt wird (0 cm), die beiden anderen Spalten werden angezeigt.

Sie dürfen in diesem Board keine Dateianhänge sehen.

Sie dürfen in diesem Board keine Dateianhänge sehen.

Aber wäre es nicht besser, in dem einen Feld nur die PLZ anzuzeigen (0cm, x cm, 0cm) und in dem anderen nur den Ort (0 cm, 0 cm, x cm)?

ZitatAdressenID ist übrigen ein irritierender Name, die Adresse mit Straße ist ja ein extra Feld. Nenne das Feld OrtID und entsprechend OrtID_F. Mache es gleich, je länger man damit wartet um so aufwendiger wird es.

Das ist ein guter Punkt, ich habe es entsprechend geändert!

Die Verwendung des Codes

Private Sub cboPLZ_NotInList(NewData As String, Response As Integer)

Response = acDataErrAdded
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("tblAdressen", dbOpenDynaset)

rs.AddNew
rs!Feldname = NewData
rs.Update

rs.Close: Set rs = Nothing
Set db = Nothing

End Sub

um einen neuen Eintrag direkt im Kombinationsfeld hinzuzufügen funktioniert nicht. Sobald ich in das Feld "PLZ" etwas eingebe, bekomme ich die Fehlermeldung "Benutzerdefinierter Typ nicht definiert". Was habe ich falsch gemacht?

Gruß
Simon

MzKlMu

#16
Hallo,
ZitatAber wäre es nicht besser, in dem einen Feld nur die PLZ anzuzeigen
nein. Es gibt ja verschiedene Orte mit gleicher PLZ und eine PLZ kann sich auf mehrere Orte beziehen. Daher benötigst Du zu einer zweifeldfreien Auswahl immer PLZ und Ort bzw. Ort und PLZ in der Anzeige. Ist das Kombi geschlossen sieht man ohnehin nur die 1. sichtbare Spalte. Die Spaltenbreite für die sichtbaren Spalten musst Du natürlich anpassen.

Zum Fehler mit dem Typ kann ich jetzt nichts sagen, müsste ich nachstellen. Aber, für "Nicht in Liste" ist die Variante 1 nicht geeignet. Damit kann ja nur ein Wert übergeben werden. Du musst aber auch den Ort dazu eingeben können, sonst musst Du das ja nachholen.

Daher erstelle eine Eingabeformular für PLZ und Ort (kann dann auch zur Datenkorrektur verwendet werden).
Für "Nicht in Liste" verwendest Du dann die  Variante 2.
Gruß Klaus

ChemSim

#17
Hallo,

ZitatEs gibt ja verschiedene Orte mit gleicher PLZ und eine PLZ kann sich auf mehrere Orte beziehen. Daher benötigst Du zu einer zweifeldfreien Auswahl immer PLZ und Ort bzw. Ort und PLZ in der Anzeige.

Das stimmt, ich habe es so gelassen und nur die Spaltenbreiten angepasst.

ZitatDaher erstelle eine Eingabeformular für PLZ und Ort (kann dann auch zur Datenkorrektur verwendet werden).
Für "Nicht in Liste" verwendest Du dann die  Variante 2.

Hat alles super geklappt und ich kann jetzt direkt im Formular frmHerstellerBearbeiten eine neue PLZ und einen neuen Ort über das sich dann öffnende Formular frmAdressenBearbeiten hinzufügen.

Ein Problem habe ich aber noch: Es gibt manche ausländische Tochtergesellschaften, von denen ich die Adresse nicht weiß und somit auch nicht eintragen kann. Wenn ich die Kombinationsfelder cboPLZ und cboOrt aber leer lasse, bekomme ich eine Fehlermeldung, dass ein entsprechender Eintrag in der Tabelle tblAdressen fehlt (weil ich ja keinen Ort und PLZ angegeben habe). Ist es möglich, durch eine Einstellung diese Felder auch leer zu lassen oder müssen diese zwingend ausgefüllt werden? Falls letzteres der Fall ist, müsste ich mir überlegen, ob ich nicht einen Eintrag "nicht bekannt" für PLZ und Ort erstelle.

Außerdem: Wie kann ich es schaffen, dass das Unterformular ufrmHerstellerBearbeiten im Formular frmHerstellerBearbeiten nur dann angezeigt wird, wenn "Eigenständig" nicht ausgewählt wurde?

Sie dürfen in diesem Board keine Dateianhänge sehen.

Gruß
Simon

MzKlMu

#18
Hallo,
Zitatdurch eine Einstellung diese Felder auch leer zu lassen oder müssen diese zwingend ausgefüllt werden?
müssen nicht ausgefüllt werden. Es ist auch relativ einfach zu beheben.
Wenn man in Access im Tabellenentwurf ein Zahlenfeld anlegt, wird dies (unsinnigerweise) automatisch mit 0 vorbelegt. Auch die Fremdschlüsselfelder (..._F).
Somit steht bei einem neuen Datensatz eine 0 als Fremdschlüssel. Es gibt aber keinen Primärdatensatz mit dem Schlüssel 0 demzufolge gibt es diesen Fehler.
Mache Dir einmalig die Mühe und lösche in allen Tabellen mit Fremdschlüssel den Standardwert 0 (einfach leer lassen). Der Fehler sollte dann weg sein.
Und denke daran, bei allen neuen Tabellen mit FS immer gleich den Standardwert löschen, sofort. Mache ich auch immer/meistens, aber habe ich jetzt vergessen.
Zitat... nur dann angezeigt wird, wenn "Eigenständig" nicht ausgewählt wurde?
Auch relativ einfach.

Im Ereignis "Nach Aktualisierung" des Feldes "Eigenständig":
Me.UfoName.Visible = Me.Eigenständig = False
Die gleiche Codezeile muss auch noch in das Formularereignis "Beim Anzeigen" damit auch beim durchblättern bzw. Datensatzwechsel das Ufo mit dem Hakenfeld syncronisiert wird.

Zur Beachtung: UfoName ist der Name des Ufo Steuerelements. Den Namen findest Du in den Eigenschaften wenn der Rahmen des Ufos angeklickt wird.
Gruß Klaus

ChemSim

Hallo,

ZitatMache Dir einmalig die Mühe und lösche in allen Tabellen mit Fremdschlüssel den Standardwert 0 (einfach leer lassen). Der Fehler sollte dann weg sein.

Danke, ich habe alle Standardwerte in den Fremdschlüsselfeldern gelöscht und jetzt funktionert es problemlos.

ZitatMe.UfoName.Visible = Me.Eigenständig = False

Danke, auch dieser Code funktioniert bestens! ;D 

ZitatDaher erstelle eine Eingabeformular für PLZ und Ort (kann dann auch zur Datenkorrektur verwendet werden). Für "Nicht in Liste" verwendest Du dann die  Variante 2.

In meinem Eingabeformular frmOrteBearbeiten, welches ich nach der Variante 2 mit dem Formular frmHerstellerBearbeiten verknüpft habe, muss laut Tutorial beim Schließen des Eingabeformulars noch ein Code angefügt werden. Bei mir sieht dieser so aus.

Private Sub Form_Close()

    Forms!frmHerstellerBearbeiten!cboPLZ = Me!OrtID
    Forms!frmHerstellerBearbeiten!cboPLZ.Requery
    Forms!frmHerstellerBearbeiten!cboOrt = Me!OrtID
    Forms!frmHerstellerBearbeiten!cboOrt.Requery

End Sub

Möchte ich das Formular allerdings nur zur Datenkorrektur nutzen, so gibt es einen Fehler "Microsoft Access kann das Formular 'frmHerstellerBearbeiten' nicht finden, auf das verwiesen wird", weil es nicht offen ist oder so. Kann ich das irgendwie umstellen, sodass ich das Formular auch entkoppelt von dem Formular frmHerstellerBearbeiten nutzen kann?

Gruß
Simon

MzKlMu

#20
Hallo,
einem Formular kann man mit OpenForm einen Parameter mitgeben, die sogenannten Öffnungsargumente (OpenArg). Muss als String übergeben werden.
Das kann man nutzen um den Code beim Schließen zu steuern.

Ändere die Zeile mit OpenForm wie folgt:
DoCmd.OpenForm "frmHerstellerBearbeiten", , , , acFormAdd, , "Ufo"
Dann noch eine Zeile im Close.
Private Sub Form_Close()
If IsNull(Me.OpenArgs) Then Exit Sub
    Forms!frmHerstellerBearbeiten!cboPLZ = Me!OrtID
    Forms!frmHerstellerBearbeiten!cboPLZ.Requery
    Forms!frmHerstellerBearbeiten!cboOrt = Me!OrtID
    Forms!frmHerstellerBearbeiten!cboOrt.Requery
End Sub
Wenn OpenArgs leer (Null) ist, wird die Sub einfach verlassen.

Man könnte auch einen Leerstring ("") als OpenArgs übergeben, aber über einen Text kann man ein Formular in verschiedenen  OpenArgs steuern kann.
Ich habe hier daher mal vorsichtshalber "Ufo" verwendet, man weis ja nicht was noch kommt.

Gruß Klaus

ChemSim

Hallo,

hat funktioniert, danke! :)

Neben dem Formular frmHerstellerBearbeiten habe ich auch noch das Formular frmKonzerneBearbeiten, dass ich nun auch so umgebaut habe, dass man PLZ und Ort nicht über ein Textfeld eingeben kann, sondern mit der Tabelle tblOrte verknüpft ist, um eine eindeutige Zuordnung zu ermöglichen. Das Formular frmKonzerneBearbeiten habe ich auch mit dem Formular frmOrteBearbeiten verknüpft.

Jetzt ist das Problem, dass wenn ich einen neuen Konzern anlegen möchte und eine PLZ, Ort eingebe, die es noch nicht gibt, ich wunschgemäß auf das Formular frmOrteBearbeiten weitergeleitet werde, beim Schließen des Formulars frmOrteBearbeiten komme ich aber dann zum Formular frmHerstellerBearbeiten, vermutlich wegen dem Code:

Private Sub Form_Close()
If IsNull(Me.OpenArgs) Then Exit Sub
    Forms!frmHerstellerBearbeiten!cboPLZ = Me!OrtID
    Forms!frmHerstellerBearbeiten!cboPLZ.Requery
    Forms!frmHerstellerBearbeiten!cboOrt = Me!OrtID
    Forms!frmHerstellerBearbeiten!cboOrt.Requery
End Sub

Kann ich das noch irgendwie anpassen, dass ich beide Formulare frmHerstellerBearbeiten und frmKonzerneBearbeiten mit dem Formular frmOrteBearbeiten verknüpfen kann und zur Eingabe von PLZ und Ort nutzen kann?

Gruß
Simon

MzKlMu

#22
Hallo,
wie ich in #20 schon schrieb, kann man mit den OpenArgs gezielt Code ausführen.
Hier übergibst Du Ufo1
..... , , "Ufo1"Für das andere Formular dann z.B.
..... , , "Ufo2"
Dann musst Du beim Schließen auswerten un entsprechend reagieren:

Private Sub Form_Close()
Select Case Nz(Me.OpenArgs,"")
   Case "Ufo1"
       Forms!frmHerstellerBearbeiten!cboPLZ = Me!OrtID
       Forms!frmHerstellerBearbeiten!cboPLZ.Requery
       Forms!frmHerstellerBearbeiten!cboOrt = Me!OrtID
       Forms!frmHerstellerBearbeiten!cboOrt.Requery
   Case "Ufo2"
       'Bezüge auf anderes Hafo

   End Select
End Sub
Nz() ist notwendig um den Fehler abzufangen wenn die OpenArgs leer (Null) sind.

Für Ufo1 und Ufo2 verwende kurze aussagefähige Namen.

Ich glaube, VBA ist bei diesen Befehlen relativ einfach zu verstehen. Wenn man im VBA Editor den Cursor auf einen Befehl stellt und F1 drückt, öffnet sich die VBA/Access Hilfe die nicht so schlecht ist wie ihr Ruf. Oft erhält man ausführlich Hilfe mit hilfreichen Beispielen. Und oft auch noch recht gut in Deutsch übersetzt.
Falls Du es nicht selbst schon festgestellt hast.
Gruß Klaus

ChemSim

Hallo,

Zitathat funktioniert, danke! :)

Irgendwie hatte ich heute morgen übersehen, dass wenn ich den Code aus #20 bei mir eingebe, das Herstellerformular nicht mehr mit dem neu hinzugefügten Ort aktualisiert wird.

Im Formular frmOrtBearbeiten habe ich im Eigenschaftsdatenblatt unter "Ereignis" die folgenden VBA-Codes stehen:

Bei Laden:

Private Sub Form_Load()

DoCmd.GoToRecord , , acNewRec

End Sub

um beim Öffnen immer einen neuen Datensatz anzulegen.

Beim Öffnen:

Private Sub Form_Open(Cancel As Integer)

DoCmd.OpenForm "frmHerstellerBearbeiten", , , , acFormAdd, , "Ufo"

End Sub

Beim Schließen:

Private Sub Form_Close()

If IsNull(Me.OpenArgs) Then Exit Sub
    Forms!frmHerstellerBearbeiten!cboPLZ = Me!OrtID
    Forms!frmHerstellerBearbeiten!cboOrt = Me!OrtID
    Forms!frmHerstellerBearbeiten!cboPLZ.Requery
    Forms!frmHerstellerBearbeiten!cboOrt.Requery
   
End Sub

Habe ich noch einen Fehler drin oder was vergessen?

Gruß
Simon

MzKlMu

Hallo,
hast du das in #22 schon realisiert bzw. umgesetzt wie in #22 beschrieben?
Gruß Klaus

ChemSim

Hallo,

ja, kann aber sein, dass ich noch einen Fehler drin hab oder ich es falsch aufgefasst habe. Im Formular frmOrteBearbeiten habe ich jetzt folgendes stehen.

Beim Öffnen:

Private Sub Form_Open(Cancel As Integer)

DoCmd.OpenForm "frmHerstellerBearbeiten", , , , acFormAdd, , "Ufo1"
DoCmd.OpenForm "frmKonzerneBearbeiten", , , , acFormAdd, , "Ufo2"

End Sub

Beim Schließen:

Private Sub Form_Close()
Select Case Nz(Me.OpenArgs, "")
   Case "Ufo1"
       Forms!frmHerstellerBearbeiten!cboPLZ = Me!OrtID
       Forms!frmHerstellerBearbeiten!cboPLZ.Requery
       Forms!frmHerstellerBearbeiten!cboOrt = Me!OrtID
       Forms!frmHerstellerBearbeiten!cboOrt.Requery
   Case "Ufo2"
       Forms!frmKonzerneBearbeiten!cboPLZ = Me!OrtID
       Forms!frmKonzerneBearbeiten!cboPLZ.Requery
       Forms!frmKonzerneBearbeiten!cboOrt = Me!OrtID
       Forms!frmKonzerneBearbeiten!cboOrt.Requery
   End Select
  
End Sub

Der Fehler tritt weiterhin auf!

Gruß
Simon

MzKlMu

Hallo,
der erste Code kann ja nicht sein, Du kannst ja da nur ein Formular aufrufen.
Gruß Klaus

ChemSim

Müsste ich quasi eine Kopie von frmOrteBearbeiten erstellen und dieses Formular dann mit dem Formular frmKonzerneBearbeiten verknüpfen?


MzKlMu

Hallo,
der Parameter OpenArgs wird nur benötigt wenn Du die Formulare aus NotInList öffnest.
Wenn die Formulare normal geöffnet werden sind keine OpenArgs erforderlich.

Ich habe allerdings etwas den Faden verloren, mit dem was Du da gerade machst.
Gruß Klaus

ChemSim

Hallo Klaus,

ZitatIch habe allerdings etwas den Faden verloren, mit dem was Du da gerade machst.

Alles klar, nochmal die Zusammenfassung des Problems.

In meiner Datenbank habe ich ein Formular frmHerstellerBearbeiten, bei dem ich die Felder PLZ und Ort mit einem Formular frmOrteBearbeiten verknüpft habe. Lege ich also einen neuen Hersteller an und die PLZ und Ort sind noch nicht vorhanden, habe ich die beiden Kombinationsfelder cboPLZ und cboOrt im Formular frmHerstellerBearbeiten beim Ereignis "Bei nicht in Liste" mit dem folgenden Code versehen:

Private Sub cboPLZ_NotInList(NewData As String, Response As Integer)

If MsgBox("Der Ort ist neu. Möchten Sie ihn anlegen?", vbYesNo) = vbYes Then
  Response = acDataErrContinue
  DoCmd.OpenForm "frmOrteBearbeiten", , , , acFormAdd
  Forms!frmOrteBearbeiten!PLZ = NewData
Else  'z.B. bei Tippfehler
  Response = acDataErrContinue
  Me!cbo_PLZ.Undo
End If

bzw.

Private Sub cboOrt_NotInList(NewData As String, Response As Integer)

If MsgBox("Der Ort ist neu. Möchten Sie ihn anlegen?", vbYesNo) = vbYes Then
  Response = acDataErrContinue
  DoCmd.OpenForm "frmOrteBearbeiten", , , , acFormAdd
  Forms!frmOrteBearbeiten!Ort = NewData
Else  'z.B. bei Tippfehler
  Response = acDataErrContinue
  Me!cbo_Ort.Undo
End If

Dadurch werde ich zum Formular frmOrteBearbeiten weitergeleitet:

Sie dürfen in diesem Board keine Dateianhänge sehen.

Hier kann ich dann eine neue PLZ und einen neuen Ort hinzufügen. Wenn ich das Formular dann schließe, werde ich wieder zum Formular frmHerstellerBearbeiten weitergeleitet, um den neuen Hersteller fertig einzutragen. Das Problem das ich habe ist, dass der neu hinzugefügte Ort nicht in dem Formular frmHerstellerBearbeiten aktualisiert wird. Ich müsste das Formular erst wieder schließen und erneut öffnen, dann ist der Ort da.

Im Formular frmOrteBearbeiten habe ich bei den Ereignissen die folgenden Codes stehen:

Beim Öffnen:

Private Sub Form_Open(Cancel As Integer)

DoCmd.OpenForm "frmHerstellerBearbeiten", , , , acFormAdd, , "Ufo"

End Sub

Beim Schließen:

Private Sub Form_Close()

If IsNull(Me.OpenArgs) Then Exit Sub
    Forms!frmHerstellerBearbeiten!cboPLZ = Me!OrtID
    Forms!frmHerstellerBearbeiten!cboPLZ.Requery
    Forms!frmHerstellerBearbeiten!cboOrt = Me!OrtID
    Forms!frmHerstellerBearbeiten!cboOrt.Requery
   
End Sub

Das Hauptproblem ist, dass das Formular frmHerstellerBearbeiten nicht mit dem neuen Ort aktualisiert wurde, nachdem ich den Ort durch das Formular frmOrteBearbeiten hinzugefügt habe.

Gruß
Simon