【问题标题】:Add column of InventoryID selector on SOLine Acumatica在 SOLine Acumatica 上添加 InventoryID 选择器的列
【发布时间】:2017-01-12 11:15:44
【问题描述】:

我需要在销售订单行上添加 InventoryID 选择器的客户零件编号和供应商零件编号列,以便用户在创建 SO 行时按零件编号选择 InventoryID。将列从自定义项目 > 自定义数据类 > 选择器列添加到选择器无济于事。所以,我尝试自定义属性,但仍然没有成功,因为 SOLine DAC 上 InventoryID 字段的定义是这样的:

[SOLineInventoryItem(Filterable=true)]
[PXDefault()]

需要帮助来弄清楚如何自定义这种属性。

【问题讨论】:

  • 一个项目可以有多个客户/供应商零件编号,您打算如何在选择器中显示?

标签: acumatica


【解决方案1】:

在 Acumatica 中,客户和供应商零件编号存储在库存项目屏幕上的交叉引用选项卡中。如下图所示,在 INItemXRef DAC 中声明了 AlternateID,并且 InventoryItem 和 INItemXRef DAC 之间存在一对多的关系:

话虽如此,无法将客户和供应商零件编号列添加到 InventoryID 选择器中,因为这会导致重复的 InventoryItem 记录。

另一种解决方案是在 InventoryItem DAC 中创建自定义文本字段,然后覆盖 InventoryItemMaint BLC 扩展中的 Persist 以连接备用 ID 并将结果存储在自定义文本字段(DB 列)中:

public class InventoryItemMaint_Extension : PXGraphExtension<InventoryItemMaint>
{
    [PXOverride]
    public void Persist(Action del)
    {
        using (PXTransactionScope ts = new PXTransactionScope())
        {
            InventoryItem item = Base.Item.Current;
            if (item != null && Base.itemxrefrecords.Cache.IsDirty)
            {
                string alternateIDs = string.Empty;
                foreach (INItemXRef crossRef in Base.itemxrefrecords.Select())
                {
                    alternateIDs = string.IsNullOrEmpty(alternateIDs) ?
                        crossRef.AlternateID : alternateIDs + "; " + crossRef.AlternateID;
                }
                item.GetExtension<InventoryItemExt>().UsrAlternateIDs = alternateIDs;
                Base.Item.Update(item);
            }

            del();
            ts.Complete();
        }
    }
}

为了简化初始设置,您还可以在 InventoryItemMaint BLC 扩展中实现 RecalcAlternateIDs 操作。 RecalcAlternateIDs 操作将遍历应用程序中的所有 Stock Items 并连接 Alternate ID:

public class InventoryItemMaint_Extension : PXGraphExtension<InventoryItemMaint>
{
    ...

    public PXAction<InventoryItem> RecalcAlternateIDs;
    [PXButton]
    [PXUIField(DisplayName = "Concatenate Alternate IDs")]
    protected void recalcAlternateIDs()
    {
        PXLongOperation.StartOperation(Base, () =>
        {
            InventoryItemMaint itemMaint = PXGraph.CreateInstance<InventoryItemMaint>();
            var items = PXSelect<InventoryItem, Where<InventoryItem.stkItem, Equal<boolTrue>>>.Select(itemMaint);
            foreach (InventoryItem item in items)
            {
                itemMaint.Clear();
                itemMaint.Item.Current = item;
                itemMaint.itemxrefrecords.Cache.IsDirty = true;
                itemMaint.Actions.PressSave();
            }
        });
    }
}

默认情况下,所有选择器控件都会根据键(或定义时的 SubstituteKey)和描述(如果已定义)字段构建搜索索引。要扩展此列表,您可以在 Aspx 中将 PXSelector/PXSegmentMask 控件的 FilterByAllFields 属性设置为 True,或者按照以下步骤使用 FastFilterFields。在我看来,FastFilterFields 似乎是满足您的要求的更好选择。

下一步需要将 UsrAlternateIDs 列添加到 InventoryID 选择器中

  1. 为“销售订单”屏幕 (SO301000) 启动布局编辑器,然后从“操作”菜单中选择“编辑 Aspx”选项:

  1. 在 Aspx 文件中找到 InventoryID 选择器的声明:

    <px:PXSegmentMask CommitChanges=“True" ID="edInventoryID" runat="server" DataField="InventoryID" AllowEdit="True" /> 
    
  2. 对于 InventoryID 选择器,通过声明 UsrAlternateIDs 列来附加列,然后单击生成自定义脚本:

    <px:PXSegmentMask CommitChanges="True" ID="edInventoryID" runat="server" DataField="InventoryID" AllowEdit="True" >
        <GridProperties FastFilterFields="UsrAlternateIDs">
            <Columns>
                <px:PXGridColumn DataField="UsrAlternateIDs" AutoGenerateOption="Add" Width="250px" />
            </Columns>
        </GridProperties>
    </px:PXSegmentMask>
    

【讨论】:

  • 不错。当我使用 crossRef.Descr 而不是 crossRef.AlternateID 时,出现了一些问题“字符串或二进制数据将被截断”。已经将自定义字符串 DAC 大小扩展到 255,但仍然出现相同的错误。
  • 您还需要更改数据库列大小并在此之后重新启动 IIS。我建议您将列类型设置为nvarchar(4000)。不要忘记编辑 project.xml 并增加列长度,因此当您在另一个实例上部署项目时,会创建正确大小的列。
  • 删除 UsrAlternateID 并使用更长的尺寸重新创建它。发布,它工作正常。
猜你喜欢
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多