...

Какой тип имеет переменная блок?

Тема в разделе "Разработчикам", создана пользователем Sergiy, 30 мар 2020.

  1. Sergiy

    Sergiy New Member

    Доброго дня!
    У меня есть процесс, в котором есть контекстная переменная блок (context.Perechenj), и она записывается в справочник, в которой есть переменная блок с аналогичными полями.
    Мне нужно одним скриптом создать справочник, а вторым скриптом обновить все поля переменной блок в справочнике на поля из контекста.
    Я не понимаю как мне правильно обратиться к каждому элементу переменной блок в справочнике и соответствующему элементу переменной блок контекста.


    При создании справочника заполняю поля переменной блок так:

    foreach (var a in context.Perechenj)
    {
    // Создаю новый объект, который является элементом перечня
    var b = new EleWise.ELMA.ConfigurationModel.Remonty_Perechenj();
    // Применяю каждое поле
    b.Field1 = a.Field1;
    b.Field2 = a.Field2;
    // Добавляю этот элемент как новый элемент переменной блок
    sprav.Perechenj.Add (b);
    }


    Далее мне нужно другим скриптом получить справочник (получаю справочник по LoadOrNull(Id)) и обновить все элементы его переменной типа блок.
    Как правильно к ним обратиться?

    Я пытаюсь обратиться так:

    var v = context.Perechenj[1];

    В результате получаю ошибку при компиляции:
    Cannot create an instance of the abstract class or interface 'System.Collections.Generic.ISet<EleWise.ELMA.ConfigurationModel.Remonty_Perechenj>'

    Через foreach можно перебирать только элементы одного списка. Видимо нужно через индекс (циклом for, например).


    И как узнать какой тип имеет переменная блок (что это за коллекция такая?), чтобы я мог создать аналогичный объект, заполнить отдельно потом присвоить его вместо переменной блок справочника?
    При создании объекта типа:
    System.Collections.Generic.ISet<EleWise.ELMA.ConfigurationModel.Remonty_Perechenj>
    Тоже матюкается что класс абстрактный, и вообще иди отсюда...
     
  2. Sergiy

    Sergiy New Member

    Что-то слишком много букв. Сделаю проще:

    Как можно обратиться к элементам переменной блок используя индекс (то есть через цикл for, например)?
     
  3. Я понял вопрос так:
    Как получить все строки из блока.
    Верно? Если да, то код ниже.

    var strAll = "";
    foreach (var item in context.BlockName)
    {
    strAll += item.Field1.Value + "; ";
    strAll += item.Field2.Value;
    strAll += "\n";
    }

    В результате выведется столько строк, сколько есть строк в блоке.
    Каждая строка будет содержать значения Полей через точку с запятой.
     
  4. Sergiy

    Sergiy New Member

    Нет.

    Вопрос 1: создать переменную такого же типа что и контекстная переменная-блок (я не понимаю что это за коллекция и как ей пользоваться, говорит что это 'ISet', но также говорит что это абстрактный класс, а значит создать экземпляр нельзя).
    Вот, из логов компилятора сделал вывод что контекстная переменная блок имеет следующий тип:
    System.Collections.Generic.ISet<EleWise.ELMA.ConfigurationModel.Remonty_Perechenj>

    Вопрос 2: взять две переменные типа блок и всем значениям элементов переменной блок 1 присвоить значения элементов переменной блок 2.
     
  5. Вопрос1.
    var itemAtBlock = new Model.Entities.ProcessContext.ИмяКлассаБлока();
    ИмяКлассаБлока - это можно найти, если пойти в контекст, открыть Настройки блока, раскрыть "Расширенные настройки" и там значение поля "Имя класса".

    Вопрос 2.
    ИЛИ я не понял вопрос ИЛИ это надо сделать foreach'ем по блоку-источнику, как я написал выше.
    Дополнительно, внутри foreach'а надо сделать
    foreach (var itemAtBlockSrc in context.BlockSrc)
    {
    var itemAtBlockDst = new Model.Entities.ProcessContext.BlockDstClassName();
    itemAtBlockDst.Field1 = itemAtBlockSrc.Field1;
    ...

    context.BlockDst.Add(itemAtBlockDst);
    }


    Всё.
     
    1 это нравится
  6. Sergiy

    Sergiy New Member

    Вопрос 1: агааа, вроде выглядит правдоподобно, проверю, спасибо!

    Вопрос 2: мне нужно присвоить новые значения уже существующим элементам context.BlockDst, а не создать новые элементы
     
  7. Вопрос 2.
    Ну, это уже алгоритмическая задача - как из одной таблицы перенести в другую.
    Тут уже не ELMA-специфик.

    Можно вместо
    var itemAtBlockDst = new Model.Entities.ProcessContext.BlockDstClassName();
    написать
    Model.Entities.ProcessContext.BlockDstClassNam itemAtBlockDst = GetRowItemATBlockDst(SomeFieldValueFromItemAtBlockSrc);

    где функция GetRowItemATBlockDst ищет по какому-то значению, соответствие между записью в Src-блоке и строчкой в Dst-блоке.
     
    1 это нравится
  8. Sergiy

    Sergiy New Member

    Подвох в том что я изначально не знаю какие там могут быть значения (то есть искать не по чем), но знаю точно что их кол-во и порядок совпадают, нужно просто сопоставить первый с первым, второй со вторым и т.д.

    Изначально основной вопрос с которым я создал эту тему был по типу переменной блок. Именно что это за класс и что за тип коллекции, чтобы я понимал какие у меня есть методы для работы с его экземплярами.
    Например - можно ли перебирать его элементы итератором.
     
  9. Попробуйте
    var arrayFromBlock = context.BlockDst.ToArray();

    Никогда не было нужно, соответственно не проверял, что работает, но не вижу причин, почему это не должно работать.
    Думаю, что это именно то, что Вам надо - работа с блоком, как с массивом.
     
    1 это нравится
  10. Проверил своё предположение - работает, как и ожидалось.
    var blockAsArray = context.BlockDst.ToArray();
    for (int i = 0; i < blockAsArray.Count(); i++)
    {
    Console.WriteLine("blockAsArray[" + i + "].Field1: " + blockAsArray.Field1);
    }

    Думаю, это именно то, что Вы и искали!
     

Поделиться: