|
![]() |
#1 |
Участник
|
Предлагаю следующего рода решение проблемы. Любой 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). |
Теги |
ax3.0 |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|