protected string Grabar(string strDatosTarea, string slTareas)
    {
        string sIdTarea, sEstado, sResul = "";
        int    nIdTarea, nIdPT, iUsuario;
        bool   bFaltanValoresAE = false, bPrimeraTarea = true;
        short  nOrden = 0, iCodUne;

        #region abrir conexión y transacción
        try
        {
            oConn = Conexion.Abrir();
            tr    = Conexion.AbrirTransaccion(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
        try
        {
            string[] aDatosTarea = Regex.Split(strDatosTarea, "##");
            ///aDatosTarea[0] = IDPT
            ///aDatosTarea[1] = ID Actividad
            ///aDatosTarea[2] = NodoActivo
            int?nAct = null;
            if ((aDatosTarea[1] != "") && (aDatosTarea[1] != "0"))
            {
                nAct = int.Parse(aDatosTarea[1]);
            }
            nIdPT    = int.Parse(aDatosTarea[0]);
            iUsuario = int.Parse(Session["NUM_EMPLEADO_ENTRADA"].ToString());
            iCodUne  = short.Parse(aDatosTarea[2]);

            string[] aTarea = Regex.Split(slTareas, "##");
            for (int i = 0; i < aTarea.Length; i++)
            {
                if (aTarea[i] != "")
                {
                    string[] aTar = Regex.Split(aTarea[i], ";");
                    sIdTarea = aTar[0];
                    sEstado  = aTar[1];
                    if ((sIdTarea != "") && (sIdTarea != "0"))
                    {
                        nIdTarea = int.Parse(sIdTarea);
                        if (bPrimeraTarea)
                        {
                            nOrden        = TAREAPSP.flCalcularOrden2(null, nIdPT);
                            bPrimeraTarea = false;
                        }
                        else
                        {
                            nOrden++;
                        }
                        TAREAPSP.ModificarPadre(tr, nIdTarea, nIdPT, nAct, nOrden, iUsuario);
                        //Como he podido cambiar de PT hay que ver si tiene los AE del nuevo PT para calcular su estado
                        //Siempre que la tarea no esté FINALIZADA, CERRADA o ANULADA (Victor 14/02/2012)
                        if (sEstado != "3" && sEstado != "4" && sEstado != "5")
                        {
                            bFaltanValoresAE = ProyTec.bFaltanValoresAE(tr, iCodUne, nIdPT);
                            if (bFaltanValoresAE)
                            {
                                TAREAPSP.ModificarEstado(tr, nIdTarea, 2, iUsuario);//Paso a estado PENDIENTE
                            }
                        }
                    }
                }
            }
            Conexion.CommitTransaccion(tr);

            sResul = "OK@#@";
        }
        catch (Exception ex)
        {
            Conexion.CerrarTransaccion(tr);
            sResul = "Error@#@" + Errores.mostrarError("Error al grabar los datos de la tarea", ex);
        }
        finally
        {
            Conexion.Cerrar(oConn);
        }
        return(sResul);
    }