Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: AbsolutNeu am April 06, 2014, 17:50:28

Titel: Recordset mit variabler Abfrage
Beitrag von: AbsolutNeu am April 06, 2014, 17:50:28
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
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: MzKlMu am April 06, 2014, 19:52:49
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.
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: AbsolutNeu am April 07, 2014, 20:03:54
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..
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: database am April 07, 2014, 20:25:57
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?
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: AbsolutNeu am April 08, 2014, 18:49:20
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
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: MzKlMu am April 08, 2014, 19:04:12
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?
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: MzKlMu am April 08, 2014, 19:43:21
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.
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: AbsolutNeu am April 08, 2014, 20:08:50
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
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: MzKlMu am April 08, 2014, 20:13:39
Hallo,
was gefällt Dir denn an meinem Beispiel nicht, das hat doch alles was Du willst.
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: AbsolutNeu am April 09, 2014, 16:51:10
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
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: AbsolutNeu am April 09, 2014, 20:02:29
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
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: MzKlMu am April 09, 2014, 20:15:49
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.
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: AbsolutNeu am April 10, 2014, 19:14:13
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
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: AbsolutNeu am April 13, 2014, 15:50:12
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
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: DF6GL am April 13, 2014, 16:40:53
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!
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: MzKlMu am April 13, 2014, 16:42:00
Hallo,
" WHERE tbl_Kalendertage.Datum>=#4/4/2014# And tbl_Kalendertage.Datum<=#5/10/2014#"ein Datum muss in den Gartenzaun (#) eingeschlossen werden.
Außerdem sind wegen Indexnutzung die Operatoren >= und <= vorzuziehen.
Das Requery ist überflüssig, die Zuweisung von strSQL löst automatisch auch ein Requery aus.

Beim Datumsvergleich ist noch zu beachten, dass das Datum vor Übergabe umgeformt werden muss wenn das Datum zum Vergleich aus Formularfeldern kommt.
Es muss entweder nach ISO (JJJJ/MM/TT) oder im US Format (MM/TT/JJJJ) übergeben werden. Suche mal nach SQL Datum.
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: database am April 13, 2014, 17:13:49
Hallo,

ZitatEs muss entweder nach IS (JJJJ/MM/TT) oder im US Format (MM/TT/JJJJ) übergeben werden.

sieh dazu auch:

http://www.donkarl.com?FAQ6.8 (http://www.donkarl.com?FAQ6.8)

Titel: Re: Recordset mit variabler Abfrage
Beitrag von: AbsolutNeu am April 13, 2014, 17:56:16
Hallo zusammen,

vielen Dank für eure Antworten.

Das mit dem Datumsformat hätte mir eigentlich nicht passieren dürfen, da ich ja eine Funktion für die Umwandlung in ein SQL gerechtes Datum habe.  ::)

Die Erstellung der Hilftabelle war aus einem Beispiel, was ich so übernommen habe und leider die Namensgebung nicht beachtet habe.

Jetzt habe ich den SQL String geändert:
        strSQL = "SELECT tbl_Kalendertage.kalDatum " & _
                    "FROM tbl_Kalendertage RIGHT JOIN tbl_Termine " & _
                    "WHERE tbl_Kalendertage.kalDatum >= #04/04/2014# AND tbl_Kalendertage.kalDatum <= #05/10/2014#"


bei einem Listenfeld mit Datensatzherkunft Tabelle/Abfrage passiert nichts.
bei einem Kombinationsfeld mit Datensatzherkunft Tabelle/Abfrage kommt die Fehlermeldung Syntaxfehler in der FROM Klausel!

Ist die Syntax der SQL Anweisung nicht richtig? Und kann es sein, das der Abfrage Entwurf nicht mit right join zurecht kommt?

Mfg
AbsolutNeu
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: MzKlMu am April 13, 2014, 18:06:18
Hallo,
die SQL Abfrage ist ja auch nicht vollständig. Ein Join erfordert ja 2 Schlüsselfelder und Du hast keines im Join. Das heißt der ON Teil fehlt bei Dir vollständig.

SELECT KalDatum, TermDatum
FROM  tbl_Kalendertage
RIGHT JOIN tbl_Termine
ON  tbl_Kalendertage.KalDatum = tbl_Termine.TermDatum
WHERE KalDatum >= #04/04/2014#
AND KalDatum <= #05/10/2014#"


Das ist jetzt der reine SQL Text, ohne Zuweisung als String.
Außer im ON Teil kannst Du die Tabellennamen weglassen, vorausgesetzt es gibt keine gleichen Feldnamen in unterschiedlichen Tabellen. Was auch sonst von Vorteil ist.

Warum klickst Du die Abfragen nicht einfach im Abfrageentwurf (nicht in der SQL Ansicht) zusammen? Dann hast Du die richtige Syntax. Solche einfachen Abfragen kann man immer im Entwurf machen. Da wäre dann der ON Teil drin.
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: AbsolutNeu am April 13, 2014, 18:51:06
Hallo,

in der Tabelle Termine habe ich TerminAnfang und TerminEnde.
Also habe ich kein konkretes Schlüsselfeld oder 3 wenn ich beide in die On Klausel nehmen soll.

Bei einfachen Auswahl - Abfragen geht das mit dem Entwurfsmodus aber mit Join Abfragen ist das noch Neuland für mich,sorry :(

Mfg
AbsolutNeu
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: DF6GL am April 13, 2014, 19:30:45
Hallo,

was steht denn in KalDatum bzw. TermDatum drin? Datum mit Uhrzeit, oder nur Datum oder nur Uhrzeit?


Im Fall von Datum mit Uhrzeit könnte die Verjoinung so lauten:

ON  Int(tbl_Kalendertage.KalDatum) = Int(tbl_Termine.TermDatum)
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: AbsolutNeu am April 14, 2014, 17:06:31
Hallo nochmal,

gestern bin ich auf die Idee gekommen, die Datumswerte der Zeiträume (berechnet) als Double Werte mit abzuspeichern, um einen Wertebereich zubekommen. Dann habe ich die Abfrage mit der Bedingung gestellt, das der Zeitraum Startwert kleiner gleich dem des gewollten Tages(auch in double umgerechnet) ist und der Zeitraum Endwert größer gleich ist. Siehe da, es werden mir alle Termine angezeigt, die ich an diesem Tag habe, auch die , die vorher angefangen haben bzw. später enden. Termine außerhalb des Tages werden nicht angezeigt.

Dann habe ich die Double Werte durch ein SQL Datum ersetzt und es funktioniert ohne Hilfstabelle.

Meine letzte Frage noch,
was geht schneller, eine Schleife, die jeden Tag (1 Listenfeld) eine Abfrage zuweist, also 30 oder 31 Abfragen. Oder die Termine pro Monat filtern und die paar Datensätze per Recordset zuzuweisen.

Ich schätze mal 2 Termine pro Tag werden es. Selten mehr, öfter weniger.

Mfg
AbsoultNeu
Titel: Re: Recordset mit variabler Abfrage
Beitrag von: MzKlMu am April 14, 2014, 17:12:25
Hallo,
Zitatgestern bin ich auf die Idee gekommen, die Datumswerte der Zeiträume (berechnet) als Double Werte mit abzuspeichern,
Datumswerte sind von Haus aus Double Zahlen, da muss man nichts wandlen und schon gar nicht speichern.

Ein Datumswert ist eine Doublezahl, vor dem Komma die Anzahl der Tage die seit dem 30.12.1899 vergangen sind (Tag 1 = 31.12.1899). Nach dem Komma der dezimale Anteil eines Tages. Dabei entspricht ein Tag der Zahl 1, 1h ist demnach 1/24.



Titel: Re: Recordset mit variabler Abfrage
Beitrag von: AbsolutNeu am April 14, 2014, 17:34:56
Hallo,

das mit dem Datum war mir schon klar, die Werte habe ich auch nur zu Testzwecken gespeichert.

Also ich habe jetzt wieder einiges gelernt (vorallem das ich noch viel lernen muss ;D).

Auf der einen Seite will man seine Datenbank fertig bekommen, auf der anderen Seite sollte man sich doch mehr mit den Grundlagen beschäftigen. Dann kommt der Faktor Zeit auch noch hinzu.

An dieser Stelle möchte ich mich für Eure Geduld, Euer Verständnis und Euer Bemühen bedanken (vorallem bei MzKlMu).

Mfg
AbsolutNeu