Sehr geehrter LEEESUMER
Wenn Sie Ihrem Feld diese Ereignisprozedur "Nach Aktualisierung " zuweisen, sollte es klappen
If (Me.Anzahl = 0) Then
Me.Montiert = -1
End If
Mehr braucht es nicht.
Ich füge Ihnen noch einen weiteren Tipp von ACCESS SmartTools hinzu, den Sie etwas anpassen müssten, aber der dennoch sehr hilfreich für Sie werden könnte.
+++ ACCESS-TIPP DER WOCHE +++
Aktuellen Preis automatisch ermitteln
Versionen: Access 2007, 2003, 2002/XP, 2000 und 97
In einer Artikel- oder Lagerverwaltung werden haeufig
mehrere Datensaetze mit unterschiedlichen Preisinformationen
zu einem Artikel verwendet, um beispielsweise den Verlauf
von Preiserhoehungen nachvollziehen oder den zu einem bestimmten Datum gueltigen Preis ermittelt zu koennen. Sie muessen also zum Beispiel fuer eine Einkaufsuebersicht aus mehreren Datensaetzen den Datensatz auswaehlen, der die aktuellsten Preisinformationen enthaelt oder in einer Rechnung vom 14.8.2007 den Preis verwenden, der vor einer Preiserhoehung zum 1.9.2007 gueltig ist.
So enthaelt eine Datenbank zum Beispiel die Tabelle
„Artikel“ mit den Basisdaten der einzelnen Artikel. Eine weitere Tabelle „Artikel/Preise“, die mit der Tabelle „Artikel“ ueber das Feld „Artikel-Nr“ verknuepft ist, beinhaltet einen oder mehrere Datensaetze mit Preisinformationen. Im Einzelnen sind das beispielsweise die Felder „ErfasstAm“ (Wann wurde die Preisaenderung erfasst?), „Einzelpreis“ (neuer Einkaufspreis des Artikels), „VK“ (neuer Verkaufspreis des Artikels) und „GiltAb“ (Ab wann gilt der neue EK/VK?). Aus dieser Tabelle liefert nun eine Abfrage nach dem Feld „ErfasstAm“ aufsteigend sortierte Datensaetze - der aktuellste Preis ist somit immer dem ersten Datensatz zu entnehmen.
Diese Abfrage liegt wiederum einem Unterformular zugrunde,
das im Hauptformular „Artikel“ eingebunden und in den Eigenschaften „Verknuepfen von“ und „Verknuepfen nach“ ueber die Felder „Artikel-Nr“ mit den Hauptdatensaetzen verknuepft ist. Im Unterformular werden also fuer jeden Artikel die zugehoerigen Preisinformationen mit dem aktuellsten Datensatz ganz oben angezeigt.
Um nun den jeweils aktuellsten Datensatz mit
Preisinformationen fuer jeden einzelnen Artikel zu
selektieren, werden die beiden Tabellen „Artikel“ und „Artikel/Preise“ in die Abfrage aufgenommen und ueber das Feld „Artikel-Nr“ mit der Verknuepfungseigenschaft „2: Alle Datensaetze aus ‚Artikel‘…“ (Left Join) verknuepft. Als Ergebnis erhalten Sie eine Datensatzgruppe, die alle Datensaetze aus „Artikel“ zuzueglich aller Datensaetze aus „Artikel/Preise“ beinhaltet. Sie benoetigen also noch einen Filter, der Datensaetze mit aelteren Preisinformationen
ignoriert:
Feld: ErfasstAm
Kriterium: DomMax("[ErfasstAm]"; „[Artikel/Preise]“; „[Artikel/Preise].[Artikel-Nr]=“ & [Artikel].[Artikel-Nr])
Durch die Verknuepfungseigenschaft geht die Abfrage alle Datensaetze aus „Artikel“ durch und prueft dazu die Datensaetze aus „Artikel/Preise“, bei denen das Feld „Artikel-Nr“ gleich ist. Der gezeigte Ausdruck ermittelt fuer den jeweiligen Artikel ueber „DomMax()“ den Datensatz in „Artikel/Preise“, der der Artikelnummer entspricht und der das aktuellste Datum aufweist. Damit das Kriterium erfuellt ist, muss dieses Datum mit dem Datum des in der Abfrage bearbeiteten Datensatzes aus „Artikel/Preise“ uebereinstimmen. Als Ergebnis erhalten Sie wie gewuenscht zu jedem Artikel einen Datensatz mit den aktuellsten Preisinformationen.
Ein weiteres Problem bei der Verwaltung mehrerer Datensaetze mit Preisinformationen ist die Ermittlung des Preises, der zu einem bestimmten Zeitpunkt gueltig war. Dazu setzen Sie am besten eine VBA-Funktion ein:
Function VKFuerArtikel(lngArtNum As Long, _
dtStichtag As Variant) As Currency
Dim rs As DAO.Recordset
Dim strSQL As String
Dim strFindDate As String
strFindDate = „#“ & Month(dtStichtag) & „/“ & _
Day(dtStichtag) & „/“ & _
Year(dtStichtag) & _
„#“
strSQL = "select * from [Artikel/Preise] " & _
„where [Artikel-Nr]= " & _
CStr(lngArtNum) & " order by [GiltAb]“
Set rs = CurrentDb.OpenRecordset(strSQL, _
dbOpenDynaset)
If rs.RecordCount > 1 Then
rs.FindFirst "[GiltAb] > " & strFindDate
If rs.NoMatch Then
rs.MoveLast
ElseIf rs.AbsolutePosition > 0 Then
rs.MovePrevious
End If
End If
VKFuerArtikel = rs(„VK“)
rs.Close
End Function
Fuer die Suche und Vergleiche erwartet Access ein Datum
immer im amerikanischen Format „#MM/DD/YYYY#“, so dass zunaechst eine entsprechende Zeichenkette zusammengesetzt werden muss. Ueber ein Recordset selektieren wir dann alle Datensaetze mit Preisinformationen zum gewuenschten Artikel und lassen das Ergebnis nach dem Feld „GiltAb“ sortieren. Wenn es mehr als einen Datensatz gibt, suchen wir im Recordset nach dem ersten Datensatz, bei dem das Datum gemaess Feld „GiltAb“ groesser ist, als der Stichtag. Wurde kein Datensatz gefunden, liegt der Stichtag hinter der zuletzt erfassten Preisaenderung - wir positionieren dann auf den letzten Datensatz mit der letzten, nun gueltigen Preisaenderung. Wenn ein Datensatz gefunden wurde, der ein Aenderungsdatum groesser als den Stichtag aufweist, pruefen wir, ob es sich um den ersten Datensatz im Recordset handelt. Ist das nicht der Fall, gehen wir einen Datensatz zurueck und positionieren so auf den Datensatz mit der letzten vor dem Stichtag liegenden Aenderung. Abschliessend weisen wir der Funktion den Inhalt des Feldes „VK“ aus dem aktuellen Datensatz zu und liefern so den jeweils zum Stichtag gueltigen Preis als Ergebnis.
Die Funktion koennen Sie zur Ermittlung eines aktuellen
Preises wahlweise in VBA, aber auch in einem ungebundenen Textfeld in einem Formular oder Bericht mit einer Formel beispielsweise wie folgt einsetzen:
=VKFuerArtikel([Artikel-Nr];[RGDatum])