AXForum  
Вернуться   AXForum > Прочие обсуждения > Курилка
NAV
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.08.2018, 07:47   #1  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
885 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Класс EventContextInformation, используемый при переходе со стандартного оповещения к источнику, метод canUseFindRecord(), имеющий встроенную булевскую функцию test().

В строке 50 шикарнейшим образом инициализируется объект QueryBuildDataSource для запроса - тупо добавлением нового источника данных, независимо от того был Query унаследован с переданного источника данных формы или сформирован с нуля (т.е. кол-во источников данных в любом случае увеличивается на 1). Затем этот запрос передается в 92-й строке в SysQuery для подсчета кол-ва записей. Как работает этот подсчет - можете глянуть, при количестве источников данных в запросе большим одного - идет обычный итерационный перебор всех записей на клиенте.

Имеющие в таблицах-источниках оповещений значительное кол-во записей скажут спасибо за чудесные минуты ожидание открытия соотв. формы.

P.S. И это, <censored>, слой SYP ...

X++:
///    method returns false. Otherwise, it returns true.
/// </remarks>
private boolean canUseFindRecord(
    FormDataSource          alertFds = formRun.dataSource(alertFormDsName)
    )
{
    tableId                 tableId,childTableId;
    List                    fds2Dynas;
    ListEnumerator          fdsLe;
    Map                     dynalinkMap;
    container               dynaPack;
    MapEnumerator           dynaMe;
    Query                   q;
    QueryBuildDataSource    qbds;
    List                    keyList;
    Map                     keyFields;
    DictIndex               di;

    // If changed remember to updated the Dev. doc!
    #define.maxRecsForFind(100)

    boolean test()
    {
        // If first then lookup overrules
        if (alertQbdsNo == 1 && ! this.canUseLookup())
            return false;

        if (! alertBuffer)
            return false;

        if(alertFds.query() != null)
        {
            q   = alertFds.query();
        }
        else
        {
            q   = new Query();
        }
        qbds    = q.addDataSource(alertBuffer.TableId);

        // Use packed dyna info to find dyna fields from alert buffer to parent
        if (conlen(packedDynas) > 1)
        {
            fds2Dynas   = List::create(packedDynas);
            fdsLe       = fds2Dynas.getEnumerator();
            fdsLe.moveNext();
            [tableId,childTableId,dynaPack]  = fdsLe.current();

            keyList     = new List(Types::Integer);
            dynalinkMap = Map::create(dynaPack);
            dynaMe      = dynalinkMap.getEnumerator();
            while (dynaMe.moveNext())
            {
                keyList.addEnd(dynaMe.currentKey());
            }
            keyFields = SysDictTable::mapFieldIds2Values(keyList,alertBuffer);

            // Add dyna's values as ranges
            SysQuery::addRangesFromKeyData(qbds,keyFields.pack());

            // Add filter query
            if (filterQuery)
                SysQuery::mergeRanges(q,filterQuery);
        }
        else
        {
            // When no dyna's only use filter
            if (filterQuery)
            {
                q = filterQuery;

                di = this.getPrimaryIndex();
                if (di.field(1) == fieldnum(Common,RecId))
                {
                    q.dataSourceTable(alertBuffer.TableId).addRange(di.field(1)).value(SysQuery::value(alertBuffer.(di.field(1))));
                }
            }
        }

        if (q && (SysQuery::countLoops(new QueryRun(q)) <= #maxRecsForFind))
        {
            return true;
        }

        return false;
    }

    if (canUseFindRecordCalled)
    {
        return canUseFindRecordValue;
    }

    canUseFindRecordValue  = test();
    canUseFindRecordCalled = true;

    return canUseFindRecordValue;
}
__________________
Мы летаем, кружимся, нагоняем ужасы ...

Последний раз редактировалось TasmanianDevil; 08.08.2018 в 08:03.
Старый 08.08.2018, 14:00   #2  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
396 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
И это, <censored>, слой SYP ...
За это сообщение автора поблагодарили: trud (1), gl00mie (1).
Старый 10.08.2018, 12:56   #3  
brahma is offline
brahma
Участник
1C
 
278 / 80 (3) ++++
Регистрация: 01.12.2005
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
X++:
///    method returns false. Otherwise, it returns true.
/// </remarks>
Шикарно обрезался комментарий.
Теги
axapta, cil, d365fo, guid, rasset, uuid, uuidv7, баг

 


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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:30.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.