/// <summary> /// Funzione richiamata dal Thread per l'esecuzione dell'importazione /// </summary> /// <param name="prameters">Un array di oggetti. Sono attesi 4 elementi: /// - Il primo deve essere una lista di oggetti di tipo ProjectRowData /// - Il secondo deve essere un oggetto di tipo string /// - Il terzo deve essere un oggetto di tipo InfoUtente /// - Il quarto deve essere un oggetto di tipo Ruolo /// </param> public void ExecuteImport(object parameters) { #region Dichiarazione variabili // L'array dei parametri object[] param; // L'oggetto con le informazioni sui fascicoli da importare ProjectRowData[] prds; // L'url del frontend string url; // Le informazioni sull'utente che ha lanciato la procedura InfoUtente userInfo; // Il ruolo con cui è stata lanciata la procedura Ruolo role; #endregion // Casting dell'oggetto a array di oggetti param = parameters as object[]; // Se l'array non contiene quattro elementi, fine esecuzione if (param.Length != 4) { return; } // Prelevamento delle informazioni sui fascicoli da creare prds = param[0] as ProjectRowData[]; // Prelevamento dell'url del Fontend url = param[1] as string; // Prelevamento delle informazioni sull'utente userInfo = param[2] as InfoUtente; // Prelevamento del ruolo role = param[3] as Ruolo; // Calcolo del numero totale di fascicoli da importare this.totalNumberOfProjectToImport = prds.Length; #region Importazione fascicoli // Inizializzazione della lista da utilizzare per // memorizzare il report sull'importazione dei // fascicoli this.report = new List <ImportResult>(); // Importazione dei fascicoli foreach (ProjectRowData rowData in prds) { try { this.report.Add(ImportProjectsUtils.ImportProject( rowData, userInfo, role, url)); } catch (Exception e) { // In caso di eccezione viene aggiunto un risultato negativo this.report.Add(new ImportResult() { Outcome = OutcomeEnumeration.KO, Ordinal = rowData.OrdinalNumber, Message = e.Message }); } // Un documenti è stato analizzato this.totalNumberOfAnalyzedProjects += 1; } // Aggiunta di una voce di report con il totale dei fascicoli // importati e non importati this.report.Add(this.GetSummaryElement(this.report)); #endregion // Sospensione del thread fino a quando non viene letto // il report o non passano 1 minuto //waitReading.WaitOne(new TimeSpan(0,1,0)); }
protected void btnCreaFascicoli_Click(object sender, EventArgs e) { #region Definizione variabili // Un booleano utilizzato per determinare la validità del // file excel bool canImport; // Il risultato della chiamata al webservice List <ImportResult> report = null; // Il file postato HttpPostedFile postedFile; // Il content del documento byte[] content; // Il nome da attribuire al file temporaneo string temporaryFileName; // Il server path string serverPath; // L'array con le informazioni sui fascicoli da importare ProjectRowData[] prds; // L'oggetto con la definizione della funzione da far eseguire al thread AsyncImportProjectExecutor importExecutor; // Il numero massimo di fascicoli che è possibile importare int maxNumber; #endregion // Prelevamento del file postato postedFile = this.fileUploader.PostedFile; // Verifica del content type e dell'estensione del file al fine // di verificarne la validità canImport = (postedFile.ContentType == "application/vnd.ms-excel") && postedFile.FileName.ToLower().EndsWith("xls"); // Se la verifica ha avuto esito positivo... if (canImport) { // Prelevamento del contenuto del file content = this.GetContent(); // Creazione del nome per il file temporaneo temporaryFileName = String.Format("{0}.{1}", Guid.NewGuid().ToString(), Path.GetExtension(this.fileUploader.FileName)); // Prelevamento del serverPath serverPath = Utils.getHttpFullPath(); // Pulizia del call context CallContextStack.CurrentContext.ContextState["projectExporter"] = null; CallContextStack.CurrentContext.ContextState["reportImport"] = null; // Reset del campo nascosto con il valore da raggiungere. //this.hfTargetPerc.Value = "0"; // Disassociazione della sorgente dati this.grdReport.DataSource = null; this.grdReport.DataBind(); try { // Reperimento delle informazioni sui fascicoli da importare prds = ImportProjectsUtils.ReadDataFromExcel( content, Guid.NewGuid().ToString() + Path.GetExtension(this.fileUploader.FileName), UserManager.getInfoUtente(this), UserManager.getRuolo(this)); } catch (Exception ex) { report = new List <ImportResult>() { new ImportResult() { Message = DocsPaUtils.Exceptions.SoapExceptionParser.GetOriginalException(ex).Message, Outcome = OutcomeEnumeration.KO } }; this.grdReport.DataSource = report; this.grdReport.DataBind(); // Hiding del popup this.mdlPopupWait.Hide(); return; } try { // Reperimento del numero massimo di documenti importabili maxNumber = ImportProjectsUtils.GetMaxProjectsNumber(UserManager.getInfoUtente()); // Se maxNumber è più minore del numero di documenti estratti dal foglio excel if (maxNumber < prds.Length) { throw new Exception(String.Format( "E' possibile importare al massimo {0} fascicoli per volta.", maxNumber)); } } catch (Exception ex) { report = new List <ImportResult>() { new ImportResult() { Message = ex.Message, Outcome = OutcomeEnumeration.KO } }; this.grdReport.DataSource = report; this.grdReport.DataBind(); // Hiding del popup this.mdlPopupWait.Hide(); return; } // Creazione di un nuovo oggetto cui delegare l'importazione dei fascicoli importExecutor = new AsyncImportProjectExecutor(); // Salvataggio dell'oggetto esecutore nel CallContext CallContextStack.CurrentContext.ContextState["projectExporter"] = importExecutor; // Creazione del thread con parametri //entry = new ParameterizedThreadStart(importExecutor.ExecuteImport); // Creazione del thread //thread = new Thread(entry); // Creazione dell'array dei parametri //parameters = new object[] { // drdc, // Utils.getHttpFullPath(), // UserManager.getInfoUtente(), // UserManager.getRuolo() //}; // Partenza del thread //thread.Start(parameters); // Avvio del timer //this.tmrUpdateInfo.Enabled = true; try { importExecutor.ExecuteImport( new object[] { prds, Utils.getHttpFullPath(), UserManager.getInfoUtente(), UserManager.getRuolo() }); int analyzedDocument, totalDocument; // Si richiedono le statistiche importExecutor.GetStatistics(out analyzedDocument, out totalDocument); // Viene prelevato il report report = importExecutor.GetReport(); // Associazione degli array dei risultati alla griglia this.grdReport.DataSource = report; // Binding della sorgente dati this.grdReport.DataBind(); // Creazione del data set per l'esportazione del report di importazione DataSet dataSet = this.GenerateDataSet(report); // Path e nome file del template string templateFilePath = Server.MapPath("formatPdfExport.xml"); // Aggiunta nell call context del file documento con le informazioni // da scivere nel report CallContextStack.CurrentContext.ContextState["reportImport"] = global::ProspettiRiepilogativi.Frontend.PdfReport.do_MakePdfReport( global::ProspettiRiepilogativi.Frontend.ReportDisponibili.ReportLogMassiveImport, templateFilePath, dataSet, null); // Abilitazione pulsante esportazione this.btnEsportaReport.Enabled = true; // Aggiornamento pannello bottoniera this.upButtons.Update(); } catch (Exception ex) { // Creazione di un array di result con un solo elemento // che conterrà il dettaglio dell'eccezione report = new List <ImportResult>() { new ImportResult() { Outcome = OutcomeEnumeration.KO, Message = ex.Message, } }; this.grdReport.DataSource = report; this.grdReport.DataBind(); } } // Si nasconde il popup this.mdlPopupWait.Hide(); }