|
15.10.2007, 12:50 | #1 |
Гость
|
SysLookUp по Relation
Доброго дня. Аксапта 3.0
Проблема возникает при накладывании фильтра на таблицу LedgerJournalTrans по счету(корр. счету.) Если попробовать наложить фильтр на данную таблицу стандартным образом через SysQueryForm по полю счет, предварительно выбрав тип счета, то не всегда выпадают нужные данные в lookup форме. Если взять тип Банк или Клиенты, то все нормально. Если Поставщик или Подотч.лица - то нет. За формирование выпадающей формы ответственен класс SysLookUp и в частности его метод lookupTableRelation. Он ищет в Relations таблицы LedgerJournalTrans "подходящий" и на его основе дает выпадающую форму. Т.к. отношение Клиенты находится вначале списка, то попав на них остальные не просматриваются и все в порядке. Поставщики же в конце списка и метод находит более раннее и подходящее и дает его. В итоге имеем не нужный выпадающий список. Сталкивался ли кто-нибудь с этой проблемой и если сталкивался, то как ее решал? Спасибо. |
|
15.10.2007, 13:11 | #2 |
MCT
|
|
|
27.06.2012, 17:43 | #3 |
Программатор
|
наткнулся в 2009 RU8. Чего делать то?)))
|
|
28.06.2012, 15:50 | #4 |
Участник
|
Предлагаю следующего рода решение проблемы. Любой Relation может состоять из нескольких связей, т.е. по нескольким полям(так называемых RelationLine), которые обозваны в Аксапте "Обычно","Поле фиксировано" и т.д..Принцип решения основан на том, что в каждом relation самые важные связи(RelationLine), особенно фиксированные устанавливаются впереди остальных. Критерий,скорость выборки и т.д..И LedgerJournalTrans не исключение. Relation VendTable таблицы LedgerJournalTrans сначала имеет связь по AccountType == LedgerJournalACType::Vend, потом по AccountNum, в то время как Relation RContractTableVend сначала по RContractStatus, потом по RContractPartnerType и потом уже по AccountType == LedgerJournalACType::Vend но попадает в лукап поскольку в алфавитном порядке по названию(RContractTableVend) стоит выше, чем VendTable. А стандартный алгоритм основан на том, что ищет первый попавшийся Relation и его использует, прекращая поиск. Предлагаю вариант, который пробежится по всем Relation-ам и выберет сначала тот, где нужная нами связь(RelationLine) стоит выше всех, а внутри этого уже по алфавиту.
Класс SysLookup метод lookupTableFixedRelation : X++: private static RelationName lookupTableFixedRelation(tableId _tableId, Common _common, Set _fixedRelationSet) { DictRelation dictRelation = new DictRelation(_tableId); SysDictField relationField; RelationName relationName; TmpSysQuery tmpSysQuery; boolean externFixed; SetIterator setIterator = new SetIterator(_fixedRelationSet); int j, relationLines; // kos int prevlineid; // kos ; tmpSysQuery.setTmpData(_common); setIterator.begin(); while (setIterator.more()) // && !relationName) // проверяем все связи, а не до первой попавшейся { dictRelation.loadNameRelation(setIterator.value()); relationLines = dictRelation.lines(); for (j=1; j < relationLines; j++) { if (dictRelation.lineType(j) == TableRelation::ThisFixed) { relationField = new SysDictField(_tableId, dictRelation.lineTableValue(j), 1); if (relationField.enumId()) { select firstonly tmpSysQuery index SortingIdx where tmpSysQuery.Field_Id == relationField.extendedFieldId() && tmpSysQuery.RangeValue; if (tmpSysQuery && dictRelation.lineExternTableValue(j) == SysLookup::enumLabel2Id(relationField.enumId(), tmpSysQuery.RangeValue)) { // kos ищем тот relation, где связь(relationLines) по интересующему нас полю стоит выше if (!prevlineid) { externFixed = true; prevlineid = j; relationName = setIterator.value(); } else { if ( j < prevlineid) { prevlineid = j; relationName = setIterator.value(); } } // kos ищем тот relation, где связь(relationLines) по интересующему нас полю стоит выше } else { externFixed = false; break; } } } } // kos проверяем все связи, а не до первой попавшейся /* if (externFixed) { relationName = setIterator.value(); } */ // kos проверяем все связи, а не до первой попавшейся setIterator.next(); } return relationName; }
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 28.06.2012 в 16:08. |
|
|
За это сообщение автора поблагодарили: Sada (6), S.Kuskov (5). |