Dynamics AX 2009:在查找字段中显示名称而不是ID

时间:2011-11-29 10:16:50

标签: lookup axapta dynamics-ax-2009

我正在AX 2009上的表单上创建一个项目。有一个名为“SubsPersonName”的查找字段,它使用以下方法在ContactPerson表上执行查找。

public void lookup()
{
    boolean ret;
    Query                   query;
    QueryBuildDataSource    querybuilddatasource;
    QueryBuildRange         querybuildrange;
    SysTableLookup          sysTableLookup;
    CustInvoiceAccount      _thisinvoiceaccount     = CustTable::find(CustTable::find(TTN_CustVendSubscriptions.AccountNum).InvoiceAccount).PartyId;
    CustAccount             _thisaccountnum         = CustTable::find(TTN_CustVendSubscriptions.AccountNum).PartyId;
    ;

    //TODO: Lookup value should read ContactPerson.Name, not ContactPerson.ContactPersonId
    sysTableLookup = SysTableLookup::newParameters(tablenum(ContactPerson), this);
    sysTableLookup.addLookupfield(fieldnum(ContactPerson, Name));
    sysTableLookup.addLookupfield(fieldnum(ContactPerson, ContactPersonId), true);
    sysTableLookup.addLookupfield(fieldnum(ContactPerson, CustAccount));
    sysTableLookup.addLookupfield(fieldnum(ContactPerson, VendAccount));
    query = new Query();
    querybuilddatasource = query.addDataSource(tablenum(ContactPerson));
    querybuildrange = querybuilddatasource.addRange(fieldnum(ContactPerson, Name));
    querybuildrange = querybuilddatasource.addRange(fieldnum(ContactPerson, OrgPartyId));
    if (!_thisinvoiceaccount)
        _thisinvoiceaccount = _thisaccountnum;
    querybuildrange.value(strfmt("%1,%2", _thisinvoiceaccount,_thisaccountnum));
    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
}

上面的代码工作正常,但我需要稍微调整一下。根据此代码,需要插入数据库的值是ContactPerson.ContactPersonId,但我希望表单中的字段显示ContactPerson.Name。

我意识到我可以使用显示方法来显示这个问题,根据这个问题:Axapta: Lookup field display the string value instead of the ID?,但这将涉及一个不必要的额外字段,如果可能的话,我想避免使用。

请有人指出我正确的方向吗?

2 个答案:

答案 0 :(得分:3)

为了使ContactPersonId字段在查找中不可见,但仍将其保留为返回值,请更改类SysTableLookup方法:

void addLookupfield(fieldId _fieldId, boolean _returnItem = false, boolean _visible = true)
{
   lookupItems += [[_fieldId, _returnItem, '', _visible]];
}

同时更改buildGrid方法以更改字段可见性。

然后改变你的代码:

sysTableLookup.addLookupfield(fieldnum(ContactPerson, ContactPersonId), true, false)

另见Axaptapedia

答案 1 :(得分:0)

如果您将ContactPersonId隐藏在调用表单中,请查看“联系”标签页中的CustTable表单。

如表格ClassDeclaration中所述:

  
    

字段contactpersonId隐藏在表单设计中,但必须是可用的     为了能够查找联系人姓名

  

字段editContactPersonName的查找引用了隐藏的contactpersonId字段:

void lookup()
{;
    ContactPerson::lookupCustContactPerson(contactPersonId, custTable.AccountNum, this, custTable.ContactPersonId);
}