Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Viki am Juni 19, 2018, 16:28:48

Titel: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Viki am Juni 19, 2018, 16:28:48
Hallo zusammen,
brauch dringend Unterstützung.
Habe eine Abfrage erstellt, die bestimmte Datensätze aus einer Tabelle zusammenstellt z.B. Patient Name, Patient Vorname, Probeneingang und Alter der Befunde.

Nach dem neuen Datenschutzgesetz müssen die Daten nach 10 Jahren gelöscht werden. Die Abfrage berechnet das Alter der Befunde.

Meine Programmierung sieht wie folgt aus:

Ich habe einen Loginbutton bei dem nach der Prüfung von Passwort und Benutzername bei hochladen der Daten im Hintergrund folgendes ausgeführt werden soll:

Es sollen alle Daten die in der Abfrage zusammengestellt sind (wie oben beschrieben) und dessen Befundalter (älter als 10 Jahre),  die Felder Patient Name , Patient Vorname usw. geleert werden ohne, dass der komplette Datensatz gelöscht wird.

Ich habe folgendes geschrieben und brauche Eure Unterstützung weil meine Programmierung nicht funktioniert.

Die Abfrage heißt Datenschutz.
Das "Jahre_Datenschutz"-Feld ist das Feld in der Datei "Datenschutz" der das Alter des Befundes berechnet.
Patient Name ist auch ein Feld in der Datei "Datenschutz" was wenn Alter >=10 Jahre ist Patient Name geleert werden soll. 

Und so sieht das Programm aus:

If DLookup("Jahren_Datenschutz", "Datenschutz", "Jahren_Datenschutz >= 10") Then
CurrentDb.Execute "UPDATE Datenschutz SET [Patient Vorname] = Null, Where Jahre_Datenschutz = 10"

Ich würde mich sehr freuen, wenn mir jemand in der Frage weiter helfen könnte.

VG







Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: DF6GL am Juni 19, 2018, 17:23:13
Hallo,

die Situation ist unklar...
Wozu eine Abfrage, wenn alle Felder in der Tabelle vorhanden sind?
Wie lauten die Feldnamen genau?
Wie lautet der SQL-String der Abfrage?


Es sollte reichen:

CurrentDb.Execute "UPDATE tblPatientenBefunde SET [Patient Nachname] = Null,[Patient Vorname] =Null  Where [Befunddatum]<=Dateadd('yyyy',Date(),-10)"



wobei
-- auf Sonder- und Leerzeichen in Objektnamen verzichtet werden sollte.
-- "Alter"-Angaben nicht statisch gespeichert werden sollten.


Vermutlich ist auch das Tabellenkonzept nicht DB-konform erstellt.

Auf die Auslegung der DSVGO für diesen Fall gehe ich jetzt mal nicht ein..
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Lachtaube am Juni 19, 2018, 17:28:24
Das folgende Prinzip sollte zum Ziel führen (anfangs mit einem Backup arbeiten).
UPDATE Tabellenname
SET    EinFeld = Null,
       NochEinFeld = Null
WHERE  DasDatumsfeld < DateSerial(Year(Date()) - 10, Month(Date()), Day(Date()));
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Viki am Juni 20, 2018, 09:55:53
Ich danke Euch beiden DF6GL und Lachtaube.

Im Anhang de Übersicht meiner Abfrage in der ich gerne Datensätze die älter als 10 Jahre leeren will.
Ihr spricht immer von Tabellen, geht es etwa nicht wenn ich dieses leeren, in der Abfrage ansteuere?

Habe beide Vorschläge getestet und bekomme Probleme bei der Kompilierung (Siehe Anhang).

Würde mich freuen, wenn Ihr draufschauen könnt und eine Idee hättet.

Vielen Dank.

VG
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: MzKlMu am Juni 20, 2018, 11:07:01
Hallo,
Du hast aus der Abfrage VBA Code gemacht. Der von Lachtaube gezeigte Text ist aber SQL. Das muss per Execute als Abfrage ausgeführt werden, wie Du es in im auskommentierten Teil bereits hast. Das wird aber leider von der Fehlermeldung verdeckt.

PS:
Es ist wenig hilfreich VBA Code als Bild zu senden, den kopiert man und fügt diesen (mit Codetags= hier als Text ein. Dann könnte man auch gleich einen Verbesserungsvorschlag versuchen. Das als Bild hier zu zeigen ist daher eher kontraproduktiv.
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: DF6GL am Juni 20, 2018, 11:30:01
Hallo,

an einem Bild glaube ich erkennen zu können, dass es [Patient Nachname] nicht gibt und das Feld [Patient Name] heißt... Also die Namen anpassen bei "Currentdb.Execute "......." 

Entspr. PS von Klaus:

Poste den SQL-String der Abfrage.
Poste den Screenshot des Beziehungsfensters  (alle Tabellenfeldnamen sichtbar/lesbar)

Update-Abfragen werden sinnvollerweise auf Tabellen abgesetzt und nicht auf Abfragen.  Die Abfrage dürfte, da sie vermutlich eine Berechnung enthält, sowieso nicht aktualisierbar sein.
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Viki am Juni 20, 2018, 13:06:36
hier der SQL-String der Abfrage.
[code]SELECT Labornummer
,Eingangsdatum
,DateDiff("yyyy", [Eingangsdatum], DATE ())
+ (
Format(DATE (), "mmdd") < Format(
[Eingangsdatum], "mmdd")
) AS Jahren_Datenschutz
,[Patient Name]
,[Patient Vorname]
,[Patient Straße]
,Patient PLZ]
,[Patient Stadt]
,[Patient Geburtsdatum]
FROM [AAT Datenbank]

[/code]
Im Anhang besser lesbare  Screenshots.

Meine Gedanke war
Code:
CurrentDb.Execute "UPDATE Datenschutz SET [Patient Vorname] = Null Where Jahre_Datenschutz = 13"

d.h. die Abfrage "Datenschutz" soll updatet werden und das Feld [Patient Vorname] soll geleert werden, wenn im Feld [Jahre_Datenschutz] die Zahl 13 steht.

Ist mein Auslegung richtig?
Die Datenbank meldet einen Laufzeutfehler 3061 (1 Parameter wurde erwartet, aber es wurden zu wenig Parameter übergeben).

VG







Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: MzKlMu am Juni 20, 2018, 13:14:30
Hallo,
das PDF ist völlig fehl am Platz. Hatte ich Dir schon mal geschrieben.
Zeige den VBA Code hier als Text (mit Codetags !!!!) und nicht als Bild.
Es schreibt doch niemand Texte aus Bildern ab.
Da muss man nicht extra ein PDF machen.
Und formatiere den SQL Code.
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Viki am Juni 20, 2018, 13:26:14
Hallo MzKLMu, musste erstmal gucken wie das mit Codetags geht.
Habe es geändert, so OK?
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: MzKlMu am Juni 20, 2018, 13:28:37
Hallo,
poste bitte den kompletten VBA Code wie im Bild zu sehen als Text. Das als Bild zu zeigen ist sinnlos.
Das mit den Codetags ist so richtig.
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Viki am Juni 20, 2018, 13:54:42

alles was mit mit meinem Vorhaben (Code) zutun hat ist:

Vorher erstellte Abfrage mit dem Namen "Datenschutz" und darin befindenden Feldern: [Labornummer],[Eingangsdatum], [Jahre_Datenschutz](hier wird das Alter des Datensatzes ermittelt, wenn 13, dann sind es 13 Jahre nach Eingang der Probe), [Patient Name], [Patient Vorname], [Patient Straße].

und der darunter befindender Code soll die von mir gewollte Leerung der Patientenbezogener-Daten wenn Datensatz älter als 10 Jahre nach Eingang, vollzogen werden.

Set db = CurrentDb
CurrentDb.Execute "UPDATE Datenschutz SET [Patient Vorname] = Null, Where Jahre_Datenschutz = 13"


davor befindende auskommentierte Cods (grün) sind Spielereien und weiter oben ist ein super langer Code, der das Login und Benutzer regelt, hat mit meinem Vorhaben nichts zu tun.

VG
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Beaker s.a. am Juni 20, 2018, 13:55:34
Hallo Viki,
Zitat) AS Jahren_Datenschutz
vs.
ZitatWhere Jahre_Datenschutz = 13"
Ansonsten folge diesem Rat.
ZitatPoste den Screenshot des Beziehungsfensters  (alle Tabellenfeldnamen sichtbar/lesbar)
Das wäre im Moment das einzige Bild mit dem man etwas anfangen könnte.
Denn das Datenmodell scheint überholungsbedürftig. Die Patientendaten gehören
doch gar nicht in diese Tabelle ([AAT Datenbank]?); da gehört nur der FK zum
Patienten rein. Diesen kann man beim "Löschen" auf einen Dummy-Patienten
(Name: Gelöscht) setzen, womit dann auch alle jüngeren Befunde weiterhin
mit Namen angezeigt werden können. "Gelöscht" wird dann in "[AAT Datenbank]"
über ein Feld "Loeschdatum".
gruss ekkehard
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Viki am Juni 20, 2018, 14:09:53
Hallo Beaker s.a,

leider habe ich die Grundstruktur der Datenbank so übernommen und die Datenbank nicht selbst aufgebaut. Es gibt eigentlich nur eine Tabelle mit dem Namen [AAT-Datenbank]. In dieser Tabelle werden alle Daten wie Patient Name , Vorname, Anschrift, Arzt Name, Vorname, Anschrift, Patienten Erkrankungen, Laborwerte usw. gespeichert. Ich darf natürlich hier nicht alles offenlegen weil Datenschutz zu beachten ist.

Von dieser [AAT-Datenbank] habe ich die Abfrage wie beschrieben erstellt und versuche über diese Abfrage die patientenbezogene Felder die älter sind als 10 Jahre zu leeren, ohne den Datensatz komplett zu löschen. Das Löschen des Datensatzes in des Abfrage funktioniert ohne Probleme hier der Code:

Set db = CurrentDb
CurrentDb.Execute "delete from Datenschutz where Jahren_Datenschutz >= 10"


wieso funktioniert die Leerung der patientenbezogener Felder in der Abfrage nicht?, das ist mein Problem.
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: MzKlMu am Juni 20, 2018, 14:35:15
Hallo,
eigentlich kann der gezeigte Code zum Löschen auch nicht funktionieren. Die Tabelle heißt doch nicht Datenschutz sondern [AAT-Datenbank] oder nicht.
Oder ist Datenschutz der Name eine Abfrage ?
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Viki am Juni 20, 2018, 14:43:33
Hallo Mzkomu,

genau, der Name der Abfrage ist "Datenschutz".

Gruß
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: MzKlMu am Juni 20, 2018, 14:54:02
Hallo,
beziehe Dich in der Aktaulisierungabfrage auf die Tabelle.
UPDATE  [AAT-Datenbank] SET Vorname = Null
WHERE DateDiff("yyyy",[Eingangsdatum],Date())+(Format(Date(),"mmdd")
<Format([Eingangsdatum],"mmdd"))>=10
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: DF6GL am Juni 20, 2018, 15:13:32
Hallo,

warum liest Du nicht die Postings?



ZitatCurrentDb.Execute "UPDATE tblPatientenBefunde SET [Patient Nachname] = Null,[Patient Vorname] =Null  Where [Befunddatum]<=Dateadd('yyyy',Date(),-10)"

angepasst an Deine verwendeten Namen:


CurrentDb.Execute "UPDATE [AAT Datenbank] SET [Patient Name] = Null,[Patient Vorname] =Null  Where [Eingangsdatum]<=Dateadd('yyyy',Date(),-10)"

Weitere Felder kannst Du sicherlich selbst einfügen.


Die Abfrage zu aktualisieren, geht, wie auch schon gesagt, vermutlich wegen der darin enthaltenen Berechung nicht.
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Beaker s.a. am Juni 20, 2018, 21:45:52
ZitatEs gibt eigentlich nur eine Tabelle mit dem Namen [AAT-Datenbank].
Na, da freuen wir uns schon auf die nächsten Probleme  ;)
Daran musst du arbeiten bevor du weitermachst mit Abfragen und
Formularen, - Stichwort: Normalisierung).
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Viki am Juni 21, 2018, 13:02:40
Hallo DF6GL,
Zitat von: DF6GL am Juni 20, 2018, 15:13:32
warum liest Du nicht die Postings?
ich lese jedes Wort und Posting.
Ich habe schon auch versucht auf die Tabelle [AAT Datenbank] zu zugreifen und hatte Fehlermeldung. Habe es erneut probiert mit deinem Vorschlag Code:
CurrentDb.Execute "UPDATE [AAT Datenbank] SET [Patient Name] = Null,[Patient Vorname] =Null  Where [Eingangsdatum]<=Dateadd('yyyy',Date(),-10)"

leider wieder Fehlermeldung, habe auch schon Kürzungen des Codes vorgenommen und bekomme den selben Fehler. Die Kürzung sieht so aus.
code]CurrentDb.Execute "UPDATE [AAT Datenbank] SET [Patient Vorname] =Null  Where [Eingangsdatum]<=Dateadd('yyyy',Date(),-10)"[/code]

Die Fehlermeldung lautet: Laufzeitfehler '5':
Ungültiger Prozeduraufruf

Ich habe eine Übersicht der [AAT Datenbank] in der Entwurfsansicht angehangen um sichtbar zu machen, wie viel ungefähr Daten in der Datenbank gespeichert werden, möchte nur daraus Patientenbezogene Daten leeren.

Verstehe nicht weshalb das nicht funktioniert.

VG





Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: DF6GL am Juni 21, 2018, 14:13:57
Hallo,

dieser Fehler stammt nicht von dem Update-Statement.

Kopiere den String

ZitatCurrentDb.Execute "UPDATE [AAT Datenbank] SET [Patient Name] = Null,[Patient Vorname] =Null  Where [Eingangsdatum]<=Dateadd('yyyy',Date(),-10)"


in das Direktfenster und führe ihn aus.  Prüfe dann das Ergebnis und berichte..

Zur Fehlersuche:

Setz einen Haltepunkt an den Anfang der Prozedur und durchlaufe den Code im Einzelschritt...

Poste die gesamte aktuelle Prozedur mit C&P.
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Viki am Juni 21, 2018, 15:48:57
Hallo DF6GL,
super Tipp.
Habe jetzt in das Direktfenster den von Dir vorgeschlagenen Code eingefügt und die selbe Fehlermeldung bekommen.

ZitatDie Fehlermeldung lautet: Laufzeitfehler '5':
Ungültiger Prozeduraufruf

Dabei ist mir aufgefallen, dass wenn ich im Code anderes Feld z.b. Labornummer angesteuert habe, wurde die Prozedur fehlerfrei ausgeführt und das Feld [Patient Vorname] geleert. Es scheint Problem mit dem Datum zu sein, sobald das Datum angesteuert wird kommt dieser Laufzeitfehler. :(((
Muss man Datum umformatieren oder in dem Code das Datum anders programmieren? Das Datum wird bei mir in der Europäischen Variantenform angezeigt ( 21.06.2018).

Den Haltepunkt habe ich auch gesetzt und beim ersten Einzelschritt tauch der oben genannter Fehler auf.
Ich vermute, dass es mit dem Datum zusammenhängt, denn die anderen Felder scheinen zu funktionieren.

Hätte jemand Ideen?

VG

Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: DF6GL am Juni 21, 2018, 16:23:05
Hallo,
ja, die Parameter-Reihenfolge für die DateAdd-Funktion  ist verdreht...  :)


ZitatCurrentDb.Execute "UPDATE [AAT Datenbank] SET [Patient Name] = Null,[Patient Vorname] =Null  Where [Eingangsdatum]<=Dateadd('yyyy',-10,Date())"
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Viki am Juni 26, 2018, 08:37:07
Hallo DF6GL,

war unterwegs und konnte nicht antworten.
Vielen Dank für die Unterstützung, jetzt funktioniert es sowohl über die Abfrage als auch über die Tabelle.

Super, alles gelöst.

VG
Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Viki am Juni 26, 2018, 12:45:50
Hallo,

ich habe doch noch eine Kleinigkeit und zwar, wenn bei Hochfahren der Datenbank das Update
ZitatCurrentDb.Execute "UPDATE [AAT Datenbank] SET [Patient Name] = Null,[Patient Vorname] =Null  Where [Eingangsdatum]<=Dateadd('yyyy',-10,Date())"
ausgeführt wird, werden die Felder [Patient Name], [Patient Vorname] geleert aber [Patient Geburtsdatum] nicht, woran kann das liegen? das Feld [Patient Geburtsdatum]  ist auch eine Datumfeld.
Des weiteren beim Hochfahren der Datenbank nach dem leeren (also wo die Felder schon mal leer sind) wird ein Fehler angezeigt :
Laufzeitfehler 3061 "1 Parameter wurde erwartet, aber es wurden zu wenig Parameter übergeben"

Hat das damit zu tun, dass jetzt die Felder leer sind und vorher ein weiterer Code benötigt wird der die leeren Felder ignoriert?
wäre hier eine If-Funktion nötig?
Z.B.

If Not IsNull(Me.BeforeUpdate) Then
Set db = CurrentDb
CurrentDb.Execute "UPDATE [Datenschutz] SET [Patient Nachname] = Null,[Patient Vorname] = Null Where [Eingangsdatum]<=Dateadd('yyyy',-10,Date())"
End If

wäre super wenn jemand eine Idee hätte.

VG

Titel: Re: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen
Beitrag von: Viki am Juni 26, 2018, 15:54:41
Hallo,

habe die Ursache gefunden, es war ein Fehler in dem Namensfeld der von mir beschriebenen Fehler verursachte.
Jetzt wird auch das Feld mit der Bezeichnung [Patient Geburtsdatum] geleert und es wird keine If-Funktion für die leeren Felder benötigt.

VG