如何确保选择PXSelector的特定行

时间:2018-01-09 18:40:57

标签: acumatica

我有一个选择多个字段的PXSelector,第一个字段是一个可以重复其值的字段(如下所示):

Field1       Field2       Field3   
1234         LL           description1
1234         PS           description2
1234         CC           description3
4321         BB           description4

PXSelector代码:

  [PXSelector(typeof(myTable.field1)
               ,typeof(myTable.field1)
               ,typeof(myTable.field2)
               ,typeof(myTable.field3)
               ,DescriptionField = typeof(myTable.field3))]

所选表的DAC将Field1和Field2作为键。

如果我选择上面的第二行或第三行,我每次都会获得第一行的Field3描述。有没有办法确保我只获得我选择的行的描述,而不是总是第一次出现?

1 个答案:

答案 0 :(得分:0)

您必须使选择器对单个键进行操作,因为所选值是关键字段而不是整个DAC记录。

一种可能的方法是将唯一的记录号列添加到数据库表中,使选择器对该列进行操作,并为选择器设置不同的“TextField”属性,使其不显示记录号。

这是我如何在SerialNumber / InventoryItem上创建一个不是唯一值(包含重复)的选择器。

数据库脚本因数据库系统而异。我正在使用此脚本为MSSQL添加唯一的记录号到表:

--[mysql: Skip]  
--[IfNotExists(Column = SOShipLineSplit.UsrUniqueID)]
BEGIN
    alter table SOShipLineSplit add UsrUniqueID int identity(1,1)
END
GO

这是DAC声明。我使用PXDBIdentity匹配将列标记为记录号字段的数据库标识字段类型:

[Serializable]
public class SOShipLineSplit_Extension : PXCacheExtension<SOShipLineSplit>
{
    #region UsrUniqueID
    public abstract class usrUniqueID : IBqlField { }

    [PXDBIdentity(IsKey = false)]
    [PXUIField(DisplayName = "ID")]
    public virtual int? UsrUniqueID { get; set; }
    #endregion
}

我为使用此唯一ID键的选择器使用另一个DAC字段,并将描述设置为我想要在选择器中显示的实际字段:

#region SerialUniqueID
public abstract class serialUniqueID : IBqlField { }

[PXSelector(typeof(Search5<SOShipLineSplit_Extension.usrUniqueID,
                    InnerJoin<SOShipment, On<SOShipment.customerID, Equal<Current<customerID>>,
                                          And<SOShipment.shipmentNbr, Equal<SOShipLineSplit.shipmentNbr>>>,
                    InnerJoin<InventoryItem, On<InventoryItem.inventoryID, Equal<SOShipLineSplit.inventoryID>>>>,
                    Where<SOShipLineSplit.lotSerialNbr, NotEqual<StringEmpty>>,
                    Aggregate<GroupBy<SOShipLineSplit.lotSerialNbr,
                              GroupBy<SOShipLineSplit.inventoryID>>>>),
            typeof(SOShipLineSplit.lotSerialNbr),,
            typeof(SOShipLineSplit.inventoryID),
            typeof(InventoryItem.descr),
            CacheGlobal = true,
            DescriptionField = typeof(SOShipLineSplit.lotSerialNbr))]
[PXDBInt]
[PXUIField(DisplayName = "Serial Number")]
public virtual int? SerialUniqueID { get; set; }
#endregion

对于此选择器,我想在文本框中显示LotSerialNbr而不是唯一ID。因为默认情况下选择器显示它的键,所以我需要使用TextField属性:

<px:PXSelector ID="edSerialUniqueID" 
               runat="server" 
               DataField="SerialUniqueID"
               TextField="LotSerialNbr" 
               AutoGenerateColumns="True">

选择器值将包含所选的唯一ID字段。要获取记录,您可以使用该密钥向数据库发出另一个请求。