Независимый форум, посвященный системе БОСС-Кадровик и всему, что с ней связано
|
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Чт Сен 14, 2023 11:51 Заголовок сообщения: Распознавание конца курсора STABLE |
|
|
Есть конструкция.
Код: | Let i = 1;
STABLE @abc
SELECT * FROM const_uder where pid in (select pid from people where Auto_Card in (select Auto_Card from card where full_name='иванов и и')) and Auto_Const_Uder in (11111, 22222);
while i<= (SELECT count(*) FROM const_uder where pid in (select pid from people where Auto_Card in (select Auto_Card from card where full_name='иванов')) and Auto_Const_Uder in (11111, 22222)) then
execute
{
return '1'+@abc:5[''];
next @abc; Let i += 1;
return '2'+@abc:5[''];
previous @abc; Let i -= 1;
return '4'+@abc:5[''];
Let i += 1;
}; |
Вопрос как сделать что-то вроде count(@abc), чтобы не дублировать запрос в `while` ? |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Сб Сен 16, 2023 16:11 Заголовок сообщения: |
|
|
Не, всё-таки решил уйти от идеи использования sTable.
sTable с вложенными SCAN работает непредсказуемо.
Вернулся к использованию SCAN вместо sTable.
Толчком для идеи использования sTable была необходимость сравнения значений текущей записи с значениями СЛЕДУЮЩЕЙ записи запроса. Т.е, в каждом витке цикла иду последовательно по записям, но каждый раз перескакиваю "вперед" (Next), чтобы сравнить текущие значения со следующей записью. Потом возвращаюсь обратно на Previous-запись, чтоб не нарушать последовательность. Естественно, выполнение Next контролирую с помощью индекса `i`, чтоб не выйти за пределы курсора. Выполняю Next и Previous всегда, кроме случая, когда стою на последней записи. Но, при попадании на последнюю запись курсор закрывается. Причём, в идеальном примере без вложенных Scan-циклов всё работает. А в сложных конструкциях - нет. Хотя, это работающий с 2013 года отчет, других косяков, способных породить возможные ошибки при работе, нет. Там работает Scan внутри еще двух вложенных сканов.
Самый "верхний" scan хотел заменить на sTable для реализации вышеописанной задачи.
Я даже пробовал убирать конструкцию "запрыгивания" на следующую запись, просто оставив аналог Scan:
Код: | Let i = 1;
STABLE @abc
SELECT * FROM const_uder where pid in (select pid from people where Auto_Card in (select Auto_Card from card where full_name='иванов и и')) and Auto_Const_Uder in (11111, 22222);
while i<= (SELECT count(*) FROM const_uder where pid in (select pid from people where Auto_Card in (select Auto_Card from card where full_name='иванов')) and Auto_Const_Uder in (11111, 22222)) then
execute
{
......
Scan
{
Scan
{
...
};
...
};
if i<(SELECT count(*) FROM const_uder where pid in (select pid from people where Auto_Card in (select Auto_Card from card where full_name='иванов')) and Auto_Const_Uder in (11111, 22222)) then next @abc;
Let i += 1;
};
|
После 2 дней мытарств пришла мысль вернуться на исходное, но брать СЛЕДУЮЩУЮ запись для сравнения запросом вроде `select * from (sql_b) where rn=i+1`
Поскольку, без счётчика i уже не обойтись в любом случае и запрос я уже объявил с помощью Alias sql_b, чтоб не дублировать его по тексту, то осталось добавить запрос вида Код: | select * into _next_val from (sql_b) where rn=i+1 |
|
|
Вернуться к началу |
|
|
superjek
Зарегистрирован: 04.04.2022 Сообщения: 28
|
Добавлено: Вт Сен 19, 2023 09:50 Заголовок сообщения: |
|
|
по вопросу:
"Вопрос как сделать что-то вроде count(@abc), чтобы не дублировать запрос в `while` ?"
Можно использовать маску [x] запроса для получения количества записей
Код: | [x] (латинская) – число записей в базе данных, удовлетворяющих запросу (COUNT(*) или подсчет для UNION).
Пример:
Execute{
Local Stable @ss select * from xObjects;
Return @ss:[x];
};
|
В идеале для данной задачи использовать оконные функции LAG, LEAD из T-SQL для получения предыдущей и следующей записи |
|
Вернуться к началу |
|
|
RVV Большой шоколадный орден
Зарегистрирован: 14.01.2010 Сообщения: 449
|
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|