我正在通过以下方式自定义“发布时间活动”屏幕(EP507020):
首先,我通过屏幕自定义设置中的“添加数据字段”选项将约会编号放在网格中。
第二,我想通过约会Nbr绑定到约会屏幕(FS300200)以获取状态。
第三,我想在“时间活动”网格中添加一个用户字段来保存此获取的状态,以便可以通过状态过滤网格。
我遇到了几个问题,最大的问题是,即使我可以将“约会编号”添加到“发布时间活动”屏幕网格中-并且经检查显示它与所有其他字段属于同一个DAC在该网格中-当我调出源代码时,它在DAC中不显示任何位置。我也找不到任何表格。这是一个完全的谜团-字段实际上不是真的如何作为DAC的一部分显示在检查窗口中?
下一步-约会屏幕DAC(FSAppointment)中的DAC中有两个字段-RefNbr(这是约会编号)和AppointmentID(这是一个自动递增的标识字段)。我将使用哪一个绑定到“约会”屏幕以链接约会Nbr(如果可能的话)?
主要问题是我无法在DAC(EPActivityApprove)中找到约会Nbr,甚至无法绑定到约会屏幕。
这可行吗?
答案 0 :(得分:0)
绑定到“发布时间活动”屏幕(EP507020)网格的“活动”数据视图包含多个DAC:
public PXFilteredProcessingJoin<
EPActivityApprove,
EPActivityFilter,
LeftJoin<EPEarningType,
On<EPEarningType.typeCD, Equal<EPActivityApprove.earningTypeID>>,
InnerJoin<EPEmployee,
On<EPEmployee.userID, Equal<EPActivityApprove.ownerID>,
And<Where<EPEmployee.timeCardRequired, NotEqual<True>, Or<EPEmployee.timeCardRequired, IsNull>>>>,
LeftJoin<CRActivityLink,
On<CRActivityLink.noteID, Equal<EPActivityApprove.refNoteID>>,
LeftJoin<CRCase,
On<CRCase.noteID, Equal<CRActivityLink.refNoteID>>,
LeftJoin<CRCaseClass,
On<CRCaseClass.caseClassID, Equal<CRCase.caseClassID>>,
LeftJoin<ContractEx,
On<CRCase.contractID, Equal<ContractEx.contractID>>>>>>>>
[...]
看看主DAC,我们看到它扩展了PMTimeActivity,因此它也将包含该DAC的所有字段:
public class EPActivityApprove : PMTimeActivity
PMTimeActivity也不包含AppointmentID,而是另一个名为FSxPMTimeActivity的DAC,它还扩展了PMTimeActivity。这就是为什么您在EPActivityApprove中看到该字段的原因:
public class FSxPMTimeActivity : PXCacheExtension<PMTimeActivity>
{
#region AppointmentID
public abstract class appointmentID : PX.Data.IBqlField
{
}
[PXDBInt]
[PXUIField(DisplayName = "Appointment Nbr.")]
[PXSelector(typeof(Search<FSAppointment.appointmentID>),
SubstituteKey = typeof(FSAppointment.refNbr))]
public virtual int? AppointmentID { get; set; }
#endregion
}
给出一个EPActivityApprove对象,我想您可以像下面这样获取对包含AppointmentID的扩展的引用:
EPActivityApprove row = ???;
FSxPMTimeActivity rowExt = row.GetExtension<FSxPMTimeActivity>();
int? appointmentID = rowExt.AppointmentID;
对于联接,您必须指定DAC中的每个键字段(IsKey = true)。 对于FSAppointment,它们将是SrvOrdType和RefNbr(appointmentID不是该DAC中的关键字段):
#region SrvOrdType
public abstract class srvOrdType : PX.Data.IBqlField
{
}
[PXDBString(4, IsFixed = true, IsKey = true, InputMask = ">AAAA")]
[PXDefault(typeof(FSSetup.dfltSrvOrdType))]
[PXUIField(DisplayName = "Service Order Type")]
[FSSelectorSrvOrdTypeNOTQuote]
[PX.Data.EP.PXFieldDescription]
public virtual string SrvOrdType { get; set; }
#endregion
#region RefNbr
public abstract class refNbr : PX.Data.IBqlField
{
}
[PXDBString(20, IsKey = true, IsUnicode = true, InputMask = "CCCCCCCCCCCCCCCCCCCC")]
[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
[PXUIField(DisplayName = "Appointment Nbr.", Visibility = PXUIVisibility.SelectorVisible, Visible = true, Enabled = true)]
[PXSelector(typeof(
Search2<FSAppointment.refNbr,
LeftJoin<FSServiceOrder,
On<FSServiceOrder.sOID, Equal<FSAppointment.sOID>>,
LeftJoin<Customer,
On<Customer.bAccountID, Equal<FSServiceOrder.customerID>>,
LeftJoin<Location,
On<Location.locationID, Equal<FSServiceOrder.locationID>>>>>,
Where<
FSAppointment.srvOrdType, Equal<Optional<FSAppointment.srvOrdType>>>,
OrderBy<Desc<FSAppointment.refNbr>>>),
new Type[] {
typeof(FSAppointment.refNbr),
typeof(Customer.acctCD),
typeof(Customer.acctName),
typeof(Location.locationCD),
typeof(FSAppointment.docDesc),
typeof(FSAppointment.status),
typeof(FSAppointment.scheduledDateTimeBegin)
})]
[AppointmentAutoNumber(typeof(
Search<FSSrvOrdType.srvOrdNumberingID,
Where<
FSSrvOrdType.srvOrdType, Equal<Optional<FSAppointment.srvOrdType>>>>),
typeof(AccessInfo.businessDate))]
[PX.Data.EP.PXFieldDescription]
public virtual string RefNbr { get; set; }
#endregion
编辑: 为了更好地了解它,我认为您将无法加入关键领域。因为AppointmentID是唯一标识符字段,所以在这种情况下,您可以设置例外,并且只能在该字段上加入,因为它将作为单个键字段起作用。