Autor Beitrag
asbito
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 29.10.07 17:16 
Hi lezte ich soll für die Schule ne schüler Datenbank machen mit typisierten datein oder besser nur einer datei. Darin muss auch die Funktion des Löschen eines Datensatzes sein. Gibts dafür vll irgend ne spezielle unktion prozedur oder so weil ich komm net mehr klar hab alles versucht es funzt net bitte helft mir.


mfg asbito.


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 29.10.2007 um 17:18
Matthias-K
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 271

Win95, Win98, Win2000, WinXP, Linux
D2, D4 Client/Server, D5 Enterprise, D6 Enterprise, D7 Enterprise, Delphi2005, C/C++ 3.0, C/C ++ 5.0, C/C++ 6.0
BeitragVerfasst: Mo 29.10.07 17:18 
und wieso keine db?

_________________
Ein Spezialist ist ein Mensch, der immer mehr von immer weniger weis, bis er alles von nichts weis!
asbito Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 29.10.07 17:21 
Das fragst du am besten meine Info lehrerin. Weiss hätte so leicht werden können aber was soll man machen, muss leider mit typisierten dateien sein.

---

Oder vll ne Möglichkeit die zu überschreiben oder so. Bin echt ratlos.

Moderiert von user profile iconNarses: Beiträge zusammengefasst.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 29.10.07 18:02 
Ich empfehle ein Kennzeichen im Record einzuführen. Physisches Löschen geht natürlich auch, aber ist bei "größeren" Datenmengen eher problematisch. Alle folgenden Datensätze müssten in irgendeiner Form verschoben werden. Also entweder lesen, an die richtige Stelle springen und dort neu schreiben und am Schluss die Datei abschneiden. Wenn es um Datensätze am Ende der Datei geht, ist das sicher nicht so schlimm. Aber stell Dir mal 1000 Datensätze vor, wovon Du die ersten 10 löschen möchtest. Das wären dann knapp 30000 Dateizugriffe (lesen+suchen+schreiben für alle Folgedatensätze mal 10 Datensätze).

Auch in Datenbanken wird das über ein "Kennzeichen" gelöst. Und offensichtlich aus gutem Grund.
asbito Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 29.10.07 20:20 
HI ja danke hab mir auch schon sone lösung überlegt und das aber wahrscheinlich rein lo gisch net hinbekommen. Da es ja ein schulprokt ist und unserre Lehrerin nur sehen will ob wirs kapiert haben mach das mit na array speciher die datei in einer array, sortier den rest raus und speicher dann zurück, da es bei uns net um 1000 oder mehr datensätze geht kann ich das ja machen, bei nem "echten" Programm also was einen tatsächlichen zweck erfüllen soll würd ich mir da schon gedanken um die resourcen machen und um die leistung.

trotzdem ganz doll danke vom asbito.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 29.10.07 21:24 
Kopier den letzten daten Satz auf den zu löschenden und schneide den letzten Datensatz ab. Du musst dir nur eine Sonderbehandlung für den letzten Datensatz ausdenken.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 30.10.07 07:50 
@Luckie:
Deine Lösung ist natürlich deutlich besser als meine. Da schäme ich mich ja fast.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 30.10.07 08:12 
Das Kopieren des letzten Records ist natürlich eine ganz brauchbare Idee, aber falls es noch irgendwelche Index/Sortierinformationen geben sollte, entsteht ein u.U. ganz beträchtlicher Overhead.

Ich würde jedem Datensatz einen Header spendieren, 2 oder 4 Byte. Ist der Header = 0, dann ist der Record gültig. Wenn nicht, dann enthält der Header die Datensatznummer des nächsten gelöschten Records.

Der 1. Datensatz enthält keine Daten, dafür einen Verweis auf den ersten gelöschten Datensatz und vielleicht auch andere Informationen.

Sei Header [x] der Verweis auf den ersten gelöschten Datensatz des x.ten Datensatzes.
Um einen Datensatz x zu löschen, reicht es, sowas zu schreiben:
ausblenden Quelltext
1:
2:
3:
Prozedur DatensatzLoeschen (x : Datensatznummer)
  Header[x] <-- Header[1]
  Header[1] <-- x

Man implementiert also eine einfache verkettete Liste. Anfangs ist Header[1] = -1

Wenn man einen Datensatz einfügt, steht ein freier DS ja in Header[1]. Also:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
Funktion ReserviereNachsteFreieDatensatznummer liefert Datensatznummer;
  If Header[1] = -1 Then                     /* keine zuvor gelöschten Datensätze vorhanden */
    Resultat <-- Höchste Datensatznummer + 2 /* Der 1.Datensatz ist ja reserviert */
    SchreibeLeerenDatensatz (Resultat)       /* Datensatz schreiben */
  Else 
    Resultat <-- Header[1]
    Header[1] <-- Header[Header[1]]

Und wenn man die Datei wieder rekonstruieren muss, kann man mit der Marke im Header einfach die Spreu vom Weizen trennen.

_________________
Na denn, dann. Bis dann, denn.