Werte aus Datenbank abfragen und akutalisieren

Hallo Leute!

Ich habe ein Problem und hoffe ihr könnt mir helfen.

Ich habe eine Datenbank mit Bauteilen in der eine Spalte(einfaches Zahlenfeld) die „Anzahl“ der noch verbleibenden Teile angibt und eine Spalte (JA/NEIN feld) mit der bezeichnung „Montiert“.

In meinem Programm gebe ich im Kopf die Bauteilnummer an. Klicke ich nun auf einen Button soll folgendes passieren:

Es soll überprüft werden wie viele Bauteile noch verfügbar sind. Sind es mehr als 1 soll die Spalte -1 gerechnet werden.
Anschließend soll noch überprüft werden ob der neue Wert 0 ist. Sollte dies der Fall sein Soll das Feld „montiert“ auf True gesetzt werden.

Es gibt also eine doppel abfrage des Feldes.
Und da komme ich nicht weiter.

Hier mein Code:

Dim abSQL As String
Dim strSQL_edit As String
Dim Anzahl As Integer

abSQL = „UPDATE tbl_auftrag SET montiert = true WHERE tbl_auftrag.auftrag_nr =“ & Me.teil_01.Value

strSQL_edit = „UPDATE tbl_auftrag SET Anzahl =Anzahl-1 WHERE tbl_auftrag.auftrag_nr =“ & Me.teil_01.Value

anzahl1 = „SELECT tbl_auftrag.anzahl AS anzahl1a FROM tbl_auftrag WHERE tbl_auftrag.auftrag_nr=Forms!frm_montage!teil_01.Value“

Anzahl = anzahl1a

If Anzahl > „0“ Then
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL_edit
DoCmd.SetWarnings True

End If

If Anzahl = „0“ Then
DoCmd.SetWarnings False
DoCmd.RunSQL abSQL
DoCmd.SetWarnings True

End If

Irgendwie fragt der Code die Spalte nur einmal ab und aktualisiert den wert nicht. Ich hoffe ihr könnt mir helfen.

Mit freundlichen Grüßen

Hallo

Ich bin DBA mit Oracle-Datenbanken. Dies ist woll SQL-Server.

  1. wo wird das Feld anzahl1a belegt ?
  2. Als erstes muss dieser select ausführt werden
    SELECT tbl_auftrag.anzahl AS anzahl1a FROM tbl_auftrag WHERE tbl_auftrag.auftrag_nr=Forms!frm_montage!teil_01.Value"

Dieser Select muss und darf immer nur eine Zeile finden

  1. Anschließend muss folgender Select ausgeführt werden

UPDATE tbl_auftrag SET Anzahl =Anzahl-1 WHERE tbl_auftrag.auftrag_nr =" & Me.teil_01.Value

Hier gilt das gleiche, muss immer einen Datensatz finden aber nicht mehr

Anschließend denn SQL-Behfehl

UPDATE tbl_auftrag SET montiert = true WHERE tbl_auftrag.auftrag_nr =" & Me.teil_01.Value

Ich bin der Meinung, wenn Anzahl immer - 1 ist, kommst Du mit einem Update aus

Natürlich muss noch ein Commit gemacht werden

Gruß
Josef

Also die gesuchten Felder sind immer eindeutig.
Die Anzahl liegt meisten im Bereich von 5-10 und muss dann runtergezählt werden.
Das Problem ist, ich weiß nicht wie ich den neuen aktualisierten Wert bekomme.
Also wie das insgesamt dann läuft

Hallo,

ich kann dir leider nicht helfen, da ich mich mit VBA-Programmierung nicht auskenne. Es müsste aber über eine if-then-else Klausel zu programmieren sein. Bitte überprüfe noch einmal die Syntax (auch die der where-Bedingungen) in Deinem Code.

Mit freundlichen Grüßen

hölderlin1843

Also den Wert übergibt der Befehl schon richtig. Nur komischerweise bekomme ich den Wert beim ersten mal und jedesmal wenn ich es wieder prüfe kommt immer wieder der erste Wert.
Habe es mit MSGbox ausgelesen.
Aber erstelle ich eine externe Abfrage kommt immer der richtige Wert. Obwohl es die gleiche Programmierung ist

Sind Deine Where-Klauseln ok?

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])

Die aktualisierten werte bekommst Du mit Select.
z.B. nach einem Update wieder einen Select durchführen.

Wenn mehrere Benutzer auf die gleichen daten zugreifen, müssen die Datensätze gesperrt werden.

Gruß
Josef