Liebe Access-Profis,
in meinem Eingabeformular 'frm_BuchEingabe' habe ich ein Unterformular 'frm_Autoren2Buecher' eingebracht, das aus einem Kombinationsfeld (cmb_AUT_FS) besteht, in dem die Autoren der Bücher ausgewählt werden. Dieses cmb_AUT_FS greift auf eine Abfrage mit dem SQL_Code
SELECT tblAutoren.AUT_PS, IIf([AUT_Vorname] Is Not Null And [AUT_Nachname] Is Not Null,[AUT_Nachname] & ", " & [AUT_Vorname],[AUT_Nachname]) AS VN
FROM tblAutoren
ORDER BY IIf([AUT_Vorname] Is Not Null And [AUT_Nachname] Is Not Null,[AUT_Nachname] & ", " & [AUT_Vorname],[AUT_Nachname]);
zurück. (Ich muss hier auch öffentliche Institutionen als Autoren/Herausgeber eingeben können und dann sollte dort nach dem Nachnamen kein "," erscheinen.)
Jetzt habe ich das Problem, dass neue Autoren nicht einzugeben sind.
Also greife ich bei dem Ereignis 'Bei Nicht in Liste' mit dem Code:
Private Sub cmb_AUT_FS_NotInList(NewData As String, Response As Integer)
Response = acDataErrAdded
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strVorname As String
Dim intGesamtLaenge As Integer
Dim intKommaPos As Integer
Dim intAnzahl As Integer
Dim strNachname As String
Dim strNameAutor As String
Set db = CurrentDb
Set rs = db.OpenRecordset("tblAutoren", dbOpenDynaset)
strNameAutor = DLookup("AUT_NameGesamt", "tblAutoren", AUT_PS = AUT_FS)
intKommaPos = InStr(strNameAutor, ",")
strNachname = Left(strNameAutor, intKommaPos)
intGesamtLaenge = Len(strNameAutor)
intAnzahl = intGesamtLaenge - intKommaPos
strVorname = Right(strNameAutor, intAnzahl)
rs.AddNew
rs!AUT_Nachname = strNachname
rs!AUT_Vorname = strVorname
rs.Update
rs.Close: Set rs = Nothing
Set db = Nothing
End Sub
auf die Felder der tblAutor (AUT_PS; AUT_Vorname; AUT_Nachname; AUT_NameGesamt) zurück, um einen neuen Namen einzufügen.
Das funktioniert nicht, wohl weil in der Zeile mit der DLookup-Funktion kein Wert erkannt wird. Ich vermute, dass der Wert AUT_FS noch gar nicht existiert?! Ich brauche hier wohl eine andere Konstruktion.
Kann mir hier jemand helfen - ich komme einfach nicht weiter?
Vielen Dank vorab!
Viele Grüße
gromax
Hallo,
ZitatDas funktioniert nicht, wohl weil in der Zeile mit der DLookup-Funktion kein Wert erkannt wird.
das funktioniert in erster Linie deshalb nicht, weil die Syntax des Kriteriums falsch ist.
Das sollte eher so aussehen:
"feldname=" & variablennamewobei erstmal bekannt gegeben werden müsste, wie der Name des Datenfeldes lautet und mit welcher Variablen es verglichen werden soll.
Vielleicht löst du dich erstmal noch von der Umsetztung via VBA und beschreibst mit verständlichen Worten was genau in dem Ereignis passieren soll.
Hallo MaggieMay,
sorry, das war natürlich in der Beschreibung sehr fragmentarisch.
Vorab:
Ich möchte eine DB entwerfen, bei der die Anwender einen Buchtitel (und weitere Angaben) eingeben und den passenden Autor dazu mittels eines Kombifeldes innerhalb eines Unterformulars auswählen.
Problem:
Was mache ich, wenn der Autor noch nicht hinterlegt ist ("kein Element der Liste"); so wollte ich den Weg über das Ereignis "Bei Nicht in der Liste" gehen - leider führte dieser in die Sachgasse!
Anbei habe ich die DB im bisherigen Entwurf angehängt.
Viele Grüße
gromax
Hallo,
Zitatso wollte ich den Weg über das Ereignis "Bei Nicht in der Liste" gehen - leider führte dieser in die Sachgasse!
Wie hast du das denn versucht? Es ist kein diesbezüglicher Code in deiner DB zu finden.
Hallo MaggieMay,
entsprechend Deinem Hinweis
ZitatVielleicht löst du dich erstmal noch von der Umsetztung via VBA und beschreibst mit verständlichen Worten was genau in dem Ereignis passieren soll.
hatte ich den VBA-Code (siehe meinen vorherigen Post) entfernt und - im Verbund mit dem obigen Text - die DB reduziert und versendet, um mein Vorhaben darzustellen.
Den VBA-Code hatte ich mit Verweis auf http://www.donkarl.com/?FAQ4.13 gebastelt - mehr oder weniger?!
Viele Grüße
gromax
Hallo,
was soll es für einen Sinn machen, denn VBA Code zu entfernen, wenn Du wissen willst was Du falsch gemacht hast ?
Hallo Klaus,
danke für die Rückmeldung; sorry - ich hatte den VBA-Code doch oben angeführt?!
Aber gerne hier nochmal:
Private Sub cmb_AUT_FS_NotInList(NewData As String, Response As Integer)
Response = acDataErrAdded
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strVorname As String
Dim intGesamtLaenge As Integer
Dim intKommaPos As Integer
Dim intAnzahl As Integer
Dim strNachname As String
Dim strNameAutor As String
Set db = CurrentDb
Set rs = db.OpenRecordset("tblAutoren", dbOpenDynaset)
strNameAutor = DLookup("AUT_NameGesamt", "tblAutoren", AUT_PS = AUT_FS)
intKommaPos = InStr(strNameAutor, ",")
strNachname = Left(strNameAutor, intKommaPos)
intGesamtLaenge = Len(strNameAutor)
intAnzahl = intGesamtLaenge - intKommaPos
strVorname = Right(strNameAutor, intAnzahl)
rs.AddNew
rs!AUT_Nachname = strNachname
rs!AUT_Vorname = strVorname
rs.Update
rs.Close: Set rs = Nothing
Set db = Nothing
End Sub
Ich sende auch die Bsp.-DB nochmals; jetzt gerne wieder mit diesem Code.
Viele Grüße
gromax
Hallo,
kannst Du den Code mal erklären, was willst Du da mit DLookup und den Kommapositionen ?
Willst Du mehrere Autoren in ein Feld eintragen ?
Der Code sollte gem. den FAQ sonst nicht tun wie die Tabelle um den neuen Autor erweitern. Und das sind nur wenige Zeilen VBA. Ein Feld mit allen Autoren ist überflüssig. Das wird bei Bedarf über eine Abfrage erzeugt und ist so stets aktuell.
Die DB kann ich nicht ansehen, ich habe nur Access2003 (MDB).
Hallo,
wie schon 10 000 Mal empfohlen: In JEDEM Modulkopf
Option Compare Database 'UND
Option Explicit
eintragen.
Danach Debuggen/Kompilieren und die Fehler springen einem ins Auge.
Was das Dlookup soll, erschließt sich mir nicht...
Die Eingabe erfordert zwingend die Trennung von Nachname zu Vorname mit den Zeichen Komma und Leerzeichen.
Option Compare Database
Option Explicit
Private Sub cmb_AUT_FS_NotInList(NewData As String, Response As Integer)
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strVorname As String
Dim intGesamtLaenge As Integer
Dim intKommaPos As Integer
Dim intAnzahl As Integer
Dim strNachname As String
Dim strNameAutor As String
Set db = CurrentDb
Set rs = db.OpenRecordset("tblAutoren", dbOpenDynaset)
strNameAutor = NewData 'Nz(DLookup("AUT_NameGesamt", "tblAutoren", "AUTBu_PS = AUT_FS"), "")
intKommaPos = InStr(strNameAutor, ",")
strNachname = Left(strNameAutor, intKommaPos - 1)
intGesamtLaenge = Len(strNameAutor)
intAnzahl = intGesamtLaenge - intKommaPos
strVorname = Right(strNameAutor, intAnzahl - 1)
rs.AddNew
rs!AUT_Nachname = strNachname
rs!AUT_Vorname = strVorname
rs.Update
Response = acDataErrAdded
rs.Close: Set rs = Nothing
Set db = Nothing
End Sub
und das Ganze etwas reduzierter:
Option Compare Database
Option Explicit
Private Sub cmb_AUT_FS_NotInList(NewData As String, Response As Integer)
Dim db As DAO.Database
Dim strVorname As String
Dim strNachname As String
Set db = CurrentDb
strVorname = Split(NewData, ", ")(1)
strNachname = Split(NewData, ", ")(0)
db.Execute "Insert into tblAutoren (AUT_Vorname,AUT_Nachname) Values ('" & strVorname & "','" & strNachname & "')", dbFailOnError
Response = acDataErrAdded
Set db = Nothing
End Sub
Hallo Franz, hallo Klaus,
beschämt und geplättet ob der Kompetenz - aber sehr zufrieden!
Es funktioniert bestens!
Viele Grüße und vielewn Dank
gromax
Hallo,
beschämt brauchst Du nicht sein, geplättet wäre ok.... ;) :D ;D