Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Funktion in OrderBy führt zu "Datentypenkonflikt in Kriterienausdruck"

Begonnen von Else, August 03, 2015, 12:25:17

⏪ vorheriges - nächstes ⏩

Else

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



DF6GL

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"
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Else

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

MaggieMay

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.
Freundliche Grüße
MaggieMay

DF6GL

Hallo,


sorry für die fehlverwendeten Gänsefüße...  habe den meinen Post abgeändert....   :-[ 8)
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Else

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! ;-)