コード例 #1
0
        /// <summary>
        /// Возвращает полный путь до инцидента, заданного идентификатором, либо номером
        /// </summary>
        /// <param name="con"></param>
        /// <param name="IncidentNumber">номер инцидента</param>
        /// <param name="IncidentOID">идентификатор инцидента или Guid.Empty</param>
        /// <returns></returns>
        private XTreePath GetIncidentFullPath(XStorageConnection con, Int32 IncidentNumber, Guid IncidentOID)
        {
            Guid organizationID = Guid.Empty;                           // идентификатор организации, в которой расположен инцидент
            Guid activityTypeID = Guid.Empty;                           // идентификатор вида активности,на которую ссылается папка, в которой разположен инцидент

            // сфомируем путь из каталогов
            string sQuery = String.Format(
                @"SELECT i.ObjectID AS IncidentID, f.ObjectID, f_s.Customer, f_s.ActivityType
				FROM Incident i with (nolock)
					JOIN Folder f_s with (nolock) ON i.Folder = f_s.ObjectID
						JOIN Folder f with (nolock) ON f.LIndex <= f_s.LIndex AND f.RIndex >= f_s.RIndex AND f.Customer = f_s.Customer
				WHERE {0}
				ORDER BY f.LRLevel DESC"                ,
                IncidentOID == Guid.Empty ?
                "i.Number = @Number" :
                "i.ObjectID = @ObjectID"
                );
            XDbCommand cmd = con.CreateCommand(sQuery);

            if (IncidentOID == Guid.Empty)
            {
                cmd.Parameters.Add("Number", DbType.Int32, ParameterDirection.Input, false, IncidentNumber);
            }
            else
            {
                cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, IncidentOID);
            }

            XTreePath path = new XTreePath();                   // путь

            using (IDataReader reader = cmd.ExecuteReader())
            {
                int nObjectIDIndex = -1;                                        // индекс поля ObjectID
                while (reader.Read())
                {
                    if (nObjectIDIndex < 0)
                    {
                        // первая итерация
                        IncidentOID    = reader.GetGuid(reader.GetOrdinal("IncidentID"));
                        organizationID = reader.GetGuid(reader.GetOrdinal("Customer"));
                        activityTypeID = reader.GetGuid(reader.GetOrdinal("ActivityType"));
                        nObjectIDIndex = reader.GetOrdinal("ObjectID");
                    }
                    path.Append(TYPE_Folder, reader.GetGuid(nObjectIDIndex));
                }
            }
            if (path.Length > 0)
            {
                path.Append(GetPathToFolder(con, organizationID, activityTypeID));
                path.InsertAtBeginning(TYPE_Incident, IncidentOID);
            }

            return(path);
        }
コード例 #2
0
        /// <summary>
        /// Возвращает полный путь к проекту: Folder|oid|..|Folder|{oid}|ActivitType|{oid}|Organization|{oid}
        /// </summary>
        /// <param name="con"></param>
        /// <param name="FolderExID">Код проекта</param>
        /// <returns></returns>
        public XTreePath GetFolderFullPath(XStorageConnection con, string FolderExID)
        {
            // сфомируем путь из каталогов
            XDbCommand cmd = con.CreateCommand(@"
				SELECT f.ObjectID, f.Customer, f_s.ActivityType
				FROM Folder f_s with (nolock)
						JOIN Folder f with (nolock) ON f.LIndex <= f_s.LIndex AND f.RIndex >= f_s.RIndex AND f.Customer = f_s.Customer
				WHERE f_s.ExternalID = @FolderExID
				ORDER BY f.LRLevel DESC"
                                               );

            cmd.Parameters.Add("FolderExID", DbType.String, ParameterDirection.Input, false, FolderExID);
            XTreePath path           = new XTreePath(); // путь
            Guid      organizationID = Guid.Empty;      // идентификатор организации, в которой расположен инцидент
            Guid      activityTypeID = Guid.Empty;      // идентификатор вида активности,на которую ссылается папка, в которой разположен инцидент

            using (IDataReader reader = cmd.ExecuteReader())
            {
                int nObjectIDIndex = -1;                        // индекс поля ObjectID
                while (reader.Read())
                {
                    if (nObjectIDIndex < 0)
                    {
                        organizationID = reader.GetGuid(reader.GetOrdinal("Customer"));
                        activityTypeID = reader.GetGuid(reader.GetOrdinal("ActivityType"));
                        nObjectIDIndex = reader.GetOrdinal("ObjectID");
                    }
                    path.Append(TYPE_Folder, reader.GetGuid(nObjectIDIndex));
                }
            }
            // Сформируем путь из организаций и типов проектных затрат
            if (path.Length > 0)
            {
                XTreePath pathToFolder = GetPathToFolder(con, organizationID, activityTypeID);
                path.Append(pathToFolder);
            }
            return(path);
        }
コード例 #3
0
        /// <summary>
        /// Возвращает путь из типов проектных затрат и организаций
        /// </summary>
        /// <param name="con"></param>
        /// <param name="organizationID"></param>
        /// <param name="activityTypeID"></param>
        /// <returns></returns>
        public XTreePath GetPathToFolder(XStorageConnection con, Guid organizationID, Guid activityTypeID)
        {
            XTreePath  path = new XTreePath();                          // путь
            XDbCommand cmd;
            bool       bIsHome = false;                                 // признак организации-владельца

            // Сформируем путь из организаций
            // Примечание: делаем это перед формирование пути из типов проектных затрат дл того, чтобы считать признак "родной" организации
            cmd = con.CreateCommand(@"
				SELECT o.ObjectID, o.Home
				FROM Organization o with (nolock)
					JOIN Organization o_s with (nolock) ON o.LIndex <= o_s.LIndex AND o.RIndex >= o_s.RIndex
				WHERE o_s.ObjectID = @ObjectID
				ORDER BY o.LRLevel DESC"
                                    );
            cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, organizationID);
            using (IDataReader reader = cmd.ExecuteReader())
            {
                int nObjectIDIndex = -1;
                while (reader.Read())
                {
                    if (nObjectIDIndex < 0)
                    {
                        bIsHome        = reader.GetBoolean(reader.GetOrdinal("Home"));
                        nObjectIDIndex = reader.GetOrdinal("ObjectID");
                    }
                    if (bIsHome)
                    {
                        path.Append(TYPE_HomeOrganization, reader.GetGuid(nObjectIDIndex));
                    }
                    else
                    {
                        path.Append(TYPE_Organization, reader.GetGuid(nObjectIDIndex));
                    }
                }
            }


            // сформируем путь из видов активностей
            // Примечание: Сортировка отличается от предыдущего запроса, т.к. узлы будем добавлять в начала пути
            //				(т.е. в обратной последовательсноти относительно организаций)
            cmd = con.CreateCommand(@"
				SELECT at.ObjectID
				FROM ActivityType at_s with (nolock)
					JOIN ActivityType at with (nolock) ON at.LIndex <= at_s.LIndex AND at.RIndex >= at_s.RIndex
				WHERE at_s.ObjectID = @ActivityTypeID
				ORDER BY at.LRLevel"
                                    );
            cmd.Parameters.Add("ActivityTypeID", DbType.Guid, ParameterDirection.Input, false, activityTypeID);
            using (IDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    if (bIsHome)
                    {
                        path.InsertAtBeginning(TYPE_ActivityTypeInternalUnderHomeOrg, reader.GetGuid(0));
                    }
                    else
                    {
                        path.InsertAtBeginning(TYPE_ActivityType, reader.GetGuid(0));
                    }
                }
            }

            return(path);
        }
コード例 #4
0
        protected override XTreeLevelInfoIT[] getRootsInternal(XTreeStructInfo treeStruct, XParamsCollection treeParams, XTreePath treePath)
        {
            DKPTreeModes mode;

            // получение корней при загрузке корней будем определять по параметру Mode,
            if (treePath == null)
            {
                int nMode;
                if (!treeParams.Contains("Mode"))
                {
                    throw new ArgumentException("Не задан обязательный параметр Mode - режим иерархии");
                }
                string sMode = treeParams["Mode"].ToString();
                try
                {
                    nMode = Int32.Parse(sMode);
                }
                catch (FormatException)
                {
                    throw new ApplicationException("Некорректный формат параметра \"режим иерархии\": " + sMode);
                }
                mode = (DKPTreeModes)nMode;
            }
            // а получение корней в других случаях (при поиске описания узла, соответствующего пути) по типу 1-ой ноды в пути
            else
            {
                string sRootTypeName = treePath[treePath.Length - 1].ObjectType;
                if (sRootTypeName == "Folder")
                {
                    mode = DKPTreeModes.Activities;
                }
                else if (sRootTypeName == "Organization" || sRootTypeName == "HomeOrganization")
                {
                    mode = DKPTreeModes.Organizations;
                }
                else
                {
                    throw new ArgumentException("Неизвестный тип корневого узла: " + sRootTypeName);
                }
            }
            bool bAcceptOrganization = (mode == DKPTreeModes.Organizations);

            ArrayList aList = new ArrayList();

            foreach (XTreeLevelInfoIT levelInfo in treeStruct.RootTreeLevels)
            {
                if (
                    (bAcceptOrganization && (levelInfo.ObjectType == "Organization" || levelInfo.ObjectType == "HomeOrganization"))
                    ||
                    !bAcceptOrganization && levelInfo.ObjectType == "Folder"
                    )
                {
                    aList.Add(levelInfo);
                }
            }
            XTreeLevelInfoIT[] roots = new XTreeLevelInfoIT[aList.Count];
            aList.CopyTo(roots);
            return(roots);
        }
コード例 #5
0
 /// <summary>
 /// Параметризированный конструктор.
 /// </summary>
 /// <param name="metaName">Строка (System.String) с наименованием
 ///                        определения структуры иерархии в метаданных;
 ///                        инициализирует значение свойства MetaName.
 ///                        Задание значения параметра обязательно; задание
 ///                        null или пустой строки недопустимо \- в этом
 ///                        случае будет сгенерировано исключение ArgumentNullException
 ///                        или ArgumentException
 ///                        соответственно. </param>
 /// <param name="treePath">Экземпляр объекта XTreePath,
 ///                        задающий &quot;путь&quot; для узла в иерархии,
 ///                        для которого требуется получить описание меню;
 ///                        инициализирует значение свойства Path.<para></para>Если
 ///                        заданный объект XTreePath
 ///                        описывает пустой путь (т.е. &quot;длина&quot;
 ///                        пути Length
 ///                        нулевая) \- то операция выполняет получение
 ///                        данных для пустой иерархии (определяемое
 ///                        элементом <b>i\:empty\-tree\-menu</b>). </param>
 /// <exception cref="ArgumentException">Если в качестве значения
 ///                                     параметра <b><i>metaName</i></b>
 ///                                     задана пустая строка. </exception>
 /// <exception cref="ArgumentNullException">Если параметр <b><i>metaName</i></b>
 ///                                         задан в null. </exception>
 public XXGetTreeNodeDragRequest(string metaName, XTreePath treePath)
     : base(DEF_COMMAND_NAME)
 {
     MetaName = metaName;
     Path     = treePath;
 }
コード例 #6
0
        /// <summary>
        /// Возвращает метаописание уровня (i:tree-level) иерархии, соответствующего "пути"
        /// </summary>
        /// <returns>Объект-описатель уровня иерархии</returns>
        public virtual XTreeLevelInfoIT GetTreeLevel(XTreeStructInfo treeStruct, XParamsCollection treeParams, XTreePath treePath)
        {
            string[]         nodesTypes  = treePath.GetNodeTypes();
            string           sIgnoreType = String.Empty;        // наименование игнорируемого типа из переданного пути (в случае рекурсии)
            XTreeLevelInfoIT treelevel   = null;

            XTreeLevelInfoIT[] treelevels;
            bool bFound;

            for (int i = nodesTypes.Length - 1; i >= 0; i--)
            {
                if (sIgnoreType != nodesTypes[i])
                {
                    bFound = false;
                    if (treelevel == null)
                    {
                        treelevels = getRootsInternal(treeStruct, treeParams, treePath);
                    }
                    else
                    {
                        treelevels = treelevel.GetChildTreeLevelsRuntime(treeParams);
                    }
                    foreach (XTreeLevelInfoIT childLevel in treelevels)
                    {
                        if (childLevel.ObjectType == nodesTypes[i])
                        {
                            treelevel = childLevel;
                            bFound    = true;
                            break;
                        }
                    }
                    if (!bFound)
                    {
                        throw new XTreeStructException("Не найдено описания уровня иерархии, соответствующего заданному пути");
                    }
                    // если у текущего уровня стоит признак рекурсии, то надо пропускать все
                    // последующие типы в пути до тех пор, пока не встретится другой тип:
                    if (treelevel.IsRecursive)
                    {
                        sIgnoreType = nodesTypes[i];
                    }
                    else
                    {
                        sIgnoreType = String.Empty;
                    }
                }
            }
            return(treelevel);
        }
コード例 #7
0
 protected virtual XTreeLevelInfoIT[] getRootsInternal(XTreeStructInfo treeStruct, XParamsCollection treeParams, XTreePath treePath)
 {
     return(treeStruct.RootTreeLevels);
 }