Kreuztabelle? (Access)

einSchelm, Mittwoch, 17. Januar 2018, 11:46 (vor 154 Tagen)

Grüß Euch!

Ich habe folgende Tabellen:
- eine Liste von Themen
- eine Liste von Mitarbeiter_innen

Ich möchte eine Möglichkeit schaffen, dass jede_r Mitarbeiter_in per Knopfdruck in einem Formular bestätigen kann, das Thema gelesen zu haben.

Es gibt derzeit ein Formular, in dem man das Thema (Titel) und einen dazugehörigen Text lesen kann.
Darunter befindet sich ein Command-Button "gelesen".

Dadurch könnte in etwa folgende Tabelle entstehen:
- für jedes Thema eine Zeile
- für jede_n Mitarbeiter_in eine Spalte
- in jeder Zelle ein Ja/Nein-Wert bzw. noch besser: nichts oder der Benutzername, desjenigern, der_die den Eintrag bestätigt hat.

Ein neuerliches Klicken zu einem späteren Zeitpunkt darf den ersten Wert (Benutzername) gern überschreiben.

Gut wäre, wenn später einfach mittels einer Abfrage dargestellt werden kann:
- zu einem bestimmten Thema: wer hat's gelesen und wer nicht?
- für einen bestimmten Zeitraum: alle Themen auflisten und anzeigen, wer sie jeweils gelesen hat und wer nicht?

Sehr gut wären noch folgende Abfrage-Möglichkeiten:
- für eine_n bestimmte_n Benutzer_in: welche Themen habe ich noch nicht gelesen?

Und geradezu hervorragend wäre:
- in der Abfrage, welche Themen ich als Benutzer_in noch nicht gelesen habe, eine Verknüpfung zu dem Datensatz im Formular, in dem ich ihn lesen und bestätigen kann.

Mir ist klar, dass das einige Dinge auf einmal sind.
Ich bin auch für Hinweise bezüglich einzelner Bausteine sehr dankbar und lese auch gern ausführliche Anleitungen durch, wenn man mir sagt, wonach ich suchen soll. Bisher habe ich noch keine Idee für einen Ansatz ...

Euch allen auf jeden Fall schon einmal vielen Dank und beste Grüße
einSchelm

Kreuztabelle?

Martin Asal @, Mittwoch, 17. Januar 2018, 11:53 (vor 154 Tagen) @ einSchelm

Mir ist klar, dass das einige Dinge auf einmal sind.

Eigentlich nur zwei:

Zunächst einmal brauchst du eine dritte Tabelle, in der gespeichert wird, wer was gelesen hat. Das geht in der Form einer n:m-Beziehung.

Anschließend geht es darum, das Ganze auszuwerten. Das geht über eine Kreuztabellenabfrage.

Martin

Kreuztabelle?

einSchelm, Mittwoch, 17. Januar 2018, 12:06 (vor 154 Tagen) @ Martin Asal

Vielen Dank für die rasche Antwort.
Sie hilft mir schon einmal weiter und bestätigt mich quasi in einer Fährte, der ich schon zu folgen versucht habe.

Verstehe ich es richtig:
Es gibt eine Tabelle (z.B. tblgelesen).
Diese enthält als Felder lngThema, lngMA und txtBenutzer.

Bei Click auf den Command-Button "gelesen" sollte ein Datensatz in dieser Tabelle mit den jeweils gerade zutreffenden Daten erstellt werden.
Wenn ein Datensatz besteht bzw. das Feld txtBenutzer einen Wert enthält, dann gilt das Thema als von diesem Benutzer gelesen.

Wie lautet ein Makro (bzw. wo kann ich danach suchen), welches diesen neuen Datensatz erstellt und mit den entsprechenden Einträgen versieht?

noch einmal danke und beste Grüße
einSchelm

Kreuztabelle?

Martin Asal @, Mittwoch, 17. Januar 2018, 14:11 (vor 154 Tagen) @ einSchelm

Es gibt eine Tabelle (z.B. tblgelesen).
Diese enthält als Felder lngThema, lngMA und txtBenutzer.

Ich weiß nicht, was du im Feld "txtBenutzer" speichern willst - hoffentlich nicht den Benutzernamen, denn das wäre ein Verstoß gegen die dritte Normalform. Ich würde z.B. ein Datumsfeld anlegen, in dem man eingeben kann, wann das Thema gelesen wurde.

Wie lautet ein Makro (bzw. wo kann ich danach suchen), welches diesen neuen Datensatz erstellt und mit den entsprechenden Einträgen versieht?

Du brauchst kein Makro, sondern ein Unterformular.

Am Besten, du arbeitest das Access-Tutorial mal komplett durch, dann wird dir das hoffentlich klar.

Martin

Kreuztabelle?

einSchelm, Freitag, 19. Januar 2018, 13:54 (vor 152 Tagen) @ Martin Asal

Grüß Dich!

Vielen herzlichen Dank für Deine bisherige Hilfe. Sie hat mich bereits wesentlich weiter gebracht.
(Bei der Gelegenheit auch danke für das Tutorial insgesamt, das ich schon durchgearbeitet hatte und ebenfalls als sehr hilfreich für den ersten Einstieg in Datenbanken bzw. Access empfunden habe. Aber in der Praxis ist die Praxis dann doch oft irgendwie sperriger als die Theorie ... :-) Danke!)

Ich habe nun ein Formular, in dem ich mich durch die Datensätze der tblThemen blättern kann.
In diesem Formular habe ich ein Unterformular, das zum angezeigten Thema den dazupassenden Datensatz der tblgelesen (MitarbeiterIn, Datum und BenutzerIn).
MitarbeiterIn ist ein Auswahlfeld für die angelegten MitarbeiterInnen, Datum wird automatisch mit dem aktuellen Datum befüllt und BenutzerIn wird automatisch mit dem angemeldeten Windows-User befüllt.
Eine Befehlsschaltfläche "gelesen" speichert den Datensatz in der Tabelle tblgelesen ab.

All das finde ich schon einmal ziemlich gut! :-)

Nun rätsle ich aktuell vor allem über zwei Dinge:

1.
Über die Kopplung des Unterformulars mit dem Thema des Hauptformulars wird immer wieder der gleiche Datensatz überschrieben, d.h. es wird quasi nur der_die letzte Mitarbeiter_in, der_die das gelesen hat, protokolliert. Schön wäre aber natürlich, wenn für jede_n Mitarbeiter_in ein eigener Datensatz zu jedem Thema erstellt wird. Der darf dann beim nächsten Lesen des_der gleichen Mitarbeiter_in gern mit dem neuen Datum überschrieben werden.

2.
Es gelingt mit nicht, den User-Namen (der im Unterformular zu sehen ist) in die tblgelesen einzutragen. Auffällig ist, dass ich für das Feld, das den Usernamen enthält, das korrespondierende Feld der tblgelesen nicht als "Steuerelementinhalt" auswählen kann.
(In einer anderen Tabelle, die Änderungen protokolliert, kann ich das aber schon.)

Ich hoffe, es ist mir gelungen, die Fragen verständlich zu formulieren und bin für jedwede Hilfe sehr dankbar!

liebe Grüße
Martin

Kreuztabelle?

Martin Asal @, Samstag, 20. Januar 2018, 13:05 (vor 151 Tagen) @ einSchelm

Ich hoffe, es ist mir gelungen, die Fragen verständlich zu formulieren

sorry, nein :-D

Fassen wir zusammen. du hast jetzt 3 Tabellen:

tblThemen
---------
IDThema
txtThema

tblUser
-------
IDUser
txtName

tblGelesen
----------
lngThema
lngUser
datGelesenAm

Die Beziehungen sind klar?

Wenn du manuell in die Tabellen einträgst, ist schon mal alles möglich, wie es sein sollte. Nun kommt die Umsetzung der Formulare. Derzeit hast du ein Hauptformular für die Themen, mit einem Unterformular, das dir die User anzeigt und in das du eintragen kannst, wenn ein weiterer User das Thema gelesen hast. Oder nicht?

Wenn diese Sache läuft, wirst du wohl noch ein weiteres Hauptformular erstellen müssen, das die User anzeigt, mit einem UFO, das zeigt, welche Theman er schon gelesen hat. Aber das kommt später.

Martin

Kreuztabelle?

einSchelm, Samstag, 20. Januar 2018, 16:40 (vor 151 Tagen) @ Martin Asal

Jawoll, ich habe diese drei Tabellen. Sie enthalten die Felder, die Du aufgelistet hast, und ich denke, dass ich die Beziehungen richtig verstanden und angelegt habe. Sie scheinen zu funktionieren. In den reinen Tabellen klappt auch alles.

Im Formular kann man sich durch die Themen blättern.
Im Unterformular werden die Daten der tblgelesen angezeigt, die zum Datensatz mit dem Thema (IDThema) gehören.
Im Unterformular kann ich dann den Mitarbeiter auswählen, der Rest wird automatisch befüllt.
Die Befehlsschaltfläche "gelesen" trägt diese Daten in diesen Datensatz (jenen, der auch IDThema anthält) ein.
Das heißt, wenn ein neuer Mitarbeiter das tut (lesen und auf "gelesen" clicken), werden seine Daten (sein Name, das neue Datum) in den gleichen Datensatz eingetragen. Eigentlich möchte ich ja aber, dass für den neuen Mitarbeiter ein neuer Datensatz zum gleichen Thema angelegt wird (aber kein neuer Datensatz angelegt wird, wenn er das gleiche Thema noch einmal liest).

Datenherkunft für das Hauptformular ist die tblThema, für das Unterformular ist es die tblgelesen.

Hm ...

(genau: Die Anzeige der Themen nach Mitarbeiter_innen hat wirklich noch Zeit ...)

Vielen Dank und liebe Grüße
Martin

Kreuztabelle?

Martin Asal @, Samstag, 20. Januar 2018, 17:54 (vor 151 Tagen) @ einSchelm

Schau dir zu n:m-Beziehungen insbesondere den letzten Absatz nochmal genau an: Da wird erklärt, wie verhindert wird, dass mehrfach eine n:m-Beziehung zwischen zwei Datensätzen aufgebaut wird.

Ich weiß nicht, was dein Button genau macht, aber ich selbst löse so etwas normalerweise, indem ich im UFO ein Kombifeld nutze. Man könnte also dort den Mitaarbeiter auswählen (der Name wird im Kombifeld angezeigt, eiingetragen wird dessen ID).

Zusätzlich kannst du für das Unterformular noch ein paar interessante Einstellungen vornehmen: Im Reiter "Daten" könntest du "Anfügen zulassen" auf Ja, aber "Bearbeitungen zulassen" auf Nein stellen. Dann kann man einen Datensatz nicht mehr ändern, wenn er erst mal eingegeben ist. Zumindest im Formular.

Martin

Kreuztabelle?

PhilS ⌂, Mittwoch, 17. Januar 2018, 11:57 (vor 154 Tagen) @ einSchelm

Dadurch könnte in etwa folgende Tabelle entstehen:
- für jedes Thema eine Zeile
- für jede_n Mitarbeiter_in eine Spalte

Nein.
Je eine Spalte
- DokumentId
- MitarbeiterId
- Datum_Gelesen (optional)

Der Sachverhalt, dass ein Dokument gelesen wurde, wird durch den Datensatz in der Tabelle dokumentiert. - Klassische M-zu-N-Tabelle.

Die Kreuztabellendarstellung kannst du dann durch eine Abfrage erreichen.

1. Grundregel Datenbankdesign: Tabellen haben eine feste Breite (Spaltenanzahl). Damit fällt eine Spalte pro Mitarbeiter aus.

RSS-Feed dieser Diskussion
powered by my little forum