Прочитать записи раздела

Сложный

Реализация чтения записи раздела [Контакты] через стороннее приложение 

Пример. Создать консольное приложение, которое, используя класс SelectQuery, прочитает записи раздела Контакты (Contacts). Отобразить колонки:

  • Id.
  • ФИО (Name).
  • Количество активностей (ActivitiesCount) — агрегирующая колонка, отображающая количество активностей данного контакта.

1. Создать и настроить проект консольного приложения C# 

  1. Используя среду разработки Microsoft Visual Studio (версии не ниже 2017), создайте проект консольного приложения Visual C#.

    Работа в Microsoft Visual Studio подробно описана в статье Разработать C# код в пользовательском проекте.

  2. Укажите в качестве названия проекта, например, DataServiceSelectExample.
  3. Свойству проекта Target framework установите значение ".NET Framework 4.7".
  4. В секцию References проекта добавьте зависимости от библиотек:
    • System.Web.Extensions.dll — библиотека классов, входящая в .NET Framework.
    • Terrasoft.Core.dll — библиотека основных классов серверного ядра приложения. Находится по пути ...\Terrasoft.WebApp\bin\Terrasoft.Core.dll.
    • Terrasoft.Nui.ServiceModel.dll — библиотека классов служб приложения. Находится по пути ...\Terrasoft.WebApp\bin\Terrasoft.Nui.ServiceModel.dll.
    • Terrasoft.Common.dll — библиотека основных классов серверного ядра приложения. Находится по пути ...\Terrasoft.WebApp\bin\Terrasoft.Common.dll.
  5. В файл исходного кода приложения добавьте директивы using.
    Добавление директив using
    using System;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Collections.Generic;
    using Terrasoft.Nui.ServiceModel.DataContract;
    using Terrasoft.Core.Entities;
    using System.Web.Script.Serialization;
    using Terrasoft.Common;
    

2. Добавить объявление полей и констант 

Добавление полей и констант в исходный код приложения необходимо выполнить для доступа к возможностям сервиса работы с данными DataService.

Добавление объявления полей и констант
/* Основной URL приложения Creatio. Необходимо заменить на пользовательский. */
private const string baseUri = @"http://example.creatio.com";
/* Строка запроса к методу Login сервиса AuthService.svc. */
private const string authServiceUri = baseUri + @"/ServiceModel/AuthService.svc/Login";
/* Строка пути запроса SelectQuery. */
private const string selectQueryUri = baseUri + @"/0/DataService/json/SyncReply/SelectQuery";
/* Cookie аутентификации Creatio. */
private static CookieContainer AuthCookie = new CookieContainer();

Здесь объявлены три строковых константных поля, с помощью которых формируются пути выполнения запросов на аутентификацию и запросов на чтение данных. Данные об аутентификации будут сохранены в поле AuthCookie.

3. Добавить метод, выполняющий аутентификацию 

Для доступа создаваемого приложения к сервису работы с данными DataService необходимо выполнить аутентификацию.

4. Реализовать запрос на добавление записи 

Поскольку объявленная ранее константа selectQueryUri содержит путь для отправки данных в формате JSON, то отправляемые данные необходимо предварительно сконфигурировать в виде строки, содержащей описание JSON-объекта, соответствующего контракту данных SelectQuery. Это можно сделать непосредственно в строчной переменной, однако намного удобнее и безопаснее с точки зрения возможности возникновения ошибок создать экземпляр класса SelectQuery, заполнить его свойства, а затем сериализовать его в строку.

Реализация запроса на добавление записи
/* Экземпляр класса запроса. */
var selectQuery = new SelectQuery()
{
    /* Название корневой схемы. */
    RootSchemaName = "Contact",
    /* Коллекция колонок запроса. */
    Columns = new SelectQueryColumns()
};
/* Выражение, задающее тип колонки [ФИО]. */
var columnExpressionName = new ColumnExpression()
{
    /* Тип выражения — колонка схемы. */
    ExpressionType = EntitySchemaQueryExpressionType.SchemaColumn,
    /* Путь к колонке. */
    ColumnPath = "Name"
};
/* Конфигурирование колонки [Name]. */
var selectQueryColumnName = new SelectQueryColumn()
{
    /* Заголовок. */
    Caption = "ФИО",
    /* Направление сортировки — по возрастанию. */
    OrderDirection = OrderDirection.Ascending,
    /* Позиция порядка сортировки. */
    OrderPosition = 0,
    /* Выражение, задающее тип колонки. */
    Expression = columnExpressionName
};
/* Выражение, задающее тип колонки [Количество активностей]. */
var columnExpressionActivitiesCount = new ColumnExpression()
{
    /* Тип выражения — вложенный запрос. */
    ExpressionType = EntitySchemaQueryExpressionType.SubQuery,
    /* Путь к колонке относительно корневой схемы. */
    ColumnPath = "[Activity:Contact].Id",
    /* Тип функции — агрегирующая. */
    FunctionType = FunctionType.Aggregation,
    /* Тип агрегации — количество. */
    AggregationType = AggregationType.Count
};
/* Конфигурирование колонки [Количество активностей]. */
var selectQueryColumnActivitiesCount = new SelectQueryColumn()
{
    /* Заголовок. */
    Caption = "Количество активностей",
    /* Направление сортировки — по возрастанию. */
    OrderDirection = OrderDirection.Ascending,
    /* Позиция порядка сортировки. */
    OrderPosition = 1,
    /* Выражение, задающее тип колонки. */
    Expression = columnExpressionActivitiesCount
};

/* Добавление колонок в запрос. */
selectQuery.Columns.Items = new Dictionary<string, SelectQueryColumn>()
{
    {
        "Name",
        selectQueryColumnName
    },
    {
        "ActivitiesCount",
        selectQueryColumnActivitiesCount
    }
};
/* Сериализация экземпляра класса запроса на добавление в JSON-строку. */
var json = new JavaScriptSerializer().Serialize(selectQuery);

5. Выполнить POST-запрос к DataService 

  1. Создайте экземпляр класса HttpWebRequest.
  2. Заполните свойства экземпляра.
  3. Присоедините к запросу созданную ранее строку с JSON-объектом.
  4. Выполните и обработайте результат запроса к сервису работы с данными DataService.
    Реализация POST-запроса
    /* Преобразование строки JSON-объекта в массив байтов. */
    byte[] jsonArray = Encoding.UTF8.GetBytes(json);
    /* Создание экземпляра HTTP-запроса. */
    var selectRequest = HttpWebRequest.Create(selectQueryUri) as HttpWebRequest;
    /* Определение метода запроса. */
    selectRequest.Method = "POST";
    /* Определение типа содержимого запроса. */
    selectRequest.ContentType = "application/json";
    /* Добавление полученных ранее аутентификационных cookie в запрос на получение данных. */
    selectRequest.CookieContainer = AuthCookie;
    /* Установить длину содержимого запроса. */
    selectRequest.ContentLength = jsonArray.Length;
    /* Добавление CSRF токена в заголовок запроса. */
    CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(authServiceUri));
    string csrfToken = cookieCollection["BPMCSRF"].Value;
    selectRequest.Headers.Add("BPMCSRF", csrfToken);
    
    /* Помещение JSON-объекта в содержимое запроса. */
    using (var requestStream = selectRequest.GetRequestStream())
    {
        requestStream.Write(jsonArray, 0, jsonArray.Length);
    }
    /* Выполнение HTTP-запроса и получение ответа от сервера. */
    using (var response = (HttpWebResponse)selectRequest.GetResponse())
    {
        /* Вывод ответа в консоль. */
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            Console.WriteLine(reader.ReadToEnd());
        }
    }
    

Реализация чтения записи раздела [Контакты] через Creatio IDE 

Пример. Добавить кнопку в раздел Контакты (Contacts). При нажатии на кнопку вызывать метод, который, используя класс SelectQuery, прочитает записи раздела Контакты (Contacts). Отобразить колонки:

  • Id.
  • ФИО (Name).
  • Количество активностей (ActivitiesCount) — агрегирующая колонка, отображающая количество активностей данного контакта.

1. Добавить кнопку в раздел Контакты 

  1. Cоздайте пакет и установите его в качестве текущего.
  2. Создайте схему замещающей модели представления раздела Контакты (Contacts).
  3. На панели дизайнера нажмите кнопку и создайте локализуемую строку.

    Для созданной строки установите:

    • Код (Code) — "SelectQueryContactButtonCaption".
    • Значение (Value) — "Выбор контактов" ("Select contacts").
  4. В массив diff добавьте конфигурационный объект с настройками расположения кнопки на странице.
    diff
    /* Настройка визуализации кнопки в разделе. */
    diff: /**SCHEMA_DIFF*/[
        /* Метаданные для добавления в раздел пользовательской кнопки. */
        {
            /* Указывает на то, что выполняется операция добавления элемента на страницу. */
            "operation": "insert",
            /* Мета-имя родительского элемента управления, в который добавляется кнопка. */
            "parentName": "ActionButtonsContainer",
            /* Указывает на то, что кнопка добавляется в коллекцию элементов управления родительского элемента, мета-имя которого указано в parentName. */
            "propertyName": "items",
            /* Мета-имя добавляемой кнопки. */
            "name": "SelectQueryContactButton",
            /* Дополнительные свойства элемента. */
            "values": {
                /* Тип добавляемого элемента — кнопка. */
                itemType: Terrasoft.ViewItemType.BUTTON,
                /* Привязка заголовка кнопки к локализуемой строке схемы. */
                caption: { bindTo: "Resources.Strings.SelectQueryContactButtonCaption" },
                /* Привязка метода-обработчика нажатия кнопки. */
                click: { bindTo: "onSelectQueryContactClick" },
                "layout": {
                    "column": 1,
                    "row": 6,
                    "colSpan": 1
                }
            }
        }
    
    ]/**SCHEMA_DIFF*/
    

2. Добавить метод-обработчик события нажатия кнопки 

Чтобы при нажатии на созданную в разделе Контакты (Contacts) кнопку читались записи с заданными параметрами, в секцию methods замещающей схемы модели представления добавьте метод-обработчик события нажатия кнопки onSelectQueryContactClick.

methods
methods: {
    /* Метод-обработчик нажатия кнопки. */
    onSelectQueryContactClick: function() {
        /* Создание экземпляра класса Terrasoft.InsertQuery. */
        var select = Ext.create("Terrasoft.EntitySchemaQuery", {
            /* Название корневой схемы. */
            rootSchemaName: "Contact"
        });
        /* Добавление в запрос колонки [ФИО]. */
        select.addColumn("Name");
        /* Добавление в запрос агрегирующей колонки [Количество активностей]. */
        select.addAggregationSchemaColumn(
            /* Путь к колонке относительно корневой схемы. */
            "[Activity:Contact].Id",
            /* Тип агрегации — количество. */
            Terrasoft.AggregationType.COUNT,
            /* Заголовок колонки. */
            "ActivitiesCount",
            /* Область применения агрегирующей функции — для всех элементов. */
            Terrasoft.AggregationEvalType.ALL);
        /* Запрос к серверу на обновление данных.
        Получение всей коллекции записей и ее отображение в консоли браузера. */
        select.getEntityCollection(function(result) {
            if (!result.success) {
                /* Обработка/логирование ошибки. */
                this.showInformationDialog("Ошибка запроса данных");
                return;
            }
            /* Выводимое сообщение. */
            var message = "";
            /* Перебор результирующей коллекции и построение выводимого сообщения. */
            result.collection.each(function(item) {
                message += "ФИО: " + item.get("Name") +
                ". Количество активностей: " + item.get("ActivitiesCount") + "\n";
            });
            /* Вывод сообщения в консоль. */
            window.console.log(message);
        }, this);
    }
}

В front-end части ядра приложения отсутствует класс, аналогичный классу SelectQuery для back-end части. Для выбора данных раздела необходимо использовать класс Terrasoft.EntitySchemaQuery. Подробнее о свойствах и методах этого класса можно узнать в Библиотеке JS классов.

Результат выполнения примера 

После сохранения схемы и обновления страницы приложения с очисткой кэша в разделе Контакты (Contacts) появится кнопка Выбор контактов (Select contacts). В консоли браузера кнопка отобразит записи с заданными параметрами.