Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

SQL Statement Fehler Rückgabe in VBA

Frage Entwicklung Datenbanken

Mitglied: AMStyles

AMStyles (Level 1) - Jetzt verbinden

28.10.2011 um 09:47 Uhr, 5407 Aufrufe, 21 Kommentare

Hallo Foren User,

in einem SQL Statement lösche ich einen Datensatz aus einer Tabelle, die wiederum mit einer anderen verknüpft ist (Schlüssel).
Wenn dieser Eintrag nirgendwo referenziert ist, klappt das löschen ohne Probleme.
Jedoch wenn dieser auf eine andere Tabelle referenziert, dann müsste mir SQL einen Fehler zurückgeben.
Direkt auf dem SQL Server wird auch ein Fehler ausgegeben.

01.
CurrentDb.Execute "DELETE FROM PRJVERWTSTADMIN_PRJV_PROJEKT WHERE PROJEKT = 'Projekt1"
Kann man irgendwie mit OpenRecordset oder ähnlichem den SQL Fehler speichern?
Hierbei handelt es sich um Access 2007, VBA.

LG
AMStyles
Mitglied: 83928
28.10.2011 um 11:10 Uhr
Hi,
(Du schon wieder (; )

Die allgemeine Fehlerbehandlung mit dem Err-Objekt sollte doch ausreichen. Oder sehe ich hier was falsch?


01.
On Error Resume Next 
02.
CurrentDb.Execute ("delete * from tabellle1") 
03.
If Err.Number <> 0 Then MsgBox Err.Description, , Err.Number 
04.
On Error GoTo 0
(allgemeines Beispiel)
Bitte warten ..
Mitglied: AMStyles
28.10.2011 um 11:21 Uhr
Hallo abaaba,

ich habe es gerade ausprobiert, jedoch ohne Erfolg.
Er springt einfach nicht in das If rein...

AMStyles
Bitte warten ..
Mitglied: SlainteMhath
28.10.2011 um 11:32 Uhr
Moin,

versuchs mal hiermit

01.
 If DBEngine.Errors.Count > 0 Then 
02.
        For i = 0 To DBEngine.Errors.Count - 1 
03.
            msgbox DBEngine.Errors(i).Description & " in " & DBEngine.Errors(i).Source & " (" & DBEngine.Errors(i).Number & ")" 
04.
        Next i 
05.
End If
lg,
Slainte
Bitte warten ..
Mitglied: AMStyles
28.10.2011 um 11:36 Uhr
Servus,

da kommt die Meldung "Eigenschaft nicht gefunden. in DAO.Properties (3270).
Egal ob es funktioniert oder nicht.....

LG,
AMStyles
Bitte warten ..
Mitglied: SlainteMhath
28.10.2011 um 11:44 Uhr
Aha.. .und wo? evtl gibts eine der Properties nicht (mehr - code is aus Access 2002) - Musst mal bischen testen.
Bitte warten ..
Mitglied: 83928
28.10.2011 um 11:45 Uhr
Was genau möchtest Du machen?
den SQL Fehler speichern?

Das ist ja mit leichter Abänderung der o.g. Zeilen möglich. Und was soll außerdem noch passieren?

Allgemeine Fehlerbehandlung würde ich zu den Grundlagen von VBA zählen, auch wenn es aufgrund der Eigenschaften dieser Sprache häufig ignoriert wird.
Bitte warten ..
Mitglied: 83928
28.10.2011 um 11:48 Uhr
ah, und wenn er nicht "ins IF springt" liegt es vermutlich daran das Du die On error resume next nicht ausführst.
Bitte warten ..
Mitglied: AMStyles
28.10.2011 um 13:51 Uhr
Zitat von 83928:
Was genau möchtest Du machen?
> den SQL Fehler speichern?


ich habe eine Liste (Listenfeld), diese holt die Daten aus einer Tabelle, wenn ich in der Liste einen Eintag löschen möchte, wird im Hintergrund der komplette Datensatz gelöscht (Tabelle) jedoch passiert das nicht bei Einträgen, die wiederrum in einer anderen Tabelle benutzt werden. Das heißt, er läuft ganz normal durch, und zeigt am ende an, dass der Datensatz erfolgreich gelöscht wurde, obwohl der genau dies nicht kann, da auf SQL Ebene dieser Fehler passiert, wenn ich den Befehl im Management Studio ausführe.

In VBA möchte ich diesen Fehler abfangen, und wenn dieser geworfen wird, soll eine andere Meldung ausgegeben werden, als Datensatz erfolgreich gelöscht.
Bitte warten ..
Mitglied: AMStyles
28.10.2011 um 14:35 Uhr
doch habs reinkopiert und das SQL Statement abgeändert
Bitte warten ..
Mitglied: SlainteMhath
28.10.2011 um 14:40 Uhr
Also eigentlich wäre die saubere Methode eigentlich

1. Prüfen ob noch abhängige Datenseätze in anderen Tabelle vorhanden sind
2. Wenn nein => löschen
3. Wenn Ja => Fehler
Bitte warten ..
Mitglied: Biber
28.10.2011 um 17:06 Uhr
Na ja, SlaintheMhath,

Zitat von SlainteMhath:
Also eigentlich wäre die saubere Methode eigentlich

1. Prüfen ob noch abhängige Datenseätze in anderen Tabelle vorhanden sind
2. Wenn nein => löschen
3. Wenn Ja => Fehler

Noch eigentlicher wäre die sauberere Methode vorher mal einen Plan zu machen, wie der fachliche Zusammenhang und die Abhängigkeiten denn nun gestrickt werden sollen.

  • entweder es sollen alle abhängigen Child-Sätze gelöscht werden, wenn in der PRJVERWTSTADMIN_PRJV_PROJEKT ein Projekt gelöscht werden soll. Dann ist die FK-Constraint ein "ON DELETE CASCADE" und es gibt keinen Fehler.
  • oder es dürfen keine Sätze gelöscht werden, die Childsätze haben, weil die FK-Constraint "ON DELETE RESTRICT" ist. Dann kann ich, wenn ich doch weiss, dass es eh niemals nicht klappen kann, alle Sätze mit Childsätzen in einer passenden WHERE-Kalusel ausnehmen. Also ein LEFT JOIN mit der Childtabelle und "WHERE Childtab.Whatever IS NULL"
  • oder aber es dürfen keine Sätze in der PRJVERWTSTADMIN_PRJV_PROJEKT physikalisch gelöscht werden, sondern werden stattdessen logisch gelöscht (in einem Feld INAKTIV oder DELETED markiert.). Dann kann die FK-Constraint sein wie sie will bzw. wie sie grad zufällig definiert wurde.

Grüße
Biber
Bitte warten ..
Mitglied: SlainteMhath
02.11.2011 um 08:54 Uhr
Moin Biber

natürlich kann ich alles per FK Contraints in die DB zementieren. Allerdings ist dann immer noch das Problem, dem User eine sinnvolle Fehlermeldung auszugeben. I.d.R. hilft dem Anwender ein "Kann nicht gellöscht werden, weil...." mehr als ein "ODBC Call falied -- FK Contraint violated..."

Und
ON DELETE CASCADE
mag ich persönlich nicht, weil u:u. ein DELETE ganze Tabellen oder gar Datanbanken leer macht (Alles schon gesehen ) jaja ich weis, auch das lässt sich durch Planung verhindern.

g,
Joerg
Bitte warten ..
Mitglied: Biber
02.11.2011 um 09:26 Uhr
Moin SlaintheMhath,

ja nee, ich sehe es in diesem Fall nicht so, dass hier dem Endanwender eine sinnvolle Fehlermeldung helfen könnte.

Wie der viel zu früh verstummte Beitragsersteller geschrieben hat, ist der "Plan" doch, eine Batchverarbeitung, ein "DELETE... Where projekt ='XY'" auf Knopfdruck zu machen.

Dann kann ich sehr wohl im Konzept entscheiden, ob
  • das DELETE-Knöpfchen überhaupt angeboten wird, wenn Childsätze vorhanden sind
  • ob denn, wenn der befugte Anwender sagt "Dieses Projekt ist tot", auch alle Childsätze gelöscht werden, also die DB mit ON DELETE CASCADE hilft
  • und die allerallerallerunkomfortabelste Lösung ist, dem Endanwender zu sagen "Hey, du musst vorher alle Childsätze löschen, sonst geht nix."

Mein Kommentar oben sollte nur aussagen: "Menno, wenn jetzt beim Löschen eines Parent-Satzes erst über das Problem nachgedacht wird, dann ist es ein bisschen spät".

Grüße
Biber
Bitte warten ..
Mitglied: AMStyles
02.11.2011 um 10:17 Uhr
Hallo Biber,

sorry, dass ich den "Plan" nicht richtig beschrieben habe.
Jetzt weiß ich zumindest worauf ich achten muss, jedoch noch keine Ahnung wie ich das Umsetzten kann (vom code her).
Die 3te Variante "und die allerallerallerunkomfortabelste Lösung ist, dem Endanwender zu sagen "Hey, du musst vorher alle Childsätze löschen, sonst geht nix."" würde mir sehr helfen.

Grüße,
AMStyles
Bitte warten ..
Mitglied: 83928
02.11.2011 um 10:23 Uhr
Die 3te Variante "und die allerallerallerunkomfortabelste Lösung ist, dem Endanwender zu sagen "Hey, du musst
vorher alle Childsätze löschen, sonst geht nix."" würde mir sehr helfen.

Des is a Witz, oder?
Bitte warten ..
Mitglied: AMStyles
02.11.2011 um 10:36 Uhr
Zitat von 83928:
> Die 3te Variante "und die allerallerallerunkomfortabelste Lösung ist, dem Endanwender zu sagen "Hey, du musst
> vorher alle Childsätze löschen, sonst geht nix."" würde mir sehr helfen.

Des is a Witz, oder?

Nee, ich hab im moment keine Ahnung wie ich das Abfangen kann, dass geprüft wird, ob es entsprechende Datensätze gibt.
Bitte warten ..
Mitglied: 83928
02.11.2011 um 10:51 Uhr
Deine Planung scheint schwer verständlich. In den meisten Projektplanern ist es ja so, dass alle Childdatensätze eines Projekts 'automatisch' gelöscht werden, sobald das Projekt selber gelöscht wird -> Biber-Variante 2.
Es erschliesst sich nicht der Sinn, warum Du in diesem Fall eine Meldung ausgeben willst und was weiter passieren soll.....
Bitte warten ..
Mitglied: AMStyles
02.11.2011 um 11:08 Uhr
Habe mir nochmals das Projekt angeschaut, und bin jetzt endgültig zum Entschluss gekommen, dass beide Varianten für mich Richtig sind.

Und zwar soll der Hinweis kommen "Es bestehen Childdatensätze, möchten Sie trotzdem das Projekt XY löschen?" mit den Buttons Ja, Nein.
Erst dann, soll bei "Ja" das Projekt komplett gelöscht werden mit Childsätze.

Grüße,
AMStyles
Bitte warten ..
Mitglied: 83928
02.11.2011 um 11:23 Uhr
Dann die Löschweitergabe einrichten (Biber-2-Variante) und vor der Delete-Abfrage mittels einer Select-Abfrage bestimmen, ob Childdatensätze vorhanden sind.

Und vorher vielleicht doch noch mal überlegen ob man den User mit sowas wie "Childdatensätze" behelligen möchte oder ob nicht allgemein die Frage reicht: "Möchten Sie das Projekt wirklich löschen? Ja/Nein" - unabhängig davon ob Child- DS existieren oder nicht.

Gruß
Bitte warten ..
Mitglied: AMStyles
02.11.2011 um 11:26 Uhr
ok und wie richte ich dies ein?
Mir ist nicht ganz Klar, wie ich das in VBA umsetzten könnte.

Grüße & Danke,
AMStyles
Bitte warten ..
Mitglied: 83928
02.11.2011 um 12:48 Uhr
Du musst nicht viel in VBA machen! Das Löschen der Child-DS übernimmt Dein Backend - sofern eingerichtet ("ON DELETE CASCADE")

und der VBA-Teil sieht dann ungefähr so aus:

01.
If MsgBox("soll das Projekt gelöscht werden?", vbYesNo) = vbYes Then _ 
02.
    CurrentDb.Execute "DELETE FROM PRJVERWTSTADMIN_PRJV_PROJEKT WHERE PROJEKT = '" &  strProjektName "'"
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Datenbanken
gelöst SQL Statement auseinandernehmen Like (20)

Frage von H41mSh1C0R zum Thema Datenbanken ...

VB for Applications
gelöst VBA: Verständnisfrage bei Funktionen, Rückgabe von Werten (3)

Frage von Aximand zum Thema VB for Applications ...

Windows Server
SQL Fehler Beim Installieren von SQL 2008 R2 auf einem Windows 2012 Server (6)

Frage von Sv-Schneider zum Thema Windows Server ...

Windows Server
gelöst SQL Server 2008 überlappender E A Vorgang, Fehler ID 997 (4)

Frage von Timx zum Thema Windows Server ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...