protected void AsociarCodigosACuentaContable_Button_Click(object sender, EventArgs e) { // verificamos que existan registros seleccionados en ambos ListBoxes: codigos y cuentas if (CodigosPresupuesto_ListBox.SelectedIndex == -1 || CuentasContables_ListBox.SelectedIndex == -1 || CiasContab_DropDownList.SelectedValue == "-1") { ErrMessage_Span.InnerHtml = "Ud. debe seleccionar un registro en la lista de códigos de presupuesto y uno o varios " + "registros en la tabla de cuentas contables."; ErrMessage_Span.Style["display"] = "block"; return; } // agregamos registros a la tabla Presupuesto_AsociacionCodidosPresupuestoCuentasContables dbContabDataContext dbContab = new dbContabDataContext(); Presupuesto_AsociacionCodigosCuenta MyPresupuesto_AsociacionCodigosCuentas; List <Presupuesto_AsociacionCodigosCuenta> MyPresupuesto_AsociacionCodigosCuentas_List = new List <Presupuesto_AsociacionCodigosCuenta>(); int RecCount = 0; for (int i = 0; i < CuentasContables_ListBox.Items.Count; i++) { if (!(CuentasContables_ListBox.Items[i].Selected)) { continue; } // el item está seleccionado en el listbox; lo agregamos a nuestra lista MyPresupuesto_AsociacionCodigosCuentas = new Presupuesto_AsociacionCodigosCuenta(); MyPresupuesto_AsociacionCodigosCuentas.CodigoPresupuesto = CodigosPresupuesto_ListBox.SelectedValue; MyPresupuesto_AsociacionCodigosCuentas.CuentaContableID = Convert.ToInt32(CuentasContables_ListBox.Items[i].Value); MyPresupuesto_AsociacionCodigosCuentas.CiaContab = int.Parse(CiasContab_DropDownList.SelectedValue); MyPresupuesto_AsociacionCodigosCuentas_List.Add(MyPresupuesto_AsociacionCodigosCuentas); RecCount++; } // primero intentamos eliminar los registros de la tabla, por si acaso algunos existen try { dbContab.ExecuteCommand("Delete From Presupuesto_AsociacionCodigosCuentas Where CodigoPresupuesto = {0} And CiaContab = {1}", CodigosPresupuesto_ListBox.SelectedValue, CiasContab_DropDownList.SelectedValue); // Ok, ahora que sabemos que los registros no existen, los agregamos dbContab.Presupuesto_AsociacionCodigosCuentas.InsertAllOnSubmit(MyPresupuesto_AsociacionCodigosCuentas_List); dbContab.SubmitChanges(); CuentasContables_Message_Span.InnerHtml = "Ok, " + RecCount.ToString() + " cuentas contables fueron asociadas al código de presupuesto " + CodigosPresupuesto_ListBox.SelectedValue; CuentasContables_Message_Span.Style["display"] = "block"; } catch (Exception ex) { ErrMessage_Span.InnerHtml = "Ha ocurrido un error al intentar agregar la información a la base de datos.<br />El mensaje específico de error es: " + ex.Message; ErrMessage_Span.Style["display"] = "block"; return; } }
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; }