private string Procesar(string sAnoMes, string sMeses, string strNodos)
    {
        string    sResul      = "";
        ArrayList aListCorreo = new ArrayList();

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

            PROYECTOSUBNODO.EliminarObraEnCursoDotacion(tr, int.Parse(sAnoMes), strNodos);
            DataSet ds     = PROYECTOSUBNODO.ObtenerProyectosObraEnCursoDotacion(tr, int.Parse(sAnoMes), int.Parse(sMeses), strNodos);
            int     idT325 = 0;
            foreach (DataRow oPSN in ds.Tables[0].Rows)
            {
                idT325 = SEGMESPROYECTOSUBNODO.ExisteSegMesProy(tr, (int)oPSN["t305_idproyectosubnodo"], int.Parse(sAnoMes));
                if (idT325 == 0)
                {
                    idT325 = SEGMESPROYECTOSUBNODO.InsertSiNoExiste(tr, (int)oPSN["t305_idproyectosubnodo"], int.Parse(sAnoMes));
                }

                //Insertamos en el año-mes indicado el importe del saldo obra en curso en negativo.
                DATOECO.Insert(tr, idT325, Constantes.nIdClaseDotacionObraEnCurso, "Dotación-Ajuste Obra en Curso", decimal.Parse(oPSN["Obra_Curso_Acum"].ToString()) * -1, null, null, null);
                //Registramos en la cola de correo
                EncolarCorreo(aListCorreo,
                              oPSN["codred_gestorprod"].ToString(),
                              oPSN["codred_comercialhermes"].ToString(),
                              decimal.Parse(oPSN["Obra_Curso_Acum"].ToString()).ToString("N"),
                              int.Parse(oPSN["t306_idcontrato"].ToString()).ToString("#,###"),
                              oPSN["t377_denominacion"].ToString(),
                              int.Parse(oPSN["t301_idproyecto"].ToString()).ToString("#,###"),
                              oPSN["t301_denominacion"].ToString(),
                              sMeses.ToString()
                              );
            }
            ds.Dispose();

            //    Conexion.CommitTransaccion(tr);
            Conexion.CerrarTransaccion(tr);
            EnviarCorreos(aListCorreo);
            sResul = "OK";
        }
        catch (Exception ex)
        {
            Conexion.CerrarTransaccion(tr);
            sResul = "Error@#@" + Errores.mostrarError("Error al realizar el ajuste de la dotación de la obra en curso.", ex, false);
        }
        finally
        {
            Conexion.Cerrar(oConn);
        }
        return(sResul);
    }