private string getProyectosNoCerrados(int iAnoMes)
    {
        try
        {
            StringBuilder sb = new StringBuilder();
            bool          bMesesOK = true, bProcesable = true;

            sb.Append("<table class='texto' id=tblDatos style='width: 970px;' border='0'>");
            sb.Append("<colgroup>");
            sb.Append("<col style='width:25px;' />");
            sb.Append("<col style='width:20px;' />");
            sb.Append("<col style='width:55px;' />");
            sb.Append("<col style='width:220px;' />");
            sb.Append("<col style='width:55px;' />");
            sb.Append("<col style='width:50px;' />");
            sb.Append("<col style='width:60px;' />");
            sb.Append("<col style='width:60px;' />");
            sb.Append("<col style='width:20px;' />");
            sb.Append("<col style='width:20px;' />");
            sb.Append("<col style='width:20px;' />");
            sb.Append("<col style='width:20px;' />");
            sb.Append("<col style='width:20px;' />");
            sb.Append("<col style='width:60px;' />");//Contrato
            sb.Append("<col style='width:80px;' />");
            sb.Append("<col style='width:80px;' />");
            sb.Append("<col style='width:80px;' />");
            sb.Append("<col style='width:25px;' />");
            sb.Append("</colgroup>");
            SqlDataReader dr = PROYECTOSUBNODO.ObtenerProyectosNoCerrados((int)Session["UsuarioActual"], iAnoMes);

            while (dr.Read())
            {
                bMesesOK    = true;
                bProcesable = true;

                sb.Append("<tr id='" + dr["t301_idproyecto"].ToString() + "' ");
                sb.Append("idPSN='" + dr["t305_idproyectosubnodo"].ToString() + "' ");
                sb.Append("monedaPSN='" + dr["t422_idmoneda_proyecto"].ToString() + "' ");

                sb.Append(" ondblclick='irCarrusel(this)' ");

                if (dr["faltan_CEC_obligatorios"].ToString() == "1" ||
                    dr["faltan_CED_obligatorios"].ToString() == "1" ||
                    (Fechas.AddAnnomes(int.Parse(dr["T303_ultcierreeco"].ToString()), 1) != int.Parse(dr["t325_anomes"].ToString()) && sOrigen != "carrusel")
                    )
                {
                    bProcesable = false;
                }
                if (bProcesable)
                {
                    sb.Append(" p='1'");
                }
                else
                {
                    sb.Append(" p='0'");
                }
                //sb.Append(" ondblclick='CierreProyecto(this)'  procesado='' ");
                //


                sb.Append(" procesado='' ");
                //if (iAnoMes == int.Parse(dr["t325_anomes"].ToString())) sb.Append(" class='MANO' ");
                sb.Append(" class='MA' ");
                sb.Append("style='height:20px;'>");

                if (dr["ajuste"].ToString() == "1")
                {
                    this.hdnExcepcion.Text = "1";
                }
                //Celda 1
                sb.Append("<td style='cursor:pointer;'>");
                if (bProcesable)
                {
                    sb.Append("<input type='checkbox' class='check' style='margin-left:5px;'/>");
                }
                sb.Append("</td>");
                //Celda 2
                if (dr["t305_cualidad"].ToString() == "C")
                {
                    sb.Append("<td><img src='../../../images/imgIconoContratante.gif' width='16px' height='16px' /></td>");
                }
                else
                {
                    sb.Append("<td><img src='../../../images/imgIconoRepPrecio.gif' width='16px' height='16px' /></td>");
                }
                //Celda 3
                sb.Append("<td style='text-align:right; padding-right:5px;'>" + int.Parse(dr["t301_idproyecto"].ToString()).ToString("#,###") + "</td>");
                //Celda 4
                if (iAnoMes != int.Parse(dr["t325_anomes"].ToString()))
                {
                    sb.Append("<td style='padding-left:3px;' style='color:red'>");
                }
                else
                {
                    sb.Append("<td style='padding-left:3px;'>");
                }

                sb.Append("<nobr class='NBR W210' style='noWrap:true;' title=\"cssbody=[dvbdy] cssheader=[dvhdr] header=[<img src='../../../images/info.gif' style='vertical-align:middle' />  Información] body=[<label style='width:75px'>Proyecto:</label>" + dr["t301_denominacion"].ToString().Replace((char)34, (char)39) + "<br><label style='width:75px'>Responsable:</label>" + dr["responsable"].ToString().Replace((char)34, (char)39) + "<br><label style='width:75px'>" + Estructura.getDefCorta(Estructura.sTipoElem.NODO) + ":</label>" + dr["t303_denominacion"].ToString().Replace((char)34, (char)39) + "<br><label style='width:75px'>Cliente:</label>" + dr["t302_denominacion"].ToString().Replace((char)34, (char)39) + "] hideselects=[off]\" ondblclick='irCarrusel(this.parentNode.parentNode)' >" + dr["t301_denominacion"].ToString().Replace((char)34, (char)39) + "</nobr></td>");

                //Celda 5
                sb.Append("<td>" + Fechas.AnnomesAFechaDescCorta(int.Parse(dr["T303_ultcierreeco"].ToString())) + "</td>");
                //Celda 6
                if (Fechas.AddAnnomes(int.Parse(dr["T303_ultcierreeco"].ToString()), 1) != int.Parse(dr["t325_anomes"].ToString()))
                {
                    sb.Append("<td style='color:red'>");
                    bMesesOK = false;
                }
                else
                {
                    sb.Append("<td>");
                }
                sb.Append(Fechas.AnnomesAFechaDescCorta(int.Parse(dr["t325_anomes"].ToString())) + "</td>");
                //Celda 7
                sb.Append("<td style='text-align:right; padding-right:2px;'>" + double.Parse(dr["consumoIAP"].ToString()).ToString("N") + "</td>");
                //Celda 8
                sb.Append("<td style='text-align:right; padding-right:2px;'>" + double.Parse(dr["consumoPGE"].ToString()).ToString("N") + "</td>");
                //Celda 9
                if (bMesesOK)
                {
                    sb.Append("<td style=text-align:center;'></td>");
                }
                else
                {
                    if (sOrigen == "carrusel")
                    {
                        sb.Append("<td style=text-align:center;'><img src='../../../Images/imgCalAma.gif' /></td>");
                    }
                    else
                    {
                        sb.Append("<td  style=text-align:center;'><img src='../../../Images/imgCalRojo.gif' /></td>");
                    }
                    this.hdnExcepcion.Text = "1";
                }
                //Celda 10
                if (dr["faltan_CEC_obligatorios"].ToString() == "1" || dr["faltan_CED_obligatorios"].ToString() == "1")
                {
                    sb.Append("<td style=text-align:center;'><img src='../../../Images/imgIconoObl16.gif' /></td>");
                    this.hdnExcepcion.Text = "1";
                }
                else
                {
                    sb.Append("<td style=text-align:center;'></td>");
                }
                //Celda 11
                if (dr["faltan_Cualificadores_obligatorios"].ToString() == "1")
                {
                    sb.Append("<td style=text-align:center;'><img src='../../../Images/imgIconoObl16Azul.gif' /></td>");
                    this.hdnExcepcion.Text = "1";
                }
                else
                {
                    sb.Append("<td style=text-align:center;'></td>");
                }
                //Celda 12
                if (decimal.Parse(dr["consumonivel"].ToString()) > 0)
                {
                    sb.Append("<td style=text-align:center;'><img src='../../../Images/imgConsNivel.gif' /></td>");
                    this.hdnExcepcion.Text = "1";
                }
                else
                {
                    sb.Append("<td style=text-align:center;'></td>");
                }
                //Celda 13
                if (dr["ajuste"].ToString() == "1")
                {
                    sb.Append("<td style=text-align:center;'><img src='../../../Images/imgAjuste2.gif' title='Importe de ajuste: " + double.Parse(dr["Importe_Ajuste"].ToString()).ToString("N") + " &euro;' /></td>");
                    this.hdnExcepcion.Text = "1";
                }
                else
                {
                    sb.Append("<td style=text-align:center;'></td>");
                }
                //Celda 14
                if (dr["t306_idcontrato"].ToString() == "" || dr["t305_cualidad"].ToString() != "C")
                {
                    sb.Append("<td style='text-align:right;'></td>");
                }
                else
                {
                    sb.Append("<td style='text-align:right;'>" + int.Parse(dr["t306_idcontrato"].ToString()).ToString("#,###") + "</td>");
                }
                //Celda 15
                if (dr["t305_cualidad"].ToString() != "C")
                {
                    sb.Append("<td style='text-align:right;'></td>");
                }
                else
                {
                    sb.Append("<td style='text-align:right;'>" + decimal.Parse(dr["TotalContrato"].ToString()).ToString("N") + "</td>");
                }
                //Celda 16
                sb.Append("<td style='text-align:right;'>" + decimal.Parse(dr["TotalProducido"].ToString()).ToString("N") + "</td>");
                //Celda 17
                if (dr["t305_cualidad"].ToString() != "C")
                {
                    sb.Append("<td style='text-align:right;'></td>");
                }
                else
                {
                    sb.Append("<td style='text-align:right;'>" + decimal.Parse(dr["TPPAC"].ToString()).ToString("N") + "</td>");
                }
                //Celda 18
                if (bProcesable)
                {
                    sb.Append("<td style='text-align:right;padding-right:3px;'><img src='../../../Images/imgMesAbierto.gif' /></td>");
                }
                else
                {
                    sb.Append("<td style='text-align:right;padding-right:3px;'><img src='../../../Images/imgMesNoProceso.gif' /></td>");
                }
                sb.Append("</tr>");
            }
            dr.Close();
            dr.Dispose();

            sb.Append("</table>");

            return("OK@#@" + sb.ToString() + "@#@" + this.hdnExcepcion.Text);
        }
        catch (Exception ex)
        {
            return("Error@#@" + Errores.mostrarError("Error al obtener los proyectos.", ex));
        }
    }