Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL In DBGrid markierten Datensatz löschen/ändern (https://www.delphipraxis.net/132640-sql-dbgrid-markierten-datensatz-loeschen-aendern.html)

germanos 16. Apr 2009 16:32

Datenbank: Paradox • Zugriff über: ODBC

SQL In DBGrid markierten Datensatz löschen/ändern
 
Hallo,
ich habe wieder mal ein Problem mit SQL. Ich möchte einen in einem DBGrid selektierten Datensatz löschen (DELETE) oder aber ändern (UPDATE). Hierbei steht mir aber nur die Record-Nummer der Query zur Verfügung, das heißt, ich selektiere den Datensatz und möchte ihn auf Tastendruck mit SQL DELETE löschen. Eine WHERE-Abfrage der Felder ist nicht möglich, da es auch mehrere identische Datensätze geben kann.

Gibt es dennoch eine Möglichkeit, nur mit SQL dieses Problem zu lösen??

Für Vorschläge gerne mit Beispielcode wäre ich sehr froh. Vielen Dank.

nahpets 16. Apr 2009 16:41

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Hallo,
Zitat:

Zitat von germanos
Eine WHERE-Abfrage der Felder ist nicht möglich, da es auch mehrere identische Datensätze geben kann.

heißt das: 100% identisch, über alle Spalten?
Wenn ja, meiner Meinung nach chancenlos :-(

Ansonsten, alle Spalten in die Wherebedingung reinpacken, dann reicht ein beliebiges Zeichen Unterschied irgendwo.

Sind die Sätze wirklich 100% identisch [OT](eigentlich ja ein blöde Formulierung, identisch ist 100% sonst ist's nicht identisch)[/OT], dann nachträglich einen technischen Schlüssel einbauen (AutoInc, Satzzähler, GUID...) und dann damit arbeiten, damit's den Anwender nicht stört, kann man diese Spalte im DBGrid ja unsichtbar machen.

khh 16. Apr 2009 16:52

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Zitat:

Zitat von germanos
Eine WHERE-Abfrage der Felder ist nicht möglich, da es auch mehrere identische Datensätze geben kann.

da stimmt was mit dem db-design nicht.

zumindest eine eindeutige ID sollte jeder satz haben.
Bist du dir sicher dass es die nicht gibt?



Gruss KH

germanos 16. Apr 2009 17:15

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Hallo und vielen Dank.
Das völlig gleiche Datensätze vorhanden sind, ist sehr unwahrscheinlich, aber nicht unmöglich. Es handelt sich um ein Haushaltsbuch, indem ohne weiteres an einem Tag der gleiche Artikel 2 mal eingegeben werden könnte. Dann sind alle Spalten gleich vom Datum über KontoID usw.

Über eine Auto-Increment-Spalte habe ich auch schon nachgedacht, aber es erst einmal verworfen, da ich ja die RecNo bestimmen kann. Nur bin ich erst ein paar Wochen mit Delphi beschäftigt und habe mich in SQL "verliebt".

Deshalb wäre es mir lieber gewesen, über die Selektierung des Datensatzes zu einer Identifikation des Datensatzes zu kommen.

Sollte keine "einfache" Lösung möglich sein, werde ich eine Spalte für die eindeutige ID hinzu fügen.

Vielleicht könnt ihr mir sofort sagen, ob der AutoInc-Zähler in Paradoxtabellen abfragbar ist oder programmiert werden muß.

Besten Dank, Peter

khh 16. Apr 2009 17:33

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Zitat:

Zitat von germanos

Vielleicht könnt ihr mir sofort sagen, ob der AutoInc-Zähler in Paradoxtabellen abfragbar ist oder programmiert werden muß.

Besten Dank, Peter

eindeutige id ist in einer db eigentlich immer Pflicht.
Muss es denn paradox sein ??

Gruss KH

mkinzler 16. Apr 2009 17:35

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Man kann über die Selektierung auf den Datensatz kommen, wenn dieser einen Primärschlüssel besitzt

khh 16. Apr 2009 17:39

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Zitat:

Zitat von mkinzler
Man kann über die Selektierung auf den Datensatz kommen, wenn dieser einen Primärschlüssel besitzt

und dabei sind wir wieder bei einem eindeutigen Feld

Gruss KH

mkinzler 16. Apr 2009 17:41

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Ja, das ist der dreh und Angelpunkt

germanos 16. Apr 2009 17:47

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Hallo,

es musste nicht paradox sein, aber aus Büchern, die mir z.Zt. zur Verfügung stehen, war die Alternative dBase.

Ich habe paradox genommen, da die Beispiele in den Büchern eben diese Datenbank benutzten.

In der betroffenen Datenbank habe ich keinen Index vergeben, da eben bei absolut gleichen Datensätzen immer eine Fehlermeldung käme.

In der Datenbankoberfläche haben alle DBs eine Spalte mir einem Zähler. Ist diese Spalte nicht abfragbar??

Ich hoffe, ich nerve niemanden, aber ich bin halt nicht ruhig, bevor ein Problem gelöst ist. Also nochmals Danke,

Peter

khh 16. Apr 2009 17:52

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Zitat:

Zitat von germanos
Hallo,


In der betroffenen Datenbank habe ich keinen Index vergeben, da eben bei absolut gleichen Datensätzen immer eine Fehlermeldung käme.



Peter

dazu ist halt das id feld von Nutzen




was istdas für eine anwendung?
Lohnt es sich nicht ne "richtige" DB zu nehmen?

germanos 16. Apr 2009 18:27

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Was ist mit richtige DB gemeint? Wie gesagt, stecke ich noch in den "Delphi-Anfänger"-Problemen fest.

Die Anwendung wird ein Haushaltsbuch mit folgenden Spalten: monat, NebenkontoID, Datum, Beschreibung und Preis.

Darüber gibt es 2 DBs. Die erste DB beinhaltet die 6 Hauptkonten wie Fixkosten, Haushalt usw.
Die zweite DB beinhaltet die Nebenkonten wie Fixkosten= Miete, Versicherung, Strom usw.
Die dritte DB, um die es jetzt geht, beinhaltet alle Ausgaben und Einnahmen, die anfallen, identifiziert durch die NebenkontoID, die zusammengesetzt ist aus der ID der ersten DB und der zweiten DB. Beispiel: Die Miete wird dem 1. Konto DB1 und dem 1. Konto DB2 zugeordnet durch die zusammengesetzten IDs der ersten beiden DBs, also 1 und 1 =11

Ich bin überzeugt, das es da bessere Ansätze geben wird, aber ich wollte alles über Datenbanken abwickeln. Und mit SQL sind Abfragen durch Selektion sehr einfach machbar. Bis zu dem jetzt besprochenen Problem. Mit einer TTable und einer Navigator-Komponente ist das Editieren und löschen von Daten einfacher. Da wird aber der Rest halt komplizierter.

Sollten dennoch Vorschläge vorhanden sein, wie man die ganze Sache einfacher gestaltet, fange ich auch nochmal von vorne an.

Ich hoffe, das die Beschreibung meiner Anwendung verständlich war und freue mich auf Verbesserungsvorschläge,

Peter

khh 16. Apr 2009 18:41

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Zitat:

Zitat von germanos
Was ist mit richtige DB gemeint? Wie gesagt, stecke ich noch in den "Delphi-Anfänger"-Problemen fest.

Die Anwendung wird ein Haushaltsbuch mit folgenden Spalten: monat, NebenkontoID, Datum, Beschreibung und Preis.

Darüber gibt es 2 DBs.




Peter

du verwechselst hier schon DB mit Tabelle.

ich denke du solltest dich erst mal näher mit DB beschäftigen bevor du an die Umsetzung gehst.

Gruss KH

germanos 16. Apr 2009 18:46

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Nun das ist natürlich die Hilfe die ich brauche. So etwas wie " Mach erst mal deiner Schulaufgaben, bevor du bei den Profis mitspielen willst."

Ich hoffe, keinem von euch zufiel Zeit gestohlen zu haben.

Vielen Dank!!

mkinzler 16. Apr 2009 18:52

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Nein, wir helfen ja gern. Nur sollte ein gewisses Grundlagenwissen vorhanden sein. Ein Primärschlüssel ist ein Feld, über welches man einen Datensatz eindeutig identifizieren kann. Er kann ein Merkmal des datensatzes sein ( z.B. Artikelnr) oder künstlich sein ( z.B. als autoinc). Die künstlichen haben den Vorteil, das man alle realen Eigenschaften ändern kann, ohne das das einen Einfluss auf die Beziehungen zwischen den Datensätzen hat.

khh 16. Apr 2009 18:55

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Zitat:

Zitat von germanos
Nun das ist natürlich die Hilfe die ich brauche. So etwas wie " Mach erst mal deiner Schulaufgaben, bevor du bei den Profis mitspielen willst."

Ich hoffe, keinem von euch zufiel Zeit gestohlen zu haben.

Vielen Dank!!

sollte sicher nicht schulmeisterisch wirken, sorry wenns so rüber kam.
Eine gewisse Grundkenntniss sollte aber dennoch vorhanden sein, wenn du die Hilfe hier auch verstehen willst.


Gruss KH

germanos 16. Apr 2009 19:03

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Wenn ich das richtig verstehe, brauche ich eine Spalte, in der für jeden Datensatz ein eindeutiger Eintrag steht. Mit dieser Spalte hätte ich dann aber auch die Möglichkeit mit einer WHERE-Abfrage an den zu löschenden oder zu editierenden Datensatz zu gelangen. Für die beiden ersten TABELLEN benutze ich Indizes zum verbinden der 2 Tabellen. Wenn Indizes und Primärschlüssel nicht das gleiche sind, habe ich das falsch verstanden. Aber in den 3 dicken Büchern über Delphi ( u.a. Datenbanken mit Delphi) ist alles sehr oberflächlich und ohne konkrete Beispiele erklärt. Die berühmte Telefonnummer-Tabelle ist da nicht sehr aufschlußreich.

Dennoch würde eine weitere Spalte für die eindeutige Identifizierung wohl ausreichen, oder??

Peter

mkinzler 16. Apr 2009 19:06

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Ein Index ist eine Inhaltsverzeich über einen Ausschnitt von Feldern in einer definierten Reihenfolge, der beim Suchen eines Datensatzes anstatt der Originaltabelle durchsucht wird. Für Primärschlüssel wird ein Index angelegt, es handelt sich aber nicht um Synonyme.

khh 16. Apr 2009 19:08

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
zeig uns doch mal die genaue struktur der tabellen,
ich denke dann kann man besser helfen.


Gruss KH

DeddyH 16. Apr 2009 19:08

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Richtig, Du brauchst einen Primärschlüssel, den Du bei vielen DBs auf "Autowert" bzw. "Autoinc" setzen kannst (bei "echten" DBMS braucht es dafür etwas mehr Eigenarbeit). Das bedeutet, dass die DB selbstständig diesen Wert hochzählt, ohne dass Du etwas dafür tun musst. Somit hast Du einen eindeutigen Wert zur Identifikation des Datensatzes.

germanos 16. Apr 2009 19:13

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Ich schätze, das sind dann die mdx-Dateien.

Wie kann ich die Struktur anzeigen? Der Quelltext ist da nicht aussagekräftig.

mkinzler 16. Apr 2009 19:14

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Mach einen Screenshot der Datenbankoberfläche

DeddyH 16. Apr 2009 19:15

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Je nach Delphi-Version wird die Datenbankoberfläche mitgeliefert. Damit kannst Du die Struktur bearbeiten/anzeigen.

germanos 16. Apr 2009 19:20

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Wie bekomme ich das Bild in das Antwort-Doku??

DeddyH 16. Apr 2009 19:22

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Als JPEG oder PNG an den Beitrag anhängen ;)

mkinzler 16. Apr 2009 19:25

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Als Analge(Attachment) an Beitrag hängen

germanos 16. Apr 2009 19:27

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hoffe, das kommt an über "Attachment hinzufügen"???

germanos 16. Apr 2009 19:32

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das war die entscheidende Tabelle mit den Eingaben aller Einnahmen und Ausgaben. Die hier angehängte ist die Tabelle mit den Nebenkonten (Tabelle 2 in meiner Auflistung.

germanos 16. Apr 2009 19:35

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Und das ist die erste Tabelle mit den Hauptkonten.

Leider muß ich jetzt erstmal Schluß machen. Die Arbeit ruft. Ich schaue morgen wieder rein.

Vielen Dank

Peter

nahpets 17. Apr 2009 09:03

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Hallo,

zuerst zur Tabelle hb_konto:

So wie die aufgebaut ist, ist das korrekt, es sollte einen eindeutigen Index auf KontoID geben, damit diese nicht versehentlich doppelt vergeben werden kann.

Nun zur Tabelle hb_neben:

Sie hat den Fremdschlüssel KontoID auf hb_konto und die eigene, nicht eindeutige ID NKontoID. Die Kombination aus KontoID und NKontoID ist eindeutig. Auf diese Kombination sollte ein eindeutiger Index gelegt werden, damit diese nicht versehentlich doppelt vergeben werden kann.

Prinzipiell ist das so korrekt.

Nun zur Tabelle hb_beschreib:

Sie verfügt über einen Fremdschlüssel auf die Tabelle hb_neben über NKontoID. Dies reicht für die Eindeutigkeit nicht aus, hier sollte zusätzlich der Fremdschlüssel KontoID mit aufgenommen werden, damit die eindeutige Zuordnung zur Tabelle hb_neben über die Kombination aus KontoID und NKontoID erfolgen kann. Damit ist aus Kontensicht eine eindeutige Zuordnung über SQL zwischen den Tabellen möglich.
Damit identische Sätze in der Tabelle hb_beschreib unterschieden werden können, sollte diese Tabelle noch eine Spalte BeschreibID mit eindeutigem Index bekommen. Hier empfiehlt sich ein AutoInc-Feld.

Ansonsten erscheint mir das Design korrekt und Paradox/dBase für diese Aufgabenstellung durchaus ausreichend (auch wenn es ein "altes, nicht mehr zeitgemäßes System ist". Zum Lernen ist es immer noch sehr gut zu gebrauchen.

guke 14. Jul 2009 17:16

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Ich komme nochmal auf die oben vorgeschlagene WHERE-Abfrage zurück:

Wenn der zu löschende doppelte Datensatz von a bis z mit einem anderen identisch ist, dann ist es m. E. doch völlig egal, welcher Datensatz nach der WHERE-Abfrage gelöscht wird.

mkinzler 14. Jul 2009 18:13

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Dann werden aber u.U beide gelöscht

guke 14. Jul 2009 19:56

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Zitat:

Zitat von mkinzler
Dann werden aber u.U beide gelöscht

Mag sein. Ich öffne die Datei mit der Tablekomponente und Index und suche nach dem ersten der doppelten Datensätze von denen einer zu löschen ist. Das geht bei knapp 100.000 Datensätzen trotzdem recht fix (knapp 2 sekunden).

mkinzler 14. Jul 2009 19:58

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Besser ist es aber mit einem eindeutigen Schlüssel zu arbeiten.

guke 14. Jul 2009 20:26

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Zitat:

Zitat von mkinzler
Besser ist es aber mit einem eindeutigen Schlüssel zu arbeiten.

Genau dafür finde ich keinen plausiblen Grund, falls die Datensätze identisch sind.

mkinzler 14. Jul 2009 20:29

Re: SQL In DBGrid markierten Datensatz löschen/ändern
 
Grundsätzlich sollte man dies immer verwenden unabhängig vom inhalt der Sätze. Zudem sollte man verhinderrn, dass identische Sätze geschrieben werden, wenn diese nicht erwünscht sind, anstatt diese später zu Löschen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:07 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