GdcBase.TgdcBase.GetFromClause
SYSDBA (обсуждение | вклад) (→Пример) |
SYSDBA (обсуждение | вклад) |
||
| (не показаны 5 промежуточных версий 1 участника) | |||
| Строка 1: | Строка 1: | ||
{{MethodDef_Template|unit=gdcBase|visibility=protected|class=TgdcBase|method_type=function|src=function GetFromClause(const ARefresh: Boolean = False): String; virtual;}} | {{MethodDef_Template|unit=gdcBase|visibility=protected|class=TgdcBase|method_type=function|src=function GetFromClause(const ARefresh: Boolean = False): String; virtual;}} | ||
| − | Функция возвращает секцию FROM SQL запроса бизнес-объекта. Если параметр ARefresh имеет значение True, значит идет формирование запроса для обновления данных записи бизнес-объекта. Из метода GetFromClause вызывается обработчик события [[gdcBase.TgdcBase.OnGetFromClause|OnGetFromClause]]. | + | <onlyinclude>Функция возвращает секцию FROM SQL запроса бизнес-объекта.</onlyinclude> Если параметр ARefresh имеет значение True, значит идет формирование запроса для обновления данных записи бизнес-объекта. Из метода GetFromClause вызывается обработчик события [[gdcBase.TgdcBase.OnGetFromClause|OnGetFromClause]]. |
=== Пример === | === Пример === | ||
| Строка 63: | Строка 63: | ||
* Тип поля: выбираем в списке созданный ранее тип USR$DMANUFACTURERKEY | * Тип поля: выбираем в списке созданный ранее тип USR$DMANUFACTURERKEY | ||
| − | Нажимаем Ок. Закрываем появившееся окно выполнения SQL команд и переподключаемся к базе данных. Сразу после переподключения будут созданы необходимые структуры данных, информация о которых появится все в том же окне выполнения SQL команд. | + | Нажимаем Ок. Закрываем появившееся окно выполнения SQL команд и переподключаемся к базе данных. Сразу после переподключения будут созданы необходимые структуры данных, информация о которых появится все в том же окне выполнения SQL команд. Запрос теперь выглядит следующим образом (комментарии добавлены нами): |
<syntaxhighlight lang="SQL"> | <syntaxhighlight lang="SQL"> | ||
| Строка 89: | Строка 89: | ||
Z.CREATORKEY, | Z.CREATORKEY, | ||
Z.CREATIONDATE, | Z.CREATIONDATE, | ||
| − | /* поля атрибута Производитель */ | + | /****************************************************************/ |
| − | Z.USR$MANUFACTURERKEY, | + | /** поля атрибута Производитель **/ |
| − | Z_USR$MANUFACTURERKEY.NAME AS Z_USR$MANUFACTURERKEY_NAME | + | /**/ Z.USR$MANUFACTURERKEY, /**/ |
| + | /**/ Z_USR$MANUFACTURERKEY.NAME AS Z_USR$MANUFACTURERKEY_NAME /**/ | ||
| + | /****************************************************************/ | ||
FROM | FROM | ||
| Строка 107: | Строка 109: | ||
ON | ON | ||
T.ID = Z.TNVDKEY | T.ID = Z.TNVDKEY | ||
| − | /* связанная таблица атрибута Производитель */ | + | /****************************************************************/ |
| + | /** связанная таблица атрибута Производитель **/ | ||
| + | /**/ LEFT JOIN /**/ | ||
| + | /**/ GD_CONTACT Z_USR$MANUFACTURERKEY /**/ | ||
| + | /**/ON /**/ | ||
| + | /**/ Z_USR$MANUFACTURERKEY.ID = Z.USR$MANUFACTURERKEY /**/ | ||
| + | /****************************************************************/ | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | Со второй частью задачи дело обстоит несколько сложнее. Как видно, в запросе нет связанной таблицы для того, чтобы извлечь имя директора. Придется добавить ее вручную: | ||
| + | |||
| + | # Откроем окно Редактора скрипт-объектов из меню Сервис главного окна программы. | ||
| + | # Откроем Проводник и выберем модуль Application. | ||
| + | # Перейдем по дереву в раздел Методы\TgdcBase\TgdcGood. | ||
| + | # Найдем метод GetFromClause и щелкнем по нему двойным щелчком. | ||
| + | # В правой части окна перейдем на вкладку Скрипт и введем следующий текст: | ||
| + | |||
| + | <syntaxhighlight lang="vbnet"> | ||
| + | option explicit | ||
| + | function TgdcGoodGetFromClause(Self, ARefresh) | ||
| + | '*** Данный код необходим для вызова кода определенного в gdc-классе.*** | ||
| + | '*** При его удаления возможно нарушение правильной работы системы.*** | ||
| + | TgdcGoodGetFromClause = _ | ||
| + | Inherited(Self, "GetFromClause", Array(Self, ARefresh)) | ||
| + | '*** Конец кода поддержки gdc-класса. *** | ||
| + | |||
| + | TgdcGoodGetFromClause = TgdcGoodGetFromClause &_ | ||
| + | " LEFT JOIN gd_contact manufacturer ON manufacturer.id = z.usr$manufacturerkey " & _ | ||
| + | " JOIN gd_company manufacturer_comp ON manufacturer_comp.contactkey = manufacturer.id " & _ | ||
| + | " LEFT JOIN gd_contact director ON director.id = manufacturer_comp.directorkey " | ||
| + | |||
| + | end function | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | Аналогичным образом перекроем метод [[gdcBase.TgdcBase.GetSelectClause|GetSelectClause]]: | ||
| + | |||
| + | <syntaxhighlight lang="vbnet"> | ||
| + | option explicit | ||
| + | function TgdcGoodGetSelectClause(Self) | ||
| + | '*** Данный код необходим для вызова кода определенного в gdc-классе.*** | ||
| + | '*** При его удаления возможно нарушение правильной работы системы.*** | ||
| + | TgdcGoodGetSelectClause = _ | ||
| + | Inherited(Self, "GetSelectClause", Array(Self)) | ||
| + | '*** Конец кода поддержки gdc-класса. *** | ||
| + | |||
| + | TgdcGoodGetSelectClause = TgdcGoodGetSelectClause &_ | ||
| + | ",director.name AS director_name" | ||
| + | end function | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | Сохранив изменения (команда Сохранить изменения в базу), закроем все окна. Пиктограмка закрытия всех окон находится на главном окне программы между выпадающим списком рабочих столов и выпадающим списком рабочих организаций. Откроем окно справочника ТМЦ и посмотрим на получившийся запрос: | ||
| + | |||
| + | <syntaxhighlight lang="sql"> | ||
| + | SELECT | ||
| + | Z.ID, | ||
| + | Z.GROUPKEY, | ||
| + | Z.NAME, | ||
| + | Z.ALIAS, | ||
| + | Z.SHORTNAME, | ||
| + | Z.DESCRIPTION, | ||
| + | Z.BARCODE, | ||
| + | Z.VALUEKEY, | ||
| + | Z.TNVDKEY, | ||
| + | Z.ISASSEMBLY, | ||
| + | Z.RESERVED, | ||
| + | Z.DISCIPLINE, | ||
| + | Z.DISABLED, | ||
| + | Z.EDITIONDATE, | ||
| + | Z.EDITORKEY, | ||
| + | Z.AFULL, | ||
| + | Z.ACHAG, | ||
| + | Z.AVIEW, | ||
| + | T.NAME AS TNVD, | ||
| + | V.NAME AS VALUENAME, | ||
| + | Z.CREATORKEY, | ||
| + | Z.CREATIONDATE, | ||
| + | /****************************************************************/ | ||
| + | /** ФИО директора и поля атрибута Производитель **/ | ||
| + | /**/ DIRECTOR.NAME, /**/ | ||
| + | /**/ Z.USR$MANUFACTURERKEY, /**/ | ||
| + | /**/ MANUFACTURER.NAME AS MANUFACTURER_NAME /**/ | ||
| + | /****************************************************************/ | ||
| + | |||
| + | FROM | ||
| + | GD_GOODGROUP GG | ||
| + | JOIN | ||
| + | GD_GOOD Z | ||
| + | ON | ||
| + | Z.GROUPKEY = GG.ID | ||
LEFT JOIN | LEFT JOIN | ||
| − | + | GD_VALUE V | |
ON | ON | ||
| − | + | V.ID = Z.VALUEKEY | |
| + | LEFT JOIN | ||
| + | GD_TNVD T | ||
| + | ON | ||
| + | T.ID = Z.TNVDKEY | ||
| + | /****************************************************************/ | ||
| + | /** связанная таблица атрибута Производитель **/ | ||
| + | /** и подключенная через нее таблица для ФИО директора **/ | ||
| + | /**/ LEFT JOIN /**/ | ||
| + | /**/ GD_CONTACT MANUFACTURER /**/ | ||
| + | /**/ON /**/ | ||
| + | /**/ MANUFACTURER.ID = Z.USR$MANUFACTURERKEY /**/ | ||
| + | /**/JOIN /**/ | ||
| + | /**/ GD_COMPANY MANUFACTURER_COMP /**/ | ||
| + | /**/ON /**/ | ||
| + | /**/ MANUFACTURER_COMP.CONTACTKEY = MANUFACTURER.ID /**/ | ||
| + | /**/LEFT JOIN /**/ | ||
| + | /**/ GD_CONTACT DIRECTOR /**/ | ||
| + | /**/ON /**/ | ||
| + | /**/ DIRECTOR.ID = MANUFACTURER_COMP.DIRECTORKEY /**/ | ||
| + | /****************************************************************/ | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| − | + | ==== Исключение добавленных таблиц из обработки парсером запроса ==== | |
| − | + | Обратите внимание, что для каждой, добавленной нами в GetFromClause таблицы, парсер запроса автоматически добавит поля-атрибуты в секции Select. Запретить добавление полей можно добавив объект в SQLSetup.Ignores. Соответствующие пример приведен ниже. | |
| + | |||
| + | <syntaxhighlight lang="vbnet"> | ||
| + | option explicit | ||
| + | function TgdcGoodGetFromClause(Self, ARefresh) | ||
| + | '*** Данный код необходим для вызова кода определенного в gdc-классе.*** | ||
| + | '*** При его удаления возможно нарушение правильной работы системы.*** | ||
| + | TgdcGoodGetFromClause = _ | ||
| + | Inherited(Self, "GetFromClause", Array(Self, ARefresh)) | ||
| + | '*** Конец кода поддержки gdc-класса. *** | ||
| + | |||
| + | TgdcGoodGetFromClause = TgdcGoodGetFromClause &_ | ||
| + | " LEFT JOIN gd_contact manufacturer ON manufacturer.id = z.usr$manufacturerkey " & _ | ||
| + | " JOIN gd_company manufacturer_comp ON manufacturer_comp.contactkey = manufacturer.id " & _ | ||
| + | " LEFT JOIN gd_contact director ON director.id = manufacturer_comp.directorkey " | ||
| + | |||
| + | ' Запрещаем добавление полей-атрибутов для таблицы manufacturer_comp | ||
| + | Self.SQLSetup.Ignores.Add.AliasName = "manufacturer_comp" | ||
| + | end function | ||
| + | </syntaxhighlight> | ||
=== См. также === | === См. также === | ||
* {{Issue_Template|num=2376}} | * {{Issue_Template|num=2376}} | ||
| + | |||
| + | __NOTOC__ | ||
Текущая версия на 16:58, 7 апреля 2011
From gdcBase.pas
function GetFromClause(const ARefresh: Boolean = False): String; virtual;
Unit: gdcBase
Type: function
Visibility: protected
Member Of: TgdcBase
[править] Описание
Функция возвращает секцию FROM SQL запроса бизнес-объекта. Если параметр ARefresh имеет значение True, значит идет формирование запроса для обновления данных записи бизнес-объекта. Из метода GetFromClause вызывается обработчик события OnGetFromClause.
[править] Пример
На эталонной базе данных без загруженных прикладных настроек откроем Исследователь и из раздела Справочники выберем команду Справочник ТМЦ. Задвинем вертикальную разделительную полосу до упора влево (чтобы избавиться от условия ограничения по выбранной группе ТМЦ). Установим курсор в таблицу и нажмем F10. Запрос бизнес-объекта на соответствующей вкладке диалогового окна выглядит следующим образом:
SELECT Z.ID, Z.GROUPKEY, Z.NAME, Z.ALIAS, Z.SHORTNAME, Z.DESCRIPTION, Z.BARCODE, Z.VALUEKEY, Z.TNVDKEY, Z.ISASSEMBLY, Z.RESERVED, Z.DISCIPLINE, Z.DISABLED, Z.EDITIONDATE, Z.EDITORKEY, Z.AFULL, Z.ACHAG, Z.AVIEW, T.NAME AS TNVD, V.NAME AS VALUENAME, Z.CREATORKEY, Z.CREATIONDATE FROM GD_GOODGROUP GG JOIN GD_GOOD Z ON Z.GROUPKEY = GG.ID LEFT JOIN GD_VALUE V ON V.ID = Z.VALUEKEY LEFT JOIN GD_TNVD T ON T.ID = Z.TNVDKEY WHERE Z.ID = :ID
Пусть перед нами стоит задача создать для товара атрибут Производитель и вывести в результате запроса наименование компании производителя и ФИО ее директора. Первая часть задачи решается достаточно просто. В разделе Исследователь-Сервис-Атрибуты открываем окно Домены и создаем новый объект:
- Название типа поля: USR$DMANUFACTURERKEY
- Локализованное название типа поля: Производитель
- Тип данных: Ссылка
- Ссылка на таблицу: gd_contact
- Поле таблицы для отображения: name
- Условие выбора значений: contacttype = 3
Нажимаем Ок. Появится окно выполнения SQL команд, которое закрываем, и из того же раздела Исследователя открываем окно Таблицы. Находим GD_GOOD и в нижней части добавляем новое поле:
- Название поля на английском: USR$MANUFACTURERKEY
- Локализованное название: Производитель
- Краткое название: Производитель
- Тип поля: выбираем в списке созданный ранее тип USR$DMANUFACTURERKEY
Нажимаем Ок. Закрываем появившееся окно выполнения SQL команд и переподключаемся к базе данных. Сразу после переподключения будут созданы необходимые структуры данных, информация о которых появится все в том же окне выполнения SQL команд. Запрос теперь выглядит следующим образом (комментарии добавлены нами):
SELECT Z.ID, Z.GROUPKEY, Z.NAME, Z.ALIAS, Z.SHORTNAME, Z.DESCRIPTION, Z.BARCODE, Z.VALUEKEY, Z.TNVDKEY, Z.ISASSEMBLY, Z.RESERVED, Z.DISCIPLINE, Z.DISABLED, Z.EDITIONDATE, Z.EDITORKEY, Z.AFULL, Z.ACHAG, Z.AVIEW, T.NAME AS TNVD, V.NAME AS VALUENAME, Z.CREATORKEY, Z.CREATIONDATE, /****************************************************************/ /** поля атрибута Производитель **/ /**/ Z.USR$MANUFACTURERKEY, /**/ /**/ Z_USR$MANUFACTURERKEY.NAME AS Z_USR$MANUFACTURERKEY_NAME /**/ /****************************************************************/ FROM GD_GOODGROUP GG JOIN GD_GOOD Z ON Z.GROUPKEY = GG.ID LEFT JOIN GD_VALUE V ON V.ID = Z.VALUEKEY LEFT JOIN GD_TNVD T ON T.ID = Z.TNVDKEY /****************************************************************/ /** связанная таблица атрибута Производитель **/ /**/ LEFT JOIN /**/ /**/ GD_CONTACT Z_USR$MANUFACTURERKEY /**/ /**/ON /**/ /**/ Z_USR$MANUFACTURERKEY.ID = Z.USR$MANUFACTURERKEY /**/ /****************************************************************/
Со второй частью задачи дело обстоит несколько сложнее. Как видно, в запросе нет связанной таблицы для того, чтобы извлечь имя директора. Придется добавить ее вручную:
- Откроем окно Редактора скрипт-объектов из меню Сервис главного окна программы.
- Откроем Проводник и выберем модуль Application.
- Перейдем по дереву в раздел Методы\TgdcBase\TgdcGood.
- Найдем метод GetFromClause и щелкнем по нему двойным щелчком.
- В правой части окна перейдем на вкладку Скрипт и введем следующий текст:
option explicit function TgdcGoodGetFromClause(Self, ARefresh) '*** Данный код необходим для вызова кода определенного в gdc-классе.*** '*** При его удаления возможно нарушение правильной работы системы.*** TgdcGoodGetFromClause = _ Inherited(Self, "GetFromClause", Array(Self, ARefresh)) '*** Конец кода поддержки gdc-класса. *** TgdcGoodGetFromClause = TgdcGoodGetFromClause &_ " LEFT JOIN gd_contact manufacturer ON manufacturer.id = z.usr$manufacturerkey " & _ " JOIN gd_company manufacturer_comp ON manufacturer_comp.contactkey = manufacturer.id " & _ " LEFT JOIN gd_contact director ON director.id = manufacturer_comp.directorkey " end function
Аналогичным образом перекроем метод GetSelectClause:
option explicit function TgdcGoodGetSelectClause(Self) '*** Данный код необходим для вызова кода определенного в gdc-классе.*** '*** При его удаления возможно нарушение правильной работы системы.*** TgdcGoodGetSelectClause = _ Inherited(Self, "GetSelectClause", Array(Self)) '*** Конец кода поддержки gdc-класса. *** TgdcGoodGetSelectClause = TgdcGoodGetSelectClause &_ ",director.name AS director_name" end function
Сохранив изменения (команда Сохранить изменения в базу), закроем все окна. Пиктограмка закрытия всех окон находится на главном окне программы между выпадающим списком рабочих столов и выпадающим списком рабочих организаций. Откроем окно справочника ТМЦ и посмотрим на получившийся запрос:
SELECT Z.ID, Z.GROUPKEY, Z.NAME, Z.ALIAS, Z.SHORTNAME, Z.DESCRIPTION, Z.BARCODE, Z.VALUEKEY, Z.TNVDKEY, Z.ISASSEMBLY, Z.RESERVED, Z.DISCIPLINE, Z.DISABLED, Z.EDITIONDATE, Z.EDITORKEY, Z.AFULL, Z.ACHAG, Z.AVIEW, T.NAME AS TNVD, V.NAME AS VALUENAME, Z.CREATORKEY, Z.CREATIONDATE, /****************************************************************/ /** ФИО директора и поля атрибута Производитель **/ /**/ DIRECTOR.NAME, /**/ /**/ Z.USR$MANUFACTURERKEY, /**/ /**/ MANUFACTURER.NAME AS MANUFACTURER_NAME /**/ /****************************************************************/ FROM GD_GOODGROUP GG JOIN GD_GOOD Z ON Z.GROUPKEY = GG.ID LEFT JOIN GD_VALUE V ON V.ID = Z.VALUEKEY LEFT JOIN GD_TNVD T ON T.ID = Z.TNVDKEY /****************************************************************/ /** связанная таблица атрибута Производитель **/ /** и подключенная через нее таблица для ФИО директора **/ /**/ LEFT JOIN /**/ /**/ GD_CONTACT MANUFACTURER /**/ /**/ON /**/ /**/ MANUFACTURER.ID = Z.USR$MANUFACTURERKEY /**/ /**/JOIN /**/ /**/ GD_COMPANY MANUFACTURER_COMP /**/ /**/ON /**/ /**/ MANUFACTURER_COMP.CONTACTKEY = MANUFACTURER.ID /**/ /**/LEFT JOIN /**/ /**/ GD_CONTACT DIRECTOR /**/ /**/ON /**/ /**/ DIRECTOR.ID = MANUFACTURER_COMP.DIRECTORKEY /**/ /****************************************************************/
[править] Исключение добавленных таблиц из обработки парсером запроса
Обратите внимание, что для каждой, добавленной нами в GetFromClause таблицы, парсер запроса автоматически добавит поля-атрибуты в секции Select. Запретить добавление полей можно добавив объект в SQLSetup.Ignores. Соответствующие пример приведен ниже.
option explicit function TgdcGoodGetFromClause(Self, ARefresh) '*** Данный код необходим для вызова кода определенного в gdc-классе.*** '*** При его удаления возможно нарушение правильной работы системы.*** TgdcGoodGetFromClause = _ Inherited(Self, "GetFromClause", Array(Self, ARefresh)) '*** Конец кода поддержки gdc-класса. *** TgdcGoodGetFromClause = TgdcGoodGetFromClause &_ " LEFT JOIN gd_contact manufacturer ON manufacturer.id = z.usr$manufacturerkey " & _ " JOIN gd_company manufacturer_comp ON manufacturer_comp.contactkey = manufacturer.id " & _ " LEFT JOIN gd_contact director ON director.id = manufacturer_comp.directorkey " ' Запрещаем добавление полей-атрибутов для таблицы manufacturer_comp Self.SQLSetup.Ignores.Add.AliasName = "manufacturer_comp" end function
[править] См. также