Hallo, liebe Access-Gemeinde,
nachdem Ihr mir schon einmal so großartig geholfen habt, als ich auf dem Schlauch stand, habe ich nun prompt das nächste Problem.
Ich möchte das Ergebnis einer Abfrage in einem Endlosformular sortiert anzeigen lassen. In diesem Formular wird es mehrere Buttons geben, die die Sortierung nach verschiedenen Feldern ermöglicht. Abgefragt wird unter anderem ein Textfeld bluWochentag, das die Wochentage als Text enthält, aber auch leer sein kann. Um die Sortierung nach Wochentagen zu ermöglichen, benutze ich folgende Funktion:
Public Function sortiereWochentag(wert As String) As Integer
Dim TagAlsInt As Integer
If pruefeLeer(wert) = False Then
Select Case wert
Case "Mo"
TagAlsInt = 1
Case "Di"
TagAlsInt = 2
Case "Mi"
TagAlsInt = 3
Case "Do"
TagAlsInt = 4
Case "Fr"
TagAlsInt = 5
Case "Sa"
TagAlsInt = 6
Case Else
TagAlsInt = 7
End Select
Else
TagAlsInt = 7
End If
sortiereWochentag = TagAlsInt
End Function
Um auf ein leeres Feld zu prüfen, benutze ich die Funktion:
Public Function pruefeLeer(eingabe As Variant) As Boolean
eingabe = Trim(eingabe)
If (IsEmpty(eingabe) = True) _
Or (eingabe = "") _
Or (IsNull(eingabe) = True) _
Or (Format(eingabe) = vbNullString) Then
pruefeLeer = True
Else
pruefeLeer = False
End If
End Function
Ich versuche nun, im Form_Load-Event die Default-Sortierung festzulegen:
Me.Form.OrderBy = "sortiereWochentag([bluWochentag]) ASC, bluUhrzeit ASC"
Me.Form.OrderByOn = True
Wenn ich das Formular öffne, bekomme ich die Fehlermeldung "Datentypenkonflikt in Kriterienausdruck".
Wenn ich die Funktion sortiereWochentag weglasse, also nur schreibe:
Me.Form.OrderBy = "bluWochentag ASC, bluUhrzeit ASC"
dann wird diese Sortierung ausgeführt.
Interessanterweise funktioniert in einem anderen Formular eine gleichartige Sortierung, die die Funktion sortiereWochentag enthält. Dort wird allerdings eine Tabelle abgefragt, die keine leeren Werte enthalten kann.
Dass es mit der Tabelle ohne leere Felder funktioniert, mit der anderen nicht, weist für mich darauf hin, dass es ein schnöder Syntaxfehler nicht sein kann. Aber ich komm einfach nicht drauf, was es sein kann.
Wenn Ihr mir einen Tipp geben könntet, wo es hakt, würde ich mich sehr freuen, ich bin ratlos.
Einen schönen Tag wünscht
Irene
Hallo,
die Prüfung auf Null,Leer oder Nullstring ist falsch platziert. Die Prüfung muss vor/beim Aufruf der Sortier-Prozedur erfolgen.. Wirf die ganze Prüfroutine raus (nur Select/End Select lassen) und schreib:
Me.Form.OrderBy = "sortiereWochentag(nz([bluWochentag],'')) ASC, bluUhrzeit ASC"
Hallo Franz,
wow, danke! Die Funktion nz() sehe ich heute zum ersten Mal, und ich bin begeistert! Nachdem ich die Anführungsstriche "" durch einfache Hochkommata'' getauscht hab, funktioniert es anstandslos:
Me.Form.OrderBy = "sortiereWochentag(nz([bluWochentag],'')) ASC, bluUhrzeit ASC"
Jetzt will ich es natürlich ganz genau wissen, denn das Thema Null und Leer ist für mich wirklich knifflig:
Verstehe ich das richtig, dass VBA bei meiner Vorgehensweise gar nicht erst die Funktion sortiereWochentag durchlaufen hat, wenn das Feld leer ist? Da könnte ich da drinne ja auf Null prüfen, bis ich schwarz werde!
Kann ich verallgemeinern, dass ich generell in VBA zuerst prüfe, ob ich überhaupt einen Wert bekomme, und dann erst eine Funktion lostrete? Oder ist das ausschließlich in SQL-Anweisungen so?
Vielenvielen Dank für Deine präzise Hilfe, ich hätt allein vermutlich noch drei Tage am falschen Ende rumgeprokelt. :-)
Irene
Hi,
ZitatDa könnte ich da drinne ja auf Null prüfen, bis ich schwarz werde!
der Fehler ist, dass der Parametertyp "String" sich einem NULL-Wert verweigert, hättest du ihn als "Variant" deklariert, so wie du es auch bei der Funktion "pruefeLeer" getan hast, hätte das durchaus geklappt. Wesentlich einfacher wird es natürlich mit Einsatz der NZ-Funktion.
Hallo,
sorry für die fehlverwendeten Gänsefüße... habe den meinen Post abgeändert.... :-[ 8)
Hallo MaggieMay,
vielen Dank für die Erklärung, jetzt wird mir einiges klarer! Toll, jetzt hab ich schon eine viel deutlichere Vorstellung, wie ich Strings richtig verarzte. Das schreib ich mir auf und rahme es mir ein, damit ich wenigstens an diesem Fehler nicht mehr verzweifle. :-)
Herzlichen Dank nochmal an dieses tolle Forum und einen schönen Abend
Irene
P.S.: Hallo Franz, das war für mich schon okay mit den Gänsefüßen, so bleibt der Leser wach und aufmerksam! ;-)