Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen

Begonnen von PePan, Dezember 29, 2014, 13:40:16

⏪ vorheriges - nächstes ⏩

PePan

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

DF6GL

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...

PePan

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

DF6GL

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?

PePan

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




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.

MzKlMu

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.
Gruß Klaus

PePan

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

MzKlMu

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.
Gruß Klaus

database

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

PePan

Hallo zusammen,
vielen Dank für die erneute Unterstützung.
Der VBA Code hat auf anhieb funktioniert.

Viele Grüsse
aus Köln
PePan

bahasu

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
Servus

MzKlMu

Hallo,
Zitatnur berechnet, aber nicht gespeichert wird
und dann noch wie vorgeschlagen die Ausgangswerte in einer extra Tabelle.
Gruß Klaus

ebs17

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")
Mit freundlichem Glück Auf!

Eberhard

database

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.