/// <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); }
/// <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); }
/// <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); }
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); }
/// <summary> /// Параметризированный конструктор. /// </summary> /// <param name="metaName">Строка (System.String) с наименованием /// определения структуры иерархии в метаданных; /// инициализирует значение свойства MetaName. /// Задание значения параметра обязательно; задание /// null или пустой строки недопустимо \- в этом /// случае будет сгенерировано исключение ArgumentNullException /// или ArgumentException /// соответственно. </param> /// <param name="treePath">Экземпляр объекта XTreePath, /// задающий "путь" для узла в иерархии, /// для которого требуется получить описание меню; /// инициализирует значение свойства Path.<para></para>Если /// заданный объект XTreePath /// описывает пустой путь (т.е. "длина" /// пути 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; }
/// <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); }
protected virtual XTreeLevelInfoIT[] getRootsInternal(XTreeStructInfo treeStruct, XParamsCollection treeParams, XTreePath treePath) { return(treeStruct.RootTreeLevels); }