Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Filtern eines UF nach WertA ODER WertB

Begonnen von Domm, Oktober 16, 2017, 12:54:27

⏪ vorheriges - nächstes ⏩

Domm

Grad eben hat sich Ekkehard nochmal eingeschalten; deshalb schnell noch ein paar Zeilen.
Ich freue mich, wenn ich Eure Hilfe bekomme!
Aber ich muss kleine Brötchen backen!
Meine DB sind nicht zu verkaufen; wer meint, damit arbeiten zu wollen, muss auf Risiko setzen.
ich möchte nur eins: die spannenden Momente, die sich beim Erarbeiten von Problemlösungen ergeben, auskosten.
Die Accessbücher, welche ich habe, sind für manche Anwendungen durchaus hilfreich, aber ich bewege mich dann nach vorgegebenen Schema.
Wenn ich mich immer ein klitzekleines Stück weiterentwickle, dann wird mir auch der Spaß nicht verloren gehen.
Vielleicht vergleichbar mit einem Pianisten: Ich werde nie eine Bach- Etitüde spielen können, weil ich nicht 500 Stunden Fingerübungen gemacht habe, aber ich setzte mich immer gern ans Klavier, wenn ich etwas ausprobieren möchte.
So, jetzt hab ich Euch aber mal meine Meinung gesagt!!!
Euch noch viel Spaß mit mir! Domm
Gruß Domm

Beaker s.a.

Hallo,
Nun benötige ich hier mal die Hilfe der Profis. Als ich mich dransetzen
wollte den angesprochenen Fehler zu behandeln ist mir ausgefallen,
dass die Abfrage "qFreieSchueler" nicht die gewünschten DS liefert.
Ich habe sie jetzt so (die Union- und die gruppierte Abfrage aus der
ersten DB stecken da jetzt drin bzw. sind entfallen)
SELECT S.SchueID, S.Nachname, S.Vorname, AKS.AnzahlK
FROM (SELECT SK.SchueID, Count(SK.KursNr_F) AS AnzahlK
          FROM
                  (SELECT S.SchueID, KS.KursNr_F
                   FROM Schueler AS S
                   LEFT JOIN KursSchueler AS KS
                                 ON S.SchueID = KS.SchuelerNr_F
                   ORDER BY S.Nachname
                  ) AS SK
          GROUP BY SK.SchueID
          HAVING Count(SK.KursNr_F)<2
     ) AS AKS
INNER JOIN Schueler AS S
                ON AKS.SchueID = S.SchueID

Diese zeigt auch brav nur alle Schüler mit (k)einem Kurs an.
Allerdings auch beim ausgewählten Kurs  >:( Und ich komme nicht
drauf, wie ich diesen DS noch ausgefiltert bekomme (KursNr_F <>
Forms!KurseEintrag!KursID)
Mache ich es im inneren SELECT stimmt der Count nicht mehr, an
allen anderen Stellen, wo es Sinn machen könnte, bekomme ich eine
Parameterabfrage nach der Kursnr.
Kann mir da bitte jemand auf die Sprünge helfen?

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

@Ekkehard,

in welchem Upload wird denn die Abfrage verwendet?
Grüße von der (⌒▽⌒)

Domm

Gruß Domm

Beaker s.a.

Hallo,
@Lachtaube
Sorry, noch in keinem. Du kannst aber in der vorigen Version (02) die
Abfrage "qFreieSchueler" einfach durch diese ersetzen.
Die Abfrage dient im Formular "KurseEintrag" als RowSource des
Listfeldes (lstFreieSchueler) und für das Kombi im UFo.
Beispiel für das angesprochene Problem:
Wähle im Form den Kurs 1, dort ist der Schüler 27 eingetragen (s. UFo),
er steht aber auch auf der Liste, was nicht sein darf.
Bitte nicht wundern wegen sichtbarer ID-Felder. Das mache ich während
einer Entwicklung immer so, - ich blende sie dann erst am Ende aus.

@Domm
Für mich eine Lerneinheit SQL  ;)
Für dich, lese mit und lerne. Du könntest zum Beispiel mal den Begriff
"RowSource" in der OH suchen.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

Ekkehard, Du kannst eine Bedingung wieWHERE  S.SchueID NOT IN ( SELECT SchuelerNr_F
                          FROM   KursSchueler
                          WHERE  KursNr_F = [DerKursParameter] )
der Abfrage hinzufügen.
Grüße von der (⌒▽⌒)

Beaker s.a.

Hallo,
@Lachtaube
Plong! Bingo! Danke!
Manchmal dreht man sich im Kreis wenn man da länger vorsitzt.

@Domm
Schau dir das angehängte neue Beispiel nochmal an. Da kann man jetzt keine
falschen Zuordnungen mehr erfassen, weil sie entweder nicht ausgewählt werden
können oder abgelehnt werden.
Die versprochenen Erklärungen versuche ich heute Abend zu schreiben.
gruss ekkehard

edit:
Ach ja,
@Regulars
Wäre einer so nett und schaut sich die Indexierung der Tabelle "KursSchueler" an.
Ist das so richtig/vollständig/verbesserungswürdig?
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

Ich würde die Termine mit einem Kurs verbinden und ganz unorthodox, auf den Fremdschküssel + Termindatum den Primärschlüssel legen, um in der Anmeldung eine Eindeutigkeit einer Kursbelegung über Schüler-Id und Kurs-Id zu erreichen. Es reicht dann ein eindeutiger Mehrfachindex über Schüler-Id und Kurs-Id aus. Der Termin muss quasi nur als Sklave mitgezogen werden.

Wenn keine Zeitangaben zum Termin notwendig sind, könnte man den Termin auch noch platzsparender in einem Ganzzahlenfeld unterbringen.
Grüße von der (⌒▽⌒)

Beaker s.a.

Hallo,
@Lachtaube
Interessant!
Vor dem Hintergrund des dem TS angetragenen "Pfades der Tugend" und
um ihn nicht völlig zu verwirren, die Frage, - ist das besser?
Dann würde ich das noch umbauen.
Zitatden Termin auch noch platzsparender in einem Ganzzahlenfeld unterbringen
Auf die Idee bin ich noch nie gekommen, aber nicht schlecht. Frage
jedoch dazu, - wo stelle ich da am besten das Format (Datum) ein? In
der Tabelle, Abfrage oder Formular?

@Domm
Trotz der weitergehenden Diskussion zum Datenmodell, erkläre ich dir
jetzt, wie versprochen, ein bisschen was über die zuletzt gepostete DB.

Wie so ein Mehrfelder-Index aussieht, kannst im letzten Post von Lachtaube
sehen. Schau dir dieses auch in meiner DB an (Tabelle in der Entwurfsansicht
öffnen, Menü Entwurf -> Indizes), aber bitte nicht verändern!

Nun zu der wichtigen Abfrage "qFreieSchueler". Diese ist für einen Anfänger
schon recht "heftig". Langfristig wirst du dich aber mit SQL intensiv
auseinandersetzen müssen.
Dies ist eine geschachtelte Abfrage. Die innerste
(SELECT S.SchueID, KS.KursNr_F ... ) AS SK
liefert erstmal alle Schüler/Kurse. Der LEFT JOIN sorgt dafür, dass
auch Schüler ohne einen Kurs angezeigt werden. Die nächst höhere
Abfrage
(SELECT SK.SchueID, Count(SK.KursNr_F) AS AnzahlK ... ) AS AKS
zählt dann die Anzahl der Kurse pro Schüler, und filtert alle mit 2
Kursen aus.
In der Hauptabfrage
SELECT S.SchueID, S.Nachname, S.Vorname, AKS.AnzahlK ...
wird dann noch die Tabelle "Schueler" verküpft ... INNER JOIN Schueler AS S ON AKS.SchueID = S.SchueID ... um die Namen anzeigen zu können (und die Anzahl ihrer Kurse).
In der WHERE-Klausel werden dann noch mit einer weiteren
Unterabfrage (Dank an Lachtaube) die Schüler des im Formular
"KurseEintrag" ausgewählten Kurses "weggefiltert".

Weiter mit eben diesem Formular. Das habe ich aus deinem
ursprünglichen Form gleichen Namens weiter entwickelt.
Die DS-Herkunft ist weiterhin die Tabelle "Kurse".
Statt des Endlosformats ist es jetzt ein Einzelformular mit einem
Listfeld ("lstKurse") aller DS. Die Auswahl eines Kurses erfolgt
über einen Klick auf die Liste.
Dieser Klick löst (neben anderen) das Ereignis "Nach Aktualisierung"
(in VBA ButtonName_AfterUpdate) aus. Dort wird mit Hilfe der
Hilfsfunktion "Bookmarken" im Formular auf den DS mit dem ausgewählten
Kurs positioniert. Anschliessend wird die Liste der freien Schueler
("lstFreieSchueler"), entsprechend oben erklärter Abfrage (ist DS-Herkunft
der Liste), aktualisiert.

Die Eigenschaft Mehrfachauswahl dieser Liste ist auf erweitert eingestellt
(Eigenschaftenblatt -> Andere), - kannst also beliebig viele Schüler markieren.
Die Termine habe ich nun auch in eine Liste gepackt, - ist ja Platz genug.

Der Button löst dann ("Beim Klicken") das Schreiben der DS in die Tabelle
"KurseSchueler" aus. Diese Funktionalität (und das entfernen) habe ich in
eine öffentliche (Public) Functions (s.Modul "Global") ausgelagert, damit
man sie an unterschiedlichen Stellen (Formularen) verwenden kann.

Die Anzeige der im Kurs schon eingetragenen Schüler habe ich mit Absicht
als UFo angelegt. Damit kann man dann zusätzlich einzelne Schüler eintragen
und, einzige Möglichkeit hier, löschen (austragen).
Könnte auch mit einem Listfeld machen. Wie das geht kannst du dir im Prinzip
im Formular "ZuordnungSchuelerKurse" ansehen. Obwohl, das habe ich seit
der ersten Version nicht mehr angefasst, weshalb es da jetzt ein Problem mit
der Abfrage "qFreieSchueler" gibt; - Formularbezug.  >:(
Das muss eine Parameterabfrage werden (erklär' ich dir wenn's fertig ist).

Weitere Fragen stelle bitte gezielt auf einzelne Objekte/Codeteile.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Domm

Hallo, Ihr Unermüdlichen. Sorry, dass ich so lange still war; manchmal gibts auch im Job stressige Momente.
Was ich sehr hilfreich finde- die Erläuterung der einzelnen Segmente. Wenn man versucht, sich selbst durch die Materie zu wühlen, geht einem irgendwann die Puste aus und dann ist auch die Lust am Knobeln weg.
Die von Ekkehard eingestellte DB, in der lediglich auf die Zuordnung Schüler - Kurs eingegangen wird, hab ich als Basis für den weiteren Aufbau genommen. Und mich mit den Fallstricken der Bedingungen beschäftigt.
Seitdem hats ja einen regelrechten Hype um die unverdorbensten Modelle gegeben. Um nochmal einen Rückblick auf den Ursprung der (wow, jetzt schon dreiseitigen) Debatte zu wagen: Bei einer Größenordnung dieses durchaus popeligen Ausmaßes (100 Schüler, 15 Kurse) kann man sicher schon mal vom Pfad der Tugend abweichen, wenn damit das Ergebnis auch erreicht wird. (aua, jetzt gibts Haue).
Aber es kommt noch schlimmer: Dem Lehrer hatte ich verklickert, dass man die einzelnen Elemente seiner Daten in die verschiedenen Tabellen aufbrechen muss. Was hat er gemacht? Die bestehende, nach Excel überführte Tabelle mit den Daten "Schüler X belegt KursA und KursB" mühsam aufgedröselt. Nachdem alles in Access sauber reinsortiert ist, muss er den (eigentlich fertigen Zustand) wieder händisch herstellen. Das hat er auf sich genommen, um meine (aus dem Grundsatz sauberer DB- Modelle gestellten) Forderungen nicht zu hinterfragen. Als er dann mein Ergebnis gesehen hat (ja- genau das, was hier den allgemeinen Aufschrei verursacht hat), kam die Frage, ob man nicht auch die Kurse gleich in die Spalten mit rein- importieren könne. Da würde er sich viel Arbeit sparen...
Wie auch immer; manchmal kämpft man um Prinzipien, die keiner haben will.
Für meinen Lehrer hab ich jetzt eine kleine DB gebastelt, in der die Import- Tabelle die Felder "Schueler" (ja, das mit den Umlauten hatte ich vorher auch nicht gewusst), KursA und KursB sowie ein Ja/Nein- Feld (StandardWert 0; dann muss er nicht jede Zeile eintragen, sondern braucht nur korrigieren), in dem optional der KursA den 1. oder 2. Termin bekommt. Im Form wird der Wert für KursB errechnet. Um die Kurse sauber filtern zu können, hab ich alles in eine Union- Abfrage gepackt und für die Berichtsausgabe schön gruppiert.
Der Mann ist also glücklich!
Was jetzt kommt, ist mein Wunsch nach Verständnis für Eure Vorschläge. Auch wenns a weng länger dauert, hoffe ich doch, den Lösungsansatz zu verstehen und selbst darauf ein Gerüst bauen zu können.
RowSource- das Thema für meinen heutigen Vormittag (wenn die Kids mir meine Ruhe lassen)
Nächste Woche sind Ferien, da wirds im Haus etwas ruhiger. Da knie ich mich so richtig rein, vielleicht kommen dann all die Fragen, auf die Ihr jetzt schon gewartet habt.
Ich wünsche Euch zwei schöne WE- Tage und zwei schöne Feiertage! Domm
Gruß Domm

Beaker s.a.

Hallo Domm,
ZitatDie von Ekkehard eingestellte DB, in der lediglich auf die Zuordnung Schüler - Kurs eingegangen
Um mehr ging es am Anfang auch nicht. Und von Im- und/oder Export war bisher
gar keine Rede, und hat auch erstmal nicht direkt was mit der Zuordnung zu tun.
Mein weiteres Vorgehen wäre die Formulare
"SchuelerEintrag" (mit Listen)/Ufo belegte Kurse mit Termin) und
"TermineEintrag" (mit Liste(n)/UFo Kurse/Schueler),
also in gleicher/ähnlicher Weise aufzubauen, wie das gezeigte Form "KurseEintrag".
ZitatBei einer Größenordnung dieses durchaus popeligen Ausmaßes (100 Schüler, 15 Kurse) kann man sicher schon mal vom Pfad der Tugend abweichen, wenn damit das Ergebnis auch erreicht wird. (aua, jetzt gibts Haue).
Ja, gibt es  ;). Die Größenordnung spielt erst bei wirklicher Grösse (mehrere 100k DS)
eine Rolle, da ist ein korrektes Datenmodell essentiell. Warum also bei "kleinen"
Modelle davon abweichen? Wo es da für einen Anfänger auch noch viel einfacher ist
das zu erlernen/verstehen und dann zu erstellen. Du bist da ja auch noch nicht am Ende.
Da fehlt ja noch eine Tabelle "Lehrkraefte" und die entsprechende Zuordung zu den Kursen,
- bestenfalls.
Zitatob man nicht auch die Kurse gleich in die Spalten mit rein- importieren könne. Da würde er sich viel Arbeit sparen...
In welche Spalten?
Natürlich kann man mit einer Kreuztabelle auch die beiden Kurse nebeneinander darstellen.
Zu Im-/Export hat der eine oder andere Regular sicher einen Link zum Einlesen.
Zitatin dem optional der KursA den 1. oder 2. Termin bekommt.
Sorry, das hatte ich als Aussenstehender wohl falsch verstanden. Das ist aber (mehr
oder weniger) schon gegeben. Der Termin für einen Kurs wird mit Zuordnung des
1. Schülers festgelegt. Das ist aber leider keine gute Lösung, wie ich beim Schreiben
gerade feststelle  >:(. Da muss dann doch eine Zuordung Kurs>Termin angelegt werden.
Werde ich am WE drüber nachdenken.
Zitathab ich alles in eine Union- Abfrage gepackt und für die Berichtsausgabe schön gruppiert.
Im korrekten DM ist diese UNION unnötig, da geht es (s.o.) mit einer Kreuztabelle.
ZitatIm Form wird der Wert für KursB errechnet
Das könnte man auf dem Schüler-Formular machen.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Domm

#41
Hallo Ekkehard, danke für Deine Post!
Ob ich jetzt Zitate richtig einfügen kann, wird sich zeigen, wenn ich meinen Beitrag poste...
Deine Antwort:
ZitatUm mehr ging es am Anfang auch nicht. Und von Im- und/oder Export war bisher
gar keine Rede, und hat auch erstmal nicht direkt was mit der Zuordnung zu tun.
Mein weiteres Vorgehen wäre die Formulare
"SchuelerEintrag" (mit Listen)/Ufo belegte Kurse mit Termin) und
"TermineEintrag" (mit Liste(n)/UFo Kurse/Schueler),
also in gleicher/ähnlicher Weise aufzubauen, wie das gezeigte Form "KurseEintrag".

beschreibt eigentlich das, was ich sagen wollte. Also diese Vorlage als Modell für das weitere Problem Termine.

Dein Text:
ZitatDa fehlt ja noch eine Tabelle "Lehrkraefte" und die entsprechende Zuordung zu den Kursen...

ist nunmero eher hypothetischer Natur. Der Datensatz in Excel fasst Vor- und Zuname der Schüler zusammen; genau so Bezeichn. des Kurses und sein Prüfer [Aksonov Polina] / [1eth1 (Sdl)] / [1b2   (Spö)]

Dein Text:
ZitatIn welche Spalten?

Na, genau in die, welche Anlass unserer Diskussionen sind: [Schueler];[KursA];[KursB]

Dein Text:
ZitatDer Termin für einen Kurs wird mit Zuordnung des 1. Schülers festgelegt.

Die dem Lehrer übergebene DB gibt beim Import der 3 Spalten als Standardwert eine 0 im Feld ZuordnTermin aus.
Damit ist festgelegt, dass KursA grundsätzlich den ersten Termin bekommt. Als Option bleibt dann der berechnete 2. Termin für KursB. Deshalb muss der Wert nicht in der Tab gespeichert werden.
Natürlich wird diese Einteilung korrigiert werden müssen, aber der Lehrer muss jetzt nur noch die DS "angreifen" die einen Wechsel notwendig machen. Also nochmal viel Arbeit gespart...

Dein Text:
ZitatIm korrekten DM ist diese UNION unnötig, da geht es (s.o.) mit einer Kreuztabelle.

Da ich mich zu der unkorrekten DB bekannt habe, ist klar, dass es dann halt eine Union braucht, um die Kurse in eine Spalte zu bekommen. Ich wollte eigentlich damit nicht Eure Bemühungen torpedieren, sondern einfach auf die völlig veränderten Ausgangsdaten hinweisen. Ich werde dem Lehrer nicht unter dem Argument sauberer DB- Strukturen zur Mehrfacheingabe vorliegender Daten verurteilen. Vielleicht kann man diese Excelliste auch so zerpflücken, dass die Inhalte (also die Zuordnung der Schüler zu ihren Kursen) in einer daraufhin aufgebauten DB in Einzelteile zerlegt und automatisch wieder zusammenführt. Nix für mich- das schaffe ich nie und das geht auch über das Maß meines Interesses hinaus.
Deshalb hab ich den Lehrer jetzt glücklich gemacht und konzentriere mich hier auf den Knoten, den wir zu entwirren unser Besteben ist.
Vielen Dank fürs Durchhalten!
Domm
Gruß Domm

Domm

Oh Mist, mit dem Einfügen der Zitate hats nun doch nicht gefunzt :-\
Gruß Domm

MzKlMu

#43
Hallo,
ich habe Dir die Zitate eingefügt.

ZitatIch werde dem Lehrer nicht unter dem Argument sauberer DB- Strukturen zur Mehrfacheingabe vorliegender Daten verurteilen.
Wenn eine DB sauber aufgebaut ist, nach den Regeln, wird es keine Mehrfacheingaben geben. Wenn doch ist das Datenmodell falsch.
Es ist ja gerade der Sinn einer Datenbanknormalisierung Mehrfacheingaben und somit Redundanzen zu vermeiden.
Gruß Klaus

Beaker s.a.

Hallo Domm,
Da so langsam nicht mehr durchblicke was da nun wie und in welcher
Reihenfolge zugeordnet werden soll, und du ja eh mit deinem DM
weitermachen willst, klinke ich mich hier jetzt aus.
Zitatauf die völlig veränderten Ausgangsdaten hinweisen
Warum lässt du mich da rumbasteln ohne das schon längst erwähnt zu haben?  >:(
ZitatIch werde dem Lehrer nicht unter dem Argument sauberer DB- Strukturen zur Mehrfacheingabe vorliegender Daten verurteilen.
Gerade das leistet doch ein sauberes DM.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)