Как получить Opportunity Relations в заказе клиента - PullRequest
0 голосов
/ 27 февраля 2019

На экране Opportunity определение представления данных для Relations просто:

public CRRelationsList<CROpportunity.noteID> Relations;

Когда заказ на продажу поднимается из Opportunity.Я хотел бы отобразить отношения, определенные из источника Opporunity в другой вкладке.И я просто изо всех сил пытаюсь написать представление данных и передать Noteid Opportunity.

public CRRelationsList<???>Relations;

Спасибо!

1 Ответ

0 голосов
/ 27 февраля 2019

Универсальный тип в представлениях данных часто разрешается в текущей записи.

В CRRelationsList классе универсальный тип называется TNoteField:

public class CRRelationsList<TNoteField> : PXSelect<CRRelation>
    where TNoteField : IBqlField

, поскольку davaview объявляется какCRRelationsList<CROpportunity.noteID>.

Значение универсального типа будет разрешено следующим образом Caches[typeof(CROpportunity)].Current.NoteID.

protected virtual void CRRelation_RefNoteID_FieldDefaulting(PXCache sender, PXFieldDefaultingEventArgs e)
{
    // Get a cache object of type CROpportunity
    var refCache = sender.Graph.Caches[BqlCommand.GetItemType(typeof(TNoteField))];

    // Get the NoteID field value of the current CROpportunity object
    e.NewValue = refCache.GetValue(refCache.Current, typeof(TNoteField).Name);
}

Таким образом, чтобы установить DAC.Field из CRelationsList<DAC.field>, вы должны сделать:

// In a graph extension (PXGraphExtension)
Base.Caches[typeof(DAC)].Current.Fied = ???;

// Or in graph (PXGraph)
Caches[typeof(DAC)].Current.Fied = ???;

Если текущий объект ЦАП равен нулю, необходимо вставить запись в виде данных или непосредственно в объект кэша.

Я не уверен, что повторное использование списка CRRelationsList - лучший подход, еслиВы хотите просто отобразить записи, потому что это делает намного больше, чем это.Должна быть возможность извлечь из него запрос на выборку и напрямую подставить значение TNoteField:

private static PXSelectDelegate GetHandler()
{
    return () =>
    {
        var command = new Select2<CRRelation,
            LeftJoin<BAccount, On<BAccount.bAccountID, Equal<CRRelation.entityID>>,
            LeftJoin<Contact,
                        On<Contact.contactID, Equal<Switch<Case<Where<BAccount.type, Equal<BAccountType.employeeType>>, BAccount.defContactID>, CRRelation.contactID>>>,
            LeftJoin<Users, On<Users.pKID, Equal<Contact.userID>>>>>,
            Where<CRRelation.refNoteID, Equal<Current<TNoteField>>>>();

        var startRow = PXView.StartRow;
        int totalRows = 0;
        var list = new PXView(PXView.CurrentGraph, false, command).
            Select(null, null, PXView.Searches, PXView.SortColumns, PXView.Descendings, PXView.Filters,
                    ref startRow, PXView.MaximumRows, ref totalRows);
        PXView.StartRow = 0;
        foreach (PXResult<CRRelation, BAccount, Contact, Users> row in list)
        {
            var relation = (CRRelation)row[typeof(CRRelation)];
            var account = (BAccount)row[typeof(BAccount)];
            relation.Name = account.AcctName;
            relation.EntityCD = account.AcctCD;
            var contact = (Contact)row[typeof(Contact)];
            if (contact.ContactID == null && relation.ContactID != null &&
                account.Type != BAccountType.EmployeeType)
            {
                var directContact = (Contact)PXSelect<Contact>.
                                                    Search<Contact.contactID>(PXView.CurrentGraph, relation.ContactID);
                if (directContact != null) contact = directContact;
            }
            relation.Email = contact.EMail;
            var user = (Users)row[typeof(Users)];
            if (account.Type != BAccountType.EmployeeType)
                relation.ContactName = contact.DisplayName;
            else
            {
                if (string.IsNullOrEmpty(relation.Name))
                    relation.Name = user.FullName;
                if (string.IsNullOrEmpty(relation.Email))
                    relation.Email = user.Email;
            }
        }
        return list;
    };
}
...