2009-05-20 11 views
8

Sto lavorando a un report piuttosto complesso in Sql Server Reporting Services. My SP restituisce un numero dinamico di colonne ognuna delle quali viene nominata dinamicamente.Come posso rappresentare un numero sconosciuto di colonne in SSRS?

Basicamente pensare a un'applicazione di mantenimento del tempo. Ogni colonna dinamica rappresenta un intervallo temporale a cui è stato addebitato il tempo per quel team. Se non è stato addebitato alcun tempo a quel bucket per il periodo di tempo coperto dal report, questo non viene visualizzato. Ogni bucket ha il proprio identificatore che ho bisogno di essere le intestazioni delle colonne.

Ho un SP che restituisce tutto questo. Lo fa facendo un po 'di SQL dinamico con una dichiarazione exec (brutto lo so ma sono su SQL 2000 quindi un'opzione PIVOT non funzionerebbe)

Posso avere un numero indefinito di bucket e alcuni o tutti potrebbe mostrare.

Ho trovato questo - http://www.codeproject.com/KB/reporting-services/DynamicReport.aspx - che è utile ma nell'esempio ha un numero finito di colonne e si nasconde o mostra solo in base a quali hanno valori. Nel mio caso ho un numero variabile di colonne quindi in qualche modo ho bisogno del rapporto per aggiungere colonne.

Qualche idea?

+0

potremmo vedere un esempio o due dei vostri dati? è probabile che ciò che stai facendo con le colonne dinamiche potrebbe diventare colonne permanenti o in file di dati. – DForck42

+0

Al momento non sono al lavoro, ma ho elaborato due versioni di questo. Uno usa le colonne dinamiche, l'altro è la versione più "relazionale" in cui io tiro indietro ognuno nel proprio set di dati e si riferiscono a un altro. Questo è molto probabile ma non riesco a trovare un modo in SSRS per rappresentare quelle righe di dati come colonne (essenzialmente ruotarle) – JoshReedSchramm

risposta

9

Finché si conosce un numero massimo di colonne, è possibile farlo dopo una moda.

Innanzitutto, assegna un nome alle colonne con un risultato dalla query, in modo da poterlo passare alla query o derivarla lì. In secondo luogo, crea il rapporto come se avesse il numero massimo di colonne e nascondile se sono vuote.

Ad esempio, ho dovuto creare un rapporto che segnalasse i numeri di vendita mensili per un anno, ma i mesi non stavano necessariamente iniziando a gennaio. Ho rinviato il nome del mese in una colonna, seguito dai numeri del mio rapporto. Su .rdl, ho costruito 12 serie di colonne, una per ogni mese possibile, e ho usato un'espressione per nascondere la colonna se fosse vuota. Il risultato è che il report sembra espandersi al numero di colonne necessarie.

Ovviamente, non è realmente dinamico nel senso che può espandersi per quanto è necessario senza conoscere il limite superiore.

+0

questo è esattamente quello che ho finito per fare. Sfortunatamente il progetto è stato scartato, quindi non ho mai aggiornato questa risposta e ho dimenticato cosa ho fatto. Grazie. – JoshReedSchramm

0

Ho avuto la necessità di farlo in passato e la conclusione a cui sono arrivato è "non puoi", tuttavia non ne sono sicuro. Se trovi una soluzione, vorrei che lo ami.

Un problema che ti viene in mente è che devi definire il rapporto usando i nomi delle colonne che stai per tornare dal proc memorizzato, e se non conosci quei nomi o quanti lì sono, come puoi definire il rapporto?

L'unica idea che avevo su come fare questo è creare dinamicamente la definizione del report (file .rdl) tramite C#, ma al momento, non ero in grado di trovare una MS API per farlo, e io il dubbio esiste ora Ho trovato uno open source, ma non ho seguito questa strada.

+0

Segnalare come risposta corretta perché, beh, non abbiamo mai finito per risolvere questo dato la piattaforma eravamo e abbiamo dei vincoli. Abbiamo finito per cambiare il requisito. – JoshReedSchramm

8

Questo può essere fatto. L'ho fatto e funziona bene. Non è necessario conoscere il numero massimo di colonne o mostrare e nascondere le colonne nel mio approccio. Usa una matrice e modifica il tuo sp per restituire dati dinamici alla struttura menzionata in questo post del blog http://sonalimendis.blogspot.com/2011/07/dynamic-column-rdls.html

+0

Questo è quello.Grazie – echo

4

Costruisci 2 set di dati correlati, il primo per il contenuto del report e il secondo per l'elenco delle etichette di colonna.

Il set di dati del contenuto del report deve avere un numero fisso di colonne e nome. È possibile assegnare un numero massimo di colonne.

In questo esempio ho le prime 2 colonne come fisse, o sempre visibili, e un massimo di 4 colonne da visualizzare per scelta tramite un parametro multivalore, o dipende dalle condizioni della query. E come al solito, potremmo avere anche un totale. Quindi, potrebbe assomigliare a questo:

Fixed01, Fixed02, Dyna01, Dyna02, Dyna03, Dyna04, Total 

Il secondo gruppo di dati con i suoi valori sarà simile a questa:

Name Label 
---- ----- 
Dyna01 Label01 
Dyna02 Label02 
Dyna03 Label03 

ho omesso il 4 ° Label per dimostrare che non tutte le colonne vengono utilizzati da un alcune condizioni di query. Ricorda che entrambi i Dataset sono pensati per essere correlati alla stessa query.

Ora creare un parametro denominato, ad esempio, @columns; compilare i relativi valori disponibili e valori predefiniti con il secondo set di dati.

Per ciascuno di questi 4 colonne dinamici, impostare la visibilità colonna con la seguente espressione:

=IIf(InStr(join(Parameters!columns.Value,","),"Dyna01"),false,true) 

E per ciascuna delle loro caselle di testo di intestazione di colonna, utilizzare la seguente espressione:

=Lookup("Dyna01", Fields!Name.Value, Fields!Label.Value, "dsColumns") 

Per quanto riguarda il totale, ecco l'espressione per la sua visibilità:

=  IIf(InStr(join(Parameters!columns.Value, ","), "Dyna01"), false, true) 
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna02"), false, true) 
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna03"), false, true) 
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna04"), false, true) 

Ed ecco i suoi valori:

= IIf(InStr(join(Parameters!columns.Value, ","), "Dyna01"), Fields!C01.Value, 0) 
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna02"), Fields!C02.Value, 0) 
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna03"), Fields!C03.Value, 0) 
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna04"), Fields!C04.Value, 0) 

Questo è tutto, spero che sia d'aiuto.

bonus, che secondo set di dati, dsColumns, può anche contenere altri attributi di colonna, come ad esempio: colore, spessore, font, ecc

4

Penso che il modo migliore per farlo è aggiungere tutte le colonne della tabella e modifica la proprietà di visibilità di esso con l'aiuto degli argomenti che ottieni dal tuo SP..questo risolverà lo scopo della colonna dinamica ma quando visualizzi il rapporto otterrai molto spazio bianco che puoi risolvere con SSRS - Keep a table the same width when hiding columns dynamically? e il tuo il report sarà pronto

0

ora, se ci fosse un numero incerto di colonne, diciamo se ho date come nomi di colonne che possono molto secondo i criteri di selezione del report, ad es. Colonne possono essere: nome, [2013-05-03], [2013-05-04], [2013-05-05] .....

Problemi correlati