Реализация фильтра

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

В карточке "Проект" раздела "Проекты" я выбираю автомобиль (продукт с типом записи "Автомобиль") и хочу, чтобы в поле "Прицеп" у меня формировался список из прицепов (продукты с типом записи "Прицеп"), которые находятся на детали "Комплектация" выбранного автомобиля. Как мне это реализовать?

Оба поля "Марка авто" и "Прицеп" на данный момент берут свои значения из раздела "Автотрансопрт" (бывший "Продукты").

Нравится

14 комментариев

у контрола(поле "Прицеп" ) на событии OnPrepareSelectWindow
var Dataset = LookupDataControl.DataField.LookupDataset;
ApplyDatasetFilter(Dataset, 'создать фильтр', продукта типа "Автомобиль" , true);

еще можно на изменении (продукта типа "Автомобиль" ) очищать поле "Прицеп"

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

Вы хотите чтобы в поле Проекта ложился ID прицепа или ID записи в детали комплектации?

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

принцип один и тоже , а фильтр вы создаете какой захотите

"Underscore a.k.a. _" написал:Вы хотите чтобы в поле Проекта ложился ID прицепа или ID записи в детали комплектации?

чтобы ложился ID прицепа, но выбор происходил с учетом детали комплектация для выбранного автомобиля
"Денис М" написал:
принцип один и тоже , а фильтр вы создаете какой захотите

спасибо, я понял

Тогда нужно выбирать из датасета прицепа и делать Exist фильтр.

"Underscore a.k.a. _" написал:Тогда нужно выбирать из датасета прицепа и делать Exist фильтр.

Эта мысль уже приходила мне в голову, просто я надеялся может какие-то еще варианты есть. Буду разбираться как этот Exist работает :wink:
Спасибо

Просто можно было бы хранить ссылку на таблицу комплектации. Это может быть было бы чуть проще. Просто в дальнейшем учитывать это во всяких расчетах\отчетах.

Создал вот такой фильтр:

WHERE(EXISTS 
	(SELECT
		[tbl_OfferingComplectation].[ID] AS [ID]
	FROM
		[dbo].[tbl_OfferingComplectation] AS [tbl_OfferingComplectation]
	WHERE([tbl_OfferingComplectation].[ParentID] = :TrailersByAutoID)))

где TrailersByAutoID является параметром, которому я передаю ID автомобиля.

Но у меня почему-то при выборе список возможных значений прицепов пустой.

Еще вопрос: событие OnPrepareSelectWindow вызывается каждый раз, когда я выбираю значение в поле типа LookupDataset?

Судя по тому как это работает - каждый раз.

"Кошкаров Андрей" написал: WHERE([tbl_OfferingComplectation].[ParentID] = :TrailersByAutoID)))

Не правильный фильтр.
[tbl_OfferingComplectation].[ParentID] - ID родительской записи в tbl_OfferingComplectation. Оно никак не может равняться ID машины, ведь это ID из таблицы tbl_Offering.
И не хватает фильтра связывающего
[tbl_OfferingComplectation].[OfferingID] = [tbl_Прицеп].[ID]

"Underscore a.k.a. _" написал:Не правильный фильтр.
[tbl_OfferingComplectation].[ParentID] - ID родительской записи в tbl_OfferingComplectation. Оно никак не может равняться ID машины, ведь это ID из таблицы tbl_Offering.

Да, ParentID в таблице комплектации содержит ID родительской записи из таблицы "Продукты" (Автотранспорт). Я задаю ParentID="ID автомобиля" и потом смотрю какие записи из таблицы комплектации остаются.
"Underscore a.k.a. _" написал:И не хватает фильтра связывающего
[tbl_OfferingComplectation].[OfferingID] = [tbl_Прицеп].[ID]

Сейчас добавлю. Но в данном случае tbl_Прицеп=tbl_Offering (Продукты).

Имеет ли значение, что я здесь пишу? :

SELECT [tbl_OfferingComplectation].[ID] AS [ID]

"Кошкаров Андрей" написал:Я задаю ParentID="ID автомобиля"

Ну а ID автомобиля это OfferingID. А ParentID это ID записи в tbl_OfferingComplectation.

Вобщем надо писать

[tbl_OfferingComplectation].[OfferingID] = :TrailersByAutoID
AND [tbl_Offering.ID] = [tbl_OfferingComplectation].[EnteringOfferingID]

"Underscore a.k.a. _" написал:И не хватает фильтра связывающего
[tbl_OfferingComplectation].[OfferingID] = [tbl_Прицеп].[ID]

Тут конечно ошибка, не OfferingID, а EnteringOfferingID, извините.

"Кошкаров Андрей" написал:Имеет ли значение, что я здесь пишу? :
SELECT [tbl_OfferingComplectation].[ID] AS [ID]

Заброс на выбор прицепа должен выглядеть примерно так

SELECT
[tbl_Offering].[ID],
[tbl_Offering].[Name]
FROM  [tbl_Offering]
WHERE EXISTS (
SELECT
                [tbl_OfferingComplectation].[ID] AS [ID]
        FROM
                [dbo].[tbl_OfferingComplectation] AS [tbl_OfferingComplectation])
        WHERE([tbl_OfferingComplectation].[OfferingID] = :TrailersByAutoID
                AND [tbl_Offering.ID] = [tbl_OfferingComplectation].[EnteringOfferingID])

Да, точно. Я понял в чем моя ошибка была. Я думал, что ParentID - это ID автомобиля, а это просто служебное поле для построения дерева.
Спасибо, теперь все работает :lol:

На здоровье :)

Показать все комментарии