サーチ…


前書き

Acumatica ERPを使用すると、貨物を管理して、セールス・トランザクションの追加コストと収益をより適切に管理できます。あなたの顧客に請求する貨物量には、あなたの会社が運送業者によって請求される貨物だけでなく、貨物輸送条件と保険料貨物によって定められる保険、取扱いおよび梱包手数料も含まれます。

出荷および請求書の貨物額のオーバーライド

箱からすぐAcumaticaはシステムの出荷条件のリストを作成し、維持することを可能にする。出荷条件は、出荷額に応じて、出荷、梱包、および取扱費用を定義するために使用されます。

この例では、受注金額に基づいて貨物の貨物量を計算する方法を示します。これにより、ユーザーはすべての出荷に自動的に適用される同じ出荷条件で受注ごとに複数の出荷を作成できます。

FreightCalculator

FreightCalculatorクラスは、運賃と運賃の計算を担当します。この例では、 GetFreightTermsメソッドの周りだけに興味があります。

public class FreightCalculator
{
    ...

    protected virtual ShipTermsDetail GetFreightTerms(string shipTermsID, decimal? lineTotal)
    {
        return PXSelect<ShipTermsDetail,
            Where<ShipTermsDetail.shipTermsID, Equal<Required<SOOrder.shipTermsID>>,
            And<ShipTermsDetail.breakAmount, LessEqual<Required<SOOrder.lineTotal>>>>,
            OrderBy<Desc<ShipTermsDetail.breakAmount>>>.Select(graph, shipTermsID, lineTotal);
    }

    ...
}

受注画面と出荷画面では、 FreightCalculatorクラスを使用して、 受注額と出荷量に基づいて貨物量を計算します。

受注

public class SOOrderEntry : PXGraph<SOOrderEntry, SOOrder>, PXImportAttribute.IPXPrepareItems
{
    ...

    public virtual FreightCalculator CreateFreightCalculator()
    {
        return new FreightCalculator(this);
    }

    ...

    protected virtual void SOOrder_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
    {
        ...

        PXResultset<SOLine> res = Transactions.Select();
        FreightCalculator fc = CreateFreightCalculator();
        fc.CalcFreight<SOOrder, SOOrder.curyFreightCost, SOOrder.curyFreightAmt>(sender, (SOOrder)e.Row, res.Count);

        ...
    }

    ...
}

貨物

public class SOShipmentEntry : PXGraph<SOShipmentEntry, SOShipment>
{
    ...

    protected virtual FreightCalculator CreateFreightCalculator()
    {
        return new FreightCalculator(this);
    }

    ...

    protected virtual void SOShipment_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
    {
        ...

        PXResultset<SOShipLine> res = Transactions.Select();
        ...
        FreightCalculator fc = CreateFreightCalculator();
        fc.CalcFreight<SOShipment, SOShipment.curyFreightCost, SOShipment.curyFreightAmt>(sender, (SOShipment)e.Row, res.Count);

        ...
    }

    ...
}

貨物額のオーバーライド

AcumaticaがShipments画面で貨物量を計算する方法をカスタマイズするには、 FreightCalculatorから継承したFreightCalculatorCstクラスを宣言し、 GetFreightTermsメソッドをオーバーライドします。

public class FreightCalculatorCst : FreightCalculator
{
    public FreightCalculatorCst(PXGraph graph)
        : base(graph)
    {
    }

    protected override ShipTermsDetail GetFreightTerms(string shipTermsID, decimal? lineTotal)
    {
        if (graph is SOShipmentEntry)
        {
            var shipmentEntry = graph as SOShipmentEntry;
            int orderCount = 0;
            decimal? lineTotalTemp = null;

            foreach (PXResult<SOOrderShipment, SOOrder, CurrencyInfo, SOAddress, SOContact, SOOrderType> orderRec in 
                shipmentEntry.OrderList.SelectWindowed(0, 2))
            {
                orderCount++;
                SOOrder order = (SOOrder)orderRec;
                if (orderCount == 1)
                    lineTotalTemp = order.LineTotal;
                else
                    break;
            }

            if (orderCount == 1)
            {
                lineTotal = lineTotalTemp;
            }
        }

        return base.GetFreightTerms(shipTermsID, lineTotal);
    }
}

その後、 SOShipmentEntry BLCの拡張機能を実装し、 CreateFreightCalculatorメソッドをオーバーライドして、 FreightCalculator出荷画面のカスタムFreightCalculatorCstクラスに置き換えます。

public class SOShipmentEntryExt : PXGraphExtension<SOShipmentEntry>
{
    [PXOverride]
    public FreightCalculator CreateFreightCalculator()
    {
        return new FreightCalculatorCst(Base);
    }
}

上記のサンプルでのFreightCalculatorCstクラスの実装の理解

オーバーライドされたGetFreightTermsメソッドでは、出荷額の代わりに受注からの金額を使用して、基本GetFreightTermsメソッドを呼び出して出荷条件を受け取ります。

foreach (PXResult<SOOrderShipment, SOOrder, CurrencyInfo, SOAddress, SOContact, SOOrderType> orderRec in 
    shipmentEntry.OrderList.SelectWindowed(0, 2))
{
    orderCount++;
    SOOrder order = (SOOrder)orderRec;
    if (orderCount == 1)
        lineTotalTemp = order.LineTotal;
    else
        break;
}

if (orderCount == 1)
{
    lineTotal = lineTotalTemp;
}

明らかに、受注額を使用して貨物の貨物量を計算することは可能です。貨物量は1注文のみです。 1つの貨物が複数の注文を満たしている場合は、基本的な製品の挙動に従い、貨物量に基づいて貨物量を計算する必要があります。出荷オーダー数を確認するために、 OrderListデータビューでSelectWindowedメソッドを使用し、現在の出荷で最初に実行された2つのオーダーを要求しました。貨物を計算するために出荷金額の代わりに受注金額を使用できるかどうかを確認するために必要な数よりも多くのレコードに実行し返すまでにはかなりの時間がかかります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow