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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.02.2010, 12:13   #1  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
-> MarkupTable.checkCustAccount(), баг?
Затрудняюсь с позиционированием вопроса, пусть будет "Прочий".
Просьба перенести при необходимости.


Указанный в сабже метод на таблице (Версии 3.0 - 2009, вроде не менялось)
X++:
boolean  checkCustAccount()
{
    boolean  ok = true;
    ;

    if (this.CustAccount)
    {
        ok = LedgerTable::checkAllowPosting(this.CustAccount);
    }

    if (this.CustType != MarkupType::LedgerAccount && (this.CustType != MarkupType::Item || !PurchParameters::find().PostChargeAccount))
    {
        if (this.CustAccount)
            ok = checkFailed("@SYS25165");
    }
    else
    {
        if (this.CustType != MarkupType::Item || !PurchParameters::find().PostChargeAccount)
            if (!this.CustAccount)
                ok = checkFailed("@SYS25989");
    }

    return ok;
}
Варианта 3, либо тут баг, либо лишний код, лио я вообще ничего не понимаю.
Поясню:
- В первый блок ( if (this.CustType != MarkupType::LedgerAccount && (this.CustType != MarkupType::Item || !PurchParameters::find().PostChargeAccount)) ) заходим, если тип Клиент/Поставщик, либо тип Номенклатура с НЕустановленной птичкой PostChargeAccount. В этом случае счёт задавать нельзя. С этим всё понятно.
- Во второй блок (else) мы заходим соответсвенно в остальных случаях (Тип = Бух.Счёт либо тип Номенклатура с установленной птичкой). Но на горизонте появляется этот второй IF (if (this.CustType != MarkupType::Item || !PurchParameters::find().PostChargeAccount)), вторая часть которого вообще в данном случае бессмысленна, т.к. с неустановленной галкой при типе Номенклатура мы в этот блок в принципе не зайдём.
Может конечно они ошиблись с отрицанием, но тогда весь этот IF во втором блоке - тавтология. Да и судя по соседнему методу checkCustType(), это не совсем верно...

Вообщем не совсем понятно с точки зрения функционала, как правильно...
__________________
Zhirenkov Vitaly
Старый 17.02.2010, 13:16   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Не вдаваясь в смысл проверок, могу предложить моё видение этого кода
Код:
if (A && B) // (1) сюда попадём если условие A = true и B = true
else if (B) // (2) сюда попадём если условие A = false, a B = true
получается для возникновения ошибки условие B должно быть всегда истино. Т.е. логично было бы написать так:
Код:
if (B)
{
    if (A) {/* (1) сюда попадём если условие A = true и B = true */}
    else   {/* (2) сюда попадём если условие A = false, a B = true */}
}
В итоге получаем, что-то вроде
X++:
    if (this.CustType != MarkupType::Item || !PurchParameters::find().PostChargeAccount)
    {
        if ((this.CustType != MarkupType::LedgerAccount) && this.CustAccount)
            ok = checkFailed("@SYS25165");
        if ((this.CustType == MarkupType::LedgerAccount) && !this.CustAccount)
            ok = checkFailed("@SYS25989");
    }
Старый 17.02.2010, 13:29   #3  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
В данном случае вопрос был "с точки зрения функционала", как должно быть, и почему написано именно так.

То что конкрено этот код можно сократить, я описал сразу. Просто не хотелось бы упустить какую багу. Так что извините, но лучше уж "вдаваясь в смысл проверок"...
__________________
Zhirenkov Vitaly
Старый 17.02.2010, 15:05   #4  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Рискну предположить, что custAccount должен быть заполнен обязательно только, если CustType = MarkupType::LedgerAccount, обязательно быть пустым, если CustType = MarkupType::CustVend, и может быть заполнено, а может быть и нет для CustType = MarkupType::Item. (вроде логичная предпосылка ).

Теперь разложим if - как это сделал S.Kuskov

Цитата:
if (A && B) // (1) сюда попадём если условие A = true и B = true
else
{
if (B) // (2) сюда попадём если условие A = false, a B = true
}
В нашем случае, мы попадаем в else :
либо A = false и B = true,
либо наоборот A = true, B = false,
либо A и B = false - одновременно;
где
X++:
A = this.CustType != MarkupType::LedgerAccount 
B = (this.CustType != MarkupType::Item || !PurchParameters::find().PostChargeAccount)
A и B = false - одновременно, говорят, что это тип номеклатура с галкой PostChargeAccount => можешь задавать CustAccount, а можешь и нет(вот тут не совсем ясно, обязательно ли должно быть заполнено поле CustAccount, если да, то ошибка в проверке, если может быть заполнено, а может быть и нет, то все вроде ок)

В случае, когда A или B - false, соответственно нужно проверять заполненость custAccount, когда CustType = MarkupType::LedgerAccount, т.е. когда A = false и B = true => писать в коде либо if (! A), либо if (B) - выбран второй вариант, почему так, сказать сложно, конечно нагляднее написать проверку :

X++:
if (this.CustType = MarkupType::LedgerAccount)
но работать будет одинаково.
__________________
Sergey Nefedov
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Баг на форме "Проводки по сопоставлению" S.Kuskov DAX: Программирование 12 29.04.2009 19:19
Баг при печати налогового кода petr DAX: Программирование 0 25.03.2009 16:33
Баг SysDataImport Logger DAX: База знаний и проекты 2 16.07.2008 15:16
Нашёл баг, причем очень похоже на баг ядра (SP5 FP2 KR2) Deep Dreamer DAX: Программирование 5 10.11.2006 18:04
баг в 2.5. Будьте осторожнее с символом "_" подчеркивание levsha DAX: Программирование 5 07.12.2004 12:26

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

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

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