我有一个自定义字段在租户 1 中按预期工作,但在其他租户中出现错误。
使用“发布到多个租户”按钮执行发布。
POOrder.CustomField 是一个选择器,显示属于特定 CUSTOMCLASS 项目类的非库存项目的筛选列表。
在租户 1 中,自定义发布自(向所有租户):
选择器正确显示 CUSTOMCLASS 项目类中的项目列表,允许在自定义字段中进行选择,并正确保存采购订单。
在租户 2 中,相同的自定义字段正确显示项目列表(此租户中的不同项目,但仍然属于匹配的名为 CUSTOMCLASS 项目类),允许在自定义字段中进行选择,但在保存时出现此错误:
'CustomField' cannot be found in the system.
这是 DAC 扩展:
public class POOrderExt : PXCacheExtension<PX.Objects.PO.POOrder>
{
#region CustomField
[PXDBString(50)]
[PXUIField(DisplayName="Custom Field")]
[PXSelector(
typeof(Search<PX.Objects.IN.InventoryItem.inventoryCD
, Where<PX.Objects.IN.InventoryItem.itemClassID, Equal<customfieldItemClassIdConstant>>>),
typeof(PX.Objects.IN.InventoryItem.inventoryCD),
typeof(PX.Objects.IN.InventoryItem.descr),
DescriptionField=typeof(PX.Objects.IN.InventoryItem.descr))]
public string CustomField { get; set; }
public abstract class customField : IBqlField { }
public class customfieldItemClassIdConstant : PX.Data.BQL.BqlInt.Constant<customfieldItemClassIdConstant>
{
public customfieldItemClassIdConstant()
: base(FindCustomFieldItemClassID("CUSTOMCLASS")) { }
public static int FindCustomFieldItemClassID(string itemClassCD)
{
PXResult<INItemClass> result = PXSelect<INItemClass,
Where<INItemClass.itemClassCD, Equal<Required<INItemClass.itemClassCD>>>>
.SelectWindowed(new PXGraph(), 0, 1, itemClassCD);
if(result == null) return 0;
INItemClass customfieldItemClass = result.GetItem<INItemClass>();
if(customfieldItemClass == null)
{
return 0;
}
else
{
return customfieldItemClass?.ItemClassID ?? 0;
}
}
}
#endregion
我无法弄清楚为什么它可以在一个租户中工作,而不能在其他租户中工作,因为字段和选择器在所有租户中都表现良好,但选择的保存出错,即使数据库列由所有租户共享.
改变了方法并使用不同的方法来定义项目类。没有在代码中使用常量,而是在项目类上创建了一个自定义复选框,将其标记为选择器的相关类以显示该类的项目。
项目类 DAC 扩展:
public class INItemClassExt : PXCacheExtension<PX.Objects.IN.INItemClass>
{
#region CustomItemClassFlag
[PXDBBool]
[PXUIField(DisplayName="Custom Item Class Flag")]
public virtual Boolean? CustomItemClassFlag { get; set; }
public abstract class customItemClassFlag : PX.Data.BQL.BqlBool.Field<customItemClassFlag> { }
#endregion
)
采购订单 DAC 扩展:
public class POOrderExt : PXCacheExtension<PX.Objects.PO.POOrder>
{
#region CustomField
[PXDBString(50)]
[PXUIField(DisplayName = "Custom Field")]
[PXSelector(
typeof(Search2<InventoryItem.inventoryCD,
InnerJoin<INItemClass, On<InventoryItem.itemClassID, Equal<INItemClass.itemClassID>>>,
Where<INItemClassExt.customItemClassFlag, Equal<True>>>),
typeof(InventoryItem.inventoryCD),
typeof(InventoryItem.descr),
SubstituteKey = typeof(InventoryItem.inventoryCD),
DescriptionField = typeof(InventoryItem.descr))]
public string CustomField { get; set; }
public abstract class customField : IBqlField { }
#endregion
)