Dynamics 365 Финансы и Операция Расширение проверки SalesOrderLineEntity - PullRequest
0 голосов
/ 14 февраля 2019

Я все еще довольно новичок в разработке x ++.Я пытаюсь добавить некоторую проверку в SalesOrderLineEntity, чтобы остановить пользователей, импортирующих кол-во, которые не делятся на множественные кол-во.если упорядоченный кол-во не делится на кратное кол-во (то есть не целое число)), выдается ошибка.

[ExtensionOf(tableStr(SalesOrderLineEntity))]
final class SalesOrderLineEntity_Extension
{
boolean validateWrite()
{
InventItemSalesSetup inventItemSalesSetup;
SalesLine salesLine;

SalesTable salesTable = SalesTable::find(this.SalesOrderNumber);

select firstonly * from salesLine where salesLine.salesid == salesTable.SalesId
join inventItemSalesSetup where inventItemSalesSetup.ItemId == salesLine.ItemId;

if (this.RecId)
{
if (salesLine.QtyOrdered < inventItemSalesSetup.MultipleQty)
{
return checkFailed
("qty ordered less than multiple qty");
}
if (isInteger(salesLine.QtyOrdered / inventItemSalesSetup.MultipleQty))
{
return checkFailed
("qty ordered not divisible by multiple qty");
}
}

next validateWrite();

if (!salesTable.checkUpdate(true, true, true))
{
return false;
}

boolean ret;

//ret = super();

return ret;

}

}

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Пожалуйста, посмотрите готовый код, я считаю, что теперь он делает то, что я хочу.Спасибо за помощь.Будем весьма благодарны за любые предложения / полезные действия / улучшения к этому!

[ExtensionOf(dataentityviewstr(SalesOrderLineEntity))]
final class SalesOrderLineEntity_Extension
{
    boolean validateWrite()
    {
        InventItemSalesSetup    inventItemSalesSetup;
        SalesLine               salesLine;
    select firstonly * from salesLine where salesLine.Salesid == this.SalesOrderNumber
        && salesLine.ItemId == this.ItemNumber
        join inventItemSalesSetup where inventItemSalesSetup.ItemId == this.ItemNumber;

    boolean ret = next validateWrite();

    if (ret)
    {
        if (ret && this.OrderedSalesQuantity < inventItemSalesSetup.MultipleQty)
        {
            ret = checkFailed ("qty ordered less than multiple qty");
        }
        if (ret && this.OrderedSalesQuantity mod inventItemSalesSetup.MultipleQty != 0)
        {
            ret = checkFailed ("qty ordered not divisible by multiple qty");
        }
    }

    return ret;

}

}

0 голосов
/ 14 февраля 2019

Если вы используете целые числа, вам нужно использовать операцию по модулю (mod) в AX.Убедитесь, что вы не делите на ноль (мир может закончиться), и вы, вероятно, хотите проверить, что на самом деле было введено ненулевое количество.

if(salesLine.QtyOrdered && inventItemSalesSetup.MultipleQty && (salesLine.QtyOrdered mod inventItemSalesSetup.MultipleQty != 0)
{
    return checkFailed("qty ordered not divisible by multiple qty");
}

Если вы используете реалы, тоВы хотите сделать некоторую базовую целочисленную математику.

real            qtyOrdered;
real            multipleQty;
int             result;

qtyOrdered  = 321.0; // 321 / 10.7 = 30 exactly
multipleQty = 10.7;
result      = qtyOrdered / multipleQty; // This will store the integer and drop any decimals

// If the result multipled by the original multiple is equal to the original value, then you're good
if (result * multipleQty == qtyOrdered)
{
    info("All good!");
}
else
{
    info("Bad!");
}

Там может быть стандартной функцией AX, которая делает то, что вы хотите, но она настолько проста, что я просто делаю математику сам.

...