Страница 1 из 1
Как ручками добавить локатор на LIST?
Добавлено: 20 Август 2013, 10:59
optron
День добрый.
С55EE, ABC
Имеется такой вот LIST (Не BROWSE) SprMatList, получаемый из очереди SprMatQueue:
Код: Выделить всё
LIST,AT(4,46,422,231),USE(?SprMatList),VSCROLL,ALRT(EnterKey),ALRT(InsertKey),ALRT(DeleteKey), |
ALRT(MouseLeft2),FORMAT('0R|M~Spec~L(2)@n3@9R|MI@S3@27R|M*~Код~C@N_6@150L(2)|M*~Наименование~C(0)@s150@3' &|
'5L(2)|M*~<185> группы~C(0)@s6@71L|M*~Б/С~C@s20@80L(1)|M*~Получатель~C(2)@s20@40R|M*~' &|
'Цена~C@n10.2@0R|M~SprMat_ID~L(2)@n-14@'),FROM(SprMatQueue)
Далее, она заполняется полями, соответственно:
Код: Выделить всё
SprMatQueue queue
Spec like(MAT:Spec)
Flag like(MAT:Flag)
Kod like(MAT:Kod)
Name like(MAT:Name)
NoGr like(MAT:NoGr)
BS like(MAT:BS)
Poluch like(MAT:Poluch)
Cena like(MAT:Cena)
SprMat_ID like(MAT:SprMat_ID)
end
и выводится.
В окне есть поле(для локатора)
MAT:Kod ну или SprMatQueue.Kod.
Вопрос: как кодом навесить на эту очередь Incremental Locator?
Пробовал после окончания формирования очереди писать что - то типа
Код: Выделить всё
?SprMatList{proplist:locator , SprMatQueue.Kod} = 1
или
?SprMatList{proplist:locator , MAT:Kod} = 1
Пробовал в Формате листа добавлять ?, но что - то пока никак.
Re: Как ручками добавить локатор на LIST?
Добавлено: 20 Август 2013, 12:57
Дед Пахом
Всё самому. И нажатия кнопок (букв) самому отлавливать (и на листе, и на локаторе), и поиск в очереди самому делать, и лист прокручивать... Грубо говоря, так:
- включить атрибут IMM для локатора
- в Event:NewSelection
Q.Locator = ?Locator{Prop:ScreenText}
GET(Q, Q.Locator)
IF NOT ERRORCODE()
?List{Prop:Selected} = POINTER(Q)
END
Re: Как ручками добавить локатор на LIST?
Добавлено: 20 Август 2013, 13:10
kreator
Я делаю так. После открытия окна определяю алерты для листа:
Код: Выделить всё
j#=3
loop i#=Key0 to Key9
?LOC:Queue{prop:Alrt,j#} = i#
j# += 1
end
loop i#=AKey to ZKey
?LOC:Queue{prop:Alrt,j#} = i#
j# += 1
end
loop i#=Shift0 to Shift9
?LOC:Queue{prop:Alrt,j#} = i#
j# += 1
end
loop i#=ShiftA to ShiftZ
?LOC:Queue{prop:Alrt,j#} = i#
j# += 1
end
?LOC:Queue{prop:Alrt,j#} = MinusKey
j# += 1
?LOC:Queue{prop:Alrt,j#} = ShiftMinus
j# += 1
?LOC:Queue{prop:Alrt,j#} = PlusKey
j# += 1
?LOC:Queue{prop:Alrt,j#} = ShiftPlus
j# += 1
?LOC:Queue{prop:Alrt,j#} = SpaceKey
j# += 1
?LOC:Queue{prop:Alrt,j#} = SlashKey
j# += 1
?LOC:Queue{prop:Alrt,j#} = ShiftSlash
j# += 1
?LOC:Queue{prop:Alrt,j#} = BSKey
j# += 1
?LOC:Queue{prop:Alrt,j#} = AstKey
j# += 1
?LOC:Queue{prop:Alrt,j#} = ShiftAst
j# += 1
?LOC:Queue{prop:Alrt,j#} = DecimalKey
j# += 1
?LOC:Queue{prop:Alrt,j#} = ShiftDecimal
j# += 1
loop i#=KeyPad0 to KeyPad9
?LOC:Queue{prop:Alrt,j#} = i#
j# += 1
end
loop i#=ShiftPad0 to ShiftPad9
?LOC:Queue{prop:Alrt,j#} = i#
j# += 1
end
loop i#=186 to 192
?LOC:Queue{prop:Alrt,j#} = i#
j# += 1
end
loop i#=219 to 222
?LOC:Queue{prop:Alrt,j#} = i#
j# += 1
end
loop i#=442 to 448
?LOC:Queue{prop:Alrt,j#} = i#
j# += 1
end
loop i#=475 to 478
?LOC:Queue{prop:Alrt,j#} = i#
j# += 1
end
А на событие EVENT:AlertKey для ?LOC:Queue:
Код: Выделить всё
if keycode()=BSKey
if LOC:LocatorStringLength
LOC:LocatorString[(LOC:LocatorStringLength):(LOC:LocatorStringLength)] = ''
LOC:LocatorStringLength -= 1
end
else
LOC:LocatorString = LOC:LocatorString[1:(LOC:LocatorStringLength)]&chr(keychar())
LOC:LocatorStringLength += 1
end
display(?LOC:LocatorString)
loop i#=1 to records(LOC:Queue)
get(LOC:Queue,i#)
if LOC:Queue.LOC:ObjectName[1:(LOC:LocatorStringLength)]=LOC:LocatorString[1:(LOC:LocatorStringLength)]
select(?LOC:Queue,i#)
break
end
end
Re: Как ручками добавить локатор на LIST?
Добавлено: 20 Август 2013, 13:54
optron
Спасибо. Думал, что можно попроще. Что-ж, будем пробовать.
Re: Как ручками добавить локатор на LIST?
Добавлено: 20 Август 2013, 14:15
optron
Еще раз спасибо. Всё получилось!
Re: Как ручками добавить локатор на LIST?
Добавлено: 20 Август 2013, 14:20
kreator
Если надо проще, то используем броуз. Я перестал использовать листы по очереди (практически). К броузу ведь подтянуто много вкусностей.
Re: Как ручками добавить локатор на LIST?
Добавлено: 20 Август 2013, 14:57
optron
Как то он нестабильно работает стандартный броуз.
Допустим, пишу лист на основную таблицу и автоматом шаблонами создаю броузы и апдейты дочерних таблиц. Там записей то до 10-ти к каждой основной. Делаю Change какой - либо дочерней записи и иной раз после внесения в неё изменения в списке остается она одна, а остальные 9 пропадают. Выхожу из Листа, захожу снова - опять 10 записей.
(Таблицы в MYSQL. С ТПС-ками такого не замечал.) И как этот трабл выловить в стандартных шаблонах - ума не приложу.
Re: Как ручками добавить локатор на LIST?
Добавлено: 20 Август 2013, 15:34
Yufil
Тут немного неправильно
0. Select кинет курсор на листбокс, хотим ли мы этого?
1. Нет Upper, если набираем не тем регистром - не найдётся нифига
2. Если у нас есть слова на А и В, а в локаторе вводим Б, хотелось бы встать на начало В
FreeABC Templates содержит шаблон BrowseQueue, который превращает Queue в аналог Browse, хотя и не без
ошибок. В своё время помучился, чтобы колесо в листбоксе корректно крутило очередь...
Re: Как ручками добавить локатор на LIST?
Добавлено: 20 Август 2013, 16:06
kreator
Есть такое. Тут принципиальный момент. И дело не в апдейте. Чтобы скульные таблицы отображались в броузе по-человечески (без задвоений, и без пропаж), броуз нужно делать по уникальному ключу. Вот пример. Сортировка в броузе по наименованию, а оно не уникальное. Будут проблемы. В этом случае в сортировку нужно добавить уникальный ID (как правило первичный ключ), т. е. ключ в словаре NameKey должен быть из двух столбцов Name и ID. Проверено - проблемы пропадают. На досуге попробуй, посмотри.
И, вообще, таблицы SQL без первичного ключа не рекомендуются к использованию. Где-то это в хелпе написано, но с ходу не нашёл.
Re: Как ручками добавить локатор на LIST?
Добавлено: 20 Август 2013, 16:38
optron
Хм, спасибо. PRIMARY Key то у меня во всех таблицах есть. А вот то, что его нужно доп. включать в ключ - не слышал. Попробую.
Re: Как ручками добавить локатор на LIST?
Добавлено: 20 Август 2013, 17:24
kreator
Во, нашёл:
Код: Выделить всё
Browsing SQL-Based Tables
Top Previous Next
This topic presents some techniques that should be followed when browsing SQL-based tables within your generated applications.
1)
You should not create a Browse procedure using an SQL table without a Key defined in the Dictionary.
2)
You not only have to have a key defined, but the sort order has to be unique.
Without a unique Key defined you can have what we refer to as ghosting effect, whereby at runtime paging up and down the displayed list can create duplicates in the Queue. So make sure that all your browses use a Key with a unique sort sequence. All Key defintions should include a unique column.
For example, if you had a unique EmployeeID component, and another Name key based on LastName and FirstName, add the unique EmployeeID as the third component of the name key.