PDA

Vollständige Version anzeigen : Select Anweisung


Hondo
06.01.2002, 21:26
Hallo, folgende Select Anweisung verursacht mir immer wieder Probleme. Der Übersicht wegen habe ich hier die einzelnen Teile der Where Anweisung aufgeteilt.

Set rs = db.OpenRecordset("SELECT * FROM Belegungsdaten WHERE

(((Ankunft) Between " & DatumSQL(Monatsanfang) & " And " & DatumSQL(Monatsende) & ") AND ((CStr(BalkNr))='" & BNr & "'))

OR

(((Abreise) Between " & DatumSQL(Monatsanfang) & " And " & DatumSQL(Monatsende) & ") AND ((CStr(BalkNr))='" & BNr & "'))

OR

(((Ankunft)kleiner " & DatumSQL(Monatsanfang) & ") AND ((Abreise)größer" & DatumSQL(Monatsende) & ") AND ((CStr(BalkNr))='" & BNr & "'))

ORDER BY Ankunft;", dbOpenSnapshot)

die Variablewerte kommen aus:

' Balkennummer
BNr = Mid(Me.Name, 2, 1)

' Monatsanfang und -ende
Monatsanfang = CStr("01." & Month(dat) & "." & Year(dat))
Monatsende = CStr(Tage & "." & Month(dat) & "." & Year(dat))

wobei "Tage" je nach Monat 28, 29, 30 oder 31 ist.

Als Fehler kommt: Laufzeitfehler 94: Invalid use of Null.
In der Datenquelle (Abfrage) sind aber Datensätze enthalten.

Verwende ich nur den ersten Abschnitt der Where Klausel, funktioniert es; sobald ich aber mit OR einen weiteren hinzufüge, gibts Fehler.
Das Datum wird mit DatumSQL in ein SQL Datum gewandelt und funktioniert auch.

Die Werte kleiner und größer sind natürlich nicht im Code, sondern weil hier im Thread ein HTML- Fehler erscheint.

Wer kann mir weiterhelfen?

Gruß Andreas

JFreudens
06.01.2002, 22:06
Hallo Andreas,

ohne Daten konnte ich es nicht probieren, aber ich glaube, dass ein Klammernpaar fehlt, das die gesamte WHERE-Bedingung einschließt.

... WHERE ( ... ) ORDER BY ...

So, wie Du den SQL-String aufgebaut hast, sind die einzelnen Teile jeweils nur für sich geklammert. Das erklärt auch, dass die Abfrage funktioniert, wenn Du die OR-Bedingungen weglässt.

HTH

Johannes

Gustav Kurz
06.01.2002, 22:07
<font size="2" face="verdana">Hallo,

kannst du vielleicht noch die Funktion DatumSQL() posten?

Gruß
Gustav aus 78224-Singen

Hondo
06.01.2002, 22:12
Hi,
hier DatumSQL. Ich muß aber noch hinzufügen, daß ich diese Funktion und auch die Select Anweisung schon mehrfach eingesetzt habe, immer in geringer Veränderung.

Public Function DatumSQL(dat As String) As String

' --------------------------------------------------------------------------------
' Diese Funktion wandelt ein beliebiges Datum in ein SQL-Datum um.
' --------------------------------------------------------------------------------

' Deutsches Format mit 10 Stellen
If Len(dat) = 10 Then
DatumSQL = "#" & Mid(dat, 4, 2) & "/" & Left(dat, 2) & "/" & Right(dat, 4) & "#"
End If

' Deutsches Format mit 9 Stellen
If Len(dat) = 9 Then
If InStr(5, dat, ".") = 5 Then ' Format 01.1.2001
DatumSQL = "#0" & Mid(dat, 4, 1) & "/" & Left(dat, 2) & "/" & Right(dat, 4) & "#"
Else ' Format 1.10.2001
DatumSQL = "#" & Mid(dat, 3, 2) & "/0" & Left(dat, 1) & "/" & Right(dat, 4) & "#"
End If

End If

' Deutsches Format mit 8 Stellen
If InStr(1, Right(dat, 4), ".") <> 0 Then
DatumSQL = "#" & Mid(dat, 4, 2) & "/" & Left(dat, 2) & "/20" & Right(dat, 2) & "#"
End If

' Amerikanisches Format
If InStr(1, dat, "/") <> 0 Then
' 8 Stellen
If Len(dat) = 8 Then
DatumSQL = "#" & Left(dat, 2) & "/" & Mid(dat, 4, 2) & "/" & Right(dat, 2) & "#"
End If

' 7 Stellen
If Len(dat) = 7 Then
If InStr(1, dat, "/") = 3 Then ' Datum im Format 10/7/01
DatumSQL = "#" & Left(dat, 2) & "/0" & Mid(dat, 4, 1) & "/" & Right(dat, 2) & "#"
Else ' Datum im Format 7/10/01
DatumSQL = "#0" & Left(dat, 1) & "/" & Mid(dat, 3, 2) & "/" & Right(dat, 2) & "#"
End If
End If

' 6 Stellen
If Len(dat) = 6 Then ' Datum im Format 7/1/01
DatumSQL = "#0" & Left(dat, 1) & "/0" & Mid(dat, 3, 1) & "/" & Right(dat, 2) & "#"
End If
End If

End Function

Gruß Andreas

Um die Lesbarkeit des Codings zu erhöhen, wurde das Coding zu Begin in [ code ] und am Ende in [ /code ] eingefaßt
[ 06. Januar 2002: Beitrag editiert von: ArnoSimon ]</p>

A.S.
06.01.2002, 22:20
Hallo Andreas,

sorry, für meine Eingriff in Deinen Beitrag, aber das Coding war recht schlecht lesbar.

@ all,

Die Freizeichen am Tag-Anfang und am Tag-Ende müssen natürlich weggelassen werden, wenn Ihr das selbst anwenden möchtet.

Gruß

Arno

Hondo
06.01.2002, 22:20
Hi Arno,
danke fürs Formatieren. Werd mich demnächst mal darum kümmern wie das funktioniert.
@ Johannes: hat nichts gebracht.
So long, Andreas

Hondo
06.01.2002, 22:23
Hi,
habe eben alle 6 Formatierungen des Datums gecheckt, und alles war i.o. => an DatumSQL kann es nicht liegen.
So long, Andreas

A.S.
06.01.2002, 22:26
Hallo Andreas,

wie das Funktioniert steht in dem [Moderatorenhinweis] welchen ich Dir hinterlassen habe ;)

Ansonsten findest Du oben hinter dem Link "Wichtige Infos" einen CodeConverter, welchen unser Moderator Stefan Kulpa geschrieben hat. Mit diesem werden die Befehle etc. so farblich hervorgehoben wie es der VBA-Editor auch tut.

Schau ihn Dir einmal an, ist sehr gut.

Gruß

Arno

Gustav Kurz
06.01.2002, 22:29
<font size="2" face="verdana">...ich fürchte da wird Dir nur noch übrigbleiben eine Variable nach der anderen durch einen existierenden Wert zu erstezen um den Fehler einzugrenzen... <img src="graemlins/weinen.gif" border="0" alt="[weinen]" />

Ist mir bei verschiedenen Gelegenheiten (SQL-String für Recordset) auch schon so ergangen!

Gruß
Gustav aus 78224-Singen

Hondo
06.01.2002, 22:32
Nochmal Hi,
habe eben das Backup von vor 2 Tagen getestet:
hier der Code:


Set rs = db.OpenRecordset("SELECT * FROM Belegungsdaten WHERE (((Ankunft) Between " & DatumSQL(Monatsanfang) & " And " & DatumSQL(Monatsende) & ") AND ((CStr(BalkNr))='" & BNr & "'))OR (((Abreise) Between " & DatumSQL(Monatsanfang) & " And " & DatumSQL(Monatsende) & ") AND ((CStr(BalkNr))='" & BNr & "')) OR (((Ankunft) kleiner " & DatumSQL(Monatsanfang) & ") AND ((Abreise) größer " & DatumSQL(Monatsende) & ") AND ((CStr(BalkNr))='" & BNr & "')) ORDER BY Ankunft;", dbOpenSnapshot)


Und dieser Funktioniert!!

So long, Andreas

Gustav Kurz
06.01.2002, 22:35
<font size="2" face="verdana">...dann hat sichs wohl erledigt...

Gruß
Gustav aus 78224-Singen

[ 06. Januar 2002: Beitrag editiert von: GustavKurz ]</p>

Hondo
06.01.2002, 22:43
Hi,
habs gefunden: in der Tabelle worauf die Abfrabe beruht hat sich ein leerer, d.h. nur Autowert-Feld belegt, Datensatz eingeschlichen.
Da muß ich mal im coding nachsehen wie das kommt.

Gruß und noch ne gute Nacht, Andreas :)