Сделал некое подобие автоподстановки. На примере формы карточка клиента (21) и соотв. таблицы (18), автоподстановка по полю Name (Название клиента). Если находит похожее среди клиентов название, то оно подставляется в текущую карточку. Это для примера...
В таблице 18 на триггере OnValidate поля Name исправить на код
Код:
IF CurrFieldNo = FIELDNO(Name) THEN
EXIT
ELSE BEGIN
IF ("Search Name" = UPPERCASE(xRec.Name)) OR ("Search Name" = '') THEN
"Search Name" := Name;
END;
В форме 21 следующие изменения. На триггерах контрола Name.
Name - OnInputChange()
Name - OnAfterInput(VAR Text : Text[1024]
Код:
IF (Text = '') OR (Name = '') THEN
EXIT;
IF EVALUATE(l_char,Text) THEN BEGIN
IF l_char = 32 THEN
Text := '#';
END;
IF (STRLEN(Text) = 1) THEN BEGIN
IF (Text <> COPYSTR(Name,1,STRLEN(Name) - 1)) THEN
Text := Name + Text
ELSE
IF (STRLEN(Text) = 1) AND (STRLEN(Name) = 2) THEN
Text := Name + Text;
END;
Name - OnAfterValidate()
Код:
l_int := 100;
Name := CONVERTSTR(Name,'#',' ');
IF STRLEN(Name) > 2 THEN BEGIN
l_recCustomer.SETFILTER(Name,'%1',Name + '*');
l_recCustomer.SETFILTER("No.",'<>%1',"No.");
{
// Автоподстановка без запуска формы >
IF l_recCustomer.FINDFIRST THEN BEGIN
Name := l_recCustomer.Name;
CurrForm.Name.UPDATE;
END;
// <
}
IF l_recCustomer.FINDFIRST THEN BEGIN
REPEAT
l_int += 1;
lt_recStandardText.Code := FORMAT(l_int);
lt_recStandardText.Description := l_recCustomer.Name;
lt_recStandardText.INSERT;
UNTIL l_recCustomer.NEXT = 0;
IF FORM.RUNMODAL(FORM::"Standard Text Codes", lt_recStandardText,lt_recStandardText.Description) = ACTION::LookupOK THEN
VALIDATE(Name,lt_recStandardText.Description);
END;
END;
После тестирования нашел несколько неудобств и пока один глюк (алгоритмически не удалось обойти). Глюк такой - при удалении Бэкспэйсом, когда 2 символа всего набрано, работает неправильно.
Неудобство главное - поле всегда выделено, но это не мешает последовательно вводить в него символы. Все вводится.