Страница 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)
Что я делаю не так? :???:

Добавлено: 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 все и делается.