GdcBase.TgdcBase.GetFromClause

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «{{MethodDef_Template|unit=gdcBase|visibility=protected|class=TgdcBase|method_type=function|src=function GetFromClause(const ARefresh: Boolean = False): String; virtu…»)
 
 
(не показаны 7 промежуточных версий 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;}}
 +
<onlyinclude>Функция возвращает секцию FROM SQL запроса бизнес-объекта.</onlyinclude> Если параметр ARefresh имеет значение True, значит идет формирование запроса для обновления данных записи бизнес-объекта. Из метода GetFromClause вызывается обработчик события [[gdcBase.TgdcBase.OnGetFromClause|OnGetFromClause]].
 +
=== Пример ===
 +
 +
На эталонной базе данных без загруженных прикладных настроек откроем '''Исследователь''' и из раздела '''Справочники''' выберем команду '''Справочник ТМЦ'''. Задвинем вертикальную разделительную полосу до упора влево (чтобы избавиться от условия ограничения по выбранной группе ТМЦ). Установим курсор в таблицу и нажмем F10. Запрос бизнес-объекта на соответствующей вкладке диалогового окна выглядит следующим образом:
 +
 +
<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
 +
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
 +
</syntaxhighlight>
 +
 +
Пусть перед нами стоит задача создать для товара атрибут '''Производитель''' и вывести в результате запроса наименование компании производителя и ФИО ее директора. Первая часть задачи решается достаточно просто. В разделе '''Исследователь-Сервис-Атрибуты''' открываем окно '''Домены''' и создаем новый объект:
 +
 +
* Название типа поля: USR$DMANUFACTURERKEY
 +
* Локализованное название типа поля: Производитель
 +
* Тип данных: Ссылка
 +
* Ссылка на таблицу: gd_contact
 +
* Поле таблицы для отображения: name
 +
* Условие выбора значений: contacttype = 3
 +
 +
Нажимаем Ок. Появится окно выполнения SQL команд, которое закрываем, и из того же раздела '''Исследователя''' открываем окно '''Таблицы'''. Находим [[GD_GOOD]] и в нижней части добавляем новое поле:
 +
 +
* Название поля на английском: USR$MANUFACTURERKEY
 +
* Локализованное название: Производитель
 +
* Краткое название: Производитель
 +
* Тип поля: выбираем в списке созданный ранее тип USR$DMANUFACTURERKEY
 +
 +
Нажимаем Ок. Закрываем появившееся окно выполнения SQL команд и переподключаемся к базе данных. Сразу после переподключения будут созданы необходимые структуры данных, информация о которых появится все в том же окне выполнения SQL команд. Запрос теперь выглядит следующим образом (комментарии добавлены нами):
 +
 +
<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,
 +
  /****************************************************************/
 +
  /**  поля атрибута Производитель                              **/
 +
  /**/ 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      /**/
 +
    /****************************************************************/
 +
</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
 +
      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          /**/
 +
    /****************************************************************/
 +
</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}}
 +
 +
__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      /**/
    /****************************************************************/

Со второй частью задачи дело обстоит несколько сложнее. Как видно, в запросе нет связанной таблицы для того, чтобы извлечь имя директора. Придется добавить ее вручную:

  1. Откроем окно Редактора скрипт-объектов из меню Сервис главного окна программы.
  2. Откроем Проводник и выберем модуль Application.
  3. Перейдем по дереву в раздел Методы\TgdcBase\TgdcGood.
  4. Найдем метод GetFromClause и щелкнем по нему двойным щелчком.
  5. В правой части окна перейдем на вкладку Скрипт и введем следующий текст:
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

[править] См. также


Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты