## Описание класса RDD

Класс для работы с данными. Хранит в атрибуте handle дескриптор открытой таблицы. Позволяет создавать объекты и работать с данными без использования алиасов.
Пример:

    // Создать объект
      r:=RDDNew()
    // Открыть таблицу и индекс
      r:open("DBF","table1.dbf")
      r:setindex("NTX","table1.ntx")
    // Создание объекта и сразу открытие таблицы
      r2:=RDDNew(,"table2.dbf")
      r2:setindex(,"table2.ntx")
    // Установить отношение
      r:setrelation(r2,"str(field1,1)+str(field2,10)")
      r:gotop()
    // Вывести в цикле поля обеих таблиц
      while .not. r:eof()
        Rec:=r:read()
        Rec2:=r2:read()
        ? Rec:field1+", "+Rec:field2+", "+Rec2:field2
        r:skip()
      enddo
    // Закрыть таблицы
      r:close()
      r2:close()

### Атрибуты/свойства

Название атрибута | Значение атрибута
--- | ---
handle | Дескриптор открытой таблицы данных. Если таблица не открыта или уже закрыта, равен NIL
table_driver | Имя драйвера таблиц данных по умолчанию. При создании объекта table_driver="DBF".
index_driver | Имя драйвера индексных файлов по умолчанию. При создании объекта index_driver="NTX".
memo_driver | Имя драйвера мемо-файлов по умолчанию. При создании объекта memo_driver="DBT".
shared | Режим открытия таблиц по умолчанию (Совместный доступ/Эксклюзивный режим). При создании объекта shared=.t. (Таблицы открываются в разделяемом режиме).
read_only | Режим открытия таблиц по умолчанию (Только для чтения/Для чтения-записи). При создании объекта read_only=.f. (Таблицы открываются для чтения-записи).
soft_seek | Режим индексного поиска по умолчанию. При создании объекта soft_seek=.t. (Если не нашли - встаем на ближайший больший ключ).
search_result | Хранит результат последнего поиска. Также доступно через метод found()

### Методы

#### append()

Добавляет пустую запись.

#### bof()

Возвращает .t. при достижении начала файла, иначе .f..

#### browse(top,left,down,right, fields, user_func, picts, headers, hsep,csep,fsep, footers)

Отображает данные в табличной форме, позволяет перемещаться по ним и просматривать (не позволяет редактировать).
top,left,down,right - координаты окна, в котором отображается
fields - массив, блоки кода,используемые как значения колонок для каждой выводимой строки. Если этот аргумент не определен, browse() выводит информацию всех полей таблицы, размещая ее по колонкам.
user_func - имя функции пользователя, которой передается управление при нажатии неопределенной клавиши или если клавиша не нажата. Имя функции определяется в виде символьного выражения без круглых скобок и аргументов. Поведение browse() зависит от того, определена функция пользователя или нет.
picts - параллельный массив, содержащий предложения PICTURE для форматирования каждой колонки. Если определить picts не в виде массива, а в виде строки, информация всех колонок будет выводиться в одном и том же формате.
headers - параллельный массив, содержащий символьные выражения, которые определяют заголовки каждой колонки. Для выдачи заголовков для отдельных колонок необходимо включить точку с запятой в выражение заголовка там, где требуется перенести текст на другую строку. Если параметр не задан, заголовки колонок выбираются из массива fields или заполняются именами полей текущей таблицы, если массив fields также не задан.
hsep - это параллельный массив, содержащий символьные выражения, символы, используемые для рисования горизонтальных линий, отделяющих заголовки колонок от области выдачи информации полей. Если задать hsep в виде строки, будет использован один и тот же разделитель для всех колонок. Если аргумент не задан, по умолчанию принимается двойная линия.
csep - это параллельный массив, содержащий символьные выражения, символы, используемые для рисования вертикальных линий, разделяющих колонки. Если задать csep в виде строки, будет использован один и тот же разделитель для всех колонок. Если аргумент не задан, по умолчанию принимается вертикальная линия.
fsep - параллельный массив, содержащий символьные выражения, которые определяют символы, используемые для рисования разделителей между завершающими колонки подписями и информацией полей. Если задать fsep в виде строки, будет использован один и тот же разделитель для всех колонок. Если аргумент не задан, по умолчанию принимается отсутствие разделителя (пробел).
footer - параллельный массив, содержащий символьные выражения, завершающие подписи для каждой колонки. Если аргумент задать не в виде массива, в качестве завершающей подписи для всех колонок будет использоваться одно и то же значение.

#### clearindex()

Закрывет все индексные файлы.

#### close()

Закрывает таблицу данных. Атрибут handle устанавливается в NIL.

#### continue()

Продолжает поиск, заданный в методе locate(). При этом применяется только условия поиска, никакие дополнительные параметры locate() не используются.

#### create(Driver,FName,Stru)

Создает таблицу данных со структурой, заданной в массиве Stru.
Driver - имя RDD-драйвера таблицы, FName - имя файла.

#### createindex(Driver,Name,Tag,Expr,Unique)

Создает индекс.
Driver - имя RDD-драйвера индексного файла.
Name - имя индексного файла.
Tag - имя тэга индекса.
Expr - индексное выражение.
Unique - определяет, создается индекс с уникальными ключами или нет.

#### creatememo(Driver,Name)

Создает MEMO-файл.
Driver - имя RDD-драйвера MEMO-файла.
Name - имя MEMO-файла.

#### deleted()

Влзвращает логическое значение, определяющее, помечена ли текущая запись для удаления или нет.

#### delete()

Помечает текущую запись для удаления.

#### eof()

Возвращает .t. при достижении конца файла, иначе .f..

#### fcount()

Возвращает количество полей текущей таблицы.

#### fieldname(FNo)

Возвращает имя поля по его порядковому номеру. Если нет такого поля, возвращает "".
FNo - порядковый номер требуемого поля.

#### fieldpos(FName)

Возвращает номер поля по его имени. Если нет такого поля, возвращает 0.
FName - имя требуемого поля.

#### found()

Возвращает результат последнего поиска - .t., если в результате seek(), locate() или continue() найдена искомая запись, иначе .f..

#### getvalue(Field)

Возвращает значение указанного поля.
Field - имя или порядковый номер требуемого поля.

#### gobottom()

Переход на последнюю запись файла.

#### goto(Rec)

Переход на запись с указанным номером.
Rec - физический номер записи, на которую надо перейти.

#### gotokey(KeyNo)

Переход на запись с указанным порядковым номером ключа.
KeyNo - номер ключа (логический номер записи в текущем индексе), на которую надо перейти.

#### gotop()

Переход на первую запись файла.

#### indexkey()

Возвращает индексное выражение текущего индекса.

#### keyno()

Возвращает логический номер записи (в текущем индексе).

#### lastkey()

Возвращает последний логический номер записи (в текущем индексе).

#### locate(sExpr,sWhile,nNext,nRec,lRest)

Производит последовательный поиск записей, удовлетворяющих условию.
sExpr - условие для поиска (строка).
sWhile - ограничивает область поиска - поиск выполняется, пока истинно условие sWhile.
nNext - определяет количество записей, начиная с текущей, используемых в процессе поиске.
nRec - номер обрабатываемой записи. Если задан, поиск проводится только в указанной записи.
lRest - если указан этот параметр, и равен .T., поиск идет с текущей записи до конца файла, иначе обрабатывается весь файл.

#### lastrec()

Возвращает последний физический номер записи.

#### open(Driver,Name,Shared,ReadOnly)

Открывает файл с указанным именем. Атрибут handle принимает значение дескриптора открытого файла.
Driver - имя RDD-драйвера данных.
Name - имя файла таблицы данных.
Shared - логическое значение, определяющее, открывать таблицу в разделяемом режиме (Shared=.t.) или в эксклюзивном (Shared=.f.)
ReadOnly - логическое значение, определяющее, открывать таблицу
только для чтения (ReadOnly=.t.) или для чтения и записи (ReadOnly=.f.)

#### read()

Читает запись. Возвращает объект, содержащий данные текущей записи. Структура объекта копируется из структуры записи, т. е. каждое поле становится атрибутом объекта.
Пример:

      R:=RDDNew("DBF","table1.dbf")
      Rec:=R:read()
      ? "Field1 is "
      ?? Rec:Field1
      ? "Field2 is "
      ?? Rec:Field2

#### recall()

Восстанавливает запись, помеченную для удаления.

#### recno()

Возвращает физический номер записи.

#### reindex()

Пересоздает открытые индексы.

#### rlock([nRecno],[lReleaseLocks]) -> lSuccess

Устанавливает блокировку записи с номером nRecno. Если параметр nRecno не указан, блокируется текущая запись. Параметр lReleaseLocks определяет, снимать при этом блокировки остальных записей или нет. По умолчанию lReleaseLocks = .T.

#### runlock([nRecno])

Снимает блокировку записи с номером nRecno. Если параметр nRecno не указан, снимается блокировка текущей записи. Если nRecno = 0, снимаются блокировки всех записей.

#### seek(Key,Soft,Last)

Ищет в индексном файле ключ с заданным значением.
Key - значение искомого ключа.
Soft - логическое значение, определяющее поведение указателя записи в случае безуспешного поиска. Если Soft=.t., указатель устанавливается на ближайшую запись с ключом, большим искомого, если же Soft=.f., указатель устанавливается на конец записи.
Last - если Last=.t., то в случае нахождения нескольких записей с искомым ключом указатель устанавливается на последнюю из них.

#### setfilter(Condition)

Устанавливает фильтр. Скрывает записи, не удовлетворяющие условию.
Condition - требуемое условие.

#### setindex(Driver,Name,Tag)

Открывает индексный файл.
Driver - имя RDD-драйвера индексного файла.
Name - имя файла таблицы данных.
Tag - имя тэга индекса.

#### setmemo()

#### setorder(Tag)

Устанавливает управляющий индекс и тэг.
Tag - номер индекса (номер тэга или его имя), который становится управляющим для данной таблицы.

#### indexord()

Возвращает номер текущего индекса.

#### setrelation(Child,Expr)

Устанавливет связь между двумя таблицами данных. При этом дочерняя таблица должна быть проиндексирована. При перемещении указателя в родительской таблице в дочернеей производится поиск по индексу указанного выражения.
Child - объект RDD, дочерняя таблица.
Expr - выражение, вычисляемое для родительской таблицы. Результат вычисления ищется по индексу в дочерней таблице.

#### setvalue(Field,Value)

Устанавливает значение указанного поля.
Field - имя или порядковый номер требуемого поля.
Value - значение, записываемое в поле.

#### skip(NumRecs)

Перемещает указатель текущей записи вперед или назад относительно текущего положения.
NumRecs - количество записей, на которое надо переместиться. Если NumRecs больше нуля, указатель перемещается вперед, если меньше нуля - назад.

#### struct()

Возвращает двумерный массив, содержащий структуру открытой таблицы данных. Каждый элемент массива содержит имя поля, тип его данных, размер и количество знаков в дробной части для числовых полей.

#### write(Rec)

Записывает данные в текущую запись.
Rec - объект, соответствующий записываемым данным. При соответствии имени атрибута и имени поля таблицы его значение записывается в поле.

#### zap()

Удаляет все записи из таблицы.

© Алексей М. Ткаченко, alexey@itk.ru, 2001