/// <summary> /// Launcher dell'aggiornamento della struttura. /// </summary> /// <returns>True se l'aggiornamento è andato a buon fine.</returns> public override bool Struttura(bool avoidRepositoryUpdate) { if (DataBase.OpenConnection() || avoidRepositoryUpdate) { SetMercatoAttivo(); //aggiorno i parametri di base dell'applicazione Workbook.AggiornaParametriApplicazione(avoidRepositoryUpdate); SplashScreen.Show(); bool wasProtected = Sheet.Protected; if (wasProtected) Sheet.Protected = false; Workbook.ScreenUpdating = false; if (!avoidRepositoryUpdate) { SplashScreen.UpdateStatus("Carico struttura dal DB"); Workbook.Repository.Aggiorna(); } else { //resetto la struttura nomi che verrà ricreata nelle prossime righe Workbook.Repository.InitStrutturaNomi(); } SplashScreen.UpdateStatus("Controllo se tutti i fogli sono presenti"); DataView categorie = Workbook.Repository[DataBase.TAB.CATEGORIA].DefaultView; categorie.RowFilter = "Operativa = 1 AND IdApplicazione = " + Workbook.IdApplicazione; //cancello i fogli che non ci sono più come categorie if (Workbook.CategorySheets != null) { foreach (Excel.Worksheet categorySheet in Workbook.CategorySheets) { if ((from DataRowView r in categorie where r["DesCategoria"].Equals(categorySheet.Name) select r).Count() == 0) { bool isactive = Workbook.Application.DisplayAlerts; try { if(isactive) Workbook.Application.DisplayAlerts = false; Workbook.Sheets[categorySheet.Name].Delete(); if(isactive) Workbook.Application.DisplayAlerts = true; } catch { if (isactive) Workbook.Application.DisplayAlerts = true; } } } } //creo fogli che si sono aggiunti alle categorie foreach (DataRowView categoria in categorie) { Excel._Worksheet ws; try { ws = Workbook.Sheets[categoria["DesCategoria"].ToString()]; ws.Activate(); if(_freezePanes.ContainsKey(ws.Name)) _freezePanes[ws.Name] = Tuple.Create<int,int>(Workbook.Application.ActiveWindow.SplitRow + 1, Workbook.Application.ActiveWindow.SplitColumn + 1); else _freezePanes.Add(ws.Name, Tuple.Create<int,int>(Workbook.Application.ActiveWindow.SplitRow + 1, Workbook.Application.ActiveWindow.SplitColumn + 1)); } catch { ws = (Excel.Worksheet)Workbook.Sheets.Add(Workbook.Log); ws.Name = categoria["DesCategoria"].ToString(); ws.Select(); Workbook.Application.Windows[1].DisplayGridlines = false; #if !DEBUG Workbook.Application.ActiveWindow.DisplayHeadings = false; #endif } } Workbook.ScreenUpdating = false; try { if(DataBase.OpenConnection()) CaricaDatiDalDB(); Workbook.Application.Calculation = Excel.XlCalculation.xlCalculationManual; SplashScreen.UpdateStatus("Aggiorno struttura Riepilogo"); StrutturaRiepilogo(); SplashScreen.UpdateStatus("Aggiorno struttura Fogli"); StrutturaFogli(); SplashScreen.UpdateStatus("Abilito calcolo automatico"); Workbook.Application.Calculation = Excel.XlCalculation.xlCalculationAutomatic; SplashScreen.UpdateStatus("Invio modifiche al server"); Workbook.ScreenUpdating = false; Sheet.SalvaModifiche(); DataBase.SalvaModificheDB(); SplashScreen.UpdateStatus("Azzero selezioni"); foreach (Excel._Worksheet ws in Workbook.Sheets) { if (ws.Visible == Excel.XlSheetVisibility.xlSheetVisible) { ws.Activate(); ws.Range["A1"].Select(); } } Workbook.Main.Select(); Workbook.Application.WindowState = Excel.XlWindowState.xlMaximized; if (wasProtected) Sheet.Protected = true; SplashScreen.Close(); CancellaTabelle(); return true; } catch { SplashScreen.Close(); CancellaTabelle(); return false; } } else { System.Windows.Forms.MessageBox.Show("Impossibile aggiornare la struttura: ci sono problemi di connessione o la funzione Forza Emergenza è attiva.", Simboli.NomeApplicazione + " - ERRORE!!!", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); return false; } }
/// <summary> /// Salva le modifiche effettuate ai fogli sul DataBase. Il processo consiste nella creazione di un file XML contenente tutte le righe della tabella di Modifica e successivo svuotamento della tabella stessa. Il processo richiede una connessione aperta. Diversamente le modifiche vengono salvate nella cartella di Emergenza dove, al momento della successiva chiamata al metodo, vengono reinviati al server in ordine cronologico. /// </summary> public static void SalvaModificheDB(string nomeTabella = TAB.MODIFICA) { if (Workbook.Repository != null) { //prendo la tabella di modifica e controllo se è nulla DataTable modifiche = Workbook.Repository[nomeTabella]; if (modifiche != null && Workbook.IdUtente != 0) //non invia se l'utente non è configurato... in ogni caso la tabella è vuota!! { //tolgo il namespace che altrimenti aggiunge informazioni inutili al file da mandare al server DataTable dt = modifiche.Copy(); dt.TableName = TAB.MODIFICA; dt.Namespace = ""; //path del caricatore sul server string cartellaRemota = Workbook.Repository.Applicazione["PathExportModifiche"].ToString(); //path della cartella di emergenza string cartellaEmergenza = Workbook.Repository.Applicazione["PathExportModificheEmergenza"].ToString(); //path della cartella di archivio in cui copiare i file in caso di esito positivo nel saltavaggio string cartellaArchivio = Workbook.Repository.Applicazione["PathExportModificheArchivio"].ToString(); string fileName = ""; //se la connessione è aperta (in emergenza forzata sarà sempre false) ed esiste la cartella del caricatore if (OpenConnection() && Directory.Exists(cartellaRemota)) { //metto in lavorazione i file nella cartella di emergenza string[] fileEmergenza = Directory.GetFiles(cartellaEmergenza); bool executed = false; if (fileEmergenza.Length > 0) { if (System.Windows.Forms.MessageBox.Show("Sono presenti delle modifiche non ancora salvate sul DB. Procedere con il salvataggio? \n\nPremere Sì per inviare i dati al server, No per cancellare definitivamente le modifiche.", Simboli.NomeApplicazione + " - ATTENZIONE!!!", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes) { //il nome file contiene la data, quindi li metto in ordine cronologico Array.Sort <string>(fileEmergenza); foreach (string file in fileEmergenza) { File.Copy(file, Path.Combine(cartellaRemota, file.Split('\\').Last()), true); executed = DataBase.Insert(SP.INSERT_APPLICAZIONE_INFORMAZIONE_XML, new Core.QryParams() { { "@NomeFile", file.Split('\\').Last() } }); if (executed) { if (!Directory.Exists(cartellaArchivio)) { Directory.CreateDirectory(cartellaArchivio); } File.Move(Path.Combine(cartellaRemota, file.Split('\\').Last()), Path.Combine(cartellaArchivio, file.Split('\\').Last())); File.Delete(file); } else { System.Windows.Forms.MessageBox.Show("Il server ha restituito un errore nel salvataggio. Le modifiche rimarranno comunque salvate in locale.", Simboli.NomeApplicazione + " - ERRORE!!!", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); } } } else { foreach (string file in fileEmergenza) { File.Delete(file); } } } //controllo se la tabella è vuota if (dt.Rows.Count == 0) { return; } //salvo le modifiche appena effettuate fileName = Path.Combine(cartellaRemota, Simboli.NomeApplicazione.Replace(" ", "").ToUpperInvariant() + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + (Workbook.Ambiente != Simboli.PROD ? "_" + Workbook.Ambiente : "") + ".xml"); dt.WriteXml(fileName);//, XmlWriteMode.WriteSchema); //se la query indica che il processo è andato a buon fine, sposto in archivio executed = DataBase.Insert(SP.INSERT_APPLICAZIONE_INFORMAZIONE_XML, new Core.QryParams() { { "@NomeFile", fileName.Split('\\').Last() } }); if (executed) { if (!Directory.Exists(cartellaArchivio)) { Directory.CreateDirectory(cartellaArchivio); } File.Move(fileName, Path.Combine(cartellaArchivio, fileName.Split('\\').Last())); } else { if (!Directory.Exists(cartellaEmergenza)) { Directory.CreateDirectory(cartellaEmergenza); } fileName = Path.Combine(cartellaEmergenza, Simboli.NomeApplicazione.Replace(" ", "").ToUpperInvariant() + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + (Workbook.Ambiente != Simboli.PROD ? "_" + Workbook.Ambiente : "") + ".xml"); dt.WriteXml(fileName);//, XmlWriteMode.WriteSchema); Workbook.InsertLog(Core.DataBase.TipologiaLOG.LogErrore, "Errore nel salvataggio delle modifiche. '" + fileName + "' si trova in " + Environment.MachineName); System.Windows.Forms.MessageBox.Show("Il server ha restituito un errore nel salvataggio. Le modifiche rimarranno comunque salvate in locale.", Simboli.NomeApplicazione + " - ERRORE!!!", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); } } else { if (dt.Rows.Count == 0) { return; } if (!Directory.Exists(cartellaEmergenza)) { Directory.CreateDirectory(cartellaEmergenza); } //metto le modifiche nella cartella emergenza fileName = Path.Combine(cartellaEmergenza, Simboli.NomeApplicazione.Replace(" ", "").ToUpperInvariant() + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xml"); dt.WriteXml(fileName, XmlWriteMode.WriteSchema); System.Windows.Forms.MessageBox.Show("A causa di problemi di rete le modifiche sono state salvate in locale", Simboli.NomeApplicazione + " - ATTENZIONE!!!", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning); } //svuoto la tabella di modifiche modifiche.Clear(); } } }