Страница 1 из 1

Установка записи при открытии Browse

Добавлено: 31 Март 2011, 11:25
Алексей- Софт-Центр
Добрый день!
Кларион 6, АВС.
Есть Browse с первичным ключом ORD:SurOrd (LONG)
Была задача - установить курсор на требуемую запись при открытии Browse.
Делал так:
ORD:SurOrd= значение
globalrequest=selectrecord
Browseorders
и все прекрасно работало!
Но потребовалось изменить ключ Browse - он стал составным:
ORD:Flag (byte)
ORD:SurOrd (LONG)

После чего перестал работать установка при открытии.
Вопрос очевиден: Как установить курсор на запись в Browse при его открытии по значению ORD:SurOrd ?

Алексей

Re: Установка записи при открытии Browse

Добавлено: 31 Март 2011, 14:07
Игорь Столяров
Я заранее извиняюсь, за наивный ответ - но нужно инициализировать оба компонента ключа или получается неоднозначность.
Нельзя получить указатель на запись, ели неопределен первый компонент ключа. Или поменяй поля в ключе местами. ;)

Re: Установка записи при открытии Browse

Добавлено: 31 Март 2011, 14:17
Алексей- Софт-Центр
Добрый день!
Нет! Инициированы (присвоены конкретные значения) обоим полям ключа.
Не устанавливает на нужную запись.
Или поменяй поля в ключе местами
К сожалению, менять нельзя, по причине последовательности вывода в Browse (Да это и не помогает :wink: )
Алексей

Re: Установка записи при открытии Browse

Добавлено: 31 Март 2011, 14:26
Ал
Привет! А если ставить по указателю записи который получишь при анализе очереди вывода в бровз при правильных значениях в нужных полях? Имеется ввиду что ключ просмотра тот же оставишь

Re: Установка записи при открытии Browse

Добавлено: 31 Март 2011, 14:42
Игорь Столяров
Была у меня как-то проблема с позицированием записи в Browse. Есть два варианта.

1. Считать запись (раз мы знаем оба компонента уникального ключа) и открыть Browse в ркжиме SelectRecord (что не всегда подходит).

2. При открытии окна с Browse, ПЕРЕД SELF.SetAlerts() вставляем POST(Event:Accepted,?ButSelect)
В окно добавляем скрытую кнопку ?ButSelect и на нее вешаем код позицирования указателя на запись в списке:

Clear(MyFile.Record)
MyFile.Field1 = ...
MyFile.Field2 = ...
MyFile.Field3 = ...
...
If ~Access:MyFile.Fetch(MyFile.By_KeyBrowse) then BRW1.ResetFromBuffer().
Select(?Browse)

Все. Работает на все сто ... ;)

Re: Установка записи при открытии Browse

Добавлено: 31 Март 2011, 16:10
Алексей- Софт-Центр
Добрый день!
1. Считать запись (раз мы знаем оба компонента уникального ключа) и открыть Browse в ркжиме SelectRecord (что не всегда подходит).
Это как раз то чего я и делал:пробывал и считывать до Browse запись и не считывать, а присваивать значения ключу - не пашет. Для одиночного ключа - все работает, для составного-облом!
2. При открытии окна с Browse, ПЕРЕД SELF.SetAlerts() вставляем POST(Event:Accepted,?ButSelect)
В окно добавляем скрытую кнопку ?ButSelect и на нее вешаем код позицирования указателя на запись в списке:
Скрытая - это hide или просто "малюсенькая-прималюсенькая", но unhide ?


Алексей

Re: Установка записи при открытии Browse

Добавлено: 31 Март 2011, 16:54
Игорь Столяров
1. А запись после считывания вообще есть ? Удается ее считвать по этому ключу ? Ошибки нет ?
2. Все равно. Я обычно делаю HIDE - зачем эта кнопка нужна в окне ? Можно открыть ее для тестирования - что бы увидеть производится ли установка засветки на указанную запись при ее нажатии.

Re: Установка записи при открытии Browse

Добавлено: 01 Апрель 2011, 11:46
Алексей- Софт-Центр
Добрый день!

В кнопку вставил текст:

ORD:SurOrd=1374
ORD:Flag=1
If ~Access:orders.Fetch(orders.K_Flag_sur) then BRW1.ResetFromBuffer().
select(?Tab:2)

Не позиционирует! (запись по этому ключу - существует!)

Алексей

Re: Установка записи при открытии Browse

Добавлено: 01 Апрель 2011, 12:32
Игорь Столяров
1. Данная запись в списке есть (нет дополнительных фильтров ее исключающих) ?
2. Список построен по этому ключу ?
3. После обновления данных из буфера - сделай активным список, а не закладку (см. мой пример ниже).
4. И все-таки проверь считывание записи.

If ~Access:orders.Fetch(orders.K_Flag_sur) then Message("Запись есть !"); BRW1.ResetFromBuffer().

Re: Установка записи при открытии Browse

Добавлено: 01 Апрель 2011, 12:32
nik190994
Я использую класс локатора

dog:cod1 = cod1 !Задать ключевое поле
BRW1.TakeAcceptedLocator() !вызов метода TakeAccepted локатора
BRW1.Reset(1) !если требуется поиск, переустановить VIEW
BRW1.ResetQueue(Reset:Done) !перенабрать очередь просмотра
BRW1.UpdateWindow()

Re: Установка записи при открытии Browse

Добавлено: 01 Апрель 2011, 12:50
Игорь Столяров
Вот, кстати, правильная подсказка.
Забыл сказать, что в моем примере локатор в списке должен быть отключен.

Re: Установка записи при открытии Browse

Добавлено: 01 Апрель 2011, 13:35
Алексей- Софт-Центр
Добрый день!
Игорю:
Спасибо!
Все заработало. Виноват сам: в embed поставил не POST..., а непосредственно текст, который зашит в кнопке!

nik190994:
Спасибо за второе решение, пока не пробовал, но думаю, что тоже заработает :)

Алексей

Re: Установка записи при открытии Browse

Добавлено: 10 Апрель 2011, 13:25
Игорь Столяров
Алексей- Софт-Центр писал(а):Спасибо! Все заработало.
Пожалуйста. Здесь все понятно.
Но вот есть другая нерешенная задача на эту тему - как выполнить позицирование записи при выборе из списка если записи показаны в списке по не уникальному ключу ...

Пример: Есть счета, в которых указан уникальный код контрагента в списке (предполжим по полю Shet.Client)
Есть список контрагентов, в котором задан ключ по уникальному номеру (Client.ByNumber) и ключ по неуникальному наименованию (Client.ByName).
В списке есстественно контрагенты отсортированы по наименованию (Client.ByName).

Если мы вызываем теперь список для выбора контрагента - в нем засветка устанавливается на первую запись с подходящим наименованием контрагента, а не Client.Number = Shet.Client. И вот здесь уже танцы с бубном не помогают. Думаю, что решение есть - нужно принудительно выполнить позицирование по уникальному указателю, но сделать пока руки не дошли ... :(

P/S: Умные идеи с изменением структруры ключа Client.ByName, что бы сделать их уникальным и так понятны, можно не предлагать.

Re: Установка записи при открытии Browse

Добавлено: 11 Апрель 2011, 14:13
Алексей- Софт-Центр
Добрый день!
Игорь! Вы же мне сами подсказали это решение:
вставка в кнопку
Clear(MyFile.Record)
MyFile.Field1 = ...
MyFile.Field2 = ...
MyFile.Field3 = ...
...
If ~Access:MyFile.Fetch(MyFile.By_KeyBrowse) then BRW1.ResetFromBuffer().
Select(?Browse)
Так вот надо вставить fetch по уникальному ключу, а не по ключу броуза.
(по номеру, а не по имени)
Как-то так:
Clear(MyFile.Record)
MyFile.Num = ...
If ~Access:MyFile.Fetch(MyFile.By_KeyNum) then BRW1.ResetFromBuffer().
Select(?Browse)
-----
Единственно, что в броуз надо кроме имени включить и уникальный номер.
P/S: Умные идеи с изменением структруры ключа Client.ByName, что бы сделать их уникальным и так понятны, можно не предлагать.
А вот это - жизнь заставила! В MySql, если не делать составной ключ в броузе (точно как в Вашем случае -имя и номер), оставить только имя, то при скролинге мышкой - начинает множаться (визуально) записи в броузе. Пришлось во всех броузах, где есть поля не уникальные (типа названий) делать составной ключ, содержащий имя и уникальный номер.


Алексей