在 RowSelected 上创建缺失数据

Create missing data on RowSelected

我们有一个图表扩展,用于管理我们添加到屏幕的选项卡。该选项卡显示来自我们自己的 DAC 的数据。我们不使用 DAC 扩展,现在不打算讨论原因。

当用户打开主屏幕时,如果我们的数据不存在,我想用一些默认的业务逻辑创建一条记录。

我在主 DAC 上添加了一个 RowSelected 事件处理程序,它按照我的预期触发。当我添加代码以在事件处理程序中创建我们丢失的记录时,Acuminator 给我错误消息“PX1044 无法在事件处理程序中执行对 PXCache 的更改。”

我理解 Acuminator 提出的错误,但我不确定还有什么地方可以创建我们的记录。我不记得大学里有专门针对这种情况的部分。

谁能告诉我如何处理这种情况?如果可能,请指出涵盖此场景的学习 material 以获取更广泛的信息。

不幸的是,只有几种可行的方法可以做到这一点并让 Acuminator 开心。您将面临数据不一致的风险。

https://github.com/Acumatica/Acuminator/blob/master/docs/diagnostics/PX1044.md

我建议将您的数据插入代码放在已更新的行中,并希望用户更新一些内容

我收到了 Acumatica 支持人员的回复,您可以在视图 select 委托中执行此操作。

这是一些示例代码,不过我还没有测试过:

public class InventoryItemMaintExtension : PXGraphExtension<InventoryItemMaint>
{
    public SelectFrom<MyCustomTable>.
              Where<MyCustomTable.inventoryID.IsEqual<
              InventoryItem.inventoryID.FromCurrent>>.
              View AdditionalItemData;
    public static bool IsActive() { return true; }

    public IEnumerable additionalItemData()
    {
        var data = AdditionalItemData.SelectSingle();
        if (data is null)
        {
            data = new MyCustomTable();
            AdditionalItemData.Insert(data);
        }

        return AdditionalItemData.Select();
    }
}

[PXCacheName("Additional Item Data")]
[Serializable]
public class MyCustomTable : IBqlTable
{
    #region CashAccountID
    [Inventory]
    [PXDefault]
    public virtual int? InventoryID { get; set; }
    public abstract class inventoryID : PX.Data.BQL.BqlInt.Field<inventoryID> { }

    #endregion

    #region Required
    [PXDBBool()]
    [PXDefault(false)]
    [PXUIField(DisplayName = "Required")]
    public virtual bool? Required { get; set; }
    public abstract class required : PX.Data.BQL.BqlBool.Field<required> { }
    #endregion
}