При перетягивании задачи в расписании, например, с сегодняшнего для на завтрашний, возникает необходимость также "сдвинуть" напоминание по этой задаче на такой же промежуток времени.
Привожу ниже работающий и протестированный пример подобной реализации.
Необходимо в scr_SchedulerArea в функции UpdateDatasetRecordByEvent прописать следующий код (новый код выделен):

var DataFields = Dataset.DataFields;
var StartDateDataField = DataFields.ItemsByName('StartDate');
var DueDateDataField = DataFields.ItemsByName('DueDate');
var OwnerIDDataField = DataFields.ItemsByName('OwnerID');
Dataset.Locate('ID', Event.ID);
var PriorStartDate = StartDateDataField.ValAsDateTime;
var PriorDueDate = DueDateDataField.ValAsDateTime;
if (!CheckTaskCovering(Dataset, OwnerIDDataField, Event.Start,
Event.Finish)) {
CancelChangeEvent(Event, PriorStartDate, PriorDueDate);
return;
}
Dataset.Edit();
strong>var RemindingToOwnerID = Dataset.Values('RemindingToOwnerID');
if (!IsEmptyValue(RemindingToOwnerID)) {
var uq_Remindings = GetSingleItemByCode('uq_Remindings', 'uq_RemindSingle');
var Parameters = uq_Remindings.Parameters;
var ColumnsValues = uq_Remindings.ColumnsValues;
SetParameterValue(Parameters, 'ID', RemindingToOwnerID);
ColumnsValues.ItemsByName('RemindTime').Value = Event.Start;
uq_Remindings.Execute();
}strong>
//Dataset.ValAsStr('Title') = Event.Caption;
StartDateDataField.ValAsDateTime = Event.Start;
DueDateDataField.ValAsDateTime = Event.Finish;
UpdateDuration(Dataset);
Dataset.Post();
UpdateEventColorsByDatasetRecord(Event, Dataset);

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

Желаю удачи!

С уважением,
Мельникова Екатерина

Нравится

Поделиться

8 комментариев

Здравствуйте! Пробовал использовать этот код, но ничего не получилось, выходят ошибки... и в конце концов в приложении в разделе расписание задачи вообще не отображаються,
может ли это быть связано с тем что у меня версия 3,3,1,а код для другой версии, пожалуйста поясните для какой версии подходит данный код?

"Мамажанов Марат Кадралдыкович" написал:но ничего не получилось, выходят ошибки

Опишите, пожалуйста, ошибки которые у Вас возникают.
Заметил что в коде остались лишние теги (не удалось выделить текст), должно быть так:

var DataFields = Dataset.DataFields;
var StartDateDataField = DataFields.ItemsByName('StartDate');
var DueDateDataField = DataFields.ItemsByName('DueDate');
var OwnerIDDataField = DataFields.ItemsByName('OwnerID');
Dataset.Locate('ID', Event.ID);
var PriorStartDate = StartDateDataField.ValAsDateTime;
var PriorDueDate = DueDateDataField.ValAsDateTime;
if (!CheckTaskCovering(Dataset,OwnerIDDataField,Event.Start,Event.Finish)) {
    CancelChangeEvent(Event, PriorStartDate, PriorDueDate);
    return;
}
Dataset.Edit();
var RemindingToOwnerID = Dataset.Values('RemindingToOwnerID');
if (!IsEmptyValue(RemindingToOwnerID)) {
    var uq_Remindings = GetSingleItemByCode('uq_Remindings', 'uq_RemindSingle');
    var Parameters = uq_Remindings.Parameters;
    var ColumnsValues = uq_Remindings.ColumnsValues;
    SetParameterValue(Parameters, 'ID', RemindingToOwnerID);
    ColumnsValues.ItemsByName('RemindTime').Value = Event.Start;
    uq_Remindings.Execute();
}
StartDateDataField.ValAsDateTime = Event.Start;
DueDateDataField.ValAsDateTime = Event.Finish;
UpdateDuration(Dataset);
Dataset.Post();
UpdateEventColorsByDatasetRecord(Event, Dataset);

Здравствуйте! Подставил данный код,ошибок нету, но дата напоминания не всегда обновляется при переносе задачи в расписании, но когда она все-таки обновляется, время начала напоминания становится равным времени начала задачи, но оно должно перетаскиваться ровно на стольно на сколько перетаскивается сама задача

Для реализации необходимого Вам функционала на Вашей версии приложения могу посоветовать заменить функционал строки

ColumnsValues.ItemsByName('RemindTime').Value = Event.Start;

на следующий:
- найти разницу между StartDateDataField.ValAsDateTime и Event.Start;
- найти запись из таблицы tbl_Remanding, значение поля RemindTime;
- добавить к нему разницу м/д StartDateDataField.ValAsDateTime и Event.Start;
- обновить запись в таблице tbl_Remanding.

Здравствуйте!
Подскажите пожалуйста как фильтровать, у меня есть 2 датасета (задачи и напоминания) и мне нужно, по мере изменения расписания задачи изменять и время напоминания, так чтобы время напоминания изменялось на столько же насколько изменяется расписание,
я было написал определенный скрипт, но когда я пытаюсь записать данные в таблицу напоминаний, у меня выходит ошибка, что поле "описание" не заполнено, и значение "нуль" в нем, не допустимо, вот пример:

function UpdateDatasetRecordByEvent(Dataset, Event) {

var DataFields = Dataset.DataFields;
var StartDateDataField = DataFields.ItemsByName('StartDate');
var DueDateDataField = DataFields.ItemsByName('DueDate');
var OwnerIDDataField = DataFields.ItemsByName('OwnerID');
Dataset.Locate('ID', Event.ID);
var PriorStartDate = StartDateDataField.ValAsDateTime;
var PriorDueDate = DueDateDataField.ValAsDateTime;
if (!CheckTaskCovering(Dataset,OwnerIDDataField,Event.Start,Event.Finish)) {
CancelChangeEvent(Event, PriorStartDate, PriorDueDate);
return;
}

Dataset.Edit();
var RemindingToOwnerID = Dataset.Values('RemindingToOwnerID');
var uq_Remindings = GetSingleItemByCode('uq_Remindings', 'uq_RemindSingle');
var ds_Remindings = dl_remLNK.dataset;
var Parameters = uq_Remindings.Parameters;
var ColumnsValues = uq_Remindings.ColumnsValues;
var ds_rem = ds_Remindings.DataFields.ItemsByName('RemindTime');
SetParameterValue(Parameters, 'ID', RemindingToOwnerID);
Event.Start;
uq_Remindings.Execute();

ds_Remindings.Close();
ApplyDatasetFilter(ds_Remindings, ID',RemindingToOwnerID, true);
ds_Remindings.Open();
ds_Remindings.edit();
ds_rem.ValAsDateTime = Event.Start;
ds_Remindings.post();

StartDateDataField.ValAsDateTime = Event.Start;
DueDateDataField.ValAsDateTime = Event.Finish;
UpdateDuration(Dataset);
Dataset.Post();
UpdateEventColorsByDatasetRecord(Event, Dataset);
}
я хотел фильтровать ds_Remindings.id по полю RemindingToOwnerID из первого датасета (ds_Task.RemindingToOwnerID), чтобы изменть напоминание связанное с текущим ответственным.
буду рад любым ответам

чем отличаются ds_Reminding и ds_Remindings какова роль каждого?

"Мамажанов Марат Кадралдыкович" написал:чем отличаются ds_Reminding и ds_Remindings какова роль каждого?

ds_Remindings соответствует всплывающему окну напоминаний. Вы можете посмотреть в соответствующем запросе на выборку sq_Remindings связи с таблицами, по записям которых появляются напоминания в этом окне.
ds_Reminding соответствует закладке "Напоминания" менеджера деталей.

Что касается Вашего кода, то проблема в не совсем корректном обновлении записей в таблице напоминаний. Например, нигде не указаны параметры для UpdateQuery.
Для решения проблемы рекомендую сделать следующим образом.
Сначала отфильтровать датасет напоминаний по нужной записи:

ds_Remindings.Close();
ApplyDatasetIDFilter(ds_Remindings, RemindingToOwnerID, true);
ds_Remindings.Open();

Затем записать в переменную описание напоминания (т.к. оно обязательно должно быть в UpdateQuery):

var RemindingDescription = ds_Remindings.Description;
if (IsEmptyValue(RemindingDescription)) {
                RemindingDescription = ‘Напоминание по задаче ’ + Dataset.Values(‘Title’);
}

Затем инициализация колонок UpdateQuery:

ColumnsValues.ItemsByName(‘Description’).Value = RemindingDescription;
ColumnsValues.ItemsByName(‘RemindTime’).Value = Event.Start;

Все это можно вставить между строками:

var ds_rem = ds_Remindings.DataFields.ItemsByName('RemindTime'); и SetParameterValue(Parameters, 'ID', RemindingToOwnerID);

Что касается блока:

ds_Remindings.Close();
ApplyDatasetFilter(ds_Remindings, ID',RemindingToOwnerID, true);
ds_Remindings.Open();
ds_Remindings.edit();
ds_rem.ValAsDateTime = Event.Start;
ds_Remindings.post();

то в принципе Вы можете его не использовать, поскольку обновление уже сделано ранее и без него.

Желаю удачи!

Показать все комментарии