Добрый день! Подскажите, пожалуйста, в чем может быть ошибка????? Есть такая задача: необходимо удалять из резерва щиты по заданному клиенту. Есть очередь из четырех позиций. В этой очереди записываем ID компании, которая зарезервировала рекламный щит. Например, компания отказалась от всех своих резервов и соответственно надо удалить из очереди эту компанию. Процесс запускается из карточки клиента по кнопке из Действия. Делаем это следующим образом:
в карточке редактирования клиента в методе прописываем
showGrafInfo: function() {
var AccountId = this.get("Id");
var processArgs = {
sysProcessName: "GroupDelete",
parameters: {
IDClient: AccountId
}
};
ProcessModuleUtilities.executeProcess(processArgs);
},
getActions: function() {
var actionMenuItems = this.callParent(arguments);
actionMenuItems.addItem(this.getActionsMenuItem({
"Type": "Terrasoft.MenuSeparator",
"Caption": ""
}));
actionMenuItems.addItem(this.getActionsMenuItem({
"Caption": this.get("Resources.Strings.GroupDelete"),
"Tag": "showGrafInfo"
}));
actionMenuItems.addItem(this.getActionsMenuItem({
"Type": "Terrasoft.MenuSeparator",
"Caption": ""
}));
return actionMenuItems;
}
Процесс пишем на C#:
EntitySchema UsrPlacementsschema = UserConnection.EntitySchemaManager.GetInstanceByName("UsrPlacements"); //выбираем из таблицы UsrPlacements
EntitySchemaQuery UsrPlacementsesq = new EntitySchemaQuery(UsrPlacementsschema);
UsrPlacementsesq.AddAllSchemaColumns();
var filter1 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve1", IDClient);
var filter2 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve2", IDClient);
var filter3 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve3", IDClient);
var filter4 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve4", IDClient);
// Объединить фильтры в коллекции логической операцией OR
UsrPlacementsesq.Filters.LogicalOperation = LogicalOperationStrict.Or;
// Добавить фильтры в запрос
UsrPlacementsesq.Filters.Add(filter1);
UsrPlacementsesq.Filters.Add(filter2);
UsrPlacementsesq.Filters.Add(filter3);
UsrPlacementsesq.Filters.Add(filter4);
EntityCollection Placementsentities = UsrPlacementsesq.GetEntityCollection(UserConnection);
foreach (Entity Placement in Placementsentities) {
if (Placement.GetTypedColumnValue("UsrReserve1Id")==IDClient);
{
Placement.SetColumnValue("UsrReserve1Id", null);
Placement.SetColumnValue("UsrResPrice1", 0);
Placement.SetColumnValue("UsrResDate1", "");
Placement.Save();
}
if (Placement.GetTypedColumnValue("UsrReserve2Id")==IDClient);
{
Placement.SetColumnValue("UsrReserve2Id", null);
Placement.SetColumnValue("UsrResPrice2", 0);
Placement.SetColumnValue("UsrResDate2", "");
Placement.Save();
}
if (Placement.GetTypedColumnValue("UsrReserve3Id")==IDClient);
{
Placement.SetColumnValue("UsrReserve3Id", null);
Placement.SetColumnValue("UsrResPrice3", 0);
Placement.SetColumnValue("UsrResDate3", "");
Placement.Save();
}
if (Placement.GetTypedColumnValue("UsrReserve4Id")==IDClient);
{
Placement.SetColumnValue("UsrReserve4Id", null);
Placement.SetColumnValue("UsrResPrice4", 0);
Placement.SetColumnValue("UsrResDate4", "");
Placement.Save();
}
}
return true;
В параметрах прописали аргумент IDClient - уникальный идентификатор. Процесс запускается, проблема в том, что если в очереди (UsrReserve1, UsrReserve2, UsrReserve3, UsrReserve4) стоят разные компании, то они удаляются все, а не только та компания, которая нам необходима. Помогите, пожалуйста разобраться в чем неточность.... Спасибо!
Нравится
Добрый день Юлия!!!
на лицо вижу неправильное построение структуры таблиц и хранение в них данных. В вашем случае при правильном построение структуры таблиц, должен быть один Select и один Delete. Опишите правильно и полностью вашу задачу, я вам помогу создать правильно схемы таблиц. И примеры работы с данными таблицами.
Михаил, добрый день! Структура таблицы UsrPlacements: есть поля резерв1...резерв4, в которых хранятся Id компании, дата резерва 1...дата резерва 4, цена резерва1...цена резерва 4. В карточке клиента есть кнопка Удаление резервов, по которой запускается процесс. В итоге должны обнуляться поля резерв1...резерв4, дата резерва 1...дата резерва 4, цена резерва1...цена резерва 4, если резерв1 или резерв2 или резерв3 или резерв4 равны Id клиента из карточки.
Юлия, можно увидеть ваши алгоритмы, в виде листинга по заполнению и обновлению данной таблицы. очень есть сомнение, что именно отсюда начинаются ваши ошибки. это первое пожелание.
а второе пожелание еще раз повторюсь, опишите пожалуйста суть вашей основной задачи. Я вам посоветую правильно организовать структуру таблицы. чтобы данные правильно хранились, выбирались, удалялись.
Михаил, задача такая: если клиент отказывается от резерва всех щитов, то он удаляется из всех резервов. Я Вам отправляю скрины выполнения этого процесса
В продолжении: получается, что процесс обнуляет резервы в строке БД, если хоть в одном из резервов есть данный клиент, но другие строки БД не затрагивает.
Михаил, изменить структуру таблицы вряд ли получится....эта таблица задействована во многих процессах
Юля так как вы исправлять структуры таблиц не желаете, а желаете оставить все как есть, то предлагаю алгоритм процесса перестроить следующим образом. Ниже привожу алгоритм 1 скрипта в Бизнес-процессе:
EntitySchema UsrPlacementsschema = UserConnection.EntitySchemaManager.GetInstanceByName("UsrPlacements"); //выбираем из таблицы UsrPlacements EntitySchemaQuery UsrPlacementsesq = new EntitySchemaQuery(UsrPlacementsschema); UsrPlacementsesq.AddAllSchemaColumns(); var filter1 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve1", IDClient); UsrPlacementsesq.Filters.LogicalOperation = LogicalOperationStrict.AND; // Добавить фильтры в запрос UsrPlacementsesq.Filters.Add(filter1); EntityCollection Placementsentities = UsrPlacementsesq.GetEntityCollection(UserConnection); foreach (Entity Placement in Placementsentities) { if (Placement.GetTypedColumnValue("UsrReserve1Id")==IDClient); { Placement.SetColumnValue("UsrReserve1Id", null); Placement.SetColumnValue("UsrResPrice1", 0); Placement.SetColumnValue("UsrResDate1", ""); Placement.Save(); }
Далее создаете 2,3,4 скрипты по образу и подобию первого только меняете "UsrReserve1Id" на "UsrReserve2Id". Алгоритм конечно не идеален и мне если честно вообще не нравиться. Я бы так никогда не сделал. Но работать точно будет как вы хотите. Я бы если обнаружил такую таблицу, где изначально неправильно распланировали структуру. Я бы создал новую правильную талбицу. Далее перенес бы все данные, ну и конечно переписал все алгоритмы под новую таблицу. Я бы так сделал.
Михаил, добрый вечер! Большое спасибо за скрипт, все работает корректно!