Внутренний номер сотрудника по ID пользователя — различия между версиями
(не показано 9 промежуточных версии этого же участника) | |||
Строка 1: | Строка 1: | ||
− | [[ | + | [[Работа с БД Oktell|Наверх]] |
− | SQL-запрос находит по таблице внутренний номер пользователя по его идентификатору | + | SQL-запрос находит по таблице внутренний номер пользователя по его идентификатору. |
− | + | * Запрос находит такой внутренний номер, в котором может быть только один пользователь и несколько внешних номеров и линий. | |
+ | * Если в номере '''больше 1 пользователя''' или есть какие-либо '''внутренние номера''', то считается что это '''номер групповой'''. | ||
+ | * Если у сотрудника все номера групповые возвращается тот, у которого меньше объектов. | ||
− | + | '''Описание:''' Например, у менеджера Иванова был номер 800, в котором был обозначен только этот пользователь. После добавления нескольких мобильных, Иванов хотел бы, чтобы по-прежнему его номер определялся как номер 800. Но теперь его номер стал групповым. Если существует, например групповой номер операторской группы 100, то теперь будет номер Иванова будет определяться как наименьший из групповых, т.е. номер 100. Запрос решает эту проблему и находит номер Иванова 800. В расчет специально не берутся внутренние номера, потому что в них могут быть вложены пользователи, а задача распаковки номера слишком ресурсозатратна. Исходя из этого, определяются только те номера, в которых нет других пользователей помимо данного и нет внутренних номеров. | |
+ | '''Пример внутреннего номера:''' | ||
+ | |||
+ | [[Файл:Внутренний номер по IDuser 001.png|center]] | ||
− | + | <pre> | |
− | + | SELECT top 1 @prefix=Prefix | |
− | + | FROM ( | |
− | + | SELECT COALESCE((SELECT count(*) | |
− | + | FROM A_RuleRecords s_r | |
− | + | LEFT JOIN A_NumberPlanAction s_npa ON s_r.ReactID = s_npa.NumID | |
− | + | LEFT JOIN A_RuleRecords ss_r ON s_npa.ExtraId = ss_r.RuleId | |
− | + | WHERE s_r.RuleID = r.RuleID AND (s_r.ReactID IN (SELECT ID FROM A_USERS) OR s_npa.NumID IS NOT NULL)),0) cnt | |
+ | , np.Prefix, np.Visible | ||
+ | FROM A_NumberPlan np | ||
+ | INNER JOIN A_NumberPlanAction npa ON np.ID=npa.NumID | ||
+ | JOIN A_RuleRecords r ON r.RuleID = npa.ExtraId AND r.reactid=@userid | ||
+ | AND InnerAddressType=0 -- Если только "Внутренние номера" | ||
+ | ) t | ||
+ | ORDER BY cnt, Visible DESC | ||
+ | </pre> | ||
где | где |
Текущая версия на 11:58, 22 декабря 2014
SQL-запрос находит по таблице внутренний номер пользователя по его идентификатору.
- Запрос находит такой внутренний номер, в котором может быть только один пользователь и несколько внешних номеров и линий.
- Если в номере больше 1 пользователя или есть какие-либо внутренние номера, то считается что это номер групповой.
- Если у сотрудника все номера групповые возвращается тот, у которого меньше объектов.
Описание: Например, у менеджера Иванова был номер 800, в котором был обозначен только этот пользователь. После добавления нескольких мобильных, Иванов хотел бы, чтобы по-прежнему его номер определялся как номер 800. Но теперь его номер стал групповым. Если существует, например групповой номер операторской группы 100, то теперь будет номер Иванова будет определяться как наименьший из групповых, т.е. номер 100. Запрос решает эту проблему и находит номер Иванова 800. В расчет специально не берутся внутренние номера, потому что в них могут быть вложены пользователи, а задача распаковки номера слишком ресурсозатратна. Исходя из этого, определяются только те номера, в которых нет других пользователей помимо данного и нет внутренних номеров.
Пример внутреннего номера:
SELECT top 1 @prefix=Prefix FROM ( SELECT COALESCE((SELECT count(*) FROM A_RuleRecords s_r LEFT JOIN A_NumberPlanAction s_npa ON s_r.ReactID = s_npa.NumID LEFT JOIN A_RuleRecords ss_r ON s_npa.ExtraId = ss_r.RuleId WHERE s_r.RuleID = r.RuleID AND (s_r.ReactID IN (SELECT ID FROM A_USERS) OR s_npa.NumID IS NOT NULL)),0) cnt , np.Prefix, np.Visible FROM A_NumberPlan np INNER JOIN A_NumberPlanAction npa ON np.ID=npa.NumID JOIN A_RuleRecords r ON r.RuleID = npa.ExtraId AND r.reactid=@userid AND InnerAddressType=0 -- Если только "Внутренние номера" ) t ORDER BY cnt, Visible DESC
где
- @prefix (вых) - содержит внутренний номер пользователя
- @userid (вх) - ID пользователя
ВНИМАНИЕ: Начиная с версии 2.10 внутренний номер пользователя может быть найден с помощью компонента "Статус объекта"