Евгений Каратаев
Мне давно было интересно, можно ли сделать в Cache' такой запрос, чтобы его можно было бы прокручивать назад, например что-то вроде команды, парной к Fetch, например Prior. Собственные средства Cache' почему-то не предоставляют такой возможности. Для этого я изучил характер взаимодействия sql-движка с Cache Object Script. В результате исследований выяснилось, что это возможно, хотя и не столь гладко, как бы того хотелось. Надеюсь, читатель с пониманием отнесется к возникшей некрасивости.
Возьмем и сделаем рутину со следующим текстом:
run()
&sql(declare cur CURSOR for select ID, Name, Home
Возможно вы искали - Доклад: Индексы
from Sample.Person order by ID asc)
&sql(open cur)
&sql(fetch cur)
&sql(close cur)
q
Похожий материал - Реферат: Проектирование классов в шутку и всерьез
Скомпилируем и сохраним текст полученной int-рутины. После чего изменим рутину следующим образом:
run()
&sql(declare cur CURSOR for select ID, Name, Home
from Sample.Person order by ID desc)
&sql(open cur)
Очень интересно - Доклад: Интерфейсы как решение проблем множественного наследования
&sql(fetch cur)
&sql(close cur)
q
И также сохраним текст полученной int-рутины. В запросе можно использовать любую имеющуюся у Вас таблицу, просто в данном случае я использовал таблицу из штатного дистрибутива.
Сличим полученные тексты int-рутин. Ничего особенно романтичного в работе автоматического генератора не наблюдается, за исключением того, что сгенерированные тексты полностью совпадают за исключением замены операции $o() на $zp(), которые друг другу прямо противоположны по направлению. Таким образом, для реализации двунаправленной прокрутки используем оба варианта и попробуем совместить их данные, оставив и использовав коды (рутины) доступа.
Вам будет интересно - Доклад: Перспективные архитектуры генетического поиска
Для работы нам потребуются некие дежурные данные. Создаем новый класс, например User.NameList, наследник %Persistent и %Populate. Добавляем ему новое свойство Name:%String. Сохраняем, компилируем. В терминале создаем 10 объектов для теста:
d ##class(User.NameList).Populate()
Запускаем SQL Manager и для проверки что действительно создана таблица sql и содержит тестовые данные, выполняем запрос
select ID, Name from NameList.
Если все было в порядке, то будет показана табличка с двумя колонками и десятком строк. Имена англоязычные, вымышленные. Для проверки работы прокрутки в обе стороны создадим рутину (например FetchBack) с кодом
Похожий материал - Реферат: Решение задачи одномерной упаковки с помощью параллельного генетического алго-ритма
Test()
n ascHandle,descHandle,ascSelect,descSelect,
n ok,i,AtEnd,Row,ID,Name,State,ascClose,descClose
; первоначальноевыражение - "select ID, Name from NameList"