Показать сообщение отдельно
Старый 14.03.2011, 21:31   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 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).