微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将属性从库存项目拉到SO行自定义字段

如何解决将属性从库存项目拉到SO行自定义字段

我对Acumatica中的自定义编程比较陌生,我对将属性值从库存项目屏幕中的属性值拉到销售订单屏幕中SO行的自定义字段中的最佳方法有疑问。

我已经使用FieldSelecting事件和PXSelect语句在另一个屏幕上执行了类似的操作,以从另一个屏幕提取数据并更新了我的自定义字段

需要从属性值中提取值是我的绊脚石,我应该只加入pxselect中的CSAnswers表吗?

我还想问一问,是否有更好的整体方法可以将数据从另一个屏幕提取到Acumatica定制的定制字段中。

*更新* 我正在尝试使用PXDBScalar属性,但无法弄清楚如何联接多个表。这是我尝试过的。

    [PXDBScalar(typeof(
     Search2<CSAnswers.value,InnerJoin<InventoryItem,On<SOLine.inventoryID,Equal<InventoryItem.inventoryID>>>,InnerJoin<CSAnswers,On<InventoryItem.noteID,Equal<CSAnswers.refNoteID>>>,Where<CSAnswers.attributeID,Like<QHOLDAttr>>
                           >))]

谢谢 斯科特

解决方法

既然您要求“更好的整体方法”,那么我将分享我偏爱的解决方法。并不是说它“更好”,而可能只是“不同”。

我尝试使数据绑定到直接相关的对象。对于InventoryItem的属性,我将在DAC扩展中将该属性值提升为InventoryItem,以便可以在使用InventoryItem的任何地方利用它。您似乎想将其与SOLine记录结合使用,但是由于该属性未绑定到SOLine,因此我不会扩展SOLine来添加它。如果您的业务需求要求将其添加到那里并没有错,但是让我更加理智地知道InventoryItem的相关数据来自InventoryItem,而不是试图记住我在哪里放置它并可能在其他地方重复工作(例如POLine)。

这是我如何完成此操作的示例,直接从我的项目中提取,但将Attribute引用更改为更通用。

public sealed class InventoryItemExt : PXCacheExtension<PX.Objects.IN.InventoryItem>
{
    #region MyAttribute
    [PXString]
    [PXUIField(DisplayName = Messages.MyAttribDisplayName)]
    [PXDBScalar(typeof(Search<CSAnswers.value,Where<CSAnswers.refNoteID,Equal<InventoryItem.noteID>,And<CSAnswers.attributeID,Equal<MyAttribute>>>>))]
    public string MyAttribute { get; set; }
    public abstract class myAttribute : PX.Data.BQL.BqlString.Field<myAttribute> { }
    #endregion

    public class MyAttribute : PX.Data.BQL.BqlString.Constant<MyAttribute>
    {
        public MyAttribute() : base("MYATTRIB") { }
    }
}

请注意定义为访问附加到InventoryItem记录的Item Class的AttributeID“ MYATTRIB”的常量。

现在该属性被拉到InventoryItem的DAC扩展中,只要InventoryItem(和关联的DAC扩展)已可用于该屏幕,我就可以轻松地在任何与InventoryItem相关的屏幕上使用它。

未经测试,我可能对此不满意,但关于您尝试在PXDBScalar中联接2个表的问题……

当您说 Search2 时,表示您要搜索CSAnswers DAC并检索 value 字段。通过随后尝试InnerJoin返回CSAnswers,我相信您实际上已经说过:

Select CSAnswers.Value From CSAnswers
  Inner Join InventoryItem On SOLine.InventoryID = InventoryItem.InventoryID
  Inner Join CSAnswers...

我不确定SOLine参考在这里是否有效,但是可能是您直接在SOLine DAC扩展中定义了它。但是,您尝试查询 CSAnswers内部联接CSAnswers 。不知道这是否可以解决您的PXDBScalar,但是如果您真的想使用您的方法将其附加到SOLine,请尝试:

 Search2<CSAnswers.value,InnerJoin<InventoryItem,On<InventoryItem.inventoryID,Equal<SOLine.inventoryID>>>,Where<InventoryItem.noteID,Equal<CSAnswers.refNoteID>,Equal<QHOLDAttr>>>
     >))]

(请注意,我在 On 子句中交换了关系的顺序。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。