PLZ und Ort in separater Tabelle

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Strat49
**
Beiträge: 40
Registriert: Fr, 15.09.2006 13:19
Wohnort: Bremen
Kontaktdaten:

PLZ und Ort in separater Tabelle

Beitrag von Strat49 »

Hallo,

bin hier Newbie und beiße mir an einem Problem die Zähne aus bzw. die Fingernägel ab. Habe das Forum vergeblich nach einer Lösung abgesucht. Wer kann helfen?

Ich arbeite mit OOo 2.0.3 unter Suse Linux 10.0. Für eine Base-Anwendung benötige ich Adressdaten. Entsprechend der Normalisierung möchte ich die PLZ und Orte in einer separaten Tabelle erfassen. Die Datenein- und -ausgabe soll über ein Formular erfolgen.

Ich habe eine Tabelle test_name mit den Spalten id (Primärschlüssel, Autoinkrement), name (TextVar) und plz_fk (Integer) sowie eine Tabelle test_orte mit den Spalten id (Primärschlüssel, Autoinkrement), plz (TextFix) und ort (TextVar). Die Spalten test_name.plz_fk und test_orte.id sind miteinander verbunden (n : 1). Soweit scheint mir alles richtig zu sein.

Das Formular test_adressen ist mit der Tabelle test_name verknüpft und besitzt das Feld name sowie in einem Subformular die Felder plz und ort aus der Tabelle test_orte. Auch dies scheint richtig zu sein.

Wenn ich nun Daten eingeben will, geht das in dem Feld name. Auch das Speichern der Eingabe in der Tagbelle test_name funktioniert. Die Felder plz und orte können jedoch nicht angesprochen werden. Hier werden auch keine Daten in der Tabelle test_orte gespeichert. Natürlich funktioniert auch die Beziehung zwischen den Tabellen nicht. Dies scheint mir nun nicht mehr richtig zu sein. ;-)

Wer weiß Rat und will ihn mir geben? Danke im Voraus.

Gruß Norbert
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

Wie hast du das Formular denn erstellt? Manuell oder mit dem Assistenten?
Falls manuell: Stimmt die Verknüpfung zwischen Formular und Subformular?

Speicherst du das Subformular überhaupt, wenn du Daten eingegeben hast? :D
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Norbert,

also, ich denke, du solltest noch mal über dein Verfahren nachdenken. Das, was du da machst , ist keine Normaliesierung! Und du machst dir dein Leben deutlich einfacher, wenn du PLZ und Orte direkt erfasst.
Erläuterung:
Die Normalisierung soll redundante Informationen in einer Tabelle (Datebank) vermeiden und diese über ander Tabellen verknüpfen.
Nun könnte man tatsächlich eine Abhängigkeit zwischen PLZ und Orte erkennen, dann aber wirst du schnell sehen, dass dieses so einfach nicht ist. Eine Postleitzahl identifiiert zwar einen Ort eindeutig, nicht aber der Ort eine PLZ. Hierzu brauchst du acuh die Strasse - und die direkten Postfächer von Großkunden sind dann noch etwas anderes.
Wenn du also eine Normalisierung willst, dann müsstest du die PLZ als Schlüssel nutzen - hier gibt es nur eine Beziehung, also 1 PLZ bestimmt den Ort. In deiner zweiten Tabelle wäre also die PLZ der Primärschlüssel und jeder PLZ wäre eine Ortsbezeichnung zugeordnet (die kann und wird dann allerdings auch häufiger auftreten). Die Beziehung wäre also tabelle1-plz zu tabelle2-plz, eine 1:1 Beziehung. Jetzt muss natürlich die PLZ Tabelle schon vollständig sein, sonst geht das nicht. Und der Primärschlüssel (PLZ) darf natürlich nicht auf autoinkrement stehen.
Auch müssen die Feldtypen beider PLZ Felder übereinstimmen - sonst gibt es wieder Probleme.

Also, das ist alles viel komplizierter als es auf den ersten Blick erscheint. Gerade für den Newbie solltest du dir hier keine "grauen Haare" wachsen lasen und PLZ und Ort gemeinsam erfassen :-)

Soviel zum "Normalisierungsproblem".

Jetzt zu deinen formularen: zunächst kannst du die Tabellen - wie bei dir beschrieben verknüpfen.
Auch Formulare kannst du so erzeugen. Nur: wie stellst du dir die Beziehung vor?
Also: du erzeugst einen neune Datensatz im Hauptformular. Hier ist das Feld "Name" sichtbar, du gibst Daten ein. Jetzt speicherst du den Satz. Die ID wird automatisch gefüllt, der Name eingetragen. Fertig. Mehr hast du nicht vorgegeben. Das Feld "plz_fk" bleibt leer, du hast nichts eingegeben, da steht also nix drin. Dein Unterformular enthält zwei Felder: "PLZ" und "Ort". Schön, gib Daten ein, speicher die, die ID wird automatisch hochgezählt - fertig. Was fehlt: Die Verbindung zur anderen Tabelle, der Fremdschlüssel. Der kann nicht automatisch gesetzt werden, den musst du manuell oder über Makro erzeugen und setzen, also theoretisch zwei weitere Felder, in denen du den Fremdschlüssel explizit eingibst. Das ist natürlich nicht praxistauglich. Also, das Problem der automatischen Verknüpfung von Hauptformular mit Subformularen während der Eingabe ist mit einfachen Klicks, Mausziehen etc nicht zu machen, das Auslesen der Daten aber schon.
Wenn dich das tiefer interessiert, wirst du um ein gutes Buch nicht drumherum kommen. Dort wird dann auch beschrieben, wie dieProgrammierung zu machen ist, wie Normalisierung funktioniert, Zusammenhänge, Grundlagenwissen.
Oder du tastest dich Schritt für Schritt ran, dann fan nicht mit so einem "Problem" an :-)

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Strat49
**
Beiträge: 40
Registriert: Fr, 15.09.2006 13:19
Wohnort: Bremen
Kontaktdaten:

PLZ und Ort in separater Tabelle

Beitrag von Strat49 »

Hallo,

danke für eure Antworten.

zu Mihilist:

Das Formular habe ich manuell erstellt. Die Verknüpfung ist richtig. Das Problem scheint mir tatsächlich so zu liegen, wie Thomas es erklärt hat. Es liegt ja in erster Linie darin, dass in den Fremdschlüssel nichts eingegeben und daher nichts gespeichert werden kann. Daher besteht praktisch ja keine Verbindung zu Tabelle test_orte. Aber deine letzte Frage ist ein guter Hinweis. Das Subformular hat gar keinen Speicherbutton. Hatte ich glatt übersehen! :?

zu Thomas:

Also, wenn ich mir deine Hinweise einmal in Ruhe durchdenke, scheint es mir mit zwei Tabellen doch zu kompliziert zu sein.

Ich hatte die Idee aus deinem Buch "Datenbanken mit OOo2" S. 153, 154 entnommen und gehofft, dass ich das irgendwie hinkriege. Das Formular sollte dann makrogesteuert funktionieren. Dazu habe ich auch Anregungen aus deinem Buch "Makros in OOo2" übernommen, was auch tadellos geklappt hat. Blieb nur halt das beschriebene Problem. Dazu fehlen mir dann doch noch Erfahrungen und Kenntnisse im Datenbankdesign.

Ich werde es also ganz normal in einer Tabelle versuchen, die sämtliche Adressdaten aufnimmt.
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

Moin

Also das Problem ist eigentlich garkein so schlimmes Problem. Hab das auch so in der Art schon gemacht. Aber das Hauptproblem ist dabei eben, dass du es (zumindest aus Sicht von OOo) genau falsch rum machst: du hast eine 1:n-Beziehung, willst nun aber die n-Seite im Hauptformular und die 1-Seite im Subformular... ;)

Das ganze geht aber recht einfach mit einem Makro, wenn du ein Listenfeld mit PLZ und Orten füllst, und dann per Makro die entsprechende ID ins Hauptformular einträgst. Es ist zumindest nicht unlösbar...
Also wenn du noch etwas Zeit dafür hast: Viel Erfolg. Wenn nicht: Nimm eine Tabelle und einen Enum oder eine Combobox - der Normierungseffekt ist damit auch erreicht *g*

Grüße

Noch'n Thomas
Strat49
**
Beiträge: 40
Registriert: Fr, 15.09.2006 13:19
Wohnort: Bremen
Kontaktdaten:

Beitrag von Strat49 »

Hallo Noch'n Thomas,

danke für deine Tipps. Nachdem ich nunmehr bereits die Lösung ohne separate Tabelle test_ort gewählt habe, bin ich natürlich wieder neugierig geworden. ich werde es einmal testweise versuchen und anschließend kurz berichten.

Der Tipp mit der 1:n Beziehung im Formular war mir auch noch nicht klar. Gilt das immer, dass die 1-Seite stets das Hauptformular sein muss? Ich hatte mir darüber noch nie Gedanken gemacht und in den Anleitungsbüchern von Datenbanken gleich welcher Couleur habe ich hierüber meist nur vage Aussagen ohne konkrete Details gelesen.

Dienen letzten Tipp mit den Enums und der Combobox habe ich nicht verstanden. Aber egal, darauf kann ich ja zurückkommen, wenn die andere Bastelei nich klappt und mich weiterhin der "blanke Ehrgeiz"packt.

Grüße erstmal
Norbert
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

Hallo Norbert
Strat49 hat geschrieben:Der Tipp mit der 1:n Beziehung im Formular war mir auch noch nicht klar. Gilt das immer, dass die 1-Seite stets das Hauptformular sein muss?
Muss nicht, aber so ist es von OOo aus wohl vorgesehen: Du wählst im Hauptformular einen Datensatz der 1-Seite und bekommst im Subformular die dazu passenden Datensätze der n-Seite.
Wie du ja schon festgestellt hast wird es etwas kniffliger, wenn du nur einen Datensatz im Subformular hast (also die 1:n-Verbindung andersrum anzeigst). Das ist wie gesagt nicht unlösbar, aber eben aus Sicht von OOo irgendwie falsch :)

Wobei das noch relativ einfacher ist, wenn du die Orte und PLZ komplett vorgibst (also in der Tabelle nichts mehr hinzugefügt werden muss). Dann geht das mit einer Combobox und einem recht kurzen Makro ;)
Strat49 hat geschrieben:Dienen letzten Tipp mit den Enums und der Combobox habe ich nicht verstanden. Aber egal, darauf kann ich ja zurückkommen, wenn die andere Bastelei nich klappt und mich weiterhin der "blanke Ehrgeiz"packt.
Die Vorschläge waren für deine jetzige Lösung mit nur einer Tabelle gedacht.

1. Möglichkeit: In der Datenbank einen Enum verwenden, dann kommen da nur Einträge rein, die du willst (etwa "München", "Nürnberg", ... ohne die Möglichkeit, etwa "Muc" oder "Nbg" einzutragen). Das kombiniert mit einem Listenfeld, dass die möglichen Einträge beinhaltet, und schon gibt es keine Probleme mehr - außer dass du keine neuen Einträge bekommst.
Wobei du den Enum an sich garnicht benötigst, wenn du ein Listenfeld hast. Wäre aber schon "schöner".

2. Möglichkeit: Du lässt die Spalte nicht als Textbox, sondern als Combobox anzeigen, und stellst dabei als Daten die Spalte ein, "automatisch vervollständigen" oder wie das heißt nicht vergessen, und fertig: Sobald du anfängst etwas zu tippen kommt ein Vorschlag, der schon irgendwo in deiner DB steht (Wenn etwa irgendwer schon als Ort "90419 Nürnberg" hat, dann wird dieser Vorschlag schon angezeigt, wenn du "904" eingegeben hast - außer es gibt noch einen "9040..."-Eintrag... ich hoffe du verstehst, was ich sagen will...) Somit hast du auch einen gewissen Normierungseffekt, und kannst sogar problemlos neue Daten eingeben.
Wenn du etwa die PLZ ändern willst, aber der neue Eintrag auch ein Nürnberger ist, dann gibst du 90 ein (womit die Stadt eindeutig ist) und änderst die restlichen drei Ziffern. "Nürnberg" steht dann schon da.

Ich hoffe das war nun verständlicher.
Wobei ich persönlich die 1:n-Verbindung bevorzügen würde, weil es da dann einfacher ist, etwas zu ändern ;) Ist aber eben, zugegeben, ein bisschen mehr Aufwand.

Grüßle
Thomas
Antworten