none
Zeilen zählen bei bestimmten SharePoint Multi Choice Inhalt RRS feed

  • Frage

  • Hallo,

    mich beschäftigt eine Problem, für das ich auch nach längerer Suche keine Lösung finde. Vielleicht kann mir hier geholfen werden.

    Ich beziehe im Report Builder 3.0 meine Daten aus einer SharePoint 2010 Liste. Ich möchte nun alle Zeilen zählen, in dem in dem Feld "Positive DR Test Date" in den letzten drei Jahren (2014, 2015,2016) ein Test durchgeführt wurde. Es kann nur ein test gewesen sein, es können aber auch mehrere Testeinträge vorhanden sein. Das Feld ist im SharePoint ein Multi-Choice Feld, welches ich mir für den Report zurecht getrimmt habe. Die Spalte "Pos DRT" ist das Originalfeld und dient mir im Report nur temporär als Vergleich. 

    Wenn ich nun in einer Expression folgende Formel (als Anfang) anwende : '=Sum(IIf(Fields!PosDRT_TestDate.Value = "*2015*" , 1 , 0) , 0), "DataSet1")', sollte ich als Ergebnis zumindest alle erhalten, die den Wert "2015" irgendwo enthalten. Stattdessen bekomme ich die Fehlermeldung :

    _____

    Der Value-Ausdruck für das textrun-Objekt 'AppNoEvidence.Paragraphs[0].TextRuns[0]' weist einen Bereichsparameter auf, der für eine Aggregatfunktion ungültig ist. Der Bereichsparameter muss auf eine Zeichenfolgenkonstante festgelegt sein, die einem der folgenden Werte entspricht: dem Namen einer enthaltenden Gruppe, dem Namen eines enthaltenden Datenbereichs oder dem Namen eines Datasets.

    ______

    Was mache ich hier falsch ? Ich hoffe Ihr könnt mir hier weiterhelfen.

    Vielen Dank schon einmal.

    Donnerstag, 13. Juli 2017 07:51

Antworten

  • Hallo!

    Ich hätte da noch einen ganz anderen Ansatz. Wandle den Suchwert in ein XML um, und verarbeite ihn als Tabelle! ;-)

    Declare @Test as Table(Zeile int, PosDrt_TestDate varchar(100));
    
    Insert into @Test(Zeile, PosDrt_TestDate) values (1, '2014');
    Insert into @Test(Zeile, PosDrt_TestDate) values (2, '2015');
    Insert into @Test(Zeile, PosDrt_TestDate) values (3, '2016');
    Insert into @Test(Zeile, PosDrt_TestDate) values (4, '2014,2015,2016');
    Insert into @Test(Zeile, PosDrt_TestDate) values (5, '2015,2016');
    
    Select Zeile, PosDrt_TestDate
    from @Test;
    
    
    Select Zeile, PosDrt_TestDate, CONVERT(xml,' <root> <s>' + REPLACE(PosDrt_TestDate, ',', '</s> <s>') + '</s>   </root> ') as X
    from @Test;
    
    With Vorbereitung as
    (
    	Select Zeile, PosDrt_TestDate, CONVERT(xml,' <root> <s>' + REPLACE(PosDrt_TestDate, ',', '</s> <s>') + '</s>   </root> ') as X
    	from @Test
    ),
    Aufteilung as
    (
    	SELECT Zeile, Element = T.c.value('.','nvarchar(32)')
    	FROM Vorbereitung
    	CROSS APPLY X.nodes('/root/s') T(c)
    )
    Select Zeile, Element
    from Aufteilung
    where Element = '2015';

    Vorraussetzung ist, dass der Trenner hier immer gleich ist, z. B. ein Komma, sonst musst Du das im REPLACE entsprechend anpassen.

    Das ist natürlich in diesem doch recht einfachen Fall etwas Oversized und man könnte dies auch einfach durch einen CASE-Ausdruck mit LIKE erreichen

    With Vorselektion as
    (
    	Select Zeile, PosDrt_TestDate, case when PosDrt_TestDate like '%2015%' then 1 else 0 end as Treffer
    	from @Test
    )
    Select SUM(Treffer) as Summe_Treffer
    from Vorselektion
    ;

    HTH!


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu


    Freitag, 14. Juli 2017 07:13

Alle Antworten

  • So ganz verstehe ich deinen SUM-Ausdruck nicht, da hier ein paar Angaben und Klammern zu viel sind:

    Sum(

    IIf(

    Fields!PosDRT_TestDate.Value = "*2015*" , 1 , 0  <= Hier wird 1 (True) oder 0 (false) geliefert

    ) <= Abschluss des IIF

    , 0), "DataSet1" <= was soll dieser Teil des Ausdruckes?

    ) <= Abschluss SUM

    Siehe hier:
    https://support.office.com/en-us/article/SUM-function-c53f1b99-6aef-4622-b2aa-45f924727b37?ui=en-US&rs=en-US&ad=US&fromAR=1

    Donnerstag, 13. Juli 2017 11:13
  • Hallo,

    danke für die Antwort, da hat sich der Kopierteufel eingeschlichen. Die verwendete Funktion lautet --> =Sum(IIf(Fields!PosDRT_TestDate.Value = "*2015*", 1 , 0), "DataSet1"). Da Ergebnis ist nun "0", es sind aber definitiv einige Datensätze vorhanden.

    Donnerstag, 13. Juli 2017 12:56
  • So wie ich die Beschreibung sehe, ist SUM hier keine Aggregat-Funktion (Gruppensumme):

    "=SUM(1, 2, 3)" ist dann das gleiche wie "=1 + 2 + 3"

    Warum das so ist, kann ich auch nicht sagen.
    Und worauf soll "Dataset1" verweisen?
    Laut Beschreibung muss ein Zahlwert herauskommen oder man gibt einen Spaltennamen an "[Dataset1]", falls du so eine Spalte hast.

    Vielleicht suchst du da dann mal eher nach dem Stichwort Aggregate und Gruppen-Summen.

    Donnerstag, 13. Juli 2017 15:20
  • Hallo!

    Ich hätte da noch einen ganz anderen Ansatz. Wandle den Suchwert in ein XML um, und verarbeite ihn als Tabelle! ;-)

    Declare @Test as Table(Zeile int, PosDrt_TestDate varchar(100));
    
    Insert into @Test(Zeile, PosDrt_TestDate) values (1, '2014');
    Insert into @Test(Zeile, PosDrt_TestDate) values (2, '2015');
    Insert into @Test(Zeile, PosDrt_TestDate) values (3, '2016');
    Insert into @Test(Zeile, PosDrt_TestDate) values (4, '2014,2015,2016');
    Insert into @Test(Zeile, PosDrt_TestDate) values (5, '2015,2016');
    
    Select Zeile, PosDrt_TestDate
    from @Test;
    
    
    Select Zeile, PosDrt_TestDate, CONVERT(xml,' <root> <s>' + REPLACE(PosDrt_TestDate, ',', '</s> <s>') + '</s>   </root> ') as X
    from @Test;
    
    With Vorbereitung as
    (
    	Select Zeile, PosDrt_TestDate, CONVERT(xml,' <root> <s>' + REPLACE(PosDrt_TestDate, ',', '</s> <s>') + '</s>   </root> ') as X
    	from @Test
    ),
    Aufteilung as
    (
    	SELECT Zeile, Element = T.c.value('.','nvarchar(32)')
    	FROM Vorbereitung
    	CROSS APPLY X.nodes('/root/s') T(c)
    )
    Select Zeile, Element
    from Aufteilung
    where Element = '2015';

    Vorraussetzung ist, dass der Trenner hier immer gleich ist, z. B. ein Komma, sonst musst Du das im REPLACE entsprechend anpassen.

    Das ist natürlich in diesem doch recht einfachen Fall etwas Oversized und man könnte dies auch einfach durch einen CASE-Ausdruck mit LIKE erreichen

    With Vorselektion as
    (
    	Select Zeile, PosDrt_TestDate, case when PosDrt_TestDate like '%2015%' then 1 else 0 end as Treffer
    	from @Test
    )
    Select SUM(Treffer) as Summe_Treffer
    from Vorselektion
    ;

    HTH!


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu


    Freitag, 14. Juli 2017 07:13