Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Löschen von Datenbankeinträgen (https://www.delphipraxis.net/166048-loeschen-von-datenbankeintraegen.html)

Flash68 27. Jan 2012 09:06

Datenbank: MSSQL • Version: 2008R2 Express • Zugriff über: Delphi/Ado

Löschen von Datenbankeinträgen
 
Hallo zusammen,

ich habe in einer Datenbank mehrere Verknüpfungstabellen für M zu N Beziehungen, aus diesen möchte ich Einträge löschen. Diese sind über ein ADO-Dataset an die Haupttabelle angebunden und mit ihnen werden auch die Einträge aus der Listabelle angezeigt. Deshalb gibt es beim Löschen dann folgenden Fehler:

Nicht genügend Schlüsselinformationen zum Aktualisieren

Kann mir jemand helfen wie ich nur die Einträge aus der Verknüpfungstabelle lösche ohne das er versucht die aus der Listtabelle mit zu löschen?

Gruß

Flash

jobo 27. Jan 2012 09:29

AW: Löschen von Datenbankeinträgen
 
Das geht vielleicht nicht, kommt auf das Datenmodel an.

Schau Dir die Foreign Keys auf der Tabelle an und die Primary Keys
Vermutlich sind es 2 PK, die musst Du im Delete angeben.

Flash68 27. Jan 2012 10:08

AW: Löschen von Datenbankeinträgen
 
Die Verknüfungstabellen bestehen nur aus 2 Spalten die auf die Haupt- und listtabelle verweisen.

mkinzler 27. Jan 2012 10:11

AW: Löschen von Datenbankeinträgen
 
Die Kombination könnte trotzdem ein zusammengesetzter Primärschlüssel sein

jobo 27. Jan 2012 10:21

AW: Löschen von Datenbankeinträgen
 
Wo und wie löscht Du denn?
Per Query? Im Dataset? Welche Tabelle, nur die Zwischentabelle?
Kannst Du SQL oder Quellcode posten?

Flash68 27. Jan 2012 10:32

AW: Löschen von Datenbankeinträgen
 
Ich lösche mit:

ADODataSet.Delete

Wenn die Informationen aus der Listtabelle nicht in dem Dataset angegeben sind funktioniert das auch.

Ich bräuchte nur eine Möglichkeit wie ich das ausschliesse oder so.

jobo 27. Jan 2012 10:35

AW: Löschen von Datenbankeinträgen
 
Was ist denn die "Listtabelle"
Und wie ist das Dataset definiert?

Flash68 27. Jan 2012 11:16

AW: Löschen von Datenbankeinträgen
 
Das Dataset wird über folgende Select-Anweisung angebunden:

select RS.Rechner_ID, RS.Speicher_ID, S.Bezeichnung, RS.Anzahl, S.Größe, S.Größe*Rs.Anzahl As Gesamt from Rechnerspeicher RS, Speicher S where RS.Rechner_ID =:ID and RS. Speicher_ID = S.ID

Die Haupttabelle ist Rechner, Verknüpfungstabelle ist Rechnerspeicher und die Listtabelle ist Speicher.

jobo 27. Jan 2012 11:22

AW: Löschen von Datenbankeinträgen
 
Auf dieser Basis kann der Server nicht entscheiden, wo er was löschen soll.
Wenn Du nur die Verknüfung lösen willst, muss das Dataset auch nur diese Tabelle abbilden.
Das kannst Du bspw über eine Query lösen, die ein
Code:
Delete from Rechnerspeicher where [KeyPair=..]
absetzt. Also unabhängig von Deinem Dataset.

Flash68 27. Jan 2012 12:03

AW: Löschen von Datenbankeinträgen
 
Normal verwende ich nur folgende Selectanweisung:

Select * from Rechnereingabe where Rechner_ID =:ID

damit funktioniert es, nur bei der anderen berechne ich halt noch den Gesamtspeicher.

jobo 27. Jan 2012 12:15

AW: Löschen von Datenbankeinträgen
 
Ja, das mag ja sein. Sobald Du aber auf andere Tabellen joinst, kann der Server aus Deinem Select Statement nicht mehr ermitteln, was die Basistabelle ist und was nur angereicherte Daten darstellen.

Ich hab nicht so ne Ahnung von MSSQL, was aber technisch notwendig wäre, um aus Serversicht trotz join die Pk Spalten des SQL Statements bestimmen zu können, wäre ein Select, dass in jedem fall alle PK Felder der Haupttabelle (hier scheinbar: Rechnereingabe, die Zwischentabelle) zurückliefert. Sowie keine weiteren Schlüsselfelder anderer Tabellen.

Eigentlich sieht Dein Statement unten so aus, als ob es dem entspricht.
Wenn der Server das nicht schluckt, musst Du wie beschrieben etwas mehr Aufwand treiben und ein separates Löschstatement einbauen.

Je nach Kompos, kann man das gleich als Delete oder Update Clause mitangeben, da hab ich aber aktuell keinen Überblick.

Flash68 27. Jan 2012 12:48

AW: Löschen von Datenbankeinträgen
 
Wenn es an den joins liegt, wäre halt die Frage wie ich die Berechnung mache ohne die joins.

jobo 27. Jan 2012 12:59

AW: Löschen von Datenbankeinträgen
 
Nein, die Frage ist, wie Du auf Basis der Berechnung (also Deinem Dataset mit dem Berechnungsergebnis) eine Löschung durchführst.
Man kann natürlich sagen, das sind 2 vollkommen unterschiedliche Aufgaben.
1. Die Visualisierung einer Berechnung (eine Maske/ Form, ein Dataset)
2. Das Löschen einer Rechnerzuordnung, die nicht mehr berechnet werden soll (eine andere Maske, nur für Auf- und Abbau einer Rechnerzuordnung.

Flash68 27. Jan 2012 13:13

AW: Löschen von Datenbankeinträgen
 
Liste der Anhänge anzeigen (Anzahl: 1)
in dieser speziellen Zuordnung ist ja in der Tabelle noch die Anzahl der Module drin mit der Gesamtspeicher berechnet wird, es soll einfach der komplette tabellen eintrag gelöscht werden.

jobo 27. Jan 2012 13:29

AW: Löschen von Datenbankeinträgen
 
Das passt aber nicht zu dem, was Du von Deinem Dataset erzählst:
Zitat:

Zitat von Flash68 (Beitrag 1147905)
Das Dataset wird über folgende Select-Anweisung angebunden:

select RS.Rechner_ID, RS.Speicher_ID, S.Bezeichnung, RS.Anzahl, S.Größe, S.Größe*Rs.Anzahl As Gesamt from Rechnerspeicher RS, Speicher S where RS.Rechner_ID =:ID and RS. Speicher_ID = S.ID

Die Haupttabelle ist Rechner, Verknüpfungstabelle ist Rechnerspeicher und die Listtabelle ist Speicher.


und es passt nicht dazu, dass Du schreibst, die Zwischentabelle hätte nur 2 Spalten. (aber das ist hier auch egal)


a) Wenn du auf diesem Dataset (aus Zitat oben) ein Delete machen willst, musst Du eben etwas filigraner vorgehen.

b) Wenn Du auf der Tabelle aus dem Screenshot ein Delete machen willst, dann reicht ein simples Delete. (Hast Du ja selber schon bemerkt)

Wir sind also bei a) oder?

Flash68 27. Jan 2012 13:43

AW: Löschen von Datenbankeinträgen
 
die meisten Verknüpungstabellen die ich benutze habe 2 Spalten und ich dachte das ich das Problem allgemein habe, was sich dann später als Falsch herrausstellte.

sieht so aus also ob ich ein spezielles delete für diese Tabelle/dataset benötige.

jobo 27. Jan 2012 14:14

AW: Löschen von Datenbankeinträgen
 
Ja, vermutlich gibt es ja auch irgendwo analog das spezielle Insert.

Flash68 27. Jan 2012 14:17

AW: Löschen von Datenbankeinträgen
 
Das Insert mache ich über den DBGrid.

jobo 27. Jan 2012 14:26

AW: Löschen von Datenbankeinträgen
 
Egal, die (Grid)Aussage ist nutzlos. Das ist nur der Visualisierungsteil.
Es geht immer um die Datenmenge, die unter dem Grid liegt:
DBGRID< Dataset < Query Statement

Wie gesagt, ich hab keine Ahnung, wie genial MSSQL Server bei der Auflösung solcher Statements bzw. der Bestimmung der Schlüsselinformationen arbeitet, aber egal ob insert, delete oder update, er hat immer das gleiche Problem. (Also könnte er sich auch in jedem Fall gleich Verhalten)

Wenn also ein Insert auf einem Dataset funktioniert, das Delete auf dem gleichen Dataset aber fehlschlägt, ist entweder die Servermechanik etwas schusselig oder Du machst einen Unterschied im Code, der aus Deinen bisherigen Äußerungen nicht hervorgeht (und Dir vielleicht auch nicht mal bewusst ist)

hoika 27. Jan 2012 20:00

AW: Löschen von Datenbankeinträgen
 
Hallo,

nimm eine 2. ADOQuery, lösche dort den Eintrag,
denn eine

DBGrid.DataSet.Close;
DBGrid.DataSet.Open;


Heiko

sx2008 29. Jan 2012 02:56

AW: Löschen von Datenbankeinträgen
 
Folgende Abfrage benützt die alte Join-Syntax:
Code:
select RS.Rechner_ID, RS.Speicher_ID, S.Bezeichnung, RS.Anzahl, S.Größe, S.Größe*Rs.Anzahl As Gesamt from Rechnerspeicher RS, Speicher S where RS.Rechner_ID =:ID and RS. Speicher_ID = S.ID
Man sollte aber grundsätzlich nur noch die neue Syntax benützen:
Code:
select RS.Rechner_ID, RS.Speicher_ID, S.Bezeichnung, RS.Anzahl, S.Größe, S.Größe*Rs.Anzahl As Gesamt from
Rechnerspeicher RS INNER JOIN Speicher S ON RS.Speicher_ID = S.ID
where RS.Rechner_ID =:ID
Falls entsprechende Beziehungen zwischen den Tabellen eingerichtet sind, kann der SQL-Server in der Regel auch bei JOINS entscheiden in welcher Tabelle gelöscht werden soll.
Der SQL-Server weiss dann welches die Master und welches die Detailtabelle ist.
Beziehungen kann man auf dem SQL Server am Einfachsten herstellen, wenn man die Tabellen auf einem Diagramm platziert und die Verküpfung dann durch Drag&Drop der Schlüsselfelder aufbaut.

Flash68 30. Jan 2012 09:19

AW: Löschen von Datenbankeinträgen
 
Die Beziehungen sind eingerichtet, aber auch mit der neuen Abfrage kommt die gleiche Fehlermeldung:

Nicht genügend Schlüsselinformationen zum Aktualisieren.

Flash68 30. Jan 2012 12:15

AW: Löschen von Datenbankeinträgen
 
Mit der Lösung von Hoika( 2. Dataset und so) hat es funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 Uhr.

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