22.05.2004, 09:52 | #1 |
Участник
|
Есть на форме два DataSource: InventTable и ShopInventItems, у второго стоит JoinSource=InventTable и тип связи InnerJoin. Также есть грид на основе InventTable и комбобокс с пунктами "Супермаркет","Универсам", "Дискаунтер", в котором фильтруются товары по принадлежности к категории магазина (фильтры по ShopInventItems). Мне надо добавить в этот комбобокс пункт "Все форматы",при выборе которого связь между InventTable и ShopInventItems надо разрывать.
Пробовал так: ShopInventItems_ds.JoinSource(0); ShopInventItems_ds.LinkType(1); //Delayed но это срабатывает только в Init() ShopInventItems_ds Можно ли этими свойствами динамически манипулировать? |
|
25.05.2004, 16:44 | #2 |
Участник
|
А почему бы Вам не попробовать не разрывать связь между InventTable и ShopInventItems, а очистить фильтр по ShopInventItems при выборе "Все форматы"?
|
|
25.05.2004, 18:31 | #3 |
Участник
|
на самом деле есть масса вопросов к формулировкам.
например как должна выглядеть разорванная связь... попробуйте сформулировать на человеческом языке то, что вы хотите сделать, не употребляя программистских терминов. скорее всего, ваша задача решается не так и не этими инструментами. |
|
26.05.2004, 08:50 | #4 |
Участник
|
Очистить фильтр по ShopInventItems не даёт результата, так как есть товары, не привязанные ни к одному формату (в ShopInventItems их просто нет, а видеть их надо).
На человеческом языке задача звучит так. Есть список товаров (InventTable), каждый товар привязан к категориям магазинов "Супермаркет","Универсам", "Дискаунтер" (ShopInventItems) или не привязан никуда (важный момент). Я хотел-бы предоставить пользователю возможность фильтровать список товаров по этим трём категориям (выбором из выпадающего списка), а также чтобы можно было выбрать пункт "Все форматы"(там будут видны также товары, не привязанные ни к одной категории магазинов). То есть при выборе одной из трёх категорий магазинов результирующий набор должен быть - InventTable inner join ShopInventItems с фильтром, наложенным на ShopInventItems по данной категории. При выборе пункта "Все форматы" результат - это просто InventTable. Проблема в том, что не удаётся на лету манипулировать свойством LinkType источника данных. В дизайне источник ShopInventItems связан с InventTable по InnerJoin. Я пытался разрывать связь между ними с помощью ShopInventItems_ds.linkType(1); ShopInventItems_ds.joinSource(0); но это не действует. Пробовал также определить в дизайне связь между ShopInventItems и InventTable как Delayed и в коде менять query у InventTable_ds. Так всё работает, как хотелось, но только если в форме нет других источников данных, связанных с InventTable по InnerJoin.(а они есть) В этом случае выдаёт ошибку на InventTable_ds.executeQuery(), причём ругается по разу на каждый источник данных, связанный с InventTable по InnerJoin: "Неправильный тип аргумента функции" |
|
26.05.2004, 09:09 | #5 |
Участник
|
Цитата:
На человеческом языке задача звучит так. Есть список товаров (InventTable), каждый товар привязан к категориям...
Цитата:
... должен быть - InventTable inner join
В таблице InventTable у вас есть поле - код из ShopInventItems. По нему и фильтруйте. Зачем вам вытаскивать другую таблицу то? Похоже у вас проблема пустого критерия. Смотрите здесь Как программно выбрать пустые строки в запросе указать пусую строку в критерии можно при помощи SysQuery::valueEmptyString() о кодировке в Аксапте вообще Коды клиентов и поставщиков |
|
26.05.2004, 14:16 | #6 |
Участник
|
Цитата:
В таблице InventTable у вас есть поле - код из ShopInventItems. По нему и фильтруйте. Зачем вам вытаскивать другую таблицу то?
|
|
26.05.2004, 14:21 | #7 |
Участник
|
как это?
вот ваше описание на человеческом языке: "Есть список товаров (InventTable), каждый товар привязан к категориям магазинов "Супермаркет","Универсам", "Дискаунтер" (ShopInventItems) или не привязан никуда (важный момент)." Я так понимаю, что в таблице ShopInventItems у вас хранятся категории Супермаркет, Универсам, Дискаунтер. А в таблице inventTable заведено поле, в котором вы выбираете одну из категорий или оставляете это поле пустым. (Полный аналог групп инвентриазации, групп расчета комиссоннных, налоговых групп, групп накладнх расходов). Так? |
|
26.05.2004, 14:44 | #8 |
Участник
|
Нет, в InventTable нет такого поля. Товар может быть привязан к одной, двум или трём категориям магазинов (а может и не быть привязан ни к одной). Вобщем, связь один ко многим по полю ItemId.
|
|
26.05.2004, 15:07 | #9 |
Участник
|
не понимаю.
можете наприсовать схемку? в ERwin'например или в Visio? или проект с этими таблицами и типами сюда положить? Что значит слово "привязан"? Как это практически делается? Вы для каждой номенклатуры заводите несколько записей в ShopInventItems с данным InventID. Это похоже на настройку местонахождения или покрытия номенклатуры? Если да, то вернемся к исходному вопросу. Зачем вам "надо разрывать связь между InventTable и ShopInventItems"? Вы ведь всего лишь хотите увидеть все записи. Ну и смотрите "все" со включенной связью. Или я чего снова не понял? |
|
26.05.2004, 16:07 | #10 |
Участник
|
Да, под привязкой понимается именно это: для каждой номенклатуры заводится несколько записей в ShopInventItems с данным ItemId. Но может быть и номенклатура, для которой в ShopInventItems ничего не заводится.
Высылаю проект с тестовой формой. Там связь таблиц InventTable и ShopInventItems стоит Delayed. Если поставить InnerJoin, то записи в гриде будут плодиться по кол-ву записей в ShopInventItems для данного ItemId. Поэтому я и хочу разрывать связь двух датасоурсов. В таком виде форма работает, как задумано. Но стоит только добавить источник данных, связанный с InventTable по InnerJoin (или по любому типу Join), то при смене формата (метод ChangeFormat) возникает ошибка на InventTable_ds.executeQuery(). В реальной форме InventTable таких источников, связанных с InventTable по Join много, и фокус не проходит |
|
26.05.2004, 16:36 | #11 |
Участник
|
у вас сильно переделанный inventTable.
можно я попрошу вас самостоятельно вычистить код так, чтобы ваш проект можно было бы загрузить в стандартное приложение? сильно подозреваю, что вы просто где-то запутались с программированием. так например, в init'e датасорса вы зачем-то инициализируете дерево. когда я удалил все, что не компилируется, то комбобокс у меня стал пустым. я не могу ничего выбрать. кроме того, вы уверены, что цены нужно указывать в своих таблицах, а не в прайс-листах аксапты? |
|
26.05.2004, 16:40 | #12 |
Участник
|
и потом. может я все же чего-то не понял.
но мне показалось, что ваш случай сильно напомниает мастонахождения номенклатуры, покрытие номенклатуры, описания на разных языках для номенклатуры, внешние коды номенклатуры. чем вас не устраивает этот функционал? каких именно отличий от стандартного поведения вы хотели достичь? |
|
27.05.2004, 08:40 | #13 |
Участник
|
То, что сильно переделано и инициализация дерева - это наследство ("Не виноватая я - он сам пришёл") :P
А где можно посмотреть про местонахождения номенклатуры, покрытие номенклатуры, описания на разных языках для номенклатуры, внешние коды номенклатуры ? Я с этим функционалом не знаком, может, действительно, всё проще. |
|
27.05.2004, 09:04 | #14 |
Участник
|
справочник номенклатура.
кнопка настройка. все там. |
|