Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Recordset mit variabler Abfrage

Begonnen von AbsolutNeu, April 06, 2014, 17:50:28

⏪ vorheriges - nächstes ⏩

AbsolutNeu

Hallo zusammen,

ich beschäfte mich zur Zeit mit der Erstellung eines Terminkalenders.
Mein Formular hat 12 Tabs (pro Monat 1), jeder Tab hat pro Tag 1 Label für Tag Nummer und Tag Kürzel und ein Listenfeld für die Termine.

Meine derzeitige Version liest die Tabelle Termine (TerminAnfang, TerminEnde, Uhrzeit, Grund) in einen Recordset und prüft jeden Datensatz nacheinander, ob er im ausgewähltem(Formular) Jahr liegt und in welche Monate die Termine gehören.

Also alle Termine(auch Zeiträume) für das ausgewählte Jahr werden angezeigt.

Hinzu kommt noch die Berechnung der einzelnen Label für die Tageskürzel und die Größe der Listenfelder je nach Einträge (sollen ja alle sichtbarsein)

Das ist alles sehr Zeitaufwendig.

Meine Idee ist nun, je nachdem welcher Tab(also Monat) gerade ausgewählt wurde, dem Recordset eine Abfrage zuweisen, die als Kriterium den ausgewählten Monat hat und die auch berücksichtigt, das ein Zeitraum größer sein kann als ein Monat.

Als Anfänger würde ich jetzt einer Kombobox(unsichtbar) den Rowsource einer Abfrage mit den Kriterien zuweisen und dann den Inhalt dem recordset übergeben.
Aber ich denke es gibt noch eine elegantere Lösung oder?

Nach der Optimierung des Terminkalenders, würde ich ihn gerne so gestalten, das man dort Daueraufträge mit anzeigen lassen kann.

Wenn ich jetzt ein Datum habe und alle 3 Wochen dieser Dauerauftrag ausgeführt wird, wie kann ich sowas berechnen? Müßte ich die Termine zwischenspeichern?

Mfg
AbsolutNeu

MzKlMu

#1
Hallo,
Ich glaube hier musst Du noch mal von vorn anfangen.
Üblicherweise erfasst man Termine in einer Tabelle einfach fortlaufend. Je Termin ein Datensatz. Die Tagnummer und den Monat kann man aus dem Datum ermitteln. Für einen Dauerauftrag gibt man in ein Feld die Anzahl und den Abstand ein. Eine Anfügeabfrage hängt dann automatisch die entsprechende Anzahl an die Termintabelle an. Die spätere Darstellung über Formulare ist dann ein anderes Thema. Man beginnt eine Datenbank auch unabhängig von den Formularen.
Und jetzt bereits mit Recordsets zu arbeiten ist auch verfrüht. Wenn Du überhaupt so etwas benötigst.
Vorzugsweise arbeitet man mit gebunden Formularen und da erfolgt die Zuweisung automatisch.
In einem Formular würde man die Daten auf den gewünschten Zeitraum einfach filtern und anzeigen. Alles ohne (selbst angelegte) Recodsets.

Die Tabellenstruktur (das Datenmodell) orientiert sich nicht an den Formularen, sondern umgekehrt.

Erkläre mal den jetzigen Aufbau der DB. Welche Tabellen mit welchen Feldern und deren Beziehungen.
Gruß Klaus

AbsolutNeu

Hallo MzKlMu,

Danke für Deine Antwort.
ZitatDie Tabellenstruktur (das Datenmodell) orientiert sich nicht an den Formularen, sondern umgekehrt.
Das hat Peter mir auch schon gesagt :( Ich hoffe ich kriege irgendwann die Kurve ;D

Also ich habe eine Tabelle für die Termine.
ID  TerminAnfang     TerminEnde    Urzeit     Was

Am besten ich poste mal meine Datenbank. Damit man sieht wie es aussehen soll. Da ist noch ein Fehler drinne, es werden auch Daten in den anderen Jahren angezeigt. Im April werden mehrere Termine angezeigt.

Das ganze dauert natürlich, weil immer ein Jahr berücksichtigt wird.
Deshalb suche ich eine Möglichkeit, die Termine für einen ausgewählten Monat vorzufiltern. Die Farbgestaltung und Tagbennenung werde ich dann auch nur monatlich machen und nur wenn das Jahr geändert wurde.

Also wie könnte ich die Termine vorfiltern?

Mfg
AbsolutNeu

Ps.:Melde mich morgen erst wieder..

database

Hallo,

bitte mich nicht falsch zu verstehen, denn es ist sicher immer wieder interessant zu bemerken was man mit Access alles machen kann und es ist schön zu sehen, welche vielfältige Ideen dabei zu Tage gefördert werden  ::) ;)

Ich stelle aber jetzt dennoch die Frage:  :-[

Warum verwendest du nicht den Outlook-Kalender um deine Termine zu speichern?

AbsolutNeu

Hallo,

ZitatWarum verwendest du nicht den Outlook-Kalender um deine Termine zu speichern?

Mama hat gesagt, selbst gemacht ist immer (bei mir manchmal) besser! ;D

Mal im Ernst. Ich beschäftige mich noch nicht solange mit Access, das ich weiß, was richtig und was falsch ist oder wie ein Konzept auszusehen hat. Nach 2 Büchern und viel Internet habe ich minimale Grundkenntnisse.

Daher wollte ich erstmal klein anfangen und mir einen Kalender erstellen, indem ich Termine, Geburtstage und Fixkosten (Daueraufträge etc.) anzeigen lassen kann.
Was mir halt noch fehlt, ist, das ich einem Recordset eine Abfrage übergeben kann, die sich auf einen bestimmten Monat bezieht. Oder eine andere Lösung.

Ich hätte schon ganz gerne meinen Kalender und nicht Outlook. :(

Gibt es denn keine Lösung? Anderes Konzept?

Mfg
AbsolutNeu

MzKlMu

Hallo,
warum immer wieder Recordset, Du benötigst kein Recordset. Du benötigst eine Abfrage die filtert oder ein Formular das zunächst alle Datensätze anzeigt und dann per Button auf den gewünschten Monat filtert. Du muss auch auf das Jahr filtern, denn die Monate wiederholen sich jährlich.

Wie genau hast Du Dir jetzt die Anzeige der gefilterten Daten vorgestellt?
Gruß Klaus

MzKlMu

Hallo,
anbei mal ein einfaches Beispiel. Das Ganze hat gerade mal 13 Zeilen programmierter Code.

Diese eine Formular kann noch um das Anlegen von Daueraufträgen erweitert werden.
Außerdem lässt sich der Filter auch noch so ändern, dass man Monate ohne Jahr und Jahre ohne Monate filtern könnte.
Gruß Klaus

AbsolutNeu

Hallo,

So, nach dem kalt duschen gehts wieder.
Ich werde ein Formular nehmen, auf dem 12 Button je Monat sind(finde ich besser als Kombobox) mit 31 Listenfelder und eine Kombobox für die Jahreszahl.

Ich glaub, ich weiß, was Du meinst. Ich weise dem Formular eine Abfrage mit den Variablen Monat und Jahr zu, die den aktuellem Monat und Jahr entsprechen. Das wäre ja zu einfach oder?

Wenn dem so wäre, wäre es vielleicht gut, jedem Listenfeld so eine Abfrage mit zusätzlicher Tag Variablen zuzuweisen?

Wenn ich so eine Abfrage nehmen würde und mit between prüfen würde, ob der Tag in dem Zeitraum liegt, würde das auch gehen, wenn ich nur einen Tag Termin habe (also keinZeitraum)? Oder müßte ich in der Tabelle dann  den Tag Termin in beide Spalten(Termin Anfang und Termin Ende) speichern?

Mfg
AbsolutNeu

MzKlMu

Hallo,
was gefällt Dir denn an meinem Beispiel nicht, das hat doch alles was Du willst.
Gruß Klaus

AbsolutNeu

Hallo,

Ich würde gerne einen Terminkalender in Form eines Kalenderblattes erstellen.
So dass man mal eben ein Jahr durchblättern kann. Mit WochenTag und Wochendkennzeichnung.
Das wäre bei Dir auch eingeschränkt machbar, aber ich möchte halt jeden Tag angezeigt bekommen, ob Termin oder nicht. Bei Dir ist der Vorteil, das Du ein Endlosformular benutzt, so das man genug Termine anzeigen lassen kann, nur werde ich mit meinem Modell auch nicht an die Formulargrenzen stoßen, da ich nicht so viele Termine täglich habe.

Sorry, ich habe erst nach meinem Beitrag, Deine zweite Antwort gelesen. Hat sich wohl überschnitten. :-[

Ich werde mich erstmal über die Me.Filter Funktion / Eigenschaft informieren und mal mit der Datensatzquellzuweisung beim Formular und bei den Listenfeldern beschäftigen.

Mfg
AbsolutNeu

AbsolutNeu

Hallo nochmal,

gibt es eine Möglichkeit, mit einer Abfrage Datensätze zu filtern, bei denen sich ein bestimmter Tag oder Monat in einem Zeitraum befindet.

Also Zeitraum von  05.05.2014 bis 08.08.2014.

Und in der Abfrage dann:       Datensatz bei dem der 06.06.2014 im Zeitraum liegt.

Ich habe jetzt viel gesucht und nichts gefunden. Meistens werden Datensätze in einem bestimmten Zeitraum gesucht. Also genau umgekehrt.

Weiß jemand eine Lösung?

Mfg
AbsolutNeu

MzKlMu

Hallo,
dazu ist eine Hilfstabelle (Kalendertabelle) erforderlich die alle Tage eines ausreichenden Zeitraums umfasst, können auch 10 Jahre sein (ca. 3650 DS).
Mit einer Abfrage mit der Termintabelle und der Kalendertabelle mit einem RIGHT JOIN kannst Du Kalendertabelle und Termintabelle verbinden. Diese Abfrage kannst auf die beiden Grenzdatumsfelder filtern. Das Datum aus der Hilfstabelle zeigt dann alle Tage (Datumswerte) des Zeitraums.
Gruß Klaus

AbsolutNeu

Hallo,

ich werde versuchen, Deine Lösung in die Tat umzusetzen. Mit left und right habe ich noch nicht gearbeitet, aber das lässt sich nachlesen und prägt sich so besser ein, als würde man nur die Lösung präsentiert bekommen.

Deine Lösung mit dem Endlosformular werde ich zusätzlich nutzen, um zu sehen, welche Version besser ist bzw. welche Vor- und Nachteile jede Version hat.

Meine Version stelle ich aus reiner Neugier und aus Spass zu Ende.(hoffe ich ;D).

Also vielen Dank für Deine Bemühungen und Deine Lösungsvorschläge.

Ich setze vorerst den Beitrag noch nicht auf gelöst, falls doch noch Fragen auftauchen.

Mfg
AbsolutNeu

Ps.: Falls ich demnächst Fragen zu Outlook stelle, weißt Du warum! ;D

AbsolutNeu

So, da bin ich wieder,

die Hilfstabelle habe ich angelegt (01.01.2014 - 31.12.2025)

Ich benutze folgenden Code:
Private Sub Test_Click()
    Dim strSQL As String
        strSQL = "SELECT tbl_Kalendertage.Datum " & _
                 "FROM tbl_Kalendertage RIGHT JOIN tbl_Termine " & _
                 "Where tbl_Kalendertage.Datum Between '04.04.2014' and '10.05.2014'"
                 
         With Me.lstTag1_1
            .RowSource = ""
            .RowSource = strSQL
            .Requery
        End With
End Sub


Warum werden mir keine Daten angezeigt?
Und wenn mir dadurch nur die einzelnen Tage des Zeitraumes angezeigt werden, müsste ich doch die Abfrage für jeden Zeitraum starten und mit einer 2. Abfrage filtern, ob der Tag zu dem angezeigten Listenfeld passt? Oder?

Mein Ziel ist es ja, die Termine (auch Zeiträume) so zu filtern, das mir alle angezeigt werden, die in einem bestimmten Monat liegen bzw. der Terminanfang oder das Terminende in diesem Monat liegt bzw. wenn der Zeitraum größer als dieser Monat ist.

Oder noch besser wenn ein bestimmter Tag in einem Zeitraum liegt.

Mfg
AbsolutNeu

DF6GL

Hallo,


SQL und speziell Datumsvergleiche in der Where-Condition benötigen das USA- oder ISO-Datumsformat und keinen String mit irgendeinem "deutsch formatiertem Datum"..


"Where tbl_Kalendertage.[Datum] Between #04/04/2014# and #05/10/2014#"


oder

"Where tbl_Kalendertage.[Datum] Between #2014-04-04# and #2014-05-10#"


Wenn die Vergleichswerte "außerhalb" des SQL-String sich befinden, dann etwa so:

Dim datStart as Date, datEnde as Date
datStart = #04/04/2014#
datEnde=  #05/10/2014#
.
.
"Where tbl_Kalendertage.[Datum] Between " & Format(datStart,"\#yyyy-mm-dd\#")  & " And " & Format(datEnde,"\#yyyy-mm-dd\#") 


btw:  auf reservierte Wörter ("Datum")  als Feldnamen dringend verzichten!
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access