Кнопка "OK" на форме редактирования и как с ней бороться

Всем привет!

Сегодня хочу рассмотреть работу кнопки "OK" на формах редактирования. Как всегда, передо мной коробочный вариант Terrasoft XRM 3.3.2

Честно говоря, первый раз открыв приложение, меня удивило "огромное" количество кнопок на формах редактирования... целых 2: "OK" и "Отмена".... если где-то есть больше, значит я что-то до сих пор упустил из виду :smile:

Если с кнопкой "Отмена" все более-менее понятно, то с кнопкой "OK" не очень. ОК = Хорошо, так? Когда мы открываем форму контрагента, и что-то меняем, нам нужно нажать кнопку "Хорошо" или все же лучше иметь кнопку "Сохранить"? Какое из 2-х названий более всего отражает смысл того, что будет происходить в дальнейшем? К счастью, поменять Caption кнопки базового окна редактирования с "OK" на "Сохранить" довольно просто. Сделать это можно в сервисе wnd_BaseDBEdit.

Но это еще не все...
Часто пользователи открывают форму чтобы просто посмотреть какую-то информацию, которой нет в гриде. После просмотра, 99,9% пользователей нажимают какую кнопку? Правильно - "ОК".
А теперь посмотрим, что при этом происходит: а происходит то, что запись сохраняется в БД. И мы видим, что поменялась дата изменения, а так же поле "Изменил". Но ведь никто ничего не менял - просто посмотрел! Тем не менее, запись сохранилась в базе, упали новые записи в логи, сработала интеграция и пакет с апдейтом полетел в другую систему... А Вася не поймет, почему Петя редактировал запись его контрагента, например, и что он в итоге поменял, когда в истории никаких изменений :)

Как с этим безобразием бороться:
1) В базовом функционале есть функция, которая определяет, были ли внесены изменения в список полей. К сожалению, если потребуется проверить все поля, то в коробочной реализации придется все их и перечислить, что не айс. Допиливаем функционал скрипта scr_DB

function GetFieldsValuesAreChanged(Dataset, DataFieldNames) {
        var DataField;
        if(!IsEmptyValue(DataFieldNames)){
                for (var i = 1; i arguments.length; i++) {
                        FieldValue = Dataset.DataFields(arguments[i]);
                        if (FieldValue.ValueIsChanged) {
                                return true;
                        }
                }
        } else {//Проверяем все поля на изменения если не указан список конкретных полей
                for (var i = 1; i Dataset.DataFields.Count; i++) {
                        FieldValue = Dataset.DataFields.Items(i);
                        if (FieldValue.ValueIsChanged) {
                                return true;
                        }
                }
        }            
        return false;
}

2) А теперь нужно проверку "А было ли что-то изменено?" вставить перед вызовом метода Dataset.Post() Для этого берем скрипт scr_BaseDBEditUtils и добавляем в функцию сохранения наш функционал:

function SaveChanges(BaseDBEdit, Window) {
        var AddNewRecordOnPage = (BaseDBEdit.Dataset.State == dstInsert);
        Window.Attributes('IsAppend') = (BaseDBEdit.Dataset.State == dstInsert);
        Window.Attributes('RecordID') = BaseDBEdit.RecordID;
        if(GetFieldsValuesAreChanged(BaseDBEdit.Dataset))//Сохраняем запись только если что-то реально поменялось
                var PostResult = BaseDBEdit.Dataset.Post();
        else
                var PostResult = 1;
        Window.Attributes('AddNewRecordOnPage') =
                (AddNewRecordOnPage && PostResult > 0);
        var Result = ((PostResult == 1) || (BaseDBEdit.RecordAlreadySaved));
        return Result;
}

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

Таким образом, мы "победили" еще одного "невольного убийцу" производительности системы.

Нравится

Поделиться

1 комментарий

Здравствуйте, а как быть с BLOB полями , если изменить только его , то изменения при данном коде не сохраняются ?

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