Публикация

Быстрая работа с полем справочника

Идея взята у Владимира Соколова. Реализация моя, пользоваться могут все :)

При введении части слова в поле справочника заполнять его сразу же без вызова диалога, если найдено только одно значение. Например, в поле Страна ввели "Укр", и при нажатии Enter, сразу бы заполнилось "Украина" (Экономится 2 никому не нужных нажатия клавиши). (с) Владимир Соколов.

Конечно же, полноценная реализация требует изменения в ядре tscrm. В Open Source Террасофт пока еще не подался, поэтому ищем обходные варианты.

В scr_SelectData переписываем

var LookupDataControlCoCLassGUID = '{837F2428-271C-4013-BB17-521466E17BC3}';
var LookupControlCoCLassGUID = '{0D859F8D-17A3-430A-B237-ACD31C474D26}';

function wnd_SelectDataExOnShow(Window) {      
       OpenSelectDataDataset();
       var CoClassGUID = Self.Attributes('NotifyObject').CoClassGUID;
       if (((CoClassGUID == LookupDataControlCoCLassGUID) ||
            (CoClassGUID == LookupControlCoCLassGUID)) &&
              dlData.Dataset.PageRecordsCount == 1){
              Timer.IsEnabled = true;
        } else {
              LocateByKeyValue();
              UpdateEditStatus();
              SetFocusToEdit();
        }
}

В wnd_SelectData добавляем компонент Timer. IsEnabled = false, Interval=10. Тут со значением 10, возможно, нужно поексперементировать. Я поставил 10 наобум,работает нормально. На OnTimer вешаем

function TimerOnTimer(Timer) {
        btnOkOnClick(btnOk);
        Timer.IsEnabled = false;
}

Буду рад услышать комментарии\пожелания\советы.

Нравится

Поделиться

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

Зачем таймер?
Можно после нажатия клавиши, делать поиск в справочнике, если запись одна - подставлять значение в поле

"Попов Александр" написал:Зачем таймер?

Таймер нужен просто что-бы закрыть окно. В OnShow это делать нельзя - ругается.

"Попов Александр" написал:
Можно после нажатия клавиши, делать поиск в справочнике, если запись одна - подставлять значение в поле

Не совсем понял что Вы имеете ввиду. В каком скрипте, по какому событию? Как быть с тем, что из ядра(?) у окна wnd_SelectData вызывается Show?

А что происходит в случае если "Укр" выдаст два значения Украина и Украинистан :), к примеру? Или если не будет записей соответствующих введённым начальным символам?

---
Конфигурация:
TSCRM 3.3.1.59
Firebird 2.0 (v.2.0.3.12981)
ClientOS: Vista Home Premium
ServerOS: Windows 2003 Server

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

"Швец Александр" написал:А что происходит в случае если "Укр" выдаст два значения Украина и Украинистан :), к примеру? Или если не будет записей соответствующих введённым начальным символам?

Если два значения, то будет работать как обычно, если ни одного тоже, откроется пустое окно.
"Underscore a.k.a. _" написал:Self.Attributes('NotifyObject').CoClassGUID

Вот это бы в переменную предварительно занести для лучшей читабельности.

Согласен, просто в первой версии я упустил недатаконтролы, а потом просто скопипейстил.

В первоначальном коде исправил одну неприятную вещь: когда значение в справочном поле выбрано и я хочу, например, посмотреть карточку выбранной записи через окно выбора значения из справочника, то я это не смогу сделать, поскольку окно выбора значения из справочника будет сразу закрываться (запись одна в справочнике по указанному тексту).

Чтобы значение подставлялось автоматически только тогда, когда в поле не выбрано значение (ID равен NULL), добавил еще одну проверку:
Для LookupDataControl

IsEmptyGUID(Self.Attributes('NotifyObject').DataField.Value)

Для LookupControl

IsEmptyGUID(Self.Attributes('NotifyObject').Value)

В итоге код получился следующий:

var LookupDataControlCoCLassGUID = '{837F2428-271C-4013-BB17-521466E17BC3}';
var LookupControlCoCLassGUID = '{0D859F8D-17A3-430A-B237-ACD31C474D26}';
 
function wnd_SelectDataExOnShow(Window) {	
    OpenSelectDataDataset();
    if ((((Self.Attributes('NotifyObject').CoClassGUID ==
    	 LookupDataControlCoCLassGUID) &&
    	IsEmptyGUID(Self.Attributes('NotifyObject').DataField.Value)) ||
    	((Self.Attributes('NotifyObject').CoClassGUID ==
    	LookupControlCoCLassGUID) &&
    	IsEmptyGUID(Self.Attributes('NotifyObject').Value))) &&
        (dlData.Dataset.PageRecordsCount == 1)) {
    	Timer.IsEnabled = true;
    } else {
        LocateByKeyValue();
    	UpdateEditStatus();
    	SetFocusToEdit();
    }
}
Показать все комментарии