Acumatica销售订单行网格添加库存物料属性及多值显示问题
问题原因
你当前的代码只取到了第一条匹配的属性明细记录,多选组合框类型的属性在CSAnswers表中存储的是分号分隔的多个选中项的ID值,单独关联CSAttributeDetail只能拿到单个选项的描述,自然无法展示全部选中值。
修复步骤
- (可选)字段长度调整:如果你的ACCITEMS属性可选值较多,拼接后的描述可能超过250字符,可按需调整
PXDBString的长度参数:
// 可根据实际需求调整长度,比如改成1000 [PXDBString(1000, IsUnicode = true)] [PXUIField(DisplayName = "Accessories Items")] public virtual string UsrAccessoriesFrmStkItems { get; set; } public abstract class usrAccessoriesFrmStkItems : PX.Data.BQL.BqlString.Field<usrAccessoriesFrmStkItems> { } #endregion
- 修改
SOLine_InventoryID_FieldUpdated事件逻辑:先拿到库存物料对应的ACCITEMS属性的选中值字符串,拆分后批量查询所有对应属性明细的描述,再拼接赋值即可。
修改后的代码如下:
protected virtual void SOLine_InventoryID_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e, PXFieldUpdated InvokeBaseHandler) { InvokeBaseHandler?.Invoke(sender, e); SOLine row = (SOLine)e.Row; if (row == null || row.InventoryID == null) return; // 先查询库存物料对应ACCITEMS属性的选中值(分号分隔的ID串) CSAnswers attrAns = PXSelectJoin<CSAnswers, InnerJoin<InventoryItem, On<InventoryItem.noteID, Equal<CSAnswers.refNoteID>>>, Where<InventoryItem.inventoryID, Equal<Required<InventoryItem.inventoryID>>, And<CSAnswers.attributeID, Equal<Required<CSAnswers.attributeID>>>>> .Select(Base, row.InventoryID, "ACCITEMS"); if (attrAns?.Value == null) return; // 拆分选中的属性ID var selectedValueIds = attrAns.Value.Split(';', StringSplitOptions.RemoveEmptyEntries); var descList = new List<string>(); // 批量查询所有选中ID对应的描述 foreach (var valId in selectedValueIds) { CSAttributeDetail detail = PXSelect<CSAttributeDetail, Where<CSAttributeDetail.attributeID, Equal<Required<CSAttributeDetail.attributeID>>, And<CSAttributeDetail.valueID, Equal<Required<CSAttributeDetail.valueID>>>>> .Select(Base, "ACCITEMS", valId.Trim()); if (detail != null) { descList.Add(detail.Description); } } // 拼接后赋值给自定义字段,分隔符可按需改成逗号、顿号等 SOLineExt rowExt = row.GetExtension<SOLineExt>(); rowExt.UsrAccessoriesFrmStkItems = string.Join(";", descList); }
内容的提问来源于stack exchange,提问作者Tharidhi P
相关产品推荐
相关产品推荐

