Inventory CD 段掩码和选择器
Inventory CD segment mask and selector
我们正在尝试在自定义页面(不是 Inventory ID Int 字段)中实现 "InventoryCD"(字符串)字段。我们需要这个 InventoryCD 字段像 Stock Item InventoryCD 字段一样工作(段显示的字段掩码和现有项目的选择器)。目前的问题是相同的 aspx PXSegmentMask 和 DAC 属性不工作相同。我们在字段上使用 InventoryRawAttribute 的方式与 InventoryItem.InventoryCD 附加的 InventoryItemMaint 缓存中的方式完全相同。唯一的例外是库存 CD 字段不是我们自定义页面中的键。
我们的问题是我们的 Inventory CD 字段的显示仅在我们未进入或未关注该字段时显示(用户必须单击移动到另一个字段)。这使得用户很难了解他们正在向哪些段输入值。所以我的问题是我们缺少什么?
这是我们目前所做的:
(1) DAC - InventoryCD (与附加的 InventoryItemMaint 缓存中的 InventoryItem.InventoryCD 相同 - 除了 IsKey = false):
public abstract class inventoryCD : PX.Data.IBqlField
{}
protected String _InventoryCD;
[PXDefault()]
[InventoryRaw(typeof(Where<InventoryItem.stkItem, Equal<True>>), DisplayName = "Inventory ID", Filterable = true)]
public virtual String InventoryCD
{
get
{
return this._InventoryCD;
}
set
{
this._InventoryCD = value;
}
}
(2) 页面 - InventoryCD (从库存项目 IN202500 复制):
<px:PXSegmentMask ID="edInventoryCD" runat="server" DataField="InventoryCD"
DataSourceID="ds" AutoRefresh="true" >
<GridProperties FastFilterFields="InventoryCD,Descr" />
</px:PXSegmentMask>
这是我看到的结果示例(请参阅下图)。请注意输入值或单击字段时字段的外观。在我们的自定义页面上,单击 Inventory CD 字段显示没有分段分隔。在 Stock Item 页面上执行相同操作将显示分段分隔,以便用户可以关注分段。我们如何让分段显示在我们的自定义页面中工作?
编辑: 如果您在 InventoryRawAttribute 中设置 ValidComboRequired = true 掩码正确显示与库存项目相同,但是您松开所有项目的选择器然后选择器成为选择器对于每个项目段值(使问题更糟)。仅供参考,以防任何人看到我需要的某种类型的组合,因为它可能与 ValidComboRequired 相关(为真时为掩码,为假时为选择器)。
EDIT2: 尝试将字段设置为键(但不是 DAC 中的唯一键)但没有区别
报告的 PXSegmentMask 行为是设计使然。如果你稍微玩一下商业账户并为 BIZACCT 分段键定义至少 2 个段,在销售订单屏幕上,客户 ID 查找中也不会分段分离,直到它失去焦点:
使用 ValidComboRequired 属性 在 InventoryRawAttribute 上设置 True,你告诉 PXSegmentMask在 "per-segment" 模式下工作,这会禁用所有项目的选择器并强制它成为每个项目段值的选择器。
库存 ID 是库存项目屏幕上的关键字段,客户 ID 是客户屏幕上的关键字段,因此在这两个屏幕上,段分隔与所有项目的选择器一起存在。我在销售订单屏幕上提到客户查找的原因是因为 CustomerID 不是 SOOrder DAC 的关键字段,这是销售订单的客户 ID 查找中缺少分段分隔的主要原因,直到它失去焦点。
Ruslan 的 post 是一个答案,如果仅限于使用标准框架属性,则无法触发我需要的显示。
但是,由于与我的问题无关的其他原因,我不得不创建自己的 InventoryRawAttribute。在这样做的过程中,我将 PXDimensionSelectorAttrbiute.SelectorMode 设置为 MaskAutocomplete,这使得该字段完全按照我需要的方式运行。
他是使这项工作变得精简的基础知识。这是 InventoryRawAttribute 的副本并添加了 attr.SelectorMode = PXSelectorMode.MaskAutocomplete.
/// <summary>
/// Copy of InventoryRawAttribute (sealed class)
/// </summary>
[PXDBString(InputMask = "", IsUnicode = true)]
[PXUIField(DisplayName = "Inventory ID", Visibility = PXUIVisibility.SelectorVisible)]
public sealed class TestInventoryRawAttribute : AcctSubAttribute
{
public const string DimensionName = "INVENTORY";
public TestInventoryRawAttribute()
: base()
{
Type SearchType = typeof(Search<InventoryItem.inventoryCD, Where<Match<Current<AccessInfo.userName>>>>);
PXDimensionSelectorAttribute attr = new PXDimensionSelectorAttribute(DimensionName, SearchType, typeof(InventoryItem.inventoryCD));
attr.CacheGlobal = true;
// This is the secret sauce - MaskAutocomplete
attr.SelectorMode = PXSelectorMode.MaskAutocomplete;
_Attributes.Add(attr);
_SelAttrIndex = _Attributes.Count - 1;
}
}
行动中的秘诀...
要获取输入掩码,您可以在 aspx 中将 AutoComplete
设置为 false
,而无需自定义 out-of-box InventoryRaw 属性。
示例:
using PX.Data;
using PX.Objects.IN;
namespace PXDemoPkg
{
public class INSetupDemoExt : PXCacheExtension<INSetup>
{
public abstract class usrInventoryID : IBqlField { }
#region UsrInventoryID
[PXDefault]
[PXUIField(DisplayName = "InventoryID")]
[InventoryRaw(typeof(Where<InventoryItem.stkItem, Equal<True>>),
DisplayName = "Inventory ID", Filterable = true)]
public virtual string UsrInventoryID { get; set; }
#endregion
}
}
我们正在尝试在自定义页面(不是 Inventory ID Int 字段)中实现 "InventoryCD"(字符串)字段。我们需要这个 InventoryCD 字段像 Stock Item InventoryCD 字段一样工作(段显示的字段掩码和现有项目的选择器)。目前的问题是相同的 aspx PXSegmentMask 和 DAC 属性不工作相同。我们在字段上使用 InventoryRawAttribute 的方式与 InventoryItem.InventoryCD 附加的 InventoryItemMaint 缓存中的方式完全相同。唯一的例外是库存 CD 字段不是我们自定义页面中的键。
我们的问题是我们的 Inventory CD 字段的显示仅在我们未进入或未关注该字段时显示(用户必须单击移动到另一个字段)。这使得用户很难了解他们正在向哪些段输入值。所以我的问题是我们缺少什么?
这是我们目前所做的:
(1) DAC - InventoryCD (与附加的 InventoryItemMaint 缓存中的 InventoryItem.InventoryCD 相同 - 除了 IsKey = false):
public abstract class inventoryCD : PX.Data.IBqlField
{}
protected String _InventoryCD;
[PXDefault()]
[InventoryRaw(typeof(Where<InventoryItem.stkItem, Equal<True>>), DisplayName = "Inventory ID", Filterable = true)]
public virtual String InventoryCD
{
get
{
return this._InventoryCD;
}
set
{
this._InventoryCD = value;
}
}
(2) 页面 - InventoryCD (从库存项目 IN202500 复制):
<px:PXSegmentMask ID="edInventoryCD" runat="server" DataField="InventoryCD"
DataSourceID="ds" AutoRefresh="true" >
<GridProperties FastFilterFields="InventoryCD,Descr" />
</px:PXSegmentMask>
这是我看到的结果示例(请参阅下图)。请注意输入值或单击字段时字段的外观。在我们的自定义页面上,单击 Inventory CD 字段显示没有分段分隔。在 Stock Item 页面上执行相同操作将显示分段分隔,以便用户可以关注分段。我们如何让分段显示在我们的自定义页面中工作?
编辑: 如果您在 InventoryRawAttribute 中设置 ValidComboRequired = true 掩码正确显示与库存项目相同,但是您松开所有项目的选择器然后选择器成为选择器对于每个项目段值(使问题更糟)。仅供参考,以防任何人看到我需要的某种类型的组合,因为它可能与 ValidComboRequired 相关(为真时为掩码,为假时为选择器)。
EDIT2: 尝试将字段设置为键(但不是 DAC 中的唯一键)但没有区别
报告的 PXSegmentMask 行为是设计使然。如果你稍微玩一下商业账户并为 BIZACCT 分段键定义至少 2 个段,在销售订单屏幕上,客户 ID 查找中也不会分段分离,直到它失去焦点:
使用 ValidComboRequired 属性 在 InventoryRawAttribute 上设置 True,你告诉 PXSegmentMask在 "per-segment" 模式下工作,这会禁用所有项目的选择器并强制它成为每个项目段值的选择器。
库存 ID 是库存项目屏幕上的关键字段,客户 ID 是客户屏幕上的关键字段,因此在这两个屏幕上,段分隔与所有项目的选择器一起存在。我在销售订单屏幕上提到客户查找的原因是因为 CustomerID 不是 SOOrder DAC 的关键字段,这是销售订单的客户 ID 查找中缺少分段分隔的主要原因,直到它失去焦点。
Ruslan 的 post 是一个答案,如果仅限于使用标准框架属性,则无法触发我需要的显示。
但是,由于与我的问题无关的其他原因,我不得不创建自己的 InventoryRawAttribute。在这样做的过程中,我将 PXDimensionSelectorAttrbiute.SelectorMode 设置为 MaskAutocomplete,这使得该字段完全按照我需要的方式运行。
他是使这项工作变得精简的基础知识。这是 InventoryRawAttribute 的副本并添加了 attr.SelectorMode = PXSelectorMode.MaskAutocomplete.
/// <summary>
/// Copy of InventoryRawAttribute (sealed class)
/// </summary>
[PXDBString(InputMask = "", IsUnicode = true)]
[PXUIField(DisplayName = "Inventory ID", Visibility = PXUIVisibility.SelectorVisible)]
public sealed class TestInventoryRawAttribute : AcctSubAttribute
{
public const string DimensionName = "INVENTORY";
public TestInventoryRawAttribute()
: base()
{
Type SearchType = typeof(Search<InventoryItem.inventoryCD, Where<Match<Current<AccessInfo.userName>>>>);
PXDimensionSelectorAttribute attr = new PXDimensionSelectorAttribute(DimensionName, SearchType, typeof(InventoryItem.inventoryCD));
attr.CacheGlobal = true;
// This is the secret sauce - MaskAutocomplete
attr.SelectorMode = PXSelectorMode.MaskAutocomplete;
_Attributes.Add(attr);
_SelAttrIndex = _Attributes.Count - 1;
}
}
行动中的秘诀...
要获取输入掩码,您可以在 aspx 中将 AutoComplete
设置为 false
,而无需自定义 out-of-box InventoryRaw 属性。
示例:
using PX.Data;
using PX.Objects.IN;
namespace PXDemoPkg
{
public class INSetupDemoExt : PXCacheExtension<INSetup>
{
public abstract class usrInventoryID : IBqlField { }
#region UsrInventoryID
[PXDefault]
[PXUIField(DisplayName = "InventoryID")]
[InventoryRaw(typeof(Where<InventoryItem.stkItem, Equal<True>>),
DisplayName = "Inventory ID", Filterable = true)]
public virtual string UsrInventoryID { get; set; }
#endregion
}
}