private string borrarAccion(string sIdAccion)
    {
        string sResul;

        try
        {
            if (sIdAccion != "")
            {
                ACCION_T.Delete(tr, int.Parse(sIdAccion));
            }
            sResul = "OK@#@" + sIdAccion;
        }
        catch (Exception e)
        {
            sResul = "error@#@" + e.Message;
        }
        return(sResul);
    }
    private string obtenerAcciones(string sIdAsunto, string sOrden, string sAscDesc)
    {
        StringBuilder sB = new StringBuilder();
        int           nIdAsunto;
        string        sIdAccion, sFecha, sIdResponsable;

        if (sIdAsunto == "")
        {
            return("error@#@Se ha intentado recoger las acciones de un asunto sin código");
        }
        nIdAsunto = int.Parse(sIdAsunto);
        sB.Append("<table id='tblDatos2' class='texto MA' style='width:650px;'>");
        sB.Append("<colgroup><col style='width:420px;' /><col style='width:70px' /><col style='width:70px;' /><col style='width:90px;' /></colgroup>");
        sB.Append("<tbody>");
        SqlDataReader dr = ACCION_T.Catalogo(null, nIdAsunto, null, "", null, null, null, byte.Parse(sOrden), byte.Parse(sAscDesc));

        while (dr.Read())
        {
            sIdAccion      = dr["t601_idaccion"].ToString();
            sIdResponsable = dr["t600_responsable"].ToString();
            sB.Append("<tr id='" + sIdAccion + "' style='height:16px;' onclick='ms(this);' ondblclick='mDetAccion(this.id," + sIdAsunto + "," + sIdResponsable + ")' onmouseover='TTip(event)'>");
            sB.Append("<td><nobr class='NBR' style='width:410px; padding-left:3px;'>" + HttpUtility.HtmlEncode(dr["t601_desaccion"].ToString()) + "</nobr></td>");
            sFecha = dr["t601_flimite"].ToString();
            if (sFecha != "")
            {
                sFecha = DateTime.Parse(dr["t601_flimite"].ToString()).ToShortDateString();
            }
            sB.Append("<td style='padding-left:5px;'>" + sFecha + "</td>");

            sB.Append("<td style='text-align:right; padding-right:10px;'>" + dr["t601_avance"].ToString() + "</td>");
            sFecha = dr["t601_ffin"].ToString();
            if (sFecha != "")
            {
                sFecha = DateTime.Parse(dr["t601_ffin"].ToString()).ToShortDateString();
            }
            sB.Append("<td style='padding-left:5px;'>" + sFecha + "</td></tr>");
        }
        dr.Close();
        dr.Dispose();
        sB.Append("</tbody>");
        sB.Append("</table>");
        strTablaHtmlAccion = sB.ToString();
        return("OK@#@" + strTablaHtmlAccion);
    }
    private void ObtenerDatosAccion()
    {
        if (nIdAccion == -1)
        {
        }
        else
        {
            ACCION_T o = ACCION_T.Select(tr, nIdAccion);
            txtIdAccion.Text = o.t601_idaccion.ToString();
            txtDesAccion.Text = o.t601_desaccion;
            txtDescripcion.Text = o.t601_desaccionlong;
            if (o.t601_flimite.Year > 1900) txtValLim.Text = o.t601_flimite.ToShortDateString();
            //Obtengo la mayor de las fechas de vigencia de sus tareas
            if (o.t601_ffin.Year > 1900) txtValFin.Text = o.t601_ffin.ToShortDateString();
            this.cboAvance.SelectedValue = o.t601_avance.ToString();
            this.cboAvance.Text = o.t601_avance.ToString();

            this.txtDpto.Text = o.t601_dpto;
            this.txtAlerta.Text = o.t601_alerta;
            this.txtObs.Text = o.t601_obs;
        }
    }
    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;
    }