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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.10.2007, 12:50   #1  
Димитрий
Гость
 
n/a
? SysLookUp по Relation
Доброго дня. Аксапта 3.0

Проблема возникает при накладывании фильтра на таблицу LedgerJournalTrans по счету(корр. счету.)

Если попробовать наложить фильтр на данную таблицу стандартным образом через SysQueryForm по полю счет, предварительно выбрав тип счета, то не всегда выпадают нужные данные в lookup форме.

Если взять тип Банк или Клиенты, то все нормально. Если Поставщик или Подотч.лица - то нет. За формирование выпадающей формы ответственен класс SysLookUp и в частности его метод lookupTableRelation. Он ищет в Relations таблицы LedgerJournalTrans "подходящий" и на его основе дает выпадающую форму. Т.к. отношение Клиенты находится вначале списка, то попав на них остальные не просматриваются и все в порядке. Поставщики же в конце списка и метод находит более раннее и подходящее и дает его. В итоге имеем не нужный выпадающий список.

Сталкивался ли кто-нибудь с этой проблемой и если сталкивался, то как ее решал?

Спасибо.
Старый 15.10.2007, 13:11   #2  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от Димитрий Посмотреть сообщение

Сталкивался ли кто-нибудь с этой проблемой и если сталкивался, то как ее решал?
Если дело только в связях между источниками данных, то это решается примерно так
qbds.relations(false);
Старый 27.06.2012, 17:43   #3  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
наткнулся в 2009 RU8. Чего делать то?)))
Старый 28.06.2012, 15:50   #4  
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, время: 16:04.