Реферат: Как сделать двунаправленный запрос

Евгений Каратаев

Мне давно было интересно, можно ли сделать в 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"

--> ЧИТАТЬ ПОЛНОСТЬЮ <--

К-во Просмотров: 489
Бесплатно скачать Реферат: Как сделать двунаправленный запрос