Open gsbelarus opened 5 years ago
Чтобы не заблудиться в трех соснах, разделим задачу на три части:
Предположим, перед нами стоит задача реализовать следующий пользовательский интерфейс:
Сначала рассмотрим простой вариант, когда у сущности Накладная EntityAttribute покупателя содержит только одну сущность Компания.
При формировании SQL запроса система должна присоединить по JOIN
или LEFT JOIN
(в зависимости от того, обязательным или нет является атрибут) таблицу(ы) из сущности компания, содержащие заданные атрибуты и вытащить их в часть SELECT
запроса.
Для нашей структуры БД части SQL запроса будут выглядеть следующим образом:
SELECT
...
z.customerkey,
c.name,
c.phone
...
FROM
<таблица накладной> z
JOIN gd_contact c ON z.customerkey = c.id
...
если же будет задано показать Наименование и УНП, которые лежат в разных таблицах, то запрос примет следующий вид:
SELECT
...
z.customerkey,
c.name,
t.taxid
...
FROM
<таблица накладной> z
JOIN gd_contact c ON z.customerkey = c.id
JOIN gd_companycode t ON z.customerkey = t.contactkey
...
Следует обратить внимание, что мы также вытаскиваем в запросе ИД компании. При перемещении по таблице мы будем использовать этот ИД для того, чтобы формировать запросы на определение истории покупок и платежей клиента.
В реляционной БД ссылки на другие сущности это просто целочисленные поля. Пользователю будет мало толку, если вывести их на экран в гриде.
Как ведет себя Гедымин, когда формирует запрос для выборки данных сущности:
JOIN
илиLEFT JOIN
на соответствующую таблицу.SELECT
часть запроса добавляется из присоединенной таблицы поле с наименованием объекта. Чаще всего это полеNAME
илиUSR$NAME
, но может быть и другое. Программист для каждого класса может указать свое.Теперь рассмотрим как Гедымин разбирается с ситуациями, когда поле ссылка может содержать ссылки на объекты разного типа. Например, поле ссылка -- это внешний ключ на таблицу
GD_CONTACT
и, соответственно, может содержать ссылки на объекты Компания, Банк, Человек, Сотрудник предприятия, Подразделение.В Гедымине для всех таких объектов будет один общий родитель -- это класс
TgdcBaseContact
и у него свойствоListTable
будет указано какGD_CONTACT
.Например, пользователь хочет открыть диалоговое окно для редактирования объекта, ИД которого лежит в поле, по которому создан внешний ключ на таблицу GD_CONTACT. Такая ситуация возникает по тысяче раз в день, когда пользователь нажимает клавишу F4 (редактирование объекта) в выпадающем списке.
GD_CONTACT
) и в специальном списке (аналог нашей ER Model) найдет наиболее общий класс, у которогоListTable
указан какGD_CONTACT
.TgdcBaseContact
. Будет создан его экземпляр с подмножествомByID
и открыт. Т.е. выполнен запрос к базе данных и найдена запись по указанному ИД.EditDialog
.GetCurrRecordClass
. Этот метод зависит от каждого класса. Например для контактов он будет смотреть на полеCONTACTTYPE
. Для базового типа документов, этот метод посмотрит на полеdocumenttypekey
и по нему найдет в списке документов класс уже конкретного документа.TgdcBank
.