🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.

🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Was muss in eine Abfrage?

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Freischreiber
* LO-Experte *
Beiträge: 829
Registriert: Fr 28. Mär 2014, 10:41

Was muss in eine Abfrage?

Beitrag von Freischreiber » Di 15. Apr 2014, 19:49

Hallo,

nachdem ich eine ziemlich große Adressdatenbank nach Base umgezogen habe, möchte ich jetzt sinnvolle Abfragen erstellen und habe dazu - sicher primitive - Verständnisfragen:

- Ist es richtig, dass alle Feldinhalte von Tabellen, die man über eine Abfrage (oder ein darauf basierendes Formular) ändern will, in der Abfrage mit enthalten sein müssen? (Wenn ich bei einer Adresse später die Anrede ändern will, muss die AnredeID mit in die Abfrage?)

- Offenbar müssen alle Primärschlüssel aller beteiligten Tabellen mit in die Abfrage, wenn Datensätze editiert oder neue hinzugefügt werden können sollen. Frage: Gibt es eine Möglichkeit, die Abfrage trotzdem übersichtlich zu halten, etwa die ID-Felder der angehängten Tabellen auszublenden? Ich kenne nur das Häkchen bei "Sichtbar" im Abfrageentwurf, aber wenn ich das deaktiviere, verschwindet das ganze Feld aus der Abfrage...

Vielen Dank!
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Was muss in eine Abfrage?

Beitrag von RobertG » Di 15. Apr 2014, 21:11

Hallo Freischreiber,

ich bin gerade dabei, das Handbuch zu überarbeiten. Da nimmt allein das Unterkapitel "Eingabemöglichkeit in Abfragen" jetzt 3 Seiten ein.
Kurz gesagt: Die Primärschlüssel aller betroffenen Tabellen müssen mit rein.
Alle anderen Felder, die bearbeitet werden sollen, müssen mit rein.
In einer Abfrage kannst Du nur eine Tabelle korrekt bearbeiten. Du kannst auch Werte in anderen Tabellen ändern. Hast Du aber eine Beziehung 1:n zwischen den Tabellen, so änderst Du damit auch Werte, die sich auf andere Tabellen beziehen können.
In einer Abfrage mit mehreren Tabellen kannst Du die Fremdschlüssel, d.h. die Verbindungsglieder von Tabelle zu Tabelle, nicht bearbeiten.
Du kannst im Abfragemodul zwar Spalten ausblenden (Abfrage ausführen, auf den Spaltenkopf gehen, rechte Maustaste → ausblenden). Diese Spalten erscheinen aber beim nächsten Öffnen der Abfrage wieder. Es werden in Base nur die Einstellung von Feldern aus Tabellen gespeichert, nicht aber aus Abfragen. Du könntest also besagtes Feld in grafischen Ansicht der Tabelle ausblenden. Dann siehst Du es auch nicht mehr in der Abfrage.

Zu Deinem speziellen Anliegen "Anrede": Das ist genau das Problem, was mit zwei Tabellen gemeint ist:

Code: Alles auswählen

SELECT "Adresse".*, "Anrede".*  FROM "Adresse", "Anrede" WHERE "Anrede"."ID" = "Adresse"."Anrede_ID"
ist bearbeitbar. Die Anrede lässt sich aber nicht ändern, da die ID von Anrede Fremdschlüssel in der Tabelle Adresse ist.
Ich würde die Tabelle "Anrede" nicht mit einbeziehen.

Code: Alles auswählen

SELECT "a".*, (SELECT "Anrede" FROM "Anrede" WHERE "ID" = "a"."Anrede_ID") AS "Anrede"  FROM "Adresse" AS "a"
wäre die Möglichkeit, die Anrede ausgeschrieben anzeigen zu lassen und trotzdem den Fremdschlüssel ändern zu lassen. Damit bearbeitest Du dann nicht die Tabelle "Anrede" sondern die Tabelle "Adresse".

Vielleicht zeigst Du einmal Deine Tabellenstruktur, damit klar wird, um wie viele Felder es sich handelt, die wie verbunden sind. Eine Adressdatenbank müsste in der Normalform mit den Feldern auskommen, die eben in einem Adresskopf eines Briefes stehen - und das sind eigentlich nicht gerade besonders viele notwendige Felder geschweige denn mehrere Tabellen ...

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
* LO-Experte *
Beiträge: 829
Registriert: Fr 28. Mär 2014, 10:41

Re: Was muss in eine Abfrage?

Beitrag von Freischreiber » Mi 16. Apr 2014, 09:04

Hallo Robert,

vielen Dank für die ausführliche Antwort.

Sehr gerne, die angehängte entkernte Datenbank zeigt mein Problem. Es ist alles in Einzeltabellen aufgeteilt und zwei Dinge wären schön:

1. Ein Formular, das auf einen Blick alles zeigt (und bearbeiten läßt), was ich über den Kunden habe (alle Kontakte, vollständige Adresse, Anrede, Titel, Status (Kunde oder anderer)). Später kommen noch Aufträge dazu, die zum jeweiligen Kunden zugeordnet werden sollen.

2. Ein Button, der die selektierte Adresse vom Formular aus an Writer übergibt im Format Anrede Vorname Nachname Straße PLZ Ort "per Fax:" Fax

Wegen 2. und dem existierenden Makro http://www.libreoffice-forum.de/viewtop ... =10#p27487
habe ich versucht, eine vollständige Abfrage hinzukriegen und wollte das Formular auf der Abfrage aufbauen. Aber z. B. mit Anreden und vor allem Kontakten ist es nicht so einfach. Manche Kunden haben nur eine Telefonnummer, andere zwei, manche Fax, manche nicht.

Viele Grüße
Freischreiber
Dateianhänge
Musterdatenbank.zip
(6.57 KiB) 290-mal heruntergeladen
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

Freischreiber
* LO-Experte *
Beiträge: 829
Registriert: Fr 28. Mär 2014, 10:41

Re: Was muss in eine Abfrage?

Beitrag von Freischreiber » Mi 16. Apr 2014, 12:19

Hallo Robert,

wow, es klappt... mit der verschachtelten Abfrage entsteht eine Tabelle mit letzter Spalte "Anrede", die wechselt, wenn man in der selben Zeile vorne die AnredenID ändert :-)

Die SQL-Abfrage für mein Beispiel ist:

Code: Alles auswählen

SELECT "a".*, ( SELECT "Anrede" FROM "t-anreden" WHERE "ID" = "a"."AnredenID" ) AS "Anrede" FROM "t-adressen" AS "a"
und ich verstehe davon leider kein Wort. Nur damit du eine Vorstellung von meinem Niveau bekommst: Ich konnte deinen Code nicht direkt umbauen, sondern habe mich über die Bearbeiten-Ansicht in Base herangetastet.

Offenbar ist "a" ein beliebiger Platzhalter, oder? Was mich irritiert ist, daß das "a" vorne schon zum Selektieren benutzt werden kann, wo es doch hinten bei AS "a"... erst definiert wird?

Ich weiß... Handbuch...

Gruß
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Was muss in eine Abfrage?

Beitrag von RobertG » Mi 16. Apr 2014, 15:56

Hallo Freischreiber,

das mit den korrelierenden Unterabfragen habe ich auch erst in einem der Foren irgendwann mit bekommen. In MySQL war so etwas nicht möglich.

Das "a" setzt einen Alias für die entsprechende Tabelle. Alle sich auf diese Tabelle beziehenden Felder müssen jetzt mit dem "a". versehen werden.
Durch das Setzen des Alias ist es jetzt möglich, direkt auf Werte des aktuellen Datensatzes mit einer Unterabfrage zuzugreifen. Die Unterabfrage sucht jetzt die "Anrede" raus, die direkt zu dem aktuellen Datensatz aus "t-adressen" passt. Wird der Fremdschlüssel geändert, so wird automatisch die Unterabfrage angepasst. Schließlich steht in der aktuellen Zeile jetzt ein anderer Wert.

Solche Abfragen laufen dann zur Hochform auf, wenn z.B. der Verlauf eines Kontos abhängig von bestimmten Kategorien dargestellt werden soll. Du kannst in einem Schritt den laufenden Kontostand mit dokumentieren, indem die Unterabfrage sich z.B. auf alle Werte bis zum aktuellen Datum beziehen. Dies kannst Du auch noch abhängig davon machen, um welche Kontonummer usw. es sich handelt. Ich habe damit ein komplettes keines Ladensystem für die Schule zusammengebastelt - mit Berechnung des Warenbestandes aus Einkauf und Verkauf und Berechnung des momentanen Kontostandes des Ladens.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
* LO-Experte *
Beiträge: 829
Registriert: Fr 28. Mär 2014, 10:41

Re: Was muss in eine Abfrage?

Beitrag von Freischreiber » Mi 16. Apr 2014, 17:52

Hallo Robert,

also man liest tatsächlich von hinten?
AS "a" gibt der ganzen Tabelle den Alias "a".

Dann wird mit
SELECT "a".*
als erstes die gesamte Tabelle dargestellt, dann als Zusatzspalte das Ergebnis der Unterabfrage unter dem Alias "Anrede", wobei das Komma die Trennung zwischen Tabelle und Anredenspalte darstellt?

Und daß der Alias sich auf "t-adressen" beziehen soll und auf keine andere Tabelle, kommt von dem
FROM "t-adressen"? Für meinen Geschmack: bizarr.

Und jetzt Preisfrage: Was mache ich, wenn ich die Titel aus t-titel auch noch drin haben möchte? Kann ich denselben Alias weiterverwenden? So?

Code: Alles auswählen

SELECT "a".*, ( SELECT "Anrede" FROM "t-anreden" WHERE "ID" = "a"."AnredenID" ) AS "Anrede", 
( SELECT "Titel" FROM "t-titel" WHERE "ID" = "a"."TitelID" ) AS "Titel"
 FROM "t-adressen" AS "a"
Ja krass, tatsächlich :D

Gruß
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Was muss in eine Abfrage?

Beitrag von RobertG » Mi 16. Apr 2014, 19:46

Hallo Freischreiber,

bizarr ist das vielleicht, wenn Du das so siehst wie manche SchülerInnen Textaufgaben. Die ersten beiden Zahlen sind erschienen, wir sind gerade bei der Multiplikation im Unterricht, also multiplizieren wir die einfach - wir schon richtig sein. Ob dann der Kapitän später 1785 Jahre alt ist interessiert uns nicht ...

Weniger bizarr wird das, wenn Du Dir einfach einmal die Befehle in Umgangssprache übersetzt:

Code: Alles auswählen

SELECT "a".* FROM "Adresse" AS "a"
Wähle aus der Tabelle "Adresse", die ich im Folgenden "a" nenne, alle Datensätze mit allen Feldern aus.
Es wird zuerst beschrieben, was ausgewählt werden soll. Danach kommt, woher das genommen werden soll. Dann wird womöglich noch der Pott, aus dem das kommen soll, begrenzt (WHERE) und auch noch vorsortiert. Von der Handlungsanweisung gehörte also "a".* ganz nach hinten - das ist schließlich das Ergebnis der danach folgenden Anweisungen.
Bei anderen SQL-Befehlen wird das zumindest zum Teil beherzigt:

Code: Alles auswählen

INSERT INTO "Tabelle" ("Vorname","Nachname") VALUES ('Eva','Müller');
Zuerst die Tabelle, dann die Benennung der Felder und zum Schluss das, was da rein kommt. Das geht aber bei dem Einfügen von Datensätzen auch nur deshalb, weil keine Bedingung mit formuliert werden muss. Das sind schließlich neue Datensätze.

Code: Alles auswählen

UPDATE "Tabellenname" SET "Preis" = "Preis"*0.9 WHERE "Preis" >= 150
Wenn Datensätze geändert werden sollen, so kann sich das ohne weiteres auf mehrere Datensätze beziehen. Es muss also der oder die Datensätze beschrieben werden, die geändert werden. Hier wird hinten wieder eine Bedingung angefügt.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
* LO-Experte *
Beiträge: 829
Registriert: Fr 28. Mär 2014, 10:41

Zum Verzweifeln

Beitrag von Freischreiber » Do 17. Apr 2014, 08:27

Hallo Robert,

okay, dann ist der "Dialekt" wohl so bei SQL, in Ansätzen habe ich es verstanden.

Meine Begeisterung ist aber schon wieder verflogen: Was mache ich jetzt mit der editierbaren Abfrage in Richtung auf mein Formular?
Anrede und Titel kann ich so anzeigen lassen als Textfeld. Editieren auch?

Und noch schwieriger: Was mache ich mit Rufnummern/Mail? Einerseits will ich alle anzeigen und editieren können, die zu einer Adresse gehören (Listenfeld?), andererseits einen Knopf, der dieses Makro
http://www.libreoffice-forum.de/viewtop ... =10#p27487
ausführt und Adresse mit Faxnummer oder Mailadresse übergibt (was mit dem Makro aber nur aus TEXTfeldern geht).

Meine Hoffnung war, alles in eine Abfrage zu bringen und die Abfrage nur im Formular anzeigen zu müssen, und das Makro nur dieses Formular auswerten lassen zu müssen...

Gruß

Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

Freischreiber
* LO-Experte *
Beiträge: 829
Registriert: Fr 28. Mär 2014, 10:41

Re: Was muss in eine Abfrage?

Beitrag von Freischreiber » Do 17. Apr 2014, 08:57

Hallo Robert,

lass es mich mal anders versuchen: Die Musterdatenbank habe ich ja nun hochgeladen.

Ich weiß nicht, ob du die Zeit und Bereitschaft dazu hast (und ob es ins Konzept dieses Forums passt), so ein Formular mit Makro komplett zu entwerfen, aber ich glaube, das wäre der einzige Weg, ein Ergebnis zu erhalten, mit dem man in absehbarer Zeit arbeiten kann.

Wenn ich selbst daran bastle, erkenne ich nach Lösung eines Problems, welche Frage ich als nächste stellen muß. Danach taucht aber wieder eine auf und irgendwann merke ich, daß der ganze Weg nicht weiterführt oder unpraktisch ist. Ich versuche seit Wochen, diese Aufgabe zu lösen und komme nicht weiter. Ich persönlich denke bei jedem neuen Problem an die unschöne Alternative: zurück zur Tabellenkalkulation.

Vermutlich würde so eine konkrete Musterlösung auch vielen anderen helfen. Eigentlich müßte jeder, der Adressen verwalten und Briefe schreiben will, diese Probleme haben. Ganz ehrlich: im Prinzip sollte so eine lauffähige Musterdatenbank komplett mit Abfragen, Formularen und Makros als Beispiel jeder Libreoffice-Distribution beiliegen, damit Laien mit Base überhaupt arbeiten können. (Als Laie hätte man dann eine reelle Chance: Warum geht es, warum geht es nach meiner Anpassung nicht? Wie kann ich es so anpassen, daß es immer noch geht?)

Was hältst du davon?

Gruß
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Was muss in eine Abfrage?

Beitrag von RobertG » Do 17. Apr 2014, 12:16

Hallo Freischreiber,

dem Handbuch liegen mehrere Musterdatenbanken bei. Die große Datenbank zum Thema Medien ist für viele aber wohl so komplex, dass sie von der Vielfalt einfach erschlagen werden. Das gilt besonders für die Version, die mit Makros arbeitet.
Aus dem Grund habe ich viele Detaillösungen als Beispiel gebaut.
Für die Version 4.3 habe ich z.B. die Serienbrief-Datenbank um eine Version ergänzt, die mit den Textfeldern arbeitet. Da wären wir dann ganz schnell wieder bei Deinem eigentlichen Thema. Das Textfeld-Makro liest den Inhalt aus der Datenquelle des Formulars aus. Wenn Du also als Grundlage für das Formular eine Abfrage zusammenstellst werden die Felder nach dem Namen ausgelesen, den sie in der Abfrage haben. So habe ich z.B. in meinem Adressformular ein Listenfeld, das ursprünglich mit dem Feld "Geschlecht" der zugrunde liegenden Tabelle zusammen hing. Das zeigt mir "männlich" und "weiblich" an, schreibt aber "m" und "w" in die Tabelle. Durch das Textfeldmakro wird jetzt "m" bzw. "w" ausgelesen.
Jetzt habe ich das Ganze mit einer Abfrage zusammengebaut:

Code: Alles auswählen

SELECT "ID", "Vorname", "Nachname", "Geschlecht" AS "Geschl_kurz", "Straße_Nr", "Postleitzahl", "Ort", CASEWHEN( "Geschlecht" = 'm', 'Herrn', 'Frau' ) AS "Geschlecht" FROM "Anschrift"
Die Abfrage ist editierbar. Ich musste nur den Bezug des Listenfeldes in meinem Formular auf "Geschl_kurz" ändern. Durch die Funktion CASEWHEN() wird aus 'm' die Formulierung 'Herrn', aus allen anderen 'Frau'. Diesem Feld habe ich den Namen "Geschlecht" zugeordnet.
Das Textfeldmakro liest jetzt statt 'm' 'Herrn' - eben den Wert, der in der Abfrage unter "Geschlecht" steht.
Ich hänge einmal die Beispieldatenbank an.

Eine Adressdatenbank kann natürlich entsprechend in einer Abfrage zusammengefasst werden. Nur wenn Du Zusammenhänge zwischen Tabellen hast, die mehrere Datensätze der Haupttabelle zuordnen (ich sehe bei Dir die Tabelle t-kontakte als so einen Kandidaten), dann kriegst Du das in einem Textfeldmakro alleine nicht mehr unter. Schließlich hat die Person mehrere Kontakte. Da hilft Dir vielleicht die Version in dem unten angehängten Paket, die zusätzlich zu den Textfeldern mit einer Tabelle arbeitet, in der dann die Werte des Unterformulars abgespeichert werden.

Zusätzliche Fragen zu der Beispieldatenbank:
Hat eine Person tatsächlich mehrere Bankverbindungen in der Datenbank verzeichnet?
Gibt es zu einer Adresse mehrere Bemerkungen?
Reicht nicht bei t-kontakte AdressID und KontakartID als gemeinsamer Primärschlüssel statt eines Schlüssel ID?

Gruß

Robert
Dateianhänge
Serienbrief.zip
Serienbrief auf verschiedene Art und Weise per Makro erstellen
(79.51 KiB) 270-mal heruntergeladen
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten