Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi fortlaufender Index in dBase Datenbank (https://www.delphipraxis.net/14432-fortlaufender-index-dbase-datenbank.html)

LuckyStrike4life 9. Jan 2004 12:46


fortlaufender Index in dBase Datenbank
 
Morgen,
ich brauch ein fortlaufenden Index für eine dBase Datenbank.
Mir ist es anscheinend nicht möglich die dBase Datenbank so einzustellen, dass eine Spalte als Indexfeld angesehen wird.

Jeder eingetragener Datensatz braucht ein eindeutiges Feld, welches die Spalte eindeutig macht.
Relevant ist dies beim löschen eines einzlnen Datensatzes.
Der Code dafür ist soweit fertig, dank der Hilfe von vielen anderen,
Thread hier zu lesen.

Ich hab jetzt zum Testen in die DB eine Spalte eingefügt, welche als integer deklariert wurde. Die Spalte nennt sich "integ", nur als Test - wie gesagt.
Delphi-Quellcode:
q_Delete.SQL.Clear;
  q_Delete.SQL.Add('DELETE FROM "t:eDienstreisebuch\mainDB.dbf" WHERE Integ=:Id');
  q_Delete.ParamByName('Id').AsInteger := querysort.FieldByName('Integ').AsInteger;
  q_Delete.ExecSQL;
  MainDBtabelle.refresh;
  querySort.Refresh;
Leider muss ich noch per Hand das >>Indexfeld<< "integ" mit Zahlen füllen. Das kann aber später nicht mehr sein, wäre auch zu umständlich das die User sich eine Zahl ausdenken müssten, wenn sie ihren Datensatz in die DB übernehmen lassen.

Eine Notlösung wäre eine Zufallsrechnung, die ich auf die ButtonClickfunktion lege, des Abschickbuttons. Das kann aber auch wirklich nur ne Notlösung sein.

Kann wer helfen?

Smokey 9. Jan 2004 13:39

Re: fortlaufender Index in dBase Datenbank
 
Hat dBase keinen Datentyp "Autoinc" oder sowas?
Kann ich mir garnet vorstellen.

Wenn wirklich nicht, oder du ihn nicht benutzen willst, kannst du ne funktion schreiben, die dir die nächst höhere Zahl vom neusten Datensatz zurückgibt.

In der Funktion nen 'SELECT MAX(integ) FROM ....'
Dann die zahl + 1
Wert zurückgeben, fertig. Musst natürlich noch den Fall abfangen, dass noch kein Datensatz drin ist :-D

Aber eigentlich kenn ich keine einzige Datenbank, die nicht nen Autoincrement anbietet...schau da mal nach.

Btw: Deine Notlösung ist ein Widerspruch in sich... Zufall != Eindeutig/Einmalig :shock:

Sourcemaker 9. Jan 2004 14:13

Re: fortlaufender Index in dBase Datenbank
 
Hi,

AutoInc unterstützt DBase nicht !
Um eine eindeutige Nummer zu erzeugen könntest du auf eine Datums/Zeitangabe in numerischer Form so wie Delphi sie benutzt (TDateTime) ausweichen.

Grüße

Frank

LuckyStrike4life 12. Jan 2004 09:00

Re: fortlaufender Index in dBase Datenbank
 
Zitat:

Zitat von Sourcemaker
Hi,

AutoInc unterstützt DBase nicht !
Um eine eindeutige Nummer zu erzeugen könntest du auf eine Datums/Zeitangabe in numerischer Form so wie Delphi sie benutzt (TDateTime) ausweichen.

Grüße

Frank

Okay, dann werd ich mich doch mal damit beschäftigen.
Danke.
Fragen werde ich sicher noch stellen müssen.

LuckyStrike4life 14. Jan 2004 12:46

Re: fortlaufender Index in dBase Datenbank
 
Zitat:

Zitat von Sourcemaker
Hi,

AutoInc unterstützt DBase nicht !
Um eine eindeutige Nummer zu erzeugen könntest du auf eine Datums/Zeitangabe in numerischer Form so wie Delphi sie benutzt (TDateTime) ausweichen.

Grüße

Frank

Hm.. könntest du dazu noch ein paar Worte sagen.
Wie man die aktuelle Uhrzeit abgreift, geht mir nicht ganz auf.

Datum ist klar, aber gibt es auch eine Komponente bzw. Funktion mit der man an die Uhrzeit kommt?

Smokeys Idee ist auch gut, wenn jemand dazu etwas sagen möchte, meine Ohren bzw. Augen sind auf.

Sourcemaker 14. Jan 2004 13:23

Re: fortlaufender Index in dBase Datenbank
 
Die Funktion now gibt dir Datum und Uhrzeit in einer Zahl kombiniert zurück (wenn das deine Frage war).

Mfg.

Frank

LuckyStrike4life 14. Jan 2004 14:18

Re: fortlaufender Index in dBase Datenbank
 
Zitat:

Zitat von Sourcemaker
Die Funktion now gibt dir Datum und Uhrzeit in einer Zahl kombiniert zurück (wenn das deine Frage war).

Mfg.

Frank

Stimmt, die Funktion hab ich im gleichem Programm schon benutzt :wall: .

Aber:
Delphi-Quellcode:
MainDBtabelle.FieldByName('Index').AsInteger := now;
müsste es heißen, dass geht aber nicht
Zitat:

[Fehler] DB4realpas.pas(308): Inkompatible Typen: 'Integer' und 'TDateTime'
Also versuch ichs mit AsDateTime, dann kann Delpgi zur Laufzeit nicht in das Feld schreiben, weils nummerisch ist.

Verdammt!

Sourcemaker 14. Jan 2004 17:39

Re: fortlaufender Index in dBase Datenbank
 
TDateTime ist kompatibel zu double also könntest du statt integer-field ein float-field mit entsprechenden Nachkommastellen benutzen oder du multiplizierst die TDateTime*10000 und machst dann trunc.

Delphi-Quellcode:
MainDBtabelle.FieldByName('Index').AsFloat := now;

MainDBtabelle.FieldByName('Index').AsInteger := trunc(now*10000);
Mfg.

Frank

LuckyStrike4life 15. Jan 2004 09:16

Re: fortlaufender Index in dBase Datenbank
 
Thx,
funktioniert beides. Endlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 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 by Thomas Breitkreuz