AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.03.2011, 21:31   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Локализаторский движок работы с российским форматом адресов (FormRunListener_Address_RU) не поддерживает группы в гриде!
Захотелось тут добавить на грид с адресами в стандартной форме пару контролов. Смотрю, странно как-то грид реализован - не использует табличные группы полей, все контролы явно накиданы на грид. Фиг бы с ним, думаю, отрефакторю: сделал группу полей с нужными мне добавками, вывел на грид - и форма перестала открываться. Оказалось, что класс FormRunListener_Address_RU не поддерживает группы контролов в гриде, более того, он также не поддерживает display/edit-методы и unbound-контролы! Переделал используемый в этом классе м... незатейливый перебор контролов на вызов своего итератора (последний пришлось допилить, чтоб поддерживал и FormBuild-контролы), а сам класс FormRunListener_Address_RU модифицировал следующим образом:
X++:
private Set addAddressGroupGrid()
{
    FormBuildDesign          design;
    FormBuildStringControl   formStringControl;
    FormBuildControl         parentControl;
    FormBuildDataSource      formDataSource, tmpFormDataSource;
    Set                      ret = new Set(Types::Container);
    Integer                  zipCodeControlId;
    FormBuildStringControl   zipCodeControl;
    container                groupInfo;
    int                      i, j;
    extendedTypeId           type;
    SysAnyType               zipCodeControlRef; //+gl00m, 14.03.2011

    void addAddressElementControl(fieldId _fieldId)
    {
        ;
        formStringControl = parentControl.addControl(FormControlType::String, #ControlName);
        formStringControl.dataSource(formDataSource.id());
        formStringControl.dataField(_fieldId);
    }
    ;

    design = formRun.form().design();

    for (i = 1; i <= conlen(addressInfoGrid); i ++)
    {
        groupInfo      = conpeek(addressInfoGrid, i);
        parentControl = design.control(conpeek(groupInfo, #1));

        // gl00m, 14.03.2011 -->
        /*
        for (j = 1; j <= parentControl.controlCount(); j ++)
        {
            formStringControl = parentControl.controlNum(j);
            tmpFormDataSource = formRun.form().dataSource(formStringControl.dataSource());
            type = new DictField(tmpFormDataSource.table(), formStringControl.dataField()).typeId();

            if(type == extendedtypenum(AddressCountryRegionId) ||
               type == extendedtypenum(AddressStateId)         ||
               type == extendedtypenum(AddressCountyId))
            {
                formStringControl.name(#ControlName);
            }
            if (type == extendedtypenum(AddressZipCodeId))
            {
                zipCodeControl   = parentControl.controlNum(j);
                zipCodeControlId = zipCodeControl.id();
                zipCodeControl.name(#ZipCodeControlName);
            }
        }
        */
        zipCodeControlRef = new SysAnyType( new Object() );
        DEV_iterateThroughFormControls( parentControl,
                                        this,
                                        methodstr(FormRunListener_Address_RU, processAddressRelatedFormControl),
                                        DEV_FormHelpers::addBuildStringCtrlId2Set(),
                                        true,
                                        0,
                                        zipCodeControlRef
                                       );
        zipCodeControl   = zipCodeControlRef.value();
        zipCodeControlId = zipCodeControl.id();
        // gl00m, 14.03.2011 <--
        formDataSource = formRun.form().dataSource(zipCodeControl.dataSource());

        addAddressElementControl(fieldnum(Address, TownId_RU));
        addAddressElementControl(fieldnum(Address, SettlementId_RU));
        addAddressElementControl(fieldnum(Address, StreetId_RU));
        addAddressElementControl(fieldnum(Address, Estate_RU));
        addAddressElementControl(fieldnum(Address, Building_RU));
        addAddressElementControl(fieldnum(Address, Flat_RU));

        ret.add([formDataSource.name(), conpeek(groupInfo, #1), conpeek(groupInfo, #2), fieldnum(Address, ZipCode), zipCodeControlId]);
    }

    return ret;
}
// gl00m, 14.03.2011
// сюда вынесена часть кода из внутреннего цикла в методе addAddressGroupGrid()
private void processAddressRelatedFormControl(FormBuildStringControl _formStringControl, Object _optParm = null)
{
    FormBuildDataSource     tmpFormDataSource;
    SysAnyType              zipCodeControlRef;
    DictField               dictField;
    extendedTypeId          type;
    ;
    tmpFormDataSource = formRun.form().dataSource(_formStringControl.dataSource());
    if (tmpFormDataSource)
    {
        dictField = new DictField(tmpFormDataSource.table(), _formStringControl.dataField());
    }
    if (dictField)
    {
        type = dictField.typeId();
    }
    if (    type == extendedtypenum(AddressCountryRegionId)
        ||  type == extendedtypenum(AddressStateId)
        ||  type == extendedtypenum(AddressCountyId)
       )
    {
        _formStringControl.name(#ControlName);
    }
    if (type == extendedtypenum(AddressZipCodeId))
    {
        _formStringControl.name(#ZipCodeControlName);
        // возвращаем ссылку на найденный FormControl для почтового индекса
        zipCodeControlRef = SysDictClass::as(_optParm, classnum(SysAnyType));
        if (zipCodeControlRef)
        {
            zipCodeControlRef.value(_formStringControl);
        }
    }
}
Приложение AX 2009 SP1 EE RU5
За это сообщение автора поблагодарили: mazzy (2), Maximin (2), konopello (2).
Теги
ax2009, законченный пример, локализация, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Расскажите кто-нибудь логику работы LedgerBondServer_RU и иже с ними ... TasmanianDevil DAX: Программирование 10 12.12.2007 11:55
Зависание формы "Настройка таблиц группы определения" в АХ4 SP1 MUI (RU) RS DAX: Функционал 0 02.02.2007 14:16
InventLocation.address() DreamCreator DAX: Программирование 4 06.07.2006 15:18
COMOfficeDocument_RU как дождаться конца работы в документе? Roman. ~RVS DAX: Программирование 15 01.04.2005 15:04
Вопрос по классу SalesPurchReport_RU Кирилл DAX: Программирование 4 27.02.2004 13:28

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:06.