![]() |
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. |
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Hallo,
Zitat:
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. |
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Zitat:
zumindest eine eindeutige ID sollte jeder satz haben. Bist du dir sicher dass es die nicht gibt? Gruss KH |
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 |
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Zitat:
Muss es denn paradox sein ?? Gruss KH |
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
|
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Zitat:
Gruss KH |
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Ja, das ist der dreh und Angelpunkt
|
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 |
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Zitat:
was istdas für eine anwendung? Lohnt es sich nicht ne "richtige" DB zu nehmen? |
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 |
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Zitat:
ich denke du solltest dich erst mal näher mit DB beschäftigen bevor du an die Umsetzung gehst. Gruss KH |
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!! |
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.
|
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Zitat:
Eine gewisse Grundkenntniss sollte aber dennoch vorhanden sein, wenn du die Hilfe hier auch verstehen willst. Gruss KH |
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 |
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.
|
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 |
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.
|
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. |
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Mach einen Screenshot der Datenbankoberfläche
|
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.
|
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Wie bekomme ich das Bild in das Antwort-Doku??
|
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Als JPEG oder PNG an den Beitrag anhängen ;)
|
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Liste der Anhänge anzeigen (Anzahl: 1)
Als Analge(Attachment) an Beitrag hängen
|
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"???
|
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.
|
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 |
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. |
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. |
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Dann werden aber u.U beide gelöscht
|
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Zitat:
|
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Besser ist es aber mit einem eindeutigen Schlüssel zu arbeiten.
|
Re: SQL In DBGrid markierten Datensatz löschen/ändern
Zitat:
|
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 16:08 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-2025 by Thomas Breitkreuz