2009-02-20 4 views
1

J'utilise SQL Server Reporting Services et le concepteur de rapports fourni avec Visual Studio. J'ai un rapport de vraiment grand. Il est en fait si important que Visual Studio se bloque (parfois pendant des heures à la fois) ou tombe en panne lorsque j'apporte des modifications.Passage de l'ensemble de données au sous-rapport avec SQL Server Reporting Services

Il y a très peu de choses que je puisse faire pour résoudre le problème, alors j'ai décidé de simplement déplacer la moitié inférieure du rapport dans un sous-rapport. Donc, j'ai commencé avec un rapport énorme, sans réponse et terminé avec deux petits rapports gérables - étonnamment, cela fonctionne réellement.

Un problème: mon sous-rapport utilise les mêmes données que mon rapport principal. À l'heure actuelle, il remplit son ensemble de données en réinterrogeant la base de données. L'aller-retour supplémentaire à la base de données entraîne deux fois plus de temps pour générer le rapport; de 45 minutes à 1 1/2 heures pour générer.

Je souhaite éviter de cliquer à nouveau sur la base de données et utiliser à la place le même ensemble de données dans les deux rapports.

Comment puis-je partager ou transmettre un jeu de données entre un rapport et un sous-rapport?

Répondre

0

Je suis sûr que vous ne pouvez pas. Vous feriez probablement mieux de chercher des moyens de repenser entièrement le rapport afin qu'il ne soit pas si grand ... sans parler des divers problèmes avec les sous-rapports lors de l'exportation vers Excel.

0

J'ai plusieurs rapports que le SQL est si complexe en ce qu'il verrouille Visual Studio lorsque je tente de l'éditer. Dans ces rapports, je vais directement dans la vue Code et édite le XML directement, ce qui fonctionne. Je fais aussi ceci quand Visual Studio rend mystérieusement des colonnes légèrement plus larges que je les ai mises. Cependant, je doute que vous souhaitiez suivre cette voie si vous modifiez trop la mise en page du rapport. Au lieu d'exécuter votre requête dans le rapport, serait-il possible de créer une table en utilisant une procédure stockée que les deux rapports utilisent? Le premier rapport exécute la procédure stockée pour générer la table, puis les deux rapports interrogent simplement le rapport. Surveillez les problèmes de simultanéité si le rapport peut être exécuté par plusieurs utilisateurs.

0

Avez-vous essayé d'utiliser une liste dans une liste où les deux listes utilisent le même ensemble de données, puis filtrent la liste interne pour n'afficher que les enregistrements liés à la liste externe?

En ce qui concerne le temps d'exécution, 45 minutes semble être un temps énorme en premier lieu. Je suppose que vous avez effectué une analyse du plan d'exécution pour vérifier que votre requête ou votre procédure stockée utilise des index significatifs?

Hope this helps,

Bill

0

Vous pouvez le faire en utilisant un paramètre fictif:

i. Créez un paramètre dans votre rapport principal 'MyData' et cochez 'interne'

ii. Définir la valeur par défaut de 'MyData' sur votre ensemble de données

iii.Réglez le paramètre de sous-état avec l'expression

=Parameters!MyData.Value 

Hope this helps, Duncan

0

Si vous créez une table, vous pouvez fusionner toutes les cellules de la ligne de détails et de mettre un sous-rapport que le contenu. Définissez ensuite le paramètre du sous-rapport sur le champ sur lequel vous souhaitez exécuter le sous-rapport.

Jason

3

Je pense que cela peut vous aider: http://www.gotreportviewer.com/subreports/index.html

fournir des données pour le sous-état - l'événement SubreportProcessing Pour fournir des données pour le sous-état vous devez gérer l'événement SubreportProcessing. Notez que cet événement se trouve sur l'objet LocalReport . Vous pouvez ajouter un gestionnaire d'événements comme celui-ci:

private void MainForm_Load(object sender, EventArgs e) 
{ 
    this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(MySubreportEventHandler); 
} 

Voici un exemple pour le gestionnaire d'événements. Dans cet exemple, LoadSalesData est défini pour renvoyer un DataTable.

void MySubreportEventHandler(object sender, SubreportProcessingEventArgs e) 
{ 
    e.DataSources.Add(new ReportDataSource("Sales", LoadSalesData())); 
} 

Si votre rapport a plusieurs sous-états, vous pouvez consulter le ReportPath propriété de SubreportProcessingEventArgs et fournir des données pour la correspondante sous-état. Vous pouvez également examiner les valeurs de la propriété Parameters de SubreportProcessingEventArgs et renvoyer uniquement le sous-ensemble de données correspondant aux paramètres du sous-rapport, tel que mentionné ici.

Questions connexes