MS-Office-Forum

MS-Office-Forum (https://www.ms-office-forum.net/forum/index.php)
-   Microsoft Access (https://www.ms-office-forum.net/forum/forumdisplay.php?f=60)
-   -   Hierarchisch gegliedertes Listenfeld aus Datumspalte (Jahr -> Monat -> Tage) (https://www.ms-office-forum.net/forum/showthread.php?t=347938)

Chris97724 07.12.2017 09:37

Hierarchisch gegliedertes Listenfeld aus Datumspalte (Jahr -> Monat -> Tage)
 
Sehr geehrtes Forum,

ich habe gerade eine Problemstellung die ich bisher nicht vollends lösen konnte:

Grundlage ist eine Tabelle, welche mit der Zeit mit Datensätzen gefüllt wird (täglich). Diese Tabelle enthält eine Spalte "Datum".

Ich habe ein Formular erstellt, welche die Navigation durch die Datenbank gewährleistet. Hier möchte ich auch über ein Listenfeld anzeigen lassen, welches Datum bereits importiert wurde.

Wie ich das mit einem Listenfeld realisiere, hat schon funktioniert. Habe einfach eine SELECT DISTINCT Abfrage erstellt und diese mit dem Listenfeld verknüpft. Da aber ein Jahr sehr viele Tage hat und mit der Zeit auch mehrere Jahre in der Datenbank enthalten sein warden, würde dieses Listenfeld sehr übersichtlich warden.

Meine Idee: Eine Art "hierarchisches" Listenfeld.

Man klickt z. B. aufs Jahr 2017, dann poppen die importierten Monate eine spalte rechts daneben auf, klickt man dann einen Monat an, so poppen die importierten Tage des Monats auf. Das ware dann quasi ein dreispaltiges Listenfeld.

Ist sowas realisierbar?

Würde mich sehr über eine kurze Hilfestellung freuen.
#

VG Christian

gpswanderer 07.12.2017 09:39

Hallo,
suche mal nach abhängigen Kombinationsfeldern, da findest Du jede Menge.Das gilt sinngemäß auch für Listenfelder.

ebs17 07.12.2017 11:21

Meine Empfehlung wäre: Nutze einfache Datenbanktechnik = einen Filter. Das Programmieren von Abhängigkeiten kannst Du Dir für höhere Aufgaben aufsparen.

Filter über Monate, Jahre usw. sind Zeitraumfilter, sprich Du kannst zu gewünschten und beliebigen Zeiträumen kommen, wenn Du deine Datumswerte in solcher Form filterst:
Code:

SELECT DISTINCT Datumswert
FROM TabelleX
WHERE Datumswert BETWEEN [von] AND [bis]


markusxy 07.12.2017 11:36

du brauchst dazu wohl drei Listenfelder oder Comboboxen, die von einander abhängig sind. Und zum Filtern, dann die Abfragen.

Also die Infos von Eberhard und Klaus zusammennehmen und schon kommst du ans Ziel.

LG M

Chris97724 07.12.2017 11:42

Hi zusammen,

danke für die Rückmeldung. Ich muss sagen, die Kombination aus den drei Antworten von euch, hat mich jetzt noch mehr verwirrt. Brauch ich jetzt noch die 3 Kombinationsfelder oder eher nicht? Spalte 1 soll mir halt z. b. aus den ganzen "Datums" aus der Tabelle die Jahre anzeigen (2016, 2017), wenn ich dann auf 2017 klicke z. B. (Januar, Dezember) und wenn ich auf Dezember klicke die einzelnen Tage. das soll quasi nur eine Art Anzeige sein das der Nutzer der Datenbank weis, welche Daten schon im Archiv sind und er somit nicht noch ein zweites mal mehr importieren muss.

markusxy 07.12.2017 11:49

Für Jahr, Monat, Tag brauchst du jeweils entweder eine Combobox oder ein Listenfeld. Was du nimmst ist reine Geschmackssache.


LG M

el_gomero 07.12.2017 11:52

Moin,

für die Variante von Eberhard brauchst du nur 2 Felder zur Übergabe von ab und bis Datumswert.

Chris97724 07.12.2017 12:27

Hi zusammen ;)

wenn das richtig sehe ist doch der Teil
Code:

WHERE Datum BETWEEN [von] and [bis]
eine Parameterabfrage die Eingaben von mir erfordert. Aktuell zeigt er mir auch nicht das Jahr an sondern immer das komplette Datum und nicht nur das Jahr. Das zweite Listenfeld müsste ja quasi alle Monate innerhalb eines Jahres anzeigen. Also irgendwie steh ich auf dem Schlauch

el_gomero 07.12.2017 12:36

die von bis Variante verlangt ein komplettes Datum in den beiden Feldern. Der Where-Teil könnte auch für einen Formular-)Filter herangezogen werden.

markusxy 07.12.2017 13:02

Um das Datum richtig anzuzeigen, kannst du mit den Funktionen Format/DatePart arbeiten.

Select DatePart('yyyy', Datum)

Um zu filtern musst du mittels Dateserial z.B. auf ein Jahr filtern
Start = DateSerial(jahr,1,1) bis Dateserial(jahr,12,31)
Für einen Monat DateSerial(jahr,Monat,1) bis DateSerial(jahr,monat + 1,1)-1
Schau dir die Funktionen in der Hilfe an, da finden sicher Erklärungen + Beispiele.

Chris97724 08.12.2017 10:32

Hi nochmal (wenn auch etwas verspätet),

ich habe das jetzt mal probiert, versteh nur leider nicht genau was ich machen soll. Ich hab mich jetzt selbst etwas durchgehangelt, aber auch das funktioniert nicht so ganz. Ich versuch es mal zu beschreiben:

Das erste Listenfeld zeigt mein Jahr an (liste19). Das klappt auch soweit. Das Listenfeld habe ich mit einer Abfrage hinterlegt die folgenden Code enthält:

Code:

SELECT DISTINCT Year(Datum) AS [Year]
FROM Datenarchiv
ORDER BY Year(Datum);

Das zweite Listenfeld (Liste21) habe ich mit einer weiteren Abfrage hinterlegt, die folgenden Code enthält:

Code:

SELECT DISTINCT Month(Datum) AS [Month]
FROM Datenarchiv
WHERE Month = Liste19;

Damit soll jetzt realisiert werden, dass das zweite Listenfeld nur die Monate aus dem Jahr anzeigt, welches zuvor in Liste19 ausgewählt wurde.

Hierzu habe ich im ersten Listenfeld noch das Ereignis "Nach Aktualisierung" ausgewählt und folgenden Code hinterlegt:

Code:

Private Sub Liste19_AfterUpdate()
Liste21.Requery
End Sub

Geht leider auch nicht. Ich komm bei Eurer Lösung gar nicht drauf was ich da machen soll. Leider fehlt mir da hierzu zu detailliertes Access-Wissen. Meine Lösung hab ich mir selbst erarbeitet, funktioniert leider auch nicht so ganz.

Hat jemand noch eine zündende Idee für mich wo ich als Halb-Laie nicht ganz am verzweifeln bin? Soll jetzt nicht negativ rüberkommen, war echt super das ihr euch bemüht habt. Ich bin nur leider zu doof dafür das zu verstehen.

el_gomero 08.12.2017 11:26

Moinsen,

in #3 hat Eberhard dir eine einfache Möglichkeit aufgezeigt.

Warum willst du jetzt mit Gewalt eine Lösung umsetzen, für die deine bisherigen Kenntnisse nicht ausreichen?

Chris97724 08.12.2017 11:34

Zitat:

von el_gomero (Beitrag 1843447)
Moinsen,

in #3 hat Eberhard dir eine einfache Möglichkeit aufgezeigt.

Warum willst du jetzt mit Gewalt eine Lösung umsetzen, für die deine bisherigen Kenntnisse nicht ausreichen?

Ich konnte mit der Lösung aus #3 leider erstmal nichts anfangen. Muss ich den SQL-Code dann quasi in einem Listenfeld hinterlegen?

ebs17 08.12.2017 11:53

Zitat:

Habe einfach eine SELECT DISTINCT Abfrage erstellt und diese mit dem Listenfeld verknüpft.
Das verursachte irgendwie den Gedanken, Du könntest mit Abfragen / SQL-Anweisungen etwas anfangen und folglich eine zusätzliche Idee integrieren.

Chris97724 08.12.2017 11:59

Zitat:

von ebs17 (Beitrag 1843457)
Das verursachte irgendwie den Gedanken, Du könntest mit Abfragen / SQL-Anweisungen etwas anfangen und folglich eine zusätzliche Idee integrieren.

Ich kann damit in begrenztem Umfang schon etwas anfangen. Wo ich aktuell nur die Probleme habe ist das mit den verschiedenen Listenfeldern.

Was ich an Deinem Code aus #3 nicht verstehe ist das mit dem BETWEEN. Da poppen bei mir immer Fenster auf (was ich erwartet habe) und es wird eine Eingabe erforderlich. Das war aber nicht das was ich erreichen wollte, sondern eine Listenfeld-/Kombifeld-Darstellung wo ich schnell sehen kann, was sich bereits in der Tabelle für Zeiträume befinden, ohne der Erforderlichkeit manueller Eingaben.

Eventuell reden wir auch total aneinander vorbei. Wenn ich mich etwas unglücklich ausgedrückt haben sollte ist das natürlich ein Fehler von mir.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:40 Uhr.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.