PDA

Vollständige Version anzeigen : Abfrage Datensätze mit Schnittmenge


THOMY
03.05.2011, 17:01
Hallo,

ich habe folgendes Problem. In meiner Firma entsteht eine Datenbank. Die DB ist dafür gedacht, dass Mahnwesen zu vereinfachen. Die DB läuft so weit auch ganz gut, bis auf eine Sache.
Wenn ich einen Vorgang in die Datenbank eingeben möchte, soll geprüft werden, ob in dem Zeitraum von - bis, bereits ein Datensatz für diesen Kd vorhanden ist. Ich habe mich für select count entscheiden und komme nun nicht so richtig weiter.

Ziel ist es zu Datensätze auszuzählen (für den Kunden), wenn der datensatz entweder den gleichen Zeitraum hat oder es eine Zeitraumüberschneidung gibt.

Hoffe es wird halbwegs klar was ich möchte.
Vielleicht könnt ihr mir ja den richtigen Denkanstoß geben.

code

sql = "Select COUNT (*) FROM tbl_Merkmale INNER JOIN tbl_Haupttabelle ON tbl_ Merkmale.ID_Merkmale = tbl_Haupttabelle.Merkmale_ID" & _
" WHERE KundendatenID=" & Forms![frm_Anschreiben]![tb_ID_Kunde].Value And (zeitraum_von <= " & DatSQLvon & ") And (zeitraum_bis >= " & DatSQLbis & ");"

Die Codezeile funktioniert soweit, es werden nur nicht alle Möglichkeiten als doppelter DS erkannt.

Vielen Dank im Voraus.

Thomas Möller
03.05.2011, 17:07
Hallo!

Die Codezeile funktioniert soweit, es werden nur nicht alle Möglichkeiten als doppelter DS erkannt.

Es wäre sicher hilfreich, wenn Du ein paar Beispieldatensätzes nennen könntest, bei denen es nicht funktioniert.

CU

THOMY
03.05.2011, 17:19
Erst mal schönen Dank für die schnelle Reaktion.

hab das eben mal durchprobiert, also

DS1:-->Kunde1 -->Zeitraum 01.05.211 - 31.05.2011
DS2:-->Kunde1 -->Zeitraum 01.05.211 - 31.05.2011 wird erkannt und gezählt
DS3:-->Kunde1 -->Zeitraum 02.05.211 - 31.05.2011 wird erkannt und gezählt
DS4:-->Kunde1 -->Zeitraum 29.04.2011 - 31.05.2011 wird NICHT erkannt und gezählt
DS5:-->Kunde1 -->Zeitraum 29.05.2011 - 15.06.2011 wird NICHT erkannt und gezählt

Josef P.
03.05.2011, 17:30
Hallo!

Versuche es einmal so:
sql = "Select COUNT (*) FROM tbl_Merkmale INNER JOIN tbl_Haupttabelle ON tbl_ Merkmale.ID_Merkmale = tbl_Haupttabelle.Merkmale_ID" & _
" WHERE KundendatenID=" & Forms![frm_Anschreiben]![tb_ID_Kunde].Value And (zeitraum_von &lt;= " & DatSQLbis & ") And (zeitraum_bis &gt;= " & DatSQLvon & ")"

Die Logik dahinter als Bild:
http://access.joposol.com/download/Ueberschneidungen.png


mfg
Josef

ebs17
03.05.2011, 17:43
Vielleicht könnt ihr mir ja den richtigen Denkanstoß geben.
DatSQLvon zwischen zeitraum_von und zeitraum_bis oder
DatSQLbis zwischen zeitraum_von und zeitraum_bis oder
DatSQLvon < zeitraum_von und DatSQLbis > zeitraum_bis

Thomas Möller
03.05.2011, 17:43
Hallo!

Ich denke so langsam versteh ich, was Du vor hast. So wie ich das sehe, hast Du ein kleines Logikproblem.

Bei den Zeiträumen gibt es sechs unterschiedliche Konstellationen:
Josef hat eine schöne Grafik dazu angefertigt.

1. Der im Datensatz gespeicherte Zeitraum liegt komplett vor dem gesuchten Zeitraum.
2. Der im Datensatz gespeicherte Zeitraum beginnt vor dem gesuchten Zeittraum und endet im gesuchten Zeitraum.
3. Der im Datensatz gespeicherte Zeitraum ist identisch mit dem gesuchten Zeitraum. Start und Ende sich jeweils identisch.
4. Der im Datensatz gespeicherte Zeitraum beginnt vor und endet nach dem gesuchten Zeitraum.
5. Der im Datensatz gespeicherte Zeitraum beginnt im gsuchten Zeitraum und ende nach dem gesuchten Zeitraum.
6. Der im Datensatz gespeicherte Zeitraum liegt komplett nach dem gesuchten Zeitraum.

Wenn ich Deine Anforderung richtig verstehe, dann sind also die Fälle 1 und 6 auszuschließen. Alle anderen Fälle sollen einen Treffer geben - richtig?

Dazu musst Du die Bedingungen in deinem SQL-String genau umkehren:
zeitraum_von <= " & DatSQLbis
zeitraum_bis >= " & DatSQLvon

HTH

THOMY
03.05.2011, 17:59
Der Lösungsansatz ist schon sehr gut (genau mein Problem erkannt). Ich habe mal alle beschriebenen und skizzierten Möglichkeiten durchprobiert. Es wird alles erkannt bis auf:

DS1:01.05.2011 - 31.05.2011

DS2:15.05.2011 - 16.05.2011 Wird NICHT erkannt.



folgender code hinterlegt

...(zeitraum_von <= " & DatSQLbis & ") And (zeitraum_bis >= " & DatSQLvon & ")"

Josef P.
03.05.2011, 18:05
Mit welchen Werten filterst du?
Zeig bitte einmal die fertige SQL-Anweisung.

sieht das ungefähr so aus:
...(zeitraum_von <= #5/31/2011#) And (zeitraum_bis >= #5/1/2011#)

THOMY
03.05.2011, 18:16
Sorry Eingabefehler von mir. Eure Lösung funktioniert super in allen Konstellationen.

DANKESCHÖN :grins: