Как я могу получить статус встречи на экране «Время отпуска» - PullRequest
0 голосов
/ 17 апреля 2019

Я настраиваю экран «Действия по времени выпуска» (EP507020) следующими способами:

Сначала я помещаю номер встречи в сетку с помощью параметра «Добавить поля данных» в настройке экрана..

Во-вторых, я хочу вернуться к экрану «Встречи» (FS300200) через «Встречу», чтобы получить статус.

В-третьих, я хочу добавить пользовательское поле в сетку «Временные действия», чтобы сохранить полученный статус, чтобы сетка могла быть отфильтрована по статусу.

Я столкнулся с несколькими проблемами,самое большое из которых - то, что хотя я могу добавить Номер встречи в сетку экрана «Время выпуска» - и после проверки он показывает, что он принадлежит к тому же ЦАП, что и все другие поля в этой сетке - он показывает НЕТ ГДЕ в ЦАПкогда я поднимаю исходный код.Его нет ни в одной таблице, которую я могу найти.Это полная загадка - как поле может отображаться в окне проверки как часть ЦАП, если это действительно не так?

Далее - в ЦАП есть два поля для экрана ЦАП назначений (FSAppointment)- RefNbr (который является номером встречи) и AppointmentID (который является автоматически увеличивающимся полем идентификации).Какой из них я бы использовал для привязки к экрану «Назначения», чтобы связать «Назначение Nbr» (если это вообще возможно)?

Основная проблема заключается в том, что я не могу найти «Назначение Nbr» в ЦАП (EPActivityApprove), чтобы даже связатьвернуться к экрану встреч.

Это что-то выполнимое?

1 Ответ

0 голосов
/ 17 апреля 2019

Вид данных Activity, связанный с сеткой экрана Release Time Actions (EP507020), содержит несколько ЦАП:

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>>>>>>>>
        [...]

Глядя на основной ЦАП, мы видим, что он расширяет PMTimeActivity, поэтому он также будет содержать все поля этого ЦАП:

public class EPActivityApprove : PMTimeActivity

PMTimeActivity также не содержит AppointmentID, но есть другой ЦАП с именем FSxPMTimeActivity, а также расширяет 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;

Что касается объединений, вы должны указать каждое ключевое поле (IsKey = true) из DAC. Для FSAppointment это будут SrvOrdType и RefNbr (destinationID не является ключевым полем в этом 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

EDIT: Если посмотреть лучше, я не думаю, что вы сможете присоединиться к ключевым полям. Поскольку AppointmentID является полем уникального идентификатора, в этом случае вы можете сделать исключение и присоединиться только к этому полю, потому что оно будет вести себя как одно ключевое поле.

...