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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.01.2020, 13:45   #421  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Оптимизировал немного кастомный код в плане как производительности, так и удобочитаемости
X++:
public Boolean ppoContainerActive(InventDimGroupId _dimGroup)
{
    // > Modified by ---------- ----- (-------@----------------.com), 01-21-2020, zzz_CHG0033895_SFWrkCtrAssignToWasteCode
    InventDimSetup  inventDimSetup;

    select firstonly RecId from inventDimSetup
        where inventDimSetup.DimGroupId == _dimGroup
           && inventDimSetup.Active
           && inventDimSetup.DimFieldId == fieldnum(InventDim, AFCInventContainerId);

    return inventDimSetup.RecId != 0;
    // < Modified by ---------- ----- (-------@----------------.com), 01-21-2020, zzz_CHG0033895_SFWrkCtrAssignToWasteCode
    //InventDimGroup  inventDimGroup;
    //InventDimSetup  inventDimSetup;
    //Boolean         doContainer;
    //;
    //
    //inventDimGroup = InventDimGroup::find(_dimGroup);
    //while select inventDimSetup where inventDimSetup.dimGroupId == _dimGroup
    //{
    //    if (inventDimSetup.Active == NoYes::Yes)
    //    {
    //        if (inventDimSetup.DimFieldId == fieldnum(InventDim, afcInventContainerId))
    //        {
    //            doContainer = true;
    //        }
    //    }
    //}
    //
    //return doContainer;
    // < Modified by ---------- ----- (-------@----------------.com), 01-21-2020, zzz_CHG0033895_SFWrkCtrAssignToWasteCode
}
__________________
// no comments
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 13.03.2020, 10:15   #422  
axm2017 is offline
axm2017
Участник
 
1,890 / 295 (13) ++++++
Регистрация: 15.05.2017
strange russian code
X++:
            vendTrans       = this.transBuffer();
            vendTransOpen   = this.transOpenBuffer();

            while select sum(AmountMST) from vendTransOpen
                group by RefRecId
                where vendTransOpen.AccountNum  == this.AccountNum
                   && vendTransOpen.TransDate   >= _fromDate
                   && vendTransOpen.TransDate   <= _toDate
                join  vendTrans
                    where vendTrans.RecId       == vendTransOpen.RefRecId
                       && (vendTrans.Invoice    != ''
                       || (vendTrans.Invoice    == '' && vendTrans.AmountMST    < 0))
            {
                openBalanceMST += vendTransOpen.AmountMST;
            }
из openInvoiceBalanceMST в табличке VendTable.

Последний раз редактировалось axm2017; 13.03.2020 в 10:17.
Старый 13.03.2020, 10:28   #423  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от axm2017 Посмотреть сообщение
strange russian code
...
из openInvoiceBalanceMST в табличке VendTable.
А почему russian? Такой код и в старых версиях есть и полностью на слое SYS. russian там методы, которые баланс по договору считают.
Старый 13.03.2020, 11:15   #424  
axm2017 is offline
axm2017
Участник
 
1,890 / 295 (13) ++++++
Регистрация: 15.05.2017
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
А почему russian? Такой код и в старых версиях есть и полностью на слое SYS. russian там методы, которые баланс по договору считают.
Sorry, действительно не факт что русский, видимо американо-индийский , а по договорам там кстати подобный же косяк хотя там он имеет хоть какое то объяснение-обоснование.

Последний раз редактировалось axm2017; 13.03.2020 в 11:18.
Старый 24.03.2020, 14:30   #425  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Наткнулся в недрах класса JournalRunBaseBatch
X++:
public container  pack()
{
    throw error(Error::missingOverload(funcName()));
}
То же самое и для unpack().
Здесь как бы разница есть, перегружен метод, или переопределен.
Причем в Х++ сроду не было перегруженных методов.
Видимо, не сильно-то и важно. Заходим внутрь и видим:
X++:
//Do not use!
//Declare method as abstract instead or call Error::missingOverride();
#obsolete static LabelType missingOverload(str name)
{
    return Error::missingOverride(name);
}
Ладно, здесь возможно заглушку поставили на случай будущих апгрейдов в сторону нормальных языков.
Но что мешало сразу использовать missingOverride()?
Напомню, кто может не въехал.
Override - переопределение метода в рамках наследования.
Overload - перегрузка метода, т.е. в теле одного класса мы можем разместить дофига методов с одним и тем же именем, но разными параметрами. Что очень распространено в C#, Java и Delphi.
Такое чувство, что разработчики MS просто сами не сильно понимают в чем разница.
__________________
// no comments
Старый 15.06.2020, 17:15   #426  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Гендерно- и расово-нейтральный новояз прекрасен
Миниатюры
Нажмите на изображение для увеличения
Название: AllowList.GIF
Просмотров: 123
Размер:	33.2 Кб
ID:	12852  
__________________
-ТСЯ или -ТЬСЯ ?
Старый 23.12.2020, 18:44   #427  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
В этом месте у пользователя происходит раздвоение личности. Ошибки нет, но журнал не разносится.
Все-таки какая Аксапта прикольная, смеялся несколько минут над этим.

Нажмите на изображение для увеличения
Название: Скриншот 23-12-2020 184202.jpg
Просмотров: 204
Размер:	95.9 Кб
ID:	13014
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 06.07.2021, 18:40   #428  
online
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,689 / 1192 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вот не знаю, это ошибка или сознательно сделали

dax2012R3

Табличный метод PurchTable.initFromPurchAgreementHeader()


X++:
    select firstonly DeliveryPostalAddress, DeliveryName, Project, ContactPerson,
                     CashDiscountCode, MiscChargeGroup, DeliveryTerm, DeliveryMode,
                     PaymentSchedule, PaymentTerms
        from agreementHeaderDefault
        where agreementHeaderDefault.AgreementHeader == _purchAgreementHeader.RecId
        join firstonly    MethodOfPayment
                        , PaymentSpecification
                        , BuyerGroup
                        , VendorInvoiceAccount
                        , PurchasePool
            from purchAgreementHeaderDefault
            where purchAgreementHeaderDefault.PurchaseAgreementHeader == _purchAgreementHeader.RecId
        // <GEERU>
        outer join firstonly RecId,
                             InventProfileType,
                             InventProfileId,
                             VendPostingProfile,
                             vatOperationCode,
                             vatChargeSource
        from purchAgreementHeaderExt
        where purchAgreementHeaderExt.AgreementHeader == _purchAgreementHeader.RecId
        // </GEERU>
            ;
Тут проблема в том, что на таблицах AgreementHeaderDefault и PurchAgreementHeaderDefault стоит контроль на пустоту. Если все значимые поля пустые, то запись не создается или удаляется. Как следствие, если хотя бы по одной таблице записи не существует (т.е. не заполнены поля с данными), то не получим данные из остальных таблиц, даже если там что-то есть

В этом был какой-то глубокий смысл или "так получилось" ?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 27.07.2021, 11:24   #429  
mayk is offline
mayk
Участник
Аватар для mayk
 
43 / 65 (3) ++++
Регистрация: 07.03.2008
Наткнулся на прелести обновления индексированных полей InMemory таблиц
Пример 3 разных попыток обновления

X++:
   TmpFontName tmp;    
    ;    
    //(update_recordset)
    delete_from tmp; tmp.insert();
    update_recordset tmp setting FontName = tmp.FontName + 'a';
    while select tmp {info (tmp.FontName);}
    
    //(select forupdate)
    delete_from tmp; tmp.insert();
    while select forupdate tmp{ tmp.FontName += 'a'; tmp.update(); }
    while select tmp {info (tmp.FontName);}

    //(select forupdate order)
    delete_from tmp; tmp.insert();
    while select forupdate tmp order recid{ tmp.FontName += 'a'; tmp.update(); }
    while select tmp {info (tmp.FontName);}
Что выведет джоб? Вот что:
Цитата:
Сообщение (16:16:38)
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
a
А с TempDb такой ерунды нет. Обновление выполняется лишь один раз.
За это сообщение автора поблагодарили: dech (5), axm2017 (4).
Старый 26.11.2021, 16:48   #430  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Axapta 2012 R3
Расчеты с клиентами - Журналы - Платежи - Журнал платежей
Создаем первую строку в журнале. Вводим какого-то клиента
Создаем вторую строку в журнале. Вводит другого клиента
Стоя на второй строке журнала нажимаем "Фукнции - Сопоставление".
Помечаем проводки для сопоставления.
Потом не закрывая форму сопоставлений возвращаемся на форму строк журнала и встаем на первую строку
Потом возвращаемся на форму сопоставлений и закрываем её
И вуаля - в первую строку журнала записывается аналитика из клиента, который указан для второй строки.
А потом удивляемся при сведении балансов.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 15.12.2021, 11:04   #431  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Как бы и ошибок нет, Но индусы снова поражают своей логикой!
В классе PurchTableType:
X++:
/// <summary>
/// Checks if the invoice can be updated.
/// </summary>
/// <returns>
/// Returns true if the invoice can be updated.
/// </returns>
// <GIN>
public boolean  canInvoiceBeUpdated_IN()
{
    boolean  ok = true;

    ok = this.mayInvoiceBeUpdated();
    if (ok && !VendTable::canVendorBeUpdated(purchTable.OrderAccount, purchTable.InvoiceAccount, DocumentStatus::Invoice))
    {
        ok = false;
    }
    if (ok)
    {
        if (purchTable.InterCompanyOrder
            &&  purchTable.InterCompanyOriginalSalesId
            &&  purchTable.InterCompanyDirectDelivery)
        {
           ok = (!purchTable.interCompanyEndpointActionPolicy().PostPurchInvoice
                &&   purchTable.interCompanySalesTable().SalesStatus == SalesStatus::Invoiced);
        }
        ok = ok && true;  // Что это за дикость?
    }

    if (ok)
    {
        ok = this.checkPurchQty(DocumentStatus::Invoice);
    }

    return ok;
}
// </GIN>
__________________
// no comments
Старый 15.12.2021, 12:27   #432  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
X++:
ok = ok && true;
Возможно, что для чего-то потребовалось установить точку останова в этом месте, вот и написали код ,который не меняет ничего, а строку для точки останова даёт. А потом забыли прочистить.

До DAX2012, в которой точки останова срабатывают на скобке, завершающей блок кода или метода, иногда сам так делал.

Правда в рабочем приложении такое видеть, конечно, дикость.
Старый 15.12.2021, 13:58   #433  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,936 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
X++:
ok = ok && true;
Возможно, что для чего-то потребовалось установить точку останова в этом месте, вот и написали код ,который не меняет ничего, а строку для точки останова даёт. А потом забыли прочистить.
Я обычно завожу в глобале метод пустышку с именем dummy или empty и ставлю в код его вызов.
Старый 15.12.2021, 18:34   #434  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Не вполне баг кодинга, но все равно - неприятно поразившая меня фича D365FO.
С древних времен версии 2.1 и по крайней мере до последнего релиза DAX2012, удаление складских проводок при уменьшении количества в заказе шло в порядке OnOrder->ReserveOrdered->ReservePhysical. Все это происходило независимо от наличия/остуствия складской маркировки. В D365FO, добавили два прохода: Сначала оно обрабатывает в таком порядке складские проводки без маркировки, а потом с маркировкой.
У меня у клиента часто возникает такая ситуация: Клиент заказал допустим 40 подарков к рождеству; На складе удалось зарезервировать 30, и еще 10 примаркировали к закупке с ожидаемым сроком доставки 22.12. Потом клиент звонит и говорит что не хочет ждать, хочет 30 штук сразу, а вместо 10 недостающих подарков купит что-то другое в другой фирме.
В традиционных версиях DAX, если уменьшить количество в строке заказа до 30, то система оставит 30 штук физически зарезервированых и удалит складскую проводку на 10 штук в статусе "Зарезервировано в заказаных". В D365FO, она выкинет 10 штук из физически зарезервированой проводки (поскольку она не примаркирована), и оставит в итоге 20 штук зарезервированых на складе и 10 штук в заказаных. Так что если мы попытаемся отгрузить клиенту обещенные прямо сейчас 30 штук, система скажет что в этот раз мы можем отгрузить только 20 штук и тп. Единственный выход - отмаркировать злополучную складскую проводку от закупки до удаления количества...
За это сообщение автора поблагодарили: sukhanchik (6), twilight (3).
Старый 19.12.2021, 17:18   #435  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
X++:
ok = ok && true;
Возможно, что для чего-то потребовалось установить точку останова в этом месте, вот и написали код ,который не меняет ничего, а строку для точки останова даёт. А потом забыли прочистить.
В данном случае не нужно писать дополнительный код для точки останова.
Следующий if (ok) вполне пригоден для просмотра значений переменных.
Скорее выглядит как копипаста, когда лишний код убрали, оставив такую конструкцию.
__________________
// no comments
Старый 17.01.2022, 10:20   #436  
axm2017 is offline
axm2017
Участник
 
1,890 / 295 (13) ++++++
Регистрация: 15.05.2017
Может чего то не догоняю но в форме PurchTotals (ax 2012) переменная
PurchTotals purchTotals;
не используется а существует для фана.
Старый 17.01.2022, 13:50   #437  
online
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,689 / 1192 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Скорее всего, когда переделывали форму на разные таблицы-источники просто забыли удалить уже не нужную переменную из ClassDeclaration. Или была идея, что класс PurchTotals также будет общий. Возможно, как класс-родитель

Кстати, если есть сомнения, то просто закомментируйте объявление переменной. Формы-то наследоваться не могут. Не будет ошибок компиляции, значит реально не нужна
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 17.01.2022, 14:01   #438  
axm2017 is offline
axm2017
Участник
 
1,890 / 295 (13) ++++++
Регистрация: 15.05.2017
Так и делал
Нажмите на изображение для увеличения
Название: my test.png
Просмотров: 92
Размер:	88.4 Кб
ID:	13269

Думаю переделали но забыли убрать атавизм.
Старый 26.01.2022, 16:52   #439  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
В D365FO семейство классов RAssetProposal очень "занятно" распаковывает параметры в unpack(), из-за чего не так просто добавлять в это семейство новые параметры для сохранения в pack()/unpack().
Коллега недавно наткнулся на проблему, пытаясь применить к этому семейству рекомендации по расширению наследников RunBase. В рекомендациях говорится, что в pack() вашего класса-расширения нужно написать примерено так:
X++:
public container pack()
{
    container packedClass = next pack();
    return SysPackExtensions::appendExtension(packedClass, classStr(MySysUserLogCleanup_Extension), this.myPack());
}
При этом - внимание! - в конец общего контейнера допишется еще один элемент-контейнер с параметрами вашего расширения. Если расширений несколько, то, вероятно, допишется не один элемент, а несколько. В unpack() же класса-расширения вам надо написать примерно вот так:
X++:
public boolean unpack(container _packedClass)
{
    boolean result = next unpack(_packedClass);
    if (result)
    {
        container myState = SysPackExtensions::findExtension(_packedClass, classStr(MySysUserLogCleanup_Extension));
        result = this.myUnpack(myState); //Also unpack the extension
    }
    return result;
}
Но в случае RAssetProposal следование официальной инструкции приводит к ошибке времени выполнения в расширяемом классе: невозможно инициализировать queryRun из контейнера.
Вот как бы вы работали с queryRun в pack/unpack? Обычно это выглядит так:
X++:
public container pack()
{
    return [#CurrentVersion, #CurrentList, queryRun.pack()];
}
X++:
public boolean unpack(container _packedClass)
{
    Version version = RunBase::getVersion(_packedClass);
    boolean ret = true;

    switch (version)
    {
        case #CurrentVersion :
            container packedQuery;
            [version, #CurrentList, packedQuery] = _packedClass;
            if (SysQuery::isPackedOk(packedQuery))
            // ...
Обратите внимание, что конструкция вида
X++:
[version, #CurrentList, packedQuery] = _packedClass;
симметрична конструкции
X++:
return [#CurrentVersion, #CurrentList, queryRun.pack()];
она позволяет безболезненно отбросить все лишние элементы в конце контейнера _packedClass и взять своё строго с тех позиций, какие получились в вашем pack().
Но локализаторы же хитрее всех, поэтому они считают, что их запакованный queryRun всегда идет последним, и пишут вот что:
X++:
public boolean unpack(container packedClass)
{
    Integer     version = conPeek(packedClass,1);
    container   packedQuery = conPeek(packedClass, conLen(packedClass));
Поскольку наш контейнер стал длиннее за счет параметров класса-расширения, то вместо запакованного queryRun локализаторы, разумеется, получают левый контейнер и валятся на нем в ошибку времени выполнения.
За это сообщение автора поблагодарили: ax_mct (5), S.Kuskov (5), dech (10), Pandasama (2).
Старый 27.01.2022, 03:00   #440  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от gl00mie Посмотреть сообщение
...
Но в случае RAssetProposal следование официальной инструкции приводит к ошибке времени выполнения в расширяемом классе: невозможно инициализировать queryRun из контейнера.
...
Вот как бы вы работали с queryRun в pack/unpack? Обычно это выглядит так:
...
Re: "контейнер стал длиннее"

Спасибо за опыт! Делаю вывод что в топку их инструкцию так любое их обновление unpack может вызвать подобный сценарий ошибки.

Часв два времени сделать свою таблицу и отладить код для хранения своего контейнера.

То есть:
CoC на pack/unpack но без изменений того что кладется и вынимается.
Собственная таблица для хранения своего дополнительного контейнера.

Напрягает что в любом будущем автоматическом накате изменений может быть такая ошибка. Сейчас OK, а скажем через год добавят диалоговый параметр и плохо напишут код в unpack.

Думаю что это самый классический случай когда будущее изменение вендора может сломать приложение без ошибок компиляции.

Кто будет виноват. Мы. Из-за нашего расширения ошибка - да.
Подстава.
Теги
axapta, cil, d365fo, guid, rasset, uuid, uuidv7, баг

 


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

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

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