Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Listbox mit 3 Recordsets füllen

Begonnen von AbsolutNeu, Juli 07, 2025, 12:48:25

⏪ vorheriges - nächstes ⏩

AbsolutNeu

Hallo,

ich möchte gerne aus meiner Tabelle Kontakte in einer Listbox anzeigen lassen, wer in den nächsten 20 Tagen Geburtstag, Hochzeitstag oder Todestag hat.

Dafür habe ich in VBA jeweils eine SQL Abfrage erstellt und je einem Recordset zugewiesen.

Meine Idee war, den ersten Recordset als Quelle an die Listbox zu übergeben und die anderen beiden mit additem ergänzen. Doch das gibt Konflikte mit dem Herkunfstyp -> Recordset - Abfrage -> additem Werteliste.

Irgendwie haut das mit dem additem nicht hin. Manchmal wird .list benutzt -> scheinbar nur Excel, mal wurde .column genutzt - geht auch nicht und

        Set rsGeburtstage = db.OpenRecordset(strSQLGeburtstage)                                                 
        Set rsHochzeitstage = db.OpenRecordset(strSQLHochzeitstage)
        Set rsTodestage = db.OpenRecordset(strSQLTodestage)
           
        'With Me!lst_Geburtstage_Anzeigen
        '    Set .Recordset = rsGeburtstage ' Recordset der ListBox zuweisen
        '    .ColumnCount = rsGeburtstage.Fields.Count ' Anzahl der Spalten in der ListBox
        'End With
       
        zeilenIndex = Me!lst_Geburtstage_Anzeigen.ListCount
        Me!lst_Geburtstage_Anzeigen.ColumnCount = 3
        Do Until rsHochzeitstage.EOF
            With Me!lst_Geburtstage_Anzeigen
                .AddItem rsHochzeitstage!Wochentag
                .AddItem rsHochzeitstage!NameZusammen, 1
                .AddItem rsHochzeitstage!Tagebis, 2
            End With
           
            zeilenIndex = zeilenIndex + 1
            rsHochzeitstage.MoveNext
        Loop
        rsHochzeitstage.Close
        Set rsHochzeitstage = Nothing


Mit diesem Code wird alles untereinander in der 1. Spalte in dem Listenfeld angezeigt.

Ich jetzt schon den ganzen Morgen im Internet und nichts hat bis jetzt funktioniert.

Hat jemand eine Idee?

Gruß

Lars

Debus

Hey, wie sieht denn die Datenquelle genau aus also wie ist der Aufbau der Tabelle? und sollen dann alle einfach so untereinander oder auch noch nach gewissen Kriterien sortiert werden?

Holger

AbsolutNeu

Hallo Holger,

Meine Tabelle Kontakte enthält unteranderem Name, Vorname, Adresse, Telefonnr., Email adr...
und den Geburtstag, den Hochzeitstag und Todestag als Datum.

Da ich jetzt viel herumprobiert habe, habe ich nur noch den SQL - String für den Hochzeitstag



strSQLHochzeitstage = "SELECT Format([DerTag],""ddd"") AS Wochentag, CDate(Format([ktkHochzeitstag],""dd/mm"")) AS DerTag, " & _
                              "[ktkVorname] & "" "" & [ktkNachname] & "" ("" & [Alterwird] & "")"" AS NameZusammen, " & _
                              "DateDiff('d',Date(),[DerTag]) AS Tagebis, tbl_Kontakte.ktkHochzeitstag, " & _
                              "(DateDiff(""yyyy"",[ktkHochzeitstag],Date())+(Format(Date(),""mm"")<Format([ktkHochzeitstag],""mm""))+(Format(Date(),""dd"")<Format([ktkHochzeitstag],""dd"")))+1 AS Alterwird " & _
                              "FROM tbl_Kontakte " & _
                              "WHERE (((CDate(Format([ktkHochzeitstag],""dd/mm""))) Between Date() And DateAdd(""d"",30,Date())) AND ((tbl_Kontakte.ktkHochzeitstag) Is Not Null)) " & _
                              "ORDER BY CDate(Format([ktkHochzeitstag],""dd/mm"")), tbl_Kontakte.ktkHochzeitstag;"



Als normale Abfrage funktioniert der SQL - String

In der Listbox müßte dann natürlich noch nach Tagebis(die nächsten Ereignisse) als ertses angezeigt werden.

Für Geburtage und Todestage, werde ich auch noch SQL - Strings erstellen.

Ich hoffe, das sind die richtigen Informationen.

Gruß

Lars

Debus

habe da mal ein Muster angehangen, falls ich alles richtig verstanden habe. Die Abfrage geht immer auf alles in 20 Tage. Kannst Du ja ggf erstmal anpassen .

Holger

AbsolutNeu

Also bei meiner Suche bin ich auch auf die Möglichkeit gestoßen, dass mit einer Union Abfragen zu realisieren. Das habe ich verworfen, da ich dachte, ich kriege die 3 Datumswerte nicht in eine Spalte. Mit dem alias EreignisDatum geht das natürlich. Was ich auch nicht auf dem Schirm hatte, dass man einem alias einfach Text zuweisen kann -> 'Geburtstag' AS Ereignis


SELECT
    Format([DerTag],"ddd") AS Wochentag,
    CDate(Format([ktkGeburtstag],"dd/mm")) AS DerTag,
    [ktkVorname] & " " & [ktkNachname] & " (" & [Alterwird] & ")" AS NameZusammen,
    'Geburtstag' AS Ereignis,
    DateDiff('d',Date(),[DerTag]) AS Tagebis,
    (DateDiff("yyyy",[ktkGeburtstag],Date())+(Format(Date(),"mm")<Format([ktkGeburtstag],"mm"))+(Format(Date(),"dd")<Format([ktkGeburtstag],"dd")))+1 AS Alterwird,
    ktkGeburtstag AS EreignisDatum,
    ktkVorname,
    ktkNachname
   
FROM tbl_Kontakte
WHERE
    ktkGeburtstag IS NOT NULL AND
    DateSerial(Year(Date()), Month(ktkGeburtstag), Day(ktkGeburtstag))
        BETWEEN Date() AND Date() + 20

UNION ALL

SELECT
    Format([DerTag],"ddd") AS Wochentag,
    CDate(Format([ktkHochzeitstag],"dd/mm")) AS DerTag,
    [ktkVorname] & " " & [ktkNachname] & " (" & [Alterwird] & ")"  AS NameZusammen,
    'Hochzeitstag' AS Ereignis,
    DateDiff('d',Date(),[DerTag]) AS Tagebis,
    (DateDiff("yyyy",[ktkHochzeitstag],Date())+(Format(Date(),"mm")<Format([ktkHochzeitstag],"mm"))+(Format(Date(),"dd")<Format([ktkHochzeitstag],"dd")))+1 AS Alterwird,
    ktkHochzeitstag AS EreignisDatum,
    ktkVorname,
    ktkNachname
   
FROM tbl_Kontakte
WHERE
    ktkHochzeitstag IS NOT NULL AND
    DateSerial(Year(Date()), Month(ktkHochzeitstag), Day(ktkHochzeitstag))
        BETWEEN Date() AND Date() + 20

UNION ALL SELECT
    Format([DerTag],"ddd") AS Wochentag,
    CDate(Format([ktkTodestag],"dd/mm")) AS DerTag,
    [ktkVorname] & " " & [ktkNachname] & " (" & [Alterwird] & ")" AS NameZusammen,
    'Todestag' AS Ereignis,
    DateDiff('d',Date(),[DerTag]) AS Tagebis,
    (DateDiff("yyyy",[ktkTodestag],Date())+(Format(Date(),"mm")<Format([ktkTodestag],"mm"))+(Format(Date(),"dd")<Format([ktkTodestag],"dd")))+1 AS Alterwird,
   
    ktkTodestag AS EreignisDatum,
    ktkVorname,
    ktkNachname
   
FROM tbl_Kontakte
WHERE
    ktkTodestag IS NOT NULL AND
    DateSerial(Year(Date()), Month(ktkTodestag), Day(ktkTodestag))
        BETWEEN Date() AND Date() + 20
ORDER BY EreignisDatum;



Vielen Dank Holger.
Jetzt habe ich schon mal eine Baustelle weniger von ganz vielen... ;D

einen schönen Abend

Lars

MzKlMu

#5
Hallo,
für die hier vorgesehene Aufgabe gehören die Jahrestage in eine extra Tabelle mit einem Fremdschlüsselfeld zur Person und einem Feld für die Art des Jahrestages (Geburtstag, Hochzeitstag oder Todestag). Zweckmäßigerweise auch als Schlüsselzahl (1, 2, 3) aus einer weiteren Tabelle.
Das Datum hat man dann in einem Feld. Mit der extra Tabelle erzeugt man dann die Abfrage für die Listbox. Über die Felder Datum, Art des Jahrestages und Person lässt sich das beliebig sortieren und anzeigen.
Es gibt dann auch keine leeren Felder, was die Sache zusätzlich vereinfacht.

Eine Union wird dann ersatzlos überflüssig.
Gruß Klaus

Knobbi38

Hallo Lars,

du solltest dein Datenmodell nochmal überdenken und richtig "normalisieren", wie Klaus das auch schon vorgeschlagen hat, sonst bekommst du irgendwann Konflikte mit deinen Daten, die du dann nicht mehr lösen kannst. Was ist z.B. mit mehreren Hochzeitstagen?

Gruß Knobbi38

AbsolutNeu

Hallo,

danke für euer Interesse und guten Einwänden.

Wenn ich KLaus seinen Vorschlag lese, ist das natürlich einleuchtend.
Allein wäre ich da nicht draufgekommen. Da fehlt mir die Erfahrung. Ich bin ja froh, wenn was läuft. ;D

Also neue Tabelle mit Fremdschlüssel auf Person, Datum, Fremdschlüssel zu Ereignis
     zweite Tabelle mit index und Ereignis

Dann muss ich das Formular zur Kontaktangabe noch ändern
Da muss ich dann in 2 Tabellen schreiben, wenn ich die Kontaktdaten speichern will.

Mal sehen, wie das klappt.

aber nochmal vielen Dank für die Anregungen.

Gruß

Lars

MzKlMu

Hallo,
die neue TAbelle zeigst Du in einem kleinen Unterformular an. Dann hast Du optisch immer noch ein Formular.
Für einen neuen Eintrag in der Tabelle setzt Du den Standardwert für das Ereignis auf 1 (=Geburtsdatum).
Gruß Klaus

AbsolutNeu

Der Gedanke mit dem Unterformular ist mir auch schon gekommen.
Jeder, der Hochzeitstag hat, hat zwangsläufig auch Geburtstag. Also müsste ich 2 Unterformulare erstellen.

1. Wo ich die Ereignisse eingeben kann
2. Wo die Ereignisse angezeigt werden (wenn ich das Formular zum Durchblättern nehmen will)

Das Formular gefäält mir sowieso nicht so gut.
Ich werde erstmal einiges ausprobieren

Gruß

Lars

Ps.: reicht für heute, langer Tag

MzKlMu

#10
Hallo,
ZitatAlso müsste ich 2 Unterformulare erstellen.
Nein, natürlich nicht. Du brauchst nur ein Unterformular.
Jedes Ereignisdatum gibt einen Datensatz.
Im Idealfall hast Du 3 DS (für das Todesdatum ist Idealfall natürlich nur datentechnisch gemeint):

Geburtsdatum (1)
Hochzeitsdatum (2)
Todesdatum (3)

Es werden nur die Datumswerte erfasst, die auch bekannt sind.
Wie man mit einer 2. (oder mehr) Hochzeit verfährt, müsste geklärt werden.
Wahrscheinlich würde es reichen, das Hochzeitsdatum einfach zu überschreiben, denn es kann ja für den Hochzeitstag nur ein DAtum relevant sein.
Gruß Klaus