Verwendung mehrerer DBF-NDX-Dateien

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
ManniSt
Beiträge: 24
Registriert: Mi 16. Okt 2019, 15:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Verwendung mehrerer DBF-NDX-Dateien

Beitrag von ManniSt »

Ich habe das Problem, das immer nur die aktive Indexdatei (NDX) bei Änderungen aktualisiert wird, opbwohl mehrere Indes-Dateien aktiv sind.
- Was mache ich falsch?
- Wie aktualsiere ich alle geöffneten Index-Dateien?

Im Beispiel sind 2 Indexdateien geöffnet aber nur SA_Konto wird bei Änderungen am Datensatz aktualisiert.

SachKont.FilePathFull := MDBF_Lw;
SachKont.ReadOnly := false;
SachKont.Exclusive := true;
SachKont.Open;
SachKont.Active := true;
SachKont.OpenIndexFile('SA_Konto.NDX'); // Index öffnen
SachKont.OpenIndexFile('SA_NAME.NDX'); // Index öffnen
SachKont.IndexName := 'SA_Konto.NDX'; // Indexnamen zuweisen

charlytango
Beiträge: 490
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: Verwendung mehrerer DBF-NDX-Dateien

Beitrag von charlytango »

ManniSt hat geschrieben:Ich habe das Problem, das immer nur die aktive Indexdatei (NDX) bei Änderungen aktualisiert wird, opbwohl mehrere Indes-Dateien aktiv sind.
- Was mache ich falsch?
- Wie aktualsiere ich alle geöffneten Index-Dateien?


Wow... das klingt für mich wie Nostalgie. Hab von dBase2 auf einem CP/M system über dBase3 zu Clipper und als Ausreißer dBaseIV und Foxpro lange mit xBase entwickelt und damit auch (für die damalige Zeit) riesige Datenbanken (mehr als 50 dbfFiles mit teilweise mehr als 3Mio Records und unzähligen Einzel- und Compoundindizes) betrieben. Da hat schonmal ein Neuaufbau der Indizes (die sind regelmäßig weg gekracht) gerne 10 Stunden gedauert.

Soweit ich mich noch erinnern kann liegt es am verwendeten Treibersystem ob mehrere Indizes gleichzeitig aktiv sein können. Man konnte mehrere Indizes auch in eine Datei packen und mit besonderen Zusatztreibern (SIX) auch mehrere Indizes erstellen, aber nur jeweils einen davon nutzen. Der programmatische Aufwand für das Update der Indizes und deren Erstellung bzw Reorganisation war sehr hoch. Ich hab keine Ahnung ob das für aktuelle Treiber und insbesondere die Lazarus-Implementierung gilt.

Seit es Dektopmöglichkeiten für SQL Datenbanken gibt habe ich dBase lange nicht mehr im Einsatz gehabt. Ich empfehle SQLite. Da braucht es nur eine aktuelle sqlite3.dll (unter Windows - äquivalente dazu gibt es auch für andere Plattformen) aber letztlich ist es auch Geschmackssache.

Um Indizes brauchst du dich nach dem Anlegen nicht mehr zu kümmern, das macht die DB. Und die hat zusätzlich noch Funktionen die ich mir unter dBase gewünscht hätte. Automatisches Inkrementieren von Schlüsselfeldern zum Beispiel. Selbst verlässlicher Multiuser-Zugriff ist möglich (für echte Multiuser Fähigkeit dann vielleicht MariaDB nehmen). Und sollte sich dein Programm in Größeren Umgebungen bewähren müssen, braucht man nur einfach die Zugriffskomponenten zu ändern und schon klappts auch mit der neuen SQL-Datenbank.

Ich gebe zu die Einarbeitungszeit ist etwas höher als bei DBF/NDX, es lohnt sich aber allemal.
Die Antwortzeit von 4 Tagen ist imho dem Thema geschuldet. Viele werden sich nicht mehr mit DBF beschäftigen, dementsprechend ist sicher auch die Unterstützung bei SQL größer.

LG und viel Erfolg

wp_xyz
Beiträge: 4323
Registriert: Fr 8. Apr 2011, 09:01

Re: Verwendung mehrerer DBF-NDX-Dateien

Beitrag von wp_xyz »

Wenn ich mir den Quellcode von TDBF anschaue, finde ich eine Methode "RegenerateIndexes". Kannst du die mal aufrufen?

ManniSt
Beiträge: 24
Registriert: Mi 16. Okt 2019, 15:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Verwendung mehrerer DBF-NDX-Dateien

Beitrag von ManniSt »

Hi und danke für die Reaktionen.

Also: Dbase ist noch lange nicht tot, da es tausende DBase-Tabellen im Einsatz gibt.

Regenerate... funktioniert einwandfrei, nur werden dabei die NDX völlig neu aufgestellt und das kann dauern. Das Problem ist aber, das immer nur der gerade aktuelle Index bei Änderungen automatisch auf Vordermann gebracht wird, aber nicht die anderen:

z.B.:

SachKont.OpenIndexFile('SA_Konto.NDX'); // Index öffnen
SachKont.OpenIndexFile('SA_NAME.NDX'); // Index öffnen
SachKont.IndexName := 'SA_Konto.NDX'; // Indexnamen zuweisen

Es sind 2 Index-Dateien angemeldet und eine ist aktiv und nur diese wird automatisch gepflegt. Das ist Mist, da die andere ja auch stimmen muss. Das Umschalten zwischen den beiden NDX geht natürlich auch einwandfrei über ...IndexName := ...
aber das Aktualisieren ..........

Gruß

Manfred

ManniSt
Beiträge: 24
Registriert: Mi 16. Okt 2019, 15:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

[Gelöst] Re: Verwendung mehrerer DBF-NDX-Dateien

Beitrag von ManniSt »

Die Lösung ist die Verwendung der *.mdx (Mehrfachindizes).
Diese wrden bei RegenerateIndex immer alle zusammen aktualisiert.

Benutzeravatar
Winni
Beiträge: 1320
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: [Gelöst] Re: Verwendung mehrerer DBF-NDX-Dateien

Beitrag von Winni »

ManniSt hat geschrieben:
So 6. Feb 2022, 15:19
Die Lösung ist die Verwendung der *.mdx (Mehrfachindizes).
Diese wrden bei RegenerateIndex immer alle zusammen aktualisiert.
Hi!

Genau! Bei ndx-Dateien wurde immer nur der aktive Index aktualisiert. Bei mdx-Dateienwerden alle Indices aktualisiert.

dBase Indexdateien sind Beyer-Bäume mit 4 Records pro Knoten. Die sind in der Praxis relativ schnell beim Lesen, aber beim Schreiben kann es vorkommen, dass alle Knoten im Zweig neu angelegt werden müssen. Deshalb hatte dBase ja das "Deleted" flag eingeführt, dass die einzelnen Records ungeändert lässt, bis man die Tabelle packt. Das kann allerdings dauern.

Winni

charlytango
Beiträge: 490
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: [Gelöst] Re: Verwendung mehrerer DBF-NDX-Dateien

Beitrag von charlytango »

Winni hat geschrieben:
So 6. Feb 2022, 16:29
Genau! Bei ndx-Dateien wurde immer nur der aktive Index aktualisiert. Bei mdx-Dateienwerden alle Indices aktualisiert.
damals habe ich dBase Dateien mittels kompiliertem Clipper-Programm bearbeitet und welche Fähigkeiten die Indizes hatten war eine Frage des benutzten Treibers (DBFNTX, COMIX, SIXDRIVER, DBFMDX, DBFNDX, etc...)der dann mitgelinkt wurde.

https://comp.lang.clipper.narkive.com/m ... -dbf-files

Demnach hatten unterschiedliche Treiber unterschiedliche Eigenschaften. Ich habe damals den SIXDRIVER verwendet, dem man sagen konnte in welcher Datei (ntx, ndx, mdx etc...) die Indizes jeweils aufgehoben wurden. Trotzdem hat sich der Treiber jeweils um die Indizierung/Aktualisierung aller angemeldeten Indizes gekümmert, ich habe da nie etwas extra implementieren müssen.

Klar kann man immer noch dBase Dateien verwenden (oder muß es oft auch tun). Hängt sicher auch von externen Faktoren und dem Mengengerüst ab. Und vor allem wie die Behandlung der Indizes im Entwicklungssystem (in diesem Fall Lazarus) impementiert ist.

Für mich gibt es mittlerweile deutlich komfortableres als "Datenbank". Besonders die Verwendung von SQL als Zugriffssprache ermöglicht es, das Programm und die Datenhaltung ohne viel Aufwand zu skalieren.

Und zudem zwingt es beim Programmieren/Designen zu einem optimierten Datenverhalten, denn SELECT * from TableXY und die anschließende Bearbeitung der gesamten Tabelle (entspricht einem USE/open in dBase) im Frontend ist einfach nur schlechter Stil und funktioniert nicht mehr ordentlich über Netzwerk oder Internet .

just my 2 cents

Benutzeravatar
Winni
Beiträge: 1320
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Verwendung mehrerer DBF-NDX-Dateien

Beitrag von Winni »

Hi!

Ich kann jeden nur den radikalen Schritt empfehlen, den wir Ende der 90er gegangen sind.

Nachdem wird mit Delphi 1 noch mit den dBase Dateien das dBase-Verhalten nachprogrammiert hatten, fiel bei Delphi 2 die Interbase (SQL) aus der Tüte.

Danach haben wir alle dBase-Tabellen nach SQL exportiert und die dBase-Tabellen nur noch fleißig im Backup mitgeschleppt. Und nie wieder in die Hand genommen.

Glücklicherweise ist heute das Angebot von freien SQL-Datenbanken sehr groß, während man vor 25 Jahren dafür noch Unmengen Geld ausgeben musste.

Und wir mussten uns nie wieder um die dBase-Nickellichkeiten kümmern - welcher Index wird denn nun upgedated. Und ist es man wieder Zeit die Tabelle zu packen? Und und und ...

Winni

Antworten