2008-11-06 13 views
6

Dans Reporting Services, je souhaite ajouter un paramètre contenant des données provenant d'un bloc de code personnalisé. Idéalement, je serais en mesure d'exécuter le code suivant (ceci est un exemple de test simple):Code personnalisé dans le rapport Reporting Services

Function GetPeriods() As String() 
Dim values As System.Collections.ArrayList = 
    New System.Collections.ArrayList() 
For i as integer = 1 to 24 
    values.Add(i) 
Next 
Return values.ToArray() 
End Function 

et mettre ce qui suit dans le « Champ de texte » du paramètre:

=Code.GetPeriods() 

Cependant, lorsque j'exécute le rapport, le paramètre auquel j'applique ceci est désactivé et vide. Y a-t-il une technique différente qui devrait être utilisée? Ou est-ce que je fais quelque chose de mal?

Répondre

0

Tout ce que j'ai vu nécessite des paramètres et leurs paramètres respectifs pour faire partie du RDL. Cela étant dit, si vous voulez «coder en dur» les valeurs, vous pouvez créer un ensemble de données uniquement pour le rapport, peut-être en XML, ou s'il doit être piloté par programme, le faire dans un service Web.

2

Si vous utilisez SQL 2008 Reporting Services, vous pouvez consulter this page, qui présente le concept d'utilisation d'assemblys personnalisés.

Si vous utilisez SQL 2005 Reporting Services, this link est celui que vous souhaitez.

C'est une chose plutôt triviale, compilez simplement votre code dans une bibliothèque de classes et suivez les instructions fournies pour permettre à votre rapport de s'y référer.

1

Vous pouvez créer la même procédure stockée sur SQL Server et charger des valeurs de paramètres à partir de cette procédure.

2

Vous renvoyez un élément de tableau (un tableau de chaînes) dans un champ de texte. Au lieu de cela, essayez de renvoyer une chaîne simple. Cela devrait fonctionner. Si vous souhaitez toujours renvoyer une liste de tableaux, vous devez la lier à un contrôle de liste dans votre RDL. Vous pouvez certainement le faire avec des extensions de jeu de données. Cependant, je ne suis pas sûr s'il y a un autre moyen facile. Vérifiez les propriétés du contrôle de liste et voyez si cela vous permet de lier directement à une liste de tableaux.

1

J'ai vérifié votre code. La seule chose qui ne va pas, c'est que votre fonction renvoie String(). Lorsque j'ai changé la signature de votre méthode pour retourner Array, cela a bien fonctionné, dans mon rapport.

Modifier la signature à Function GetPeriods() As Array

1

Pour accéder à vos membres/fonctions mises en œuvre dans le code personnalisé de SSRS rapport que vous devez définir le modificateur d'accès à "Public":

Public Function GetPeriods() As String 
... 

voir article Writing Custom Code in SQL Server Reporting Services

+0

*** http: //blogs.sqlxml.org/bryantlikes/articles/824.aspx*** pas trouvé _404 error_ – Kiquenet

1

J'ai essayé de faire la même chose, mettre une simple liste de valeurs de paramètres du code de rapport. Aucun des liens dans aucune de ces réponses ne montre comment faire cela et après un peu de creuser autour, je ne pense pas que ce soit même possible. Oui, il est possible d'obtenir les valeurs d'une requête de base de données, d'un service Web ou d'un assembly personnalisé, mais chacune d'elles crée beaucoup de surcharge comparé à l'obtention de la liste depuis un simple appel de fonction comme = Code.GetValues ​​() , où la fonction utilise une boucle For pour créer les valeurs. Msvcyc a raison de souligner que le paramètre attend une valeur de chaîne, mais la fonction retourne un tableau.J'ai changé le type de retour à Array comme suggéré par prashant sable, mais la liste de sélection est toujours grisée, cela ne fonctionne pas. Et coldice a raison de dire que le modificateur d'accès doit être public.

Dans mes recherches, j'ai trouvé an article by James Kovac à partir de 2005 qui a montré pourquoi cela n'est pas possible. La classe Parameters possède une méthode get, mais pas de méthode set. Dans le navigateur d'objets VS 2008 pour SSRS 2008, le nom de l'objet a changé, mais il ne contient toujours pas de méthode set (voir Microsoft.ReportingServices.Interfaces.IParameter.Name ou .Value). Ma solution de contournement actuelle consiste simplement à coder en dur la liste de valeurs, mais si votre liste de valeurs doit être dynamique, vos seules options sont les requêtes de base de données, les services Web ou les assemblys personnalisés. Je pense que la solution de contournement la plus simple de ces trois est d'obtenir les valeurs du moteur de base de données, comme suggéré par oleksiy.t, tant que vous pouvez écrire une requête pour retourner la liste de valeurs que vous voulez. Votre liste d'entiers, ou ma liste d'intervalles de temps, serait à la fois des requêtes faciles à écrire. Sinon, vous devrez utiliser l'une des deux autres solutions de contournement.

Questions connexes