#### SQL интерпретатор для обработки DBF

Данный интерпретатор выполнен в стиле FOXPRO и почти полностью совместим с ним (несколько фенечек просто не доделаны), дальнейшее развитие этого интерпретатора зависит от его "полезности", т.е. насколько он актуален и нужен решать вам - писателям на clip. Надо будет обеспечить полную поддержку SQL-XX, значит будет делаться и добиваться. В данный момент мы считаем, что реализованных возможностей вполне достаточно для обеспечения "генераторов отчетов" и т.п. альтернативным механизмом доступа к данным.

Чтобы использовать интерпретатор в программе надо подключить foxsql.ch и далее использовать команды:
create table
insert into
select from.
Подробнее ссылка на кусок документации из FOXPRO. В данный момент не поддерживается только UNION в команде select from и небольшая неточность в именовании результирующих вычисляемых колонок: foxpro именует колонки sum(f) как sum_f, clip же именует ВСЕ вычисляемые колонки как EXP_A,EXP_B,EXP_C,..... .

### Библиотеки и классы для работы с SQL-серверами

     Класс TConnect
     Класс TRowset

     СУБД Postgres
     СУБД MySQL
     СУБД Oracle

Класс TConnect - обзор

Методы класса

     ConnectNew()       Конструктор TConnect
     Command()          Выполняет оператор SQL
     TestParser()       Парсер команды (отладочная функция)
     CreateRowset()     Создает объект класса TRowset
     Destroy()          Уничтожает объект

Класс TConnect
Представляет объекты - подключения к СУБД.

Конструктор TConnect производит подключение (login) к базе данных. С этим подключением можно делать две вещи. Во-первых, выполнять операторы SQL, ничего не возвращающие (такие как CREATE TABLE, COMMIT). Во-вторых, можно создавать объекты - наборы записей, получающиеся при выполнении операторов SELECT. О работе с такими объектами - наборами записей, смотрите документацию по классу TRowset.
По окончании работы с подключением объект TConnect следует уничтожить. При этом производится отключение (logout) от базы данных.

См. также: Класс TRowset

ConnectNew()
Создает объект класса TConnect.

Синтаксис
ConnectNew(<rdbmsId>,[<RDBMS specific>,...]) --> коннект
Аргументы
<rdbmsId> - строка, идентифицирующая СУБД.
<RDBMS specific> - параметры для подключения к конкретной СУБД.
Возвращаемое значение
ConnectNew возвращает объект класса TConnect, необходимый для дальнейшего взаимодействия с сервером.
Описание
Функция устанавливает соединение с сервером базы данных и создает объект - соединение. После окончания работы с сервером объект должен быть уничтожен при помощи метода Destroy. В случае возникновения ошибки подключения генерируется ошибка.
Об особенностях использования ConnectNew для разных СУБД, смотрите соответствующие этим СУБД разделы документации.
Пример
В этом примере производится подключение к базе данных mydb базы данных Postgres. Остальные специфичные для Postgres параметры используются по умолчанию.

    conn := ConnectNew("PG",,,,,"mydb")

См. также: [ TConnect:Destroy() ]

Command()
Выполняет оператор SQL.

Синтаксис
Command(<sql>,[<pars>]) --> кол-во записей
Аргументы
<sql> - оператор SQL
<pars> - массив параметров SQL
Возвращаемое значение
Command() возвращает кол-во записей, на которые воздействовала команда (affected rows).
Описание
Метод Command() используется для выполнения любых операторов SQL, понятных серверу базы данных, за исключением SELECT. Для выполнения оператора SELECT с получением результатов работы запроса используйте метод CreateRowset. Если оператор по какой-то причине не может быть выполнен сервером, генерируется ошибка.
Необязательный параметр <pars> представляет собой массив параметров вида {{<parname>,<parvalue>}[,...]}.
Примеры
В этом примере производится подключение к базе данных mydb сервера Postgres и создается таблица mytable.

    conn := PG_ConnectNew(,,,,"mydb")
    conn:Command("CREATE TABLE mytable (fname char(20),lname char(20))")

В следующем примере из таблицы mytable удаляются все записи, в которых поле fname имеет значение John.

    conn:Command("DELETE FROM mytable WHERE fname=:firstname",
       {{"firstname","John"}})

См. также:[ CreateRowset() ]

TestParser()
Парсер команды (отладочная функция).

Синтаксис
TestParser(<sql>,[<pars>]) --> SQL
Аргументы
<sql> - оператор SQL
<pars> - массив параметров SQL
Возвращаемое значение
TestParser() возвращает отпарсенную команду (SQL-оператор).
Описание
Метод TestParser() используется при отладке программы. Полезен для составления SQL операторов с параметрами для серверов, не поддерживающих механизм передачи параметров операторам (таким как Postgres и MySQL).
Возвращаемая строка представляет собой оператор, фактически передаваемый серверу.
Необязательный параметр <pars> представляет собой массив параметров вида {{<parname>,<parvalue>}[,...]}.
Примеры

    conn := PG_ConnectNew(,,,,"mydb")
    conn:TestParser("SELECT * FROM test WHERE fname=:p1",{{"p1","Вася"}})

См. также:[ CreateRowset() ]

CreateRowset()
Выполняет оператор SELECT и создает объект класса TRowset.

Синтаксис
CreateRowset(<selectSQL>,[<pars>],[<insertSQL>], [<deleteSQL>],[<updateSQL>]) --> набор записей
Аргументы
<selectSQL> - оператор SELECT для получения записей
<pars> - массив параметров SQL
<insertSQL> - оператор INSERT для добавления записи
<deleteSQL> - оператор DELETE для удаления записи
<updateSQL> - оператор UPDATE для изменения записи
Возвращаемое значение
CreateRowset() возвращает объект класса TRowset.
Описание
CreateRowset() выполняет запрос <selectSQL>, получает результирующий набор записей и возвращает объект класса TRowset. Операторы <insertSQL>,<deleteSQL>, <updateSQL> (если определены) используются для отражения в базе данных изменений, производимых с набором записей. Смотрите описание класса TRowset.
Необязательный параметр <pars> представляет собой массив параметров вида {{<parname>,<parvalue>}[,...]}.
После окончания работы с набором записей объект следует уничтожить при помощи метода Destroy().
Пример
В этом примере производится подключение к базе данных mydb базы данных Postgres и создается объект TRowset с записями из таблицы mytable.

    conn := PG_ConnectNew(,,,,"mydb")
    rs := conn:CreateRowset("SELECT oid,fname,lname FROM mytable",NIL,;
       "INSERT INTO mytable (%FIELDS) VALUES (%VALUES)",;
       "DELETE FROM mytable WHERE oid=:oid",;
       "UPDATE mytable SET %LIST WHERE oid=:oid")

См. также: [ TRowset ] [ TRowset:Destroy() ]

Destroy()
Уничтожает объект TConnect.

Синтаксис
Destroy() --> NIL
Описание
Destroy() уничтожает объект класса TConnect.
Пример В этом примере производится подключение к базе данных mydb базы данных Postgres. После выполнения некоторых работ объект TConnect уничтожается.

    conn := ConnectNew("PG",,,,,"mydb")
    ...
    conn:Destroy()

Класс TRowset - обзор

Экспортируемые переменные

     insertSQL   Оператор SQL для отражения в базе данных
     deleteSQL   Оператор SQL для отражения в базе данных
     updateSQL   Оператор SQL для отражения в базе данных

Методы класса

     Bof()        Определяет достижение начала набора записей
     Eof()        Определяет выход за последнюю запись
     Recno()      Возвращает номер текущей записи
     Lastrec()    Определяет число записей в наборе записей
     NFields()    Определяет число полей в наборе записей
     FieldNo()    Возвращает порядковый номер поля по его имени
     FieldName()  Возвращает имя поля по его порядковому номеру
     FieldType()  Возвращает тип поля по его порядковому номеру
     FieldLen()   Возвращает длину поля по его порядковому номеру
     GetValue()   Возвращает значение поля по его порядковому номеру
     SetValue()   Устанавливает значение поля с указанным порядковым номером
     Append()     Добавляет запись к набору записей
     Delete()     Удаляет текущую запись
     Read()       Возвращает значения полей текущей записи
     Write()      Устанавливает значения полей текущей записи
     GoTop()      Перемещает указатель на первую запись
     GoBottom()   Перемещает указатель на последнюю запись
     Skip()       Перемещает указатель относительно текущей записи
     Goto()       Перемещает указатель на запись с заданным номером
     FieldBlock() Возвращает блок кода для доступа к полю набора записей
     Browse()     Просмотр записей в окне
     Destroy()    Уничтожает объект

Класс TRowset
Представляет объекты - наборы записей

Набор записей - это совокупность записей, выбранных из базы данных посредством SQL-оператора SELECT. Хранилищем набора записей является оперативная память хоста, на котором работает приложение Клиппера, в отличие от таблиц базы данных, хранящихся на сервере. Методы объекта TRowset для манипулирования набором записей напрямую не воздействуют на таблицы базы данных. Но, как будет показано ниже, существует механизм, позволяющий отражать все изменения набора записей в базе данных.
Класс TRowset предоставляет интерфейс для навигации по записям, доступа к полям текущей записи, удаления, добавления записей. Конструктором объекта класса TRowset является метод класса TConnect CreateRowset(). То есть для работы с набором записей необходимо вначале создать подключение к базе данных.
Все изменения набора записей (такие как изменение значений полей, удаление и добавление записи) могут автоматически отражаться в базе данных. Для этого конструктору TConnect:CreateRowset() помимо оператора SELECT, использующегося для выборки необходимых записей из базы данных, необходимо передать операторы INSERT, DELETE ... WHERE и UPDATE ... WHERE. В дальнейшем эти операторы будут использоваться для автоматического отражения изменений в базе данных. Параметры операторов связываются автоматически в соответствии с именами полей.
Например, оператор для отражения в базе данных добавления новой записи к набору может выглядеть следующим образом:
INSERT INTO mytable (fname,lname) VALUES (:fname,:lname)
Здесь, при связывании параметры :fname и :lname примут текущие значения соответствующих им полей fname и lname текущей записи набора.
Оператор для отражения в базе данных изменений текущей записи в наборе может выглядеть так:
UPDATE mytable SET fname=:fname,lname=:lname WHERE ...
Здесь, условие WHERE должно идентифицировать конкретную запись базы данных, подлежащую изменению (если не будет условия WHERE про'UPDATE'тятся все записи таблицы mytable). Каким же образом идентифицировать запись базы данных, подлежащую UPDATE'у или DELETE'у? Ответ на этот вопрос зависит от используемой базы данных. Обратитесь за ним к соответствующим разделам помощи. Рассмотрим далее только самый "правильный" случай, используемый в таких базах данных как Postgres и Oracle. Эти базы данных для каждой записи таблицы хранят уникальное значение, однозначно идентифицирующее зту запись. Обратите внимание, эти значения не имеют ничего общего с понятием первичного ключа, для формирования этих уникальных значений не нужно писать никаких триггеров, и они не являются собственно полями таблицы (в том смысле что их не указывают в операторе CREATE TABLE ... и их нельзя получить оператором SELECT * FROM ...). Тем не менее они существуют и доступны при явном упоминании их в SELECT'е. В Postgres это поле называется oid, в Oracle - rowid.
Например, для выбора записей из таблицы mytable базы данных Postgres нужно явно перечислить все необходимые поля:
SELECT oid,fname,lname FROM mytable
Теперь набор записей содержит поле oid, позволяющее однозначно ссылаться на нужную запись базы данных.
Для удобства записи операторов отображения могут использоваться макросы %LIST, %FIELDS, %VALUES.
Макрос %LIST расширяется в последовательность присваивани й вида fieldname1=:fieldname1, fieldname2=:fieldname2, ....
Макрос %FIELDS расширяется в последовательность имен полей вида fieldname1, fieldname2, ....
Макрос %VALUES расширяется в последовательность имен параметров SQL вида :fieldname1, :fieldname2, ....
Подробнее об использовании макросов, смотрите описание операторов отображения insertSQL, updateSQL.
Итак, приведем пример конструктора набора записей из таблицы базы данных Postgres:

    // Производим подключение к базе данных
    conn := ConnectNew("PG",,,,,"mydb")
    // Создаем объект класса TRowset, представляющий все записи
    // таблицы mytable
    rs := conn:CreateRowset("SELECT oid,fname,lname FROM mytable",NIL,;
       "INSERT INTO mytable (%FIELDS) VALUES (%VALUES)",;
       "DELETE FROM mytable WHERE oid=:oid",;
       "UPDATE mytable SET %LIST WHERE oid=:oid")

Следующий пример выводит на экран все записи вышеуказанного набора:

    DO WHILE !rs:Eof()
       data := rs:Read()
       ? data:oid,data:fname,data:lname
       rs:Skip()
    ENDDO

См. также: Класс TConnect

insertSQL
Содержит SQL-оператор INSERT, необходимый для отражения изменений набора записей в базе данных.

insertSQL инициализируется конструктором TConnect:CreateRowset. Этот оператор на языке SQL используется для отражения добавления записи в базе данных. Оператор может содержать лишь параметры с именами синтаксически равными именам полей набора записей. Оператор выполняется неявно классом TRowset при выполнении метода Append(). TRowset сам связывает SQL-параметры со значениями полей набора.
В случае если insertSQL == NIL, отражение добавления записи в базе данных не производится. То есть добавленные записи будут только в наборе записей, но не в таблицах базы данных.
Пример:

     INSERT INTO mytable (fname,lname) VALUES (:fname,:lname)

В ординарных ситуациях Ваш insertSQL должен иметь точно такой же вид, за исключением имен полей и параметров.
Для удобства написания оператора могут использоваться макросы %FIELDS и %VALUES. Например, вышеприведенный пример может быть записан так:

     INSERT INTO mytable (%FIELDS) VALUES (%VALUES)

Записанный таким образом insertSQL гораздо гибче, так как INSERT INTO проинициализирует лишь поля, присутствующие в массиве, переданном методу Append(). Но в этом случае методу Append() нельзя передавать пустой массив, то есть невозможно будет добавить пустую запись.

См. также: [ Append() ] [ Обзор TRowset ]

deleteSQL
Содержит SQL-оператор DELETE ... WHERE, необходимый для отражения изменений набора записей в базе данных.

deleteSQL инициализируется конструктором TConnect:CreateRowset. Этот оператор на языке SQL используется для отражения удаления записи в базе данных. Оператор выполняется неявно классом TRowset при выполнении метода Delete(). Об особенностях использования механизма отражения удаления записи в базе данных конкретной СУБД, смотрите соответствующий раздел документации.
В случае если deleteSQL == NIL, отражение удаления записи в базе данных не производится. То есть записи будут удаляться только в наборе записей, но не в таблицах базы данных.
Пример для СУБД Postgres:

    DELETE FROM mytable WHERE oid=:oid

Пример для СУБД Oracle:

    DELETE FROM mytable WHERE rowid=:rowid

В ординарных ситуациях Ваш deleteSQL должен иметь точно такой же вид, за исключением имени таблицы.

См. также: [ Delete() ] [ Обзор TRowset ]

updateSQL
Содержит SQL-оператор UPDATE ... WHERE, необходимый для отражения изменений набора записей в базе данных.

updateSQL инициализируется конструктором TConnect:CreateRowset. Этот оператор на языке SQL используется для отражения изменения записи в базе данных. Оператор может содержать лишь параметры с именами синтаксически равными именам полей набора записей. Оператор выполняется неявно классом TRowset при выполнении метода Write(). TRowset сам связывает SQL-параметры со значениями полей набора.
Об особенностях использования механизма отражения изменения записи в базе данных конкретной СУБД смотрите соответствующий раздел документации.
В случае если updateSQL == NIL, отражение изменения записи в базе данных не производится. То есть записи будут изменены только в наборе записей, но не в таблицах базы данных.
Пример для СУБД Postgres:

    UPDATE mytable SET fname=:fname,lname=:lname WHERE oid=:oid

Пример для СУБД Oracle:

    UPDATE mytable SET fname=:fname,lname=:lname WHERE rowid=:rowid

В ординарных ситуациях Ваш updateSQL должен иметь точно такой же вид, за исключением имен таблицы, полей и параметров.
Для удобства написания оператора может использоваться макрос %LIST. Например, вышеприведенный пример может быть записан так:

    UPDATE mytable SET %LIST WHERE rowid=:rowid

Записанный таким образом updateSQL гораздо гибче, так как UPDATE присвоит новые значения лишь полям, присутствующим в массиве, переданном методу Write(). Но в этом случае методу Write() нельзя передавать пустой массив, то есть невозможно будет обнулить запись.

См. также: [ Обзор TRowset ]

Bof()
Определяет достижение начала набора записей.

Синтаксис
Bof() --> признак начала набора
Возвращаемое значение
Bof() возвращает .T. после того как была предпринята попытка перемещения указателя в обратном направлении за первую запись набора. Если в наборе нет ни одной записи, Bof() возвращает .T.
В других случаях Bof() возвращает .F.
Описание
Bof() используется для проверки условия достижения границ набора записей при перемещении указателя записи в обратном направлении при помощи метода Skip(). После того, как признак начала установился, он остается до тех пор, пока не будет очередного перемещения указателя.
Пример
Следующий фрагмент печатает записи в обратном порядке:

    rs := conn:CreateRowset("SELECT * FROM mytable")
    rs:GoBottom()
    DO WHILE !rs:Bof()
       data := rs:Read()
       ? data:fname,data:lname
       rs:Skip(-1)
    ENDDO

См. также: [ Eof() ] [ Skip() ]

Eof()
Определяет выход за последнюю запись набора записей.

Синтаксис
Eof() --> признак конца набора
Возвращаемое значение
Eof() возвращает .T. при попытке переместить указатель за последнюю запись набора.
Если в наборе нет ни одной записи, Eof() возвращает .T.
В других случаях Eof() возвращает .F.
Описание
Eof() используется для проверки условия достижения границ набора записей при перемещении указателя записи при помощи метода Skip(). После того, как признак конца установился, он остается до тех пор, пока не будет очередного перемещения указателя.
Пример
Следующий фрагмент печатает все записи набора:

    rs := conn:CreateRowset("SELECT * FROM mytable")
    DO WHILE !rs:Eof()
       data := rs:Read()
       ? data:fname,data:lname
       rs:Skip()
    ENDDO

См. также: [ Bof() ] [ Skip() ]

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

Синтаксис
Recno() --> номер записи
Возвращаемое значение
Recno() возвращает номер текущей записи в наборе. Если в наборе нет ни одной записи, Recno() возвращает 0.
Описание
Recno() используется для определения номера текущей записи в наборе.
Пример

       ? rs:Recno()

Lastrec()
Возвращает количество записей в наборе.

Синтаксис
Lastrec() --> количество записей
Возвращаемое значение
Lastrec() возвращает количество записей в наборе. Если в наборе нет ни одной записи, Lastrec() возвращает 0.
Описание
Lastrec() используется для определения количества записей в наборе.
Пример

       ? rs:Lastrec()

NFields()
Возвращает количество полей в записи набора.

Синтаксис
NFields() --> количество полей
Возвращаемое значение
NFields() возвращает количество полей в записи набора.
Описание
NFields() используется для определения количества полей в записи набора.
Пример

       ? rs:NFields()

FieldNo()
Возвращает порядковый номер поля по его имени.

Синтаксис
FieldNo(<fieldname>) --> номер поля
Аргументы
<fieldname> - имя поля.
Возвращаемое значение
FieldNo() возвращает порядковый номер поля с именем <fieldname>.
Описание
FieldNo() используется для определения порядкого номера поля с именем <fieldname>.
Пример

       ? rs:FieldNo("fname")

См. также: [ FieldName() ]

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

Синтаксис
FieldName(<fieldno>) --> имя поля
Аргументы
<fieldno> - номер поля.
Возвращаемое значение
FieldName() возвращает имя поля с порядковым номером <fieldno>.
Описание
FieldName() используется для определения имени поля с порядковым номером <fieldno>.
Пример

       ? rs:FieldName(3)

См. также: [ FieldNo() ]

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

Синтаксис
FieldType(<fieldno>) --> тип поля
Аргументы
<fieldno> - номер поля.
Возвращаемое значение
FieldType() возвращает тип поля с порядковым номером <fieldno>.
Описание
FieldType() используется для определения типа поля в терминах используемой СУБД, а не Клиппера. Возвращаемое значение представляет собой 4-х байтовое целое, а не один символ, как в функции Клиппер VALTYPE(). Реализации DBFSQL для разных СУБД комплектуются соответствующими заголовочными (.CH) файлами, содержащими символические имена типов используемой СУБД.
Пример

       ? rs:FieldType(3)

См. также: [ FieldName() ]

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

Синтаксис
FieldLen(<fieldno>) --> длина поля
Аргументы
<fieldno> - номер поля.
Возвращаемое значение
FieldLen() возвращает длину поля с порядковым номером <fieldno>.
Описание
FieldLen() используется для определения длины поля в терминах используемой СУБД, а не Клиппера. Например, для поля типа float8 таблицы Postgres FieldLen() вернет 8, для float4 - 4.
Пример

       ? rs:FieldLen(3)

См. также: [ FieldName() ]

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

Синтаксис
GetValue(<fieldno>) --> значение поля
Аргументы
<fieldno> - номер поля.
Возвращаемое значение
GetValue() возвращает значение поля с порядковым номером <fieldno>.
Описание
GetValue() не обращается к серверу.
Типы RDBMS преобразуются к типам Clipper. См. таблицу "Реализованные типы" в описании особенностей реализации конкретной RDBMS.
Пример

       ? rs:GetValue(3)

См. также: [ SetValue() ]

SetValue()
Устанавливает значение поля с указанным порядковым номером.

Синтаксис
SetValue(<fieldno>,<value>) --> NIL
Аргументы
<fieldno> - номер поля.
<value> - значение.
Описание
SetValue() не обращается к серверу. Для автоматического отображения изменений в базе данных используйте метод TRowset:Write().
Типы RDBMS преобразуются к типам Clipper. См. таблицу "Реализованные типы" в описании особенностей реализации конкретной RDBMS.
Пример

    ? rs:SetValue(3,"Вася")
    ? rs:SetValue(4,"Пупкин")
    rs:Write(rs:Read()) // выполнить updateSQL (если задан) на сервере

См. также: [ GetValue() ]

Append()
Добавляет запись к набору записей.

Синтаксис
Append(<data>) --> NIL
Аргументы
<data> - ассоциативный массив со значениями полей. Если ни один злемент <data> не соответствует именам полей набора, добавляется пустая запись.
Описание
Append() добавляет новую запись к набору. Поля новой записи инициализируются значениями из массива <data>. Кроме того, производится попытка автоматического отражения при помощи оператора insertSQL.
В случае, если в операторе insertSQL используются макросы %FIELDS и %VALUES, добавление пустой записи запрещено (хотя бы один злемент <data> должен иметь имя одного из полей набора).
Указатель записи в наборе перемещается на зту новую пустую запись. Значение Lastrec() при этом увеличивается на 1. BOF() и EOF() сбрасываются в .F.
Пример
В данном примере создается набор записей из таблицы mytable, с возможностью добавления записей в базу данных. Создается массив <data> соответствующий полям набора, и добавляется новая запись. При этом на сервере выполняется оператор
"INSERT INTO mytable (fname,lname) VALUES (:fname,:lname)",
со значениями параметров :fname="John" и :lname="Smith".

    rs := conn:CreateRowset("SELECT fname,lname FROM mytable",NIL,;
    	  "INSERT INTO mytable (%FIELDS) VALUES (%VALUES)")
    data := map()
    data:fname := "John"
    data:lname := "Smith"
    rs:Append(data)

См. также: [ insertSQL ] [ Обзор TRowset ]

Delete()
Удаляет текущую запись.

Синтаксис
Delete() --> NIL
Описание
Delete() удаляет текущую запись в наборе. Кроме того, производится попытка автоматического отражения удаления в базе данных при помощи оператора deleteSQL.
Если удаляется не последняя запись в наборе, Recno() не изменяется. Если удаляется последняя запись в наборе, Recno() уменьшается на единицу.
Если удаляется единственная запись в наборе, BOF() и EOF() устанавливаются в .T., в противном случае BOF() и EOF() сбрасываются в .F.
Пример
В данном примере создается набор записей из таблицы mytable базы данных Postgres с возможностью удаления записей в базе данных. Удаляется запись в наборе, при этом на сервере выполняется оператор

    DELETE FROM mytable WHERE oid=:oid

со значением параметра :oid равным значению поля oid текущей записи в наборе.

    rs := conn:CreateRowset("SELECT oid,fname,lname FROM mytable",NIL,NIL,;
    	  "DELETE FROM mytable WHERE oid=:oid")
    rs:Delete()

См. также: [ deleteSQL ] [ Обзор TRowset ]

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

Синтаксис
Read() -> ассоциативный массив со значениями полей текущей записи.
Возвращаемое значение
Read() возвращает массив со значениями полей.
Описание
Read() возвращает ассоциативный массив структуры, соответствующей структуре записи, содержащий значения всех полей записи.
Пример
В данном примере создается набор записей из таблицы mytable и выводятся на зкран все записи набора.

    rs := conn:CreateRowset("SELECT fname,lname FROM mytable")
    DO WHILE !rs:Eof()
       data := rs:Read()
       ? data:fname,data:lname
       rs:Skip()
    ENDDO

См. также: [ Write() ] [ Обзор TRowset ]

Write()
Устанавливает значения полей текущей записи.

Синтаксис
Write(<data>) --> NIL
Аргументы
<data> - ассоциативный массив со значениями полей. Если ни один злемент <data> не соответствует именам полей набора, запись обнуляется.
Описание
Write() изменяет значения полей текущей записи. Полям записи присваиваются значения из массива <data>. Кроме того, производится попытка автоматического отражения изменения в базе данных при помощи оператора updateSQL.
В случае, если в операторе updateSQL используется макрос %LIST, обнуление записи запрещено (хотя бы один злемент <data> должен иметь имя одного из полей набора).
Пример
В данном примере создается набор записей из таблицы mytable базы данных Postgres с возможностью изменения записей в базе данных. Создается массив <data> соответствующий полям набора и текущая запись устанавливается значениями из этого массива. При этом на сервере выполняется оператор
"UPDATE mytable SET fname=:fname WHERE oid=:oid",
со значением параметра :fname="John".

    rs := conn:CreateRowset("SELECT fname,lname FROM mytable",NIL,NIL,NIL,;
    	  "UPDATE mytable SET %LIST WHERE oid=:oid")
    data := map()
    data:fname := "John"
    rs:Write(data)

См. также: [ Read() ] [ updateSQL ] [ Обзор TRowset ]

GoTop()
Перемещает указатель на первую запись.

Синтаксис
GoTop() --> NIL
Описание
Если в наборе нет ни одной записи, функция ничего не делает. В противном случае RecNo() возвращает 1, BOF() и EOF() сбрасываются в .F.
Пример

    rs := conn:CreateRowset("SELECT * FROM mytable")
    ...
    rs:GoTop()

См. также: [ Обзор TRowset ] [ Skip() ] [ GoBottom() ]

GoBottom()
Перемещает указатель на последнюю запись.

Синтаксис
GoBottom() --> NIL
Описание
Если в наборе нет ни одной записи, функция ничего не делает. В противном случае RecNo() возвращает значение равное Lastrec(), BOF() и EOF() сбрасываются в .F.
Пример

    rs := conn:CreateRowset("SELECT * FROM mytable")
    rs:GoBottom()

См. также: [ Обзор TRowset ] [ Skip() ] [ GoTop() ]

Skip()
Перемещает указатель относительно текущей записи.

Синтаксис
Skip(<rows>) --> число записей
Аргументы
<rows> - число записей, на которое должен переместиться указатель относительно текущей записи. Если <rows> < 0 перемещение производится в обратном направлении, если <rows>==0 перемещение не производится, если <rows> > 0 перемещение производится в прямом направлении.
Если аргумент опущен, производится перемещение на одну запись в прямом направлении.
Возвращаемое значение
Skip() возвращает число записей, на которое в действительности переместился указатель.
Описание
Skip() перемещает указатель на <rows> записей в прямом или обратном направлении. Если предпринята попытка переместиться за пределы набора, ABS(<rows>) < ABS(Skip(<rows>)), и устанавливается в .T. BOF() или EOF().
Пример

    rs := conn:CreateRowset("SELECT * FROM mytable")
    DO WHILE !rs:EOF()
       data := rs:Read()
       ? data:fname,data:lname
       rs:Skip()
    ENDDO

См. также: [ Обзор TRowset ] [ Bof() ] [ Eof() ]

Goto()
Перемещает указатель на запись с заданным номером.

Синтаксис
Goto(<row>) --> номер записи
Аргументы
<row> - номер записи, на которую должен переместиться указатель.
Возвращаемое значение
Goto() возвращает номер записи, на которую переместился указатель.
Описание
Goto() перемещает указатель на запись с номером <row>. Если <row> == 0 никаких действий не производится. Если <row> > Lastrec(), EOF() устанавливается в .T. и возвращается Lastrec(). Если <row> < 1, BOF() устанавливается в .T. и возвращается 1. В остальных случаях BOF() и EOF() сбрасываются в .F. и возвращается <row>.
Перед перемещением указателя Goto() также инициирует отражение изменений текущей записи в базе данных.
Пример

    rs := conn:CreateRowset("SELECT * FROM mytable")
    FOR I:=1 TO rs:Lastrec()
       rs:Goto(I)
       data := rs:Read()
       ? data:fname,data:lname
    NEXT

См. также: [ Обзор TRowset ] [ Recno() ] [ Lastrec() ]

FieldBlock()
Возвращает блок кода для доступа к полю набора записей.

Синтаксис
FieldBlock(<fieldno>) --> блок кода для доступа к полю
Аргументы
<fieldno> - порядковый номер поля, блок кода для доступа к которому требуется получить.
Возвращаемое значение
FieldBlock() возвращает блок кода для доступа к полю.
Описание
Если блоку передается параметр, значение поля набора изменяется на значение этого параметра. В противном случае блок кода возвращает значение поля.
Автоматического отображения изменения в базе данных не производится. Для отражения изменения в базе данных (для выполнения TRowset:updateSQL на сервере), необходимо вручную вызвать метод TRowset:Write(). См. пример.
Метод FieldBlock() по своему действию аналогичен стандартным функциям клиппера FieldBlock() и FieldWBlock().
Пример

    ? eval(rs:FieldBlock(2))      // показать значение 2-го поля
    eval(rs:FieldBlock(2),"Вася") // установить значение 2-го поля
    rs:Write(rs:Read())           // отобразить изменение на сервере

Browse()
Просмотр записей в окне.

Синтаксис
Browse([<nTop>],[<nLeft>],[<nBottom>],[<nRight>], [<asColumns>],[<asHeaders>],[<anWidths>]) --> NIL
Аргументы
<nTop>,<nLeft>,<nBottom>,<nRight> - координаты окна. По умолчанию 0,0,MAXRFOW(),MAXCOL().
<asColumns> - массив строк, определяющих имена полей набора, подлежащих выводу. По умолчанию все поля.
<asHeaders> - массив строк, определяющих заголовки столбцов. По умолчанию - имена полей.
<anWidths> - массив чисел, определяющих ширины столбцов. По умолчанию используются ширины полей первой попавшейся записи.
Описание
Browse() представляет собой простейший инструмент для интерактивной навигации по набору записей, без возможности редактирования, добавления и удаления записей.
Метод Browse() использует функцию SQLBrowse().
Вы можете написать свой browse и переопределить стандартный метод. См. пример.
Пример

    // foo.prg
    rs:Browse() // стандартный
    rs:Browse := @MyBrowse()
    rs:Browse() // ваш собственный MyBrowse()
    ...
    static function MyBrowse()
    // ваша реализация
    return
    // end of foo.prg

Destroy()
Уничтожает объект TRowset.

Синтаксис
Destroy() --> NIL
Описание
Destroy() уничтожает объект класса TRowset.
Пример

    rs := conn:CreateRowset("SELECT * FROM mytable")
    ...
    rs:Destroy()

См. также: [ TConnect:CreateRowset() ]

© Рушад Набиуллин, rust@itk.ru, 2000