У меня есть такая задача:
Раздел "Продукты" переименован в "Автотранспорт".
Для каждой записи продукта типа "Автомобиль" на детали "Комплектация" задается список продуктов типа "Прицеп", то есть прицепы, которые можно прикрепить к автомобилю.
В карточке "Проект" раздела "Проекты" я выбираю автомобиль (продукт с типом записи "Автомобиль") и хочу, чтобы в поле "Прицеп" у меня формировался список из прицепов (продукты с типом записи "Прицеп"), которые находятся на детали "Комплектация" выбранного автомобиля. Как мне это реализовать?
Оба поля "Марка авто" и "Прицеп" на данный момент берут свои значения из раздела "Автотрансопрт" (бывший "Продукты").
Нравится
у контрола(поле "Прицеп" ) на событии 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: