private string ObtenerRecursos(string sIdAccion, string sNodo)
    {
        StringBuilder sb = new StringBuilder();
        int i = 0;
        string sDes;
        try
        {
            sb.Append("<table id='tblOpciones2' class='texto MM' style='width: 435px; mantenimiento='1'>");
            sb.Append("<colgroup><col style='width:10px;' /><col style='width:20px;' /><col style='width:365px;' /><col style='width:40px;' /></colgroup>");
            sb.Append("<tbody id='tbodyDestino'>");
            SqlDataReader dr = ACCIONRECURSOS_T.SelectByt601_idaccion(tr, int.Parse(sIdAccion));
            while (dr.Read())
            {
                sb.Append("<tr id='");
                sb.Append(dr["t314_idusuario"].ToString());
                sb.Append("' mail='" + dr["mail"].ToString());
                sb.Append("' bd='' onclick='mm(event)' onmousedown='DD(event)' style='height:20px' ");
                sb.Append("sexo='" + dr["t001_sexo"].ToString() + "' ");
                sb.Append("baja='" + dr["baja"].ToString() + "' ");
                sb.Append("tipo='" + dr["tipo"].ToString() + "' ");
                //if (dr["t303_idnodo"].ToString() == "") sb.Append("tipo='E' ");
                //else if (dr["t303_idnodo"].ToString() == sNodo) sb.Append("tipo='P' ");
                //else sb.Append("tipo='N' ");

                sb.Append("><td></td><td></td>");
                sDes = dr["nomRecurso"].ToString();
                if (sDes.Length > 80) sb.Append("<td title='" + sDes + "'>");
                else sb.Append("<td>");
                sb.Append("<nobr class='NBR W360'>" + sDes + "</nobr></label></td>");

                sb.Append("<td><input type='checkbox' style='width:20px; margin-left:3px;' id='chkNot");
                sb.Append(i.ToString());
                sb.Append("' class='checkTabla' onclick='actualizarDatos(this);' ");
                if ((bool)dr["t605_notificar"]) sb.Append("checked=true");
                sb.Append("></td></tr>");
                i++;
            }
            dr.Close();
            dr.Dispose();

            sb.Append("</tbody></table>");
            this.strTablaHTMLIntegrantes = sb.ToString();
            return "OK@#@" + sb.ToString();
        }
        catch (Exception ex)
        {
            return "Error@#@" + Errores.mostrarError("Error al obtener las personas", ex);
        }
    }
    protected string Grabar(string strDatosTarea, string slIntegrantes)
    {
        string sResul = "", sAccionBD, sIdRecurso, sCad, oRec, sIdResponsable;
        int iCodAccion, iCodAsunto;
        byte iAvance;
        DateTime? dFfp = null;
        DateTime? dFLi = null;
        bool bNotificable = false, bEnviarAlerta=false, bAlta=false;
        try
        {
            oConn = Conexion.Abrir();
            tr = Conexion.AbrirTransaccionSerializable(oConn);
        }
        catch (Exception ex)
        {
            sResul = "Error@#@" + Errores.mostrarError("Error al abrir la conexión", ex);
            return sResul;
        }
        try
        {
            #region Datos accion
            string[] aDatosTarea = Regex.Split(strDatosTarea, "##");
            // 0 -> id accion (si -1 es un alta)
            // 1 -> avance
            // 2 -> descripcion corta
            // 3 -> descripcion larga
            // 4 -> departamento
            // 5 -> f/fin
            // 6 -> f/limite
            // 7 -> alerta
            // 8 -> observaciones
            // 9 -> asunto
            // 10 -> des asunto
            // 11 -> enviar alerta (S/N)
            // 12 -> Id responsable del asunto
            // 13 -> num Tarea
            bEnviarAlerta = true;
            if (aDatosTarea[0] == "") iCodAccion = -1;
            else iCodAccion = int.Parse(aDatosTarea[0]);
            iCodAsunto = int.Parse(aDatosTarea[9]);
            if (aDatosTarea[1] == "") iAvance = 0;
            else iAvance = byte.Parse(aDatosTarea[1]);
            if (aDatosTarea[5] != "") dFfp = DateTime.Parse(aDatosTarea[5]);
            if (aDatosTarea[6] != "") dFLi = DateTime.Parse(aDatosTarea[6]);

            if (iCodAccion == -1) bAlta = true;
            if (bAlta)
            {
                DateTime dtNow = System.DateTime.Now;
                iCodAccion=ACCION_T.Insert(tr, dtNow, iCodAsunto, Utilidades.unescape(aDatosTarea[7]),
                            iAvance, Utilidades.unescape(aDatosTarea[2]),
                            Utilidades.unescape(aDatosTarea[3]),
                            Utilidades.unescape(aDatosTarea[4]),
                            dFfp, dFLi, Utilidades.unescape(aDatosTarea[8]));
            }
            else
            {
                ACCION_T.Update(tr, Utilidades.unescape(aDatosTarea[7]),
                            iAvance,
                            Utilidades.unescape(aDatosTarea[2]),
                            Utilidades.unescape(aDatosTarea[3]),
                            Utilidades.unescape(aDatosTarea[4]),
                            dFfp, dFLi, iCodAccion,
                            Utilidades.unescape(aDatosTarea[8]));
            }
            #endregion
            #region Datos integrantes
            //OfiTec.BorrarIntegrantes(iCodCR);
            if (slIntegrantes == "")
            {//Tenemos lista vacía. No hacemos nada
            }
            else
            {//Con la cadena generamos una lista y la recorremos para grabar cada elemento
                string[] aPersonas = Regex.Split(slIntegrantes, @"///");

                for (int i = 0; i < aPersonas.Length - 1; i++)
                {
                    if (aPersonas[i] != "")
                    {
                        string[] aIntegrante = Regex.Split(aPersonas[i], @"##");
                        sAccionBD = aIntegrante[0];
                        sIdRecurso = aIntegrante[1];
                        if (aIntegrante[2] == "1") bNotificable = true;
                        else bNotificable = false;

                        switch (sAccionBD)
                        {
                            case "I":
                                ACCIONRECURSOS_T.Insert(tr, int.Parse(sIdRecurso), iCodAccion, bNotificable);
                                break;
                            case "D":
                                ACCIONRECURSOS_T.Delete(tr, iCodAccion, int.Parse(sIdRecurso));
                                break;
                            case "U":
                                ACCIONRECURSOS_T.Update(tr, int.Parse(sIdRecurso), iCodAccion, bNotificable);
                                break;
                        }
                    }
                }//for
            }
            #endregion
            #region Enviar correos
            if (bEnviarAlerta)
            {
                oRec = iCodAccion.ToString() + "##";
                oRec += Utilidades.unescape(aDatosTarea[2]) + "##";//descripcion corta
                oRec += aDatosTarea[9] + "##" + Utilidades.unescape(aDatosTarea[10]) + "##";//cod y des Asunto
                oRec += dFLi.ToString() + "##" + dFfp.ToString() + "##";
                oRec += aDatosTarea[1] + "##";//avance
                oRec += Utilidades.unescape(aDatosTarea[3]) + "##";//descripcion larga accion
                oRec += Utilidades.unescape(aDatosTarea[8]) + "##";//observaciones
                oRec += Utilidades.unescape(aDatosTarea[4]) + "##";//Dpto
                oRec += aDatosTarea[13] + "##" ;//cod Tarea
                if (bAlta) sCad = "I";
                else sCad = "U";
                sIdResponsable = aDatosTarea[12];
                EnviarCorreoAlerta(sCad, oRec, Utilidades.unescape(aDatosTarea[7]), slIntegrantes, sIdResponsable, bAlta);
            }
            #endregion
            Conexion.CommitTransaccion(tr);
            sResul = "OK@#@" + iCodAccion.ToString();
        }
        catch (Exception ex)
        {
            Conexion.CerrarTransaccion(tr);
            sResul = "Error@#@" + Errores.mostrarError("Error al grabar los datos de la acción", ex);
        }
        finally
        {
            Conexion.Cerrar(oConn);
        }
        return sResul;
    }