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

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

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

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