AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Datenbanken / Grundlagen Teil 1 (InterBase)

Datenbanken / Grundlagen Teil 1 (InterBase)

Ein Tutorial von Gast · begonnen am 21. Jun 2002 · letzter Beitrag vom 19. Sep 2005
Antwort Antwort
Gast
Datenbanken / Grundlagen Teil 1 (InterBase)

Datenbank anlegen
1.) - InterBase Interaktive SQL
Als alle erste werden wir z. B. in dem Verzeichnis "Forum" ein Unterverzeichnis "Projekt" anlegen. Und in dem Verzeichnis Projekt werden wir insgesamt 2 leere Unterverzeichnisse anlegen: DataBase, Source
Bei laufendem (!!!) InterBase Server starten wir den InterBase Windows ISQL:
Menü File/Create Database

--> Local Engine

Database --> C:\Foruml\Projekt\DataBase\DForum.gdb
User Name --> SYSDBA
Password --> masterkey (keine großen Buchstaben)):
OK drücken und dann File/Exit.
Somit hat man zuerst eine leeres InterBase Datenbank erstellt...Du findest jetzt in dem Verzeichnis
C:\Foruml\Projekt\DataBase\
Eine Datei Namens Dforum.gdb

===========================

____________________
2.) – SQL-Explorer
Den SQL-Explorer starten: Delphi – Menü: Datenbank/Explorer:
____________________
3.) – ALIAS FORUM ->> Die erste Tabelle: KUNDE
1.) Datenbanken / ALT-F10 und Neu (oder mit Tastenkombination Strg+N) gelangstDu in „Neuer Datenbank-Alias“ Fenster
Wähle hier als Datenbank-Treibername INTRBASE und OK.
F2 - das Überschrift INTRBASE1 durch FORUM ersetzen
2) SERVER NAME --> C:\Foruml\Projekt\DataBase\DForum.gdb
USER NAME --> SYSDBA
LANGDRIVER --> 'WEurope' ANSI
Jetzt Strg+S und speichern unter „Forum“ (Alias)

Anmelden in einer Datenbank (Datenbak-Login)
1.) Menü Objekt/Öffnen

Benutzername --> SYSDBA
Paßwort: --> masterkey
Tabellen / Spalten
1.) Das „+“ Zeichen neben FORUM mit ALT+ --> öffnen.
2.) Gehe jetzt auf Tabellen und Strg+N und TABLE1 durch KUNDE ersetzen.
3.) Gehe jetzt auf Spalten und mit Strg+N lege so viele Spalten wieviel benötigt wird.
und benenne diese entsprechend (F2)
Code:
ID vom Typ --> INTEGER (keine Null- Werte zulassen)
ERFASSUNGSDATUM vom Typ --> DATE
KUNDENART vom Typ --> SMALLINT (keine Null- Werte zulassen)
KUNDENNUMMER vom Typ --> VARCHAR(20) (keine Null- Werte zulassen)
FIRMA vom Typ --> VARCHAR(30) (keine Null- Werte zulassen)
STRASSE vom Typ --> VARCHAR(30),
PLZ vom Typ --> VARCHAR(10),
ORT vom Typ --> VARCHAR(30),
TELEFONNR vom Typ --> VARCHAR(20),
TELEFAXNR vom Typ --> VARCHAR(20),
ADRESSE_AKTIV vom Typ --> SMALLINT
KONTAKTART vom Typ --> SMALLINT
KREDITINSTITUT vom Typ --> VARCHAR(30)
KONTONR vom Typ --> VARCHAR(20)
BLZ vom Typ --> VARCHAR(10)
____________________
Primärschlüssel
1.) Strg+N - Die Tabelle nennen wir KUNDE_PK und den Primärschlüssel legen wir auf die erste Spalte ID aus unserer KUNDE Tabelle.
____________________
Generatoren
1.) Strg+N - Die Tabelle nennen wir KUNDE_ID_GEN
2.) Speichere jetzt bitte die Generatoren in dem Du auf KUNDE_ID_GEN mit rechten Maustaste anklickst (oder ALT-F10) und Übernehmen auswählen.
____________________
Felder deklarieren
____________________
Achtung:
Solange die kleine Pfeilen (> ) rot sind läßt sich die Datenbank nicht abspeichern, darum müssen z. B. alle Spalten mit Typen versehen werden.
Um zwischen den Spalten- Namen und der Definition, Text und SQL-Eingabe zu springen benutze bitte (außer Maus) die Taste F12 und Teilweise Tabulator. Um das Menü mit den Datentypen zu öffnen halte die Alt- Taste und drücke Pfeil nach unten (Alt+Pfeil nach unten). Um den Wert in Nullzeichenzeile zu ändern halte die Strg-Taste und drücke Return (Strg+Eingabe). Die Kombination Strg+P wechselt hin und her in dem linken Explorerfenster die Spalten:
Wenn Du alles richtig gemacht hast dann siehst Du im Textfenster von Tabel1 folgendes:

Code:
CREATE TABLE KUNDE (
ID INTEGER NOT NULL,
ERFASSUNGSDATUM DATE,
KUNDENART SMALLINT NOT NULL,
KUNDENNUMMER VARCHAR(20) NOT NULL,
FIRMA VARCHAR(30) NOT NULL,
STRASSE VARCHAR(30),
PLZ VARCHAR(10),
ORT VARCHAR(30),
TELEFONNR VARCHAR(20),
TELEFAXNR VARCHAR(20),
ADRESSE_AKTIV SMALLINT,
KONTAKTART SMALLINT,
KREDITINSTITUT VARCHAR(30),
KONTONR VARCHAR(20),
BLZ VARCHAR(10)
)
____________________
Triggers
1.) Strg+N - Die Tabelle nennen wir KUNDE_ID_GEN
2.) in dem Texteditor tragen wir zusätzlich ein:
Code:
CREATE TRIGGER KUNDE_ID_GEN FOR KUNDE AFTER UPDATE POSITION 0 AS
BEGIN
  NEW.ID=GEN_ID(KUNDE_ID_GEN,1);
END
3.) In den Triggers/ Definition von: KUNDE_ID_GEN den Typ BEFORE INSERT einzutragen.
Speichern
Jetzt auf das Überschrift FORUM und ALT F10 – Übernehmen
=================================

Dieses Thema hier...die Du geöffnet hast muss aber so behandelt werden, dass auch Umsteiger bzw. Anfänger zu Recht kommen dürfen...um unsere Beispiele hier nachvollziehen zu können...
Man spricht immer InterBase dies...InterBase das...aber viele wissen in der Wirklichkeit nicht es richtig auszunutzen...
Vor allem Trigger und Generatoren bereiten manchen echte Kopfschmerzen...
...nun noch ein paar Worte zu Meiner Frage nach BEFORE INSERT....also nach Triggers...
___________
Triggers
Code:
CREATE TRIGGER KUNDE_ID_GEN FOR KUNDE BEFORE INSERT POSITION 0 AS
BEGIN
  NEW.ID = GEN_ID(KUNDE_ID_GEN, 1);
END
__________________________________________________ ____________
Triggers sind nichts anders als kleine Routinen die aus drei Teilen bestehen.
1.) Name
2.) Eine Bedingung
3.) Hauptblock also den Ausführungsteil
Hauptsächlich dienen Triggers zu Datenmodifikation indem die in den Trigger enthaltene Anweisungen ausgeführt werden. In dem Sinne bestimmt hier z.B. BOFORE INSERT der "Zeitpunkt" WANN sollte der Trigger ausgeführt werden....
Später in der Anwendung um z.B.: einen neuen Datensatz einzufügen verwendet man:
Table1.Append;
Also wird ein neuer Datensatz erzeugt...Nun stellt sich hier die Frage...:
WANN SOLLTE DIE NEUE ID GENERIERT WERDEN?
Nun die günstigste Konstellation für einen neunen Datensatz ist natürlich BEFORE INSERT..., da schon hier:

Code:
VAR
  xID : Integer;
BEGIN
  Table1.Append; //bekommt die neue ID einen Wert zugewiesen...somit ist die neue ID bekannt...und man kann das so nachprüfen:
  xID := Table1.FieldByName(‚ID').asInteger;
END;
Hier wäre auch zu vermerken das nur ein Eigentümer einer Tabelle kann einen Trigger erstellen.
Definiert man hingegen die Bedingung als AFTER INSERT bekommt man bei unserem ID...spätestens beim Datensatz speichern eine Exception....
Ein Trigger kann aber auch so aussehen:
Code:
CREATE TRIGGER KUNDE_DELETE FOR KUNDE BEFORE DELETE POSITION 0 AS
BEGIN
  delete from adress where id_kunde = old.id;
  delete from auftrag where id_kunde = old.id;
END
Dann mit der SQL-Anweisung
Code:
DELETE FROM KUNDE
WHERE ID = 2
wird nicht NUR ein Datensatz mit dem ID = 2 aus der Tabelle Kunde gelöscht...sonder auch (!!!) alle Datensätze aus der Tabellen ADRESS und AUFTRAG die in der Spalte ID_KUNDE den Eintrag 2 haben..., also den Verweis auf die Tabelle Kunden...
Diesen wunderbaren Mechanismus... intelligent und gezielt eingesetzt bewart eine Datenbank vor Entstehung der unbeliebten DATENBANK-LEICHEN..., he, he..., also Datensätze die in der "Luft hängen"...Das ist doch logisch: Wird ein Kunde gelöscht hat seine Adresse nichts mehr in der Tabelle Adresse zu suchen !!!
Es ist hier auch zu vermerken, dass das ein sehr gefährlicher Mechanismus ist..., da wird ein Kunde gelöscht können auch z.B. alle seine Rechnungen gelöscht werden..., und den Buchhalter muss ins Gefängnis..:
Code:
CREATE TRIGGER KUNDE_DELETE FOR KUNDE BEFORE DELETE POSITION 0 AS
BEGIN
  delete from RECHNUNG where id_kunde = old.id;
END
da würde ich aufpassen…
===================================

Zuerst eine Ergänzung:
(...)
Ein Trigger kann aber auch so aussehen:

Code:
CREATE TRIGGER KUNDE_DELETE FOR KUNDE BEFORE DELETE POSITION 0 AS
BEGIN
  delete from adress where id_kunde = old.id;
  delete from auftrag where id_kunde = old.id;
END
Dann mit der SQL-Anweisung

Code:
DELETE FROM KUNDE
WHERE ID = 2
wird nicht NUR ein Datensatz mit dem ID = 2 aus der Tabelle Kunde gelöscht...sonder auch (!!!) alle Datensätze aus der Tabellen ADRESS und AUFTRAG die in der Spalte ID_KUNDE den Eintrag 2 haben..., also den Verweis auf die Tabelle Kunden...
(...)
_________
ACHTUNG:
Das ich hier
WHERE ID = 2
Geschrieben habe könnte suggerieren...das nur bei dieser Zuweisung „schnappt“ der Trigger Mechanismus zu...FALSCH!!!
Angenommen solche Anweisung:
Code:
DELETE FROM KUNDE
WHERE (KUNDENART = 0) AND (ORT = ’USA’)
bewirkt das 3 Datensätze z.B. mit der ID’s 100, 1234 und 10032 gelöscht werden...Dann bei diese „Lösch-Aktion“ wird natürlich auch der Trigger aktiv...da er WARTET Buchstäblich darauf das ein Datensatz gelöscht wird...und zwar egal, ob mit oder ohne Bedingungen...Hauptsache irgendwas wird gelöscht...(Also wie ein Berufs-Soldat)...da weiß er „Hoppla...ich muss mich da einmischen“...
Somit werden auch alle Datensätze in der Tabelle ADRESS und AUFTRAG die in dem Feld ID_KUNDE die Werte 100, 1234 oder 10032 aufweisen....GELÖSCHT...
=============================

für weitere Beispiele brauchen wir noch eine Tabelle...sonnst kann man nicht viel zeigen...
4.) – Die zweite Tabelle: ANSPRECHPARTNER
Wir vergeben unserer zweiten Tabelle den Namen ANSPRECHPARTNER und benennen entsprechend die Spalten.
Wir definieren die Spalten in dem wird den Typ und dem entsprechend die Länge setzen, sowie prüfen wir, ob das Nullzeichen zugelassen wird. Und so z. B. für die Spalte ID wählen wir den Typ Integer (keine Länge) und das Nullzeichen wird nicht zugelassen (also hier muss später immer ein Wert eingetragen werden).
Also, von oben nach unten werden die Felder wie folgt benannt:

Code:
ID (Integer --> not null)
ID_KUNDE (Integer --> not null) (normalerweise nenne ich dieses Feld KUNDE_ID..., also zuerst TabellenName (KUNDE) und dann FeldName (ID) aber jetzt ist das schon egal)
ANREDE (String 15)
VORNAME (String 30)
NACHNAME (String 30 --> not null)
GEBURTSTDATUM (Datum)
BEMERKUNGEN (Memo-Feld)
Das Feld BEMERKUNGEN definieren wir so:
Typ: BLOB, Untertyp: Text, Länge: 8
Den Primärschlüssel nennen wir ANSPRECHPARTNER_PK und den Primärschlüssel legen wir auf die erste Spalte ID aus unserer ANSPRECHPARTNER Tabelle fest.
Jetzt benennen wir die Generatoren als ANSPRECHPARTNER_ID_GEN
Und in dem rechtem Fenster des Explorers unter dem Text erscheint:
Code:
CREATE GENERATOR ANSPRECHPARTNER_ID_GEN;
SET GENERATOR ANSPRECHPARTNER_ID_GEN TO 0
__________________
Jetzt bitte die Generatoren speichern in dem Du auf ANSPRECHPARTNER_ID_GEN mit rechten Maustaste anklicken (oder ALT-F10) und Übernehmen.

Letztlich legen wir noch ein Trigger an:
mit den Namen ANSPRECHPARTNER_ID_GEN und in dem rechten Fenster im Definition-Editor wählen wir als Typ: BEFORE INSERT an:
In dem Texteditor tragen wir zusätzlich (zwischen BEGIN und END) ein:
NEW.ID = GEN_ID(ANSPRECHPARTNER_ID_GEN, 1);
Wenn Du mit den Feldern fertig bist speicherst Du bitte die Tabelle in dem Du auf Tabellen mit rechte Maustaste anklickst (oder ALT-F10) und Übernehmen auswählst.
=================================

alles klar...Jetzt sieht Deine SQL-Anweisung für die Tabelle ANSPRECHPARTNER wie folgt aus:
Code:
CREATE TABLE ANSPRECHPARTNER (
ID INTEGER NOT NULL,
ID_KUNDE INTEGER NOT NULL,
ANREDE VARCHAR(15),
VORNAME VARCHAR(30),
NACHNAME VARCHAR(30) NOT NULL,
GEBURTSTDATUM DATE,
BEMERKUNGEN BLOB SUB_TYPE 1 SEGMENT SIZE 80
)
==============================

User fragt:
Hi Paul Jr.
Er fragt ob auch noch die Domains eigetragen werden müssen (er hat das in irgendwelchem Buch gelesen)

===============================
Antwort:
also irgendwas hast Du hier durcheinander gebracht...So geschieht manchmal wenn man eben nur ein Teilauszug und nicht das ganze Buch gelesen hat..., he, he
Falls Du noch nicht gemerkt hast sind in unserer Datenbank auf unerklärbare Weise die Domains (DATA DICTIONARY oder wie manche sagen Systemkatalog) schon drin...und wir konnten bis jetzt (wenn auch ohne Daten) unsere Datenbank immer speichern (!?)...
Ich würde sagen lassen wir das hier so stehen..., ich komme noch später kurz auf Thema Domains zurück...versprochen...
_______________________________
...nun falls Du aber nichts zu tun hast...öffne bitte den SQL- Explorer...gehe in das Menü Ansicht und wähle hier den Menü-Punkt:
Systemdaten...
Wenn Du jetzt unsere Datenbank öffnest und gehst auf den Zweig „Tabellen“ siehst Du außer unserer vorher definierten Tabellen noch System-Tabellen dazu...Du kannst Dir die ruhig anschauen... Um an bestimmte Tabellen- Informationen ranzukommen... greife ich manchmal direkt auf diese Tabellen zu.
...nun aber das gehört nicht hier hin...und wird hier auch nicht behandelt!
Bis bald...und lese bitte zur Zeit keine Bücher, he, he
=============================

An User:
da ich jetzt an den nächstem Posting über virtuellen Tabellen arbeite könntest du inzwischen unsere beiden Tabellen KUNDE und ANSPRECHPARTNER mit Daten füllen...mindestens je Tabelle 5 Datensätze. Bevor Du es jedoch machst lege bitte eine Nachschlage- Tabelle
KUNDENART
ein.
Um das zu erreichen öffne bitte den SQL-Explorer. Öffne jetzt unsere Datenbank die unter dem Alias "Forum" zu finden ist (Passwort: masterkey)..
Diese Tabelle brauchen wir für die Tabelle KUNDEN wo ich ein Feld unter dem Namen KUNDENART definiert habe.
ACHTUNG:
Ändere bitte den Namen (KUNDENART) des Feldes in der Tabelle KUNDE auf KUNDENART_ID, das ist ein "Fehler" von mir..., da er einen Verweis auf die Tabelle KUNDENART darstellen sollte.
______________________________
Zurück zu der Tabelle KUNDENART:
Diese Tabelle sollte zwei Felder besitzen (ID Integer Not null und Bezeichnung VARCHAR 30)
Lege bitte ein Primärschlüssel KUNDENART_PK (auf die Spalte ID) ein, ein Generator KUNDENART_ID_GEN und einen Trigger ebenfalls unter dem Namen KUNDENART_ID_GEN....
__________________________________________
Diese Tabelle solltest Du als erste mit Daten füllen.
Markiere bitte jetzt z.B. die Tabelle [-]- KUNDENART und in dem zweiten Fenster wähle bitte die Seite "Daten" aus. Hier trage beiliebige Werte ein wie z.B.
[code:1:2e4cf27e0c]
ID
 
Benutzerbild von MrSpock
MrSpock

 
Delphi 2010 Professional
 
#2
  Alt 22. Jun 2002, 22:50
Hallo PaulJr,

in deinem Beitrag erscheint immer wieder die Zeichenfolge
Zitat:
Liegt das daran, dass ich den Netscape Browser benutze oder ist das eine falsche Formatierung im Beitrag?
Albert
  Mit Zitat antworten Zitat
Christian Seehase

 
Delphi 11 Alexandria
 
#3
  Alt 22. Jun 2002, 23:08
Moin Mr. Spock,

das erscheint beim IE 6 auch.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#4
  Alt 22. Jun 2002, 23:16
Und im IE5.5 auch. Scheint ein Bug im Forum zu sein genau wie beim Euro-Zeichen (€). aber wir sollten die Diskussion verlegen, gehört nicht hier her.
Michael
  Mit Zitat antworten Zitat
Daniel B
 
#5
  Alt 22. Jun 2002, 23:18
Hi,

&#8211 ist ein minus. Ich glaube das man es so schreiben muss, damit Delphi es nicht als richtiges Minus ansieht und somit CompileFehler bringt.
Was würde passieren wenn du - Hallo - Compilieren lässt?!?!

Ich hoffe dass das jetzt kein Schmarrn ist. ich kenn mich mit DB nciht aus, könnte es mir aber so vorstellen.
  Mit Zitat antworten Zitat
CalganX

 
Turbo Delphi für Win32
 
#6
  Alt 22. Jul 2002, 12:46
Das hat etwas mit der Konfiguration des Boards zutun. Die Eingabe von Sonderzeichen unter HTML erfolgt durch eingabe eines Sonderzeichencodes ( bspw. – ). Da in diesem Board hier HTML-Tags deaktiviert sind, werden sie Standardmäßig angezeigt (also steht für – auch kein Sonderzeichen sonder –).

Chris1308

PS: Auch wenns nicht hierhin gehört. Sorry, aber wollte ich nurmal gesagt haben.
  Mit Zitat antworten Zitat
wlfmario
 
#7
  Alt 19. Sep 2005, 17:43
Was mache ich Falsch ?

Ich habe eine Datenbank Angelegt und die Tabellen und Spalten.
So weit so gut.
Nur mit dem Tigger klappt das nicht.
Erst habe ich den Generator angelegt und übernommen und dann will ich den Tigger anlegen und übernehmen dann kommt die Meldung (Siehe Bild) Was mache ich Falsch ?:

http://wolf-newmedia.de/Fehler.PNG
Mario
  Mit Zitat antworten Zitat
Themen-Optionen Tutorial durchsuchen
Tutorial durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 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