[gelöst] Textfeld automatisch füllen nach Eintrag in Liste..

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

obrigada2000
Beiträge: 8
Registriert: Mi, 27.06.2012 13:49

[gelöst] Textfeld automatisch füllen nach Eintrag in Liste..

Beitrag von obrigada2000 »

Hallo zusammen!

Ein ähnlicher Thread existiert zwar schon, ist aber schon über ein Jahr alt & leider ohne Anhänge, so dass ich nichts zum Ausprobieren und Anpassen gefunden habe und hier einen neuen Thread starte.

Ich möchte in einem Formular mittels der Dropdown-Liste ein Land auswählen, woraufhin dann im benachbarten Textfeld automatisch der ISO-Code des Landes eingetragen werden soll. Das würde ich gern über ein Makro realisieren. (Bessere Lösungsvorschläge sind immer willkommen.)

Ich vergesse die ISO-Code Eintragungen in meiner inzwischen doch recht umfangreichen Datenbank relativ oft, benötige diese Eintragungen jedoch für Abfragen und natürlich auch für die Adressierung, da einige Länder z.B. den ISO-Code vor ihrer PLZ auf der Anschrift sehen wollen. Die ISO-Codes für die Länder sind ja zum Glück eineindeutig. Alle bisher benötigten Länder & ISO-Codes habe ich bereits in eine weitere Tabelle eingetragen.

Ich habe mal je eine kleine Beispieldatenbank für Windows und für Linux in einer zip-Datei angehängt. Ich arbeite hauptsächlich noch mit Windows (Windows 7), gelegentlich aber auch mit Linux (OpenSuse 12.1) und LibreOffice 3.4. Erfahrungen mit dem Makroprogrammieren habe ich nur ganz wenige durch Learning by Doing bzw. Trial & Error.

Könntet ihr mir bitte weiterhelfen? Wenn Fragen, bitte fragen!

Vielen Dank schon mal & viele Grüße!

obrigada2000
Dateianhänge
VersuchsDB_OoO.zip
(116.41 KiB) 177-mal heruntergeladen
Zuletzt geändert von obrigada2000 am Mo, 02.07.2012 22:07, insgesamt 2-mal geändert.
RobertG
********
Beiträge: 2069
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Textfeld automatisch füllen nach Eintrag in Listenfeld

Beitrag von RobertG »

Wozu brauchst Du ein Textfeld und ein Feld, in dem das Land ausgeschrieben ist?
Mir ist vielleicht die Struktur der Tabellen nicht klar, aber eigentlich müsste das Landeskürzel (ISO, so wie Du schreibst), doch eindeutig sein. Warum hast Du da noch ein Autowertfeld als Primärschlüssel? Da würde doch der ISO-Code völlig reichen. Warum speicherst Du Landescode und Land in der Tabelle Adresse ab? Da würde auch der Primärschlüssel der Tabelle "Länder" als Fremdschlüssel reichen.
In Deinem Listenfeld kannst Du das Land und den ISO-Code gleichzeitig abbilden. Bei Deiner Landestabelle ginge das so:

Code: Alles auswählen

SELECT "LänderCode"||' - '||"Land", "ID" FROM "Länder" ORDER BY "LänderCode"
Jetzt ist natürlich die Frage, was Du abspeichern willst bei so einem Feld. Üblicherweise ist das der Primärschlüssel. Bei mir würde daher das Feld "LänderCode" gar nicht auftauchen und der Ländercode den Namen ID haben, da ich das als Standard für den Primärschlüssel nutze. Und dieser Schlüsselbegriff gehört dann in die Tabelle "Adressdaten".

Noch etwas fällt mir auf: Du möchtest Bilder verwenden. Warum liest Du die nicht in die Datenbank ein, sondern machst mühsam - vermutlich wegen der Makros - zwei Datenbankversionen?

Gruß

Robert
obrigada2000
Beiträge: 8
Registriert: Mi, 27.06.2012 13:49

Re: Textfeld automatisch füllen nach Eintrag in Listenfeld

Beitrag von obrigada2000 »

Hallo Robert!

Erst einmal vielen Dank für deine Antwort.

Ich habe bemerkt, dass ich in meinem allerersten Beitrag überhaupt in diesem Forum viel zu viele Infos im Anhang mitgeliefert habe. Die Fotos sind in der zip-Datei, weil ich in den Beispieldatenbanken ein Makro gespeichert habe, welches die Fotos mit der Datenbank verknüpft. Meine Originaldatenbank hat bereits über 1000 Fotos. Um die Datenbank nicht größer zu machen, als sie sowieso schon ist, habe ich statt der Einbindung der Fotos diese per Makro mit dem Fotoordner verknüpft. Fotoordner und Makro sind für meine aktuelle Fragestellung aber überflüssig. Die zwei Versionen der Beispieldatenbank habe ich angehängt, weil ich mir dachte, dass der eine eher mit Linux arbeitet, der andere eher mit Windows, und derjenige, der sich mit meiner Fragestellung beschäftigen will, sich dann die Version aussuchen hätte können, mit der er eher arbeitet. Makros für die eine Version sind außerdem ja nicht unbedingt kompatibel mit der anderen Version.

Die Tabelle Adressdaten ist schon seit längerer Zeit so in Benutzung. Die Tabelle Länder habe ich neu dazugeschrieben. Natürlich weiß ich, dass damit die Spalten Land und LänderCode in beiden Tabellen auftauchen und einiges redundant ist.

Wenn ich Deine Fragen und Hinweise richtig verstanden habe, würdest du lieber Beziehungen zwischen den Tabellen Adressdaten und Länder herstellen als ein Makro einzusetzen. Das würde dann nach Deiner Schreibweise so aussehen:

Tabelle Länder:

ID (= ISO-Code der Länder & Primärschlüssel)
Land

Tabelle Adressdaten:

ID
Nachname
Vorname
Titel
:
Bundesstaat
LänderID (= Fremdschlüssel - in Beziehung zum Primärschlüssel der Tabelle Länder)
Telefon1
:

Das leuchtet mir ein, und eine Abfrage kann ich ja auch mit Daten aus drei Tabellen erstellen, um dann aus der Abfrage wiederum per Seriendruck eine Adressliste zu generieren.
Ich habe dazu noch mal die Datenbank angepasst und angehängt. (Vorsicht! Das Listenfeld Land ist noch im Formular vorhanden, aber z.Z. ohne Funktion.)

Wie kann ich das nun aber im Formular realisieren? Theoretisch bräuchte ich dann immer nur noch den ISO-Code des Landes einzugeben, richtig? Den kenne ich aber nicht immer, und meine Nachfolger, die die Datenbank später weiterführen müssen, sicher auch nicht. Da wäre es natürlich gut, so wie Du es angedeutet hast, im Listenfeld sowohl das Land als auch den ISO-Code darzustellen, wobei dann nur der ISO-Code in der Tabelle Adressdaten vermerkt wird.

Ich vermute, das wolltest Du mit dem angegebenen SQL-Code erreichen. Leider weiß ich damit (noch) nichts so recht anzufangen. Wo genau muss ich diesen Code eintragen, damit er im Formular zum Tragen kommt? Und wie muss er angepasst werden, damit er zu dem passt, was Du vorgeschlagen hast (siehe oben)?

Viele Grüße!

obrigada2000
Dateianhänge
VersuchsDB_OoO1.odb
(20.6 KiB) 148-mal heruntergeladen
RobertG
********
Beiträge: 2069
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Textfeld automatisch füllen nach Eintrag in Listenfeld

Beitrag von RobertG »

Ich hänge einmal die Datei mit überarbeitetem Listfeld an. Schau Dir einfach mit der rechten Maustaste die Eigenschaften des Listfeldes an. Da Deine Felder noch gruppiert sind musst Du dazu entweder die Gruppe betreten oder den Formularnavigator aufrufen.

Gruß

Robert
Dateianhänge
VersuchsDB_OoO1.odb
(20.54 KiB) 286-mal heruntergeladen
obrigada2000
Beiträge: 8
Registriert: Mi, 27.06.2012 13:49

Re: Textfeld automatisch füllen nach Eintrag in Listenfeld

Beitrag von obrigada2000 »

Hallo Robert!

Vielen Dank für deine Hilfe! Ich habe mir Deine Eintragungen ins Kontrollfeld des Listenfeldes angeschaut, ausprobiert und schließlich in meine Originaldatenbank übernommen. Es funktioniert, und ich habe bei der Gelegenheit gleich noch gelernt, dass ich für Länder, die neu in meine Datenbank dazukommen, das Listenfeld nicht (mehr) manuell anzupassen brauche. Ich muss eigentlich nur noch die betreffenden Länder samt ISO-Code in die Tabelle Länder eintragen, und dank des SQL-Befehls in meinem Formular wird dann automatisch auch das Listenfeld aktualisiert. Das reduziert die Fehlerwahrscheinlichkeit und meine Arbeit doch ganz schön. Prima! :)

Viele Grüße!

obrigada2000
Lain
*
Beiträge: 15
Registriert: Do, 12.07.2012 16:11

Textfeld automatisch füllen nach Eintrag in Liste..

Beitrag von Lain »

Hallo liebe Datenbankschruaber,
diese Auto-Fill - Funktion bereitet mir auch großes kopfzerbrechen.

Ich habe eine Tabelle (Angebot) die soll über ein Formular, über ein Listenfeld mit daten einer anderen Tabelle, gefüllt werden.
D.h. wenn ich im Angebots-Formular aus dem Listenfeld Firma (verbunden mit Tabelle Kunde) einen Firmennamen aussuche, sollen die Felder Kundennr. (Primärschlüssel), Ansprechpartner, Telefonnr. und Email automatisch aus der Tabelle Kunden gefüllt werden. Es ist wichtig das die Werte Firma und Ansprechpartner in der Tabelle Angebot hinterlegt werden.

Ich habe bis jetzt hinbekommen, das wenigstens die kundennummer angezeigt wird, aber nicht der ansprechspartner oder die kontaktdaten. Kann man mit listen- und kombinationsfeldern überhaubt mehr als nur ein Textfeld befüllen?
Dazu kommt das der im Listenfeld (Tabelle Kunde) ausgewählte Wert nicht in der Tabelle Angebot hinterlegt wird. geht das irgendwie?

wie kann ich das ganze geschickt lösen, ohne das ich in die Tiefere Programmierung muss, denn SQL ist für mich Absolutes neuland!

Bitte kann mir da jemand helfen??

Liebe grüße Lain
RobertG
********
Beiträge: 2069
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Textfeld automatisch füllen nach Eintrag in Liste..

Beitrag von RobertG »

Hallo Lain,
Lain hat geschrieben: Ich habe eine Tabelle (Angebot) die soll über ein Formular, über ein Listenfeld mit daten einer anderen Tabelle, gefüllt werden.
D.h. wenn ich im Angebots-Formular aus dem Listenfeld Firma (verbunden mit Tabelle Kunde) einen Firmennamen aussuche, sollen die Felder Kundennr. (Primärschlüssel), Ansprechpartner, Telefonnr. und Email automatisch aus der Tabelle Kunden gefüllt werden. Es ist wichtig das die Werte Firma und Ansprechpartner in der Tabelle Angebot hinterlegt werden.
Genau das würde ein Datenbänkler nie machen: Redundanz der Daten erzeugen und damit die Datenbank aufblähen. Hier wird nur mit den Schlüsselfeldern gearbeitet. Der Inhalt wird über Abfragen sichtbar. Musst Du für bestimmte Angebote den tatsächlichen Inhalt irgendwo unveränderlich deponieren, so kannst Du dies immer noch über das auszudruckende Dokument (z.B. als *.pdf-Datei).
Lain hat geschrieben: Ich habe bis jetzt hinbekommen, das wenigstens die kundennummer angezeigt wird, aber nicht der ansprechspartner oder die kontaktdaten. Kann man mit listen- und kombinationsfeldern überhaubt mehr als nur ein Textfeld befüllen?
Dazu kommt das der im Listenfeld (Tabelle Kunde) ausgewählte Wert nicht in der Tabelle Angebot hinterlegt wird. geht das irgendwie?
Du kannst mit einem Listenfeld nur einen Wert an die Tabelle weitergeben, die in dem Formular liegt. Der Wert, der in der Regel mit einem Listenfeld weitergegeben wird, ist der Fremdschlüssel einer anderen Tabelle.
Du kannst aber sehr wohl in einem Listenfeld sehr viele Inhalte darstellen, die eben mit diesem Fremdschlüssel verbunden sind. Ich versuche das einmal an einem einfachen Beispiel deutlich zu machen:
2 Tabellen,
Tabelle 1 "Kunde" mit den Feldern "ID"(Primärschlüssel), "Nachname" und "Vorname"
Tabelle 2 "Rechnung" mit den Feldern "ID", "kunID" und "Datum" (mehr braucht die Rechnungstabelle nicht, da die Rechnungsposten separat verwaltet werden ...)
Das Formular basiert jetzt auf der Tabelle Rechnung. Die "ID" ist die Rechnungsnummer, das Datum wird direkt eingegeben und die "kunID" enthält den Fremdschlüsseleintrag der Tabelle "Kunde". Diesen Eintrag hast Du natürlich nicht so im Kopf. Du brauchst stattdessen ein Listenfeld. Das Listenfeld hat die Eingabemöglichkeit für SQL-Code, die auch mit Hilfe von Assistenten gelöst werden kann. Hier jetzt einfach einmal ein Standardcode:
SELECT "Nachname", "ID" FROM "Kunde"
Du bekommst den Nachnamen angezeigt. An der zweiten Position steht "ID" - diese zweite Position wird an das darunterliegende Feld übertragen. Beachte: Datenbanken beginnen bei der Zählung mit 0. Das kann zu Verwirrung führen. Die Standardeinstellungen des Office-Paketes sind aber auf so eine Abfrage ausgelegt.
Nachteil 1: Die Nachnamen sind nicht sortiert.
SELECT "Nachname", "ID" FROM "Kunde" ORDER BY "Nachname" ASC
Wobei ASC für ascending, ansteigend steht.
Nachteil 2: Du hast Kunden mit gleichem Nachnamen und weist so nicht, welchen Du gerade ausgewählt hast.
SELECT "Nachname"||"Vorname", "ID" FROM "Kunde" ORDER BY "Nachname"||"Vorname" ASC
Jetzt werden Nachname und direkt folgend der Vorname angegeben. Du kannst unterscheiden, hättest aber lieber die beiden voneinander etwas getrennter dargestellt. "ID" ist nach dem Komma immer noch an zweiter Position.
SELECT "Nachname"||', '||"Vorname", "ID" FROM "Kunde" ORDER BY "Nachname"||"Vorname" ASC
Jetzt sind Nachname und Vorname durch ein Komma voneinander getrennt. Du liest also in dem Listenfeld z.B. "Müller, Egon" und gibst aber an die Tabelle die Nummer "1" weiter, weil Egon Müller den Primärschlüssel 1 in der Tabelle "Kunde" hat.
Wenn jetzt alle Stricke reißen und Du tatsächlich Leute mit gleichem Nachnamen und gleichem Vornamen hast, dann bleibt Dir nur noch so etwas wie die folgende Lösung:
SELECT "Nachname"||', '||"Vorname"||' - Kdnr:'||"ID", "ID" FROM "Kunde" ORDER BY "Nachname"||"Vorname" ASC
Jetzt wird Dir angezeigt: "Müller, Egon - Kdnr:1" Damit hast Du eine Unterscheidung in der Anzeige sicher und bekommst auch gleich angezeigt, welche Nummer an die Tabelle weitergegeben wird.
So ein Listenfeld kannst Du natürlich ausbauen. Wenn Du die Adresse des Kunden auch in der Tabelle "Kunde" gespeichert hast, so kannst Du einfach weiter mit "||" alle möglichen Felder hinzufügen. Das Listenfeld muss dann natürlich entsprechend breit gezogen werden, damit wirklich auch alles angezeigt wird.

Gruß

Robert
Antworten