Страница 1 из 2
Помогите с позиционированием записи...
Добавлено: 03 окт 2005, 12:41
DarkAngel27
Галактика 7.12 пишу следующий код на VIP:
Код: Выделить всё
if getfirst hdr_ps=tsOK then
if getfirst ps_lines=tsOK then
If getfirst katmc1=tsOK then
{
} while ((pos(upcase('В'),upcase(katmc1.name))=1 <>tsOK) and (getnext katmc1=tsOK))
В 7.11 позиционирование происходило нормально. В 7.12 позиционируется только если нужная запись стоит последней.
Если добавить в фильтр запроса эту строчку, то вообще ничего не выгружается:
(pos(upcase('В'),upcase(katmc1.name))=1 <>tsOK)
Что я делаю не так?
![Confused :???:](./images/smilies/082.gif)
Добавлено: 03 окт 2005, 12:45
Алексей
А почему бы это условие не наложить в логической таблице и делать по ней простой _Loop ?
Добавлено: 03 окт 2005, 13:02
DarkAngel27
В таблице должна проиходить модификация. В _loop этого не рекомендуют делать. Приходится по старинке делать.
Добавлено: 03 окт 2005, 13:08
Алексей
External _Loop
и все дела.
Добавлено: 03 окт 2005, 13:09
Алексей
на крайний случай подцепи по нреку синоним.
луп делай по одному, а апдейт по другой.
Добавлено: 03 окт 2005, 13:24
Goblin
В _loop не рекомендуется делать модификацию полей , входящих в сегменты индекса, по которому делается проход. Все остальные поля модифицировать - ради бога ...
Добавлено: 03 окт 2005, 15:22
DarkAngel27
А без _loop обойтись никак нельзя?
Добавлено: 03 окт 2005, 15:29
edward_K
а в сапорте то выбора проходит?
и зачем писать
(pos(upcase('В'),upcase(katmc1.name))=1 <>tsOK)
булиновское значение сравниваете с word
pos=1 уже тогда нужно взять в скобки навсяк случай
эт наверное правильнее
pos(upcase('В'),upcase(katmc1.name))<>1
а быстрее будет
upcase(substr(katmc1.name,1,1))<>'B'
Добавлено: 03 окт 2005, 16:36
DarkAngel27
Код: Выделить всё
(pos(upcase('В'),upcase(katmc1.name))=1 <>tsOK)
Это действительно была моя глупость.
Меня другое интересует: В этом куске кода
Код: Выделить всё
while ((pos(upcase('В'),upcase(katmc1.name))<>1) and (getnext katmc1=tsOK))
я перескакиваю на идущую далее запись, как сделать так, чтобы он не перепрыгивал далее, а оставался на записи, в которой нашёл 'В'?
Добавлено: 03 окт 2005, 17:10
edward_K
вопрос в порядке обработки
я бы сделал
do {
if pos(upcase('В'),upcase(katmc1.name))=1 then break ;
} while getnext katmc1=0 ;
так надежней и проще для понимания.
а можно и так(тут уж контекста зависит)
if getfirst katmc where (( 'B' <<= katmc.name and
'BЯ'>>=katmc.name ))=0
{
}
Добавлено: 18 окт 2005, 12:15
DarkAngel27
а в сапорте то выбора проходит?
В Support выгрузка работает...
Добавлено: 25 окт 2005, 13:27
Maverick
edward_K писал(а):
if getfirst katmc where (( 'B' <<= katmc.name and
'BЯ'>>=katmc.name ))=0
однозначно работать не будет. конструкци <<= >>= используется только для последнего сегмента индекса. Если сегмент всего 1, конструкция неприменима
Добавлено: 25 окт 2005, 13:37
edward_K
не знаю как у вас, у меня вроде прокатывает - поскольку слова последнего касаются не сегмента индекса, а условия по индексу.
в сапорте выполните
select katmc.name where (( 'B' <<= katmc.name and 'BЯ'>>=katmc.name )) ;
Добавлено: 25 окт 2005, 13:44
Maverick
Попробуйте то же самое выполнить в ВИП
Добавлено: 25 окт 2005, 19:00
DarkAngel27
Попробуйте то же самое выполнить в ВИП
Так на Vip все и делается.