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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.04.2012, 11:41   #7  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1296 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от 1349 Посмотреть сообщение
Не могли бы вы привести самый простой пример использования этого класса?
Можно поискать по перекрестным ссылкам его использование. Например, он используется при создании складского журнала "Спецификация" из карточки номенклатуры в классе BOMReportFinish.
Если для учебных целей, то простой пример будет примерно следующим (это для DAX4, в 2009 нужно еще учесть возможность иметь разные спецификации для разных сайтов).
Создаем класс, в нем реализуем метод:
X++:
public void expandBOM( 
                        ItemId              _itemId,
                        ConfigId            _configId,
                        TransDate           _baseDate,
                        InventQty           _qtySeries,
                        Counter             _level,
                        BOMId               _bomId = '',
                        boolean             _expandPhantom = true
                      )
{
    InventTable         inventTable;
    InventTable         childInventTable;
    BOMSearch           search;
    BOMCalcData         calcData;
    BOMCalcConsumption  calcConsump;
    BOMId               bomId;
    ItemId              childItemId;
    ConfigId            childConfigId;
    BOMId               childBOMId;
    CompanyId           companyId;
    boolean             expandChild;
    Qty                 qty;
    ;

    if (_level > bomMaxLevel)
    {
        return;
    }

    select firstOnly inventTable
        where inventTable.ItemId    == _itemId
    ;

    if (!inventTable.inventItemType().canHaveBOM())
    {
        return;
    }

    bomId       = (_bomId && BOMTable::exist(_bomId)) ? _bomId : inventTable.BOMId(_baseDate, _qtySeries);
    search      = BOMSearch::newBOMExplode_OVK(bomId, _baseDate, _itemId, _configId);

    calcData    = BOMCalcData::newInventTable(_qtySeries, inventTable);

    while (search.next())
    {
        childItemId     = search.BOM().itemId;

        if (!childItemId || !InventTable::exist(childItemId))
        {
            continue;
        }

        childInventTable = search.BOM().inventTable();

        calcConsump     = BOMCalcConsumption::construct(search.BOM().formula, calcData);
        qty             = calcConsump.calcConsumption(search.BOM()) * _qtySeries;
        qty             = UnitConvert::qty(
                                            qty,
                                            search.BOM().unitId,
                                            childInventTable.inventUnitId(),
                                            childItemId,
                                            false);

        if (!qty)
        {
            continue;
        }

        childConfigId   = search.BOM().configId();
        childBOMId      = search.BOM().itemBOMId(_baseDate, qty);

        expandChild     = false;
        
        if (search.BOM().BOMType == BOMType::Phantom)
        {
            if (_expandPhantom)
            {
                expandChild = true;
            }
        }
        else if (childInventTable.inventItemType().canHaveBOM() && !childInventTable.StopExplode)
        {
            expandChild = true;
        }
        
        if (!_expandPhantom || search.BOM().BOMType != BOMType::Phantom)
        {
            info(strFmt("%1Уровень = %2 Номенклатура = %3, конфигурация = %4, количество = %5", strRep(" ", _level*4), _level, childItemId, childConfigId, qty));
        }

        if (!expandChild)
        {
            continue;
        }
        
        select firstOnly childInventTable
            where childInventTable.ItemId    == childItemId
        ;

        if (childInventTable.inventItemType().canHaveBOM())
        {
            this.expandBOM(
                            childItemId,
                            childConfigId,
                            _baseDate,
                            qty,
                            _level + (search.BOM().BOMType != BOMType::Phantom ? 1 : 0),
                            childBOMId,
                            _expandPhantom
                          );
        }
    }

}
Вызов делаем примерно таким:
X++:
static void TestExpandBOM_job(Args _args)
{
    InventTable     inventTable;
    ConfigTable     configTable;
    TestExpandBOM   testExpandBOM;
    Counter         maxLevel;
    TransDate       baseDate;
    InventQty       qtySeries;
    boolean         expandPhantom;
    ;
    
    baseDate        = systemDateGet();
    expandPhantom   = true;
    qtySeries       = 1;
    maxLevel        = 1;    // BOMParameters::find().BOMMaxLevel();
    
    testExpandBOM   = TestExpandBOM::newBlank(maxLevel);
    
    while select inventTable
        where inventTable.ItemId    == "140782"
    {
        if (!inventTable.configActive())
        {
            info(strFmt("Основная номенклатура %1", inventTable.ItemId));
            testExpandBOM.expandBOM(inventTable.ItemId, '', baseDate, qtySeries, 1, '', expandPhantom);
        }
        else
        {
            while select configTable
                where configTable.ItemId    == inventTable.ItemId
            {
                info(strFmt("Основная номенклатура %1, конфигурация %2", inventTable.ItemId, configTable.ConfigId));
                testExpandBOM.expandBOM(inventTable.ItemId, configTable.ConfigId, baseDate, qtySeries, 1, '', expandPhantom);
            }
        }
    }
    
}
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Открытие формы строк журнала спецификации AGRESSOR DAX: Программирование 16 13.05.2010 11:18
Amand: Видео: Спецификации (BOM) в Microsoft Dynamics AX 4.0 Часть 1-3 Этапы создания спецификации. Blog bot DAX Blogs 0 25.01.2010 22:05
Amand: Видео: Спецификации (BOM) в Microsoft Dynamics AX 4.0 Часть 1-2 Настройка - Типы строк спецификаций. Blog bot DAX Blogs 0 24.01.2010 19:05
Проверка цикличности в спецификации vey DAX: Функционал 2 24.03.2005 11:03
Резервирование строк спецификации basanko DAX: Функционал 7 15.07.2003 22:06

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

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

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