Exist Filter в DeleteQuery по таблице администрируемой по записям

Добрый вечер, путник зашедший на мой блог.
Если ты еще не спишь (а завтра рано вставать) вот тебе мой совет по исправлению Delete Query на администрируемую по записям таблицу, который использует Exist фильтры со ссылками на основную таблицу Delete Query.
Если ты, дорогой путник, не заснул после предыдущей фразы, вот тебе функция, которая исправляет данную проблему:

function ReplaceDQTablesAliasesByViewsInExistFilters(DeleteQuery, TableName, ViewName) {
        var IsAdmin = Connector.CurrentUser.IsAdmin;
        if (IsAdmin) {
                return;
        };             
        var Filters, ExistFilter, Filter, LeftTableAlias, RightTableAlias;
        for (var i = 0; i DeleteQuery.Filters.Count; i++) {
                ExistFilter =
                        DeleteQuery.Filters.Items(i);
                if (ExistFilter.FilterType != ftExists) {
                        continue;
                };
                for (var j = 0; j ExistFilter.TestExpression.ExpressionSelectQuery.Count; j++) {
                        Filters = ExistFilter.TestExpression.ExpressionSelectQuery.Items(j).Filters;
                        for (var k = 0; k Filters.Count; k++) {
                                Filter = Filters.Items(k);
                                if (!IsStringInArray(Filter.FilterType, [ftIsNull, ftCompare, ftLike, ftBetween, ftInclude])) {
                                        continue;
                                };
                                LeftTableAlias = Filter.TestExpression.TableAlias;
                                if (!IsEmptyValue(LeftTableAlias)) {
                                        Filter.TestExpression.TableAlias =
                                                LeftTableAlias.replace(TableName, ViewName);
                                };
                                if (Filter.FilterType == ftCompare) {
                                        RightTableAlias = Filter.ValueExpression.TableAlias;
                                        if (!IsEmptyValue(RightTableAlias)) {
                                                Filter.ValueExpression.TableAlias =
                                                        RightTableAlias.replace(TableName, ViewName);
                                        };                                     
                                };                             
                        }
                }
        }
}

Данная проблема может возникнуть где-угодно в версиях вплоть до 3.2.1.17 (а может и выше), но в базовой версии на написание сего меня подвергла операция "Раздать права доступа как у родительского элемента" детали Файлы. Под пользователем данная операция просто валится, т.к. для выполнения использует dq_GiveRightsByParentItem, которая не лишена проблемы описанной выше. Для исправления можно в scr_FilesDetailGridArea подправить ф-ию DeleteExistingFileAccessRecordsByParentItem: перед "DeleteQuery.Execute()" вызвать ф-ию описанную выше как-то так:

ReplaceDQTablesAliasesByViewsInExistFilters(DeleteQuery, 'tbl_FilesRight', 'vw_FilesRight');

Я не сомневаюсь, дорогой путник, что ты давно спишь. Счастливых тебе снов.

Нравится

Поделиться

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