Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Sam am Januar 12, 2016, 10:02:06

Titel: Alternative zu Kreuztabelle
Beitrag von: Sam am Januar 12, 2016, 10:02:06
Hallo zusammen

ich habe es geschafft, dass die Ansicht in einer Kreuztabelle so ist, wie ich sie für die bearbeitung haben möchte. Leider lassen sich Kreuztabellen ja nicht bearbeiten.

In der ersten Spalte steht das Datum (Anzahl Tage muss flexibel sein) In den nächsten Spalten (für jeden Mitarbeiter eine Spalte) ist ein Wert eingetragen. Jeder Wert ist ein eigener Datensatz.

Gibt es entweder die Möglichkeit einen markierten Datensatz aus der Kreutztabelle zu ermitteln oder eine andere Form der Darstellung einer Kreuztabelle? Ich habe es bereits mit mehreren Unterformularen (für jeden MA eines) probiert, das sieht aber schrecklich aus, und da so viele unnötige Elemente angezeigt werden. Und das synchron scrollen funktioniert auch nur so halbwegs.

Hat jemand noch einen guten Tipp?

Sam

Titel: Re: Alternative zu Kreuztabelle
Beitrag von: DF6GL am Januar 12, 2016, 10:22:02
Hallo,

eine Kreuztabelle erscheint nun mal so wie sie ist...  Allenfalls sind die Zeilenüberschriften zu beeinflussen, editierbar sind die angezeigten Daten aber auf keinen Fall.
Zitat
"Jeder Wert ist ein eigener Datensatz."


Meinst Du das wirklich so? Von Datensätzen kann man hier nicht reden, derweil die Werte die  Berechnungen aus den eigentlichen Tabellen-Datensätzen darstellen.

Zitateinen markierten Datensatz aus der Kreuztabelle zu ermitteln


Es kann der angeklickte Wert aus der Kopfzeile (Spalten-Überschrift) oder aus der Zeilen-Überschrift als Kriterium in einer Abfrage dazu benutzt werden, die dazugehörenden Tabellen-Datensätze zu ermitteln.

Titel: Re: Alternative zu Kreuztabelle
Beitrag von: Sam am Januar 12, 2016, 10:33:06
Ja das meine ich so. Ich habe eine Tabelle mit den Personen und eine Tabelle mit den Daten. Das gibt in der "Schicht"-Tabelle pro Person und Tag eine neue ID. Da sind zusätzliche Felder für die Schichtdetails vorhanden. (Start/Ende/Tätigkeit). Somit pro Schicht ein Datensatz.
Zitat von: DF6GL am Januar 12, 2016, 10:22:02
Es kann der angeklickte Wert aus der Kopfzeile (Spalten-Überschrift) oder aus der Zeilen-Überschrift als Kriterium in einer Abfrage dazu benutzt werden, die dazugehörenden Tabellen-Datensätze zu ermitteln.

Das könnte sein was ich suche, da jedes Feld in der Kreuztabelle eindeutig ist könnte ich so wahrscheinlich den zu Bearbeitenden Datensatz ermitteln. Wie stell ich das denn an?
LG
Titel: Re: Alternative zu Kreuztabelle
Beitrag von: DF6GL am Januar 12, 2016, 10:53:12
Hallo,

hab ich doch erzählt....

Falls Du noch keines hast, erstell ein Endlosform auf Basis der Kreuztabellenabfrage und ein Formular auf Basis der Schicht-Tabelle ("frmSchicht").

Die Doppelklick-Ereignisprozedur für ein Feld aus der Zeilen- oder Spalten-Überschrift könnte etwa so aussehen ( Klick auf ein Datum (linkes Feld in einer Zeile)  )

Sub  Datum_dblClick()
Docmd.Openform "frmSchicht" ,,,"[Datum] = " & Format (Me![Datum],"\#yyyy-mm-dd\#")
End Sub
Titel: Re: Alternative zu Kreuztabelle
Beitrag von: Sam am Januar 12, 2016, 11:35:20
Was ist denn der Vorteil vom Endlosformular gegenüber der Datenblattansicht?

Merci für den Input, so öffne ich jede Schicht einzeln. Da ich mich nicht klar ausgedrückt habe, ergänze ich noch. Ich habe für jede häufig genutzte Schicht einen Button gemacht, der mir dann die Werte eintragen soll. Da die Planung mit möglichst wenig Klicks gemacht werden soll. Mit einzelnen Unterforms habe ich das auch hingekriegt, aber in der Kreuztabelle kann ich die Werte nicht auslesen. Kann ich bei einem Klick auf das Feld "Mitarbeiter2" am "03.03.16" ermitteln, dass ich genau dieses Feld angeklickt habe? Ohne noch etwas für eine Eingabe zu öffnen.
Titel: Re: Alternative zu Kreuztabelle
Beitrag von: DF6GL am Januar 12, 2016, 12:32:00
Hallo,

ich versteh das nicht, oder Du insgesamt falsch..


ZitatWas ist denn der Vorteil vom Endlosformular gegenüber der Datenblattansicht?

Einen Vorteil siehst Du im Folgenden....(Ereignisse, Ereignisprozeduren, Formatierungen, Layout)

Grundsätzlich sollten (bei einer relationalen Datenbank) NICHT in Tabellen(ansichten) irgendwelche Werte editiert oder anderweitig verändert werden.  Das kann bei in Beziehung zueinander stehenden Tabellen schnell ins Auge gehen.

Ein Feld in einer Kreuztabelle (ob in Spaltenüberschrift (oberste Zeile) oder der Zeilenüberschrift (linke Spalte) ) definiert nicht einen einzelnen Datensatz in der Tabelle, sondern alle diejenigen, bei denen dieser Wert in der Tabelle auftaucht. Wenn links als ein Datumswert steht, dann "definiert" dieser Wert alle DS in der Tabelle, die auch dieses Datum aufweisen. Damit ist dieser Wert kein Kriterium für einen bestimmten DS , nur für die Gruppe der Datensätze, die eben dieses Datum enthalten.

Die restlichen Felder in der KT zeigen berechnete Werte (habe jetzt keine Kenntnis, welche das jetzt sind und was da angezeigt wird. ("In den nächsten Spalten (für jeden Mitarbeiter eine Spalte) ist ein Wert eingetragen.") .

Am Besten zeigst Du mal den SQL-String der KT-Abfrage...


ZitatDa die Planung mit möglichst wenig Klicks gemacht werden soll.quote]

Das geht nun mal nicht mit einer KT-Abfrage-Ansicht....

Zitataber in der Kreuztabelle kann ich die Werte nicht auslesen

Dann berechne die Werte halt per Fuß (per VBA, z. B. mit Dcount oder Dsum)


ZitatKann ich bei einem Klick auf das Feld "Mitarbeiter2" am "03.03.16" ermitteln, dass ich genau dieses Feld angeklickt habe?


Du musst erst ermitteln, wie das Feld im (Endlos-) Form denn nun heißt.  Schreib in jedes der "Werte"-Felder in dessen Doppelklick-Eigenschaft die folgende Prozedur:

Sub ctlWerteFeld_DblClick()
Docmd.Openform "frmSchicht",,,"[Datum] = " & Format (Me![Datum],"\#yyyy-mm-dd\#") & " and MAID =" & Dlookup("MAID","tblMitarbeiter","Mitarbeitername='" & Screen.ActiveControl.Name & "'")
End Sub
Titel: Re: Alternative zu Kreuztabelle
Beitrag von: Sam am Januar 12, 2016, 14:18:11
Zitat von: DF6GL am Januar 12, 2016, 12:32:00
Hallo,

ich versteh das nicht, oder Du insgesamt falsch..

Das ist gut möglich. Mein Ziel ist es für die Planung eine Tabellenartige Ansicht zu haben (Spalten=Personen und Zeilen=Datum) den gewählten Tag/MA mit einem Klick eine Schicht einzutragen. Dabei soll die angezeigte Planungsperiode flexibel sein, denn ein Teil muss für 3 Monate und ein teil für 2 Monate planbar sein.

ZitatWas ist denn der Vorteil vom Endlosformular gegenüber der Datenblattansicht?

Einen Vorteil siehst Du im Folgenden....(Ereignisse, Ereignisprozeduren, Formatierungen, Layout)

DA muss ich noch schauen was Sinn macht, denn es wäre noch cool die Wochenenden einzufärben.


ZitatDa die Planung mit möglichst wenig Klicks gemacht werden soll.quote]

Das geht nun mal nicht mit einer KT-Abfrage-Ansicht....

Zitataber in der Kreuztabelle kann ich die Werte nicht auslesen

Dann berechne die Werte halt per Fuß (per VBA, z. B. mit Dcount oder Dsum)


ZitatKann ich bei einem Klick auf das Feld "Mitarbeiter2" am "03.03.16" ermitteln, dass ich genau dieses Feld angeklickt habe?


Du musst erst ermitteln, wie das Feld im (Endlos-) Form denn nun heißt.  Schreib in jedes der "Werte"-Felder in dessen Doppelklick-Eigenschaft die folgende Prozedur:

Sub ctlWerteFeld_DblClick()
Docmd.Openform "frmSchicht",,,"[Datum] = " & Format (Me![Datum],"\#yyyy-mm-dd\#") & " and MAID =" & Dlookup("MAID","tblMitarbeiter","Mitarbeitername='" & Screen.ActiveControl.Name & "'")
End Sub



Mein SQL Code für die Abfrage ist:
TRANSFORM Min(Touren.Schichtart) AS MinvonSchichtart
SELECT Kalender.Datum
FROM ((Touren RIGHT JOIN Schichten ON Touren.ID = Schichten.SchichtID) INNER JOIN Personen ON Schichten.PersonID = Personen.ID) LEFT JOIN Kalender ON Schichten.DatumID = Kalender.ID
WHERE (((Kalender.Datum)>=#1/1/2016# And (Kalender.Datum)<#2/1/2016#))
GROUP BY Kalender.Datum
PIVOT Personen.[ganzer Name];


Zum testen habe ich die Daten auf einen Monat beschränkt.
Da an jedem Datum jeder Mitarbeiter nur einen Schicht haben kann, ist so jede "Zelle" in der Datenblattansicht der Kreuztabelle eindeutig. Ich habe es geschafft, den Namen der Spalte (Person) und die Zeile (Datum) so zu ermitteln, dass ich den Datensatz mit Hilfe von einigen DLookups ermitteln kann. Finde ich zwar etwas umständlich, aber es geht.  Da wir nur 15 Mitarbeiter sind, hält sich der Aufwand in Grenzen für jeden MA einzeln die IDs rauszusuchen.