通过 PXDBScalar 从另一个 table 获取值的自定义虚拟属性无法正常工作
Custom virtual attribute to obtain a value from another table via PXDBScalar is not working correctly
对于 AP 帐单屏幕 AP301000,我想在 'Document Details' 网格中显示每个行项目的客户。为此,我在 APTran table 上创建了一个带有自定义虚拟属性的自定义项目。
我尝试了很多属性的排列,下面是最新的。
[PXString]
[PXUIField(DisplayName="Customer", Enabled=false)]
[PXDBScalar(typeof(Search2<BAccountR.legalName,
InnerJoin<PMProject, On<PMProject.contractID, Equal<APTran.projectID>>,
InnerJoin<AR.Customer, On<PMProject.customerID, Equal<AR.Customer.bAccountID>>,
InnerJoin<BAccountR, On<AR.Customer.bAccountID, Equal<BAccountR.bAccountID>>>>>>))]
它 'should' return 来自 BAccount table 通过相关连接的客户法定名称。然而,它 return 是一个供应商名称(不在客户 table 中)。
生成的SQL代码如下,系统乱码了。由于某种原因,它有一个到供应商的内部连接 table,这显然不在我的 PXDBScalar 属性修饰中。
如何调整属性装饰获取客户名称?
(SELECT TOP (1) [BAccount_BAccount].[legalname]
FROM ( [vendor] [BAccount_Vendor]
INNER JOIN [baccount] [BAccount_BAccount]
ON ( [BAccount_BAccount].[companyid] = 2 )
AND
[BAccount_BAccount].[deleteddatabaserecord] = 0
AND [BAccount_Vendor].[baccountid] =
[BAccount_BAccount].[baccountid]
LEFT JOIN [fsxvendor] [BAccount_FSxVendor]
ON ( [BAccount_FSxVendor].[companyid] = 2 )
AND
[BAccount_FSxVendor].[deleteddatabaserecord] = 0
AND [BAccount_Vendor].[baccountid] =
[BAccount_FSxVendor].[baccountid] )
INNER JOIN [contract] [PMProject]
ON ( [PMProject].[companyid] IN ( 1, 2 )
AND 8 = Substring([PMProject].[companymask],
1, 1) & 8 )
AND [PMProject].[deleteddatabaserecord] = 0
AND ( [PMProject].[companyid] IN ( 1, 2 )
AND 8 = Substring(
[PMProject].[companymask], 1, 1)
& 8
)
AND [PMProject].[deleteddatabaserecord] = 0
AND [PMProject].[contractid] =
[APTran_APTran].[projectid]
INNER JOIN ( [customer] [Customer_Customer]
INNER JOIN [baccount] [Customer_BAccount]
ON ( [Customer_BAccount].[companyid]
= 2 )
AND
[Customer_BAccount].[deleteddatabaserecord]
= 0
AND
[Customer_Customer].[baccountid] =
[Customer_BAccount].[baccountid]
LEFT JOIN [fsxcustomer]
[Customer_FSxCustomer]
ON (
[Customer_FSxCustomer].[companyid] = 2 )
AND
[Customer_FSxCustomer].[deleteddatabaserecord] = 0
AND [Customer_Customer].[baccountid] =
[Customer_FSxCustomer].[baccountid] )
ON [PMProject].[customerid] = [Customer_BAccount].[baccountid]
AND ( [Customer_Customer].[companyid] = 2 )
AND [Customer_Customer].[deleteddatabaserecord] = 0
INNER JOIN [baccount] [BAccountR]
ON ( [BAccountR].[companyid] = 2 )
AND [BAccountR].[deleteddatabaserecord] = 0
AND ( [BAccountR].[companyid] = 2 )
AND [BAccountR].[deleteddatabaserecord] = 0
AND [Customer_BAccount].[baccountid] =
[BAccountR].[baccountid]
WHERE ( [BAccount_Vendor].[companyid] = 2 )
AND [BAccount_Vendor].[deleteddatabaserecord] = 0
ORDER BY [BAccount_BAccount].[legalname]) AS [UsrCustomerName],
尝试为 BAccountR table 创建一个新的 class 并使用 PXBreakInheritance 属性,然后使用这个新的 table 进行查找。
namespace Custom.Extension
{
[PXBreakInheritance]
public class CustomBAccountR: BAccountR { }
public sealed class APTranExtension : PXCacheExtension<APTran>
{
#region ProjectCustomerID
public abstract class projectCustomerID : BqlInt.Field<projectCustomerID> { }
[PXInt]
[PXUIField(DisplayName="Customer Legal Name", Enabled=false)]
[PXSelector(typeof(SearchFor<CustomBAccountR.bAccountID>),
SubstituteKey = typeof(CustomBAccountR.acctCD),
DescriptionField = typeof(CustomBAccountR.legalName))]
[PXDBScalar(typeof(Search2<CustomBAccountR.bAccountID,
InnerJoin<PMProject,
On<PMProject.contractID.IsEqual<APTran.projectID>>,
InnerJoin<CustomBAccountR,
On<CustomBAccountR.bAccountID.IsEqual<PMProject.customerID>>>>,
Where<CustomBAccountR.bAccountID.IsNotNull>>))]
public int? ProjectCustomerID { get; set; }
#endregion
}
}
您现在可以使用 ASPX 中的描述字段来显示值。
对于 AP 帐单屏幕 AP301000,我想在 'Document Details' 网格中显示每个行项目的客户。为此,我在 APTran table 上创建了一个带有自定义虚拟属性的自定义项目。 我尝试了很多属性的排列,下面是最新的。
[PXString]
[PXUIField(DisplayName="Customer", Enabled=false)]
[PXDBScalar(typeof(Search2<BAccountR.legalName,
InnerJoin<PMProject, On<PMProject.contractID, Equal<APTran.projectID>>,
InnerJoin<AR.Customer, On<PMProject.customerID, Equal<AR.Customer.bAccountID>>,
InnerJoin<BAccountR, On<AR.Customer.bAccountID, Equal<BAccountR.bAccountID>>>>>>))]
它 'should' return 来自 BAccount table 通过相关连接的客户法定名称。然而,它 return 是一个供应商名称(不在客户 table 中)。
生成的SQL代码如下,系统乱码了。由于某种原因,它有一个到供应商的内部连接 table,这显然不在我的 PXDBScalar 属性修饰中。
如何调整属性装饰获取客户名称?
(SELECT TOP (1) [BAccount_BAccount].[legalname]
FROM ( [vendor] [BAccount_Vendor]
INNER JOIN [baccount] [BAccount_BAccount]
ON ( [BAccount_BAccount].[companyid] = 2 )
AND
[BAccount_BAccount].[deleteddatabaserecord] = 0
AND [BAccount_Vendor].[baccountid] =
[BAccount_BAccount].[baccountid]
LEFT JOIN [fsxvendor] [BAccount_FSxVendor]
ON ( [BAccount_FSxVendor].[companyid] = 2 )
AND
[BAccount_FSxVendor].[deleteddatabaserecord] = 0
AND [BAccount_Vendor].[baccountid] =
[BAccount_FSxVendor].[baccountid] )
INNER JOIN [contract] [PMProject]
ON ( [PMProject].[companyid] IN ( 1, 2 )
AND 8 = Substring([PMProject].[companymask],
1, 1) & 8 )
AND [PMProject].[deleteddatabaserecord] = 0
AND ( [PMProject].[companyid] IN ( 1, 2 )
AND 8 = Substring(
[PMProject].[companymask], 1, 1)
& 8
)
AND [PMProject].[deleteddatabaserecord] = 0
AND [PMProject].[contractid] =
[APTran_APTran].[projectid]
INNER JOIN ( [customer] [Customer_Customer]
INNER JOIN [baccount] [Customer_BAccount]
ON ( [Customer_BAccount].[companyid]
= 2 )
AND
[Customer_BAccount].[deleteddatabaserecord]
= 0
AND
[Customer_Customer].[baccountid] =
[Customer_BAccount].[baccountid]
LEFT JOIN [fsxcustomer]
[Customer_FSxCustomer]
ON (
[Customer_FSxCustomer].[companyid] = 2 )
AND
[Customer_FSxCustomer].[deleteddatabaserecord] = 0
AND [Customer_Customer].[baccountid] =
[Customer_FSxCustomer].[baccountid] )
ON [PMProject].[customerid] = [Customer_BAccount].[baccountid]
AND ( [Customer_Customer].[companyid] = 2 )
AND [Customer_Customer].[deleteddatabaserecord] = 0
INNER JOIN [baccount] [BAccountR]
ON ( [BAccountR].[companyid] = 2 )
AND [BAccountR].[deleteddatabaserecord] = 0
AND ( [BAccountR].[companyid] = 2 )
AND [BAccountR].[deleteddatabaserecord] = 0
AND [Customer_BAccount].[baccountid] =
[BAccountR].[baccountid]
WHERE ( [BAccount_Vendor].[companyid] = 2 )
AND [BAccount_Vendor].[deleteddatabaserecord] = 0
ORDER BY [BAccount_BAccount].[legalname]) AS [UsrCustomerName],
尝试为 BAccountR table 创建一个新的 class 并使用 PXBreakInheritance 属性,然后使用这个新的 table 进行查找。
namespace Custom.Extension
{
[PXBreakInheritance]
public class CustomBAccountR: BAccountR { }
public sealed class APTranExtension : PXCacheExtension<APTran>
{
#region ProjectCustomerID
public abstract class projectCustomerID : BqlInt.Field<projectCustomerID> { }
[PXInt]
[PXUIField(DisplayName="Customer Legal Name", Enabled=false)]
[PXSelector(typeof(SearchFor<CustomBAccountR.bAccountID>),
SubstituteKey = typeof(CustomBAccountR.acctCD),
DescriptionField = typeof(CustomBAccountR.legalName))]
[PXDBScalar(typeof(Search2<CustomBAccountR.bAccountID,
InnerJoin<PMProject,
On<PMProject.contractID.IsEqual<APTran.projectID>>,
InnerJoin<CustomBAccountR,
On<CustomBAccountR.bAccountID.IsEqual<PMProject.customerID>>>>,
Where<CustomBAccountR.bAccountID.IsNotNull>>))]
public int? ProjectCustomerID { get; set; }
#endregion
}
}
您现在可以使用 ASPX 中的描述字段来显示值。