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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.02.2018, 19:17   #301  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Здравствуйте! Возможно кто-то уже упоминал об этом, но всё же запощу.

Форма, используемая при создании лукапа для мульселект контрола:

SysLookupMultiSelectGrid

метод executeQuery датасорса Common.

X++:
if(queryRunCursor)
{
    if(queryRunCursor.isTempDb() || queryRunCursor.isTmp())
    {
        formDataSourceCursor.setTmpData(queryRunCursor);
    }
    else
    {
         formDataSourceCursor.data(queryRunCursor);
    }
}
queryRunCursor.isTmp() кейс покрыт с помощью setTmpData()

а вот queryRunCursor.isTempDb() кейс подразумевал бы чего-то вроде:

X++:
formDataSourceCursor.linkPhysicalTableInstance(queryRunCursor);
даже если это крайнемаловероятный вариант.

Скажите пожалуйста что думаете. заранее спасибо.

UPD: Dynamics 365 U10

Последний раз редактировалось Cardagant; 15.02.2018 в 19:22.
Старый 15.02.2018, 21:39   #302  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от Cardagant Посмотреть сообщение

queryRunCursor.isTmp() кейс покрыт с помощью setTmpData()

а вот queryRunCursor.isTempDb() кейс подразумевал бы чего-то вроде:

X++:
formDataSourceCursor.linkPhysicalTableInstance(queryRunCursor);
даже если это крайнемаловероятный вариант.

Скажите пожалуйста что думаете. заранее спасибо.

UPD: Dynamics 365 U10
Заведите баг, что тут думать.
Старый 06.06.2018, 09:08   #303  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1633 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Улыбнуло - Framework импорта валют в D365
Как его видели создатели судя по описанию -универсальная структура импорта поддерживающая X++ и .NET и все возможные варианты
Нажмите на изображение для увеличения
Название: ExchRateClasses.jpg
Просмотров: 504
Размер:	215.6 Кб
ID:	11943
что получилось на самом деле - из 3 источников загрузки(один из которых больше похож на тестовый) один реальный вообще не вписался в эту мега универсальную концепцию, старый добрый If в середине метода
Нажмите на изображение для увеличения
Название: ActualImplementation.jpg
Просмотров: 492
Размер:	186.3 Кб
ID:	11944
Старый 06.06.2018, 09:27   #304  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от trud Посмотреть сообщение
один реальный вообще не вписался в эту мега универсальную концепцию, старый добрый If в середине метода
Так это же русский if. Кто-то из местных обитателей решил не запариваться со всей этой сложностью и сделал "как в 9ке"
За это сообщение автора поблагодарили: belugin (5).
Старый 06.06.2018, 10:24   #305  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
У меня вообще эта концепция "Currency pair" из DAX2012 вызвала подозрение, что этот модуль был спроектирован кем-то без минимального знания бухгалтерского учета. Ну то есть - человек не знал что все равно все валюты нужно через первичную валюту учета пересчитывать, и спроектировал систему, в которой можно держать курсы вообще между любыми двумя валютами и пересчитывать из одной валюты в другую можно напрямую. А потом старшие товарищи указали ему на ошибку, и им пришлось отрубать половину разработанного механизма, чтобы потом в балансе не появились бредовые цифры.
Старый 06.06.2018, 10:40   #306  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1633 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от skuull Посмотреть сообщение
Так это же русский if. Кто-то из местных обитателей решил не запариваться со всей этой сложностью и сделал "как в 9ке"
я вот не соглашусь. т.е. если вы разрабатываете с нуля систему классов, вам в первую очередь надо подумать, чтобы другие "не запаривались", т.е. это вообще единственный критерий что вы сделали вашу систему классов правильно - что ее использование упросит разработку а никак не усложнит
ну и идею этих классов я не понял, т.е. загрузка курсов это вообще задания не имеющие ничего общего(разные параметры операций, разные параметры запуска, разные правила записи курсов и т.д.), т.е. чем RunBase + статический метод на таблице ExchRate для записи финального результата не устраивал непонятно

Последний раз редактировалось trud; 06.06.2018 в 10:50.
Старый 06.06.2018, 11:23   #307  
AlexSD is offline
AlexSD
Microsoft Dynamics
Сотрудники Microsoft Dynamics
 
257 / 302 (11) ++++++
Регистрация: 14.10.2003
Цитата:
Сообщение от skuull Посмотреть сообщение
Так это же русский if. Кто-то из местных обитателей решил не запариваться со всей этой сложностью и сделал "как в 9ке"
Это был я, когда делал этот провайдер для 2012

Последний раз редактировалось AlexSD; 06.06.2018 в 11:26.
За это сообщение автора поблагодарили: mazzy (5), Ivanhoe (1), fed (2), belugin (5), AlGol (2).
Старый 06.06.2018, 11:33   #308  
AlexSD is offline
AlexSD
Microsoft Dynamics
Сотрудники Microsoft Dynamics
 
257 / 302 (11) ++++++
Регистрация: 14.10.2003
Помню, было очень сложно объяснить авторам фреймворка, что у нас в стране есть курс "на завтра". ЦБ в 12 часов дня публиковал завтрашний курс. Изначально предложенная форма ввода параметров импорта не позволяла учитывать такую особенность. А уж внутренности ребята обещали поправить "в следующей версии", после анализа кода всех провайдеров. Но, видимо, они переключились на другой фронт, и этот фреймворк так и остался как задумался.
Старый 06.06.2018, 12:53   #309  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от trud Посмотреть сообщение
я вот не соглашусь. т.е. если вы разрабатываете с нуля систему классов, вам в первую очередь надо подумать, чтобы другие "не запаривались", т.е. это вообще единственный критерий что вы сделали вашу систему классов правильно - что ее использование упросит разработку а никак не усложнит
ну и идею этих классов я не понял, т.е. загрузка курсов это вообще задания не имеющие ничего общего(разные параметры операций, разные параметры запуска, разные правила записи курсов и т.д.), т.е. чем RunBase + статический метод на таблице ExchRate для записи финального результата не устраивал непонятно
Я не соглашусь. Есть разная аудитория и что понятно одной может быть непостижимо сложно для другой.
Ну и там где гибкость там и сложность, посмотрите что в GER наворотили, там же свой удивительный мир, не похожий на АХ.

Последний раз редактировалось skuull; 06.06.2018 в 13:04.
Старый 06.06.2018, 13:06   #310  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от skuull Посмотреть сообщение
Я не соглашусь. Есть разная аудитория и что понятно одной может быть непостижимо сложно для другой.
Я просто замечу, что в обоих случаях - это разработчики MS. Что в целом наводит на мысли что либо фреймворк кривой, либо организация работ в MS - кривая.
Старый 04.07.2018, 18:24   #311  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Коллега разбирался, почему в D365FO локализаторские отчеты выплевывают Excel-файлы без расширения, по причине чего они кулем валятся в Downloads, и приходится их переименовывать перед открытием. Оказалось, так работает чудесный обновленный XmlExcelReport_RU
Нажмите на изображение для увеличения
Название: ^F1FC1A43BA1AFA1E8220B416AB60F68D79BD350FC03B1657AE^pimgpsh_fullsize_distr.png
Просмотров: 438
Размер:	54.3 Кб
ID:	11966
Старый 05.07.2018, 12:19   #312  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1633 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от gl00mie Посмотреть сообщение
КОказалось, так работает чудесный обновленный XmlExcelReport_RU
В догонку метод filename() надо еще сделать private - чтобы никто екстеншн не дописал.
Старый 05.07.2018, 12:35   #313  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Коллега разбирался, почему в D365FO локализаторские отчеты выплевывают Excel-файлы без расширения
Насколько я знаю, этот функционал используется только в российских отчетах, которые официально не выпущены для 7+.

Коллеги сказали, что ошибка была исправлена.

P.S. Вообще, как мне казалось, WTF это для каких-то вопиющих штук типа

X++:
if (myBoolean.ToString().Length == 5)
А не для просто ошибок.
Старый 05.07.2018, 17:23   #314  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от belugin Посмотреть сообщение

P.S. Вообще, как мне казалось, WTF это для каких-то вопиющих штук типа

X++:
if (myBoolean.ToString().Length == 5)
А не для просто ошибок.
<Trollface> Надо будет клиентам рассказать что в микрософте ошибки делятся на WTF и на "просто ошибки".</Trollface>
Просто ошибка-то может и не тяжелая, но даже ради самой плевой ошибки приходится преодолевать сопротивление индусов. (Которые, похоже что, последнее время перегружены и письма по кэйзу пишут где-то раз в неделю...)

Последний раз редактировалось fed; 05.07.2018 в 18:40.
Старый 05.07.2018, 19:53   #315  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от fed Посмотреть сообщение
<Trollface> Надо будет клиентам рассказать что в микрософте ошибки делятся на WTF и на "просто ошибки".</Trollface>
Я думаю клиенты тоже так делают
Старый 06.07.2018, 11:11   #316  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Недавно потребовалось в АХ 4.0 просмотреть поля на всех таблицах определенного EDT типа. Соответственно решил использовать метод SysDictField.isDerivedFrom(). В итоге находилось 0 полей. Когда заглянул внутрь, дико ужаснулся. Код работает нормально только для вещественного типа и то как-то через одно место.
X++:
/*
    Returns true if the Extended Data Type property field is derived from the extended data type.
    Use extendedTypeNum() to get the id of type.
*/
boolean isDerivedFrom(extendedTypeId id)
{
    Types fieldType;
    extendedTypeId userTypeId;
    DictType dictType;
    boolean retval  = false;
    ;
    fieldType = this.baseType();

    if(fieldType == Types::Real)
    {
        dictType = new DictType(this.typeId());
        if (this.typeId() == id)
            retval = true;

        if(!retval)
        {
            userTypeId = this.typeId();
            dictType = new DictType(userTypeId);

            while(dictType!=null && !retval)
            {
                if (userTypeId == id)
                    retval = true;
                else
                {
                   userTypeId = dictType.extend();
                   dictType = new DictType(userTypeId);
                }
            }
        }
    }

    return retval;
}
Глянул код в АХ2012. Все кристально чисто:
X++:
/*
    Returns true if the Extended Data Type property field is derived from the extended data type.
    Use extendedTypeNum() to get the id of type.
*/
boolean isDerivedFrom(extendedTypeId id)
{
    return SysDictType::isEqualOrExtending(this.typeId(), id);
}
__________________
// no comments
Старый 08.08.2018, 07:47   #317  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 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, 13:37   #318  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Забыл добавить - перебор идет по декартову произведению таблицы-источника самой на себя.
У меня на BatchJobHistory c полутора миллионами записей форма умирала на пяток-другой минут.
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 08.08.2018, 13:59   #319  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Это какая версия? В Dynamics AX 2012 R3 какой-то CU теперь вот так:
X++:
/// <summary>
///    Tests whether the <see cref="M:FormDataSource.findRecord" /> method can be used to find the alerted
///    record in a form data source.
/// </summary>
/// <param name="alertFds">
///    Form data source of the alerted buffer; optional.
/// </param>
/// <returns>
///    true if the <c>findRecord</c> method can be used; otherwise, false.
/// </returns>
/// <remarks>
///    If the form data source of the alerted buffer is the first one and <see
///    cref="M:EventContextInformation.canUseLookup" /> returns false, then this method returns false. If
///    the number of records in the data source is more that 100, this method returns false. Otherwise, it
///    returns true.
/// </remarks>
private boolean canUseFindRecord(
    FormDataSource          alertFds = formRun.dataSource(alertFormDsName)
    )
{
    tableId                 tableId,tableId2,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;

        tableId2 = alertFds.isInheritanceDataSource() && alertFds.isBaseDataSource() ?
                            alertFds.masterInheritanceDataSource().table() :
                            alertFds.table();
        q       = new Query();
        qbds    = q.addDataSource(tableId2);

        // 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(tableId2).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;
}
__________________
Ivanhoe as is..
Старый 08.08.2018, 14:00   #320  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
И это, <censored>, слой SYP ...
За это сообщение автора поблагодарили: trud (1), gl00mie (1).
Теги
axapta, cil, d365fo, guid, rasset, uuid, uuidv7, баг

 

Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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