Публикация

Борьба с ошибкой: в детали "Интервью" раздела "Опросы" не удаляются только что созданные записи

Несколько раз встречал ошибку: в детали "Интервью" раздела "Опросы" не удаляются только что созданные записи. Пользователь сам создал запись, и сам же не может её удалить. Когда-то я помнил причины, почему так происходит (там хитро, если столкнусь с ошибкой опять - опишу подробно), а вот решение сохранилось. Предлагаю, быть может, не самый оптимальный вариант, но вполне рабочий. Суть изменений сводится к подмене датасетов, по которым определяются права на удаление.

На событие btnDeleteOnClick скрипта wnd_ContactInSurveyGridAreaScript помещаем такую функцию:

function btnDeleteOnClick(Control) {
//Удаление. Поскольку Dataset другой, сообщаем функции удаления,
//что проверку доступности записей на удаление следует производить
//по другому датасету, а именно ds_InterviewAnswer
        SetAttribute(dlData.Dataset, 'ContactInSurveyFiction', 'ds_InterviewAnswer');
        scr_BaseGridArea.btnDeleteOnClick(Control);    
        //и тут же избавляемся от этого атрибута
        dlData.Dataset.Attributes('ContactInSurveyFiction') = null;
}

Потом в scr_WindowUtils, в функции DeleteDataGridRecords, в середине, где стыкуются два цикла, вносим следующие изменения:

        //Совершаем подмену датасетов, если это вызов из wnd_ContactInSurveyGridAreaScript
        var MustDoFiction = false;
        if (Dataset.Attributes.IsValueExists('ContactInSurveyFiction')) {
                MustDoFiction = true;
                FictionDataset = GetSingleItemByCode(Dataset.Attributes('ContactInSurveyFiction'), 'ContactInSurveyFiction');
        }      
       
        //Собственно, удаление.
        for (var i = 0; i ArrayIDs.length; i++) {
                try {
                        ID = ArrayIDs[i];
                        //Здесь происходит проверка на наличие прав на удаление
                       
                        /* старый вариант
                        CanDeleteRecord =
                                GetIsRecordIDAccessAllowByDataset(Dataset, ID, 'CanDelete');
                        */

                        CanDeleteRecord =
                                GetIsRecordIDAccessAllowByDataset(
                                (MustDoFiction)? FictionDataset:Dataset, ID, 'CanDelete');                     

после строки "CanDeleteRecord =" оставляем всё, как в базовой версии. Права на удаление теперь проверяются по "правильному" датасету, а удаление происходит откуда надо.

Нравится

Поделиться

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