SQLServer View ansprechen

4. Juli 2006 15:57

Hallo,

möchte gerne in einer Nav SQL-Serverdatenbank einige wichtige Sichten (VIEW) anlegen. Wie kann ich dann unter Nav diese View ansprechen um zum Beispiel die Daten in einer Form darzustellen oder als Tabelle darzustellen.

Danke für die Hilfe!!!

4. Juli 2006 18:47

Es ist mir Navision nicht möglich, SQL-Views anzuzeigen. Es können nur Tabellen verwendet werden, die auch innerhalb von Navision erstellt wurden.

Ich kenne SQL nicht genau, aber wenn sich soeine VIEW als Datei speichern lässt und diese dann z.B. mit einem Doppelklick ausgeführt werden könnte, dann wäre es immerhin möglich, mit dem Befehl HYPERLINK diese View aus Navision heraus zu starten.

4. Juli 2006 20:11

Es gibt ein Table Property "LinkedObject", welches genau für sowas gedacht ist:

Navision Online-Hilfe hat geschrieben:LinkedObject
Use this property to link to SQL Server objects.

Applies to
Tables in the Microsoft SQL Server Option for Navision.

Comments
When you set the LinkedObject property to Yes, the LinkedInTransaction property becomes available.
Navision Online-Hilfe hat geschrieben:LinkedInTransaction
Use this property to read and modify data from linked server data sources, such as Excel, Access or another SQL Server.

Applies to
The Microsoft SQL Server Option for Navision.

Comments
This property is available when you have set the LinkedObject property to Yes.

You must set the LinkedInTransaction property to No when the Navision table description refers to an object outside the current database or on a linked server.

The access to linked server data sources is not under Navision transaction control. This means that if a Navision transaction is aborted, any changes that were made during this transaction to a linked object that is outside the current database or on a linked server will remain in effect.

For more information, see the manual Application Designer's Guide.

5. Juli 2006 10:56

Hallo Herr Lässer,

gibt es hierfür irgendwo ein Beispiel. Bei mir funktioniert das nicht, ich kann die Daten der erstellten View nicht in Nav sehen. Die Tabelle ist leer !

Danke für weitere Hinweise.

6. Juli 2006 00:34

MyERP hat geschrieben:Hallo Herr Lässer,
[...]
Nicht so förmlich (-:
In Internet-Foren ist das Du üblich, und auch auf MSDynamics.de hat sich das Du durchgesetzt.
Immerhin sitzen wir alle im gleichen Boot (sozusagen auf der MS Dynamics); der Eine beim Kunden, der Andere beim MBSP.


MyERP hat geschrieben:[...]
Danke für weitere Hinweise.
Leider bin ich kein SQL-Spezialist, daher kann ich hier keine weiteren Informationen liefern.
Ich bin irgendwann mal über diese Properties "gestolpert" und habe neugierigerweise die Online-Hilfe befragt.

6. Juli 2006 00:49

Ich habe mal im Application Designer's Guide nachgelesen. Es gibt dort ein mehrseitiges Kapitel zu diesem Thema. Ich denke, ohne diese Anleitung wird es schwierig, die Verbindung hinzubekommen.

Unter vielem anderen steht da:
Der Name des SQL Server Objektes, welches Mandantennamen und ($) separator enthält muss genau mit dem Tabellennamen in Navision übereinstimmen.

Der Anwender muss Mitglied in der 'db_owner fixed database' sein.

Ich empfehle auf jeden Fall, dieses Kapitel zu studieren.

Da ich diese Funktion bis anhin nicht gekannt habe, kann ich leider auch nicht viel mehr dazu sagen.

18. Juli 2006 00:54

Hallo zusammen,

anbei ein kleines Beispiel für eine View, die ich als "Tabelle" in Navision einbinden kann.
Hierbei handelt es sich um eine gekürzte View, die als Beleghistorie aus Rechnungen, Lieferungen und Gutschriften zum Kunden verwendet wird.
Das Beispiel stammt aus meinem Navision SQL Workshop.

Gruß
Thomas

SQL View:
CREATE VIEW V_VKBELEGE AS
SELECT 'Rechnung ' Belegart, [No_] FROM [DATENBANKNAME].[dbo].[MANDANTENNAME$Sales Invoice Header]
UNION SELECT 'Lieferung ' Belegart, [No_] FROM [DATENBANKNAME].[dbo].[MANDANTENNAME$Sales Shipment Header]
UNION SELECT 'Gutschrift' Belegart, [No_] FROM [DATENBANKNAME].[dbo].[MANDANTENNAME$Sales Cr_Memo Header]


Navision Objekt:
OBJECT Table 99999 V_VKBELEGE
{
OBJECT-PROPERTIES
{
Date=25.03.04;
Time=18:28:51;
Modified=Yes;
Version List=TRZ-SQLPerf;
}
PROPERTIES
{
DataPerCompany=No;
}
FIELDS
{
{ 1 ; ;Belegart ;Text30 }
{ 2 ; ;No. ;Code10 }
}
KEYS
{
{ ;Belegart,No. }
}
CODE
{

BEGIN
END.
}
}

DataPerCompany

25. April 2007 18:01

Hallo!

Ich habe genau das gleiche Problem, wie es Rzyszka in seinem Beispiel beschreiben hat. Sein Beispiel funktioniert auch, so lange man davon ausgeht, dass nur ein Mandant existiert... Wenn nicht sehe da ein Problem, für das ich auch keine Lösung habe.

PROPERTIES
{
DataPerCompany=No;
}


Wenn ich nun die Tabelle von einem anderen Mandanten aus, als Sie in der View definiert wurde aufrufe, werden mir trotzdem die Datensätze des in der View definierten Mandanten zurückgegeben.

Hat jemand vielleicht eine Lösung?

25. April 2007 21:29

In dem Fall "DataPerCompany = Yes" muss der View den Mandantennamen im Namen führen; also z.B.

CREATE VIEW dbo."CRONUS$TestView" AS ...

anstatt

CREATE VIEW dbo."TestView" AS ...

In NAV bleibt der Name "TestView".

26. April 2007 09:45

Hallo!

Ersteinmal vielen Dank stryk für die Info.

Ich dachte mir anfangs auch, dass die View den Mandantennamen in Form von CRONUS$Testview braucht, aber jedes mal, wenn ich versucht habe das gleichlautende Objekt in Navision abzuspeichern erschien die Meldung "No Table Data".

Eine vielleicht wichtige Info, die für andere an dieser Stelle hilfreich sein könnte ist, dass Navsion prüft, ob die angeforderte View für alle existierenden Mandaten angelegt ist. Sollte das nicht der Fall sein, erscheint die o.g. Fehlermeldung.

d.h.
Wird in Nav eine Objekt mit den Properties DataPerCompany=Yes und LinkedObjekt=Yes erstellt, prüft Navision beim Speichern, ob diese View für jeden angelegten Mandanten existiert.

Und das ist auch gut so...

Re: SQLServer View ansprechen

23. September 2008 17:56

Hallo, MyERP,

hier ein Link zu einer Seite, auf der genau beschrieben ist, welche Abhängigkeiten zwischen einer SQL-Sicht und der korrespondierenden neu erstellten Navision-Tabelle bestehen: http://techblog.byllemos.com/?p=67

Dort ist beschrieben, dass die Feldnamen in SQL und NAV identisch sein müssen. Meiner Erfahrung nach muss man auch die Datentypen berücksichtigen, also lieber mal statt CODE besser TEXT verwenden.

Hat mir bei der Lösung eines Problems mit der ODER-Verknüpfung mehrer SETFILTER-Befehle auf unterschiedliche Felder enorm geholfen. Kostet zwar mal wieder eine Tabellenlizenz, aber, na ja, was soll's... :wink:

Gruß
Matthias

Re: SQLServer View ansprechen

3. Juni 2010 18:11

Hallo

Views waren mir klar. Aber Excel???
LinkedInTransaction
Use this property to read and modify data from linked server data sources, such as Excel, Access or another SQL Server.


Geht das wirklich? Dafür hätte ich eine prima Verwendung.
Hat das schon einmal jemand gemacht?

Gruss

Re: SQLServer View ansprechen

3. Juni 2010 20:09

Yo, das funzt!

Man kann im SQL Server einen "Linked Server" auf ein Excel Sheet einrichten; dann einen View in der NAV DB erstellen, der diesen LS abfrägt; diesen View wiederum kann man als "Linked Object" in NAV einbinden ...
Die Performance von solchen Gebilden lässt zwar zu wünschen übrig, und man sollte sowas nicht in ständige ERP Prozesse einbinden, aber z.B. für Datenübernahmen etc. ist sowas schon gut zu gebrauchen! 8-)

Re: SQLServer View ansprechen

4. Juni 2010 08:35

Cool

Danke für die Info. Werde das mal probieren.

Betreffend der Performance ist das mit Linked-Objects in NAV so eine Sache.
Wir haben z.b. einen View der gewisse Umsatzzahlen aus den Tabellen holt.
Die Abfrage läuft auf dem SQL-Server schnell.
Wenn die Tabelle die auf diesen View zeigt geöffnet wird, sinkt die Performance aber leider so ziemlich ab.
Noch hässlicher ist das scrollen in der Form in NAV. Relativ langsam und komisches Refreshverhalten.

Gruss

Re: SQLServer View ansprechen

4. Juni 2010 10:14

Ja, die Performance von "Views" in NAV lässt grundsätzlich zu wünschen übrig.
Wenn möglich, dann könnte man den View ggf. indizieren ("Indexed View" googeln), dann läuft's etwas sportlicher ... das ist aber mit einigen SQL Klauseln nicht anwendbar (z.B. UNION, HAVING, etc.) ...

Im "schlimmsten" Fall ist es vielleicht sogar ratsam die Daten aus mehreren Tabellen (mit UNION, HAVING & Co.) zuerst in eine separate Tabelle zu laden, dort auch die notwendigen Indexe zu haben, und diese Tabelle dann in NAV einzubinden ...

Re: SQLServer View ansprechen

4. Juni 2010 10:26

Halllo Jörg

Habe ich gemacht.
Einen View angelegt und Indexiert.
Wenn ich den View im Managementstudio ausführe ist er rasend schnell. Fast unglaublich schnell.
In Nav nicht mehr so :-(

Gruss

Re: SQLServer View ansprechen

4. Juni 2010 11:11

Du kannst Dir den NAV Aufruf ggf. mal mit dem "SQL Profiler" ansehen um Abfragen zu finden, die hier u.U. viele "Reads" (z.B. >= 1000) aufweisen.
Wenn Du dem View nun einen "Clustered Index" verpassen konntest, dann fehlt nun ggf. ein NAV-optimaler "Non-Clustered Index" ...

Wenn Du tatsächlich so eine Problemabfrage findest, dann könntest Du sie hier posten - ggf. können wir dan gemeinsam 'nen guten Index "erarbeiten"!?!

Re: SQLServer View ansprechen

4. Juni 2010 11:12

Hi,

1. habe ich das http://www.sql-server-performance.com/tips/t_sql_select_p1.aspx

2. dann habe ich noch was im Kopf statt union mit select into in eine temp. Tabelle zu arbeiten, aber das weiß Jörg bestimmt besser.

Volker

Re: SQLServer View ansprechen

4. Juni 2010 12:00

vsnase hat geschrieben:Hi,

1. habe ich das http://www.sql-server-performance.com/tips/t_sql_select_p1.aspx

2. dann habe ich noch was im Kopf statt union mit select into in eine temp. Tabelle zu arbeiten, aber das weiß Jörg bestimmt besser.

Volker


Das Problem dabei ist eben, dass ein View nicht indiziert werden kann, wenn UNION verwendet wird (siehe auch http://msdn.microsoft.com/en-us/library/ms191432.aspx) ...
und eine echte SQL temporäre Tabelle kann in NAV nicht eingebunden werden ...

Bleibt also nix anderes übrig - wie gesagt, wenn der View nicht indiziert werden kann - die in eine echte physikalische Tabelle zu pumpen ...

Aber so wie's aussieht konnte der View ja indiziert werden. Problem dabei is aber noch, dass es von der SQL Server Edition abhängt, ob diese Indexe auch verwendet werden ("Index Matching" = Enterprise), ansonsten muss der Hint "NOEXPAND" verwendet werden - und das macht NAV m.E. nur bei VSIFT, nicht bei "Linked Objects" ...
(siehe auch http://www.sql-server-performance.com/tips/indexed_views_p1.aspx)

Re: SQLServer View ansprechen

20. November 2011 19:20

ich habe festgestellt, dass wenn man Views in Forms anzeigt, für jede Zeile die Viewabfrage ausgeführt wird. Genauso ist es, wenn in der Form gescrollt wird. Für jeden Datensatz wird die View erneut ausgeführt. Das ist das eigentliche Performanceproblem. Es wurde jetzt so gelöst, dass beim Öffnen der Form die View in eine temporäre NAV-Tabelle geladen wird und die temp. Tabelle angezeigt wird. Das geht dann natürlich nur für zeitunkritische Daten, da die Daten nur so aktuell sind, wie sie beim Öffnen der Form waren, aber dann ist es auch schnell, da die View nur einmal abgefragt wird.
Weiß einer warum NAV die Viewdaten in Forms (auch Pages) so bescheiden ausliest? Kann das ggf. noch anders gelöst werden ?