![]() |
Records löschen
Hi,
ich habe mal wieder eine Frage zu den Records: Wie kann ich einzelne Datensätze eines Records löschen? Zum Beispiel habe ich eine Datenbank mit Rezepten. Nun mag ich das eine nicht mehr haben und es aus der Datenbank von ca 100 löschen. Wie kann ich nun das Rezept so entfernen, dass ich keinen leeren Datensatz habe, sondern dass das Record vollständig entfernt wird und dann die kommenden alle eins aufrücken? Danke im Vorraus |
Re: Records löschen
du rückst einfach in ner schleife, die restlichen nach.
|
Re: Records löschen
ja, aber meine eigentlich Frage ist, wie ich ein speziellen Eintrag eines Records löschen kann. Ich habe damit noch kaum gearbeitet. Sorry für diese evtl. Anfängerfrage.
Wäre trotzdem cool, wenn ihr mir antworten könntet.. Bye |
Re: Records löschen
Wenn die Reihenfolge keinen Rolle spielt kannst du auch den zu löschenden Eintrag mit dem Letzten vertauschen und dann die Länge des Array um 1 verkleinern.
|
Re: Records löschen
hi,
wie würde das funktionieren? |
Re: Records löschen
Hi DJ-SPM,
nimm einfach eine Table Komponente. Den aktiven Datensatz kannst Du dann mit
Code:
löschen. Der Datensatz ist dann weg. Wenn Du allerdings eigene laufende Nummern in einem Feld geführt hast, hast du dabei eine Lücke. Du müsstest dann eine Reorganisation durchführen.
MyForm.MyTable.Delete;
grüsse hacki |
Re: Records löschen
Danke erstmal,
aber was ist eine "Label-Komponente"? :?: |
Re: Records löschen
Keine LABEL - Komponente sondern eine TABLE - Komponente ! Ein Objekt vom Typ TTABLE !!
Wie hast Du die Datenbank denn erstellt ? Hast du keine Table Komponenten verwendet ? |
Re: Records löschen
Hier mal ein Beispiel zu Records. Es wird nur eine Memo-Komonente zur Ausgabe des Array benötigt.
Delphi-Quellcode:
procedure TForm1.Button19Click(Sender: TObject);
type TEntries = record text: string; end; var a : Array of TEntries; i : Integer; begin SetLength(a, 5); // array füllen for i := low(a) to high(a) do a[i].text := Format('Eintrag: %d', [i]); // Testausgabe in memo for i := low(a) to high(a) do Memo1.Lines.Add(a[i].text); // Eintrag 3 löschen a[3] := a[high(a)]; SetLength(a, 4); // Testausgabe in memo, diesmal fehlt der Eintrag 3 for i := low(a) to high(a) do Memo1.Lines.Add(a[i].text); end; |
Re: Records löschen
War vielleicht der falsche Ausdruck. Es ist keine Datenbank sondern ein Record...
|
Re: Records löschen
danke,
ich werde mir mal dein Beispiel zu Gemüte führen.. Danke, bis dann |
Re: Records löschen
Hi...
irgendwie funzt das nicht so... Also, ich beschreibe es mal genauer... Mein Programm lädt in eine ValueList alle Rezepte ein. Dort kann ich eins markieren und dann werden rechts die genauen Daten angezeigt (in Label1.Caption usw.). So, meine einladeprodzedur sieht so aus
Delphi-Quellcode:
So wird alles eingeladen. Nun würde ich gerne ein Rezept in der Liste markieren können und dann löschen. Ich bekomme keinen vernünfitgen Code hin :wall:
procedure TForm1.LoadRezept;
begin Seek(RezeptFile, recnow-1); Read(RezeptFile, RRezept); with RRezept do begin Label19.Caption:=name; ... ... ... ValueListEditor1.InsertRow(name,Port ionen,true); end; end; for i:=1 to filesize(Rezeptfile) do begin IF recnow = filesize(Rezeptfile) then recnow:=1 else inc(recnow); loadRezept; |
Re: Records löschen
Du benutzt einen Typ :
Delphi-Quellcode:
Das ist ähnlich wie bei einer Textdatei. Mit dem seek gehst Du an eine definierte Stelle der Datei. Das hat den Vorteil, daß Du nicht jedes mal sequentiell vom Anfang bis zu der Suchstelle sequentiell durchwandern mußt. Der Nachteil davon ist aber : die Datei an sich kann nicht aktualisiert werden. Bzw.: gelöschte Datensätze bleiben schon noch da und werden nur gekennzeichnet.
FILE OF Record irgendwas
Deshalb hat man im Record ein Feld, das z.B. für einen Datensatz auf -1 steht und diesen dadurch als gelöscht kennzeichnet, obwohl er noch da ist. Im Programm muß nun dieses Feld rausgefiltert werden. Also alle Datensätze <> -1 werden angezeigt. Weg kriegst du ihn dadurch, einen Reorganisationslauf durchzuführen, indem Satz für Satz in eine neue Datei eingefügt werden, sofern sie das Löschfeld <> -1 besitzen. Diese wird dann umkopiert und die gelöschten Sachen sind dann auch weg. Bei sensiblen Daten reicht auch das aber nicht ! |
Re: Records löschen
sorry aber (ich mag das auch mal sagen ;) ) :dp: :warn: imemr nur ein Post (mit edit verändern) ;) sonst gilts(auch wenns nicht so gemeint ist) als pushen (das dein Thread unter den ersten 10 ist)
... Ps.: ich schreib auch oft zwei hintereinander :tongue: |
Re: Records löschen
Hi,
ich muss dieses Thema mal wieder aufgreifen. Ich habe jetzt einen Wert "Active". Wenn dieser Null ist, dann wird der Datensatz nicht angezeigt. Wenn ich einen neuen Datensatz erstelle, dann zeigt er mir den auch an, aber mit den Werten des Datensatzen mit Null. BSP:
Delphi-Quellcode:
Wie kann ich den Satz komplett löschen?
Aufgabe: Müll rausbringen
Beschreibung: Müll trennen Datum: 26.05.2004 Active: 1 nachdem ich diesen Datensatz gelöscht habe, sieht der nächste so aus: Aufgabe: Ins Büro fahren Beschreibung: Müll trennen Datum: 26.05.2004 Active: 1 |
Re: Records löschen
Kann mir da keiner Helfen?? Bitte bitte *euchanfleh* :?:
|
Re: Records löschen
Ich habe auf meiner Seite eine Unit mit einer Klasse, um mit typisierten dateien zu arbeiten, das sollte es tun. Entweder benutzt du sie direkt oder du kuckst dir an, wie ich es gelöst habe. Dabei habe ich es genauso gemacht, wie schon vorgeschlagen und kopiere den letzten Datensatz an die Stelle des zu löschenden Datensatzes und fertig.
|
Re: Records löschen
Ok, wird gemacht. THX
|
Re: Records löschen
Zitat:
Also, wenn du eine Datei hast, kannst du nicht einfach aus der Mitte oder Anfang ein Stück herausschneiden, ohne dass du einen relativ grossen (Kopier-)Aufwand hast. Deshalb wird bei einer "richtigen" Datenbank ein Flag verwendet, das angibt, ob der Datensatz gültig oder gelöscht ist. Beim DBase-Format ist dies z.B. das 1. Zeichen eines Record (' '=OK, '*'=Gelöscht). Mit der Zeit enthält deine Datei immer mehr Löcher mit gelöschten Datensätzen. Dann ist es an der Zeit die Datei zu komprimieren. Dazu braucht die Komprimierfunktion nur die Satzlänge zu kennen. Luckie gab den Vorschlag: "... und kopiere den letzten Datensatz an die Stelle des zu löschenden Datensatzes und fertig". (Zusätzlich muss man die Datei noch mit Truncate um einen Satz kürzen) Dies ist relativ effektiv, allerdings wird die Reihenfolge der Datensätze geändert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:34 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