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: Поле поиска отображает строковое значение вместо идентификатора?, но это будет включать ненужное дополнительное поле, которого я бы по возможности избегал.

Пожалуйста, может ли кто-нибудь указать мне правильное направление?


person Phil Matthews    schedule 29.11.2011    source источник


Ответы (2)


Чтобы сделать поле 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.

person Jan B. Kjeldsen    schedule 29.11.2011
comment
Большое спасибо @Jan B. Kjeldsen, не могли бы вы лучше объяснить, как я должен делать это в методе buildGrid. У меня такая же проблема. Спасибо за совет. Я приветствую вашу помощь! - person ulisses; 23.06.2016
comment
Сделайте поле ContactPersonId невидимым. - person Jan B. Kjeldsen; 24.06.2016

Если вы говорите о сокрытии ContactPersonId в форме вызова, обратите внимание на форму CustTable на странице вкладки «Контакт».

Как указано в формах ClassDeclaration:

Поле contactpersonId скрыто в дизайне формы, но должно быть доступно, чтобы можно было выполнять поиск по имени контакта.

Поле editContactPersonName имеет поиск, относящийся к скрытому полю contactpersonId:

void lookup()
{;
    ContactPerson::lookupCustContactPerson(contactPersonId, custTable.AccountNum, this, custTable.ContactPersonId);
}
person Jan B. Kjeldsen    schedule 30.11.2011