collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 64
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 1
  • Punkt Benutzer Online:

* Forenstatistik

  • stats Mitglieder insgesamt: 14038
  • stats Beiträge insgesamt: 67221
  • stats Themen insgesamt: 9067
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: In der Abfrage per VBA; CurrentDB.Execute UPDATE, SET und Where-Bedingungen  (Gelesen 657 mal)

Offline Viki

  • Newbie
  • Beiträge: 17
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

 





 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23414
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..
« Letzte Änderung: Juni 19, 2018, 17:30:08 von DF6GL »
 
Folgende Mitglieder bedankten sich: Viki

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1294
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()));
Grüße von der (⌒▽⌒)
 
Folgende Mitglieder bedankten sich: Viki

Offline Viki

  • Newbie
  • Beiträge: 17
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
 

Offline MzKlMu

  • Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 7375
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.
Gruß
Klaus
 
Folgende Mitglieder bedankten sich: Viki

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23414
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.

Offline Viki

  • Newbie
  • Beiträge: 17
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







« Letzte Änderung: Juni 20, 2018, 13:23:51 von Viki »
 

Offline MzKlMu

  • Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 7375
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.
« Letzte Änderung: Juni 20, 2018, 13:19:49 von MzKlMu »
Gruß
Klaus
 
Folgende Mitglieder bedankten sich: Viki

Offline Viki

  • Newbie
  • Beiträge: 17
Hallo MzKLMu, musste erstmal gucken wie das mit Codetags geht.
Habe es geändert, so OK?
 
 

Offline MzKlMu

  • Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 7375
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.
Gruß
Klaus
 
Folgende Mitglieder bedankten sich: Viki

Offline Viki

  • Newbie
  • Beiträge: 17

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
 

Offline Beaker s.a.

  • Access Guru
  • ****
  • Beiträge: 1863
Hallo Viki,
Zitat
) AS Jahren_Datenschutz
vs.
Zitat
Where Jahre_Datenschutz = 13"
Ansonsten folge diesem Rat.
Zitat
Poste 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
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.
 
Folgende Mitglieder bedankten sich: Viki

Offline Viki

  • Newbie
  • Beiträge: 17
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.
 

Offline MzKlMu

  • Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 7375
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 ?
Gruß
Klaus
 
Folgende Mitglieder bedankten sich: Viki

Offline Viki

  • Newbie
  • Beiträge: 17
Hallo Mzkomu,

genau, der Name der Abfrage ist "Datenschutz".

Gruß