2012-06-27 9 views
6

Ho cercato su Google molto e in genere non è possibile eseguirlo. Mi sono imbattuto in una delle hack qui:Reporting Services Cscading Aggiornamento dei parametri

http://www.bp-msbi.com/2011/04/ssrs-cascading-parameters-refresh-solved/

Ma non il suo lavoro per me in SSRS 2005. Chiedo solo se qualcun altro ha provato nel 2005. O c'è qualche altro hack che possono essere provati.

Secondo questo articolo il parametro dipendente viene aggiornato solo quando i suoi valori vengono invalidati dalla selezione nel primo parametro. Se possiamo invalidare il parametro dipendente ogni volta che un parametro cambia, applicheremo un aggiornamento completo. Un modo semplice per fare ciò è collegare un valore come un GUID ottenuto con la funzione T-SQL NEWID().

Quindi, in pratica, vogliamo introdurre un parametro falso tra due parametri reali. Si suppone che questo parametro falso restituisca ogni volta nuovi valori, poiché lo storedproc dietro di esso aggiungerà un guid al set di risultati ogni volta che viene chiamato proc. Quindi impone il completo aggiornamento degli altri parametri.

Ora il problema principale che sto affrontando è:

Impostare il valore di default di questo parametro falso. Per i valori disponibili della StoredProc dietro le piste param falsi e restituisce i dati nel formato dicono: RESULT1, result2_GUIDFROMSQL

ora sembra che lo stesso StoredProc viene chiamato di nuovo per impostare il valore defult Se chiedo per ottenere il valore predefinito dalla query. Ma mentre il storedproc viene eseguito di nuovo, viene fornito un nuovo guid e quindi non è possibile trovare il vecchio valore in modo che non venga impostato come desiderato.

Ho solo bisogno di capire un meccanismo per passare questo guid da param introdotto al parametro successivo.

Ecco dove sto fallendo.

Il mio problema può essere semplicemente replicato creando un parametro la cui origine dati è questa querystring.

select getdate() id, @name nid 

Quindi, in questo caso, come impostare un valore predefinito per questo parametro.

+1

Potrebbe elaborare un po 'di più sul problema esatto che stai cercando di risolvere, e forse citare anche i bit rilevanti dal tuo link in modo che se il link muore a questa domanda sarà ha ancora senso da solo? – Jeroen

+2

Grazie a Jeroen per averlo visto. Ho modificato la domanda in base ai tuoi commenti. Spero che sia più chiaro ora. – Abbi

+0

Grazie per l'aggiornamento, questo dovrebbe aiutare. Devo ammettere che la domanda è ancora un po 'difficile da leggere e non capisco il problema, ma forse qualcun altro può offrire una mano? – Jeroen

risposta

0

Finalmente sono stato in grado di risolvere questo. Questo collegamento è stato un inizio utile. http://www.optimusbi.com/2012/07/16/multilevel-cascading-select/

Fondamentalmente ciò che fa è: Scrivere query con parametri in modo in modo che il parametro dipendente cambia il suo valore ogni volta che si cambia il suo parametro padre.

La query aggiunge rownumber precedendo "_". Quindi ogni volta che l'utente seleziona altri valori cambia il rownumber e quindi il set di risultati della query.

Quindi, quando si utilizza il set di risultati, rimuovere il testo dopo il carattere di sottolineatura per ottenere i codici reali.

0

Esiste una soluzione alternativa per risolvere questo problema per tutte le situazioni.

Si noti che la risposta precedente fornita, scrivendo i parametri della query in modo che il parametro dipendente cambi il suo valore ogni volta che si modifica il parametro padre, funzioni per alcuni casi ma non per tutti i casi.Se i valori "Disponibili" del parametro dipendente cambiano come risultato di un altro parametro E il parametro dipendente è visibile, funziona, Se il parametro dipendente è nascosto o interno, o se i valori "Disponibili" non cambiano come risultato dell'altro parametro, non funzionerà.

La soluzione infallibile consiste nel definire una funzione personalizzata nel report e chiamarla in un'espressione per il parametro dipendente. La funzione personalizzata accetta come argomento un parametro (il parametro dal quale dipende il parametro dipendente), e restituisce semplicemente il suo valore. Anche se la funzione sta semplicemente prendendo il valore e restituendolo, SSRS non ispeziona il codice e presume che il codice possa fare qualsiasi cosa (generare un numero casuale, estrarre file dal disco, ecc ...). Pertanto, SSRS richiama la funzione ogni volta che il valore cambia indipendentemente dal fatto che i valori "Disponibili" del parametro dipendente cambino e indipendentemente dal fatto che il parametro dipendente sia visibile, nascosto o interno.

Qualcosa di simile a questo:

public function returnArg(ByVal TheArg As String) As String 
    return TheArg 
end function 

suppone che si abbia due parametri:

Parameter1 Parametro2

E che Parametro2 dipende Parametro1. valore di

Set Parameter2 come un'espressione che include la chiamata a Parameter1 con la funzione, come:

=CODE.returnArg(Parameters!Parameter1.Value) 

Ora, in questo caso Parameter2 visualizza semplicemente il valore in Parametro1, ma questa logica può essere estesa a più complesso espressioni e più di un parametro. Finché c'è una chiamata di funzione CODE.returnArg (...) per ogni parametro nell'espressione, SSRS aggiornerà sempre il valore.

0

@ Il secondo collegamento di Abbi non è più valido. L'articolo è ora disponibile al: http://www.optimusinfo.com/multilevel-cascading-select/

Sfortunatamente le immagini sono rotte e l'articolo è un po 'incompleto senza di loro. C'è un'immagine che sono stato in grado di localizzare nella sua posizione spostata: http://www.optimusinfo.com/wp-content/uploads/2012/07/Multilevel-Cascading-with-Select-All-18.jpeg

Questo mi ha dato l'ultimo indizio di cui avevo bisogno per far funzionare la tecnica: quando sei impostando le proprietà dei parametri del set di dati, è necessario specificare manualmente il valore del parametro come ad es [@ City.Label] piuttosto che il solito vecchio [@City] (che corrisponde a [@ City.Value].

Questo perché la tecnica altera il "Valore" a un valore personalizzato che non può più essere cercato nel DB! Quindi è necessario utilizzare l'etichetta "Label" user-friendly, db-esistente (probabilmente dovrebbe essere ovvio ma ...) Il resto è tutto piuttosto standard se si capisce il costruttore di report

Si noti inoltre che questo collegamento così com'è non funziona con parametri a cascata multi valore, ma può essere facilmente modificato per farlo: basta modificare il parametro memorizzato proc per unire ad una funzione di divisione del valore.Modifica il mio da udf_splitvarible funzione data a SQL Server - In clause with a declared variable

La modifica è abbastanza semplice ma darò un esempio. Questo è dall'articolo (con una formattazione terribile fissa).

SELECT 
    l11.CompanyName1+'_'+ CAST(row_number() over(order by l11.CompanyName1 desc) AS VARCHAR(50))as CompanyName11 
    ,l11.CompanyName 
FROM 
(
    SELECT 
     l1.CompanyName+'_'+ CAST(row_number() over(order by l1.CompanyName asc) AS VARCHAR(50))as CompanyName1 
     ,l1.CompanyName 
    FROM 
    (
     SELECT DISTINCT CompanyName 
     FROM Customers 
     WHERE City IN(@City) 
    )l1 
)l11 
ORDER BY l11.CompanyName ASC 

Cambio:

SELECT DISTINCT CompanyName 
FROM Customers 
WHERE City IN(@City) 

a:

SELECT DISTINCT CompanyName 
FROM Customers 
INNER JOIN udf_SplitVariable(@City,',') v ON City = v.Value 

Tutto questo si applica a SQL Server 2008/Report Builder 3 anche.

Non ero in grado di capire/applicare la risposta di @ borkmark. Le limitazioni non sembrano essere applicabili al mio caso.

+0

Vorrei dare il benvenuto a chiunque possa spiegare perché il doppio ordinamento ASC/DESC è necessario o se può essere rimosso. Non ho avuto il tempo libero speso su di esso. – Visser

0

Qui di seguito presenterò uno scenario dettagliato e quindi mostrerò l'implementazione di esempio basata sulle risposte di Visser e Abbi.

Immagina di avere un rapporto in cui ogni riga è un progetto. Un progetto ha una colonna Stato con i valori "In corso" o "Completato" e una colonna Project Manager i cui valori sono il nome di una persona. Qui ci sono le righe della tabella:

  • Progetto A (Stato = In corso, Project Manager = Bob)
  • Progetto B (Stato = In corso, Project Manager = Tom)
  • Progetto C (Stato = completo, Project manager = Jack)
  • Progetto D (Stato = completo, Project manager = Tom)
  • Progetto E (Stato = completo, Project manager = Jill)

Voglio avere 2 parametri sul mio rapporto

  1. Mostra progetti completati? - Questo è un parametro booleano
    • Quando false mostrerà solo "in progress" progetti A & B
    • Quando true mostrerà "In Progress" progetti A & B Oltre ai progetti "completo" C, D , & E.
  2. Project manager - Questo è un parametro di testo multi-valore il cui opzioni ei valori di default sarà necessario modificare in base alle Mostra Progetti completati? parametro da cui dipende.
    • Se Mostra progetti completati? è impostato su false quindi verranno visualizzate solo le opzioni "Bob" e "Tom" perché sono i project manager per i progetti in corso Progetto A & B rispettivamente.
    • Se Mostra progetti completati? è impostato su true quindi oltre a "Bob" e "Tom" verranno visualizzate anche le opzioni "Jack" e "Jill" in quanto sono project manager rispettivamente per i progetti inattivi Project C & Project E.

Ora per l'attuazione:

  1. Mostra Progetti completati? parametro

    Show Completed Projects Parameter

  2. Project Manager query del set (Vedi risposte Visser e Abbi è per i dettagli su come questo genera una chiave che cambierà in base al parametro indipendente e costringerà SSRS per ricaricare i valori di default)

    SELECT 
        [ProjectManager_Key] = 
         pOuterAlias.[ProjectManager_Key] + '_' + 
         CAST(ROW_NUMBER() OVER(ORDER BY pOuterAlias.[ProjectManager_Key] DESC) AS NVARCHAR(MAX)), 
        [ProjectManager] = pOuterAlias.[ProjectManager] 
    FROM 
        (
         SELECT 
          [ProjectManager_Key] = 
           pInnerAlias.ProjectManager + '_' + 
           CAST(ROW_NUMBER() OVER(ORDER BY pInnerAlias.ProjectManager ASC) AS NVARCHAR(MAX)), 
          [ProjectManager] = pInnerAlias.ProjectManager 
         FROM 
         (
          SELECT 
           [ProjectManager] 
          FROM 
           [dbo].[Project] 
          WHERE 
           Status = 'In Progress' OR 
           @ShowCompletedProjects = 1 
         ) pInnerAlias 
        ) pOuterAlias 
    ORDER BY 
        pOuterAlias.[ProjectManager] 
    
  3. Project manager parametro

    • generali

      Project Manager General

    • Valori disponibili

      Project Manager Available Values

    • valori predefiniti

      Project Manager Default Values

  4. Progetti dataset

    • Query

      SELECT 
          * 
      FROM 
          [dbo].[Project] 
      WHERE 
      (
          Status = 'In Progress' OR 
          @ShowCompletedProjects = 1 
      ) AND 
      Project Manager IN (@ProjectManager) 
      
    • Parametri (Assicuratevi di notare la parte [@ProjectManager.Label] che renderà corrisponde al progetto sul valore di project manager effettivo dal database e non la chiave che abbiamo generato.

      Projects parameters