ODBC + FlowFilter

23. April 2008 12:27

Bei der Nutzung von ODBC aus Access (MSACCESS 2003) heraus haben wir leider ein Problem mit FlowFiltern. Normale Verknüpfungen werden unterstützt, der Zugriff auf die NAV 4.0 SP3 Datenbank klappt tadellos. Jedoch bei der Verwendung eines Flow Filters gemäß der in der Dokumentation (w1w1nodbc.pdf von der NAV Install-CD1) beschriebenen Syntax

SELECT * FROM Currency
WHERE {pred SetFlowFilter, 'Currency', 'Customer_Filter', '10000..40000'}

also in der deutschen Umgebung z.B.

SELECT * FROM Debitor
WHERE {pred SetFlowFilter, 'Debitor', 'Datumsfilter', '01.04.2008..30.04.2008' }

erhalten wir die Fehlermeldung:

GUID falsch Formatiert in Abfrageausdruck '{pred SetFlowFilter, 'Debitor', 'Datumsfilter', '01.04.2008..30.04.2008' }'.

Wie gesagt, abgesehen von pred SetFlowFilter klappt der ODBC Zugriff mit allen sonstigen Befehlen (ausgenommen natürlich der "verwandte" SetFlowFilterMultiple).

Woran könnte das liegen? Funktioniert bei euch die beschriebene Verwendung von Navision-FlowFiltern aus Access heraus?

23. April 2008 12:30

Wieso arbeitest du mit deutschen Tabellen- und Feldnamen, wenn der NAME die englische Variante ist?
Oder bin ich gerade auf dem völlig falschen Dampfer? *g*

23. April 2008 12:44

Hi Natalie,

die anderen Befehle funktionieren in dieser Umgebung so, z.B.

SELECT Debitor.Name FROM Debitor
WHERE Bewegung >= 10000

wird unterstützt. Nur der SetFlowFilter Befehl nicht

23. April 2008 14:11

Nur eine kurze Frage.
Wieso ODBC und soll die Abfrage auf ein native oder SQL DB gehen?

23. April 2008 14:15

Access und ODBC setzt unser Kunde ein, bis auf die Sache mit dem FlowFilter ist er auch zufrieden. Die Abfrage erfolgt auf eine native Datenbank.

23. April 2008 14:22

Ok verstehe. Dann sind Views, SSIS, T-SQL etc. natürlich kein Thema.

23. April 2008 16:07

Hallo Oliver,

Probier mal folgendes Datumsformat im Filter
01/01/2008..31/12/2008

Bei unserer BI-Schnittstelle gehts so mit ODBC

23. April 2008 16:57

Hallo Ingo, hab's ausprobiert, geht aber leider auch nicht. Auch wenn ich in dem Ausdruck nur ein einzelnes Datum übergeben möchte (mit verschiedenen Schreibweisen probiert z.B. 010107, 2007-01-01, 01/01/2007, 01.01.2007...), erhalte ich die gleiche Fehlermeldung.

25. April 2008 14:02

Hallo Oliver,
Habe mir nochmal unsere Abfrage angesehen.
Bei unserer Abfrage wird direkt der Datumsfilter belegt.
"pred SetFlowFilter" wird nicht benutzt
also
SELECT ...
WHERE Datumsfilter='01/01/2008..31/12/2008'

25. April 2008 15:51

Hallo Ingo,

diese Abfrage wird dann zwar syntaktisch akzeptiert. Aber leider wird der Filter nicht richtig (im Navision-Sinn) interpretiert. Ich bekomme dann immer eine leere Tabelle als Antwort (auch bei anderen Schreibweisen).

Auf den Inhalt eines normalen Datumsfelds kann ich in dieser Umgebung so abfragen:

SELECT *
FROM Währung
WHERE [Korrigiert am] = #09/30/2003#

mit MM/TT/JJJJ (also Monat zuerst), dann bekomme ich die Datensätze, die am 30. September 2003 korrigiert wurden.

Aber in den Flow Filtern steht ja kein Inhalt drin, und so wird diese Abfrage von Access aus fehlinterpretiert. Da bräuchte ich dann wahrscheinlich diese SetFlowFilter Funktionalität.

12. Juni 2008 18:27

Hallo Oliver,

wir haben das gleiche Problem.
Einzige Lösung, die bisher funktioniert hat, ist eine Pass-Through Abfrage zu erstellen.
Hier wird das SQL Statement direkt an den Treiber weitergeleitet und nicht über die Access Jet Engine.

Damit funktionieren die FlowFilter. Leider gehen hier keine Parameter in der Abfrage (da hilft dann nur VBA, und die Parameter mittels Replace ersetzen) auch kann man keine Joins auf Tabellen/Abfragen innerhalb der Access Datenbank erstellen (wie auch, geht ja direkt an den ODBC-Treiber).
Ansonsten funktionierts.
Wenn man mit der SQL Syntax nicht so vertraut ist, kann man MS - Query oder ähnliches verwenden. Dort kann man die Abfrage zusammenbauen, testen und dann einfach in das Pass-Through Statement kopieren.

22. Juli 2008 16:47

Hallo Oliver,

habe bei unserer BI-Anwendung auch am Anfang Probleme gehabt.

Hier ein Beispiel vom MS-Support

SELECT
"G/L Account".No_, "G/L Account"."Net Change"
FROM "G/L Account"
WHERE
{pred SetFlowFilter, 'G/L Account', 'Date Filter', '010101..010102' }

Die Feldnamen müssen noch angepasst werden.
Bei mir funktienierts jetzt auch mi anderen Tabellen.

MBS-Nav. ODBC-Treiber Version: 4.00.03.25202

Viel Glück

Re: ODBC + FlowFilter

20. August 2008 16:05

Hallo Marl, hallo Ingo,

vielen Dank für eure nachträglichen Beiträge! Ich kann jetzt auch noch etwas dazu ergänzen! Wollte noch das Ergebnis einer Anfrage bei MS hierzu abwarten, das hat sich ziemlich lange hingezogen aufgrund des schwierigen Themas!

Der Tipp von Marl hat bei uns tatsächlich auch geklappt (Pass-Through-Abfrage), klasse! Natürlich gibt es da leider die beschriebenen Einschränkungen. Die Joins auf Accesstabellen gehen dann ja ,wie von Marl bereits erwähnt, nicht, genau das wird aber mitunter gewünscht. Ohne Pass-Through-Abfrage kann man jedoch nach unserem Erkenntnisstand nicht pred SetFlowFilter in Access verwenden, da die Access Jet Engine hier eine Fehlermeldung auslöst (also ein Problem, welches in Access auftritt, in vielen anderen Anwendungen, die keine Jet Engine benutzen, jedoch nicht).

Es gibt aber noch eine Alternative. Die häufigste Verwendung von FlowFields ist ja die Addition von Beträgen anderer Tabellen unter Setzen bestimmter Filter. Vor diesem Hintergrund kann man eine Abfrage direkt auf die Zieltabelle durchführen. Wie es das Schicksal will, hat Herr Tupy hier vor kurzem einen relativ ausführlichen Beitrag dazu verfasst: http://blogs.msdn.com/german_nav_developer/archive/2008/07/23/datums-flowfiltersetzung-ber-nodbc-bei-verwendung-von-access-und-excel.aspx

Der wichtigste Textabschnitt in diesem Zusammenhang (gesucht ist Debitor."Bewegung (MW)" mit einem Datumsfilter):

Bei Access müssen wir um bei dem oben genannten Beispiel zu bleiben über die Detaillierten Debitorenposten gehen da Access die FlowFilter Setzung von NAV in der Form nicht akzeptiert.

Das bedeutet wir sollten uns hierbei ein anderes Select Statement definieren das wie folgt aussieht:

SELECT DISTINCTROW [Detaillierte Debitorenposten].Debitorennr_, Sum([Detaillierte Debitorenposten].[Betrag (MW)]) AS [Summe von Betrag (MW)]

FROM [Detaillierte Debitorenposten]

WHERE (([Detaillierte Debitorenposten].Buchungsdatum >#7/30/2007# And ([Detaillierte Debitorenposten].Buchungsdatum)<#1/07/2008#))

GROUP BY [Detaillierte Debitorenposten].Debitorennr_;

Um zu diesem Ergebnis zu kommen ist es nötig das Sie die Tabelle Detaillierte Debitorenposten in Access über NODBC verlinken. Danach ist eine neue Auswahlabfrage mit dem oben angeführten Select Beispiel zu erstellen.



Nach diesem Schema kann man sich die Werte typischer FlowFields wie hier Debitor."Bewegung (MW)" mit Datumsfilter über die dahinterstehende CalcFormula doch in die Access-DB ziehen, und die Abfrage auch direkt mit Joins auf andere Accesstabellen versehen.
Ansonsten wäre wohl eine verbesserte Version der Access Jet Engine nötig, um pred SetFlowFilter auch direkt nutzen zu können. Ich denke aber, die beiden Alternativen von Marl und Herrn Tupy sind sehr hilfreich, um die FlowFilter unter Access doch zu benutzen!

Grüße Oliver