AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.06.2012, 15:50   #1  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Предлагаю следующего рода решение проблемы. Любой 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;
}
P.S. Скажу сразу, что это не идеальное решение. В той же таблице у Relation VendTableBankAccount связь по AccountType == LedgerJournalACType::Vend стоит на той же позиции, что и в VendTable. Но по алфавиту VendTableBankAccount позже VendTable )))). Поэтому залипуха работает. )))
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 28.06.2012 в 16:08.
За это сообщение автора поблагодарили: Sada (6), S.Kuskov (5).
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
И снова про Relation Corsar DAX: Программирование 7 24.10.2008 14:19
CustTrans CustInvoiceJour relation Avic DAX: Программирование 0 02.05.2005 12:31
Relation на таблице и EDT Alex_K DAX: Программирование 2 15.12.2004 15:49
О динамическом Relation в EDT у поля таблицы NIMERE DAX: Программирование 4 23.03.2004 13:21
Создать Relation в AOT программным кодом EVGL DAX: Программирование 3 21.05.2003 12:47
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:51.