Entwickler-Ecke
Datenbanken - Datensatz entfernen !
Jagg - Di 10.12.02 17:35
Titel: Datensatz entfernen !
Hallo,ich bin es mal wieder !
Ich habe eine TTable und will immer den aktuellen Datensatz löschen !
Hier ist ein Code :
Quelltext
1: 2: 3: 4:
| Table1.Open; Table1.First; if Table1.FieldByName('UmlagNr').AsString = Edit1.Text then Table1.Delete; |
....hierbei markiert er den aktuellen Datensatz,so das das Programm erkennt,das der Datensatz gelöscht worden ist !
Ich will aber das er den Datensatz aus der Tabelle entfernt,also das dieser Datensatz nicht mehr in der Tabelle steht !
Könnt ihr mit helfen ???
Jagg !
UGrohne - Di 10.12.02 17:59
Quelltext
1: 2: 3: 4:
| Table1.Open; Table1.First; if Table1.FieldByName('UmlagNr').AsString = Edit1.Text then Table1.Delete; |
Also mit diesem Code passiert Folgendes: Die DB-Verbindung wird geöffnet, der erste Datensatz ausgewählt und wenn im Feld Umlag-Nr dasselbe steht, wie in Edit1 wird er gelöscht.
Es wird also nur der 1. Datensatz überprüft, da kann ja dann nicht der aktuelle Satz gelöscht werden. Wenn Du in Edit1 eine zu löschende Umlag-Nr (was immer das sein soll *g*) löschen willst, musste erstmal ein Locate machen
Quelltext
1:
| Table1.Locate('Umlag-Nr',Edit1.Text,[]) |
Dann kannste das löschen und die if-Funktion brauchste dann au net.
Den aktuelle Satz löschste am besten (ich nehme an du hastn DBGrid), indem Du einfach ein Table1.Delete machst (natürlich wenn die DB offen ist)
Gruß
Jagg - Di 10.12.02 23:43
Ich mach das nicht mit einem DBGrid !
Also nochmal !
In dem Editfeld wird die Nummer eingegeben,die wird dann mit der *.dbf verglichen im feld "UmlagNr",und wenn die nummer in dem editfeld mit der nummer im feld"UmlagNr" übereinstimmt wird der Datensatz gelöscht !
Due *.dbf ist aber nicht im DBgrid geöffnet,sondern sie ist auf der festplatte und darauf greife ich zu ! der datensatz soll nach dem löschen nicht mehr in der *.dbf zu sehen sein !Ich weiss das es nicht mit Table1.delete geht !
wie geht es dann ?
verstehst du mich jetzt ?
Jagg !
bis11 - Di 10.12.02 23:47
Vorschlag :
Versuche das ganze mal mit SQL.
SQL-Befehl dazu ist : DELETE FROM tabellenname WHERE UmlagNR='<<string vom Edit1-Feld>>'
Das ganze machst Du über eine TQuery-Komponente. Denn soweit ich weis gibt es keine andere möglichkeit außer die, die Dir UGrohne geschrieben hat.
LCS - Mi 11.12.02 09:00
Hi
| Jagg hat folgendes geschrieben: |
Ich mach das nicht mit einem DBGrid !
|
Davon ist doch auch gar niemand ausgegangen
| Jagg hat folgendes geschrieben: |
In dem Editfeld wird die Nummer eingegeben,die wird dann mit der *.dbf verglichen im feld "UmlagNr",und wenn die nummer in dem editfeld mit der nummer im feld"UmlagNr" übereinstimmt wird der Datensatz gelöscht !
|
Das ist doch genau das, was
UGrohne oben beschrieben hat.
| Jagg hat folgendes geschrieben: |
Ich weiss das es nicht mit Table1.delete geht !
wie geht es dann ?
|
Es geht
nur mit Table1.delete oder mit der SQL-Methode von
bis11.
| Jagg hat folgendes geschrieben: |
verstehst du mich jetzt ?
|
Wir verstehen dich schon :mrgreen: aber ich versteh nicht wo dein Problem ist.
Gruss Lothar
Jagg - Mi 11.12.02 09:51
ist das so richtig ?
Quelltext
1: 2: 3: 4: 5: 6:
| if Key = #13 then begin Query1.SQL.Clear; Query1.SQL.Add ('DELETE FROM Umlag.dbf WHERE UmlagNr=Edit1.Text'); Close; end; |
.... er löscht aber nichts ?
Jagg !
LCS - Mi 11.12.02 09:59
Hi
stells mal so um:
Quelltext
1: 2: 3: 4: 5: 6:
| if Key = #13 then begin Query1.SQL.Clear; Query1.SQL.Add ('DELETE FROM Umlag.dbf WHERE UmlagNr= ' + QuotedStr(Edit1.Text)); Query1.ExecSQL; end; |
Wenn UmlagNr ein numerisches Feld ist, musst du das QuotedStr weglassen.
Gruss Lothar
wwerner - Mi 11.12.02 10:45
Hi Jagg,
Bei DBase werden immer nur die Datensätze als gelöscht markiert. Wenn die Daten wirklich weg sein müssen, must du ein PackTable durchführen.
LCS - Mi 11.12.02 11:24
Oops :oops: Das hatte ich vollkommen ausser acht gelassen. Das ist natürlich korrekt und auch der Grund warums mit Table.Delete nicht funktioniert hat. Beim Löschen mit SQL ist es IMHO nicht notwendig.
Gruss Lothar
Jagg - Mi 11.12.02 12:32
Ich habe in der Hilfe unter Packtable besucht aber nichts gefunden !
Könnt ihr mir sagen ,was dieses so macht und die syntax sagen ?
danke !
Jagg !
LCS - Mi 11.12.02 12:46
Hi
das ist auch keine Methode sondern eine BDE-Funktion. Da gibts zwei Varianten die du anwenden kannst:
- DbiPackTable
- DbiDoRestructure
Ich hab das auch schon mal verwendet, allerdings müsste ich da erst mal Zuhause sehen, ob ich das noch finde. In der Zwischnenzeit könntest du vielleicht erst mal versuchen mit der BDE-API Hilfe weiterzukommen.
Das Problem dabei ist aber wieder, dass die Tabelle im Exklusiven Modus geöffnet sein muss, damit das funktioniert.
Ich würde an deiner Stelle erst mal Testen ob das Löschen mit SQL den gewünschten Erfolg bringt, bevor zu zusätzlichen Aufwand betreibst.
Gruss Lothar
LCS - Mi 11.12.02 13:01
Hi
Und noch was: Ich hab das Löschen von Datensätzen in DBase-Tabellen noch mal durchgetestet. Es funktioniert sowohl mit TTable.Delete als auch mit SQL. Gelöschte Datensätze (auch wenn physikalisch noch in der Tabelle vorhanden) werden in der Datenmenge nicht mehr angezeigt. Das Packen der Tabelle wäre also gar nicht unbedingt notwendig. Es sei denn aus Sicherheitsgründen.
Gruss Lothar
Jagg - Mi 11.12.02 13:22
hierbei :
Quelltext
1: 2: 3: 4: 5: 6: 7:
| if Key = #13 then begin Query1.SQL.Clear; Query1.SQL.Add ('DELETE FROM Umlag.dbf WHERE UmlagNr= '+(Edit1.Text)); Query1.ExecSQL; Close; end; |
markiert er nur den gelöschten datensatz,aber er entfernt ihn nicht !
Jagg !
wwerner - Mi 11.12.02 13:43
Wo siehst du das?
Jagg - Mi 11.12.02 13:44
wenn ich die tabelle öffne (nicht mit einem DBGrid)
LCS - Mi 11.12.02 13:46
Hi
der Code funktioniert und entfernt den Datensatz aus der Datenmenge. Er wird mit einem Löschkennzeichen versehen und ist damit nicht mehr sichtbar.
Gruss Lothar
wwerner - Mi 11.12.02 13:47
Kann der Benutzer deines Programmes die Tabelle auch so öffnen? Wenn ja: Tabelle packen, wenn nein alles OK
Jagg - Mi 11.12.02 13:52
nein !
Jagg - Mi 11.12.02 14:36
ich muss das aber mit dbipacktable machen weiss aber nciht wie !
Jagg !
wwerner - Mi 11.12.02 14:44
lies dir die antworten von uns noch mal durch. dann weist du wie es geht
Jagg - Mi 11.12.02 16:57
hier hab ich einen code :
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| if Key = #13 then begin Table1.Open; Table1.First; while not Table1.eof do begin if Table1.FieldByName('UmlagNr').AsString = Edit1.Text then begin Table1.Delete; Close; end; Table1.Next; end; end; |
.... hierbei springt er zum 1 datensatz und löscht ihn,aber dann springt er nicht zum 2 datensatz sondern immer zum 3 datensatz wisst ihr warum ?
Logi5 - Do 12.12.02 00:08
Ja, weil wenn der 1. Datensatz gelöscht wurde, steht der Datensatzzeiger auf dem 2. jedoch für die Prozedure die du da hast dazu, dass auch nach dem löschen auch ein Datensatz vor gesprungen wird...
Du musst die Prozedure so schreiben, dass "Table1.Next;" nur ausgeführt wird, wenn nicht gelöscht wurde...
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| if Key = #13 then begin Table1.Open; Table1.First; while not Table1.eof do begin if Table1.FieldByName('UmlagNr').AsString = Edit1.Text then begin Table1.Delete; end else begin Table1.Next; end; end; end; |
Die schreibweise ist zwar nicht die professionellste, aber es funzt..
wwerner - Do 12.12.02 07:22
Was soll eigentlich das close mitten in der procedure?
Jagg - Do 12.12.02 09:53
ich habe so :
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| if Key = #13 then begin Table1.Open; Table1.First; while not Table1.eof do begin if Table1.FieldByName('UmlagNr').AsString = Edit1.Text then begin Table1.Delete; if Table1.FieldByName('UmlagNr').AsString <> Edit1.Text then begin MessageDlg('Umlagerungsschein gelöscht ! Bitte gedruckten Schein vernichten !',mtInformation,[mbOk],0); Edit1.Clear; Close; end; end else begin Table1.Next; end; end; end; |
....hierbei wird eine Nachricht angezeigt,wenn das Feld "UmlagNr" mit Editfeld übereinstimmt (das macht er auch wunderbar)
aber jetzt mus noch eine Nachricht rein,wenn er keine übereinstimmung findet !
ich weiss nicht wo ich das reinpacken soll !
wisst ihr wo ?
Jagg !
PS : Vllt da wo Table1.next steht ?
LCS - Do 12.12.02 10:08
Hi
irgendwie verstehe ich dein Vorgehen nicht mehr. :nixweiss: Mal gehts ums Löschen, dann wieder ums Packen und jetzt gehts wieder ums Löschen. Wie denn jetzt?
Du hattest eine wunderbar simple und effiziente Lösung ein paar Postings weiter vorne und die hast du jetzt durch das ersetzt? Ich versteht die Welt nicht mehr. :autsch:
Gruss Lothar
wwerner - Do 12.12.02 10:08
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| var count : integer; ....
count := 0; if Key = #13 then begin Table1.Open; Table1.First; while not Table1.eof do begin if Table1.FieldByName('UmlagNr').AsString = Edit1.Text then begin Table1.Delete inc(count); end else Table1.Next; end; if count > 0 then MessageDlg('Umlagerungsschein gelöscht !',mtInformation,[mbOk],0) else MessageDlg('Nix gefunden !',mtInformation,[mbOk],0); end; |
Jagg - Do 12.12.02 10:24
danke !
aber das ich auf sowas einfaches nicht komme,also eine laufvariable setzen !
Jetzt fehlt nur noch das mit dem DBIPacktable,bis jetzt sind nur die gelöschten Datensätze markiert,aber sie sollen ja nicht mehr in der *.dbf zu sehen sein !
Jagg !
wwerner - Do 12.12.02 10:28
Noch einfacher!
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| if Key = #13 then begin Query1.SQL.Clear; Query1.SQL.Add ('DELETE FROM Umlag.dbf WHERE UmlagNr= '+(Edit1.Text)); Query1.ExecSQL; if Query1.rowsaffected > 0 then MessageDlg('Umlagerungsschein(e) gelöscht !',mtInformation,[mbOk],0) else MessageDlg('Nix gefunden !',mtInformation,[mbOk],0); end; |
Jagg - Do 12.12.02 10:34
danke für deine mühe !
gut zu wissen wi man das auch mir SQL macht !
Danke danke danke !
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!