Liebe Mitglieder, das Thema ist schon hundertmal beantwortet worden, aber ich habs bisher weder begriffen noch umsetzen können:
Wenn ich die Werte eines UF nach dem Wert eines HF filtern muss, geht das komfortabel über die "verknüpfen nach...von" Funktion.
Im vorliegenden Fall soll jedoch das UF [UF1] gefiltert werden:
Zeige alle DS, bei denen der Wert in Feld [KursANr] ODER der Wert in Feld [KursBNr]mit dem (durch Klick gewählten) Wert der Liste [KursID] im HF [frmZurodnKurse] übereinstimmt.
Meine Versuche, die angebotenen Lösungen auf meine DB zu kopieren und anzupassen, sind bisher allesamt gescheitert.
Falls nach dem (vielleicht berechtigten) Aufstöhnen jemand die dafür notwendige Prozedur nochmal veröffentlichen würde, wäre ich sehr dankbar.
Gruß, Domm
Hallo,
solche Aktionen sind fast immer ein Hinweis auf ein falsches Datenmodell.
Möglicherweise kannst Du das noch ändern.
Zeige mal ein Bild des Beziehungsfensters.
Danke vorab für Deine Zeit!
Aufgabe:
var. Anzahl von Schülern belegt (grundsätzlich) zwei Kurse, welche grundsätzlich an zwei verschiedenen Terminen stattfinden müssen. Deshalb hab ich die Daten Schüler und Kurs nicht in eine neue Tab übergeben, weil die Bedingung "Jeder Kurs an an einem anderen Termin" in einem DS besser zu händeln ist. Deshalb folgender Aufbau:
tabTermine
tabKurse
tabSchüler mit Feld [Schüler],[KursA](Kombifeld mit Inhalt tabKurse),[KursB](Inhalt dito) sowie zugehörige Kombifelder [TerminA] und [TerminB].
Es ist durchaus möglich, die Struktur etwas verworren ist, aber so fällt es ziemlich leicht, zu verhindern, dass im DS "Schüler" gleiche Werte in [KursA] u [KursB] sowie gleiche Werte in [TerminA] u [TerminB]} stehen.
Im Mom ist die Zuordnung der zwei Kurse zu den Schülern abgeschlossen. Um die Terminfestlegung übersichtlich zu gestalten, möchte ich die Daten nach Kurs filtern. Also sollen alle Schüler angezeigt werden, die den im HF markierten Kurs in A ODER B belegen. Danach wird die Terminvergabe der einzelnen Schüler festgelegt.
Ist diese Darlegung hilfreich?
Ein Kurs hat weder etwas in einer Schülertabelle noch ein Schüler etwas in einer Kurstabelle verloren. Es sollte eine Belegungstabelle für Kurse geben, in der u.a. SchuelerId und KursId als Fremdschlüsselfeld vertreten sind und die über einen eindeutigen Mehrfachindex eine Doppelbelegung eines Kurses verhindert.
Hallo,
womit meine Nase, dass das Datenmodell nicht optimal ist wieder bestätigt wurde.
Folge dem Vorschlag von Nouba und stelle das Vorhaben auf eine gesunde Basis. Vieleicht werden aus den 2 Kursen mal 3 Kurse (sag bei einer Datenbank niemals nie) und dann ?
Dankeschön an Euch beide!
Ich fürchte, diese Plattform ist für so substantielle Problemlösungen nicht geeignet. :-[. Dafür gibt es Lehrgänge und Fortbildungen.
Leider kenne ich niemanden in meinem Umfeld, der sich mit access beschäftigt; darüber hinaus bin ich als Quereinsteiger nicht mal mit grundsätzlichen Herangehensweisen vertraut. Ich beschäftige mich mit access, weil ich es spannend finde, gestellte Aufgaben zu lösen.
Wenn Ihr trotz Allem meint, dass mein Problem hierher gehört, gebe ich gern die Eckdaten wieder:
1. Colloquiumsprüfungen gibt es ca. 15 verschiedene, aber! pro Prüfling grundsätzlich zwei (auch in Zukunft).
2. Es gibt grundsätzlich zwei Termine (jeweils der Wochenbeginn der zwei Colloquiumswochen).
3. Für jeden Prüfling gilt, dass seine Prüfungen nicht in der gleichen Woche stattfinden dürfen.
Für die DB sieht das so aus:
tabSchüler (ca. 100 DS)
tabKurs (ca. 15 DS)
tab Termin (immer genau 2 DS)
tab ZuordnungKurs: [SchülerID];[KursID];[TerminID] (nach Zuordnung ca. 200 DS)
Aufgabe:
1. Verhindere, dass bei der Eingabe pro Schüler zweimal der gleiche Kurs vergeben wird.
2. Verhindere, dass bei der Eingabe pro Schüler der gleiche Termin vergeben wird.
3. Komfortable Eingabebedingungen: Wähle aus Listenfeld [Kurse] im HF einen bestimmten Kurs und trage aus der [tabSchüler] die Kursteilnehmer (per Klick) aus.
4. Filtere die Kursteilnehmer durch Klick im Listenfeld [Kurse] und weise den Teilnehmern einen der beiden Termine zu. Der Termin des anderen Kurses sollte durch Autofill eingetragen werden.
5. Im Bericht sollten nebeneinander die Termine A und B mit der Gruppierung der dazugehörigen Kurse dargestellt werden.
Das sind die Gründe, warum ich mich für diese Tabellenstruktur entschieden habe: Ich kann (mit einfachen Mitteln) verhindern, dass in [KursA] und [KursB] die gleiche KursID steht. Ich kann dem [TerminB] automatisch den verbleibenden Termin zuweisen, wenn ich [TerminA] einen der beiden Termine vergebe.
War jetzt viel Text für Euch. Und wenn ich die empfohlene Struktur übernehme, sehe ich mich außerstande, die o.g. Bedingungen zu erfüllen...
Gruß Domm
Ach ja, ich wollte die bestehenden Beziehungen in WORD als Anhang verschicken, aber das geht leider nicht. Muss ich wohl die DB als Ganzes anhängen?
Hallo,
erstelle ein Screenshot des Beziehungsfensters und lade das Bild direkt hier hoch. Ein Umweg über Word ist völlig überflüssig.
Oh Mann, nicht mal das bekomme ich hin!
Habe das Beziehungsfenster mit Alt + Druck in der Zwischenablage, aber hier in das Eingabefenster lässt es sich nicht einfügen... :-\
Hallo,
Du musst unten "Anhänge und andere Optionen" wählen.
Nein!
Geht nicht.
Weder als Snapshot noch als WORD noch als EXCEL
Witzigerweise schick ich mal das Tabellenfragment der DB. Keine prozeduren oder Makros enthalten.
Danke für Eure Geduld!
Hallo,
der Aufbau dürfte ziemlich daneben sein.
Der Schüler hat doch keinen Termin, der Kurs hat einen Termin.
Ich baue Dir das nachher mal um.
Anbei mal einen Vorschlag.
So, jetzt bin ich zu Hause und kann mich Deinem Vorschlag widmen.
Für mich war von Anfang an klar, dass der Aufbau bei der Lösungsfindung das Schwierigste wird.
Los gehts:
Der Lehrer bekommt eine Datei, in der die Zuordnung der Kurse zu den Schülern festgelegt ist und soll diese auf zwei Wochen verteilen.
Kurs A
Schü 2
Schü 7
Schü 13
Schü 31
Kurs B
Schü 5
Schü 18
Schü 51
Kurs C
...
Da der Import aus dieser nicht näher benannten Datei so nicht möglich ist, importiert er die Schülerliste nach Excel, von wo sie in die DB exportiert wird.
Die Kurse und Kursleiter werden händisch eingegeben und sind bis auf Korrekturen auch in den nachfolgenden Jahren so verwendbar.
Da die Zuordnung Schüler-Kurs fix ist, besteht die Aufgabe darin, die Zuordnung nach der Vorlage zu realisieren.
Also genau so:
Markiere Kurs 1
Durch Auswahl der betreffenden Schüler soll die Zuordnung per VBA erfolgen:
dlcl auf Schü 2
dlcl auf Schü 7
...
Wenn jeder Schüler mit zwei (verschiedenen) Kursen verknüpft ist, beginnt die eigentliche Aufgabe des Lehrers:
Weise jedem Schüler zwei Termine zu. Dabei werden zwangsläufig auch Kurse gesplittet. (also nicht die Termine sind mit den Kursen verbunden, sondern die Schüler; die Termine sind frei wählbar)
Ziel ist es:
1. Zu verhindern, dass ein Schüler zwei Kurse in einer Woche belegt. Heißt also, in jeder Woche sind genau einmal alle Schüler vertreten.
2. Dass die Kursgrößen ausgewogen sind; also nicht Kurse mit einem Prüfling oder Kurse mit einem deutlichen Mehranteil in einer Woche entstehen.
3. Eine Übersicht zu schaffen, in der ersichtlich ist, wie die einzelnen Kurse aufgeteilt sind. Dabei gibt es sehr große Kurse, die der Lehrer bei seiner Terminauswahl voranstellt, da die kleinen Kurse als Lückenfüller besser funktionieren.
Er wird also so lange die Schüler mit ihren Kursen zwischen den beiden Terminen hin- und herschieben, bis es passt.
Das gestaltet sich natürlich in EXCEl sehr unübersichtlich.
Im Ergebnis soll es (als Bericht) eine Übersicht geben, in der beide Wochen gegenüber gestellt sind, die möglichst homogen verteilt sind- ohne Rücksicht auf die einzelne Person!
Diese Geschichte wird mit der von Dir vorgeschlagenen Tabellenstruktur nicht funktionieren.
Leider ist mir klar, dass ich den Nerv der Mitglieder arg strapaziere, aber mein ursprünglicher Wunsch war ja eigentlich recht klein: Filtere alle DS, bei denen FeldA ODER FeldB mit einer ID des HF übereinstimmt...
Ich wünsche allen anwesenden Usern einen ruhigen Abend! Domm
Hallo,
wenn die Termine wirklich unabhängig von den Kursen sind, dann siehe Bild.
Einen zusammengesetzten eindeutigen Index verhindert schon mal Doppelungen.
Der Rest ist nur Programmierung, so wie Du diese jetzt auch hast. Gefiltert nach KursA oder B wird dann nur in einer Spalte, nämlich in der Fremdschlüsselspalte zum Kurs.
Ich bin überzeugt, mit der Umstrukturierung wird das ganze Vorhaben einfacher.
Es ist fantastisch, wie Du Dich in die Materie reinkniest! Vielen Dank!
Die Lösung, welche Du vorschlägst, führt zu folgendem Ergebnis:
DS X: Schüler4 Kurs7 Termin: offen
DS Y: Schüler 4 Kurs 11 Termin: offen
Es wird meine Kenntnisse übersteigen, mit der Festlegung des Termin1 im DS X automatisch den Alternativ- Termin im DS Y zu vergeben.
Eine DB mit dieser unabhängigen Tabelle war mein erster Versuch; aber die automatische Zuordnung des verbleibenden Termins hat mich zum jetzigen Lösungsansatz geführt.
Vermutlich werde ich brauchbare VBA- Prozeduren für die Lösung der (ohne Zweifel korrekteren Struktur) von Euch Profis bekommen; aber das Ziel für mich ist eine mit meinem Wissensstand erarbeitete (und damit auch für mich nachvollziehbare) DB. Und da gehen die Probleme schon bei der Zuordnung der Kurse los: Die Isolierung der SchüId zur Vermeidung von doppelten Einträgen. Eine entsprechende Prozedur habe ich zwar übernommen, aber ich verstehe sie nicht:
Option Compare Database
Option Explicit 'nur angelegte Variablen zulässig
Private Sub btn_suchen_Click()
On Error GoTo FKTErr
DoCmd.SetWarnings (False)
Me.Schüler_frei.Requery 'Feld Schüler_frei aktualisieren
Me.Schüler_gebucht.Requery 'Feld Schüler_gebucht aktualisieren
FKTExit:
Exit Sub
FKTErr:
MsgBox Me.Name & "_btn_suchen_Click: " & Err.Description
Resume FKTExit
End Sub
Private Sub Form_Load()
On Error GoTo FKTErr
DoCmd.SetWarnings (False)
Global_Long_Kurs = 0 '0 in Variable Global_Long_Kurs setzen
Global_Long_Schüler = 0 '0 in Variable Global_Long_Schüler setzen
Me.Schüler_frei.Requery 'Feld Schüler_frei aktualisieren
Me.Schüler_gebucht.Requery 'Feld Schüler_gebucht aktualisieren
Me.Kurs_aktuell.Caption = "kein ausgewählter Kurs" 'Titel setzen
FKTExit:
Exit Sub
FKTErr:
MsgBox Me.Name & "_Form_Load: " & Err.Description
Resume FKTExit
End Sub
Private Sub Kurse_DblClick(Cancel As Integer)
On Error GoTo FKTErr
DoCmd.SetWarnings (False)
Global_Long_Kurs = Me.Kurse 'Kursnummer in Variable schreiben
Me.Kurs_aktuell.Caption = "aktuell ausgewählter Kurs: " & DLookup("[KursName]", "[Kurse]", "[KursID]=" & Global_Long_Kurs)
Me.Kursleiter_aktuell.Caption = DLookup("[KursLeiter]", "[Kurse]", "[KursID]=" & Global_Long_Kurs)
'Kurstitel aus Tabelle holen und anschreiben
Me.Schüler_frei.Requery 'Feld Schüler_frei aktualisieren
Me.Schüler_gebucht.Requery 'Feld Schüler_gebucht aktualisieren
If Me.Schüler_frei.Enabled = False Then 'Wenn Feld Schüler_frei nicht aktiv dann aktivieren
Me.Schüler_frei.Enabled = True 'Feld Schüler_frei aktivieren
Me.Schüler_gebucht.Enabled = True 'Feld Schüler_gebucht aktivieren
Me.Suchfeld.Enabled = True 'Feld Suchfeld aktivieren
Me.btn_suchen.Enabled = True 'Button suchen aktivieren
End If
FKTExit:
Exit Sub
FKTErr:
MsgBox Me.Name & "_Kurse_DblClick: " & Err.Description
Resume FKTExit
End Sub
Private Sub Schüler_frei_DblClick(Cancel As Integer)
On Error GoTo FKTErr
DoCmd.SetWarnings (False)
Global_Long_Schüler = Me.Schüler_frei 'Schülernummer in Variable schreiben
DoCmd.OpenQuery "KurseSchüler_FO_neuDS" 'neuen Datensatz anlegen
Global_Long_Schüler = 0 'Schülernummer zurücksetzen
Me.Schüler_frei = Null 'Feld Schüler_frei auf Null setzen
Me.Schüler_frei.Requery 'Feld Schüler_frei aktualisieren
Me.Schüler_gebucht.Requery 'Feld Schüler_gebucht aktualisieren
FKTExit:
Exit Sub
FKTErr:
MsgBox Me.Name & "_Schüler_frei_DblClick: " & Err.Description
Resume FKTExit
End Sub
Private Sub Schüler_gebucht_DblClick(Cancel As Integer)
On Error GoTo FKTErr
DoCmd.SetWarnings (False)
Global_Long_Schüler = Me.Schüler_gebucht 'Schülernummer in Variable schreiben
DoCmd.OpenQuery "KurseSchüler_FO_löschenDS" 'neuen Datensatz anlegen
Global_Long_Schüler = 0 'Schülernummer zurücksetzen
Me.Schüler_frei.Requery 'Feld Schüler_frei aktualisieren
Me.Schüler_gebucht = Null 'Feld Schüler_gebucht auf Null setzen
Me.Schüler_gebucht.Requery 'Feld Schüler_gebucht aktualisieren
FKTExit:
Exit Sub
FKTErr:
MsgBox Me.Name & "_Schüler_gebucht_DblClick: " & Err.Description
Resume FKTExit
End Sub
Das geht weit über meinenHorizont; eine If Not IsNull (KursA) Anweisung kann ich gerade noch schreiben- auch wenn die Umsetzung ziemlich dilletantisch ist.
Eine Gute Nacht. Domm
Hallo,
ich komme mit Deinen Erläuterungen nicht klar. Der gezeigte Code hilft da nicht, da wühle ich mich jetzt nicht durch.
PS:
Bitte benutze für Codedarstellungen die Codetags des Forums.
Hallo Klaus, der Code ist ein Beispiel dafür, wie kompliziert die Dinge gestaltet werden können. Ich kann ihn nämlich auch nicht lesen; ein Grund dafür, warum ich bei dem Tabellenaufbau andere Wege gegangen bin. Wenn der Schreiner mit dem cosinus nicht die Länge eines Brettes ermitteln kann, muss er halt den Zollstock nehmen.
Wenn die DB nach Deinem vorgeschlagenen Beziehungsfenster aufgebaut wird, erzeuge ich pro Schüler zwei DS (da zwei Kurse). Wie kann bei der Zuordnung der Kurse festgestellt werden, ob dieser Schüler schon einen Kurs belegt und ob dieser sich von dem Neueintrag unterscheidet? Oder ob ich ihm irrtümlich drei Kurse zuordne? Wie kann automatisch der Alternativtermin in den zweiten DS geschrieben werden, wenn ich für einen Schüler- Kurs- DS einen Termin auswähle. Wie realisiere ich einen Austausch via Optionsgrupppe?
So krumm mein Entwurf auch erscheinen mag, so stellen sich da die Fragen nicht.
Da es offenbar nur zwei Möglichkeiten für den Aufbau der DB gibt, würde ich die wählen, deren Ergebnis mit leichtem Werkzeug erreicht werden kann. Zumal der Einsatz von Dropdownfeldern in einer Tab auch nicht unüblich scheint.
Unter den gegebenen Umständen sieht es aus, als müsste ich nach Tabellenaufbau und Beziehungen gleich wieder zu Euch rennen, um die oben genannten Hürden zu meistern. Das wäre bestimmt ein Zugewinn meines Kenntnisstandes, aber ob es der Community gut tut?
Ich bedanke mich für Dein Interesse und die Zeit, die Du für mich geopfert hast. Doch es sieht so aus, als brauche ich Einzelunterricht...
Gruß Domm
Hallo Domm,
ZitatDoch es sieht so aus, als brauche ich Einzelunterricht...
Kauf ein Buch.
Zum Problem. Anbei eine DB mit der Struktur, wie von Klaus vorgeschlagen.
Wenn du die mit ein paar Dummydaten wieder hochlädst würde ich versuchen dir
damit auf die Sprünge zu helfen.
@Klaus
In der Zwischentabelle habe ich einen Mehrfelder-Index auf die drei FK-Felder gelegt, -
ist das sinnvoll?
Also danke für Eure Mühe!!!
Auch wenn ich kein bissl weiter bin.
Die vorgeschlagene Auslagerung in eine weitere Tabelle ist mir durchaus geläufig.
Aber die Probleme, welche sich damit ergeben, haben dazu geführt, mich NICHT dafür zu entscheiden.
Ich weiß zB. nicht, wie sich die DS finden sollen, welche als gemeinsames Kriterium eine gleiche SchülerID haben.
Wie sollen dazu gehörigen Felder [Termin] mit dem Alternativtermin gefüllt werden?
Das ist nicht meine Liga, auch wenn Ihr noch so um ein neues DB- Modell kämpft.
Im Übrigen: Es war so pipi- einfach: Einfach in der Abfrage des UF als Kriterium die ID der [ListeKurse] nehmen, und bing- Daten gefiltert. Da brauchts nicht mal VBA!
Jetzt hab ich 100 DS, die eine eindeutige Zuordnung des Schülers, seiner Kurse und Termine zeigen. Auch wenns nicht üblich ist.
Vielleicht freut sich jetzt jemand, der auf meiner Entwicklungsstufe steht und etwas ähnliches sucht.
Ich hoffe bloß, dass Ihr jetzt nicht meint, dem ist nicht zu helfen. Aber ehrlich, hättet Ihr echt Lust, mich über die nächsten Seiten auf diesem steinigen Weg zu begleiten?
Falls ja, schmeiß ich jetzt die (nahezu) fertige DB weg!
Hallo,
ZitatIch weiß zB. nicht, wie sich die DS finden sollen, welche als gemeinsames Kriterium eine gleiche SchülerID haben.
Das wäre aber einfach. Eine Abfrage mit der gewünschten SchülerID als Kriterium und fertig.
ZitatWie kann bei der Zuordnung der Kurse festgestellt werden, ob dieser Schüler schon einen Kurs belegt und ob dieser sich von dem Neueintrag unterscheidet?
Auf die 3 Felder ein eindeutiger Mehrfeldindex (bereits mehrfach erwähnt, siehe auch Antwort von ekkehard) und es ist völlig ausgeschlossen Kurse zu einem Termin mehrfach einem Schüler zuzuweisen. Ohne irgendetwas programmieren zu müssen.
ZitatOder ob ich ihm irrtümlich drei Kurse zuordne?
lässt sich auf Formularebene zuverlässig verhindern, indem das Formular ab dem 2.Datensatz für weitere Datensätze gesperrt wird.
Ab Access2010 mit geht das Datenmakros bereits auf Tabellenebene.
Ich bin nach wie vor überzeugt, mit einer vollständig normalisierten Struktur würde das ganze Vorhaben um ein vielfaches einfacher werden.
Aber, ich will Dir ja nur die Möglichkeiten zeigen, wie man es anders/besser machen könnte.
Das Problem ist ja auch, dass man sich in die Materie einarbeiten müsste, um letztendlich alle Deine Vorgaben wie gewünscht zu erfüllen.
Und da fehlt mir einfach die Zeit und die Geduld dazu.
Wenn Du mit der jetzigen DB zufrieden bist, ist es ja gut.
Also- ganz ehrlich: Vielen Dank nochmal an alle, die sich mit mir und dem Problem beschäftigt haben!
So als kleines Schmankerl hab ich jetzt nochmal die überarbeitet DB reingestellt, so wie Ihr sie die ganze Zeit propagiert habt.
Vielleicht helft Ihr mir ein wenig auf den Weg:
Ordne jedem Schüler die Kurse zu, die er laut Vorgabe belegt.
Um es klar zu stellen: Die Eingabe der Kurse über Dropdown- Feld wäre viel zu aufwändig, weil der Lehrer dann bei jedem Schüler die gesamten Listen durchforsten muss, in welchem Kurs der Schüler jeweils auftaucht.
Also deshalb die Herangehensweise:
Markiere Kurs
Wähle aus der tabSchüler die (alphabetisch geordneten) Prüflinge aus. Idealerweise werden die Schüler aus der Liste ausgeblendet, wenn sie für diesen Kurs schon eingetragen sind.
Dafür hab ich ein form vorbereitet, welches die Arbeitsweise verdeutlichen soll
Wer will?
(Nein, keine Sorge- ich bin nicht der Meinung, dass sich die Welt um mich dreht...)
Hallo Domm,
Zitatdie überarbeitet DB reingestellt, so wie Ihr sie die ganze Zeit propagiert habt.
Na ja; - keine Beziehungen, Mehrfelder-Index fehlt, wieder Umlaute in Objektbezeichnungen.
Ich schraube dir mal was zusammen. Kann aber bis zum WE dauern.
gruss ekkehard
Hallo Ekkehardt, ich bedanke mich schon im Voraus, da ich mich eigentlich schon mit dem Rauswurf, zumindest aber mit der Igno abgefunden hatte.
Du hats natürlich recht: Die im Anhang gelegene DB hat nichts, was man zum Arbeiten braucht, außer die Daten und eine Vorstellung, wie der Arbeitsbereich des Anwenders aussehen könnte. Auch auf Namenskonventionen hab ich hier verzichtet, da für mich primär ist, den für die Aufgabe notwendigen DB- Aufbau zu begreifen. Und da fühle ich mich unter Euch ganz schön grün.
Vielleicht noch soviel: ich bin Hausmeister an einem Gymnasium und muss das alles gar nicht wissen. Aber als der Lehrer mit dem Problem kam, fand ich, dass das augenscheinlich Einfache ganz schlecht in Strukturen passt. Und das ist ja das Spannende!
Es nützt z. B. dem Lehrer nichts, wenn er die DS Schüler einzeln filtern kann und dann Termine vergibt. Da wird er nie fertig.
Ziel ist es, gefiltert nach Kursen die Teilnehmerstärke darzustellen und mit einfachem Werkzeug umzubauen.
Hast Du Lust, Dir mal die angefangene DB mit den obskuren Eigenheiten anzusehen? Das Ergebnis hat den Lehrer echt getaugt; schließlich sieht er ja nicht das Gegurke im Hintergrund.
Übrigens: Die DB wird leer als Vorlage abgelegt und nach erfolgter Einteilung als Jahrgang gespeichert. Es wird also immer um 100 DS; bei Verknüpfungstabelle um 200 DS gehen.
Schon mal liebe Grüße, Domm
Hallo Domm,
Da für mich gestern schon heute war ;) habe ich es doch schon her geschafft (s. Anlage).
Was ich gemacht habe:
1. Umlaute aus Objektbezeichnungen entfernt
2. Datenmodell wie gezeigt angepasst
3. zwei Abfragen zur Ermittlung der Anzahl belegter Kurse (*)
4. das Form "KurseEintrag" geändert
- Form auf "EinzelFormular" umgestellt, Listbox zur Auswahl erstellt
- UFo "ufoSchueImKurs" erstellt und eingefügt
- Liste (mit erweiterter Mehrfachauswahl) mit freien Schülern erstellt
- Kombi zur Terminauswahl erstellt
- Button zum Eintragen der ausgewählten Schüler erstellt
Damit hast du zwei Möglichkeiten Schüler einem Kurs zuzuordnen:
I. mit den Kombos im UFo einzeln
II. mit der Liste mehrere Schüler gleichzeitig
5. das Form "ZuordnungSchuelerKurse" entsprechend deinen Vorgaben
angepasst. Macht aber im Prinzip das gleiche wie "KurseEintrag" nur
statt UFo hat es hier eine zweite Listbox.
6. ins Modul "Global" habe ich dir zwei Hilfsfunktionen gepackt, die man
immer gebrauchen kann.
Alles andere habe ich nicht angefasst.
gruss ekkehard
(*) @Regulars
Geht das auch einfacher? Ich habe es nicht hinbekommen die Schüler mit
0 Kursen da anders hinein zu bekommen.
Ekkehard, Du bist der Wahnsinn!
Wenn ich nur darüber nachdenke, wie viel Hirnschmalz Du in das Projekt gesteckt hast, frag ich mich, was ich DIR dafür Gutes tun kann.
Natürlich steige ich noch nicht durch; versuche gerad das Modul aufzufitzeln. Es ist mir aber vermutlich nicht möglich, Deine Gedankengänge so aufzulösen, dass es mir möglich wäre, das Konstrukt nachzubauen.
Und das ist mein Problem.
Ich könnte hier in der Region einen Lehrer brauchen, zu dem ich rennen kann, wenns mal wieder so hakt wie in diesem Fall. Das kann man nicht aus Büchern rauslesen und wie schwer ich mich mit Profis tue, zeigt ja schon dieser Thread.
Wenn ich mich die nächsten Tage in Schweigen hülle, heißt das nicht, dass für mich das Thema erledigt wäre. Im Gegenteil. Ich hoffe, die einzelnen Elemente soweit auflösen zu können, um zu verstehen, was da passiert.
Ich hatte Dir ja angedroht, das DB- Modell anzuhängen, welches der Auslöser für den durchaus recht lebhaften Disput war. Das mach ich jetzt auch.
Falls Du Dir das antust: Vielleicht bleibst Du erstmal auf der Benutzeroberfläche, um zu sehen, wie der Lehrer sich die Eingabe vorgestellt hat. Und wenn du dir das große Grausen ersparen willst, dann lass die Entwurfsansicht einfach geschlossen.
Im diesem Sinne allen Begleitern dieses Themas und vor Allem Dir ein schönes WE und mir viele neue Einsichten.
LG Domm
Hallo Domm,
Zunächst noch eine Anmerkung zu meinem letzten Post. Da sind mir ein
paar Zeilen verloren gegangen. Ich habe in den List-und Kombifeldern die
ID-Spalte mit Absicht sichtbar gelassen. Da verstehst du vielleicht die
Zusammenhänge der Tabellen besser. Später musst du diese Spalten auf
Spaltenbreite 0cm einstellen. Wichtig vor allem beim Kombi im UFo, damit
du dort die Namen der Schüler siehst.
Zitatwas ich DIR dafür Gutes tun kann.
Das ist schon o.k. so. Ich betrachte das als Übung für mich.
ZitatIch könnte hier in der Region einen Lehrer brauchen, zu dem ich rennen kann, wenns mal wieder so hakt wie in diesem Fall.
Hast du doch mit dem Forum.
ZitatIch hoffe, die einzelnen Elemente soweit auflösen zu können, um zu verstehen, was da passiert.
Kannst ja spezifiziert nachfragen.
Mit deiner letzten DB werde ich mich nicht mehr beschäftigen. Wozu auch,
das Datenmodell stimmt nicht, und die von mir erstellte DB macht IMO alles
was du bisher gefordert hast.
gruss ekkehard
Hallo Ekkehard, es hilft nix- ich steige nicht durch. :(
Jetzt bleibt nur meine Bitte, mich Grundlagenlatein zu lehren. Wenn ich mich so durch die Themen wühle, fällt mir auf, dass ich kaum einen dieser Inhalte begreife oder zu meinen Bedürfnissen umbauen könnte. Aber- es gibt schlichtweg keine Plattform, auf der die Newbis mit verständlichen Lösungsvorschlägen weiter kommen. Ich habe oft den Eindruck, als wenn Fragende meiner Liga nicht auf die Unzulänglichkeiten ihrer Entwürfe hingewiesen werden wollen, sondern (doch bitte einfach nur) eine begreifbare Antwort suchen. Das hat zugegebenermaßen auch mich frustriert. Aber vielleicht kommen wir in kleinen Etappen zu der Lösung, die ich durch schizofrenöse Datenbankverbiegungen auch irgendwie hinbekommen habe.
Am Besten, wir fangen mal ganz klein an.
Im Anhang eine DB mit Verknüpfungstabelle und ein paar Beispieldaten. Ziel ist es, mit einem Code von ein, zwei Zeilen Duplikate zu verhindern und die Anzahl von schülerbezogenen DS zu begrenzen.
Dieses Muster ließe sich dann auch auf die Termine übertragen.
Hast Du Lust, zum Leidwesen Deiner eigenen Projekte einen Basic- Kurs zu moderieren?
Falls nicht, bleibt mir die Lösung ein unaufklärbares Mysterium.
Falls ja, herzlichen Dank im Voraus für Dein Engagement!!! :-*
LG Domm
Hallo,
anbei mal ein mögliche Umsetzung. Beide Wünsche von Dir sind realisiert.
Warum hast Du das mit dem mehrfach erwähnten zusammengesetzten eindeutigen Index nicht versucht ? Das hast Du ohne Rückfrage einfach ignoriert.
Du hattest auch keine Beziehungen angelegt, die unerlässlich sind und direkt nach dem Erstellen der Tabellen angelegt werden sollten.
ZitatIch habe oft den Eindruck, als wenn Fragende meiner Liga nicht auf die Unzulänglichkeiten ihrer Entwürfe hingewiesen werden wollen, sondern (doch bitte einfach nur) eine begreifbare Antwort suchen.
Du musst eines bedenken, bei einer nicht nach den Regeln aufgebauter Datenbank gibt es oftmals keine einfache Lösung. Ist eine Datenbank nicht richtig aufgebaut muss mit viel Aufwand nach Lösungen gesucht werden. Und oft ist es auch so, dass die die sich mit Access auskennen keine Lösung für eine falsch aufgebaute DB anbieten können, bzw. die selbst mit Aufwand suchen müssen. Daher wird bei so gut wie jeder suboptimal aufgebauten Datenbank erst mal versucht den Fragesteller auf den Pfad der Tugend zu führen, weil das im Regelfall die einfachste Lösung wird.
PS:
Die angehängte DB ist jetzt eine MDB weil ich auf meinem Laptop nur Access2003 habe.
Aber in der ACCDB wird das exakt genau so gemacht.
Hallo,
@Klaus
Solche Prüfungen wollte ich ja vermeiden, indem nur "freie" Schüler zur Auswahl stehen.
Allerdings ist es bei mir auch noch nicht "rund", wie ich eben noch feststellen musste.
Man kann einen Schüler mit zwei Terminen im gleichen Kurs anmelden bzw. zwei Kurse
am gleichen Termin eintragen >:(. Habe deshalb noch zwei weitere Mehrfeldes-Indices
eingefügt (Schüler/Kurs und Schüler/Termin). Jetzt muss nur noch der auftretende Fehler
(3022, Indexverletzung) behandelt werden. Geänderte DB reiche ich nach.
@Domm
ZitatJetzt bleibt nur meine Bitte, mich Grundlagenlatein zu lehren.
Das ist hier eigentlich nicht der Sinn der Sache. Es wird dir aber gerne beim Verstehen
geholfen. Also lies ein Buch (besser zwei ;)), und wühle dich mal durch die Links
in Franz' Signatur (http://www.access-o-mania.de/forum/index.php?topic=22763.0 (http://www.access-o-mania.de/forum/index.php?topic=22763.0)).
ZitatDas hat zugegebenermaßen auch mich frustriert.
Der Frust legt sich wenn du dem vorgeschlagenen "Pfad der Tugend" folgst.
ZitatZiel ist es, mit einem Code von ein, zwei Zeilen Duplikate zu verhindern und die Anzahl von schülerbezogenen DS zu begrenzen.
Das hat Klaus in seinem Beispiel gezeigt.
ZitatDieses Muster ließe sich dann auch auf die Termine übertragen.
Ja.
Die Lösung mit entsprechenden Indices (s.o.) erfordert zwar mehr Code, verhindert aber
Inkonsistenzen sicher.
ZitatHast Du Lust, zum Leidwesen Deiner eigenen Projekte einen Basic- Kurs zu moderieren?
Nicht wirklich, aber ich erläutere dir gerne Schritt für Schritt was ich gemacht habe.
Dazu werde ich die o.a. Fehlerbehandlung einbauen und die DB nochmal hochladen.
gruss ekkehard
Herzlichen Dank, Klaus!
Ich machs mal der Reihenfolge nach:
Ich hab ehrlich keine Ahnung, was ein zusammengesetzter eindeutiger Index ist.
Ich hatte die Beziehungen angelegt. Beim Manipulieren mit den Daten gab es so viele Hindernisse, dass ich sie wieder löschen musste. Statt dessen habe ich die DropDown- Felder einfach mit den Tabelleninhalten gefüllt. (wirst Du schon bemerkt haben ;-)
Ich gebe Dir unbedingt recht- Deine Argumentation über die hilflosen Versuche, verkurkste DB mit Krückstock zum Laufen zu bringen, sind kein Fundament für eine gemeinsame Lösungssuche. Und ich verstehe alle, die sich wie ich mit dem (als Quereinsteiger zwangsläufig ergebenden) fragmentarisch aufgebauten Pseudowissen ihre Lösungen irgendwie zusammenbasteln; um dann entnervt die Antworten und Angebote als kein bissl hilfreich beiseite zu fegen.
irgendwo oben in diesem Tread habe ich einen Code gezeigt, der durchaus das gewünschte Ergebnis geliefert hat.
Aber- was soll ich denn DAMIT?
jetzt hab ich erstmals eine verständliche Funktion erhalten, die man so in Fachbüchern gar nicht findet. Weil die Aufmerksamkeit schon nach den ersten 100 Seiten erlahmt.
Ich bin froh, von Dir ein Werkzeug bekommen zu haben, dass ich auch selbst bedienen kann.
Klingt vielleicht affektiert und überzogen, aber eine Codezeile kann man am Besten begreifen, wenn der ganze Fehlercode- Schnickschnack und das Abfangen aller möglichen Eventualitäten mal beiseite gelassen wird.
Lass mich noch ein bissl basteln; dann melde ich mich wieder.
Einen schönen Tag Euch Allen! 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
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
@Ekkehard,
in welchem Upload wird denn die Abfrage verwendet?
Oje, was hab ich angerichtet...
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
Ekkehard, Du kannst eine Bedingung wieWHERE S.SchueID NOT IN ( SELECT SchuelerNr_F
FROM KursSchueler
WHERE KursNr_F = [DerKursParameter] )
der Abfrage hinzufügen.
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?
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.
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
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
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
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
Oh Mist, mit dem Einfügen der Zitate hats nun doch nicht gefunzt :-\
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.
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
Hallo Ekkehard, hallo Klaus.
Tut mir leid, wenn Ihr das Gefühl habt, Eure Zeit zu verschwenden. Ich denke, wir betrachten einfach dieses Problem als gelöst.
Aber ich möchte wenigstens noch die Situation erklären:
Die Daten in Excel liegen in folgender Form vor: Spalte A: [Schülername und Vorname]; Spalte B: [Kursname (Prüfer)] von einem der beiden Kurse; Spalte C: [Kursname (Prüfer)] des anderen Kurses.
Das habe ich bis jetzt auch nicht gewusst; der Lehrer hats mühsam! aufgedröselt, weil ich ihm erklärt hatte, dass die verschiedenen Daten in verschiedene Tabellen überführt werden müssen.
Also die Schüler auf einem Tabellenblatt, die Kurse auf einem anderen. Sauviel Arbeit!
Ihr habt mir jetzt wiederholt erklärt, dass mit dem richtigen Modell nicht mehr Arbeit entsteht. Die Arbeit, die sich der Lehrer gemacht hat, muss also Access übernehmen. Das bedeutet für mich, die Excel- Liste wird unaufbereitet nach Access importiert, dort in die entsprechenden Tabellen überführt und automatisch wieder zugeordnet. Dass diese Prozedur meine Fähigkeiten und auch mein Wissen übersteigt, habe ich in der letzten Post schon erklärt.
Wieso seid Ihr jetzt sauer? Jetzt gehts doch gar nicht mehr darum, eine DB zu verkaufen, die den strengen Regeln genügt. Der Lehrer hat seine Glückseligkeit. Er braucht die Daten nicht mehr stundenlang aufzusplitten, um dann beim Zusammenführen Sorge zu haben, einen Fehler zu machen. Und wenn ich ihm gesagt hätte, dass ich ihm keine Lösung anbieten kann, wärs auch OKAY.
Aber ich hab mich gefreut, dass Ihr mich an die Hand genommen habt.
Ich werde nie in Eure Sphären aufsteigen; dafür fehlen mir Englischkenntnisse und vernünftige Vorbildung. Außerdem sind die Pausen zwischen den Access- Basteleien einfach zu lang.
Es ist einfach nur so, dass ich mich freue, wenn sich nach vielem Suchen und Probieren eine Lösung für ein Problem herausschält. Und da kommt man ohne Hilfe oft nicht weiter.
Erinnert Ihr Euch, mit welchem Thema ich an Euch herangetreten bin? Dieser Nagel ist längst eingeschlagen und ich freue mich, dass ich jetzt weiß, wie es geht.
Die Herausforderung jetzt ist für mich die, wie verschiedene DS auf bestimmte Kriterien miteinander verglichen werden können.
Das ist auch spannend. Wie ich allerdings vermute, hab ich damit die Anforderungen an ernsthafte Weiterbildung nicht erfüllt.
Ich freue mich, dass ich Euch kennen gelernt habe und dass Ihr solange durchgehalten habt.
Es wäre schön, wenn ich mich mal wieder zu Wort melden dürfte. Dann sicher nicht so langatmig und uneinsichtig.
Euch alles Gute, Domm
Hallo Domm,
Das die Daten aus einer externen Quelle stammen war bisher nicht
bekannt :(
Die Excel-Herkunft zeigt nun auch, woher dein Datenmodell stammt.
Da muss man leider völlig umdenken, - Datenbanken (Access) arbeiten
anders als eine Tabellenkalkulation, - wie der Name eigentlich schon
andeuten sollte ;)
Dann fehlte dir also zur Verwendung des korrekten Datenmodells nur
noch der Import der externen Daten in dieses.
Sollte machbar sein wenn du die Exceltabelle hier einstellst.
Ich bin allerdings ab Freitag im Urlaub (1 Woche), und weiss noch nicht,
ob ich meine Frau überreden kann den Laptop mitzunehmen ;), und
morgen muss ich noch arbeiten. Vielleicht hilft aber jemand aus.
gruss ekkehard
Hallo Domm,
Habe schon mal angefangen darüber nach zu denken.
Wenn die Exceltabelle so aufgebaut ist wie beschrieben ist es im Prinzip
mit ein paar Einfügeabfragen möglich die Daten in die verschiedenen
Tabellen zu importieren. I.Ü. auch gleich in eine Tabelle "Kursleiter".
Es gibt aber das Problem, dass wohl aus Excel keine IDs kommen, und
deshalb überlegt werden muss, wie man mit Namensgleichheiten (sprich
keiner Eindeutigkeit) verfährt.
Wie oft muss das denn überhaupt importiert werden? Jährlich/halbjährlich?
Diese Fragen hätte ich gerne noch beantwortet bevor ich mich mit dem
Import beschäftige. Und die Exceltabelle natürlich.
gruss ekkehard
Ach ja, noch eine Frage.
Wie sieht das mit der Zuordnung Kurse/Kursleiter aus?
1 Kurs 1 -Leiter sollte klar sein. Kann ein Kursleiter aber auch mehrere
Kurse geben (also verschiedene Fächer)?
Ehrlich, ich hätte nicht gedacht, dass noch irgendwer eine Minute an dieses Thema verschwendet.
Danke Ekkehard!
Schnell nochmal zum Ursprung: Die Info zur Datenherkunft wurde erst im Verlauf notwendig, weil ja die Fragestellung nur ein Fragment der Aufgabe war. Und welcher Natur diese Daten sind- das hab auch ich erst spät erfahren.
Ein Zitat vom Beginn dieses Threads:
,,...Der Lehrer bekommt eine Datei, in der die Zuordnung der Kurse zu den Schülern festgelegt ist und soll diese auf zwei Wochen verteilen.
Kurs A
Schü 2
Schü 7
Schü 13
Schü 31
Kurs B
Schü 5
Schü 18
Schü 51
Kurs C
...
Da der Import aus dieser nicht näher benannten Datei so nicht möglich ist, importiert er die Schülerliste nach Excel, von wo sie in die DB exportiert wird...."
Etwas später kam dann die auch für mich neue Erkenntnis:
,,...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..."
Noch später:
,,...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ö)]..."
Jetzt seht Ihr, welchen Aufwand der Lehrer auf sich genommen hat, um dem DreiTabellenModell gerecht zu werden
,,...Die Daten in Excel liegen in folgender Form vor: Spalte A: [Schülername und Vorname]; Spalte B: [Kursname (Prüfer)] von einem der beiden Kurse; Spalte C: [Kursname (Prüfer)] des anderen Kurses..."
- Er hat aus der Excelliste die Schüler gefiltert und die Namensbestandteile in Vor- und Zunamen aufgeteilt. (Hut ab!)
- Er hat die Kurse gefiltert und händisch umbenannt (aus [1b2] wurde ,,1 Biologie 2", den in Klammern stehenden Prüfer in Normalform gewandelt (aus (Spö) wurde ,,OStRin Dr Spörlein" und diese Daten separat aufgeführt.
Nachdem alles sauber nach Access importiert war, hab ich ihm die Aufgabe gegeben, alles wieder zusammenzuführen. Etwas verlegen hat er mich irgendwann gefragt, obs nicht auch ginge, die Daten unbearbeitet nach Access zu überführen. Die Erkenntnis seines Schaffens hat zugegebenermaßen dann mich verlegen gemacht.
Nun hat sich dadurch eine Importtabelle ergeben, die genau dem Modell meiner ersten Versuche entspricht- allerdings aus anderen Gründen. Ging es mir bisher nur darum, die Vergleichbarkeit von Daten in einem DS zu realisieren, liegen nun die Rohdaten in dieser Form vor.
Wer will, kann mir daraus jetzt einen Strick drehen, aber wie ich diesen Brei normalisieren soll, weiß ich nicht. Zumal dem Lehrer egal ist, ob die einzelnen Englischkurse normalisiert werden sollten und dann über eine Beziehung den Lehrern wieder zugeordnet werden.
Und stelle fest, dass ich mit zwei Datumsfeldern ganz schnell fertig bin. Deshalb hatte ich mich aus dem Thema verabschiedet. Um nochmal zu zitieren:
,,...Der Lehrer hat seine Glückseligkeit. Er braucht die Daten nicht mehr stundenlang aufzusplitten, um dann beim Zusammenführen Sorge zu haben, einen Fehler zu machen..."
Nachdem alles gebacken ist, hab ich endlich Zeit, mich mit den Inhalten Eurer Lösungen zu beschäftigen.
Ich wünsche Euch ein schönes WE! Domm
Hallo Domm,
ZitatDa der Import aus dieser nicht näher benannten Datei so nicht möglich ist, importiert er die Schülerliste nach Excel, von wo sie in die DB exportiert wird...."
Wäre schon interessant beide Tabellen mal als Datei zu erhalten, um den
Aufbau zu sehen. Import in Access sollte eigentlich immer irgendwie
möglich sein, auch normalisiert.
gruss ekkehard
Sehr gern, Ekkehard.
Die Ausgangsdatei ist ein Programm, welches vom Kultusministerium den Schulen zur Verfügung gestellt wird. Wie dort wo die Daten abgelegt sind, weiß ich nicht. Als Hausmeister bekomme ich natürlich auch keinen Zugriff. Warum jetzt die Kolloquiumsplanung dort nicht möglich ist und warum sich ein Oberstufenlehrer damit in Excel rumärgern muß- keine Ahnung. Jedenfalls schafft er es, die Daten so nach Excel zu überführen, dass ein Datenblatt [kurse-kl] zur Verfügung steht. Da dieses als Basis für weitere Verwendung ungeeignet ist, strickt er sich daraus das Tabellenblatt [Belegung]. Daraus hat er mir die Namen selektiert und aufgeteilt sowie die Kurse getrennt und aus Abkürzungen normale Bezeichnungen gemacht. Da aber nur er damit arbeitet, brauchts das gar nicht. Der Import von [Belegung] gestaltet sich denkbar einfach; mit dem Hinzufügen zweier Datumswerte ist die Aufgabe erfüllt, wenn sich die Kurse filtern lassen. Und das geht in einer Union, in der die beiden Kurse zusammengeführt werden. Bin mal gespannt, wie sich die Normalisierung umsetzen lässt... LG Domm
ZitatBin mal gespannt, wie sich die Normalisierung umsetzen lässt...
Normalisierung hat mit der Qualität von zu importierenden Quelldaten relativ wenig zu tun, sondern orientiert sich an datenbankinternen Kriterien, z.B. dass atomare Informationen nur genau einmal gespeichert werden. Erläuterungen dazu wurden oben mit Sicherheit schon gegeben.
Wenn die Quelldaten dann nicht derart strukturiert sind, dass man einen Standardimport, der ja auf standardisierten Strukturen aufbaut, nicht sinnvoll verwenden kann, muss man eben eine eigene Importroutine schreiben, die dann bereichsweise oder gar punktweise Informationen greift und in die Zieltabellen schreibt. Wenn der Bagger nicht geht, muss man eben auf die Sandschaufel oder gar die Fingerspitzen zurückgreifen.
Wenn man so etwas angehen will, braucht man das fertige Datenmodell in der Datenbank (das bleibt für lange bis hin zur Ewigkeit) sowie dann für die Quelldaten eine Sicherheit, dass sie zumindest immer in gleichen Strukturen auftreten - auf irgendetwas muss man sich ja verlassen können. Maschinen-/programmerzeugte Daten sollten so etwas bieten.
Daher würde man hier auch eher an der originalen Ausgabe der Ausgabedatei ansetzen wollen und nicht nach erfolgten Excelversuchen einer Person, die den Vorgang nicht ganz so beherrscht.
Wenn Du also das fertige Datenmodell (Demo-DB mit Tabellen und Beziehungen) und die Ausgangsdatei bereitstellst, ggf. mit einigen Erklärungen, was warum wohin soll, könnte sich auch jemand mit dem Import beschäftigen, der es sich nicht antut, sich dieses riesenlange Thema inhaltlich nachzuvollziehen.
Hallo Eberhard, danke für Deinen Beitrag.
Im Anhang das DB- Modell, in der vorangegangenen Nachricht die Excel- Liste, DBl. [kurse-kl].
Das ist die Ausgangssituation. Gruß Domm
Ich schrieb von einem fertigen Datenmodell (die Diskussion im Vorfeld erschien mir lang genug). Das in der Demo Vorgelegte entspricht diesem nicht.
Offensichtlich:
- Indizierung auf Tabellen-ID's doppelt, weitere sinnvolle Indizierungen fehlen.
- Keine referentielle Integrität eingestellt.
Inhaltlich:
- Die tabTermine und ihre Verwendung ist in der vorgelegten Form sinnfrei. Termine kann man hier gleich in die tabSchuKurs in einem Feld erfassen. Warum: Ein Date-Feld belegt 8 Byte pro Datensatz, zwei Long-Felder zur Verknüpfung auch schon zweimal 4 Byte, und dann hätte man den jedesmaligen Aufwand für Verknüpfung zwischen den Tabellen (das ist zu erledigender Aufwand, der irgendwann auch spürbar Zeit benötigen kann) sowie längere und unübersichtlichere SQL-Anweisungen in der nachfolgenden Verwendung (was sich auch für Neulinge nicht als Plus darstellen wird).
- Die tabKurse enthält einen Prüfer, aber keinen inhaltlichen Bezug zu einem Kursinhalt. Ist es sinnvoll und nachhaltig, einen Kurs über eine Person zu identifizieren?
Neuer Versuch!
Indizierungen geändert.
Ref. Integrität eingestellt.
tabTermine enthält 2 Werte, welche den Wochenbeginn der Prüfungen beinhalten. Diese werden erst dann benötigt, wenn die Zuordnung der Kurse - Schüler wieder hergestellt ist. Deshalb ist der Entwurf von Ekkehard zwar richtig, wenn ich den DS in einem Zug mit allen notwendigen Daten füllen will, aber für den Lehrer nicht hilfreich. Vielmehr muss er anhand der Kursbelegung zueinander die Termine switchen können.
Wenn ich die tabTermine durch ein Nachschlagefeld in tabSchuKurs ersetze, muss der Lehrer die Möglichkeit haben, die Datumswerte einzutragen. Deshalb hab ich mich für eine externe Tabelle entschieden.
Wie schon erwähnt, stehen Kurs und Prüfer als ein Feldinhalt zur Verfügung. Auch wenn z.B. engl von 3 Kursleitern geprüft wird, wird im Vorfeld schon der Kurs als 1e1, 1e2 oder 1e3 deklariert.
Jetzt ist über den Datenimport zu realisieren, dass in access, im frmSchuKurs, listeSchülerMitKurs die Daten aus excel, kurse-kl aufbereitet sind.
Auch wenn ich es immer wieder um die Ohren gehaut bekomme, wie leicht das alles geht mit dem Import und dem Normalisieren- ich wiederhole mich: das ist kein Auftrag, den ich bewältige!
Ich steige nicht im Ansatz durch, was in den Modulen von Ekkehard steht, die man immer brauchen kann...
So, nun hab ich vor lauter Frust auch den Anhang vergesssen >:(
ZitatWenn ich die tabTermine durch ein Nachschlagefeld in tabSchuKurs ersetze, muss der Lehrer die Möglichkeit haben, die Datumswerte einzutragen. Deshalb hab ich mich für eine externe Tabelle entschieden.
Nachschlagefeld ist Blödsinn. Schreibe in das Feld statt den Fremdschlüssel auf den Termin direkt das Datum, womit dann das Feld den Datentyp Datum/Uhrzeit haben muss.
Für ein "Switchen" ergibt sich der gleiche Aufwand bzw. eher weniger. Ein Datum zu ändern ist die gleiche Arbeit wie eine Longzahl. Bei einem Datum ist aber das unmittelbare Verständnis größer und die Anwendung einfacher (einfache Aktualisierung statt sich den Fremdschlüssel aus einer anderen Tabelle zu holen).
Nebenbei:
ZitattabTermine enthält 2 Werte, welche den Wochenbeginn der Prüfungen beinhalten
Geplante Datenbanken, so wie das die Kollegen vorhaben und empfehlen, sind langlebig und somit auch im Folgejahr und im Folgefolgejahr usw. nutzbar. Da gibt es dann sicher weitere Termine.
So wie ich das sehe, sind hier zwei grundlegende Schritte erforderlich:
1) Aus der wilden Tabelle wird eine richtige Tabelle (Liste) mit dann nur interessierenden Daten erstellt (=> Excel-Automation).
2) Nunmehr ist ein Import nach folgendem Muster möglich: Importtabelle in m:n-Beziehung auflösen (http://www.dbwiki.net/wiki/Datei:AccSampleDivideTable.zip)
Ich würde zu beiden Aufgaben einen Versuch wagen, das kann aber etwas dauern.
Zur zeitlichen Überbrückung würde ich eine Rückfrage stellen:
Zitatdas ist kein Auftrag, den ich bewältige!
Ich steige nicht im Ansatz durch
Als Hausmeister bekomme ich natürlich auch keinen Zugriff
warum sich ein Oberstufenlehrer damit in Excel rumärgern muß
Ein überforderter Oberstufenlehrer, ein Hausmeister?
In meinem Verständnis ist ein Gymnasium eine höhere Bildungseinrichtung, wo Excel + Access sogar Lehrstoff sein sollten, es alo gewisse Grundlagen oder gar erweiterte Kenntnisse und Fähigkeiten geben könnte. Warum nehmen sich nicht ein Informatiklehrer, eine Informatik-AG oder einzelne aufgeweckte Gymnasiasten, die sich zeitgleich oder später als Praktikanten oder Werksstudenten verdingen werden, dieser Aufgabe an? Eine gelöste reale Aufgabe macht sich als eigene Erfahrung wie auch als Referenz recht gut.
"Nicht für die Schule, für das Leben lernen wir."
Das reale Leben anpacken kann man gar nicht früh genug.
@Domm
Zitat von: Domm am November 03, 2017, 13:37:43
Jetzt ist über den Datenimport zu realisieren, dass in access, im frmSchuKurs, listeSchülerMitKurs die Daten aus excel, kurse-kl aufbereitet sind.
Zitat von: Domm am Oktober 29, 2017, 18:27:47
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ö)]
Eine einfache Methode ist es, Excel Funktionen zu nutzen um die Daten für die Aufnahme in die Datenbank vorzubereiten.
Deine Excel Tabelle enthält 2 Arbeitsblätter: <Kurse-kl> und <Belegung>
Ich nehme jetzt mal an, dass <Belegung> die zu importierenden Daten enthält.
Spalten (vorhanden): Schüler, KursA, KursB
Spalten (neu): Nachname, Vorname,Kurs1,Prüfer,Kurs2,Prüfer
Funktionen in neuen Spalten (in die zweite Zeile kopieren) :
Nachname: =GLÄTTEN(TEIL(A2;1;SUCHEN(" ";A2;2)))
Vorname: =GLÄTTEN(TEIL(A2;SUCHEN(" ";A2;2)+1;LÄNGE(A2)))
Kurs1:=GLÄTTEN(TEIL(B2;1;SUCHEN("(";B2;2)-1))
Prüfer1:=GLÄTTEN(TEIL(B2;SUCHEN("(";B2;2);LÄNGE(B2)))
Kurs2:=GLÄTTEN(TEIL(C2;1;SUCHEN("(";C2;2)-1))
Prüfer2:=GLÄTTEN(TEIL(C2;SUCHEN("(";C2;2);LÄNGE(C2)))
Frithjof
Hallo Männer! Der Reihe nach:
Nachschlagefeld ist Blödsinn. Schreibe in das Feld statt den Fremdschlüssel auf den Termin direkt das Datum, womit dann das Feld den Datentyp Datum/Uhrzeit haben muss.
Die vorgeschlagene Struktur ist nicht erkennbar. Wenn das Datum direkt in die tabSchuKurs soll, muss es dann in jeden DS eingetragen werden???
Geplante Datenbanken, so wie das die Kollegen vorhaben und empfehlen, sind langlebig und somit auch im Folgejahr und im Folgefolgejahr usw. nutzbar. Da gibt es dann sicher weitere Termine.
Geplant war, eine Vorlage der leeren DB vorzuhalten und nach allen Eintragungen und Zuordnungen unter dem Prüfungsjahr abzuspeichern. Es ist allerdings möglich, statt dem Datumswert nur eine 1 und 2 zu vergeben. Das Datum wird nur bei der Berichtsausgabe für die Kursprüfer benötigt. Die wollen schließlich wissen, wann der erste Termin ist.
1) Aus der wilden Tabelle wird eine richtige Tabelle (Liste) mit dann nur interessierenden Daten erstellt (=> Excel-Automation).
2) Nunmehr ist ein Import nach folgendem Muster möglich: Importtabelle in m:n-Beziehung auflösen (http://www.dbwiki.net/wiki/Datei:AccSampleDivideTable.zip)
Genau die richtige Aufgabe für Euch! Ich bin mal gespannt! Sicher kannst Du Dir denken, was dabei rauskommt, wenn ich erklären müsste wie das funktioniert. Also, kein Problem, wenns dauert. Das Leben hat noch mehr zu bieten...
Weiter gehts:
Ein überforderter Oberstufenlehrer, ein Hausmeister?
In meinem Verständnis ist ein Gymnasium eine höhere Bildungseinrichtung, wo Excel + Access sogar Lehrstoff sein sollten, es alo gewisse Grundlagen oder gar erweiterte Kenntnisse und Fähigkeiten geben könnte. Warum nehmen sich nicht ein Informatiklehrer, eine Informatik-AG oder einzelne aufgeweckte Gymnasiasten, die sich zeitgleich oder später als Praktikanten oder Werksstudenten verdingen werden, dieser Aufgabe an? Eine gelöste reale Aufgabe macht sich als eigene Erfahrung wie auch als Referenz recht gut.
Ich habe nooch nicht einen einzigen Schüler gefunden, der sich für Access erwärmen konnte. Da werden auch nur Grundlagen geschult, also all das was kommt, bevor es spannend wird. Ich hab die Grundlagen weggelassen (das scheint hier auch jeder zu merken) und hab mich gleich ins Abenteuer gestürzt.
Der Informatiklehrer verdreht jedesmal die Augen, wenn ich eine Frage zu Access stelle. Aber nicht, weil meine Denke so konfus ist, sondern weil er über den Lehrstoff nicht hinauskommt.
Schüler, die sich mit Programmierung beschäftigen, setzen vermutlich auf andere Plattformen. Da brauche ich überhaupt nicht mitreden...
Und noch eins obendrauf:
Eine einfache Methode ist es, Excel Funktionen zu nutzen um die Daten für die Aufnahme in die Datenbank vorzubereiten.
Deine Excel Tabelle enthält 2 Arbeitsblätter: <Kurse-kl> und <Belegung>
Ich nehme jetzt mal an, dass <Belegung> die zu importierenden Daten enthält.
<kurse-kl> ist das Ergebnis des Imports aus der Schul- Software. Daraus macht der Lehrer <Belegung>. Wenn ich Euch richtig verstanden habe, sollte der Lehrer nicht in der Originaldatei rumpfuschen. Das heißt, du hast <kurse-kl> als Arbeitsmaterial! Irgendwer hat geschrieben, dass alles automatisch geht. Also vergiss <Belegung>.
Funktionen in neuen Spalten (in die zweite Zeile kopieren) :
Nachname: =GLÄTTEN(TEIL(A2;1;SUCHEN(" ";A2;2)))
Vorname: =GLÄTTEN(TEIL(A2;SUCHEN(" ";A2;2)+1;LÄNGE(A2)))
Kurs1:=GLÄTTEN(TEIL(B2;1;SUCHEN("(";B2;2)-1))
Prüfer1:=GLÄTTEN(TEIL(B2;SUCHEN("(";B2;2);LÄNGE(B2)))
Kurs2:=GLÄTTEN(TEIL(C2;1;SUCHEN("(";C2;2)-1))
Prüfer2:=GLÄTTEN(TEIL(C2;SUCHEN("(";C2;2);LÄNGE(C2)))
Das klingt cool! Muss ich gleich mal probieren, wie das funzt. Der Lehrer braucht dieses Aufbrechen zwar nicht, um zu seinem Ergebnis zu kommen, aber mir gefällt es auch besser wenn in den Feldern saubere Daten stehen.
Schönen Sonntag Euch allen!
Kann mir jemand verraten, wie ich ein Zitat als solches erkennbar in die Antworten einfüge? Ich markiere den Text und klicke auf Zitat. Das Ergebnis ist nicht überzeugend. :-[
Hallo,
ZitatIch markiere den Text und klicke auf Zitat
Aber genau so geht es. Habe ich jetzt auch so gemacht.
Zitat von: Domm am November 04, 2017, 15:45:23
<kurse-kl> ist das Ergebnis des Imports aus der Schul- Software. Daraus macht der Lehrer <Belegung>. Wenn ich Euch richtig verstanden habe, sollte der Lehrer nicht in der Originaldatei rumpfuschen. Das heißt, du hast <kurse-kl> als Arbeitsmaterial!
Die Aufteilung der ,,Kurspakete" auf zwei Seiten hat leider nichts mit KursA und KursB zu tun wie ich irrtümlich annahm. Sie ist völlig überflüssig.
Dass die Tabelle ein Import aus einer Datenbank ist, ist kaum zu glauben. Sie enthält 4 Namen mit unterschiedlicher Schreibweise. (z.B. "Selce Valentino" "Selce Valentin" oder "Rapana Rebe(11" "Rapana Rebecca")
Also entweder hat da schon einer rumgepfuscht oder die Datenbank aus der die Daten sein sollen hält die Namen redundant vor.
Dadurch wird der ohnehin schon komplizierte automatisierte Import dieser Tabelle m.E. zu aufwändig.
Einfacher wäre es die Daten eben per Hand zusammen zuschieben. Kommt natürlich drauf an um wie viele Tabellen im Jahr es sich handelt.
Mithilfe der Auto-Filterfunktion im Excel-Ribbon <Daten> lassen sich schnell die Leerzeilen löschen. Dann kann man die "Kurspakete" untereinander schieben, nochmal die Leerzeilen löschen, den Rest alphabetisch sortieren und dann mit einer kleinen Wenn-Funktion den Rest erledigen.
Ich habe dir eine Excel-Tabelle mit ein paar Zwischenschritten mal hochgeladen.
Im Arbeitsblatt <Belegung2> in der Spalte c findest du alle Namensungleichheiten (überall dort wo 3 Nullen untereinander stehen.)
Wenn die Namensprobleme bereinigt sind brauchst Du in der Spalte C nur 0 ausblenden und die Liste ist fertig.
Dann weiter wie im Arbeitsblatt <Belegung>.
Abschließend alles kopieren und in ein neues Arbeitsblatt <Inhalte einfügen>.
Frithjof
(Es gibt übrigens einen Vorschau-Button)
Du bist echt klasse!
Die von Dir ausgearbeiteten Arbeitsschritte werd ich als Erstes dem Lehrer verklickern. Vielleicht machen wir eine Excel- Vorlage, die er (bzw. der zweite OS- Leiter) in den nächsten Jahren zum Aufbereiten der Daten nutzen kann.
Zitat von: Frithjiof am November 04, 2017, 18:16:55
Dass die Tabelle ein Import aus einer Datenbank ist, ist kaum zu glauben.
Wie gesagt, ich kenne die Oberfläche nicht, aus der die Rohdaten importiert sind. Dass diese fehlerhaft sind, hab ich deshalb noch nicht bemerkt, weil der Lehrer beim Aufbau von <Belegung> die Fehler offensichtlich korrigiert hat. Natürlich händisch...
Ich hab ihn gefragt, wie andere Oberstufenleiter mit diesem Problem umgehen- da scheint jeder mit dem zu arbeiten, was er zur Verfügung hat. Entweder Software, die jemand selbst gestrickt hat, über Excel und viel Fleiß oder mit Papier und Stift.
Okay, wir haben jetzt also das fertige Datenblatt <Belegung>. Jetzt müssen die Daten nach Access importiert werden.
Die Daten <Schüler> in <tabSchueler>, die Daten <Kurse> in <tabKurs>. Wenn ich dem Lehrer eine "Bescheibsanweisung" als Access- Hilfe hinterlege, weiß er auch im nächsten Jahr noch, wie er sich durch das Menü wühlt, bis alles sauber verpackt ist.
Problematischer wird es, die ehemals zusammenhängenden Datenstränge wieder zusammen zu führen (Schüler-KursA-KursB). Er war echt dankbar, dass ihm das bei der von mir übergebenen DB unnötig ist.
Aber bevor ihr mich mit Euren Lösungsvorschlägen wieder erschlagt, lasst mir bitte ein bissl Zeit, die neuen Erkenntnisse für mich aufzuarbeiten. Meine Frau zeigt schon die Zähne. Und ich muss gestehen, dass ich mich noch nie so intensiv mit dem Thema Access beschäftigt habe. (Ja, das sollte ein Lob sein)
Lieber Klaus, lieber Frithjof, danke für die Tipps zum Thema "Zitat". Die Vorschau ist echt hilfreich bei solchen Unsicherheiten. Allerdings ist es so, dass -auch wenn ich nur einen Teil des Textes markiere, die gesamte Antwort als Zitat eingefügt wird. Wenn ich im Eingabefenster die überflüssigen Bereiche rauslösche, muss ich aufpassen, dass der Vor- und Nachtrag quote nicht verloren gehen. Dann passt es!
ZitatAber bevor ihr mich mit Euren Lösungsvorschlägen wieder erschlagt, lasst mir bitte ein bissl Zeit, die neuen Erkenntnisse für mich aufzuarbeiten.
Dann warte bis Neujahr, ehe Du Dir das folgende ansiehst:
Option Explicit
Sub DoIt()
DoItPart1
DoItPart2
MsgBox "Fertig"
End Sub
Sub DoItPart1()
Const xlUp = -4162
Const xlNo = 2
Const xlAscending = 1
Const xlTopToBottom = 1
Const xlSortNormal = 0
Dim oXL As Object
Dim oWorkbook As Object
Dim i As Long
Dim LastRow As Long
Dim LastRowN As Long
Set oXL = CreateObject("Excel.Application")
oXL.Visible = False
oXL.DisplayAlerts = False
Set oWorkbook = oXL.workbooks.Open(CurrentProject.Path & "\Name-Kurs1-KursB.xlsx")
With oWorkbook
If SheetExists(oWorkbook, "EineListe") Then .Sheets("EineListe").Delete
.Sheets("kurse-kl").Copy After:=.Sheets(.Sheets.Count)
.Sheets(.Sheets.Count).Name = "EineListe"
End With
With oWorkbook.Worksheets("EineListe")
LastRow = .UsedRange.Rows.Count + .UsedRange.Row - 1
' überflüssige Zeilen löschen
For i = LastRow To 1 Step -1
Select Case .Cells(i, 1).Value
Case 1 To 100
Case Else
.Rows(i).Delete Shift:=xlUp
End Select
Next
' Inhalte auf die ersten beiden Spalten kopieren
LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
LastRowN = LastRow
For i = 4 To 9 Step 2
.Range(.Cells(1, i), .Cells(LastRow, i + 1)).Copy .Range(.Cells(LastRowN + 1, 2), .Cells(LastRowN + LastRow + 1, 3))
LastRowN = .Cells(.Rows.Count, 2).End(xlUp).Row
Next
' rechte Spalten löschen
For i = 9 To 4 Step -1
.Columns(i).Delete
Next
' Nummernspalte löschen
.Columns(1).Delete
' sortieren
.Range("A:B").Sort _
Key1:=.Range("A1"), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
' Titelzeile einfügen
.Range("A1").EntireRow.Insert
.Range("A1").Value = "Schueler"
.Range("B1").Value = "Kurs"
'Debug.Print .UsedRange.Rows.Count
'Debug.Print .UsedRange.Columns.Count
End With
oWorkbook.Save
oWorkbook.Close
oXL.DisplayAlerts = True
oXL.Quit
Set oXL = Nothing
End Sub
Function SheetExists(ByVal oWorkbook As Object, ByVal SheetName As String) As Boolean
Dim sh As Object
For Each sh In oWorkbook.Worksheets
If sh.Name = SheetName Then
SheetExists = True
Exit For
End If
Next
End Function
Sub DoItPart2()
Dim db As DAO.Database
Dim sFrom As String
Dim sSQL As String
Set db = CurrentDb
sFrom = "[excel 12.0 xml;hdr=yes;imex=1;DATABASE=" & CurrentProject.Path & "\Name-Kurs1-KursB.xlsx].[EineListe$]"
sSQL = "INSERT INTO tabSchueler(SchuelerName) SELECT DISTINCT Q.Schueler FROM " & sFrom & " AS Q LEFT JOIN" & _
" tabSchueler AS Z ON Q.Schueler = Z.SchuelerName WHERE Z.SchuelerName IS NULL"
db.Execute sSQL, dbFailOnError
sSQL = "INSERT INTO tabKurse(KursPruefer) SELECT DISTINCT Q.Kurs FROM " & sFrom & " AS Q LEFT JOIN" & _
" tabKurse AS Z ON Q.Kurs = Z.KursPruefer WHERE Z.KursPruefer IS NULL"
db.Execute sSQL, dbFailOnError
sSQL = "INSERT INTO tabSchuKursterm(schuelerNr, kursNr)" & _
" SELECT Q.schuelerID, Q.kursID FROM (SELECT S.schuelerID, K.kursID" & _
" FROM (" & sFrom & " AS E INNER JOIN tabSchueler AS S ON E.Schueler = S.SchuelerName)" & _
" INNER JOIN tabKurse AS K ON E.Kurs = K.KursPruefer) AS Q LEFT JOIN tabSchuKursterm AS Z" & _
" ON Q.schuelerID = Z.schuelerNr AND Q.kursID = Z.kursNr WHERE Z.kursNr IS NULL"
db.Execute sSQL, dbFailOnError
End Sub
Hallo,
ZitatAllerdings ist es so, dass -auch wenn ich nur einen Teil des Textes markiere, die gesamte Antwort als Zitat eingefügt wird.
Bei Teilzitaten sollte nicht der Button verwendet werden, der im Beitrag mit "Zitat" zu sehen ist, sondern der Zitate Button in der Knopfleiste (siehe Bild). Dann wird nur der markierte Text als Zitat verwenden. Allerdings fehlt dann der Bezug zum Autor, was aber meist verzichtbar ist. Der Button daneben (der Gartenzaun #) ist für Code Darstellung.
So ganz langsam finde ich mich hier zurecht ;D
Das Ganze erinnert mich an einen Fortsetzungsroman, bei dem man kaum erwarten kann, wie es weitergeht. Wer hätte das gedacht; aus einer belanglosen Frage ist einer der größten Threads geworden!!!
Die Excelliste hab ich zum Verständnis selbst aus den Rohdaten nachgearbeitet. Das Blatt Temp erschließt sich mir dabei leider nicht.
Nach dem Löschen überflüssiger Zeilen und Spalte A die Kursblöcke untereinander gestellt, mit der Prüfung der doppelten Einträge wird komfortabel die Kursbelegung der Schüler auf zwei Spalten gesplittet und nebenbei Namenstoleranzen aufgespürt. Wenn der Lehrer diese bereinigt hat, können mit der Feststellung der Nullen die doppelten Namen gefiltert werden.
Wahrscheinlich hat er diese Arbeit ohne eine einzige Funktion gemacht.
Aus dem Code kann ich nichts herauslesen, aber das hast Du Dir schon gedacht. Hatte schon mit Ekkehards VBA zu kämpfen; da fehlts einfach an Wissen.
ZitatBei Teilzitaten sollte nicht der Button verwendet werden
Danke Klaus, die Icons hatte ich bisher weitgehend vernachlässigt.
Trotzdem funzt es nicht!
Ich habe Deinen Text markiert und dann den Icon Zitat gedrückt. Rausgekommen ist das:
Zitat
Bin halt ein Newbie :-\
@Doimm,
wenn Du den Knopf in der Leiste ganz rechts (Ansicht umschalten) wählst, sollte der zitierte Text in der Nachricht so aussehen (hier als Code dargestellt, weil sonst ein Zitat entstünde):
[quote]Bla Bla ...[/quote]
ergibt dann:
ZitatBla Bla ...
Optional kann
quote noch einige Parameter verarbeiten, die man sich am besten durch ein volles Zitat holt, um an den Hyperlink in der Zitatüberschrift zu gelangen. Den Text stutzt man sich dann auf den gewünschten Inhalt zurecht.
[quote author=Domm link=topic=22746.msg133261#msg133261 date=1509835648]Bla Bla ...
was dann so aussieht:
Zitat von: Domm am November 04, 2017, 23:47:28Bla Bla ...
oder auch einfach nur
[quote="Domm"]Bla Bla ...[/quote]
was dann so aussieht:
Zitat von: DommBla Bla ...
PS: ... und in der Vorschau kannst Du ja die Nachricht auch testen.
Hallo junge Frau, danke für die Nachricht.
Aber Du hast sicher längst gemerkt, dass mir schon das Leichte schwer fällt.
Ich erkläre mein Problem nochmal:
Gehe ich auf Deine Post und klicke den Button Zitat, entsteht Folgendes:
Zitat von: Lachtaube am November 05, 2017, 08:46:52
@Doimm,
wenn Du den Knopf in der Leiste ganz rechts (Ansicht umschalten) wählst, sollte der zitierte Text in der Nachricht so aussehen (hier als Code dargestellt, weil sonst ein Zitat entstünde):[quote]Bla Bla ...[/quote]
ergibt dann:ZitatBla Bla ...
Optional kann quote noch einige Parameter verarbeiten, die man sich am besten durch ein volles Zitat holt, um an den Hyperlink in der Zitatüberschrift zu gelangen. Den Text stutzt man sich dann auf den gewünschten Inhalt zurecht.[quote author=Domm link=topic=22746.msg133261#msg133261 date=1509835648]Bla Bla ...
was dann so aussieht:Zitat von: Domm am November 04, 2017, 23:47:28Bla Bla ...
oder auch einfach nur[quote="Domm"]Bla Bla ...[/quote]
was dann so aussieht:Zitat von: DommBla Bla ...
PS: ... und in der Vorschau kannst Du ja die Nachricht auch testen.
Warum das so ist, hat mir Klaus schon erklärt.
Wenn ich jetzt einen Teil Deines Beitrages markiere und klicke den Icon Zitat, passiert das:
Zitat
Also nur
[quote][/quote]
Deshalb muss ich den markierten Text dazwischen schieben, damit das Zitat auch drin steht:
Zitatwenn Du den Knopf in der Leiste ganz rechts (Ansicht umschalten) wählst, sollte der zitierte Text in der Nachricht so aussehen
Wieso???
Hallo,
wieso?
weil sich "Zitat" nicht um markierten Text schert...
Um einen bestimmten Text zu zitieren, copy & paste den gewünschten Text in das Antwortfenster, markiere diesen Text und klicke auf das "Zitat einfügen"-Icon in der "Icon"-Leiste (unter "Schriftart")..
Zitatweil sich "Zitat" nicht um markierten Text schert...
Endlich!
Danke, Franz.
Hallo, da immer noch einige Fragen offen waren, möchte ich mich nochmal melden.
Die Tatsache, dass die Inhalte der Datenbank höchstens eine Lebensdauer von einem halben Jahr haben, macht die gutgemeinte Aufbereitung fragwürdig. Nachdem die Schüler im laufenden Schuljahr die Wahl ihrer Kurse getroffen haben, werden die Daten nach Ende des Kolloquiums nutzlos. Einzig die Kursbezeichnungen haben eine Überlebenschance; angepasst werden müssen sie aber auch.
Nachdem ich mit Fridhjofs Excelliste beehrt wurde, habe ich mich das erste Mal mit diesem Datenursprung überhaupt befasst. Dabei ist mir klargeworden, dass die Aufgabenstellung der Datumszuweisung auch ohne Umweg über Access zu meistern ist. Sicher liegt die späte Erkenntnis auch daran, dass es von dem Lehrer kein "Pflichtenheft" für sein Problem gab.
Das bedeutet letztendlich, dass der Versuch, diese Daten zu normalisieren und über ungeahnte Codestränge zum Leben zu erwecken, überflüssig scheint.
Nicht überflüssig war der Informationsaustausch hier im Forum. Ich habe jede Menge erfahren, vieles noch nicht begriffen, aber einen enormen Impuls bekommen.
Es war sehr spannend, zu beobachten, wie sich die Dinge entwickeln oder auch nicht.
Ich hab mir die Mühe gemacht, auch in anderen Foren zu stöbern und hab den einen oder anderen bekannten Namen dort wiedergefunden. Keine Ahnung, wie Ihr das mit Euren Partnern ausmacht, aber eins ist gewiss- man muss Euch sehr viel Fleiß und Hingabe bescheinigen!
Ich komme gern wieder mit meinen kleinen unausgereiften Problemchen zu Euch.
Wenn Ihr es ertragt.
Das Auflösen des letzten Codes hätte ich gern vor Sylvester erlebt. Genauso die Module, welche "man immer mal brauchen kann".
Vielleicht seid Ihr ganz dankbar, dass diese Odysee endlich vorbei ist. Wieder Platz im Kopf für Neues.
In diesem Sinne nochmal Danke an die ganze Mannschaft! Domm
Ja, es ist hilfreich, dass man vor dem Aktionieren sein (eigentliches) Problem erst einmal selber versteht.
Hallo Domm.
Zitat von: Domm am November 04, 2017, 23:47:28
Das Blatt Temp erschließt sich mir dabei leider nicht.
Mir war es nicht klar wie sich die Rohdaten zu Deinem hier geschilderten Problem verhalten.
Die zwei Seiten in der Excel-Tabelle habe ich anfangs als Zuordnung der Schüler zu Kurs1 und Kurs2 interpretiert.
Darum habe ich die Seiten einzeln im Tabellenblatt <TEMP> verarbeite. Also <TEMP> ist nur als Hilfsblatt gedacht.
Nach wie vor verstehe ich die ,,Aufgabe" nicht richtig. Es müssten ja nicht nur die Schülerinnen auf die zwei Prüfungstermine aufgeteilt werden sondern auch die Prüferinnen.
Und welche Bewandtnis es mit der (chaotischen) Darstellung der Rohdaten auf sich hat erschließt sich mir leider immer noch nicht.
Zitat von: Domm am November 04, 2017, 23:47:28
Aus dem Code kann ich nichts herauslesen, aber das hast Du Dir schon gedacht.
Ich schätze mal das bezieht sich auf Eberhards kleinen, hübschen VBA-Import-Routine.
Hier würde ich dir sehr empfehlen die
Sub DoItPart1()anzusehen, denn die erledigt alle Schritte bis zur Zwei-Spalten-Darstellung (Schüler, Kurs), die ich händisch gemacht habe, automatisch. Vorausgesetzt die Rohdaten werden immer in derselben Form geliefert wie die Beispieltabelle.
Die Routine kannst Du auch in ein Excel-VBA-Modul kopieren.
für "
CurrentProject.Path" müsstest aber den Path zur Excel Tabelle eintragen.
Die
Function SheetExists brauchst du auch
Und mit:
oXL.Visible = True 'False kannst du dem PC bei der Arbeit zuschauen.
Frithjof
Hallo Frithjof (im Profil kommt übrigens nach dem "j" auch noch ein "i". Das wäre in einer guten DB nicht passiert ;D ).
Danke für Deine Post.
Zitatwelche Bewandtnis es mit der (chaotischen) Darstellung der Rohdaten auf sich hat
, kann vermutlich nur der Lehrer beantworten. "kurse-kl" ist jedenfalls die Ausgangssituation. Diese wird auch jedes Jahr anders aussehen- ganz klar, wenn man sich vor Augen hält, dass die ABI- Jahrgänge sehr variabel sind und die Belegung der Kurse ganz persönlich entschieden werden. Vielleicht gibts dieses Jahr zum Reformationstag einen besonders vollen Kurs RelEv. Dann müssen zwangsläufig mehr Prüfer ran- vielleicht Externe von anderen Gymnasien. Also nix zum Automatisieren.
Und "Belegung" ist dann die (hoffentlich fehlerfreie) wünschenswerte Basis zum Export. Soweit hast Du ja auch alles richtig aufgearbeitet.
Im Übrigen, so faszinierend ich Deine Formel zum Auflösen der Schülernamen auch finde, die Funktion bietet Excel auch unter Menü- Daten an. Trotzdem danke, es hat Spaß gemacht, damit herum zu experimentieren und lehrreich war es auch.
Die Zuordnung Kurs- Prüfer bekommt der OS- Lehrer als fertiges Konstrukt. Ob es Sinn macht die beiden Inhalte in verschiedene tab zu trennen, Kurse zu normalisieren und wieder zusammen zu führen, halte ich in Anbetracht der Kurzlebigkeit dieser Informationen als unnötig. Zumal die Anzahl der Datensätze kaum Ballast für die Performance sein dürfte. Wichtig ist nur, dass der Inhalt "Kurs- Prüfer" normalisiert wird, um eine saubere Gruppierung zu erreichen. Wenn (zB. RelEvang dieses Jahr sehr gut besetzt ist gibts halt einen DS "1ev" mehr zum Gruppieren.
Zum Verständnis für meinen Wissenstand: ich hab in excel noch nie ein Modul verwendet und fürchte, dass die Aufgaben des Tages auch nicht viel Spielraum zur Weiterbildung lassen. Mein Job gibt mir die Freiheit, mal ne Stunde Access zu infiltrieren, aber dann bleibt halt etwas Anderes liegen...
Mittlerweile bedaure ich es zutiefst, nie die Gelegenheit bekommen zu haben, Access richtig zu lernen. Die Schnipsel, mit denen ich es zu tun bekomme, sind zwar höchst interessant, aber wenn ich mich hier durch die Beiträge wühle, sehe ich, dass ich in dieser Gemeinschaft völlig falsch bin.
Sorry, dass ich Eure Zeit stehle.
Hallo,
Zitataber wenn ich mich hier durch die Beiträge wühle, sehe ich, dass ich in dieser Gemeinschaft völlig falsch bin.
sorry, aber warum solltest Du hier falsch sein ?
Hier kriegt auch jeder Anfänger geholfen. Gelegentlich kann es vorkommen, dass manche Antworten als überheblich oder arrogant rüber kommen, aber das ist nur eine Momentaufnahme und geholfen wird dann doch immer.
Es ist auch wichtig, dass der Hilfesuchende vernünftig frägt, alle Gegebenheiten gleich schildert und auch immer vollständig antwortet.
Der Hilfesuchende sollte sich auch nicht dazu verleiten lassen Beispiele für seine Fragestellung zu erfinden die nichts mit der Realität zu tun haben. Das geht schief, weil vereinfachende Annahmen die Sache meistens komplizierter machen.
Wenn Du wirklich Access lernen willst, so suche Dir in Deiner heimischen Umgebung einen Anwendungsfall (Briefmarkensammlung, Adressenverwaltung etc.) und lege mal los. Hier wird Dir dann schon geholfen.
Als Einstieg kannst Du Dir mal
Diese Tutorial (https://www.access-tutorial.de/)
ansehen und durcharbeiten.
Danke Klaus, der Abend gehört dem Tutorial!
Hallo,
Obwohl ich hier jetzt wohl nichts mehr beizusteuern vermag, wollte ich mich
zumindest zurückmelden und mich bei den Regulars für ihren Einsatz bedanken.
gruss ekkehard
Danke, Ekkehard- auch Dir für Deine Mühe!