Hallo Access-O-Maniacs,
ich habe ein "kleines" Problem, bei dem ich nicht weiter komme.
Ich habe ein Formular (frm_BA) mit Daten aus einer Tabelle (tab_BA). In dieses Formular gibt es ein Kombinationsfeld (cbo_MA), welches Namen aus der Tabelle "tab_MA" enthält. Beim Ereignis "Bei Nicht in Liste" habe ich folgende Ereignisprozedur eingeben
Private Sub cbo_MA_NotInList(NewData As String, Response As Integer)
DoCmd.SetWarnings False
If MsgBox("'" & NewData & "' ist nicht in der Liste. Möchten Sie '" & NewData & "' als neuer NAme anlegen?", vbYesNo) = vbYes Then
Response = acDataErrContinue
DoCmd.OpenForm "frm_MA"
DoCmd.GoToRecord , , acNewRec
Forms!frm_MA!txtf_NamePruefer = NewData
Else 'z.B. bei Tippfehler
Response = acDataErrContinue
Me!cbo_MA.Undo
End If
DoCmd.SetWarnings True
End Sub
Es wird das Formular frm_MA geöffnet um weitere Daten zu ergänzen. Im Formular frm_MA gibt es eine Schaltfläche btn_SaveClose mit folgenden Code
Private Sub btn_SaveClose_Click()
DoCmd.Close acForm, "frm_MA", acSaveYes
Forms!frm_BA!cbo_MA.Requery
End Sub
Und jetzt kommt die Fehlermeldung "Laufzeitfehler '2118': Sie müssen das aktuelle Feld speichern, bevor Sie die AktualisierenDaten-Aktion ausführen können."
Die Daten wurden zwar in der Tabelle tab_MA übernommen, sind aber nicht in das ausgangs-Kombinationsfeld zu sehen. Es gibt nur o.g. Fehlermeldung. Wenn ich alles schliesse und dann wieder öffne, ist alles da.
Wer kann mir da helfen.
Vielen Dank im Voraus.
MfG
Atuatuca
Hallo,
versuch es so:
Private Sub cbo_MA_NotInList(NewData As String, Response As Integer)
If MsgBox("'" & NewData & "' ist nicht in der Liste. Möchten Sie '" & NewData & "' als neuer Name anlegen?", vbYesNo) = vbYes Then
Response = acDataErrAdded
DoCmd.OpenForm "frm_MA", , , , acFormAdd, acDialog, NewData
Else 'z.B. bei Tippfehler
Response = acDataErrContinue
Me!cbo_MA.Undo
End If
End Sub
' und im Form frm_MA:
Sub Form_Load()
If Not IsNull(Me.Openargs) Then Me!txtf_NamePruefer.DefaultValue = Me.Openargs
End Sub
Es ist zu vermuten, dass hier keine Primär- oder Fremdschlüssel in Verwendung sind, was dringend empfohlen wird.
Hallo Atuatuca,
Wie du das MA-Formular besser öffnest hat Franz dir gezeigt.
IMO löst das aber nicht das geschilderte Problem.
Ergänze den Code des Buttons
Private Sub btn_SaveClose_Click()
Me.Dirty = False
'speichert explizit
DoCmd.Close acForm, "frm_MA"
', acSaveYes - kannst du vergessen, macht nur Sinn wenn das Form zur
'Laufzeit im Entwurfsmodus geöffnet wird
Forms!frm_BA!cbo_MA.Requery
End Sub
gruss ekkehard
Hallo,
das "frm_MA" wird als Dialog geöffnet und kann nur durch Verlassen" beendet werden, so dass der Code weiterlaufen kann.
Die Zuweisung an den Defaultwert lässt einen Abbruch zu, wenn doch kein neuer Eintrag gemacht werden soll.
Beim Verlassen des Forms wird der neue DS gespeichert, wenn Eingaben erfolgt sind und mit acDataErrAdded das Kombifeld aktualisiert.
Den zusätzlichen Code braucht es nicht...
Hallo Ekkehard und Franz,
erst einmal vielen Dank für die Antworten und Hilfestellungen.
Mein Problemchen ist fast gelöst mit u.g. codes.
In Frm_BA im cbo_MA, beim Ereignis nicht in Liste:
Private Sub cbo_MA_NotInList(NewData As String, Response As Integer)
DoCmd.SetWarnings False
If MsgBox("'" & NewData & "' ist nicht in der Liste. Möchten Sie '" & NewData & "' als neuer Name anlegen?", vbYesNo) = vbYes Then
Response = acDataErrAdded
DoCmd.OpenForm "frm_MA", , , , acFormAdd, acDialog, NewData
Else 'z.B. bei Tippfehler
Response = acDataErrContinue
Me!cbo_MA.Undo
End If
DoCmd.SetWarnings True
End Sub
und in frm_MA beim btn_SaveClose beim Ereignis beim Klicken mit folgenden Code:
Private Sub btn_SaveClose_Click()
DoCmd.Close acForm, "frm_MA"
End Sub
Beim öffnen des frm_MA übernimmt den o.g. code nicht den Name, welcher mann im frm_BA in der cbo_MA eingegeben hat, sondern #Name?
Nach den Eingaben in frm_MA wird der Name in der cbo_MA sofort gelistet und auch aufgerufen.
In der tab_BA, werden nur die Fremdschlüsseln (ID's = Autowert) der anderen verbunden Tabellen gespeichert.
Hallo,
Deine Tabellen- und Formalarstruktur ist ja unbekannt.
ZitatSub Form_Load()
If Not IsNull(Me.Openargs) Then Me!txtf_NamePruefer.DefaultValue = Me.Openargs
End Sub
Setze einen Haltepubkt an die "If Not.. " Stelle und prüfe den Inhalt von Me.Openargs
Gibt es ein Textfeld mit Namen "txtf_NamePruefer" im Formular?
Kann in dieses Textfeld der Wert von Openargs sinnvoll eingetragen werden?
Hallo Franz,
ja, in frm_MA gibt es ein Textfeld namens txtf_NamePruefer.
Habe mal meine Tabellenstruktur, frm_BA und frm_MA als Bild angehängt.
Setze einen Haltepubkt an die "If Not.. " Stelle und prüfe den Inhalt von Me.Openargs
Wie mache ich das ?
Gruss
Rudi
Hallo,
im VBE gibt es neben den links Codezeilen einen gräulichen Bereich. Dort bei einer Codezeile klicken erzeugt einen braunen Punkt --> Haltepunkt.
Entspr. dem Beziehungsfenster heißt das zugehörige Tabellenfeld "NamePrüfer". Nichtsdestotrotz muss aber nicht ein Prüfername, sondern die ID des MA (MA_ID ---> Newdata) übergeben werden. Dazu ist auch das Kombifeld passend aufzubauen.
Select MA_ID,Nameprüfer from tab_MA
Spaltenanzahl: 2
Spaltenbreiten: 0cm;4cm
Und hier noch mal die Datenbank
Hallo Franz,
in frm_MA, Ereignis Form_Load sagt
Sub Form_Load()
If Not IsNull(Me.OpenArgs) Then Me!txtf_NamePruefer.DefaultValue = Me.OpenArgs
End Sub
wenn ich auf Me.OpenArgs gehe: Me.OpenArgs = "Otto" (das ist der Name den ich im cbo_MA im frm_BA eingegeben haben.
Hallo Franz,
Bei Datensatzherkunft frm_BA, cbo_MA steht:
SELECT tab_MA.ID_MA, tab_MA.NamePruefer, tab_MA.FS_Abteilung, tab_MA.Aktiv
FROM tab_MA
WHERE (((tab_MA.FS_Abteilung)=7 Or (tab_MA.FS_Abteilung)=8) AND ((tab_MA.Aktiv)=True))
ORDER BY tab_MA.NamePruefer;
Gruss
Rudi
Hallo,
die Beispieldatei zeigt nicht das Problem....
Es wird eine neue Abteilung mittels Insert-SQL eingefügt und nicht über ein Formular.
Dies funktioniert auch korrekt. Einige Codezeilen sind überflüssig:
ZitatPrivate Sub cbo_Abteilung_NotInList(NewData As String, Response As Integer)
Dim lngID_Art As Long
Dim db As DAO.Database
Set db = CurrentDb
Dim strMeldung As String
Dim bolAnlegen As Boolean
strMeldung = "'" & NewData & "' als neue Abteilung anlegen ?"
If MsgBox(strMeldung, vbYesNo + vbQuestion, " Bitte bestätigen.") = vbYes Then
db.Execute "INSERT INTO tab_Abteilung (Abteilung) VALUES('" & NewData & "')", dbFailOnError
Response = acDataErrAdded
End If
'lngID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)
'Me!cbo_Abteilung.Undo
'Me!cbo_Abteilung.Requery
'Me!cbo_Abteilung = lngArt
Set db = Nothing
End Sub
Einige Verweise sind überflüssig/falsch. Weiteren Code habe ich nicht analysiert.
Hallo Franz,
es geht nicht um die cbo_Abteilung in frm_MA, sondern um die Übergabe des Wertes aus frm_BA in cbo_MA an das frm_MA in txtf_MA.
Gruss
Rudi
Hallo,
ok..
Weil es sich bei der Übergabe mit Openargs um einen Text handelt, muss die Zuweisung an den Defaultwert so lauten:
ZitatSub Form_Load()
If Not IsNull(Me.OpenArgs) Then Me!NamePruefer.DefaultValue = """" & Me.OpenArgs & """"
End Sub
Zudem muss die Abfrage für das Kombi nur passsende Kriterien enthalten, die einen eingetragenen neuen MA auch filtern kann.
("Abteilung = 7 oder 8" schlägt fehl, wenn der neue MA nicht zu diesen Abteilungen gehört.)
Oder es muss die ID der zugelassenen Abteilungen schon bei der Erfassung fest mit vorgegeben werden.
SELECT tab_MA.ID_MA, tab_MA.NamePruefer, tab_MA.FS_Abteilung, tab_MA.Aktiv
FROM tab_MA;
PS: habe den Steuerelementnamen des Textfeldes, das an das Tabellenfeld "NamePruefer" gebunden ist. gleichlautend benannt. Entgegen anderweitiger Meinungen/Vorschläge benenne ich gebundene Steuerelemente durchweg genau so wie das entspr. Tabellenfeld. Das erspart mir dauerndes Nachsehen, Nachdenken und Kontrolle im Falle von unterschiedlicher Benamsung. Steuerelemente , die ungebunden sind, erhalten einen passenden Prefix ("txt" bei einem Textfeld) als Kennzeichung dieser Situation.
Hallo Franz,
Jetzt funktioniert es so wie ich es wollte, bis auf die "Kleinigkeit", dass der Anwender eine andere Abteilung als 7 oder 8 wählen könnte.
vielen Dank für den Hinweis "Oder es muss die ID der zugelassenen Abteilungen schon bei der Erfassung fest mit vorgegeben werden."
Wie geht das ?
Gruss
Rudi.
PS. gleiches natürlich auch für das cbo_QM_MA in frm_BA.
Hallo,
naja, das sollte aber jetzt klar werden:
Abteilungsauswahl (Kombi) bei Neu-Eingabe auf ID 7 und 8 einschränken.
Ansonsten musst Du an der Logik arbeiten. Ich kenne nicht die genauen Hintergründe.
Hallo Franz,
das ist mir schon klar dass das über ein combofeld geregelt werden kann.
Aber Dejenige der in cbo_MA ein Namen eingibt/auswählt soll nur Namen für Abteilung 7 und 8 eingeben dürfen, egal ob neu oder alt.
Denjenige der in cbo_QM_MA ein Namen eingibt/auswählt soll nur Namen aller Abteilungen eingeben dürfen, egal ob neu oder alt.
Hallo,
enstspr.deiner Beschreibung: siehe Anhang
Moin Franz,
vielen Dank. Werde es mir heute Abend mal zu gemüte führen.
Gruss
Rudi
Halo Franz,
vielen Dank für deine Unterstützung.
Jetzt funktioniert es wie gewünscht.
Wäre die gleiche Funktion (Auswahl einschränken) auch über eine Benutzerverwaltung lösbar. Sprich muss sich angemeldet werden und je nach dem welche Rechte/Funktionen man dem Eingelogtem gibt ist manches sichtbar bzw. auswählbar.
Wenn dem so ist, dann wäre eine Benutzerverwaltung doch die bessere Lösung oder ?
Gruss
Rudi
Hallo,
mittels Benutzerverwaltung ist das natürlich auch lösbar und eine bessere Lösung wäre es auch (zumindest klassisch) .