[Gelöst]FlowFields in SQL Reporting Services abbilden

3. Januar 2008 14:38

Ich möchte mir den Inhalt von FlowFields in SQL Reports anzeigen lassen. Lassen sich die Inhalte überhaupt abrufen? Wie und wo?

Und wenn es nicht geht:
Ich habe es auf dem manuellen Weg probiert (also eine SQL-Abfrage manuell eingegeben). Als Ergebnis pinselt mir der Manager einfach und ungefragt eine INNER JOIN-Klausel rein oder das Ergebnis ist falsch (liefert nur den ersten Datensatz).

Beispiel: Ich habe 5 Datensätze der Tabelle a. Dort gibt es das Feld Artikelnummr. Ich möchte mir in der Ergebnismenge außer allen Feldern der Tabelle a auch den Artikelnamen ausgeben lassen, der sich aber nur in Tabelle b befindet.

Meine Abfragen liefern - wenn überhaupt - zwar alle 5 Datensätze der Tabelle a, doch das Artikelnamenfeld ist nur für den ersten Datensatz gefüllt, der Rest ist <null>.

PS: Das Ganze spielt sich testweise in einem View ab, der die o.g. Ergebnismenge liefern soll.
Zuletzt geändert von Natalie am 8. Januar 2008 10:34, insgesamt 1-mal geändert.

3. Januar 2008 18:15

Hallo Natalie,

FlowFields kannst Du per Select Sum(Field) nachbikden und in das DataSet einbinden oder das SQL-RS-Control z.B. Matrix oder Liste mit Teilsummen benutzen.

Falls Du die SIFT-Tabelle benutzen möchtest, kommst Du um ein JOIN nicht herum, d.h. die Struktur der SIFT-Tabellen kannst Du anhand der eingestellten SIFT-Level in den Keys ablesen und Dein JOIN entsprechend formulieren.

Viele Grüße
Björn

3. Januar 2008 19:23

Mit Select Sum soll ich einen Lookup(!)-FlowField nachbilden?
Kannst du mir bitte ein Beispiel geben?

3. Januar 2008 20:21

Mit Select Sum soll ich einen Lookup(!)-FlowField nachbilden?
Kannst du mir bitte ein Beispiel geben?


Damit kannst Du nur die Summe nachbilden.
Der Drilldown muss als Subreport manuell extra erstellt werden und per Link und Filterübergabe per Parameter eingebunden werden.

3. Januar 2008 21:27

Sorry, Bahnhof.
Können wir bitte von vorn beginnen?
Ich wollte - noch vor dem eigentlichen SQL Report - mir einen View (im SQL Server Management Studio) bauen. Da FlowFields (in dem Fall also nur ein einfacher Lookup auf eine zweite Tabelle) scheinbar nicht direkt als Feld ausgewählt werden können (zumindest finde ich das Feld nirgends), bastle ich mir nur zum Spaß und um es zu lernen, eine SQL-Abfrage:
Alle Datensätze der Tabelle a, aber für jede Zeile mit Werten aus der Tabelle b.
Egal wie ich an der SQL-Anweisung rumschraube - meist kommt nur ein einziger Datensatz heraus (der hat dann immerhin das "FlowField" im Ergebnis.

Teil zwei meines Thema war die Umsetzung direkt in Reporting Services (also völlig unabhängig vom SQL-View).
Ich möchte keinen Drilldown realisiern, sondern da soll (u.a.) einfach der Wert aus Tabelle b stehen.

Werden FlowFields tatsächlich nicht in der SQL-DB abgelegt? Habe nämlich gerüchteweise schon vom Gegenteil gehört ...

3. Januar 2008 22:21

Nochmal zu Teil 1 (View):

Ich hatte scheinbar bisher alles richtig gemacht, nur mit der Tabelle (?) stimmt was nicht.

Folgendes Ergebnis wollte ich erreichen:
Tabelle A hat die Felder:
- Nr.
- Code
Diese Tabelle hat 3 Datensätze (Feld Nr. 1 - 3).

Tabelle B hat u.a. die Felder
- Code
- Name

Ich möchte mir den Namen mit ausgeben lassen. Meine SQL-Anweisung sieht sinngemäß so aus:

Code:
SELECT      A.Nr., A.Code, B.Name
FROM        A
INNER JOIN  B
ON          A.Code = B.Code

Als Ergebnis erhalte ich drei Zeilen mit jeweils dem richtigen Namen.

Nach genau dem gleichen Prinzip habe ich das bei zwei anderen Tabellen angewendet (eine davon keine Standardtabelle). Hier hätten auch mehrere Datensätze mit je einem Namen herauskommen sollen - ausgegeben wird aber nur der ERSTE Datensatz mit dem richtigen Namen.

Was kann hierfür die Ursache sein? Beide Felder (A.Code und B.Code) sind beide Code 20. TableRelation von A.Code ist genauso aufgebaut wie in dem Beispiel, in dem es noch funktionierte.

Ich bin völlig ratlos.
Dummerweise muss das bis Montag laufen :-(

4. Januar 2008 02:30

Ich denke, das könnte am inner join liegen, versuch mal left join oder right join

4. Januar 2008 09:17

Michael Schumacher hat geschrieben:Ich denke, das könnte am inner join liegen, versuch mal left join oder right join

Ganz abgesehen davon, dass dies nicht erklären würde, warum der gleiche Befehl bei andere Tabellen sehr wohl funktioniert, hat dein Vorschlag folgenden Effekt:

Bei LEFT JOIN erscheinen zwar alle Datensätze, doch der Name wird nur im ersten Datensatz angezeigt, der Rest ist <null>.

Bei RIGHT JOIN erscheinen wieder alle Datensätze und die Namen werden überall richtig angezeigt - außer in der ersten Zeile!

Ich möchte noch ergänzen: Das FlowField, das ich da versuche nachzubauen, zeigt in NAV in jeder Zeile einen Wert an (funktioniert also richtig).

4. Januar 2008 09:27

Was kann hierfür die Ursache sein? Beide Felder (A.Code und B.Code) sind beide Code 20. TableRelation von A.Code ist genauso aufgebaut wie in dem Beispiel, in dem es noch funktionierte.


Haben denn A und B die gleicne Anzahl von Datensätzen?

Ganz abgesehen davon, dass dies nicht erklären würde, warum der gleiche Befehl bei andere Tabellen sehr wohl funktioniert, hat dein Vorschlag folgenden Effekt:

Bei LEFT JOIN erscheinen zwar alle Datensätze, doch der Name wird nur im ersten Datensatz angezeigt, der Rest ist <null>.

Bei RIGHT JOIN erscheinen wieder alle Datensätze und die Namen werden überall richtig angezeigt - außer in der ersten Zeile!

Ich möchte noch ergänzen: Das FlowField, das ich da versuche nachzubauen, zeigt in NAV in jeder Zeile einen Wert an (funktioniert also richtig).


Der INNER JOIN liest aus der linken Relation (Tabelle A) und aus der rechten Relation (Tabelle B) nur Datensätze, die in beiden Tabellen enthalten sind.

Der LEFT JOIN bzw. der LEFT OUTER JOIN liest aus der linken Relation (Tabelle A) alles und nur die Datensätze aus Tabelle B mit gleichem Primärschlüssel, d.h. die aufgetretenen NULL-Werte sind vollkommen normal. Beim RIGHT JOIN bzw. RIGHT OUTER JOIN verhält es sich analog.

4. Januar 2008 09:34

MrBurns hat geschrieben:
Was kann hierfür die Ursache sein? Beide Felder (A.Code und B.Code) sind beide Code 20. TableRelation von A.Code ist genauso aufgebaut wie in dem Beispiel, in dem es noch funktionierte.

Haben denn A und B die gleiche Anzahl von Datensätzen?

In beiden Fällen gibt es für jeden A.Code einen Eintrag in Tabelle B.
Tabelle A enthält nur einen kleinen Teil aller B.Codes.
In beiden Fällen taucht ein (oder mehr) Code mehrfach in Tabelle A auf.
Im ersten Fall (Lookup auf eine Standardtabelle) ist das Ergebnis genau richtig...!

4. Januar 2008 09:49

Im ersten Fall ist das Ergebnis genau richtig...!

Dann funktioniert Dein JOIN


Werden FlowFields tatsächlich nicht in der SQL-DB abgelegt? Habe nämlich gerüchteweise schon vom Gegenteil gehört ...


FlowFields werden den sog. SIFT-Tabellen abgelegt. Diese Tabellen erkennt man an der Tabellennummer z.B. CRONUS$32$0 -> Enthält die SumIndexFields des ersten Keys mit MaintainSIFTIndex=Yes und aktivierten SIFT-Leveln der Tabelle Artikelposten des Mandanten CRONUS.
Die "richtigen" Tabelle sind nach folgendem Schema aufgebaut: Companyname$Table Name

4. Januar 2008 09:53

FlowFields werden den sog. SIFT-Tabellen abgelegt.

Das gilt nur für die SUM-FlowFields. Die Exist- bzw. Lookup-Lookup-FlowFields sind dann eben JOINS oder Subqueries.

4. Januar 2008 09:54

MrBurns hat geschrieben:Dann funktioniert Dein JOIN

Nur nicht bei der Tabelle, für die ich das eigentlich die ganze Zeit heraus finden wollte ...

FlowFields werden den sog. SIFT-Tabellen abgelegt. Diese Tabellen erkennt man an der Tabellennummer z.B. CRONUS$32$0 -> Enthält die SumIndexFields des ersten Keys mit MaintainSIFTIndex=Yes und aktivierten SIFT-Leveln der Tabelle Artikelposten des Mandanten CRONUS.
Die "richtigen" Tabelle sind nach folgendem Schema aufgebaut: Companyname$Table Name

Gilt das nur für Sum-FlowFields?
"Mein" Lookup-FlowField befindet sich in der Tabelle 50016. Es gibt aber keine Tabelle Namens Mandantenname$50016$0. Dein genanntes Beispiel habe ich aber gefunden.

4. Januar 2008 10:02

Gilt das nur für Sum-FlowFields?


Die Behandlung der SUM-Flowfields wird von MS für 5.0 SP1 ab SQL Server 2005 von SIFT-Tabellen auf IndexedViews geändert. Deswegen wäre eine Integration von SIFT-Tabellen nur von kurzer Dauer. Ich würde für Summen-Flowfields vorerst dann eher eine Unterabfrage mit Select Sum bevorzugen.

Mehr Informationen zu der Änderung von SIFT sind in dem Beitrag von Jörg Stryk in diesem Thread http://www.msdynamics.de/viewtopic.php? ... highlight=

4. Januar 2008 10:10

Und was heißt das jetzt für mein Lookup-FlowField?
Wir nutzen 5.0 ohne Update.

4. Januar 2008 10:19

Für Dein Lookup-Flowfield ändert sich nichts, zumal der Weg um Daten zusammenzufügen mit dem JOIN in Nicht-NAV-Datenbanken eher die Regel ist. Lookup-Flowfields und Exist-Flowfields werden von dieser Änderung vermutlich nicht berührt, da sie eh nicht in der Datenbank gespeichert werden.


Wir nutzen 5.0 ohne Update.

Entschuldige meine unklare Ausdrucksweise. Ich meinte nicht NAV 5.00 Update 1, sondern NAV 5.00 Service Pack 1.

4. Januar 2008 10:33

MrBurns hat geschrieben:-Flowfields und Exist-Flowfields werden von dieser Änderung vermutlich nicht berührt, da sie eh nicht in der Datenbank gespeichert werden.

Auf die Aussage habe ich die ganze Zeit gewartet ... Oje.

4. Januar 2008 10:35

In IndexedViews können auch nichtnumerische Spalten gespreichert werden. Für diesen Fall ist ist aber Deine Lösung sauberer, da Du Dich unabhängig von den MS-Modellen machst.

4. Januar 2008 10:42

Natalie

habe das mal so probiert. Wie oben schon erwähnt hab ich einen Right outer join verwendet. nun zeigt er alles aus der tab Item an und alles aus der Tab Item Ledger Entry

Code:
SELECT     [CRONUS (Schweiz) AG$Item Ledger Entry].[Entry No_], [CRONUS (Schweiz) AG$Item].No_, [CRONUS (Schweiz) AG$Item].Description
FROM         [CRONUS (Schweiz) AG$Item] RIGHT OUTER JOIN
                      [CRONUS (Schweiz) AG$Item Ledger Entry] ON [CRONUS (Schweiz) AG$Item].No_ = [CRONUS (Schweiz) AG$Item Ledger Entry].[Item No_]


für eine darstellung einer summe kannst du ja in der Anzeige gruppieren... (wobei das in meinem fall nicht gerade sinnvoll wäre, die Entry No zu gruppieren)

Edit:
hier eines mit Flow-Fields

Code:
SELECT     [CRONUS (Schweiz) AG$Item].No_, [CRONUS (Schweiz) AG$Item].Description, SUM([CRONUS (Schweiz) AG$Item Ledger Entry].[Remaining Quantity])
                      AS [Remaining Quantity]
FROM         [CRONUS (Schweiz) AG$Item] RIGHT OUTER JOIN
                      [CRONUS (Schweiz) AG$Item Ledger Entry] ON [CRONUS (Schweiz) AG$Item].No_ = [CRONUS (Schweiz) AG$Item Ledger Entry].[Item No_]
GROUP BY [CRONUS (Schweiz) AG$Item].No_, [CRONUS (Schweiz) AG$Item].Description
Zuletzt geändert von Bender am 4. Januar 2008 10:51, insgesamt 2-mal geändert.

4. Januar 2008 10:44

Prima, danke bis hierher.
Jetzt bleibt noch das Problem mit unserer Tabelle 50016.

Nur als Hintergrundwissen, warum ich glaube, dass es an der Tabelle 50016 hängt:
Ich hatte mit einem anderen Tabellenobjekt der gleichen Reihe (es ist ein Partnermodul) auch ein sehr mysteriöses, ganz anderes Problem, zurück in NAV:
Die Tabelle enthielt ein Option-Field. Den OptionString (und natürlich die -caption) habe ich um weitere Optionen erweitert.
Stand ich in der Tabelle und habe einen Lookup auf die Option gemacht, wurde an Stelle 6 oder so nicht mehr die OptionCaption, sondern der Integerwert angezeigt.
Habe ich das gleiche Feld mit dem gleichen Inhalt in einer anderen (Standard-)Tabelle angelegt, so wurden alle Option-Captions beim Lookup richtig angezeigt.

Irgendwie ist da also der Wurm drin und ich weiß nicht, wonach ich eigentlich suchen soll....

4. Januar 2008 10:50

Ist das Problem mit der Tabelle 50016 reproduzierbar?
Beim Form-Designer verhält sich der NAV-Client manchmal auch sehr merkwürdig, was manchmal dazu führt, dasss die Form kaputt ist und neu erstellt werden muss. Evtl. hat der Client in der Tabelle ein ähnliches Problem. Klappt denn der Objektexport als Text? Ich würde die Tabelle exportieren als Text, löschen und wieder importieren und kompilieren. Falls Daten enthalten sind, diese vorher per Plumps-Dataport sichern.

4. Januar 2008 11:19

Hinweis:
Wenn ich direkt in Access diese Query nachbaue (nicht fertige Sicht nehmen, sondern direkt in Access selbst zusammen basteln) und das dann ausführe, erhalte ich folgende Fehlermeldung:

ODBC-Aufruf fehlgeschlagen.
Die Zeichenfolgedaten wurden rechts abgeschnitten.

Dies passiert mir nur bei der Tabelle 50016, Feld Name (also abstrakt unser B.Name).
In Access steht also im Ausgabefeld Name "#Fehler".

4. Januar 2008 11:21

ODBC-Aufruf fehlgeschlagen

Synchronisiere mal. Evtl. gibt es Diskrepanzen zwischen NAV und SQLServer

4. Januar 2008 11:30

MrBurns hat geschrieben:
ODBC-Aufruf fehlgeschlagen

Synchronisiere mal. Evtl. gibt es Diskrepanzen zwischen NAV und SQLServer
Nur für das Feld Name?
Die anderen Felder hat er richtig gefüllt. Und im übrigen zeigt er auch hier nur einen Datensatz an.

4. Januar 2008 11:38

Sobald Du in NAV an den Tabellen oder Zugriffsrechten etwas änderst, sollte synchronisiert werden.