Hallo zusammen,
habe folgendes Problem.
Ich habe ein Formular, in dem ich Daten in mehrer Felder eingebe.
Das Abfragen beim verlassen eines bestimmten Feld ausgeführt werden bekomme ich gerade noch so hin, aber dass eine Abfrage nur den aktuellen Datensatz verändern soll. das schaffe ich nicht.
Ist das überhaupt möglich?
viele Grüsse aus Köln
Hallo,
"Das Abfragen beim verlassen eines bestimmten Feld "
Was meinst Du damit?
"dass eine Abfrage nur den aktuellen Datensatz verändern soll"
das ist gleichfalls unklar.
Beschreibe das Problem mal genauer...
Hallo DF6GL
Beim velassen eines Formularfeld, meine ich "AfterUpdate"
Bei der Abfrage, handelt es sich, um eine Aktualisierungsabfrage und die Abfrage erzeugt einen Wert, der in der Abfrage berechnet wird.
Dieser wert, soll aber immer nur den aktuellen Datensatz aktualisieren.
Private Sub Annahmedatum_AfterUpdate()
DoCmd.SetWarnings False
DoCmd.OpenQuery "WEM DATUM anfügen", acNormal, acEdit (erzeugt WEM Datum und fügt Wert an)
Me!WEM = Null
DoCmd.OpenQuery "WEM ersetzen", acNormal, acEdit (ersetzt WEM durch WEM Datum)
DoCmd.SetWarnings True
End Sub
Hallo,
so wird das nix.. Mit Docmd.Openquery eine Aktualisierungs-Abfrage zu starten , wird eher in die Hose gehen.
Wie lautet der SQL-String der Abfragen "WEM DATUM anfügen" und "WEM ersetzen" ?
Wie heißt das Formularfeld, in dem die akt. Datensatz-ID steht?
Beziehen sich die Aktualisierungen auf dieselbe Tabelle, an die das Formular gebunden ist?
Hallo,
SQL für WEM Datum anfügen:
UPDATE WEM INNER JOIN [Formular Eingabe] ON WEM.WEM = [Formular Eingabe].WEM SET WEM.[WEM DATUM] = [Formular Eingabe].[WEM Datum erzeugen];
SQL für WEM ersetzen:
UPDATE WEM SET WEM.WEM = [WEM].[WEM DATUM];
DATENSATZ ID: WEM
ja die Aktualisierung bezieht sich auf die selbe Tabelle.
PePan
zur Erklärung:in dem Formular, werden verschiedene Felder ausgefüllt,
zwei davon sind besonders wichtig.
WEM und Annahmedatum.
Wenn die WEM und das Annahmedatum eingetragen sind, wird aus beiden Werten ein Wert erzeugt.
Dieser neue WERT soll den WEM Wert ersetzen.
Das funktioniert soweit mit den Abfragen, aber es werden immer alle Datensätze erneut verändert.
Das möchte ich verhindern.Es soll immer nur der aktuelle Datensatz im Feld WEM verändert werden.
Hallo,
dann musst Du in den Abfragen auf den aktuellen Datensatz Bezug nehmen.
Zeige mal den SQL Text der Abfragen.
Es wäre auch ganz gut, wenn Du mal den Sinn des Vorhaben erklären würdest, möglicherweise gibt es ja eine andere Lösung. Wahrscheinlich wird gar keine Abfarge benötigt, sondern nur eine Zeile VBA zur Aktualisierung des Wertes.
ZitatWenn die WEM und das Annahmedatum eingetragen sind, wird aus beiden Werten ein Wert erzeugt.
Was ist das für ein Wert und WIE wird der erzeugt.
Hallo MzKlMu,
der WEM wert ist eine beliebige Zahl, die ich vorgegeben bekomme.
Da sich dieser Wert aber alle paar Jahre wiederholen kann, würde ich gerne das Jahr aus dem Annahmedatum zu dem WEM Wert dazufügen.
Das Problem wurde hier in dem Forum schon gelöst.
aus 1234 und 01.01.14 wird 14/1234.
Dieser Neue Wert 14/1234 soll nun den alten Wert 1234 ersetzen.
Neuer WEM Wert wäre dann bei dem Datensatz 14/1234
SELECT WEM.*, Right(Year([Annahmedatum]),2) & "/ " & [WEM].[WEM] AS [WEM Datum erzeugen]
FROM WEM
ORDER BY WEM.WEM;
SQL für WEM Datum anfügen:
UPDATE WEM INNER JOIN [Formular Eingabe] ON WEM.WEM = [Formular Eingabe].WEM SET WEM.[WEM DATUM] = [Formular Eingabe].[WEM Datum erzeugen];
SQL für WEM ersetzen:
UPDATE WEM SET WEM.WEM = [WEM].[WEM DATUM];
PePan
Hallo,
meiner Meinung nach ist das der falsche Ansatz.
Du solltest eine weitere Tabelle anlegen, in der die Entwicklung des WEM Wertes gespeichert wird. Die Tabelle benötigt einen Bezug (Fremdschlüssel) zur WEM Tabelle.
Kriegst Du einen neuen Wert wird der einfach eingetragen mit dem Fremdschlüssel. Das lässt sich mit einem Unterformular automatisieren, sodass nur der neue Wert eingetragen wird.
Hallo,
wie Franz schon nachgefragt hat (ID des aktuellen DS) und MzKlMu angemerkt hat (falscher Ansatz) ...
Bring das ID Feld deiner Formular-Datenherkunft auf das Formular wenn du das Problem mit SQL lösen willst.
Das Feld WEM muss ja bereits dort sein, sonst könntest du ja keinen Wert eintragen.
Dim WEMneu as String
WEMneu = Right(Year(Me.Annahmedatum),2) & "/ " & Me.WEM
CurrentDB.Execute ("UPDATE WEM SET WEM.WEM='" & WEMneu & "' WHERE ID=" & Me.DeinIDFeld) dbFailOnError
Oder du löst das ohne SQL z.B. beim Verlassen des Feldes 'Annahmedatum', wenn dieses ein Datum enthält.
Wenn das Feld 'Annahmedatum' in der Eingabereihenfolge NACH WEM kommt dann schreibe ins Ereignis 'Nach Aktualisierung' von 'Annahmedatum' - sonst halt ins gleiche Ereignis von einem anderen geeigneten Feld:
Private Sub Annahmedatum_AfterUpdate()
If Not IsNull(Me.Annahmedatum) Then
Me.WEM = Right(Year([Annahmedatum]),2) & "/ " & Me.WEM
Else
MsgBox "Es wurde kein Annahmedatum erfasst"
End If
End Sub
Hallo zusammen,
vielen Dank für die erneute Unterstützung.
Der VBA Code hat auf anhieb funktioniert.
Viele Grüsse
aus Köln
PePan
Hi,
wie sicher ist es, dass das Annahmedatum nicht erneut geändert wird?
Wenn das mehrfach passiert, droht ein Bandwurm für WEM.
Ich halte es für besser, wenn der aus dem Jahr und WEM ermittelte Wert nur berechnet, aber nicht gespeichert wird.
Harald
Hallo,
Zitatnur berechnet, aber nicht gespeichert wird
und dann noch wie vorgeschlagen die Ausgangswerte in einer extra Tabelle.
Right(Year([Annahmedatum]),2)
Mich packt immer das Grausen, wenn auf Zahlen Textverarbeitung angewendet wird. Textverarbeitung ist langsamer als "richtige" Mathematik, zuvor wird dann auch eine interne Typumwandlung notwendig.
Zahlenrechnung:
Debug.Print Year([Annahmedatum]) - 2000
Debug.Print Year([Annahmedatum]) mod 100
... oder einfache Formatierung
Debug.Print Format([Annahmedatum], "yy")
Hallo,
trotz eurer Kritiken an der vorgeschlagenen Version - die sicher berechtigte Argumente enthalten - darf ich 'zu meiner Verteidigung' anmerken, dass es sich hierbei um einen einzelnen Datensatz handelt, der im Zuge der Dateneingabe in einem Feld eine 'sprechende Nummerierung' erhält, die letztendlich im Textformat vorliegt. Es hätte sicher nicht geschadet,
die Sache mit der Formatfunktion zu lösen, im aktuellen Fall sehe ich aber die Einbuße am Performancesektor als vernachlässigbar.
Zitatwie sicher ist es, dass das Annahmedatum nicht erneut geändert wird
Ich gehe davon aus, dass das nicht passieren wird, wenn doch müsste man alle Datumseingaben in Datenbanken in Hinblick auf Richtigkeit und / oder Beständigkeit in Zweifel ziehen.
Zitatund dann noch wie vorgeschlagen die Ausgangswerte in einer extra Tabelle
Ich persönlich würde bspw. auch keine zusammengesetzte Auftragsnummer/Kundennummer udgl. in einer eigenen Tabelle hinterlegen sondern immer in der Tabelle in der auch der zugehörige PK zu finden ist.
Zitatzuvor wird dann auch eine interne Typumwandlung notwendig
Die wird m.M immer notwendig sein, ob der Wert nun gespeichert wird oder zur Anzeige ermittelt wird sowie auch im Zuge einer Abfrageausführung da, wie schon erwähnt, das Ergebnis als Text dargestellt wird.
Wobei ich für die Verwendung in einer Massenverarbeitung wie z.B. zur Aktualisierung einer größeren Anzahl von DS ebenfalls die Formatfunktion bevorzugen würde.