Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi KeyViolation mit Access bei DELETE (https://www.delphipraxis.net/11065-keyviolation-mit-access-bei-delete.html)

st2000 30. Okt 2003 14:33


KeyViolation mit Access bei DELETE
 
Hallo, weiss jemand, was man tun muss, damit eine Access2000-DB einen Delete akzeptiert, die mit einer TTable-Komponente angesprochen wird ?

Erhalte immer die Fehlermeldung "Key Violation. Löschen aus angegebenen Tabellen nicht möglich"; mit dem Zusatz ODBC ACCESS DRIVER.

Die unterlegte Tabelle ist eigentlich eine Access-Query. Wenn ich aber direkt in die DB gehe und dort lösche, dann gehts. Warum nicht via Delphi ?

Liegts an der BDE? Geht das nur, wenn ich ADO-Komponenten nehme ??

Gruss,
Stefan :pale:

MrSpock 30. Okt 2003 15:58

Re: KeyViolation mit Access bei DELETE
 
Zitat:

Zitat von st2000
Die unterlegte Tabelle ist eigentlich eine Access-Query.

Du kannst mit einem TTable Objekt keine Query öffnen. Also was meinst du, wenn du sagst die Tabelle sei eigentlich eine Query und du benutzt ein TTable Objekt?

st2000 30. Okt 2003 16:16

Re: KeyViolation mit Access bei DELETE
 
Damit meine ich, daß ich in Delphi zwar ein TTABLE-Komponente benutze, die aber als Database auf eine MS-Access2000-DB zeigt, und dort auf eine Query (also Abfrage, als TTable.Tablename).
Diese Query joint 4 Tabellen.

Damit möchte ich ein Formular befüllen, welche 1 dieser Tabellen bearbeiten soll (also new,delete,edit), und dazu Felder aus den anderen 3 Tabellen anzeigen soll (welche die Bezeichnungen von FK-Feldern sind, also z.B. statt FK_Artikel 4711 -> Artikel 'Wasserhahn 1" ').

Also eine ganz normale relationale Datenbank mit einem Delphi5-Frontend.

Hab aber auch schon das Delete mit dem BDE-Admin versucht, ist das gleiche.

Kanns sein, daß man Access-Abfragen nur mit einer TADOQuery schreibend bearbeiten kann ?

Gruss,
Stefan

woki 30. Okt 2003 16:37

Re: KeyViolation mit Access bei DELETE
 
Hi,

ich würde zwar die Ado-komponenten, um genau zu sein TBetterAdoDataset vorziehen, aber Dein Problem liegt wohl woanders:

Queries aus mehreren Tabellen sind laut SQL Standard (ich meine auch in den neuesten sei das noch so) nicht editierbar. Wahrscheinlich passiert dann folgendes: Nach außen verhält sich Access hier dem Standard gemäß, weist Versuche zu ändern zurück, intern implmentiert es aber einen Mechanismus, diese rigorose Einschränkung wenn möglich zu umgehen.

Von der Delphiseite muß sich der Entwickler dann selbst darum kümmern, die Ursache hierfür liegt aber auf der Access-Seite, nicht bei Delphi.

Grüsse
Woki

woki 30. Okt 2003 16:57

Re: KeyViolation mit Access bei DELETE
 
ach so:

Du könntest zuerst auf eine TQuery umsteigen und Requestlive auf true stellen, und wenn das nicht reicht, dann schau Dir auch mal die Komponente UpdateSQL an.

st2000 30. Okt 2003 17:26

Re: KeyViolation mit Access bei DELETE
 
Hallo,

vielen Dank für Eure Tips, beruhigt mich bekloppterweise sogar, das es echt nicht geht.... :cyclops:

Diese TUpdateSQL-Komponente ist also auch für Access anwendbar ? Nicht nur für richtige SQL-Server ?

Mit TQuery hab ichs schon versucht, ist der gleiche Ärger....

Das erstaunliche ist, das es in Access direkt ja geht. Wenn ich dort in dieselbe Query reingehe und lösche, dann ist der Datensatz (also der Tupel) definitiv weg.

Gibts evtl. irgendeinen Borland-Access-ODBC-Treiber, der diese Funktion durchschleift ? Mich wundert eh, das der Orig. MS-Treiber es nicht macht...

Was ist denn eigentlich diese TBETTERADOQuery ? Better? Ist das ein Zukauf-Produkt ? Oder heisst es so in Delphi-Versionen >5 ?

Gruss,
Stefan

r_kerber 30. Okt 2003 17:44

Re: KeyViolation mit Access bei DELETE
 
Zitat:

Zitat von st2000
Gibts evtl. irgendeinen Borland-Access-ODBC-Treiber, der diese Funktion durchschleift ? Mich wundert eh, das der Orig. MS-Treiber es nicht macht...

Von Borland gibt es garantiert keinen. Und das der M$-Treiber es nicht macht, ist eigentlich verständlich. Es gibt nun einmal Standards und die sind hier eben eingehalten. Wenn dann ACCESS als das Prgramm dies macht, dann ist es eben ein zusätzliches Feature.
Und TBetterADODataset ist 'ne Freeware-Komponente. Die gibt es hier: http://web.orbitel.bg/vassil/

st2000 30. Okt 2003 18:10

Re: KeyViolation mit Access bei DELETE
 
Dann muss ich damit ja irgendwie leben :cry: ...

Aber, wenn es Standard ist, das man eine Query nicht zum löschen nehmen kann, wie macht man es dann normalerweise ?

Jede normale DB-Anwendung hat doch immer irgendwo Formulare, in denen Master-Client-Daten zusammengefasst sind.
Und da kann man doch auch einerseits die Bezeichnungen anstelle von ForeignKeys sehen (also nicht bloss die eine Tabelle dahinter, die die Daten der 1-Seite enthält), und andererseits kann man auch löschen (typisches Bsp: Literatur-DB-Anwendungen wie LiteRat oder Liman; da kann man Textausschnitte verwalten, mit Angaben zum Buch, zur Bibliothek, wo das Buch steht, etc.; alles erkennbar M-C-Daten).

Als ich zuerst versuchte, mein Form mit einer Mastertbl und einer Clienttbl aufzubauen, ging zwar das Löschen, dafür aber nicht das Insert (Key Violation, obwohl mit denselben Keys die Anzeige ja auch funktionierte). Das kanns ja dann auch nicht sein...

Bleibt dann also nur der Weg über TUpdateSQL ? Oder in anderen Sprachen durch manuelles programmieren der in TUpdateSQL enthaltenen Funktionalität ?

Irgendwie fehlt mir jetzt der Ansatz, wie ich es künfig professionell machen kann...
Auch in Ebners Buch Datenbankprogrammierung hatte ich den Eindruck gewonnen, das es wie von mir versucht gemacht wird.
Hat jemand einen wirklich guten Buchtip, wo solche Detailprobleme mal gelöst werden ? Diese ganzen Grundlagenbücher helfen im Detail bald nicht mehr weiter...

Gruss,
Stefan

r_kerber 30. Okt 2003 18:29

Re: KeyViolation mit Access bei DELETE
 
Hallo Stefan,

da gibt es durchaus mehrere Möglichkeiten.
Eine wäre, Dein Programm realisert das Löschen selbst, das heiß zunächst die Detail-Datensätze und zum Schluß den Masterdatensatz. Das setzt natürlich vorraus, dass Du die DB-Struktur und Abhängigkeiten der Tabellen kennst.
Bei "großen" SQL-Datenbanken kann man das z.B. über referientelle Integritätsbeziehungen mit einem cascading Delete erreichen. Entweder diese ist über Trigger und Stored Procedure, oder die RI der Datenbank ist dazu schon selbst in der Lage.
Bei Access ist vermutlich die erste Methode anzuwenden.

st2000 30. Okt 2003 19:11

Re: KeyViolation mit Access bei DELETE
 
Hallo Rainer.

Vielen Dank für die Tips.

Dann werde ich mich mal an die Arbeit machen.

Gruss aus Hamburg,
Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz