26.05.2008, 14:47 | #1 |
Участник
|
Связь таблиц
Здравствуйте!
у меня не большой вопрос: мне надо получить записи из InventTable связанного с VendContractItem и вывести в грид. Перекрыв метод executeQuery - он ни в какую не хочешь проводить выборку вот текст запроса: X++: public void executeQuery() { Query q_Items; ; q_Items = this.query(); q_Items.dataSourceTable(TableNum(InventTable)); q_Items.dataSourceTable(TableNum(InventTable)).addDataSource(TableNum(VendContractItem)); q_Items.dataSourceTable(TableNum(VendContractItem)).addLink(FieldNum(InventTable,ItemId),FieldNum(VendContractItem,ItemId)); q_Items.dataSourceTable(TableNum(VendContractItem)).joinMode(JoinMode::InnerJoin); q_Items.dataSourceTable(TableNum(VendContractItem)).addRange(FieldNum(VendContractItem,RContractAccount)).value(sysQuery::value(RContractTable_RContractAccount.valueStr())); super(); } спасибо за ранее |
|
26.05.2008, 15:29 | #2 |
Участник
|
Попробуйте что-то вроде этого:
X++: QueryBuildDataSource qbds; ; qbds = this.query().dataSourceTable(TableNum(InventTable)); qbds = qbds.addDataSource(TableNum(VendContractItem)); qbds.addLink(FieldNum(InventTable,ItemId),FieldNum(VendContractItem,ItemId)); qbds.joinMode(JoinMode::InnerJoin); qbds.addRange(FieldNum(VendContractItem,RContractAccount)).value(sysQuery::value(RContractTable_RContractAccount.valueStr())); super(); |
|
26.05.2008, 15:34 | #3 |
Участник
|
Это одно и то же.
Учтите, что этот код будет вызываться каждый раз при выполнении считывания данных (executeQuery), а значит будет добавляться все больше и больше источников. А почему вы не хотите добавить источник еще один на форму? Если таки хотите это сделать из кода, может перенесите весь этот код (за исключением фильтрации) в метод init источника InventTable. И перед фильтрацией ищите сперва существующий фильтра, а только если не найден создавайте новый. |
|
|
За это сообщение автора поблагодарили: Proid (1). |
26.05.2008, 15:45 | #4 |
Участник
|
в init() нет необходимости добавлять, так же как и добавление dataSource на форму - там возникают не понятные "глючи". На форме связано и так много dataSource'ов, и все привязаны к InventTable. пробовал не в executeQuery создавать - результата ноль. Если явно задать для примера номенклатуру - отрабатывает нормально, но вот джойнить VendContractItem ни в какую не хочет
|
|
27.05.2008, 07:38 | #5 |
MCITP
|
Не понятно.... Т.е. прописываешь на форме датасорс, джойнишь, а он всё равно не привязывается? Смотрел, что получается в запросе к БД? Хоть что-то же там должно появится... Приведи сюда, какой SQL получается.
ЗЫ имхо,слишком мало информации, чтоб понять в чём дело...
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: Proid (1). |
27.05.2008, 07:48 | #6 |
Axapta Retail User
|
У меня ваш код чудесно работает. (Хотя конечно в идеале его нужно в init() или все-таки на форму - что у вас там за глюки?).
Возможно у вас значение RContractTable_RContractAccount.valueStr() не корректно - поэтому вы записи не видите? Ну и советую войти в группу пользователей Axapta Retail |
|
|
За это сообщение автора поблагодарили: Proid (1). |
27.05.2008, 09:20 | #7 |
Участник
|
SELECT FIRSTFAST * FROM InventTable WHERE VendContractItem.ItemId=InventTable.ItemId EXISTS JOIN FIRSTFAST * FROM InventItemRangeRef WHERE InventTable.ItemRangeIdRef = InventItemRangeRef.RangeIdRef
Странно, но почему этот запрос формируется Аксаптой ... Связь InventTable с InventItemRangeRef и то через другую таблицу только на датасорсах. Вообще задача такая - переделать добавление из классификатора с фильтрацие по договорам. Если делать через добавления датасорса и установкой связи inner join - отрабатывает нормально, но уже существующий функциал дает сбой с первой записью. Ковыряться довольно муторно, вот и решил может программно выбирать записи в inventTable. Но чувствую, придется ковыряться именно в работе фунционала классификатора. |
|