Внутренний номер сотрудника по ID пользователя — различия между версиями

Материал из Oktell
Перейти к: навигация, поиск
(Новая страница: «Наверх SQL-запрос находит по таблице внутренний номер пользователя по его...»)
 
 
(не показано 11 промежуточных версии этого же участника)
Строка 1: Строка 1:
[[Дополнительно|Наверх]]
+
[[Работа с БД Oktell|Наверх]]
  
SQL-запрос находит по таблице внутренний номер пользователя по его идентификатору iduser.  
+
SQL-запрос находит по таблице внутренний номер пользователя по его идентификатору.  
  
<span style="color:red"> ВНИМАНИЕ: У пользователя должен быть "нативный" номер, то есть такой стандартный внутренний номер, в котором только один объект - данный пользователь. Иначе запрос не найдет внутренний номер этого пользователя.  
+
* Запрос находит такой внутренний номер, в котором может быть только один пользователь и несколько внешних номеров и линий.  
 +
* Если в номере '''больше 1 пользователя''' или есть какие-либо '''внутренние номера''', то считается что это '''номер групповой'''.
 +
* Если у сотрудника все номера групповые возвращается тот, у которого меньше объектов.  
  
SELECT TOP 1 @prefix=np.Prefix FROM A_NumberPlan np  
+
'''Описание:''' Например, у менеджера Иванова был номер 800, в котором был обозначен только этот пользователь. После добавления нескольких мобильных, Иванов хотел бы, чтобы по-прежнему его номер определялся как номер 800. Но теперь его номер стал групповым. Если существует, например групповой номер операторской группы 100, то теперь будет номер Иванова будет определяться как наименьший из групповых, т.е. номер 100. Запрос решает эту проблему и находит номер Иванова 800. В расчет специально не берутся внутренние номера, потому что в них могут быть вложены пользователи, а задача распаковки номера слишком ресурсозатратна. Исходя из этого, определяются только те номера, в которых нет других пользователей помимо данного и нет внутренних номеров.
INNER JOIN A_NumberPlanAction npa ON np.ID=npa.NumID AND npa.ExtraId IN
+
 
(SELECT RuleID FROM A_RuleRecords
+
'''Пример внутреннего номера:'''
  WHERE reactid=@userid AND InnerAddressType=0  
+
 
  AND RuleID IN
+
[[Файл:Внутренний номер по IDuser 001.png|center]]
(SELECT RuleID FROM A_RuleRecords
+
 
GROUP BY RuleID HAVING COUNT(*)=1))  
+
<pre>
ORDER BY np.Prefix
+
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>
  
 
где
 
где
  
*'''@prefix''' - переменная prefix, содержит внутренний номер пользователя
+
*'''@prefix''' (вых) - содержит внутренний номер пользователя
*'''@userid''' - переменная iduser
+
*'''@userid''' (вх)  - ID пользователя
 +
 
 +
 
 +
<span style="color:red">ВНИМАНИЕ: Начиная с версии 2.10 внутренний номер пользователя может быть найден с помощью компонента "Статус объекта"

Текущая версия на 11:58, 22 декабря 2014

Наверх

SQL-запрос находит по таблице внутренний номер пользователя по его идентификатору.

  • Запрос находит такой внутренний номер, в котором может быть только один пользователь и несколько внешних номеров и линий.
  • Если в номере больше 1 пользователя или есть какие-либо внутренние номера, то считается что это номер групповой.
  • Если у сотрудника все номера групповые возвращается тот, у которого меньше объектов.

Описание: Например, у менеджера Иванова был номер 800, в котором был обозначен только этот пользователь. После добавления нескольких мобильных, Иванов хотел бы, чтобы по-прежнему его номер определялся как номер 800. Но теперь его номер стал групповым. Если существует, например групповой номер операторской группы 100, то теперь будет номер Иванова будет определяться как наименьший из групповых, т.е. номер 100. Запрос решает эту проблему и находит номер Иванова 800. В расчет специально не берутся внутренние номера, потому что в них могут быть вложены пользователи, а задача распаковки номера слишком ресурсозатратна. Исходя из этого, определяются только те номера, в которых нет других пользователей помимо данного и нет внутренних номеров.

Пример внутреннего номера:

Внутренний номер по IDuser 001.png
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 внутренний номер пользователя может быть найден с помощью компонента "Статус объекта"