如何在销售订单中获得商机关系

时间:2019-02-27 08:14:26

标签: acumatica

在“机会”屏幕中,“关系”的数据视图的定义很简单:

public CRRelationsList<CROpportunity.noteID> Relations;

从机会引发销售订单时。我想在另一个选项卡中显示根据源机会定义的关系。而且我只是在努力如何编写数据视图并传递商机noteid。

public CRRelationsList<???>Relations;

谢谢!

1 个答案:

答案 0 :(得分:1)

数据视图中的通用类型通常解析为当前记录。

CRRelationsList类中,通用类型名为TNoteField

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

假设数据视图被声明为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 = ???;

如果当前DAC对象为null,则需要在数据视图中或直接在缓存对象中插入一条记录。

如果您只想显示记录,我不确定重用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;
    };
}