Обработка таблицы после запроса Select и представление строки в виде набора параметров
Добрый день!
Решаем следующую задачу:
Имеется таблица контактов с полями (6 штук). Необходимо по каждому контакту запустить БП со всеми значениями. Пока посмотрели в пример на академии и ничего не выходит. Идея простая - идти по строчкам таблицы и запускать БП со значениями полей. Но как это реализовать абсолютно непонятно. Как "превратить" классический select в что-то понятное?
Нравится
Быстров Сергей,
Не все так строго. Можно создать пустой объект без наследований, добавить UsrId (указать его в качестве Индентификатора в св-вах объекта, во вью генерить через newId), накидать других полей через Usr как и во вью. Ну и проставить галку "Представление в БД".
В таком случае мало мусорных полей и из C# работать с объектом можно. Но. Такие объекты нельзя использовать в аналитике. Т.к. там в каком-то генераторе зашито(!!!), что у объектов первичный ключ всегда называется "Id". Такие пироги.
"Как "превратить" классический select в что-то понятное?" - Что, простите?))
Попробуйте так в скрипттаске:
var connection = Get<UserConnection>("UserConnection"); var esq = new EntitySchemaQuery(connection.EntitySchemaManager, "Contact"); esq.AddAllSchemaColumns(); //esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Name", somename)); EntityCollection entities = esq.GetEntityCollection(connection); foreach (Entity contact in entities) { connection.ProcessEngine.ProcessExecutor.Execute("MyCoolProcess", new Dictionary<string, string> { { "ContactId", contact.PrimaryColumnValue.ToString() }, { ".....", .... } }); }
Варфоломеев Данила,
Забыл сказать, объекта у меня нет - обращаюсь к view таблице. Поэтому и использовал селект - он работах хорошо.
Быстров Сергей,
Сделайте объект под view. Все лучше, чем dbexecutor-ами ковыряться)
Так создайте объект и привяжите к view (в свойствах есть галочка).
А если хотите именно Select, там тоже можно цикл и читать несколько колонок:
string schemaName = string.Empty; Guid objectId = Guid.Empty; Guid groupId = Guid.Empty; var selectObjectSchemaName = new Select(userConnection) .Column("VwSysSchemaInfo", "Name") .Column("MonitoringIndicators", "Object") .Column("MonitoringIndicators", "MonitoringGroup") .From("MonitoringIndicators") .LeftOuterJoin("VwSysSchemaInfo").On("VwSysSchemaInfo","SysSchemaId").IsEqual("MonitoringIndicators", "Object") .Where("VwSysSchemaInfo", "SysSolutionId").IsEqual(Column.Parameter(userConnection.Solution.Id)) .And("MonitoringIndicators","Id").IsEqual(Column.Parameter(Id)) as Select; using (var dbExecutor = userConnection.EnsureDBConnection()) { using (IDataReader dr = selectObjectSchemaName.ExecuteReader(dbExecutor)) { while (dr.Read()) { schemaName = dr[0] == DBNull.Value ? string.Empty : dr.GetString(0); objectId = dr[1] == DBNull.Value ? Guid.Empty : UserConnection.DBTypeConverter.DBValueToGuid(dr[1]); groupId = dr[2] == DBNull.Value ? Guid.Empty : UserConnection.DBTypeConverter.DBValueToGuid(dr[2]); } }
Вариант с объектом мне нравится, но есть два нюанса:
- таблица view и поля должны быть названы с префиксом Usr (а то ругается)?
- делается наследование от базового объекта, добавляются все колонки из таблицы и ставится галочка "представление в базе". Все так?
Да. Смотрите, как сделаны существующие схемы в конфигурации, начинающиеся на «Vw».
Быстров Сергей,
Не все так строго. Можно создать пустой объект без наследований, добавить UsrId (указать его в качестве Индентификатора в св-вах объекта, во вью генерить через newId), накидать других полей через Usr как и во вью. Ну и проставить галку "Представление в БД".
В таком случае мало мусорных полей и из C# работать с объектом можно. Но. Такие объекты нельзя использовать в аналитике. Т.к. там в каком-то генераторе зашито(!!!), что у объектов первичный ключ всегда называется "Id". Такие пироги.
Варфоломеев Данила,
А у меня почему-то не получается выбрать свой UsrID. Просто ничего не отображается. Поэтому и подумал что только наследование можно использовать.
Быстров Сергей,
Можно пример кода, как вы пытаетесь UsrId получить?
Варфоломеев Данила,
С этим разобрался. Немного коряво создал объект. Пересоздал его и все заработало. Теперь осталось запустить процессы по каждой строке. И тут ошибки уже пошли в самих процессах, где я думаю уже разберусь что к чему. Так что - большое спасибо за помощь :3