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;
    }
Beispiel #2
0
    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;
    }