NAV (SQL) -> MS Access: Probleme mit leeren Feldern

7. Januar 2008 22:45

Ich brauche dringend eure Hilfe.

Ich verwende NAV 5.0 auf SQL (hier in dem Beispiel reicht schon die CRONUS-DB aus). Ich erstelle in Access eine Verknüpfung zur Tabelle Item.
Ich erstelle eine Abfrage, basierend auf dieser verknüpften Tabelle. (Die dazu gehörige ODBC-Schnittstelle ist eingerichtet).

Ich lasse mir z.B. die Spalten No., Description und Vendor No. ausgeben.
Vendor No. ist aber nicht überall gepflegt. Dies heißt für Navision: Das Feld ist NICHT null, es ist aber auch nicht gefüllt - es ist einfach ein Leerstring.

Ich möchte, dass alle Datensätze, bei denen die Vendor No. nicht gefüllt ist, die Vendor No. = "leer" erhalten (da Textfeld, ist das ohne weiteres möglich).
Ich formuliere nun eine Bedingung wie diese:
WENN([Vendor No_]="";"leer";[Vendor No_]

Lasse ich mir das Ergebnis ausgeben, so tritt immer nur der ELSE-Fall (Vendor No.) ein - der Leerstring wird einfach nicht erkannt!

Was habe ich nicht alles probiert:
- IN der WENN-Abfrage "" durch '' ersetzen
- an den Konfigurationsmöglichkeiten der ODBC-Verbindung schrauben
- Access 2007 statt 2003 verwenden
- beten, flehen, mit den Füßen aufstampfen.

Nichts half!
Jemand muss doch schon mal auf das gleiche Problem gestoßen sein ...?
Ach ja, falls ihr euch wundert, WARUM ich das überhaupt machen möchte:
Das Feld enthält in unserer Kunden-DB nur Zahlen-Kreditorennummern (z.B. '1234'). Diese müssen für die weitere Verwendung in integer umgewandelt werden. Dies setzt voraus, dass ein Leerstring zu einer 0 wird.

Gegenprobe: Eine Abfrage nach = '' liefert auf dem SQL-Servr ein richtiges Ergebnis - wo also hat Access seine Probleme? Hat das was mit der Konvertierung von VARCHAR nach Text zu tun?

8. Januar 2008 09:51

Zum Hintergrund:
Auf dem SQL-Server sind die Felder in den Tabellen mit der Eigenschaft NOT NULL angelegt, d.h. das kein NULL-Wert gespeichert werden kann.
Diese Einschränkung ist notwendig, da NAV selbst ja auch keine NULL-Werte kennt. Deswegen ist ein leeres Zeichen gespeichert.

8. Januar 2008 10:01

MrBurns hat geschrieben:Zum Hintergrund:
Auf dem SQL-Server sind die Felder in den Tabellen mit der Eigenschaft NOT NULL angelegt, d.h. das kein NULL-Wert gespeichert werden kann.
Diese Einschränkung ist notwendig, da NAV selbst ja auch keine NULL-Werte kennt. Deswegen ist ein leeres Zeichen gespeichert.


Hast du ne Idee, warum Access dieses "leer" (aber nicht null) nicht abfragen kann? Auf dem SQL-Server geht das ja, da liefert select ..... where Feld = "" das richtige Ergebnis.

8. Januar 2008 10:10

Probier es mal mit IST NULL (in Abfrage Designer) oder IS NULL (im SQL Editor).

8. Januar 2008 10:26

MrBurns hat geschrieben:Probier es mal mit IST NULL (in Abfrage Designer) oder IS NULL (im SQL Editor).

Wie erwartet sind alle Vendor Nos. nicht null.

Bei mir geht das in Access 2000 so

6. April 2008 22:13

Hallo Natalie,

also ich habe im Access grade mit unserer Datenbank auf dem SQL-Server das gleiche ausprobiert (wir haben Sonderanfertigungen durch uns, die auch keine Kreditorennr. beim Artikel hinterlegt haben), und da funktionierte das folgende wunderbar:

Kreditornr: Wenn([Vendor No_] Ist Null;"leer";Wenn([Vendor No_]="";"leer";[Vendor No_]))

Wir machen hier sehr viel über die ODBC Schnittstelle und haben oft das Problem, dass der Server die Daten nicht so liefert, wie wir das gerne hätten. Allerdings gehen wir auch grundsätzlich nicht direkt auf die Tabellen des SQL-Servers los, sondern erzeugen uns dort Sichten am SQL Server in der Navision Datenbank.
Das hat die folgenden Vorteile:
1. Kann man gezielt Zugriff auf bestimte Tabellen ermöglich.
2. Sichten werden grundsätzlich nur lesend erzeugt, auch wenn man das dann ändern kann.
3. Man kann sich diverse ODBC User anlegen, die dann nur auf bestimmte Sichten Zugriff erhalten, dafür findet man mit diesen Benutzern beim Verknüpfen schneller die Tabellen, da nicht der ganze Wust an vorhandenen, für ODBC gar nicht benötigten Tabellen angezeigt wird.
4. Wenn man mal ein wenig SQL beherrscht, kann man einiges schon direkt am SQL-Server als Abfrage erzeugen, auf das man dann per ODBC von Access aus zugreift. Die Performance ist immer deutlich höher bei vielen verknüpften Tabellen.

Wir erstellen Sichten immer ganz trivial als
SELECT * FROM [Mandant$Tabellenname]
und geben den Sichten dann die Bezeichnung Mandant_Tabellenname

Einfach mal probieren.
Schönen Abend
Markus