Datenbank mit Delphi -> Probleme (Teil 2)

Diskutiere Datenbank mit Delphi -> Probleme (Teil 2) im Developer Network Forum im Bereich Hardware & Software Forum; Sorry, aber Randy war kurz offline, und da ist hier Mist passiert. Ich konnte allerdings den Thread noch aus dem Cache retten, hier ist meine...
  • Datenbank mit Delphi -> Probleme (Teil 2) Beitrag #1
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Sorry, aber Randy war kurz offline, und da ist hier Mist passiert. Ich konnte allerdings den Thread noch aus dem Cache retten, hier ist meine Antwort daraus:

TableScanner

So heißt erstmal das Tool, das ich meinte. Dieses habe ich aber nur auf Arbeit, und da komme ich erst am Montag ran. Im Netz konnte ich es heute nicht finden.

Was macht es? Man erstellt zuerst eine Tabelle mit dem Datenbank-Tool incl. aller Felder und Indezes. Danach scannt man mit dem Programm diese Tabelle(n) und erzeugt eine Unit, welche man in sein Projekt mit einbindet. Dann kann man mittels MakeAllTables die Tabellen erzeugen (oder reparieren).

Obiger Quelltext

Ja, wenn man das so macht, kann man tatsächlich die Tabelle nicht öffnen.

Abhilfe schafft Folgendes: Wirf (fast) alles weg, weise TableName (files.dbf) direkt an der Komponente zu, klicke auf die Ellipse bei FieldDefs der TTable im Objektinspektor und erzeuge dort zur Designzeit Deine 3 gewünschten Felder. Wenn Du nun den Quelltext ausführst, dann klappt es.

Ach ja, den Index kannst Du erst nach der erstellten Tabelle zuweisen.

Zugriff auf Felder

Er brachte mir eine Fehlermeldung, als ich zusätzlich zu den FieldDefs auch noch die Fields (Doppelklick, wie beschrieben) anlegen wollte. Ich weiß im Moment nicht, wieso.

Aber Du solltest mittels
Code:
tblMeineTabelle.FieldByName ('NAME').AsString := 'test';
trotzdem an die Felder rankommen. Dies ist nämlich die Variante, die man verwendet, wenn die Felder noch nicht zur Designzeit da sind.

Man sollte evtl. vorher testen, ob das Feld (ohne das .AsString) auch tatsächlich da ist, mache dies mittels
Code:
AField := tblMeineTabelle.FieldByName ('NAME');
if (Assigned (AField)) then
  AField.AsString := 'test';

DatabaseName bei TTable

Normalerweise gibt man dort einen sogenannten BDE-Alias an. Mit Hilfe des BDE-Admins (Systemsteuerung) kann man einen Aliasnamen mit einem Verzeichnis zur Datenbank verbinden. Jetzt kann die Applikation über den Alias auf die Datenbank zugreifen, die sich immer woanders befinden kann. Man muß nur das Verzeichnis beim Alias ändern...

Tip: Wenn Du eine kleine Anwendung schreibst, dann erzeuge (wie in Deinem Beispiel) die Datenbank mit im gleichen Verzeichnis wie die EXE. Dann hast Du kein Problem beim Weitergeben des Programms, weil der Anwender keinen Alias anlegen muß.

Eine weitere Verwendung von DatabaseName liegt bei der Komponente TDatabase: Diese ist eine übergeordnete Komponente, mit welcher man die Verbindung zu Paradox, SQL o.ä. herstellen kann, und dort Nutzereinwahl etc. erforderlich wird. Diese Komponente bekommt einen Namen, welcher dann bei DatabaseName der TTable angegeben werden kann. Das kannst Du dann bei vielen Tabellen machen, damit ist über die TDatabase-Komponente der Zugriff auf alle diese Tabellen freigegeben.

Links

Es gibt im Netz zwei wichtige Adressen, wo man viele Komponenten und Links und ... findet.
Delphi Super Page (siehe auch Links, Links Database)
Torry's Delphi Pages

OnShow

Hmm, es ist ungewöhnlich, den obigen Beispiel-Code bei OnShow auszuführen. Dies würde jedesmal (!), wenn die Applikation nach dem Minimieren o.ä. angezeigt wird, ausgeführt. Besser ist es, das beim FormCreate auszuführen.

O Love



------------------
"I will not abide disobedience!"
 
  • Datenbank mit Delphi -> Probleme (Teil 2) Beitrag #2
Z

Zeus

Bekanntes Mitglied
Dabei seit
07.04.1999
Beiträge
334
Reaktionspunkte
0
Danke O Love,
werde mich wieder an die Arbeit machen, ich denke, dass jetzt klappen sollte, wenn dem nicht so sein sollte melde ich mich sofort :) falls ich hier überhaupt wieder reinkomme. Ich hoffe Randy löst die Probleme mit dem Server bald (er hat ja bestimmt nichts anderes zu tun jetzt am Wochenende :supergrin: ).
Grüsse,
Zeus
 
  • Datenbank mit Delphi -> Probleme (Teil 2) Beitrag #3
Z

Zeus

Bekanntes Mitglied
Dabei seit
07.04.1999
Beiträge
334
Reaktionspunkte
0
-DP-


[Dieser Beitrag wurde von Zeus am ( 03. Juni 2000 editiert).]
 
  • Datenbank mit Delphi -> Probleme (Teil 2) Beitrag #4
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
TableScanner

Es ist Montag, und hier ist der versprochene TableScanner, direkt zum Runterladen:

http://www.pobox.com/~olove/tablescn.zip (etwa 200 kB)

Viel Spaß,

O Love

------------------
"I will not abide disobedience!"
 
  • Datenbank mit Delphi -> Probleme (Teil 2) Beitrag #5
Z

Zeus

Bekanntes Mitglied
Dabei seit
07.04.1999
Beiträge
334
Reaktionspunkte
0
Und wieder "Danke!" O Love,
muss leider ein paar Tage weg, werde wahrscheinlich erst Freitag wieder hier posten, hab' mich mit dem erstellen der Tabelle noch ein bisschen beschäftigt, hab's auch so versucht wie du sagtest, aber irgendwie baut Delphi Mist, es macht statt Integer immer irgendein Float, das die Datenbankoberfläche nicht erkennen will. Seltsam, seltsam, aber der Sache geh ich schon noch auf den Grund sobald ich wieder Zeit.
Bis dann,
Zeus
 
  • Datenbank mit Delphi -> Probleme (Teil 2) Beitrag #6
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Jetzt kommt die ultimative Methode:

Du erstellst die Tabelle bei Dir in der Datenbankoberfläche. Dann läßt Du die TTable-Komponente in Dein Formular fallen und verbindest sie mit der erstellten Tabelle. Jetzt kannst Du mit dem Field-Editor (s.o.) die Felder zur Designzeit einfügen lassen. Ganz wichtig: StoreDefs auf True setzen, dann werden alle FieldDefs und IndexDefs Informationen mit in die EXE gelinkt.

Zur Laufzeit kannst Du jetzt, wie gehabt, prüfen, ob die Datei da ist. Wenn nicht, mit CreateTable anlegen. Verddich. Es wird kein TableScanner mehr benötigt.

O Love

------------------
"I will not abide disobedience!"
 
  • Datenbank mit Delphi -> Probleme (Teil 2) Beitrag #7
Z

Zeus

Bekanntes Mitglied
Dabei seit
07.04.1999
Beiträge
334
Reaktionspunkte
0
So, da bin ich wieder :)
Hi, O Love
Das mit dem Erstellen scheint jetzt zu klappen (wie in deinem letzten Posting beschrieben, mit Storedefs).
Berichtigung:
Es funktioniert nicht, hab's genauso gemacht wie du sagtest:
1. Mit DB-Oberfläche Tabelle erstellt (dBase für Windows ist doch richtig oder???).
2. Table auf Form, die Datei angeben, doppelklick auf Table, alles hinzufügen, Storedefs auf true.
3. In FormCreate alles raus bis auf
Code:
table1.active:=false;
table1.createtable;
table1.active:=true;
4. Ausprobiert, läuft, dbf-Datei gelöscht, gestartet, er erstellt die Datei, bei table1.active:=true meckert er jedoch, dass die Datentypen ungültig sind, TSmallInt erwartet aber TFloat gefunden oder so.
5. Die Dateien sind identisch bis auf zwei Bytes, dort steht in der nicht funktionierenden Datei 06 (hex) statt 01 (hex) in der anderen funktionierenden.
6. Ziehe gerade das Update für D5 von Inprise, mal schauen vielleicht hilft es was.
Berichtigung Ende
Kannst du mir vielleicht noch mal kurz erklären was ich alles tun muss um den Index dann richtig zu erzeugen, krieg das nämlich irgendwie nicht mehr hin:
wenn ich also die DB mit der DB-Oberfläche erzeuge, kann ich dort keine Indizes zuweisen, er sagt was von ungültiger Indexdeskriptor, vielleicht mach ich es ja auch nur falsch.
Du hast auch mal geschrieben, dass ich denn Index nur nach erstellter Tabelle zuweisen kann, was heisst das?
Mache ich erst die Tabelle normal mit der DB-Oberfläche, ohne Indizes, und füge diese dann in Delphi hinzu?
Wie? Erst auf Indexdefs doppelklicken, dann einen Index hinzufügen, Name z.B. IdxName für Feld "Name" in meinem Bsp. und in Fields dann "Name" eintragen. Oder? Und was fehlt noch? So macht er es nämlich nicht.
Hoffentlich bringe ich dich nicht zur Verzweiflung mit meiner Fragerei, aber das alles mal zu lernen ist mir schon wichtig und das du mir hilfst find ich toll.
Ok, noch 'ne Frage:
Wenn ich mit Query etwas suche, z.B. "select * from files where name="BSPNAME"", dann sollte nach meinem Aufbau dieser Eintrag höchstens einmal drin sein, wenn also query1.fieldbyname('Name').AsString<>'' dann gibt es den Eintrag, ich kann "Anzahl" auslesen und möchte Anzahl jetzt um einen erhöhen. Ich wollte es so machen:
query1.edit;
query1.fieldbyname('Anzahl').AsInteger:=3;
query1.post;
Bei der Zeile "query1.edit" meldet er jedoch, das das Objekt nicht verändert werden kann, da es im Nur-Lesen-Status ist? (oder so ähnlich) Ich hab' ReadOnly aber auf false stehen, was meint er also? Muss ich das erst irgendwie freigeben? Wie? Oder geht das gar nicht so? Wie dann?
Fragen über Fragen, hoffentlich gibt's auch Antworten dazu.
Wenn nicht kann ich ja so'n Buch schreiben "Fragen auf die es keine Antwort gibt" :)
mfg
Zeus



[Dieser Beitrag wurde von Zeus am ( 10. Juni 2000 editiert).]
 
  • Datenbank mit Delphi -> Probleme (Teil 2) Beitrag #8
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Erzeugen der Tabelle

dBASE? Huch! Nimm bitte Paradox 7, welches er Dir ja schon anbietet. Ich habe das probiert, bei dBASE hatte ich irgendwie kein SmallInt, sondern nur Numeric mit Größenangabe. Nein nein, nimm Paradox, erzeuge 3 Felder (Alphanumeric, SmallInt und Logical), setze beim Namen den Key, fertig. Jetzt machst Du es unter Delphi wie oben beschrieben.

Index

Wenn Du alles richtig gemacht hast, kannst Du bei Index dann Name (oder wie auch immer Dein Keyfeld heißt) auswählen. Die Tabelle muß aber da sein (ist sie ja, nachdem Du die per Database Desktop angelegt hast), damit er nachschauen kann, ob er diesen Eintrag als Index verwenden kann.

Starten

Einfach starten, nachdem Du probeweise die *.DB und *.PX weggelöscht hast.

O Love

------------------
"I will not abide disobedience!"
 
  • Datenbank mit Delphi -> Probleme (Teil 2) Beitrag #9
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Ich vergessen, ich schon wieder vergessen...

Query

Das ist eine Anfrage an den Server, wo Du eine eingeschränkte Datenmenge anforderst. Normalerweise ist diese Menge immer ReadOnly, weil es eben eine Anfrage ist. Ich sagte aber normalerweise, weil es Dir Delphi bei bestimmten Queries ermöglicht, diese doch zu editieren.

Dazu zählen, wie in Deinem Beispiel, die "select * from TableName" Queries, wo nur ausgewählte Datensätze von TableName abgefordert werden, ohne Join mit einer anderen Tabelle oder mit berechneten Feldern. Diese Datensätze werden durch die BDE gecached, und es ist Dir halt möglich, zu editieren.

Du mußt dazu die RequestLive Property auf True stellen.

O Love

------------------
"I will not abide disobedience!"
 
  • Datenbank mit Delphi -> Probleme (Teil 2) Beitrag #10
Z

Zeus

Bekanntes Mitglied
Dabei seit
07.04.1999
Beiträge
334
Reaktionspunkte
0
Taadaaa,
es funktioniert alles!
Danke O Love,
jetzt hab' ich's dank deiner Hilfe ja doch noch gepackt.
Aber ein paar Fragen hab' ich dann doch noch:
Wenn ich mittels "tblMeineTabelle.FieldByName ('NAME').AsString := 'test';" was ins Feld schreiben würde, wo würde dann das 'test' reingeschrieben werden? Wird das Feld dann überschrieben, oder wird das ans Ende angehängt, oder vorne?
Und kann ich sonstwie einen bestimmten Datensatz ändern, oder geht es nur mit der Query-Methode wie oben beschrieben?
Und noch was ganz anderes, dazu mache ich dann aber einen neuen Thread auf, vielleicht schaust du ja dort auch mal rein *hoff*
Tausend Dank,
Zeus
 
  • Datenbank mit Delphi -> Probleme (Teil 2) Beitrag #11
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Nochmal zusammenfassend ein paar Sachen:

Öffnen/Schließen einer Tabelle

Entweder mit
Code:
tbl.Active := True/False;
oder mittels
Code:
tbl.Open/tbl.Close;

Daten manipulieren

Code:
tblFIELD1.AsString := 'test'; // Feld wurde im Designer hinzugefügt
tbl.FieldByName ('FIELD1').AsString := 'test'; // Feld ist zur Design-Zeit noch nicht da

Daten anhängen

Code:
tbl.AppendRecord ([Val1, ..., ValN]);

oder

Code:
tbl.Append;
tblFIELD1.AsString := 'test';
tblFIELD2.AsInteger := 27;
tbl.Post;

Daten ändern

Wie oben, doch statt Append mußt Du Edit nehmen.
Code:
tbl.Edit;
...

Daten suchen

Schau zur genaueren Erklärung auch mal in die Hilfe:
Code:
Found1 := tbl.Locate ('KEY', KeyVal, LocateOptions);
Found2 := tbl.Locate ('KEY1;KEY2', VarArrayOf ([KeyVal1, KeyVal2]), LocateOptions);

Allgemeine Sachen

Intern haben die Tabellen einen Datensatz-Zeiger, der nach dem Öffnen auf dem ersten Eintrag steht. Nun kann man mittels First/Prior/Next/Last durch alle Einträge durchgehen, der Zeiger ändert sich jedesmal. Obiges Locate nimmst Du, um einen bestimmten Eintrag zu finden, wenn er gefunden wurde, steht der Datensatz-Zeiger dort drauf. Und genau auf diesem Datensatz, der, auf dem der Zeiger steht, arbeitest Du, wenn Du Edit machst.

Nimm erstmal Abstand von den Queries, beschäftige Dich vorerst nur mit den Tabellen und allen Funktionen, kannst ja mal die Hilfe zu TTable aufrufen, und dort nach den verfügbaren Methoden schauen.

O Love

------------------
"I will not abide disobedience!"

[Dieser Beitrag wurde von O Love am ( 12. Juni 2000 editiert).]
 
Thema:

Datenbank mit Delphi -> Probleme (Teil 2)

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben