Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: PePan am Dezember 29, 2014, 13:40:16

Titel: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: PePan am Dezember 29, 2014, 13:40:16
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
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: DF6GL am Dezember 29, 2014, 14:41:00
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...
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: PePan am Dezember 29, 2014, 15:11:31
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
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: DF6GL am Dezember 29, 2014, 15:42:25
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?
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: PePan am Dezember 29, 2014, 15:49:13
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



Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: PePan am Dezember 29, 2014, 15:54:42
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.
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: MzKlMu am Dezember 29, 2014, 17:10:49
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.
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: PePan am Dezember 29, 2014, 17:22:49
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
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: MzKlMu am Dezember 29, 2014, 17:36:26
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.
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: database am Dezember 29, 2014, 18:37:56
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
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: PePan am Dezember 30, 2014, 10:22:34
Hallo zusammen,
vielen Dank für die erneute Unterstützung.
Der VBA Code hat auf anhieb funktioniert.

Viele Grüsse
aus Köln
PePan
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: bahasu am Dezember 30, 2014, 10:37:04
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
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: MzKlMu am Dezember 30, 2014, 10:47:26
Hallo,
Zitatnur berechnet, aber nicht gespeichert wird
und dann noch wie vorgeschlagen die Ausgangswerte in einer extra Tabelle.
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: ebs17 am Dezember 30, 2014, 20:37:56
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")
Titel: Re: Abfrage beim verlassen des Feld für den aktuellen Datensatz ausführen
Beitrag von: database am Januar 01, 2015, 13:30:28
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.