| Autor |
Beitrag |
LuckyStrike4life
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Fr 27.06.03 10:05
Morgen,
Ich mag den DBNavigator nicht, daher schreib ich halt OnClick Ereignisse für eigene Buttons, wer nicht?
Nun stellte ich fest das ich gar nicht mehr die Anweisung zum löschen eines ausgewählten Datensatzes kenne. Und wo ich schon dabei bin, es müsste auch noch so realisiert werden das man mit nur einem Klick den ganzen Inhalt der Datenbank löscht. Da pro Tag ca. 15 Eintragungen gemacht werden und das ganze nur einmal pro Woche abgecheckt wird. Daher wäre es umständlich jeden Datensatz einzeln auszuwählen.
Könnte mir jemand helfen?
_________________ ... ich kann doch nichts ...
|
|
foxy
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: Fr 27.06.03 10:07
welche db?? erst mal
_________________ "Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Fr 27.06.03 10:17
Morgen Foxy,
das es dich auch noch gibt.
Also welche DB? Willst den Namen wissen, oder was? Ach, ich sag dir halt alles.
Die Datenbank baut momentan auf dBase auf später auf Oracle.
Der Name der Datenbank lautet MainDBtabelle. Dann gibts da noch n paar andere, aber da seh ich kein Problem.
Das ganze sollte in etwa so aussehen wie:
MainDBtabelle.first; um zum ersten Datensatz zu springen, oder
MainDBtabelle.last; um zum letzten Datensatz zu springen.
Ich glaub deine Frage sollte damit doch beantwortet sein, oder?
_________________ ... ich kann doch nichts ...
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Fr 27.06.03 10:31
Ich würde alles über SQL erledigen:
Zum Löschen der ganzen Datensätze einfach: "DELETE FROM tabelle"
Mit einer WHERE-Bedinung (am besten mit dem Primary Key, den kriegste ja vom aktuelle gewählten Datensatz) löschst Du einen einzelnen oder mehrere (je nach Bedingung) Datensätze.
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Fr 27.06.03 10:45
| UGrohne hat folgendes geschrieben: | Ich würde alles über SQL erledigen:
Zum Löschen der ganzen Datensätze einfach: "DELETE FROM tabelle"
Mit einer WHERE-Bedinung (am besten mit dem Primary Key, den kriegste ja vom aktuelle gewählten Datensatz) löschst Du einen einzelnen oder mehrere (je nach Bedingung) Datensätze. |
Du kannst gerne genauer werden, wenn du magst  .
_________________ ... ich kann doch nichts ...
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Fr 27.06.03 11:22
| LuckyStrike4life hat folgendes geschrieben: | Du kannst gerne genauer werden, wenn du magst . |
Weißt Du denn schonmal wie Du SQL-Anweisungen absetzt? Geht einfach im Query in SQL.Text eingeben und dann ExecQuery ausführen.
Ja, und dann das erste, löschen der ganzen Tabelle: "DELETE FROM tabellenname", das wars.
Und wenn Du einen einzelnen löschen willst, z.B. so (musste halt noch anpassen:
Delphi-Quelltext 1:
| Querytemp.SQL.Text:='DELETE FROM tabellenname WHERE pk='+Query1.FieldByName('pk').AsString; |
Das wars eigentlich auch schon, genauer kann ich nicht werden, da ich Dein Proggi net kenne 
|
|
foxy
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: Fr 27.06.03 11:43
| LuckyStrike4life hat folgendes geschrieben: | Morgen Foxy,
das es dich auch noch gibt.
|
he??
ja mich gibts noch *gggg*
antwort hassu ja schon
_________________ "Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Fr 27.06.03 11:45
| UGrohne hat folgendes geschrieben: |
Geht einfach im Query in SQL.Text eingeben und dann ExecQuery ausführen. |
Aus dem Satz werde ich nicht schlau.
Also, ein Query in das Programm aufzunehmen ist kein Problem, hab ihn auch mit dem nötigen DataSource versehen.
Wo soll ich den SQL.Text eingeben, oder was du auch meintest. Wenn ich den Query auf "active=true" setze sagt er auch
| Delphi hat folgendes geschrieben: | | Query1= keine SQL Anweisung verfügbar! |
Was ja auch nicht weiter verwundert. Du würdest mir sehr helfen wenn du mir noch sagen würdest wo ich was hinschreiben soll.
An dieser Stelle möchte ich mich auf meine Signatur beziehen  .
_________________ ... ich kann doch nichts ...
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Fr 27.06.03 11:48
Damit meinte ich in Query1.SQL.Text
A propos Deine Signatur: Solltest Sie um eine Zeile kürzen oder willste ne offizielle PN bekommen? 
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Fr 27.06.03 12:01
| UGrohne hat folgendes geschrieben: | | Damit meinte ich in Query1.SQL.Text |
Okay,
wie komm ich da hin?
| Zitat: | A propos Deine Signatur: Solltest Sie um eine Zeile kürzen oder willste ne offizielle PN bekommen? |
Hab ich gard, Danke. Aber ich habs kreativ umgebaut, da kann man nichts sagen.
_________________ ... ich kann doch nichts ...
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Fr 27.06.03 12:04
Wie? Wie Du da hinkommst? Ehrlich gesagt, versteh ich Dein Problem gerade nicht. Ich hab doch in meinem vorigen Beitrag sogar ein Beispiel gepostet, wie Du es machst und Du sagtest ja selber, Du hast jetztn Query drauf.
A propos Query: Hast Du den jetzt mit DataSource oder der Datenbank verbunden? Den ersteres ist unnötig, brauchste net aber letzteres essentiell.
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Fr 27.06.03 12:40
Vielleicht haben wir n wenig aneinander vorbei gesprochen.
Ich werde mich klarer ausdrücken.
Mein Query ist nur mit DataSource verbunden, so wie ich es auch sagte. Mit der eigentlichen Datenbank nicht, da es nicht die Eigenschaft "TableName" bei dem Query gibt. Aber dafür gibt es ja die Eigenschaft "DatabaseName", in der man, wenn ich mich recht erinnere, den Pfad der Datenbank angeben kann usw. .
Was mir nicht genau klar ist, was genau soll Query1.SQL.Text sein? Meinst du damit den normalen Query, eine Funktion davon oder noch was anderes?
Wo kommt später der Quelltext hin, den du mir geschrieben hast? Doch sicher als Procedure von einem OnClickEvent von nem Button, oder nicht?
_________________ ... ich kann doch nichts ...
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Fr 27.06.03 12:52
DatabaseName ist die Verbindung zu einer Instanz von Database. Ich weiß leider nicht genau, wie Deine DB-Anbindung aussieht, aber das muss ne komponente bei Dir sein. Query1.SQL ist eine StringList, in den Text muss also das SQL-kommando rein. Queries haben keine Eigenschaft TableName, das gibts nur bei Tables, da Queries ja Abfragen über SQL machen und damit auch mehrere Tabellen verbinden können.
Die DataSource für das Query kannste rausmachen.
Du solltest Dir glaub ich mal Literatur zur Beschaffenheit der Datenbank-Komponenten von Delphi ansehen und vor allem schauen, dass Du rauskriegst, welche Eigenschaft wofür ist und welche Kompo welche braucht um zu funktionieren 
|
|
Nikola
      
Beiträge: 55
Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
|
Verfasst: Sa 28.06.03 19:13
Hallo,
vielleicht ist das einfacher zu verstehen
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm19.SpeedButton2Click(Sender: TObject); begin if MessageDlg('Datentabelle löschen !', mtWarning, [mbYes, mbNo], 0) = mrYes then begin Query1.Close; Query1.SQL.Clear; Query1.SQL.add('DELETE FROM meineTable'); Query1.ExecSQL; end; end; |
mfg
Nikola
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Mo 30.06.03 08:14
Wunderbar,
so sollte jede Arbeitswoche beginnen. Nun gehts endlich, juhuu!
Bedanke mich bei euch beiden und hoffe das UGrohne nicht allzu viele graue Haare bekommen hat.
Gruß,
Mardin.
_________________ ... ich kann doch nichts ...
Zuletzt bearbeitet von LuckyStrike4life am Mo 30.06.03 08:34, insgesamt 3-mal bearbeitet
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 30.06.03 08:19
| LuckyStrike4life hat folgendes geschrieben: | | Bedanke mich bei euch beiden und hoffe das UGrohne nicht allzu viele graue Haare bekommen hat. |
Nene, sind nur so ein oder zwei, die werden nachher einfach abrasiert 
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Mo 30.06.03 08:37
Argh,
eine letzte Frage doch noch, sorry.
Du hast geschrieben, um einen einzelnen Datensatz zu löschen, sollte ich den Primary Key der aktuellen ausgewählten Zeile verwenden. Das Beispiel war:
Delphi-Quelltext 1:
| Querytemp.SQL.Text:='DELETE FROM tabellenname WHERE pk='+Query1.FieldByName('pk').AsString; |
Delphi meint dann aber es gäbe das Feld "pk" nicht, was ja logisch erscheint, da es dieses Feld tatsächlich nicht gibt. Die Abkürzung "pk" hast du ja für Primary Key gesetzt, aber wie bekomme ich denn den Primary Key von der Zeile, die der User ausgewählt hat, natürlich zur Laufzeit - es müsste also automatisch passieren?
Moderiert von Tino: Delphi-Tag hinzugefügt.
_________________ ... ich kann doch nichts ...
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 30.06.03 09:21
In Deiner Tabelle hast Du ja sicher ein Feld, das der Primary Key ist, oder? Du musst einfach nur pk durch den Namen dieses Feldes ersetzen, das wars. Es muss aber eindeutig sein, denn sonst kann es sein, dass Du auf einmal mehrere Datensätze löschst.
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Mo 30.06.03 09:51
Nein,
so ein Feld habe ich nicht eingerichtet. Klingt aber logisch was du meintest.
Also wird eine Spalte benötigt, die zum Beispiel eine vortlaufende Nummer enthält, jeder neu eingegebene Datensatz erhält eine neue Nummer. Wenn ich dich richtig verstanden habe. Das kenne ich noch aus meinen guten WAMPP / LAMPP Zeiten.
Da ich momentan auf eine dBase Datenbank setze, könntest du mir vielleicht sagen wie ich die Spalte deklarieren muss. Denn davon hab ich weniger viel Ahnung.
_________________ ... ich kann doch nichts ...
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 30.06.03 10:22
Oh, das ist meiner Meinung nach einer der größten Fehler, die man machen kann. In JEDE Tabelle (außer vll. Beziehungstabellen für n:n, aber das lassen wir mal beseite) gehört ein Primary Key, denn Du brauchst irgendwann (so wie Du jetzt) eine eindeutige Referenz. Ich glaube bei dBase gibt es auch ein AutoInc-Feld, aber das wird schwierig das in einer bestehenden Tabelle nachzurüsten.
Alternativ kannst Du auch (is aber net epmpfehlenswert) alle Felder vergleichen:
Delphi-Quelltext 1:
| Querytemp.SQL.Text:='DELETE FROM tabellenname WHERE feld1='+Query1.FieldByName('feld1').AsString+' AND feld2='+Query1.FieldByName('feld2').AsString+' AND feld3='+Query1.FieldByName('feld3').AsString; |
Aber Achtung: Ist ein Feld ein String musst Du denn eingesetzten Wert aus Query1 vorher mit QuotedStr([Wert]) in Anführungszeichen setzen lassen.
|
|