private void CopiarMontosEntreCias() { // construimos el nombre del archivo xml que contendrá, al final, los resultados de la ejecución String fileName = String.Concat(Page.GetType().Name, "-", User.Identity.Name); String rootPath = Server.MapPath("~"); String filePath = Server.MapPath("~/keepstatefiles/" + fileName + ".xml"); // ----------------------------------------------------------------------------------------------- // nótese que creamos el xml file que contendrá los resultados del proceso ahora. Esto permitirá // actualizarlo más adelante cuando sea necesario en forma más compacta (ie: sin crear todo el // archivo cada vez que, por ejemplo, encontremos un error y necesitemos reportarlo XElement root = new XElement("ProcessState", new XElement("Values", new XElement("CantidadCodigosEliminados", 0), new XElement("CantidadCodigosCopiados", 0), new XElement("CantidadCuentasContablesAsociadasCopiadas", 0), new XElement("CantidadCuentasContablesAsociadasNoCopiadas", 0), new XElement("CantidadRegistrosMontosCopiados", 0), new XElement("Error", new XElement("ErrorFlag", 0), new XElement("ErrorMessage", "")))); root.Save(filePath); // ----------------------------------------------------------------------------------------------- // contamos y eliminamos los registros que ahora puedan existir para la cia Target. Nótese que, de // existir, ya chequeamos que el usuario haya marcado la opción que permite eliminarlos. dbContabDataContext dbContab = new dbContabDataContext(); int nCantidadCodigosEliminados = (from a in dbContab.Presupuesto_Codigos where a.CiaContab == int.Parse(TargetCiaContab_ListBox.SelectedValue) select a.Codigo).Count(); // ---------------------------------------------------------------------------------------------- // siempre eliminamos los registros de códigos que puedan existir para la compañía Target; // lo hacemos pues, si existen códigos por eliminar, al llegar aquí SIEMPRE se tuvo que haber // marcado que éstos debían ser eliminados dbContab.ExecuteCommand("Delete From Presupuesto_Codigos Where CiaContab = {0}", TargetCiaContab_ListBox.SelectedValue); // para reportar el progreso en la página int nRegistroActual = 0, nProgressPercentaje = 0, nCantidadRegistros = 0; nCantidadRegistros = (from sc in dbContab.Presupuesto_Codigos where sc.CiaContab == int.Parse(SourceCiaContab_ListBox.SelectedValue) select sc).Count(); // ---------------------------------------------------------------------------------------------- // leemos los códigos de presupuesto de la compañía Source y los copiamos a la compañía Target ... int nCantidadCodigosCopiados = 0; var SourceCia_CodigosPresuesto = from sc in dbContab.Presupuesto_Codigos where sc.CiaContab == int.Parse(SourceCiaContab_ListBox.SelectedValue) select new { sc.Codigo, sc.Descripcion, sc.CantNiveles, sc.GrupoFlag, sc.SuspendidoFlag }; Presupuesto_Codigo MyCodigo; List <Presupuesto_Codigo> MyCodigo_List = new List <Presupuesto_Codigo>(); foreach (var Codigo in SourceCia_CodigosPresuesto) { // vamos agregando cada código leído de la compañía Source a la compañía Target MyCodigo = new Presupuesto_Codigo(); MyCodigo.Codigo = Codigo.Codigo; MyCodigo.Descripcion = Codigo.Descripcion; MyCodigo.CantNiveles = Codigo.CantNiveles; MyCodigo.GrupoFlag = Codigo.GrupoFlag; MyCodigo.SuspendidoFlag = Codigo.SuspendidoFlag; MyCodigo.CiaContab = int.Parse(TargetCiaContab_ListBox.SelectedValue); MyCodigo_List.Add(MyCodigo); nCantidadCodigosCopiados++; // --------------------------------------------------------------------- // calculamos el progreso (%); es usado por el progress bar en la página nRegistroActual++; nProgressPercentaje = nRegistroActual * 100 / nCantidadRegistros; Session["Progress_Percentage"] = nProgressPercentaje; // ---------------------------------------------------------------------- } try { dbContab.Presupuesto_Codigos.InsertAllOnSubmit(MyCodigo_List); dbContab.SubmitChanges(); } catch (Exception ex) { dbContab = null; // --------------------------------------------- // escribimos el error al xml file y terminamos XElement xml = XElement.Load(filePath); xml.Element("Values").Element("Error").ReplaceAll( new XElement("ErrorFlag", "1"), new XElement("ErrorMessage", ex.Message)); xml.Save(filePath); // para indicar que al progress bar que el proceso terminó Session["Progress_Completed"] = 1; return; } // ----------------------------------------------------------------------------------------------- // ahora copiamos las cuentas contables asociadas a códigos de presupuesto. Nótese que chequeamos // que la cuenta contable exista para la compañía, antes de intentar grabarla en la tabla // para mostrar el progreso del progreso en la página nRegistroActual = 0; nProgressPercentaje = 0; nCantidadRegistros = (from cc in dbContab.Presupuesto_AsociacionCodigosCuentas where cc.CiaContab == int.Parse(SourceCiaContab_ListBox.SelectedValue) select cc).Count(); var AsociacionCodigosCuentas = from acc in dbContab.Presupuesto_AsociacionCodigosCuentas where acc.CiaContab == int.Parse(SourceCiaContab_ListBox.SelectedValue) select new { acc.CodigoPresupuesto, acc.CuentaContableID, acc.CuentasContable.Cuenta }; Presupuesto_AsociacionCodigosCuenta MyPresupuesto_AsociacionCodigosCuentas; List <Presupuesto_AsociacionCodigosCuenta> MyPresupuesto_AsociacionCodigosCuentas_List = new List <Presupuesto_AsociacionCodigosCuenta>(); int nCantidadCuentasContablesAsociadasCopiadas = 0; int nCantidadCuentasContablesAsociadasNoCopiadas = 0; foreach (var CuentaContable in AsociacionCodigosCuentas) { // primero nos aseguramos que la cuenta contable existe en la compañía Target // NOTA: como la cuenta contable en el código de presupuesto es el ID de la cuenta, debemos buscar la cuenta (ie: 1001200) para el ID (1500) ... CuentasContable cuentaContableEnTargetCia = dbContab.CuentasContables. Where(c => c.Cuenta == CuentaContable.Cuenta && c.Cia == int.Parse(TargetCiaContab_ListBox.SelectedValue)).FirstOrDefault(); if (cuentaContableEnTargetCia == null) { nCantidadCuentasContablesAsociadasNoCopiadas++; } else { MyPresupuesto_AsociacionCodigosCuentas = new Presupuesto_AsociacionCodigosCuenta(); MyPresupuesto_AsociacionCodigosCuentas.CodigoPresupuesto = CuentaContable.CodigoPresupuesto; MyPresupuesto_AsociacionCodigosCuentas.CuentaContableID = cuentaContableEnTargetCia.ID; MyPresupuesto_AsociacionCodigosCuentas.CiaContab = int.Parse(TargetCiaContab_ListBox.SelectedValue); MyPresupuesto_AsociacionCodigosCuentas_List.Add(MyPresupuesto_AsociacionCodigosCuentas); nCantidadCuentasContablesAsociadasCopiadas++; } // --------------------------------------------------------------------- // calculamos el progreso (%); es usado por el progress bar en la página nRegistroActual++; nProgressPercentaje = nRegistroActual * 100 / nCantidadRegistros; Session["Progress_Percentage"] = nProgressPercentaje; // ---------------------------------------------------------------------- } try { dbContab.Presupuesto_AsociacionCodigosCuentas. InsertAllOnSubmit(MyPresupuesto_AsociacionCodigosCuentas_List); dbContab.SubmitChanges(); } catch (Exception ex) { dbContab = null; // --------------------------------------------- // escribimos el error al xml file y terminamos XElement xml = XElement.Load(filePath); xml.Element("Values").Element("Error").ReplaceAll( new XElement("ErrorFlag", "1"), new XElement("ErrorMessage", ex.Message)); xml.Save(filePath); // para indicar que al progress bar que el proceso terminó Session["Progress_Completed"] = 1; return; } // ----------------------------------------------------------------------------------------------------- // por último, el usuario pudo haber indicado que desea también pasar los registros de montos estimados // desde la compañía Source hacia la Target. Nótese que, de ser así, debe venir el año en al textbox // que existe para ello int nCantidadRegistrosMontosCopiados = 0; if (CopiarMontos_CheckBox.Checked && CopiarMontos_DropDownList.SelectedIndex != -1) { // para mostrar el progreso del progreso en la página nRegistroActual = 0; nProgressPercentaje = 0; nCantidadRegistros = (from pm in dbContab.Presupuesto_Montos where pm.CiaContab == int.Parse(SourceCiaContab_ListBox.SelectedValue) && pm.Ano == int.Parse(CopiarMontos_DropDownList.SelectedValue) select pm).Count(); var query = from pm in dbContab.Presupuesto_Montos where pm.CiaContab == int.Parse(SourceCiaContab_ListBox.SelectedValue) && pm.Ano == int.Parse(CopiarMontos_DropDownList.SelectedValue) select new { pm.CodigoPresupuesto, pm.Moneda, pm.Mes01_Est, pm.Mes02_Est, pm.Mes03_Est, pm.Mes04_Est, pm.Mes05_Est, pm.Mes06_Est, pm.Mes07_Est, pm.Mes08_Est, pm.Mes09_Est, pm.Mes10_Est, pm.Mes11_Est, pm.Mes12_Est }; Presupuesto_Monto MyPresupuesto_Montos; List <Presupuesto_Monto> MyPresupuesto_Montos_List = new List <Presupuesto_Monto>(); foreach (var Pres_Montos in query) { MyPresupuesto_Montos = new Presupuesto_Monto(); MyPresupuesto_Montos.CodigoPresupuesto = Pres_Montos.CodigoPresupuesto; MyPresupuesto_Montos.CiaContab = int.Parse(TargetCiaContab_ListBox.SelectedValue); MyPresupuesto_Montos.Moneda = Pres_Montos.Moneda; MyPresupuesto_Montos.Ano = short.Parse(CopiarMontos_DropDownList.SelectedValue); MyPresupuesto_Montos.Mes01_Est = Pres_Montos.Mes01_Est; MyPresupuesto_Montos.Mes02_Est = Pres_Montos.Mes02_Est; MyPresupuesto_Montos.Mes03_Est = Pres_Montos.Mes03_Est; MyPresupuesto_Montos.Mes04_Est = Pres_Montos.Mes04_Est; MyPresupuesto_Montos.Mes05_Est = Pres_Montos.Mes05_Est; MyPresupuesto_Montos.Mes06_Est = Pres_Montos.Mes06_Est; MyPresupuesto_Montos.Mes07_Est = Pres_Montos.Mes07_Est; MyPresupuesto_Montos.Mes08_Est = Pres_Montos.Mes08_Est; MyPresupuesto_Montos.Mes09_Est = Pres_Montos.Mes09_Est; MyPresupuesto_Montos.Mes10_Est = Pres_Montos.Mes10_Est; MyPresupuesto_Montos.Mes11_Est = Pres_Montos.Mes11_Est; MyPresupuesto_Montos.Mes12_Est = Pres_Montos.Mes12_Est; MyPresupuesto_Montos_List.Add(MyPresupuesto_Montos); nCantidadRegistrosMontosCopiados++; // --------------------------------------------------------------------- // calculamos el progreso (%); es usado por el progress bar en la página nRegistroActual++; nProgressPercentaje = nRegistroActual * 100 / nCantidadRegistros; Session["Progress_Percentage"] = nProgressPercentaje; // ---------------------------------------------------------------------- } try { dbContab.Presupuesto_Montos.InsertAllOnSubmit(MyPresupuesto_Montos_List); dbContab.SubmitChanges(); } catch (Exception ex) { dbContab = null; // --------------------------------------------- // escribimos el error al xml file y terminamos XElement xml = XElement.Load(filePath); xml.Element("Values").Element("Error").ReplaceAll( new XElement("ErrorFlag", "1"), new XElement("ErrorMessage", ex.Message)); xml.Save(filePath); // para indicar que al progress bar que el proceso terminó Session["Progress_Completed"] = 1; return; } } dbContab = null; // ---------------------------------------------------------------------------------------- // cuando el proceso termina, escribimos los resultados al xml file XElement xmlfile = XElement.Load(filePath); xmlfile.Element("Values").ReplaceAll( new XElement("CantidadCodigosEliminados", nCantidadCodigosEliminados), new XElement("CantidadCodigosCopiados", nCantidadCodigosCopiados), new XElement("CantidadCuentasContablesAsociadasCopiadas", nCantidadCuentasContablesAsociadasCopiadas), new XElement("CantidadCuentasContablesAsociadasNoCopiadas", nCantidadCuentasContablesAsociadasNoCopiadas), new XElement("CantidadRegistrosMontosCopiados", nCantidadRegistrosMontosCopiados), new XElement("Error", new XElement("ErrorFlag", 0), new XElement("ErrorMessage", ""))); xmlfile.Save(filePath); // para indicar que al progress bar que el proceso terminó Session["Progress_Completed"] = 1; }
private void CrearRegistrosMontos() { // creamos los registros con los montos estimados para el año indicado y para cada código de presupuesto int[] nCiasContab; int[] nMonedas; // Creamos una lista de monedas; nótese que el usuario puede o no seleccionar una moneda // ahora requerimos seleccionar una y solo una (moneda y cia contab) if (Monedas_ListBox.SelectedIndex != -1) { nMonedas = new int[1]; nMonedas[0] = int.Parse(Monedas_ListBox.SelectedValue); } else { // leemos las monedas y las grabamos en el array dbContabDataContext dbContab0 = new dbContabDataContext(); var monedas = from m in dbContab0.Moneda_Contabs select m.Moneda1; int i = 0; int nCantMonedas = (from m in dbContab0.Moneda_Contabs select m.Moneda1).Count(); nMonedas = new int[nCantMonedas]; foreach (int MyMoneda in monedas) { nMonedas[i] = MyMoneda; i++; } dbContab0 = null; } // Igual que para monedas, creamos una lista de compañías if (this.CiasContab_ListBox.SelectedIndex != -1) { nCiasContab = new int[1]; nCiasContab[0] = int.Parse(CiasContab_ListBox.SelectedValue); } else { // leemos las cias contab y las grabamos en el array dbContabDataContext dbContab0 = new dbContabDataContext(); var cias = from c in dbContab0.Compania_Contabs select c.Numero; int i = 0; int nCantCiasContab = (from c in dbContab0.Compania_Contabs select c.Numero).Count(); nCiasContab = new int[nCantCiasContab]; foreach (int MyCiaContab in cias) { nCiasContab[i] = MyCiaContab; i++; } dbContab0 = null; } // ------------------------------------------------------------------------------------------------- // lo PRIMERO que hacemos es intentar grabar para el nuevo año los registros que ahora existan para // el año anterior short AnoActual = short.Parse(Ano_TextBox.Text); short AnoAnterior = short.Parse(Ano_TextBox.Text); AnoAnterior -= 1; int nRegistrosAgregadosAnoAnterior = 0; int nRegistrosActualizadosAnoAnterior = 0; dbContabDataContext dbContab = new dbContabDataContext(); // ----------------------------------------------------------------------------------------------------- // inicializamos la variable que sigue en la cantidad de cías x monedas; de esta forma, iremos mostrando // el progreso al usuario; cada vez que se procese una compañía, se irá mostrando el progreso int nRegistroActual = 0; int nProgressPercentaje = 0; int nCantidadRegistros = nMonedas.Length * nCiasContab.Length; // ----------------------------------------------------------------------------------------------------- foreach (int nMoneda in nMonedas) { foreach (int nCiaContab in nCiasContab) { // leemos los registros en Presupuesto_Montos para el "año anterior" que no existan en la misma // tabla para el "año actual" y, además, que no estén suspendidos en Presupuesto_Codigos string sqlSelectString = "Select CodigoPresupuesto, Mes01_Est, Mes02_Est, Mes03_Est, Mes04_Est, Mes05_Est, Mes06_Est, Mes07_Est, Mes08_Est, " + " Mes09_Est, Mes10_Est, Mes11_Est, Mes12_Est " + " From Presupuesto_Montos Inner Join Presupuesto_Codigos On " + " Presupuesto_Montos.CodigoPresupuesto = Presupuesto_Codigos.Codigo And " + " Presupuesto_Montos.CiaContab = Presupuesto_Codigos.CiaContab" + " Where Presupuesto_Montos.Moneda = " + nMoneda.ToString() + " And Presupuesto_Montos.CiaContab = " + nCiaContab.ToString() + " And Presupuesto_Montos.Ano = " + AnoAnterior.ToString() + " And Presupuesto_Codigos.SuspendidoFlag = 0"; if (!string.IsNullOrEmpty(this.CuentaPresupuesto_AgregarMontos_Filter_TextBox.Text)) { // el usuario indicó un valor para seleccionar por cuenta de presupuesto; hacemos un Like por este campo ... sqlSelectString += " And Presupuesto_Montos.CodigoPresupuesto Like '" + this.CuentaPresupuesto_AgregarMontos_Filter_TextBox.Text.Replace("*", "%") + "'"; } if (!this.ActualizarAunqueExistan_CheckBox.Checked) { // si el usuario lo indica, seleccionamos los montos aunque existan, y los actualizamos (si existen) ... sqlSelectString += " And Not Presupuesto_Montos.CodigoPresupuesto In " + " (Select CodigoPresupuesto From Presupuesto_Montos Where Moneda = " + nMoneda.ToString() + " And CiaContab = " + nCiaContab.ToString() + " And Ano = " + AnoActual.ToString() + ")"; } IEnumerable <_Presupuesto_Montos> Lista_PresupuestoMontos_AnoAnterior = dbContab.ExecuteQuery <_Presupuesto_Montos>(sqlSelectString); Presupuesto_Monto MyRegPresupuestoMonto; List <Presupuesto_Monto> MyRegPresupuestoMontos = new List <Presupuesto_Monto>(); foreach (_Presupuesto_Montos MyPresupuestoMontos in Lista_PresupuestoMontos_AnoAnterior) { // si el registro de montos estimados existe, lo actualizamos; de otra forma, lo agregamos ... Presupuesto_Monto presupuestoMontos = dbContab.Presupuesto_Montos. Where(m => m.CodigoPresupuesto == MyPresupuestoMontos.CodigoPresupuesto && m.CiaContab == nCiaContab && m.Moneda == nMoneda && m.Ano == AnoActual).FirstOrDefault(); if (presupuestoMontos != null) { // el registro ya existe, lo actualizamos ... presupuestoMontos.Mes01_Est = MyPresupuestoMontos.Mes01_Est; presupuestoMontos.Mes02_Est = MyPresupuestoMontos.Mes02_Est; presupuestoMontos.Mes03_Est = MyPresupuestoMontos.Mes03_Est; presupuestoMontos.Mes04_Est = MyPresupuestoMontos.Mes04_Est; presupuestoMontos.Mes05_Est = MyPresupuestoMontos.Mes05_Est; presupuestoMontos.Mes06_Est = MyPresupuestoMontos.Mes06_Est; presupuestoMontos.Mes07_Est = MyPresupuestoMontos.Mes07_Est; presupuestoMontos.Mes08_Est = MyPresupuestoMontos.Mes08_Est; presupuestoMontos.Mes09_Est = MyPresupuestoMontos.Mes09_Est; presupuestoMontos.Mes10_Est = MyPresupuestoMontos.Mes10_Est; presupuestoMontos.Mes11_Est = MyPresupuestoMontos.Mes11_Est; presupuestoMontos.Mes12_Est = MyPresupuestoMontos.Mes12_Est; nRegistrosActualizadosAnoAnterior++; } else { // el registro no existe, lo agregamos MyRegPresupuestoMonto = new Presupuesto_Monto(); MyRegPresupuestoMonto.CodigoPresupuesto = MyPresupuestoMontos.CodigoPresupuesto; MyRegPresupuestoMonto.CiaContab = nCiaContab; MyRegPresupuestoMonto.Moneda = nMoneda; MyRegPresupuestoMonto.Ano = AnoActual; MyRegPresupuestoMonto.Mes01_Est = MyPresupuestoMontos.Mes01_Est; MyRegPresupuestoMonto.Mes02_Est = MyPresupuestoMontos.Mes02_Est; MyRegPresupuestoMonto.Mes03_Est = MyPresupuestoMontos.Mes03_Est; MyRegPresupuestoMonto.Mes04_Est = MyPresupuestoMontos.Mes04_Est; MyRegPresupuestoMonto.Mes05_Est = MyPresupuestoMontos.Mes05_Est; MyRegPresupuestoMonto.Mes06_Est = MyPresupuestoMontos.Mes06_Est; MyRegPresupuestoMonto.Mes07_Est = MyPresupuestoMontos.Mes07_Est; MyRegPresupuestoMonto.Mes08_Est = MyPresupuestoMontos.Mes08_Est; MyRegPresupuestoMonto.Mes09_Est = MyPresupuestoMontos.Mes09_Est; MyRegPresupuestoMonto.Mes10_Est = MyPresupuestoMontos.Mes10_Est; MyRegPresupuestoMonto.Mes11_Est = MyPresupuestoMontos.Mes11_Est; MyRegPresupuestoMonto.Mes12_Est = MyPresupuestoMontos.Mes12_Est; MyRegPresupuestoMontos.Add(MyRegPresupuestoMonto); nRegistrosAgregadosAnoAnterior++; } } if (MyRegPresupuestoMontos.Count > 0) { dbContab.Presupuesto_Montos.InsertAllOnSubmit(MyRegPresupuestoMontos); } try { dbContab.SubmitChanges(); } catch (Exception ex) { string errorMessage = ex.Message; if (ex.InnerException != null) { errorMessage += "<br />" + ex.InnerException.Message; } ErrMessage_Span.InnerHtml = "Hemos obtenido un mensaje de error al intentar efectuar una operación en la base de datos.<br /> " + "El mensaje específico de error es: " + errorMessage; ErrMessage_Span.Style["display"] = "block"; return; } // --------------------------------------------------------------------------- // calculamos el progreso (%); es usado por el progress bar en la página nRegistroActual += 1; nProgressPercentaje = nRegistroActual * 100 / nCantidadRegistros; Session["Progress_Percentage"] = nProgressPercentaje; // --------------------------------------------------------------------------- } } // ------------------------------------------------------------------------------------------------- // YA GRABAMOS los códigos y sus montos desde al año anterior al actual; ahora leemos desde // Presupuesto_Codigos aquellos que no existan en Presupuesto_Montos (pues son nuevos?) para el año // actual y los registramos, con todos sus montos en nulls // nótese como el usuario decide si desea o no hacer este paso ... int nRegistrosAgregadosAnoActual = 0; if (this.AgregarDesdeTablaCodigosPresupuesto_CheckBox.Checked) { nRegistroActual = 0; foreach (int nMoneda in nMonedas) { foreach (int nCiaContab in nCiasContab) { // leemos los registros en Presupuesto_Montos para el "año anterior" que no existan en la misma // tabla para el "año actual" y, además, que no estén suspendidos en Presupuesto_Codigos IEnumerable <String> Lista_CodigosPresupuesto_Nuevos = dbContab.ExecuteQuery <String>( "Select Codigo From Presupuesto_Codigos Where" + " CiaContab = " + nCiaContab.ToString() + " And SuspendidoFlag = 0 And GrupoFlag = 0" + " And Not Codigo In " + " (Select CodigoPresupuesto From Presupuesto_Montos Where Moneda = " + nMoneda.ToString() + " And CiaContab = " + nCiaContab.ToString() + " And Ano = " + AnoActual.ToString() + ")" ); Presupuesto_Monto MyRegPresupuestoMonto; List <Presupuesto_Monto> MyRegPresupuestoMontos = new List <Presupuesto_Monto>(); foreach (String MyCodigoPresupuesto in Lista_CodigosPresupuesto_Nuevos) { MyRegPresupuestoMonto = new Presupuesto_Monto(); MyRegPresupuestoMonto.CodigoPresupuesto = MyCodigoPresupuesto; MyRegPresupuestoMonto.CiaContab = nCiaContab; MyRegPresupuestoMonto.Moneda = nMoneda; MyRegPresupuestoMonto.Ano = AnoActual; // nótese como todos los montos (estimados y ejecutados) quedan en null MyRegPresupuestoMontos.Add(MyRegPresupuestoMonto); nRegistrosAgregadosAnoActual++; } if (MyRegPresupuestoMontos.Count > 0) { dbContab.Presupuesto_Montos.InsertAllOnSubmit(MyRegPresupuestoMontos); try { dbContab.SubmitChanges(); } catch (Exception ex) { //ErrMessage_Span.InnerHtml = "Hemos obtenido un mensaje de error al intentar efectuar una operación en la base de datos.<br />El mensaje específico de error es: " + ex.Message; //ErrMessage_Span.Style["display"] = "block"; } } // --------------------------------------------------------------------------- // calculamos el progreso (%); es usado por el progress bar en la página nRegistroActual += 1; nProgressPercentaje = nRegistroActual * 100 / nCantidadRegistros; Session["Progress_Percentage"] = nProgressPercentaje; // --------------------------------------------------------------------------- } } } dbContab = null; // ----------------------------------------------------------------------------------------- // cuando el proceso termina, escribimos sus resultados a un xml file, para que los procese // el parent thread XElement root = new XElement("ProcessState"); XElement elm1 = new XElement("Values", new XElement("RegistrosAgregadosAnoAnterior", nRegistrosAgregadosAnoAnterior), new XElement("RegistrosActualizadosAnoAnterior", nRegistrosActualizadosAnoAnterior), new XElement("RegistrosAgregadosAnoActual", nRegistrosAgregadosAnoActual)); root.Add(elm1); String fileName = String.Concat(Page.GetType().Name, "-", User.Identity.Name); String rootPath = Server.MapPath("~"); String filePath = Server.MapPath("~/keepstatefiles/" + fileName + ".xml"); root.Save(filePath); // ----------------------------------------------------------------------------------------- // para indicar al progress bar que el proceso terminó Session["Progress_Completed"] = 1; }