SQL запросы (версия 3.xx)/amoCRM: различия между версиями

Материал из Call Office Wiki
Перейти к навигации Перейти к поиску
 
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:
Для работы с данными amoCRM можно использовать стандартные SQL запросы, которые буду преобразованы в формат [https://developers.amocrm.ru/rest_api/#fields REST API amoCRM].
Для работы с данными amoCRM можно использовать стандартные SQL запросы, которые буду преобразованы в формат [https://www.amocrm.ru/developers/content/crm_platform/platform-abilities API amoCRM].
Поддерживаются SQL - операторы:
Поддерживаются SQL - операторы:
* '''select''' - выборка данных. В списке полей можно указать только * - все поля.
* '''select''' - выборка данных. В списке полей можно указать только * - все поля.
** '''where''' - позволяет указать условие выборки. Поддерживается только условие отбора id =.
** '''where''' - позволяет указать условие выборки. Поддерживается только условие отбора id =.
** '''order''' - позволяет указать порядок сортировки. Может быть использовано только для данных, где API amoCRM позволяет использовать сортировку данных.
** '''limit''' - позволяет указать начальное значение выборки и количество строк. Например: limit 50 или limit 10, 50
** '''limit''' - позволяет указать начальное значение выборки и количество строк. Например: limit 50 или limit 10, 50
* '''insert''' - вставка данных, позволяет указать список полей и константы значений, выражения не поддерживаются. Обязательное поле: name.
* '''insert''' - вставка данных, позволяет указать список полей и константы значений, выражения не поддерживаются.  
* '''update''' - изменение данных, позволяет указать список изменяемых полей и единственное условие отбора: where id =.
* '''update''' - изменение данных, позволяет указать список изменяемых полей и единственное условие отбора: where id =.


Помимо стандартного синтаксиса SQL, в запросах к источнику данных amoCRM можно использовать вставки родного синтаксиса REST API amoCRM. Для этого используется конструкция /! !/.
Помимо стандартного синтаксиса SQL, в запросах к источнику данных amoCRM можно использовать вставки родного синтаксиса API amoCRM. Для этого используется конструкция /! !/.


Если по каким то причинам стандартный синтаксис SQL не подходит, можно использовать вызовы методов REST API amoCRM напрямую, без преобразования. Для этого следует вместо SQL запроса указать конструкцию:
Если по каким то причинам стандартный синтаксис SQL не подходит, можно использовать вызовы методов API amoCRM напрямую, без преобразования. Для этого следует вместо SQL запроса указать конструкцию:


<syntaxhighlight lang=javascript>
  /! {Method: <название метода API>,  
  /! {Method: <название метода API>,  
       Type: <тип запроса>,  
       Type: <тип запроса>,  
     Params: <передаваемые параметры>,
     Params: <передаваемые параметры>} !/
    Result: <получаемые результаты из указанной таблицы>} !/
</syntaxhighlight>


Например:
Например:


  /! {Method: 'contacts/list', Type: 'GET', Params: {type: 'all'}, Result: 'contacts'} !/
<syntaxhighlight lang=javascript>
  /! {Method: 'contacts', Type: 'GET', Params: {width: 'customers'}} !/
</syntaxhighlight>


 
Подробное описание формата вызова родных методов API amoCRM можно посмотреть [https://www.amocrm.ru/developers/content/crm_platform/platform-abilities здесь].
Подробное описание формата вызова родных методов REST API amoCRM можно посмотреть [https://developers.amocrm.ru/rest_api/#fields здесь].


Помимо этого можно использовать функцию, которая вернет нужный объект, например такого вида:
Помимо этого можно использовать функцию, которая вернет нужный объект, например такого вида:


/!
<syntaxhighlight lang=javascript>
function () {
/!
    return {Method: 'contacts/list',  
function () {
              Type: 'GET',  
  return {Method: 'contacts',  
            Params: {type: 'all'},
            Type: 'GET',  
            Result: 'contacts'};
          Params: {width: 'customers'}} ;
}
}
!/
!/
</syntaxhighlight>


Или функцию, которая выполнит необходимые действия и вернет результат, например так:
Или функцию, которая выполнит необходимые действия и вернет результат, например так:
<syntaxhighlight lang=javascript>
/!
function () {
  return this.Query ('select * from contacts');
}
!/
</syntaxhighlight>


/!
Более сложный вариант функции с вызовом метода REST API amoCRM и формированием результата:
function () {
    return this.Query ('select * from contacts');
}
!/


Более сложный вариант функции с вызовом метода REST API amoCRM и формированием результата:
<syntaxhighlight lang=javascript>
/!
/!
function () {
function () {
    var Res = this.CallMethod ('contacts/list', {type: 'all'}, 'GET');
  var Res = this.Select ('contacts');
    return this.MakeResult (this.Select ('contacts/list', {type: 'all'}, Res['contacts'], 'contacts'));
  return this.MakeResult (Res, 'contacts');
}
}  
!/
!/
</syntaxhighlight>


Если функция не возвращает записи, например в результате изменения или удаления данных, она должна вернуть значение null:
Если функция не возвращает записи, например в результате изменения или удаления данных, она должна вернуть значение null:


/!
<syntaxhighlight lang=javascript>
function () {
/!
    var Res = this.CallMethod ('contacts/set', {...}, 'POST');
function () {
    return null;
  var Res = this.CallMethod ('contacts', 'POST', {...});
}
  return null;
!/
}
!/
</syntaxhighlight>


Если необходимо выбрать контакты с определенным статусом сделки, то в следующем запросе необходимо указать id статуса, который можно узнать, выбрав данные из таблицы "Сделки":
Если необходимо выбрать контакты с определенным статусом сделки, то в следующем запросе необходимо указать id статуса, который можно узнать, выбрав данные из таблицы "Сделки":


/!
<syntaxhighlight lang=javascript>
function () {
/!
    var Res = this.Query ('select * from contacts');
function () {
    var AddRes = this.Query ('select * from leads where status_id = 15097975');
  var Res = this.Query ('select * from contacts');
    return Res.Join (AddRes, 'id', 'main_contact_id');
  var AddRes = this.Query ('select * from leads where status_id = 15097975');
}  
  return Res.Join (AddRes, 'id', 'main_contact_id');
!/
}  
!/
</syntaxhighlight>
 
Логгирование звонков можно выполнить так ([https://www.amocrm.ru/developers/content/telephony/calls_add документация]):
 
<syntaxhighlight lang=javascript>
/!
function () {
  var Param = {add: [{uniq: "394427aaf821879e29efbc4eb98er22171514",
              phone_number: "88007750105",
                    source: "amo_custom_widget",
                created_at: 1414654739,
                created_by: "999999",
                  duration: 98,
              call_status: 2,
              call_result: "Перезвонить позже",
                direction: "inbound",
                      link: "http:// ссылка на запись .mp3",
      responsible_user_id: "956757"}]};
 
  var Result = this.CallMethod ('/api/v2/calls', 'POST', JSON.stringify (Param));
 
  if (Result['_embedded'] !== undefined) {
      if (Result['_embedded']['errors']) {
        throw {description: Result['_embedded']['errors'][0].msg};
      }
  }
                   
  return null;
}
!/
</syntaxhighlight>
 
Уведомление о звонке ([https://www.amocrm.ru/developers/content/telephony/call_event документация]):
 
<syntaxhighlight lang=javascript>
/!
function () {
  var Param = {add: [{type: "phone_call",
              phone_number: "88007750105"}]};
 
  var Result = this.CallMethod ('/api/v2/events', 'POST', JSON.stringify (Param));
 
  return null;
}
!/
</syntaxhighlight>
 
Получить список входящих звонков (и не только звонков но и других сущностей [https://www.amocrm.ru/developers/content/crm_platform/events-and-notes#notes-list документация]) в компаниях можно так:
 
<syntaxhighlight lang=javascript>
/!
function () {
 
  function IsFieldExist (Fields, Name)
  {
      for (var i in Fields) {
        if (Fields[i].Name == Name) return true;
      }
      return false;
  }
 
  var Record = this.Query ('select * from companies/notes');
  var Fields = [];
  var Data = []
 
  while (Record.Fetch ()) {
                   
      if (Record.GetFieldValue ('note_type') == 'call_in') {  // Выбираем только входящие звонки
                   
        var Values = Record.GetFieldValue ('params');
        var Row = [];
 
        for (var i in Values) {
            if (!IsFieldExist (Fields, i)) Fields.push ({Name: i})
            Row.push (Values[i]);
        }
        Data.push (Row);
      }
                   
      Record.Next ();
  }
 
  return new CRecordsetArray (Record.GetDatabase (), Fields, Data);
}
!/
</syntaxhighlight>


Помимо этого SQL-запросы к этому источнику данных могут содержать комментарии в виде /* */ и содержать несколько запросов разделенных символами // на новой строке.
Помимо этого SQL-запросы к этому источнику данных могут содержать комментарии в виде /* */ и содержать несколько запросов разделенных символами // на новой строке.


----
----


Назад к [[SQL_запросы_(версия_3.xx)|SQL-запросам]].
Назад к [[SQL_запросы_(версия_3.xx)|SQL-запросам]].

Текущая версия на 10:28, 8 октября 2020

Для работы с данными amoCRM можно использовать стандартные SQL запросы, которые буду преобразованы в формат API amoCRM. Поддерживаются SQL - операторы:

  • select - выборка данных. В списке полей можно указать только * - все поля.
    • where - позволяет указать условие выборки. Поддерживается только условие отбора id =.
    • order - позволяет указать порядок сортировки. Может быть использовано только для данных, где API amoCRM позволяет использовать сортировку данных.
    • limit - позволяет указать начальное значение выборки и количество строк. Например: limit 50 или limit 10, 50
  • insert - вставка данных, позволяет указать список полей и константы значений, выражения не поддерживаются.
  • update - изменение данных, позволяет указать список изменяемых полей и единственное условие отбора: where id =.

Помимо стандартного синтаксиса SQL, в запросах к источнику данных amoCRM можно использовать вставки родного синтаксиса API amoCRM. Для этого используется конструкция /! !/.

Если по каким то причинам стандартный синтаксис SQL не подходит, можно использовать вызовы методов API amoCRM напрямую, без преобразования. Для этого следует вместо SQL запроса указать конструкцию:

 /! {Method: <название метода API>, 
       Type: <тип запроса>, 
     Params: <передаваемые параметры>} !/

Например:

 /! {Method: 'contacts', Type: 'GET', Params: {width: 'customers'}} !/

Подробное описание формата вызова родных методов API amoCRM можно посмотреть здесь.

Помимо этого можно использовать функцию, которая вернет нужный объект, например такого вида:

/!
function () {
   return {Method: 'contacts', 
             Type: 'GET', 
           Params: {width: 'customers'}} ;
}
!/

Или функцию, которая выполнит необходимые действия и вернет результат, например так:

/!
function () {
   return this.Query ('select * from contacts');
} 
!/

Более сложный вариант функции с вызовом метода REST API amoCRM и формированием результата:

/!
function () {
   var Res = this.Select ('contacts');
   return this.MakeResult (Res, 'contacts');
} 
!/

Если функция не возвращает записи, например в результате изменения или удаления данных, она должна вернуть значение null:

/!
function () {
   var Res = this.CallMethod ('contacts', 'POST', {...});
   return null;
}
!/

Если необходимо выбрать контакты с определенным статусом сделки, то в следующем запросе необходимо указать id статуса, который можно узнать, выбрав данные из таблицы "Сделки":

/!
function () {
   var Res = this.Query ('select * from contacts');
   var AddRes = this.Query ('select * from leads where status_id = 15097975');
   return Res.Join (AddRes, 'id', 'main_contact_id');
} 
!/

Логгирование звонков можно выполнить так (документация):

/!
function () {
  var Param = {add: [{uniq: "394427aaf821879e29efbc4eb98er22171514",
              phone_number: "88007750105",
                    source: "amo_custom_widget",
                created_at: 1414654739,
                created_by: "999999",
                  duration: 98,
               call_status: 2,
               call_result: "Перезвонить позже",
                 direction: "inbound",
                      link: "http:// ссылка на запись .mp3",
       responsible_user_id: "956757"}]};

   var Result = this.CallMethod ('/api/v2/calls', 'POST', JSON.stringify (Param));

   if (Result['_embedded'] !== undefined) {
      if (Result['_embedded']['errors']) {
         throw {description: Result['_embedded']['errors'][0].msg};
      }
   }
                     
   return null;
}
!/

Уведомление о звонке (документация):

/!
function () {
   var Param = {add: [{type: "phone_call",
               phone_number: "88007750105"}]};

   var Result = this.CallMethod ('/api/v2/events', 'POST', JSON.stringify (Param));

   return null;
}
!/

Получить список входящих звонков (и не только звонков но и других сущностей документация) в компаниях можно так:

/!
function () {

   function IsFieldExist (Fields, Name)
   {
      for (var i in Fields) {
         if (Fields[i].Name == Name) return true;
      }
      return false;
   }

   var Record = this.Query ('select * from companies/notes');
   var Fields = [];
   var Data = []

   while (Record.Fetch ()) {
                     
      if (Record.GetFieldValue ('note_type') == 'call_in') {   // Выбираем только входящие звонки
                     
         var Values = Record.GetFieldValue ('params');
         var Row = [];

         for (var i in Values) {
            if (!IsFieldExist (Fields, i)) Fields.push ({Name: i})
            Row.push (Values[i]);
         }
         Data.push (Row);
      }
                     
      Record.Next ();
   }

   return new CRecordsetArray (Record.GetDatabase (), Fields, Data);
}
!/

Помимо этого SQL-запросы к этому источнику данных могут содержать комментарии в виде /* */ и содержать несколько запросов разделенных символами // на новой строке.


Назад к SQL-запросам.