AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Прочие вопросы
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 17.02.2010, 12:13   #1  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Join Date: 13.02.2004
Location: Минск
-> 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
Old 17.02.2010, 13:16   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Join Date: 28.04.2007
Location: Калуга
Не вдаваясь в смысл проверок, могу предложить моё видение этого кода
Code:
if (A && B) // (1) сюда попадём если условие A = true и B = true
else if (B) // (2) сюда попадём если условие A = false, a B = true
получается для возникновения ошибки условие B должно быть всегда истино. Т.е. логично было бы написать так:
Code:
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");
    }
Old 17.02.2010, 13:29   #3  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Join Date: 13.02.2004
Location: Минск
->
В данном случае вопрос был "с точки зрения функционала", как должно быть, и почему написано именно так.

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

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

Quote:
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
 

Similar Threads
Thread Thread Starter Forum Replies Last Post
Баг на форме "Проводки по сопоставлению" 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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 04:33.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.