Список форумов BOSSForum.RU - Форум. БОСС-Кадровик
Независимый форум, посвященный системе БОСС-Кадровик
и всему, что с ней связано
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Распознавание конца курсора STABLE

 
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык
Предыдущая тема :: Следующая тема  
Автор Сообщение
tveritin



Зарегистрирован: 26.01.2016
Сообщения: 180
Откуда: Санкт-Петербург

СообщениеДобавлено: Чт Сен 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` ?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
tveritin



Зарегистрирован: 26.01.2016
Сообщения: 180
Откуда: Санкт-Петербург

СообщениеДобавлено: Сб Сен 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
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
superjek



Зарегистрирован: 04.04.2022
Сообщения: 25

СообщениеДобавлено: Вт Сен 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

СообщениеДобавлено: Вт Сен 19, 2023 12:47    Заголовок сообщения: Ответить с цитатой

Если в запросе нужно сравнить две строки, то можно использовать команду LEAD

https://learn.microsoft.com/ru-ru/sql/t-sql/functions/lead-transact-sql?view=sql-server-2017
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Pоwerеd by рhpВB © 2001, 2005 рhpВB Grouр
Русская поддержка phрВB
Rambler's Top100 Рейтинг@Mail.ru Список форумов BOSSForum.RU