[gelöst]Feldwerte statt ID in mehreren Spalten eines SubForm darstellen

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
pschulze59
Beiträge: 24
Registriert: Di 16. Okt 2018, 12:48

[gelöst]Feldwerte statt ID in mehreren Spalten eines SubForm darstellen

Beitrag von pschulze59 » Di 16. Okt 2018, 16:14

Hallo,
vorweg: Dies ist mein erstes Projekt in LO-Base - entsprechend sind meine Fragen. Der Titel des threads ist vielleicht nicht aussagefähig genug. Daher hier die Problematik ausführlicher:
Ausgangsthematik: Betreuer (Tabelle "RB") betreuen Teilnehmer (Tabelle "TN"). Teilnehmer sind an verschiedenen Standorten und können jeweils bis zu 9 Kurse besuchen/besucht haben. Die Kurse haben neben einer ID noch die Bezeichnung und eine Kurzbezeichnung (u.a.m.). Den Teilnehmern sind über die Betreuer-ID der Betreuer zugewiesen und jeweils über die Kurs-ID die Kurse, an denen er teilnimmt/teilgenommen hat.
Ziel ist es, bei den Betreuern in einem SubForm die zugewiesenen Teilnehmer zu sehen und die Kurse, die sie belegen/belegt haben. Dazu habe ich ein Abfrage an das SubForm gebunden.

Folgender IST-Stand ist erreicht: Im MainForm Betreuer ist das SubForm als Tabelle/Grid eingefügt und es zeigt brav alle dem Betreuer zugeordneten Teilnehmer an. In jeder Zeile zum Teilnehmer stehen auch die dem Teilnehmer zugeordneten Kurs-IDs (bis zu 9 Stück, also 9 Spalten).
SOLL-Stand soll sein, dass im Grid nicht die Kurs-ID angezeigt wird, sondern die Kurzbezeichnung des Kurses. Dazu habe ich die SQL-Anweisung zu meiner im SubForm eingebundenen Abfrage so geändert, dass die Feldabfrage SELECT sich auch auf die Kurs-Tabelle "MN" bezieht. Das funktioniert gut mit dem ersten Kurs - eine Erweiterung auf die weiteren 8 möglichen Kurse (ich habe das vorerst auf die ersten drei beschränkt) funktioniert auch. Dabei habe ich allerdings festgestellt, dass es nötig ist (?wirklich?), sich auf 'Kopien' der Tabelle "MN" zu beziehen ("MN_1" und "MN_2")
Allerdings werden dann die Teilnehmer ("TN"), welche nur einen oder zwei Kurse belegt haben nicht mehr angezeigt, wohl weil die WHERE-Bedingung mit AND verknüpft ist (siehe code-snipped).

Code: Alles auswählen

SELECT "TN"."ID" "ID", "TN"."MDID" "MDID", "TN"."M1ID" || '-' || "MN"."KBez" "M1ID", "TN"."M2ID" || '-' || "MN_1"."KBez" "M2ID", "TN"."M3ID" || '-' || "MN_2"."KBez" "M3ID", "TN"."M4ID" "M4ID", "TN"."M5ID" "M5ID", "TN"."M6ID" "M6ID", "TN"."M7ID" "M7ID", "TN"."M8ID" "M8ID", "TN"."M9ID" "M9ID", "TN"."RBID" "RBID", "TN"."KTID" "KTID", "TN"."geb" "geb", "TN"."Vorn" "Vorn", "TN"."Name" "Name" 
FROM "TN", "RB", "MN", "MN" "MN_1", "MN" "MN_2" 
WHERE "TN"."RBID" = "RB"."ID" AND "TN"."M1ID" = "MN"."ID" AND "TN"."M2ID" = "MN_1"."ID" AND "TN"."M3ID" = "MN_2"."ID"
(Für mein Beispiel und meine Tests beschränke ich mich auf die ersten drei Kurse. Umbrüche im Code zur besseren Lesbarkeit eingefügt.)

Also dachte ich, da gehört jeweils ein OR hin und Klammern. Aber irgendwie - egal was ich tue - es funktioniert mit OR auch nicht.
Es müssen natürlich IMMER alle Teilnehmer des Betreuers angezeigt werden, unabhängig davon, wie viel Kurse sie belegt haben.

Wo steckt mein logischer Fehler? Wie ist der richtige Ansatz?

Danke!
Peter
Zuletzt geändert von pschulze59 am So 28. Okt 2018, 10:11, insgesamt 1-mal geändert.



RobertG
Beiträge: 1734
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Feldwerte statt ID in mehreren Spalten eines SubForm darstellen

Beitrag von RobertG » So 21. Okt 2018, 18:20

Hallo Peter,

wenn die Teilnehmer mehrere Kurse belegen, dann gehören die Kurse eigentlich in ein Unterformular zu den Teilnehmern (Tabellenkontrollfeld). Du würdest also ein Hauptformular "Betreuer", ein Unterformular "Teilnehmer" und ein UnterUnterformular "Kurse" haben. Da brauchst Du dann keine Abfrage zu konstruieren, die irgendwie alle Kurse der Teilnehmer zusammen mit den Teilnehmern auflistet - sei es nun mit den Kursen in einer Datenzeile oder mit lauter Zeilen mit gleichem Teilnehmernamen.

Gruß

Robert

pschulze59
Beiträge: 24
Registriert: Di 16. Okt 2018, 12:48

Re: Feldwerte statt ID in mehreren Spalten eines SubForm darstellen

Beitrag von pschulze59 » So 28. Okt 2018, 09:47

Hallo Robert,
danke für die Hinweise. Aber die Kurse beinhalten bei mir nicht die Kursteilnehmer, weil das nicht das Ziel der DB ist. Es ist umgekehrt: die Teilnehmer speichern im Teilnehmer-Datensatz die ID ihrer Kurse. Sie sind mit ihrer Kurs-ID am Kursteilnehmer in 9 Feldern gespeichert, so dass die Teilnehmer maximal an 9 Kursen teilnehmen können. Das mag zwar jetzt komisch klingen, liegt aber daran, dass die DB keine typische "Teilnehmerverwaltung" werden soll, sondern eine Art CRM für die Betreuer der Teilnehmer wird. Ziel ist es, mit dem Grid im Subform am Betreuer die Teilnehmer, die der Betreuer betreut "auf einen Blick" zu listen und mit dem Teilnehmer dann die Felder mit seinen Kursen sichtbar sind. Daher sind keine Sub-Sub-Forms nötig/möglich.
Ziel ist allerdings, dass dabei nicht die Kurs-ID angezeigt wird, sondern die lesbarere KursKurzBezeichnung, die aus der Kurs-Tabelle entstammt.
Da ich Abfragen ohnehin brauche, binde ich diese als Quelle für das SubForm ein.

Nun zu dem Problem an sich: Ich habe es gelöst. Mein Fehler war, dass ich glaubte, dass jede Darstellung der KursKurzBezeichnung an jedem Feld (jeder Spalte im Grid) eine Zuordnung der Tabelle "Maßnahme" erfordert. Das ist aber falsch gewesen. Es entstand somit eine WHERE-Klausel in der durch AND alle 9 Felder verknüpft wurden. Somit wurden bei meinem Experiment (mit erst mal nur drei von neuen Feldern) nur Kurs-Teilnehmer gelistet die drei Kurse belegten, aber die die nur zwei oder einen Kurs hatten nicht.

Die Lösung: Nur das erste der neun Feldern wird in die WHERE-Klausel eingebunden - es muss ja mindestens ein Kurs belegt worden sein. Dann steht der Datensatzzeiger ja auf einem gültigen Teilnehmer, egal ob er mehr als einen Kurs belegt hat. Zur Anzeige der KursKurzBezeichnung genügt es nun, dass pro Feld eine entsprechende Definition in der SELECT-Klausel steht, in der angewiesen wird, die Kurzbezeichnung anstatt der ID anzuzeigen, indem die Kurzbezeichnung über die ID aus der Tabelle Maßnahme ausgelesen wird.
Das sieht jetzt so aus:

Code: Alles auswählen

SELECT "TN"."ID" "ID", "TN"."MDID" "MDID", "TN"."M1ID" || '-' || "MN"."KBez" "M1", "TN"."M2ID" || '-' || "MN"."KBez" "M2", "TN"."M3ID" || '-' || "MN"."KBez" "M3", "TN"."M4ID" || '-' || "MN"."KBez" "M4", "TN"."M5ID" || '-' || "MN"."KBez" "M5", "TN"."M6ID" || '-' || "MN"."KBez" "M6", "TN"."M7ID" || '-' || "MN"."KBez" "M7", "TN"."M8ID" || '-' || "MN"."KBez" "M8", "TN"."M9ID" || '-' || "MN"."KBez" "M9", "TN"."RBID" "RBID", "TN"."KTID" "KTID", "TN"."geb" "geb", "TN"."Vorn" "Vorn", "TN"."Name" "Name", "TN"."VnM" "VnM", "TN"."AStat" "AStat", "TN"."Bem" "Bem", "TN"."VNr" "VNr", "TN"."BZID" "BZID" FROM "TN", "RB", "MN" 
WHERE "TN"."RBID" = "RB"."ID" AND "TN"."M1ID" = "MN"."ID" 
ORDER BY "MDID" DESC
Damit werden im MainForm des Betreuers in dem SubForm alle Kursteilnehmer, für die der Betreuer verantwortlich ist, und ihre die Kurs-IDs mit der KursKurzBezeichnung je Kursteilnehmer dargestellt.



Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste