PDA

Vollständige Version anzeigen : NotInList nach Arno ...


Pittchen
10.08.2001, 12:59
Hey,Ich habe –von Arno- folgenden Code ausprobiert:

Private Sub Kombinationsfeld12_NotInList(NewData As String, Response As Integer)
Dim intAnswer As Integer

intAnswer = MsgBox("Sie haben eine nicht existierende ArtikelNr " & NewData & _
" eingegeben." & vbCrLf & vbCrLf & _
"Soll der Artikel aufgenommen werden?", vbYesNo, "Artikel aufnehmen?")

If intAnswer = vbYes Then
DoCmd.OpenForm "frmNeuenArtikelErfassen", acNormal, , , acAdd, acDialog, NewData
If Nz(DCount("[ArtNr]", "tblArtStammdaten", "[ArtNr]=" & NewData)) = 1 Then
Response = acDataErrAdded
Else
Response = acDataErrContinue
End If
Else
Response = acDataErrContinue
End If

das entsprechende Formular wird wunderbar geöffnet, aber die bisher nicht vorhandene ArtikelNr, die ich in der Kombobox eingeben habe, wird nicht in das form frmNeuenArtikelErfassen übernommen. Wieso?

Nächste Frage:

Was genau macht die Code-Zeile
If Nz(DCount("[ArtNr]", "tblArtStammdaten", "[ArtNr]=" & NewData)) = 1 Then ..

Wäre schön, wenn ich ne nette Wochenend-Antwort bekäme

Ein solches wünsche ich allen netten Forumsmenschen

Gruß Pittchen

Mel
10.08.2001, 13:03
Hallo Pittchen,

das selbe Problem hab ich auch!

Lösungen hierfür würden mich also auch brennend interessieren.

Wünsche auch ein schönes Wochenende,

Für mich wird's ein Access-WE!

Grüßles,
Mel

Stema
10.08.2001, 13:16
Also, die Funktion NZ wandelt einen evtl. NULL-Wert in einen Leerstring "" um.
Die Funktion DCount ermittelt die Anzahl an Datensätzen in der tblArtStammdaten Feld ArtNr die der Variablen NewData entsprechen. Wenn diese Anzahl = 1 dann...

Zum 1. Teil schau Dir mal die Hilfe zu OpenArgs an.

A.S.
10.08.2001, 13:22
Hallo Pittchen, hallo Mel,

na, dann werd ich mein Coding 'mal auseinandernehmen ;)

Private Sub Kombinationsfeld12_NotInList(NewData As String, Response As Integer)
Dim intAnswer As Integer

intAnswer = MsgBox("Sie haben eine nicht existierende ArtikelNr " & NewData & _
" eingegeben." & vbCrLf & vbCrLf & _
"Soll der Artikel aufgenommen werden?", vbYesNo, "Artikel aufnehmen?")

If intAnswer = vbYes Then

Bis hierhin dürfte alles klar sein, oder?

DoCmd.OpenForm "frmNeuenArtikelErfassen", acNormal, , , acAdd, acDialog, NewData

Hier wird das Formular "frmNeuenArtikelErfassen" im modalen Modus geöffnet, das heißt das aufrufende Coding (hier) bleibt solange stehen bis das aufgerufene Fenster geschlossen wird.

If Nz(DCount("[ArtNr]", "tblArtStammdaten", "[ArtNr]=" & NewData)) = 1 Then

In dieser Zeile wird ermittelt ob die in NewData (das neu in die Liste eingegebene Element) gespeicherte Artikelnummer in der Tabelle tblStammdaten enthalten ist [ Nz(DCount("[ArtNr]", "tblArtStammdaten", "[ArtNr]=" & NewData)) ]. Dabei wird davon ausgegangen, das die Artikelnummer in den Stammdaten eindeutig ist, also nur 1 mal vorhanden sein kann. Ist diese nicht eindeutig (!?!), funktioniert dies an der Stelle nicht.

Response = acDataErrAdded

Ist die Artikelnummer vorhanden (=1), wird der Response-Parameter auf acDataErrAdded gesetzt um dem Kombinationsfeld mitzuteilen, das die Artikelnummer eingefügt wurde.

Else
Response = acDataErrContinue
End If
Else
Response = acDataErrContinue
End If

Für den Fall das die MsgBox oben mit Nein beantwortet oder die Artikelnummer nicht eingegeben wurde, wird der Parameter Response des NichtInListe-Ereignisses auf acDataErrContinue gesetzt. acDataErrContinue teilt dem Kombinationsfeld mit das der neue Listeneintrag verworfen wurde.

Wird der Parameter Response auf acDataErrAdded gesetzt, löst dies den Neuaufbau der Kombinationsfeldelementauflistung (Requery) sowie das setzen des Kombinationsfeldwertes auf den hinzugefügten Wert aus. Andere Werte für den Response-Parameter lösen dies nicht aus.

Das von mir bereitgestellt Coding ruft also nur das Erfassungsformular auf, ohne weitere Aktionen durchzuführen.

Ich meine mich entsinnen zu können Pittchen, in Deinem damaligen Beitrag (Du siehst wohin es führt, wenn man in einem anderen als dem originalen Thread ein Thema weiterführt? ;) ) damals gesagt zu haben, das Du im Open-Ereignis des Erfassungsformulars den Formular-Parameter OpenArgs auswerten mußt. Bei einem Formular wie "NeuenArtikelErfassen" gehe ich zum Beispiel davon aus, das das Formular nur für das Erfassen neuer Artikeldaten vorgesehen ist und man von daher die Artikelnummer im Open-Ereignis einfach in das Formularfeld für die neue Artikelnummer übertragen kann. Bei einem Formular welches gleichzeitig für die Neuerfassung, Änderung und Anzeige von Daten zuständig ist, sieht das schon etwas anders aus und ist mit ein wenig Codingaufwand verbunden.

Gruß

Arno

Pittchen
10.08.2001, 13:25
Hey Stema,

Die Hilfe zu OpArgs habe ich mir angeschaut, hat trotzdem nicht funktioniert; Trotzdem danke

Gruß und nettes Wochenende
Pittchen

Pittchen
10.08.2001, 13:26
Danke Arno,
ich werd jetzt mal nachsitzen; Einen Nachtrag habe ich allerdings schon noch:
Ich habe ein Formular zur Pflege der Stammdaten, In diesem kann mit der Combobox nach einem Artikel über dessen Nr gesucht werden. Wenn der Artikel nicht vorhanden ist, wird der Anwender gefragt, ob er diesen aufnehmen will. Falls ja, öffnet sich das form Neuen ArtikelErfassen; was dabei nicht funktioniert: die Übergabe von NewData in das Feld ArtNr; Wieso nicht?
Ich wünsche Dir ein nettes Wochenende

Gruß Pittchen

A.S.
10.08.2001, 15:03
Hallo Pittchen,

der Formularparameter OpenArgs ist ein Stringwert. Deine Artikelnummer wird mit ziemlicher Sicherheit ein numerischer Wert sein.

Ich würde so vorgehen: zunächst im Form_Open-Ereignis mittels

If Not Trim("" & Me.OpenArgs) = "" _
Then
Me.RecordsetClone.FindFirst "[ArtNr] =" & Me.OpenArgs
If Me.RecordsetClone.NoMatch _
Then
DoCmd.GoToRecord acDataForm, Me.Name, acNewRec
Me.ArtNr = Val(Me.OpenArgs)
Else
Me.Bookmark = Me.RecordsetClone.Bookmark
End If
End If

prüfen ob das Argument OpenArgs übergeben würde. Dann nachsehen ob die Artikelnummer bereits existiert (FindFirst), wenn ja das Formular auf dem entsprechenden DS positionieren (Me.Bookmark = ...), wenn nicht einen neuen DS aufrufen und die Artikelnummer bereits vorgeben. Da die Artikelnummer mit ziemlicher Sicherheit ein numerischer Wert ist, diesen über die Funktion Val() bei der Zuweisung das Argument OpenArgs in einen numerischen Wert umwandeln lassen.

Gruß

Arno

Pittchen
11.08.2001, 08:47
Nochmal Danke Arno,
ich habe in dem Forum in den letzten 6 Monaten mehr gelernt, als in zwei Jahren zuvor und das ist kein Schmus!
Gruß Pittchen