Это старая версия документа!


SQL-запросы

Синтаксис SQL-выражений в DataExpress (DX-SQL) почти такой же, как в Firebird-SQL.

Пример:

SELECT t.id, t.[номер] AS num, t.[дата] AS DATA, [клиенты].[название] AS client
FROM [продажа товара] t INNER JOIN [клиенты] ON t.[клиент]=[клиенты].id
ORDER BY t.[дата]

Отличительной особенностью DX-SQL является чередование названий форм и полей форм с названиями таблиц и полей базы данных. Названия форм и полей форм пишутся в квадратных скобках. В данном случае форма является аналогом таблицы.

Особенности DX-SQL

Перед тем как сделать запрос программа подменяет названия форм и полей в квадратных скобках на системные имена таблиц и полей. Если перед именем поля указан псевдоним или форма, то программа может точно определить к какой форме относится поле и если не находит его, то выдает сообщение об ошибке. Если псевдоним или форма не указана, то программа пытается его найти во всех формах, перечисленных в секции «FROM». При этом если поле не находится, то ошибка не появляется. Однако сервер выдаст сообщение об ошибке. Поэтому старайтесь указывать имена полей вместе с именем формы или псевдонимом. Обязательно пишите перед именем поля псевдоним или имя формы, если в имени поля есть точки.

Не используйте в качестве псевдонимов названия типа f1, f2, t1, t2, т. к. они могут совпасть с названиями полей и таблиц в базе данных. Используйте в псевдонимах только символы латинского алфавита, подчеркивание и цифры. При создании формы автоматические создается системное поле «id», которое является первичным ключом таблицы. При создании подчиненной формы дополнительно создается системное поле «pid», которое является внешним ключом и ссылается на id родительской формы.

Использование SQL в скриптах

Для работы с SQL используйте класс TdxSQLQuery и функцию SQLSelect:

function SQLSelect(const SQL: String): TdxSQLQuery

Класс TdxSQLQuery содержит почти тот же набор методов и свойств, что и форма.

Пример:

with SQLSelect('select id, [название] from [запчасти] order by [название]') do 
begin
 while not EOF do 
 begin
  // Какие-то действия
  … 
  MoveNext;
 end;
 Free;
end;

Кроме выборки данных класс умеет изменять данные в базе. Он, как и форма, имеет методы Append, Edit, Delete, Post, Cancel.

Главным отличием от формы является то, что метод Post сохраняет данные не в базе, а в наборе данных (подобно подчиненным формам).

Для отправки изменений в базу используется метод ApplyUpdates. Метод CancelUpdates может отменить все изменения, проделанные в наборе до вызова ApplyUpdates.

Необходимым условием для возможности изменений данных в базе является указание в SQL-запросе за словом «from» имени формы и наличие поля «id» формы. Класс автоматически генерирует инструкции Insert, Update и Delete. Набор полей формы, передаваемых в инструкции Insert и Update, берется из SQL-выражения.

Пример:

select pt.id, pt.[товар], pt.[цена], t.[название] from [приход товара] pt inner join [товары] t on pt.[товар]=t.id

Красным выделено, данные какой формы будут изменяться и поля, которые будут изменены.

Кроме того класс автоматически определяет генератор, который связан с формой. Так что при добавлении записи, id будет автоматически заполнен. Обращение к генератору тоже занимает какое-то время, поэтому для ускорения массового добавления записей вы можете устанавливать id вручную, без помощи генератора. Для этого установите свойство UseGenerator в False. Правда, вам все равно придется корректировать генератор для обеспечения нормальной работы формы. Это делается процедурой SQLExecute.

Выполнение произвольных SQL-инструкций

Процедура SQLExecute позволяет выполнить произвольный SQL-скрипт, передаваемый в параметр SQL.

procedure SQLExecute(const SQL: String)

Инструкции отделяются точкой с запятой. Процедура не понимает имена форм и полей в квадратных скобках, поэтому придется использовать только реальные имена таблиц и полей базы данных.

Понять какая таблица связана с формой можно по ее идентификатору (свойство Id). К идентификатору добавляется префикс «t»:

't' + IntToStr(Form.Id)

Поле таблицы можно определить по идентификатору dx-компонента:

'f' + IntToStr(dxEdit.Id)

Редактор SQL-выражений

Редактор поможет вам составить выражение SQL. Откройте редактор: