Come scritto nel post precedente, stò dando all'utente finale la possibilità di gestirsi gli snapshot direttamente dall'applicazione, ed ora tocca alla fase di creazione di uno snapshot.
Come ben sapete (e come ho scritto inquesto post) gli snapshot vengono creati utilizzando i valori di default dei parametri.
Reporting Services fornisce la possibilità di forzare la creazione di uno snapshot tramite il metodo CreateReportHistorySnapshot, che si comporta esattamente come il pulsante presente nel sito di sharepoint di Reporting, che crea lo snapshot utilizzando i valori dei parametri in quel preciso istante (quindi facendo uso dei valori di default).
Ma se volessimo eseguire uno snapshot che abbia diversi parametri?
E' il caso in cui il report abbia le date o dei filtri calcolati in automatico, magari perchè deve venire eseguito con i dati della settimana precedente, o del mese precedente. Però Il cliente potrebbe avere la necessità di rigenerare il report riferito ad un perioso diverso (magari di 2 settimane prima).
In questo caso si può intervenire andando a modificare da codice i valori di default dei parametri del report, e dopo aver eseguito lo snapshot, ripristinarli ai valori normali.
Ecco qui il codice da qui potete prendere spunto:
1:using (ReportingService2005SoapClient rs = this.CreateReportingService2005SoapClient())
2: {
3:string batchID = string.Empty;
4: ServerInfoHeader infoHeader = rs.CreateBatch(out batchID);
5: BatchHeader bh = new BatchHeader()
6: {
7: BatchID = batchID,
8: AnyAttr = infoHeader.AnyAttr
9: };
10: CatalogItem[] items = null;
11: rs.ListChildren(reportFolder, true, out items);
12:
13:foreach (var item in items)
14:if (string.Compare(item.ID, reportId.ToString(), true) == 0)
15: {
16:// recupero gli attuali parametri e mi tengo una copia degli originali
17: ReportParameter[] defaultParameters = null;
18: ReportParameter[] parameters = null;
19: rs.GetReportParameters(item.Path, null, false, null, null, out defaultParameters);
20: rs.GetReportParameters(item.Path, null, false, null, null, out parameters);
21:
22:
23:foreach (ReportParameter parameter in parameters)
24: {
25://modifico i valori dei parametri che voglio cambiare
26:if (string.Compare(parameter.Name, "dateStart", true) == 0)
27: parameter.DefaultValues = newstring[] { string.Format("{0:s}", startDate) };
28:elseif (string.Compare(parameter.Name, "dateEnd", true) == 0)
29: parameter.DefaultValues = newstring[] { string.Format("{0:s}", endDate) };
30: }
31:// setto i parametri modificati nel report
32: rs.SetReportParameters(bh, item.Path, parameters);
33:string historyId = string.Empty;
34: Warning[] warnings = null;
35:// creo lo snapshot
36: rs.CreateReportHistorySnapshot(bh, item.Path, out historyId, out warnings);
37:// setto i parametri originali
38: rs.SetReportParameters(bh, item.Path, defaultParameters);
39:// eseguo il tutto sotto un'unica transazione
40: rs.ExecuteBatch(bh);
41:return;
42: }
43: }
Faccio notare che il tutto viene eseuito sotto un'unica transazione al comando rs.ExecuteBatch(bh), e in caso di errori, il report continuerebbe ad avere i suoi normali valori di default e non i valori da noi modificati.