Показать сообщение отдельно
Старый 18.11.2011, 14:42   #8  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от EVGL Посмотреть сообщение
... На этом месте сразу же сталкиваемся с доработкой #1: профиль по умолчанию хорошо присоединяется в модулях заказов и закупок, однако в журналах склада и производства профиль каждый раз надо указывать руками. Казалось бы, в записи склада есть поля для профиля по умолчанию, но его указание не приводит к автоматическому выбору профиля в журналах. Лечится тремя строками в методе \Data Dictionary\Maps\InventStorageDimMap\Methods\initFromInventLocation:
X++:
    if (_inventLocation.InventProfileId_RU && (! dimSearch || dimSearch.findActive(_dimGroupId, fieldnum(InventDim, InventProfileId_RU))))
    {
        this.InventProfileId_RU = _inventLocation.InventProfileId_RU;
    }
на мой взгляд тут доработка немного посложней, а именно:
1. В map InventStorageDimMap добавляем поле InventProfileId_RU.
2. В mappings для таблиц: CustTable, InventDim, PurchTable, SalesTable, VendTable добавляем соответствующие связи полей.
3. В map InventStorageDimMap изменяем методы:
1. modifiedField(). А именно добавляем в case по изменению поля InventLocationId проверку на незаполненность профиля учета. В результате этот case будет выглядеть так:
X++:
    if (this.InventLocationId && (!this.InventSiteId    || // No site. Hence default site might be applicable
                                          !this.InventProfileId_RU)) // Добавлена проверка профиля
            {
                if (this.isFormDataSource())
                {
                    this.InventStorageDimMap::modifiedInventLocationFromParent(this.InventStorageDimMap::formDataSourceJoinParent());
                }
            }
2. modifiedInventLocationFromParent(). А именно добавляем переменную InventJournalTrans (строки складских журналов), и в switch по parent.TableId добавляем новый case. В итоге этот метод будет выглядеть так:
X++:
    fieldId             fieldId;
    ProdJournalProd     prodJournalProd;
    ProdJournalRoute    prodJournalRoute;
    InventJournalTrans  inventJournalTrans; // Добавлена переменная строк складских журналов
    ;

    if (parent.TableId && parent.TableId != tablenum(Common)) // A parent is found
    {
        switch (parent.TableId)
        {
            case tablenum(InventItemLocation):
                break;

            case tablenum(ProdJournalProd):
                prodJournalProd = parent;
                this.InventStorageDimMap::initFromInventLocation(this.InventStorageDimMap::inventLocation(),
                                                                 prodJournalProd.prodTable().inventTable().DimGroupId);
                break;

            case tablenum(ProdJournalRoute):
                prodJournalRoute = parent;
                this.InventStorageDimMap::initFromInventLocation(this.InventStorageDimMap::inventLocation(),
                                                                 prodJournalRoute.prodTable().inventTable().DimGroupId);
                break;

            // Добавлен case по строкам складских журналов -->
            case tablenum(InventJournalTrans)   :
                inventJournalTrans  =parent;
                this.InventStorageDimMap::initFromInventLocation(this.InventStorageDimMap::inventLocation(),
                                                                 inventJournalTrans.inventTable().DimGroupId);
                break;
            // Добавлен case по строкам складских журналов <--
            default:
                fieldId = fieldname2id(parent.TableId,fieldstr(InventTable,ItemId));
                if (fieldId)
                {
                    this.InventStorageDimMap::initFromInventLocation(this.InventStorageDimMap::inventLocation(),
                                                                     InventTable::find(parent.(fieldId)).DimGroupId);
                }
                else
                {
                    this.InventStorageDimMap::initFromInventLocation(this.InventStorageDimMap::inventLocation());
                }
                break;
        }
    }
    else // No parent exist
    {
        this.InventStorageDimMap::initFromInventLocation(this.InventStorageDimMap::inventLocation());
    }
3. initFromInventLocation(). А именно в конце метода добавляем проверку активности аналитики "Профили учета", и инициализацию профиля (собственно те две строки, про которые говорил EVGL):
X++:
    if (!dimSearch || dimSearch.findActive(_dimGroupId, fieldnum(InventDim, InventProfileId_RU)))
    {
        this.InventProfileId_RU = _inventLocation.InventProfileId_RU;
    }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем