PDA

Vollständige Version anzeigen : A97: Kombinationsfeld - Bei nicht in Liste


Kurt aus Kienitz
12.06.2001, 16:27
Hallo miteinander,

Ich möchte Werte zu einem Kombinationsfeld hinzufügen.
Dazu habe ich folgende Ereignisprozedur geschrieben:

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

Dim strSQL As String

If MsgBox("'" & NewData & "' nicht als Kategorie definiert." & vbCrLf & _
"Soll diese aufgenommen werden", vbQuestion + vbYesNo, "neue Kategorie") = vbYes Then

strSQL = "INSERT INTO Kategorie (KatBez) VALUES('" & NewData & "');"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True

End If
Response = acDataErrAdded
'Response = acDataErrContinue
'Response = acDataErrDisplay

End Sub

Ich komme aber mit dem Response nicht zurecht.

acDataErrAdded fügt mir einen neuen Datensatz zum Formular und nicht zum Kombinationsfeld hinzu.
acDataErrContinue hat den Effekt, daß ich den neuen Eintrag nicht im Kombinationsfeld sehen kann.
Ein Requery wird mit einer Fehlermeldung quittiert.
acDataErrDisplay bingt mir die Standardfehlermeldung.


Die Fehlermeldung beim Requery ist:
Laufzeitfehler 2118
Sie müssen das aktuelle Feld erst speichern, bevor Sie die Aktion AktualisierenDaten ausführen können

Was muß ich tun, damit der neue Wert eingetragen wird und sofort im Kombinationsfeld verfügbar ist ?

Axel37
12.06.2001, 16:44
hi kurt,
was hälst du davon, ein kombi mit dieser datenherkunft:
SELECT [deineTab].KatBez FROM deineTab GROUP BY [deineTab].KatBez HAVING (((Count([deineTab].KatBez))>0));
und das steuerelement aktualisierst du beim zb verlassen. vor allem wirst du dann nicht gefragt ob oder ob nicht

Kurt aus Kienitz
12.06.2001, 16:54
Hallo Axel,

Die Sache ist ja so, daß ich garnicht bis zum Ereignis "Beim Verlassen" komme, da die Eigenschaft Nur Listenelemente des Kombinationsfeldes auf Ja steht und
somit ersteinaml die Standardfehlermeldung kommt.

Die Eingeschaft läßt sich auch nicht auf Nein umstellen, da es sich um ein gebundenes Kombinationsfeld handelt.

Trotzdem Danke erstmal.

A.S.
12.06.2001, 16:58
Hallo Kurt,

ich benutze für das Eintragen ein Recordset mit folgemdem Code, funktioniert bei mir (A97/SR2b) tadellos.


Private Sub kmbSuchID_NotInList(NewData As String, Response As Integer)
intAntwort = MsgBox("Sie haben eine unbekannte Kundennummer (" & NewData & "eingegeben." & _
vbCrLf & vbCrLf & "Soll diese Kundennummer angelegt werden?", vbYesNo + _
vbQuestion + vbDefaultButton2, "Neuer Kunde")
If intAntwort = vbYes Then
Set db = CurrentDb
Set tb = db.OpenRecordset("tblKunden", dbOpenTable)
tb.AddNew
tb("Nr") = NewData
tb.Update
tb.Close
Set tb = Nothing
Set db = Nothing
Response = acDataErrAdded
Else
Response = acDataErrContinue
DoCmd.CancelEvent
End If
intAntwort = 0
Exit Sub
End Sub


Gruß

Arno

Axel37
12.06.2001, 17:09
das kombi kannst du doch - musst du eh binden, damit die werte dort reinfliessen.
also gebundenes k-feld, das gleichzeitig die eigene spalte ausliest und in der k-liste zur verfügung stellt. (sorry, gehe immer den einfachsten weg, dmit die anwendung klein bleibt)

A.S.
12.06.2001, 17:17
Hallo Axel,

sicherlich sind die Kombinationsfelder an einen Recordsource gebunden, allerdings nicht unbedingt an den des Formulars. Mit der Handhabung über acDataErrAdded etc. kannst Du Dir - außer bei mehrspaltigen Kombinationsfeldern - zumindest das Requery auf das Kombinationsfeld ersparen.

Gruß

Arno

Kurt aus Kienitz
12.06.2001, 18:54
Hallo Arno,

Ich habe jetzt folgenden Code:

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

Dim intAntwort As Integer
Dim db As Database
Dim tb As Recordset

intAntwort = MsgBox("Sie haben eine unbekannte Kategorie (" & NewData & "eingegeben." & _
vbCrLf & vbCrLf & "Soll diese Kategorie angelegt werden?", vbYesNo + _
vbQuestion + vbDefaultButton2, "Neuer Kunde")

If intAntwort = vbYes Then
Set db = CurrentDb
Set tb = db.OpenRecordset("Kategorie", dbOpenTable)
tb.AddNew
tb("KatBez") = NewData
tb.Update
tb.Close
Set tb = Nothing
Set db = Nothing
Response = acDataErrAdded
Else
Response = acDataErrContinue
DoCmd.CancelEvent
End If

intAntwort = 0


End Sub

Wenn ich die Abfrage mit Ja beantworte wird der aktuelle Datensatz des Formulares gespeichert und das Formular zeigt mir den nächsten Datensatz an.

Also ich bin im Datensatz 1 des Formulares, geben eine Kategorie an, die es im Kombinationsfeld noch nicht gibt, lasse diese speichern und befinde mich im Datensatz 2 des Formulares.

Das will ich aber nicht, will doch nur die neue Kategorie anlegen und nicht den Datensatz wechseln *heul*

P.S.
Das man die Eigenschaft Nur Listenelemente nich auf Nein einstellen kann, liegt übrigens daran daß das Kombinationsfeld mehrspaltig ist (die ID der Kategorie und die Bezeichnung).
Es wird aber nur eine Spalte (die Bezeichnung) angezeigt.

A.S.
12.06.2001, 19:47
Hallo Kurt,

sorry, kann das jetzt im Moment nicht austesten. Mein Formular ist komplett ungebunden, daher kann ich das derzeit nicht nachvollziehen.

In diesem Beitrag (Kombinations Feld (http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=42152)) ging es aber um das selbe mit derselben Technik. Da dort kein negatives Response kam, sollte die Technik an sich wohl funktionieren, auch bei gebundenen Formularen.

Bist Du die ganze Sache mal im Debuging durchgelaufen? Ich hatte heut bei mir das Problem das auf einmal 'ne simple Zeilenschaltung die hälfte des Coding im logischen Ablauf durcheinandergebracht hat.

Gruß

Arno

Günther Kramer
12.06.2001, 21:10
Hallo Kurt,

auf unserer Homepage unter http://www.access-paradies.de -> Software-Katalog -> Tipps & Tricks -> Forumlare findest du ein fertiges Beispiel inkl. Code. Versuche doch dieses einmal. ;)

Wenn du A00 verwendest, mußt du alle Objekte in eine neue A00-Datenbank importieren, denn das Konvertieren geht nicht.

Kurt aus Kienitz
12.06.2001, 21:29
Hallo Günther,

Das ist ja unglaublich :) es funktioniert.

Jetzt verrate mir mal warum ;)

Ich habe jetzt folgenden Code:

Private Sub CmbKategorie_NotInList(NewData As String, Response As Integer)
On Error GoTo Err_Bezeichnung_NotInList

Dim db As Database, DSGruppe1 As Recordset

If vbYes = MsgBox("Möchten Sie " & Chr(34) & NewData & Chr(34) & _
" zur Liste hinzufügen?", vbYesNo + vbQuestion, "Microsys Kramer - Demo") Then
Set db = CurrentDb
Set DSGruppe1 = db.OpenRecordset("Kategorie")
DSGruppe1.AddNew
DSGruppe1!KatBez = NewData
DSGruppe1.Update
DSGruppe1.Close
Response = acDataErrAdded
Else
Response = acDataErrDisplay
End If

Exit_Bezeichnung_NotInList:
Exit Sub

Err_Bezeichnung_NotInList:
MsgBox Err.Description
Resume Exit_Bezeichnung_NotInList
End Sub

Der unterscheidet sich von dem Code, den mit Arno vorgeschlagen hat ja nur durch das Error-Handling, oder ?

Vielen Dank (an alle)

A.S.
13.06.2001, 03:18
Hallo Kurt,

nicht nur. Die Art der Indizierung des Tabellenfeldes ist anders und in meinem Beispiel ist - eigentlich überflüssigerweise - ein DoCmd.CancelEvent im Else-Zweig vorhanden.

Und die Art und Weise die Fehlerbehandlung einzubinden, schenke ich mir in der Regel, da diese nichts weiter macht als den normalen Laufzeitfehler auszulösen. Ich für meinen Teil bin für die Fehlerbehandlung an kritischen Stellen "vor Ort". D.h. Abschalten der Fehlermeldungen und Auswertung des Err-Objects an den kritischen Stellen, so das man im Coding auch sieht welche Reaktion für welchen Fehler an welcher Stelle erfolgt. IMHO kann man den Ablauf der Routinen damit besser nachverfolgen.

Gruß

Arno