コード例 #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>
        /// Возвращает путь из типов проектных затрат и организаций
        /// </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);
        }