Есть необходимость на определенном этапе менять ответственного, для этого в БП создан отдельный скрипт, который выбирает нового ответственного из трех возможных, путем получения из select-запроса количества их задач и находя с наименьшим
делается это так
var Owner2ID = '{06789BA0-B0E4-4240-A750-FEA6A25C215F}';
var Owner3ID = '{4065F8D8-34B5-4406-B052-C2E17010C41E}';
var TaskCount1 = GetWFTaskCountByOwner(Owner1ID);
//MessageBox(TaskCount1);
var TaskCount2 = GetWFTaskCountByOwner(Owner2ID);
//MessageBox(TaskCount2);
var TaskCount3 = GetWFTaskCountByOwner(Owner3ID);
//MessageBox(TaskCount3);
var ResultOwnerID;
//TaskCount1 = TaskCount1 / 1;
//TaskCount2 = TaskCount2 / 1;
//TaskCount3 = TaskCount3 / 1;
if (TaskCount1 TaskCount2) {
if (TaskCount1 TaskCount3) {
ResultOwnerID = Owner1ID;
} else {
if (TaskCount2 TaskCount3) {
ResultOwnerID = Owner2ID;
} else {
ResultOwnerID = Owner3ID;
}
}
} else {
if (TaskCount1 TaskCount3) {
ResultOwner = Owner1ID;
} else {
if (TaskCount2 TaskCount3) {
ResultOwner = Owner2ID;
} else {
ResultOwner = Owner3ID;
}
}
};
// MessageBox(ResultOwner);
ScriptItem.ParentItems.ParentDiagram.Parameters('OwnerID').Value = ResultOwner;
вот код скрипта, из которого берется значение в GetWFTaskCountByOwner
COUNT(CAST([tbl_Task].[ID] AS VARCHAR(38))) AS [TaskCount]
FROM
[dbo].[tbl_Task] AS [tbl_Task]
WHERE([tbl_Task].[TypeID] = :MeetingTaskTypeID AND
NOT [tbl_Task].[WorkflowItemID] IS NULL AND
[tbl_Task].[OwnerID] = :OwnerID)
все хорошо и замечательно, вот только решили добавить в запрос новое ограничение в where, а точнее отбирать еще и по статусу задач
после этого скрипт по прежнему работает корректно, значения в TaskCount-ы присваиваются корректные (проверял закомментированными messagebox-ами), но ResultOwner становится не определенным, из-за чего в программе возникает ошибка, судя по всему сравнения не производится, но вот почему?
может кто подскажет что могло случится
Нравится
Два вопроса:
1. Почему такие сравнения для определения наименьшего из трех? Если нужно определить меньшее из TaskCount1, TaskCount2, TaskCount3, то вполне логично это делать таким образом:
if (TaskCount1 < TaskCount2) { if (TaskCount1 < TaskCount3) { Result = TaskCount1; } else { //TaskCount3 <= TaskCount1 Result = TaskCount3; } } else { //TaskCount2 <= TaskCount1 if (TaskCount2 < TaskCount3) { Result = TaskCount2; } else { //TaskCount3 <= TaskCount2 Result = TaskCount3; } }
При том что код был излишен, так еще и неправильный.
Пусть в Вашем случае TaskCount1 = 5, TaskCount2 = 1, TaskCount3 = 10 (любые значения для условия TaskCount2 < TaskCount1 < TaskCount3). Ваш код выполнит присвоение ResultOwner = Owner1ID, что неправильно. Остальные варианты значений количества задач отработаются правильно.
2. Какой код функции GetWFTaskCountByOwner? Туда все еще передается один параметр, или же после добавления нового параметра и фильтра в запрос для подсчета количества задач нужный параметр также передается и в функцию? Добавлены ли и новый параметр, и фильтр сравнения в запрос на подсчет количества, совпадают ли их названия со значением аргумента функции фильтрации датасета?
function GetWFTaskCountByOwner(OwnerID) { var SelectQuery = GetSingleItemByCode('sq_GetWFTaskCountByOwner'); ApplySelectQueryFilter(SelectQuery, 'OwnerID', OwnerID, true); var Dataset = SelectQuery.Open(); var TaskCount = Dataset.Values('TaskCount'); Dataset.Close(); return TaskCount; }
фильтр один, изменился только код sql на
SELECT COUNT(CAST([tbl_Task].[ID] AS VARCHAR(38))) AS [TaskCount] FROM [dbo].[tbl_Task] AS [tbl_Task] WHERE([tbl_Task].[TypeID] = :MeetingTaskTypeID AND NOT [tbl_Task].[WorkflowItemID] IS NULL AND [tbl_Task].[OwnerID] = :OwnerID AND [tbl_Task].[StatusID] = :StatusID)
:StatusID прописан в запросе