2015-09-03 1 views
5

J'ai deux Tablix (tables) et un jeu de données. Ils bondissaient avec ce jeu de donnéesRapport RDLC - erreur Rownumber() ne peut pas être utilisé dans le filtre

Serial No. |  Name  
______________|________________ 
    SN0003  |  Beckham 
    SN0005  |  Henry 
    SN0012  |  Rooney 
    SN0119  |  Ji Sung 
    SN0200  |  Gerrard 

Dans mon rapport, je dois diviser deux tablix Il affiche comme ci-dessous ...

(Il est « de gauche à droite » avant « Jusqu'à Buttom »)

Serial No. |  Name  || Serial No. | Name 
______________|________________ || _______________|______________ 
    SN0003  |  Beckham  ||  SN0005  | Henry   
    SN0012  |  Rooney  ||  SN0119  | Ji Sung 
    SN0200  |  Gerrard  ||    | 

table de gauche est Tablix1 et table de droite est tablix2

Je pense que l'utilisation de cette FilterExpression pour chaque tableau.

 = RowNumber(Nothing) mod 2 = 0 

pour Tablix1 (table gauche)

 = RowNumber(Nothing) mod 2 = 1 

pour tablix2 (table droite)

Mais il est une erreur ce message ...

 "A FilterExpression for tablix ‘Tablix1’ uses the RowNumber function. 
     RowNumber cannot be used in filters." 

Il est ne peut pas utiliser Rownumber dans le filtre. Que dois-je faire? Est-ce possible si je n'édite pas le jeu de données?

Répondre

5

Est-il possible pour vous d'éditer l'ensemble de données que vous récitez en premier lieu? Vous pouvez ajouter un champ ROW_NUMBER à cela en utilisant

SELECT 
    ..., 
    ROW_NUMBER() OVER(ORDER BY SerialNo ASC) AS RowNum, 
    ... 

Ensuite, votre ensemble de données retourné ressemblerait

Serial No. |  Name  | RowNum 
______________|________________|__________ 
    SN0003  |  Beckham | 1 
    SN0005  |  Henry  | 2 
    SN0012  |  Rooney | 3 
    SN0119  |  Ji Sung | 4 
    SN0200  |  Gerrard | 5 

Et vous pouvez faire votre filtre sur RowNum mod 2 = 0

Modifier

Sinon, si vous ne pouvez pas modifier le jeu de données sous-jacent, vous pouvez être intelligent en utilisant RunningValue et CountDistinct.

CountDistinct vous donnera le nombre de lignes correspondant à l'ensemble de données, pour chaque ligne (donc, le plus souvent 1 en supposant que le numéro de série est unique)

RunningValue vous donnera une totale croissante des valeurs dans chaque rangée dans un table ... et avec cela, vous pouvez ajouter tous ces `CountDistincts '.

définir la visibilité de la ligne de votre table pour être quelque chose comme

Pour Tablix1

=(RunningValue(CountDistinct(Fields!SerialNo.Value), Sum, "DataSetName") mod 2) = 0 

Pour tablix2

=(RunningValue(CountDistinct(Fields!SerialNo.Value), Sum, "DataSetName") mod 2) = 1 
+0

Merci pour votre réponse.Et vous dire "Je suis désolé". Mon équipe ne souhaite pas modifier un jeu de données car cela a un impact sur une autre partie du projet. Est-ce possible si je résous ce problème sans éditer le datatable? –

+0

Édité pour donner la solution ne pas éditer le SQL sous-jacent – Jonnus

+0

Merci beaucoup. C'est du travail . Je crée une nouvelle base de données et clone toutes les données auxquelles une nouvelle colonne de données seq_no est ajoutée. Merci. –

0

[Résolu] Merci, Jonas

Cette mon datatable . J'ai créé une nouvelle colonne pour le magasin seq_no. par un clic droit> Ajouter une colonne et changer le nom « seq_no » enter image description here

étape suivante, je mis une valeur à seq_no colonne par codeing avec vb

   Dim dt As dsProductionControl.TL_PRODUCTION_SCHEDULE_DETAILSDataTable = DsProductionControl.TL_PRODUCTION_SCHEDULE_DETAILS 

       For i As Integer = 1 To dt.Rows.Count 
        dt.Rows(i).Item("SEQ_NO") = i 
       Next i 

Et mis Filtre à Tablix du rapport seq_no

 =Fields!SEQ_NO.Value Mod 2 = 0 

Merci, encore une fois Jonas.