Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Index-Diskriptor (https://www.delphipraxis.net/378-index-diskriptor.html)

Privateer3000 9. Jul 2002 18:18


Index-Diskriptor
 
HAllo Leuts,

ich hab wie immer eine normale Tabelle angelegt und will ihr natürlich einen Index geben.
Doch beim speicher sagt die DB-Oberfläche "Ungültiger Index-Diskriptor".
Was zum Henker soll das?
Hab doch schon mehrere Tabellen gemacht und auch diesmal nichts anderes.

Kann das jemand deuten?

sakura 9. Jul 2002 22:09

Kleine, aber wichtige Frage: Welche DB nutzt Du :?:

:cat:

Privateer3000 9. Jul 2002 22:47

yep, hast recht...
dbase..aber frag mich nicht welche...*gg*

ich glaube aber dbIV genommen zu haben, hlat wie immer

MrSpock 10. Jul 2002 06:38

Hallo Privateer3000,

poste doch bitte mal die genauen Feldnamen, Typen inkl. Größen der ersten Felder der Tabelle und welches dieser Felder du als Schlüssel definieren willst.

Legst du die Tabelle über die Datenbankoberfläche an oder versuchst du die Tabelle aus einem Programm heraus zu erzeugen? Im letzteren Falle, poste doch bitte mal den entsprechenden Code.

Privateer3000 10. Jul 2002 07:53

Tabelle erzeuge ich mit der Delphi-Oberfläche(Tools/Datenb...)
Struktur ist total simple:

NAME C 254
Label1 N 20 0
.
.
.
.(bis 12)
LAbel12 N 20 0

mehr nicht.
Und das Feld NAME will ich indexieren, und zwar gewartet und eindeutig.

PS:
Die Tabelle funktioniert ja sogar, ich kann von meinem Programm etwas in die Tabelle posten, nur der Index geht halt nicht.

MrSpock 10. Jul 2002 08:26

Hallo Privateer3000,

das Name Feld ist zu groß, um als dBase Inex verwendet zu werden. Es funktioniert nur bis zu einer Länge von 100 Zeichen. Also musst du entweder die Feldgröße verändern (100 ist ja auch schon ein langer Name :wink: ) oder ein zusätzliches ID Feld anlegen, das als Index benutzt werden kann.

Privateer3000 10. Jul 2002 08:46

Du hast wie immer so recht, Schpocki :wink:

Danke

Noch ne Frage...gibt "Table1.post" einen Wert zurück?
Damit man auswerten kann ob der Post erfolgreich war...
Oder sollte man es prinzipiell der vorhanden try-except Kombi überlassen.
Und...wie kann ich prüfen ob der Name schon vorhanden ist?
Also, beim Programmstart soll der der Name aus einer inputbox mit der Tabelle verglichen werden ob dieser schon existiert. Das soll nicht verhindert werden, aber der User soll informiert werden, wenn er den NAmen wieder verwendet werden die alten Daten überschrieben.

Privateer3000 10. Jul 2002 09:54

Mit dem Vergleich ob der Name schon existiert hab ich folgendes angefangen:
Code:
with DataModule9 do
begin
DataModule9.Table2.Open;
if DataModule9.Table2.FindKey([meld]) then
showmessage('Name existiert schon!')
else
end;
Das quittiert das Programm mit einer Zugriffsverletzung.
Der Schlüssel 'meld' ist ein String aus einer inputbox.

MrSpock 10. Jul 2002 10:50

Hallo Privateer3000,

Post gibt keinen Wert zurück, sondern löst ggf. eine Exception aus, darum ist ein try ... except Block zu empfehlen.

Zu deinem Code: Wenn du mit "with" arbeitest, kannst du dir den Namen der entsprechenden Variablen beim Zugriff sparen, also

Code:
with DataModule9 do
begin
  Table2.Open;
  if Table2.FindKey([meld]) then
     showmessage('Name existiert schon!');
end;
Außerdem kann man die Eigenschaft Name des TTable Objekts ändern, dann wird der Code lesbarer.

Eine Zugriffsverletzung könnte ggf. darauf zurückführbar sein, dass Table2 nicht mit korrekt mit der Tabelle verbunden ist. Gibt es da eine genauere Fehlermeldung?

Privateer3000 10. Jul 2002 11:52

"Zugriffsverletzung bei Adresse in Modul 'Test.EXE' ..."
Also keine spezielle MEldung.
Habe ich die Zeile mit Findkey richtig geschrieben?
In der OH steht:
function FindKey(const KeyValues: array of const): Boolean;
Also gehe ich davon aus der was in "meld" steht als Schlüssel benutz werden soll.
Liege ich da falsch?

MrSpock 10. Jul 2002 12:06

Nein, absolut korrekt. Wenn "Name" der Schlüssel ist und dieser auch ausgewählt ist (was immer der Fall ist, wenn es sich um den primary key handelt und dieser nicht explizit abgewählt wird), dann ist dein Code korrekt. Es muss also an einem nicht richtig initialisierten Objekt oder so etwas liegen. Wie ist "meld" deklariert? Tritt der Fehler schon bei Open auf?

Privateer3000 10. Jul 2002 12:49

yo, schon beim Start des Programmes.
meld wird als var meld: string; dekl.

beim start kommt eine inputbox:

meld:=inputbox('Eingabe','Bitte den Namen eingeben!','');

und jetzt kommts:
findkey soll nachgucken ob der eingegebene Name schon
in Datamodule9 bzw. in dessen table2 exisitert.

Code:
procedure TForm1.FormCreate(Sender: TObject);
begin
meld:=inputbox('Eingabe','Bitte den Namen eingeben!','');
if meld=('') then
begin
Showmessage('Kein Name angegeben!');
meld:=inputbox('Eingabe','Bitte den Namen eingeben!','');
end;
with DataModule9 do
begin
Table2.Open;
if Table2.FindKey([meld]) then
showmessage('Name existiert schon!');
end;
.
.
.

usw
so siehts aus...

MrSpock 10. Jul 2002 13:03

Hallo Privateer3000,

versuchs mal mit :

Code:
if meld='' then ...
Die runden Klammern sind dort falsch. Außerdem könnte es sein, dass während FormCreate das Datenmodul noch gar nicht korrekt initialisiert ist. Deshalb wäre es besser die Abfrage in der OnActivate-Methode zu implementieren (mit der firstTime Variable, wie ich es schon mal beschrieben habe.)

Privateer3000 10. Jul 2002 15:52

Das wars auch !
Ich habe
with DataModule9 do
begin
Table2.Open;
if Table2.FindKey([meld]) then
showmessage('Name existiert schon!');
end;

in onActivate ausgelagert, jetzt gehts.
Also ist der Zugriff bei FormCreate zu früh..siehste wusst ich auch noch nicht.

Besten Dank Spocki

MrSpock 10. Jul 2002 16:06

Gern geschehen.

Beachte aber bitte, dass Activate nicht nur einmal am Anfang, sondern auch dann ausgeführt wird, wenn z.B. ein minimiertes Fenster wieder vergrößert wird. Deshalb solltest du die Abfrage:
Code:
if FirstTime then
begin
   FirstTime := False;
   { hier der Code, der nur einmal ausgeführt werden soll }
end;
{ hier der Code, der immer ausgeführt werden soll }
Dabei in FormCreate

Code:
FirstTime := True;
vorbesetzen. FirstTime ist dabei im privat - Abschnitt der Form als Boolean deklariert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz