Acumatica PXSelector,用于在选择不同记录时不更改记录的自定义表

Acumatica PXSelector,用于在选择不同记录时不更改记录的自定义表,acumatica,Acumatica,我一直在努力让这个工作,但没有成功。我自定义了几十个现有页面,并为现有数据库表使用了选择器,但无法为自定义表的Maint页面使用选择器 我制作了一个带有表单的自定义页面,并尝试使用CD作为显示添加一个选择器。通过阅读文档并与其他开箱即用页面进行比较,我得出了以下结论 在我的数据库中,我的ID字段是我的PK和自动增量int NOTNULL,CD只是一个nvarchar(10)NOTNULL 这是我的DAC中的ID和CD: #region ID [PXDBIdentity()]

我一直在努力让这个工作,但没有成功。我自定义了几十个现有页面,并为现有数据库表使用了选择器,但无法为自定义表的Maint页面使用选择器

我制作了一个带有表单的自定义页面,并尝试使用CD作为显示添加一个选择器。通过阅读文档并与其他开箱即用页面进行比较,我得出了以下结论

在我的数据库中,我的ID字段是我的PK和自动增量int NOTNULL,CD只是一个nvarchar(10)NOTNULL

这是我的DAC中的ID和CD:

    #region ID
    [PXDBIdentity()]
    [PXUIField(DisplayName = "ID")]
    public Int32? ID { get; set; }
    public class iD : IBqlField { }
    #endregion

    #region DesignCD
    [PXDBString(10, IsUnicode = true, IsKey = true)]
    [PXSelector(typeof(UsrDesign.iD), SubstituteKey = typeof(UsrDesign.designCD))]
    public string DesignCD { get; set; }
    public class designCD : IBqlField { }
    #endregion
我可以使用“上一个”和“下一个”按钮在记录之间切换,一切都很好,但使用选择器时不会更改记录。我尝试过commit changes=true和我能想到的所有其他变体

有人能帮我解决这个看似愚蠢的问题吗


谢谢

我在使用Identity字段时遇到了类似的问题,在这方面我找不到合适的解决方案

我们所做的是,我们从db和dac中删除了identity属性 //[PXDBIdentity(IsKey=true)]

在行持久化事件中,如果ID为null,我们手动生成下一个ID

protected virtual void ROW_RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
        {
            if (e.Row == null) return;

            ROW Doc = (ROW)e.Row;
            if ((e.Operation & PXDBOperation.Command) == PXDBOperation.Insert)
            {
                 ROW LastDoc = new ROW();
                if (Doc.ID == null || Doc.ID.Equals("<NEW>"))
                {
                    try
                    {
                        LastDoc = (ROW)PXSelectGroupBy<ROW, Aggregate<Max<ROW.ID>>>.Select(this);
                    }
                    catch { }
                    if (LastDoc != null)
                    {
                        if (LastDoc.ID != null)
                            Doc.ID = LastDoc.ID + 1;
                        else
                            Doc.ID = 1;
                    }
                }
            }
}
protected virtual void ROW\u ROW持久化(PXCache发送方,PXRowPersistingEventArgs e)
{
if(e.Row==null)返回;
行文档=(行)e.ROW;
if((e.Operation&PXDBOperation.Command)=PXDBOperation.Insert)
{
行LastDoc=新行();
如果(Doc.ID==null | | Doc.ID.Equals(“”)
{
尝试
{
LastDoc=(行)PXSelectGroupBy.Select(此);
}
捕获{}
如果(LastDoc!=null)
{
如果(LastDoc.ID!=null)
Doc.ID=LastDoc.ID+1;
其他的
Doc.ID=1;
}
}
}
}
我不知道这个问题的确切原因,但这就是我们解决问题的方法。希望对你有帮助。

克里斯

由于选择器属性已附加到CD属性,请尝试将其定义中的
iD
更改为
designCD
,它应该可以工作:


[PXSelector(typeof(UsrDesign.designCD),SubstituteKey=typeof(UsrDesign.designCD))

在我的场景中,选择器的问题是由于在表单上以及页面上的选项卡上使用了相同的数据成员造成的。我不太明白为什么会有这样的问题,但是创建一个替代视图PXSelect>>CurrentDesign并指定该视图的选项卡可以解决这个问题

希望这能帮助将来可能犯同样错误的人


谢谢大家的帮助。

顺便问一下,您是否尝试过将ID设置为密钥?是的,尝试过使用ID,尝试过根本没有ID,而只是将CD用作主ID。我有一个关于Acumatica的案例,所以一旦我收到他们的工作回复,我会更新帖子。嗯,实际上我当时也提出了一个案例,我下面回答的是他们给我们的解决方法。我相信是在v4.1中。