Запросы
Запрос (QUERY) определяет набор данных для извлечения из базы данных. Он обеспечивает ту же функциональность, что и блоки доступа к данным DO, FOR и REPEAT. Основное отличие состоит в том, что набор результатов, определённый запросом, не ограничивается блоком, в котором он определен. Используя дескриптор запроса, вы можете получить доступ к запросу и его набору результатов из любого места вашего приложения. Это даёт вам возможность модульности вашего приложения способами, которые нельзя сделать с блочно-ориентированными наборами результатов.
Запросы придают языку доступа к данным следующие важные характеристики:
- Независимость от области действия — вы можете ссылаться на записи в запросе в любом месте вашего приложения.
- Независимость от извлечения записей — вы можете перемещаться по набору результатов, полностью контролируя логику программы или пользовательские события.
- Гибкость изменения положения — вы можете в любой момент перейти к любой записи в результирующем наборе.
Чтобы начать работать с запросом для получения данных, его нужно открыть. Когда вы закончите работать с запросом, вы должны закрыть его, чтобы освободить используемые системные ресурсы.
Статические запросы
Статические запросы используются, когда определение запроса известно во время разработки. Вы определяете статический запрос, используя оператор DEFINE QUERY. Запрос должен быть открыт оператором OPEN QUERY, прежде чем его можно будет использовать.
Следующий код определяет и открывает запрос. Затем он циклически перебирает все записи о клиентах и подсчитывает их.
VAR INT iCount. DEFINE QUERY qCust for Customer. OPEN QUERY qCust FOR EACH Customer. GET FIRST qCust. DO WHILE AVAILABLE Customer: iCount = iCount + 1. GET NEXT qCust. END. DISPLAY iCount. CLOSE QUERY qCust.
Динамические запросы
Динамические запросы используются, когда определение запроса неизвестно до времени выполнения. Например, вы можете захотеть, чтобы пользователь ввёл строку запроса. Чтобы построить динамический запрос, вы определяете переменную дескриптора для запроса и используете оператор CREATE QUERY для создания пустого запроса во время выполнения. Затем вы устанавливаете буферы с помощью метода SET-BUFFERS, а затем подготавливаете запрос с помощью метода QUERY-PREPARE(), где вы передаёте строку динамического запроса в качестве параметра. Наконец, запрос должен быть открыт с помощью метода QUERY-OPEN(), прежде чем его можно будет использовать.
VAR HANDLE hQuery. DEFINE INPUT PARAMETER bufHandle AS HANDLE. DEFINE INPUT PARAMETER qryString AS CHARACTER. CREATE QUERY hQuery. hQuery:SET-BUFFERS(bufHandle). hQuery:QUERY-PREPARE(qryString). hQuery:QUERY-OPEN().
Для получения дополнительной информации см. «Использование запросов» в «Разработка приложений ABL» и «Дескриптор объекта запроса» в «Справочнике по ABL».
Оператор GET
Оператор GET возвращает одну запись и, возможно, связанные записи из открытого запроса.
Синтаксис
GET { FIRST | NEXT | PREV | LAST | CURRENT } query
[ SHARE-LOCK | EXCLUSIVE-LOCK | NO-LOCK ].
FIRST | NEXT | PREV | LAST | CURRENT
FIRST, возвращает первую запись из запроса.
NEXT, возвращает первую или следующую запись из запроса.
PREV, возвращает предыдущую или последнюю запись из запроса.
LAST, возвращает последнюю запись из запроса.
CURRENT, обновляет текущую запись или записи из запроса.
query
Имя запроса.
SHARE-LOCK | EXCLUSIVE-LOCK | NO-LOCK
Указанная блокировка применяется к записи. Отменяет блокировку по умолчанию оператора OPEN QUERY.
