Курсор - это переменная, содержащая информацию о позиции в некотором файле базы данных. Эта информация включает в себя три аспекта
Селект - текущий индекс файла, а также значения нескольких первых полей этого индекса, с помощью которых сужен круг доступных записей файла.
Позиция - информация, позволяющая однозначно отыскать физическую запись по текущему индексу курсора.
Элемент - запись файла базы данных, соответствующая позиции в курсоре. Представляет собой набор значений полей.
Наглядно курсор можно представить себе так, как выглядит текущая запись в табличной зоне видео-окна. Селект здесь - это текущий ключ сортировки, а также наложенное на зону представление. Позиция - это табличный HighLight, т.е. выделенная цветом строка, вместо выделения цветом можно было бы применить любой способ, например специальный маркер на рамке зоны. Элемент - значения полей выделенной строки, т.е. собственно текст под HighLight.
Все манипуляции с записями файла базы данных выполняются с помощью курсоров. Например, функции ASL-языка SEARCH, FIRST и т.п. изменяют позицию в курсорах, а также прописывают в элемент считанную с диска запись. SELECT кроме этого изменяет состояние селекта. С помощью операции присваивания в языке можно изменить значение некоторого поля элемента курсора, а процедура REPLACE пропишет элемент на диск.
Для каждого файла можно создавать любое количество курсоров. Глобальных курсоров не существует. Во внутренней реализации курсоры заводятся всегда, когда нужно произвести какие-либо действия с записями файлов базы данных и сохранить информацию о позиции. Как минимум по одному курсору хранится в каждой зоне видео-окон, комплект курсоров создается на время работы программы и т.п.
В перспективе предполагается иметь в ASL-языке переменные типа "КУРСОР" и манипулировать с ними как с переменными - присваивать друг другу, передавать в процедуры в качестве параметров и т.п. Правда имеется ограничение - на самом низком системном уровне запрещено выполнять присвоение из курсора, имеющего "сырую" запись.
Каждый курсор принадлежит какой либо транзакции. Вследствие этого в некоторых случаях в курсорах может автоматически изменяться информация о позиции:
при выполнении процедуры модификации (REPLACE ) над одним из них все остальные моментально видят эти изменения. Например, если курсор зоны окна и курсор программы уровня поля, содержат одну и ту же позицию, то при выполнении языковой процедуры REPLACE мгновенно скорректируется информация о позиции в курсоре зоны.
при выполнении процедур удаления (REMOVE, REMSEL) или перемещения в другую половину файла (в архив FREEZE, из архива DEFROST) над одним из них во всех этих курсорах позиция станет неопределенной. Однако, языковые процедуры REMOVE, FREEZE, DEFROST после выполнения операции выполняют позиционирование в программном курсоре, поэтому, например, после выполнения REMOVE(File) текущей позицией в программном курсоре файла File станет следующая за удаленной позиция, но другие курсоры, ссылающиеся на эту же запись, получат неопределенную позицию - это, например, курсоры главной транзакции, если наша - подчиненная.
При откате уровня транзакции во всех курсорах данной транзакции, в которых выполнялись операции модификации или позиционирования на данном уровне, восстанавливается состояние, которое они имели к моменту начала этого уровня транзакции, причем элемент соответствует его дисковому значению. Это же касается и процедур модификации, при выполнении которых возникли ошибки - в соответствующих курсорах при откате уровня транзакции восстановятся дисковые значения элементов. Если ни модификации или позиционирования на данном уровне не выполнялось, то в курсорах не меняется ни позиция, ни значения полей, т.е. сырые записи остаются сырыми.
Как уже отмечалось выше, для каждого файла можно создавать любое количество курсоров. Однако, современный синтаксис языка не позволяет явно заводить переменные-курсоры. Наоборот, предполагается наличие в программе по одному курсору у каждого файла, которые заводятся автоматически, и доступ к ним осуществляется по имени файла. Каждая ASL-программа заводит собственный комплект курсоров. Позиции в этих курсорах на старте программ не определены, за исключением случаев:
определена позиция программных курсоров мастеров RTI.CurZone и RTI.TrgZone
если программа выполняется на транзакции интерактивного редактирования, то в программные курсоры копируются позиции соответствующих редактируемых в этой транзакции файлов. Например, входим в интерактивное редактирование записи файла RWayS, затем переходим в подчиненную зону с RWayJ, делаем вставку записи RWayJ, и программное событие OnBeforeInsert имеет доступ к вставленной записи в RWayJ и редактируемой записи RWayS.
В остальных случаях требуется предварительно выполнить в файле абсолютное позиционирование, либо получить позицию из видеосистемы, например, с помощью ACCESS.