Générer un rapport SSRS uniquement à partir de l'input de l'user

J'ai une exigence simple qui devient étonnamment difficile à réaliser dans SQL Reporting Services.

Mon rapport devrait faire ce qui suit:

  • L'user entre un integer, appelons-le A
  • Une label est générée pour chaque numéro de 1 à A
  • toutes les labels sont imprimées sur du papier A4 (quatre labels correspondent à une rangée, le nombre de rangées sera calculé en conséquence)

donc si l'user entre le numéro 100, alors 100 labels sont imprimées dans 25 rangées.

Pour de bonnes raisons, j'ai besoin d'utiliser SSRS – label contient un code à barres pour lequel j'ai un composant tiers fonctionnant uniquement dans SSRS. Je veux également intégrer ce rapport bien avec le système existant et utiliser tous les goodies de SSRS comme la pagination etc.

Comment cela peut-il être fait? Clairement, ce rapport n'a pas besoin de connection ou de données SQL, mais SSRS ne me laisse pas utiliser Tablix sans source de données réelle. J'ai essayé de créer un set de données fictif dans SQL, mais je ne sais pas comment créer la requête returnnant la table fictive du nombre donné de rangées.

Je serais bien s'il y avait une solution en utilisant seulement le script VB embedded dans le rapport. En ce moment je ne peux penser qu'à créer une table temporaire et à la remplir avec mes données, y a-t-il une solution plus élégante?

Si le problème se résume à avoir une requête return A lignes alors vous devriez aller chercher des techniques sql pour générer des tables de nombres. Voici une façon simple de le faire jusqu'à 25 lignes.

select d1.n * 5 + d0.n from (select 0 union all select 1 union all select 2 union all select 3 union all select 4) as d0(n), (select 0 union all select 1 union all select 2 union all select 3 union all select 4) as d1(n) where d1.n * 5 + d0.n < A 

Vous devrez établir une connection avec une database. Faites-le à n'importe quelle database n'importe pas et vous pouvez utiliser l'instruction suivante pour get les numbers

 DECLARE @A INT = 100; SELECT DISTINCT number FROM master..spt_values WHERE number >= 1 AND number <= @A 

Comme vous n'avez pas besoin de générer de données, vous pouvez créer quelque chose de très simple comme ceci pour générer des lignes (A / 4). Ce sera la base pour les lignes de votre tablix.

 DECLARE @A INT = 100; SELECT TOP (CAST(CEILING(@A / 4.0) AS INT)) AnyVal = 1 FROM sys.all_objects a, sys.all_objects b; 

Il y a un certain nombre d'autres façons de générer un set arbitraire, et avec l'exécution de loops / CTE récursives, il n'y a pas beaucoup à choisir entre elles. Cependant, vous aurez toujours besoin d'une connection à une database.

Pour aller plus loin, vous pouvez également indiquer quelles colonnes doivent être affichées:

 DECLARE @A INT = 5; SELECT DisplayCol1 = 1, DisplayCol2 = CASE WHEN RowNumber * 4 + 1 >= @A THEN 0 ELSE 1 END, DisplayCol3 = CASE WHEN RowNumber * 4 + 2 >= @A THEN 0 ELSE 1 END, DisplayCol4 = CASE WHEN RowNumber * 4 + 3 >= @A THEN 0 ELSE 1 END FROM ( SELECT TOP (CAST(CEILING(@A / 4.0) AS INT)) RowNumber = ROW_NUMBER() OVER(ORDER BY a.object_id) - 1 FROM sys.all_objects a, sys.all_objects b ) t; 

Cela donne:

 DisplayCol1 DisplayCol2 DisplayCol3 DisplayCol4 1 1 1 1 1 0 0 0 

Indiquant que pour afficher un total de 5 labels, il vous suffit d'afficher la première colonne de la ligne 2.