Как добавить состояние доступности инвентаря в пользовательскую сетку, как SO301000 - PullRequest
0 голосов
/ 19 марта 2019

Мы добавляем пользовательский экран, который использует ID сайта и ID инвентаризации в строке определенной сетки на странице. Мы хотели бы добавить детали доступности инвентаря, как показано на SO301000 (график ввода заказов на продажу).

А) Как получить доступ к области состояния сетки для размещения текста. Б) Есть ли стандартный метод, к которому я могу получить доступ для текста, используемого на SO301000.

1 Ответ

1 голос
/ 20 марта 2019

Функция называется StatusField.

Вы определяете поле состояния в сетке управления ASPX:

<px:PXGrid ID="grid" runat="server" DataSourceID="ds" StatusField="Availability">

Это может быть установлено с событием FieldSelecting:

public void SOLine_Availability_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)

Экран заказа клиента объединяет его спредставление пользовательских данных выделения, которое затрудняет повторное использование:

public LSSOLine lsselect;

В LSSOLine классе вы найдете метод Availability_FieldSelecting, который вычисляет значение:

public override void Availability_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
{
    var fetchMode = ((SOLine) e.Row)?.Completed == true
        ? AvailabilityFetchMode.None
        : AvailabilityFetchMode.ExcludeCurrent;
    IQtyAllocated availability = AvailabilityFetch(sender, (SOLine)e.Row, fetchMode | AvailabilityFetchMode.TryOptimize);

    if (availability != null)
    {
        PXResult<InventoryItem, INLotSerClass> item = ReadInventoryItem(sender, ((SOLine)e.Row).InventoryID);

        decimal unitRate = INUnitAttribute.ConvertFromBase<SOLine.inventoryID, SOLine.uOM>(sender, e.Row, 1m, INPrecision.NOROUND);
        availability.QtyOnHand = PXDBQuantityAttribute.Round((decimal)availability.QtyOnHand * unitRate);
        availability.QtyAvail = PXDBQuantityAttribute.Round((decimal)availability.QtyAvail * unitRate);
        availability.QtyNotAvail = PXDBQuantityAttribute.Round((decimal)availability.QtyNotAvail * unitRate);
        availability.QtyHardAvail = PXDBQuantityAttribute.Round((decimal)availability.QtyHardAvail * unitRate);

        if(IsAllocationEntryEnabled)
        {
            Decimal? allocated = PXDBQuantityAttribute.Round((decimal)(((SOLine)e.Row).LineQtyHardAvail ?? 0m) * unitRate); ;
            e.ReturnValue = PXMessages.LocalizeFormatNoPrefix(Messages.Availability_AllocatedInfo,
                    sender.GetValue<SOLine.uOM>(e.Row), FormatQty(availability.QtyOnHand), FormatQty(availability.QtyAvail), FormatQty(availability.QtyHardAvail), FormatQty(allocated));
        }
        else
            e.ReturnValue = PXMessages.LocalizeFormatNoPrefix(Messages.Availability_Info,
                    sender.GetValue<SOLine.uOM>(e.Row), FormatQty(availability.QtyOnHand), FormatQty(availability.QtyAvail), FormatQty(availability.QtyHardAvail));


        AvailabilityCheck(sender, (SOLine)e.Row, availability);
    }
    else
    {
        //handle missing UOM
        INUnitAttribute.ConvertFromBase<SOLine.inventoryID, SOLine.uOM>(sender, e.Row, 0m, INPrecision.QUANTITY);
        e.ReturnValue = string.Empty;
    }

    base.Availability_FieldSelecting(sender, e);
}

Iпосоветовал бы пропустить использование LSSOLine и просто скопировать его метод FieldSelecting.

Этот подход более подробно описан в следующем ответе: https://stackoverflow.com/a/45034612/7376238

...