Таблицы в карточках и сценариях диалога, база адресов

Таблицы в карточках и сценариях диалога, база адресов

Таблицы в карточках и сценариях диалога, база адресов

1. Отображение произвольных таблиц

1.1. Отображение окна со списком строк, в качестве источника данных – простой провайдер. Задаем обработчик клика на кнопке в сценарии карточки
void Button1_Execute(object sender, EventArgs e)
{
     Cx.Client.Campaigns.Misc.MiscUtils.ShowSelectDialog("Выберите слово", "WorkProvider_Table_6003650012", null, 0, null);
}

 image001.png

1.2. В качестве источника – отфильтрованный (параметризованный) провайдер, при этом при открытии окна выбрана конкретная строка
void Button1_Execute(object sender, EventArgs e)
{
    var parameters = new System.Collections.Generic.Dictionary<string, object>();
    parameters["IDLanguage"] = 6003650023;
     Cx.Client.Campaigns.Misc.MiscUtils.ShowSelectDialog("Выберите слово", "xWords.ByIDLanguage", parameters, 6003650028, null);
}

 image003.png

1.3. Заданный список столбцов и редакторов
void Button1_Execute(object sender, EventArgs e)
{
    var parameters = new System.Collections.Generic.Dictionary<string, object>();
    parameters["IDLanguage"] = 6003650023;

    var fields = new System.Collections.Generic.Dictionary<string, string>();
    fields["IDLanguage"] = "Cx.Client.Custom.xLanguage";
    fields["Name"] = "";

     Cx.Client.Campaigns.Misc.MiscUtils.ShowSelectDialog("Выберите слово", "xWords.ByIDLanguage", parameters, 6003650028, fields);
}

image005.png

1.4. Работа с результатом (выбранной строкой). Можно использовать все поля, которые есть в провайдере (а не только те, которые видны в таблице)

void Button1_Execute(object sender, EventArgs e)
{
    var parameters = new System.Collections.Generic.Dictionary<string, object>();
    parameters["IDLanguage"] = 6003650023;

    var fields = new System.Collections.Generic.Dictionary<string, string>();
    fields["IDLanguage"] = "Cx.Client.Custom.xLanguage";
    fields["Name"] = "";

    var result = Cx.Client.Campaigns.Misc.MiscUtils.ShowSelectDialog("Выберите слово", "xWords.ByIDLanguage", parameters, 6003650028, fields);

    if (result == null || result.Count == 0)
        System.Windows.Forms.MessageBox.Show("Ничего не выбрано");
    else
        System.Windows.Forms.MessageBox.Show("Выбрано: "+Convert.ToString(result["ID"])+" "+Convert.ToString(result["Name"]));
}

 image007.png

1.5. Располагаем аналогичную таблицу в виде вкладки карточки (при необходимости вкладку можно перенести в настройке внешнего вида карточки). Настройка внешнего вида – Настройка карточек:

[
  {
    "Kind": "Table",
    "Name": "Words",
    "Caption": "Слова",
    "TableParams": {
      "ProviderName": "xWords.ByIDLanguage",
      "Parameters": {
        "IDLanguage": 6003650023
      },
      "CurrentRowID": 6003650028,
      "Editors": {
        "IDLanguage": "Cx.Client.Custom.xLanguage",
        "Name": ""
      }
    }
  }
]

 image008.png

1.6. Изменить источник данных в таблице на лету (например, при изменении значения поля). Дописываем сценарий карточки:

public override void ColumnChanged(DataColumnChangeEventArgs e)
{
    if (e.Column.ColumnName == "IDLanguage")
    {
       var idLanguage = Convert.ToInt64(e.Row[e.Column]);
       var parameters = new System.Collections.Generic.Dictionary<string, object>();
       parameters["IDLanguage"] = idLanguage;

       var ae = _card.GetAdvancedEditor("Words");
       ae.ReloadData("xWords.ByIDLanguage", parameters, 6003650028);
    }
}

   image010.png
image012.png

1.7. Обработать клик на строке таблицы и получить все значения полей строки
public override void OnShow()
{
       var ae = _card.GetAdvancedEditor("Words");
       ae.AssignFocusedRowChangedEvent(WordsFocusedRowChanged);
}

private void WordsFocusedRowChanged(System.Collections.Generic.IDictionary<string, object> data_)
{
    if (data_ == null || data_.Count == 0)
        System.Windows.Forms.MessageBox.Show("Ничего не выбрано");
    else
        System.Windows.Forms.MessageBox.Show("Выбрано: "+Convert.ToString(data_["ID"])+" "+Convert.ToString(data_["Name"]));
}

  image014.pngimage007.png

1.8. То же самое в качестве шага сценария диалога – используем компонент «Таблица»
 
image015.png

image017.png

image019.png

1.9. Приятный бонус для упрощения жизни: в настройке кнопок теперь можно вместо XML использовать JSON. Два примера ниже идентичны:
<?xml version="1.0"?>
<ArrayOfButtonInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:xsd="http://www.w3.org/2001/XMLSchema&quot;&gt;
  <ButtonInfo>
    <Caption>Address</Caption>
    <Action></Action>
  </ButtonInfo>
  <ButtonInfo>
    <Caption>HyperLinksList</Caption>
    <Action>HyperLinksList</Action>
    <Params></Params>
    <ImageIndex>-1</ImageIndex>
  </ButtonInfo>
</ArrayOfButtonInfo> 

[
  {
    "Caption": "Address",
  }, 
  {
    "Caption": "HyperLinksList",
    "Action": "HyperLinksList",
  }, 
]


2. Отображение отчета

2.1. Отчет из сценария карточки в виде отдельного окна
void Button1_Execute(object sender, EventArgs e)
{
    var parameters = new System.Collections.Generic.Dictionary<string, object>();
    parameters["Abonent"] = "6411010";
    parameters["TimeStartTo"] = new DateTime(2020, 01, 01);

    Cx.Client.Campaigns.Misc.MiscUtils.ShowReport("Отчет из карточки", 30100284, parameters);
}

 image021.png

2.2. Отчет в качестве вкладки карточки. Настройка внешнего вида – Настройка карточек:
[
  {
    "Kind": "Report",
    "Name": "Calls",
    "Caption": "Отчет-вкладка",
    "ReportParams": {
      "IDReport": 30100284,
      "Parameters": {
        "Abonent": "6411010",
        "TimeStartTo": "2020-01-01",
      }
    }
  }
]

 image023.png

2.3. Отчет в сценарии диалога. Кроме заданных явно в качестве параметров передаются все поля текущего контрагента.

image025.png

image027.png

3. Отображение вложенной кампании

3.1. Отображение полной кампании из кода сценария карточки

void Button1_Execute(object sender, EventArgs e)
{
    Cx.Client.Campaigns.Misc.MiscUtils.ShowCampaign("Вложенная кампания", 6004935333);
}

 image029.png

3.2. Фильтрация кампании – указываем провайдера и параметры

void Button1_Execute(object sender, EventArgs e)
{
    var parameters = new System.Collections.Generic.Dictionary<string, object>();
    parameters["IDLanguage"] = 6003650023;

    Cx.Client.Campaigns.Misc.MiscUtils.ShowCampaign(
        "Вложенная кампания",     // Заголовок
        6004935333,               // ID кампании  
        "xWords.ByIDLanguage",    // Имя провайдера
        parameters                // Параметры
    );
}

image031.png

3.3. Скрытие лишних кнопок
void Button1_Execute(object sender, EventArgs e)
{
    var parameters = new System.Collections.Generic.Dictionary<string, object>();
    parameters["IDLanguage"] = 6003650023;

    Cx.Client.Campaigns.Misc.MiscUtils.ShowCampaign(
        "Вложенная кампания",     // Заголовок
        6004935333,               // ID кампании  
        "xWords.ByIDLanguage",    // Имя провайдера
        parameters,               // Параметры
        false,                    // Добавить
        false,                    // Изменить (карточка)
        false,                    // Удалить
        false,                    // Копировать
        true                      // Сценарий диалога
    );
}

 image033.png

3.4. Вложенная кампания на вкладке карточки. Настройка внешнего вида – Настройка карточек:
[
  {
    "Kind": "Campaign",
    "Name": "Words",
    "Caption": "Слова",
    "CampaignParams": {
      "IDCampaign": 6004935333,
      "ProviderName": "xWords.ByIDLanguage",
      "Parameters": {
        "IDLanguage": 6003650023
      },
      CanAdd: false,
      CanEdit: false,
      CanDelete: false,
      CanCopy: false,
      CanRunDialogScenario: true
    }
  }
]

 image037.png

3.5. Замена источника данных при изменении значения поля основной карточки
public override void ColumnChanged(DataColumnChangeEventArgs e)
{
    if (e.Column.ColumnName == "IDLanguage")
    {
       var idLanguage = Convert.ToInt64(e.Row[e.Column]);
       var parameters = new System.Collections.Generic.Dictionary<string, object>();
       parameters["IDLanguage"] = idLanguage;

       var ae = _card.GetAdvancedEditor("Words");
       ae.ReloadData("xWords.ByIDLanguage", parameters, 6003650028);
    }
}

 image037.png

image039.png

3.6. Отображение вложенной карточки
На основной карточке создаем пустой элемент и группу вокруг него. После этого в коде сценария карточки можно разместить в этой группе карточку любого контрагента любой кампании. Например, это можно сделать по клику на таблице:
private void WordsFocusedRowChanged(System.Collections.Generic.IDictionary<string, object> data_)
{
    if (data_ != null)
    {
        var id = Convert.ToInt64(data_["ID"]);
        if (id > 0)
            _card.ShowCardToGroup("Вложенная карточка", 6004935333, id);
    }
}

 image041.png

image043.png

image045.png

4. База адресов

Цель – отобразить в карточке кампании взаимосвязанные редакторы регион – район – город  - улица, которые обеспечат удобную работу с адресами России.
1. Скачиваем актуальную БД ФИАС в формате XML (около 4 ГБ, https://fias.nalog.ru/Updates.aspx)
2. Запускаем утилиту FIAS_Parser. Указываем актуальные имена файлов и отключаем импорт домов:
 
image047.png

3. Запускаем полученный sql-скрипт (примерный объем, поэтому используем командную строку: psql.exe -h localhost -p 10000 -f Cx_FIAS.sql postgres cxdbuser). В результате получаем созданную и заполненную БД Cx_FIAS
4. Подключаем базу данных:
 
image049.png

5. Создаем четыре провайдера:
Fias.Regions: sel ect distinct aoguid, offname || ' ' || shortname as name fr om "FIAS_Objects" where parentguid = '' and actstatus=1 order by offname || ' ' || shortname
Fias.Districts: sel ect aoguid, offname || ' ' || shortname as name fr om "FIAS_Objects" where parentguid=:parentguid and actstatus=1 and aolevel=3 order by offname || ' ' || shortname
Fias.Cities: select aoguid, offname || ' ' || shortname as name fr om "FIAS_Objects" wh ere parentguid=:parentguid and actstatus=1 and (aolevel between 4 and 6) order by offname || ' ' || shortname
Fias.Streets: select aoguid, offname || ' ' || shortname as name fr om "FIAS_Objects" wh ere parentguid=:parentguid and actstatus=1 and aolevel = 7 order by offname || ' ' || shortname
6. Для каждого провайдера создаем по таблице и пользовательскому редактору:
 
image050.png

image051.png

7. В таблице кампании должны быть поля следующих типов (наименования могут отличаться, а также может быть несколько групп полей, если на карточке необходимо работать с несколькими адресами одновременно):
 
image052.png

8. Назначение полей – выбираем пользовательские редакторы:
 
image054.png

9. Сценарий карточки на удивление прост:
public override void OnInit()
{
    _card.InitializeFiasEditors("IDRegion", "IDDistrict", "IDCity", "IDStreet", "HouseNum", "FullAddress");
}

10. Если поля названы по другому – указываем здесь их правильные имена. Если адресов несколько – вызываем эту функцию несколько раз.

11. Результат:
 
image056.png

image058.png

image060.png

image062.png
Нашли ошибку?
Выделите текст, нажмите Ctrl + Enter

Сообщение об ошибке

Адрес страницы *
Ошибочный текст *
Комментарий *
Защита от автоматического заполнения

Введите символы с картинки*

Дополнить статью

Адрес *
Ваше ФИО
Ваш Email
Текст дополнения *

Попробовать InfinitySmart бесплатно

Зарегистрируйтесь, чтобы получить доступ
к бесплатной версии на 14 дней

Заказ презентации

После отправки запроса наш менеджер свяжется с вами для демонстрации системы, рассчитает ее стоимость, ответит на вопросы