protected string Grabar(string sSegMesProy, string strDatos)
    {
        string sResul           = "";
        bool   bErrorControlado = false;
        double dUnidades        = 0;
        double?dUnidadesBD      = null;

        #region apertura de conexión y transacción
        try
        {
            oConn = Conexion.Abrir();
            tr    = Conexion.AbrirTransaccionSerializable(oConn);
        }
        catch (Exception ex)
        {
            sResul = "Error@#@" + Errores.mostrarError("Error al abrir la conexión", ex);
            return(sResul);
        }
        #endregion

        try
        {
            if (Session["ADMINISTRADOR_PC_ACTUAL"].ToString() != "SA")
            {
                SEGMESPROYECTOSUBNODO oSMPSN = SEGMESPROYECTOSUBNODO.Obtener(tr, int.Parse(sSegMesProy), null);
                if (oSMPSN.t325_estado == "C")
                {
                    bErrorControlado = true;
                    throw (new Exception("Durante su intervención en la pantalla, otro usuario ha cerrado el mes en curso."));
                }
            }
            //CONSNIVELMES.DeleteByT325_idsegmesproy(tr, int.Parse(sSegMesProy));
            string[] aConsumo = Regex.Split(strDatos, "///");
            foreach (string oConsumo in aConsumo)
            {
                if (oConsumo == "")
                {
                    continue;
                }
                string[] aValores = Regex.Split(oConsumo, "##");
                //0. Opcion BD. "I", "U", "D"
                //1. ID NIvel
                //2. Coste
                //3. Unidades
                dUnidades = double.Parse(aValores[3]);
                if (dUnidades == 0)
                {
                    CONSNIVELMES.Delete(tr, int.Parse(sSegMesProy), int.Parse(aValores[1]));
                }
                else
                {                            //Si existe en BBDD, updateo, sino, inserto
                    dUnidadesBD = CONSNIVELMES.GetUnidades(tr, int.Parse(sSegMesProy), int.Parse(aValores[1]));
                    if (dUnidadesBD == null) //No existe registro -> lo insertamos
                    {
                        CONSNIVELMES.Insert(tr, int.Parse(sSegMesProy), int.Parse(aValores[1]), decimal.Parse(aValores[2]), dUnidades);
                    }
                    else
                    {//El registro ya existe, solo updateamos si el valor es diferente
                        if (dUnidades != dUnidadesBD)
                        {
                            CONSNIVELMES.UpdateUnidades(tr, int.Parse(sSegMesProy), int.Parse(aValores[1]), dUnidades);
                        }
                    }
                }
            }
            Conexion.CommitTransaccion(tr);
            sResul = "OK@#@";
        }
        catch (Exception ex)
        {
            Conexion.CerrarTransaccion(tr);
            if (!bErrorControlado)
            {
                sResul = "Error@#@" + Errores.mostrarError("Error al grabar los consumos por nivel.", ex);
            }
            else
            {
                sResul = "Error@#@Operación rechazada.\n\n" + ex.Message;
            }
        }
        finally
        {
            Conexion.Cerrar(oConn);
        }

        return(sResul);
    }
    public string getDatosNivel(string sSegMesProy, string sEstadoMes, string sModeloCoste, string sIdNodo, string sEstadoProy, string sMonedaProyecto2, string sMonedaImportes2)
    {
        StringBuilder sb = new StringBuilder();
        SqlDataReader dr;

        try
        {
            sLectura = "false";

            sb.Append("<table id=tblDatos style='width: 960px;' mantenimiento='1'>");
            sb.Append("<colgroup>");
            sb.Append("<col style='width:10px;' />");
            sb.Append("<col style='width:600px;' />");
            sb.Append("<col style='width:120px;' />");
            sb.Append("<col style='width:120px;' />");
            sb.Append("<col style='width:120px;' />");
            sb.Append("</colgroup>");
            sb.Append("<tbody>");

            if (sMonedaProyecto2 != sMonedaImportes2)
            {
                sLectura = "true";
            }
            else
            {
                if (sEstadoProy == "H" || sEstadoProy == "C" || (bool)Session["MODOLECTURA_PROYECTOSUBNODO"] || sEstadoMes == "C")
                {
                    sLecturaInsMes = "true";
                    sLectura       = "true";
                }
                if ((sEstadoProy == "A" || sEstadoProy == "P") && Session["ADMINISTRADOR_PC_ACTUAL"].ToString() == "SA")
                {
                    sLectura = "false";
                }
            }

            //Comprobar si hay conspermes. Si hay, poner en lectura y mostrar mmoff
            dr = CONSPERMES.Catalogo(int.Parse(sSegMesProy), null, null, null, null, null, null, 1, 0);
            if (dr.Read())
            {
                sHayConsumos = "true";
            }
            dr.Close();

            dr = CONSNIVELMES.Catalogo(int.Parse(sSegMesProy), sEstadoMes, sMonedaImportes2);
            while (dr.Read())
            {
                sb.Append("<tr id='" + dr["t442_idnivel"].ToString() + "' bd='' unidades='" + dr["t379_unidades"].ToString().Replace(",", ".") + "' style='height:20px;'");

                if (sLectura == "false" && sHayConsumos == "false")
                {
                    sb.Append(" onclick='mm(event)' ");
                }

                sb.Append("><td><img src='../../../images/imgFN.gif'></td>");
                sb.Append("<td style='padding-left:5px;'>" + dr["t442_denominacion"].ToString() + "</td>");
                sb.Append("<td style='text-align:right;'>" + decimal.Parse(dr["coste"].ToString()).ToString("N") + "</td>");

                if (sLectura == "false" && sHayConsumos == "false")
                {
                    sb.Append("<td style='text-align:right;'><input type='text' class='txtNumL' style='width:90px; cursor:pointer' value='" + double.Parse(dr["t379_unidades"].ToString()).ToString("N") + "' onkeyup='fm(event);setUnidades(this);' onfocus='fn(this);' onchange='calcularTotal()' title='" + dr["t379_unidades"].ToString().Replace(",", ".") + "' /></td>");
                    sb.Append("<td style='text-align:right;padding-right:2px;'><input type='text' class='txtNumL' style='width:90px; cursor:pointer' value='" + double.Parse(dr["importe"].ToString()).ToString("N") + "' onkeyup='fm(event);setImporte(this);' onfocus='fn(this);' onchange='calcularTotal()' /></td>");
                }
                else
                {
                    sb.Append("<td style='text-align:right;'>" + double.Parse(dr["t379_unidades"].ToString()).ToString("N") + "</td>");
                    sb.Append("<td style='text-align:right;padding-right:2px;'>" + double.Parse(dr["importe"].ToString()).ToString("N") + "</td>");
                }
                sb.Append("</tr>");
            }
            dr.Close();
            dr.Dispose();
            sb.Append("</tbody>");
            sb.Append("</table>");

            return("OK@#@" + sb.ToString() + "@#@" + sLectura + "@#@" + sHayConsumos + "@#@" + MONEDA.getDenominacionImportes(sMonedaImportes2));
        }
        catch (Exception ex)
        {
            return("Error@#@" + Errores.mostrarError("Error al obtener los consumos de niveles", ex));
        }
    }