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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.04.2004, 10:07   #1  
Сергей Щербак is offline
Сергей Щербак
Участник
 
22 / 10 (1) +
Регистрация: 09.10.2002
Адрес: Москва
? Как программно создать строку номенклатуры???
Всем привет! Разбирался с методами создания строки номенклатуры при интерактивном вводе новой номенклатуры. Пытаюсь создать с помощью кода - не хочет добавлять новую строку - меняет текущую. Есть у кого-нить пример как енто проделать???
Старый 22.07.2011, 13:26   #2  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
пробовал этот код использовать в AX 2009, номенклатура не появляется, но создать с таким же именем нельзя, в таблицах SQL она есть. Подскажите, как программно этого добиться в 2009ой версии?
Старый 22.07.2011, 13:37   #3  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
X++:
        inventTable.clear();
        inventTable.initValue();
        inventTable.ItemId              = NumberSeq::newGetNum(InventParameters::numRefItemId(), false).num();
        inventTable.ItemName            = "Название товара"
        inventTable.txtDefault(true, "Описание товара");
        inventTable.DimGroupId  = "Группа аналитик";
        inventTable.ModelGroupId = "Группа моделей";
        inventTable.ItemGroupId= "Группа номенклатуры";

        inventTable.insertInventItemOrderSetup(); // Новые таблицы AX2009

        inventTable.PrimaryVendorId = "" // Код основного поставщика

        inventTable.insert();

        inventItemLocation.clear();
        inventItemLocation.inventDimId = InventDim::inventDimIdBlank();
        inventItemLocation.ItemId      = inventTable.ItemId;
        inventItemLocation.insert();

        inventTableModule.clear();
        inventTableModule.initValue();
        inventTableModule.ModuleType    = ModuleInventPurchSales::Purch;
        inventTableModule.ItemId        = inventTable.ItemId;
        inventTableModule.insert();

        inventTableModule.clear();
        inventTableModule.initValue();
        inventTableModule.ModuleType    = ModuleInventPurchSales::Sales;
        inventTableModule.ItemId        = inventTable.ItemId;
        inventTableModule.insert();

        inventTableModule.clear();
        inventTableModule.initValue();
        inventTableModule.ModuleType    = ModuleInventPurchSales::Invent;
        inventTableModule.ItemId        = inventTable.ItemId;
        inventTableModule.insert();
__________________
Ivanhoe as is..

Последний раз редактировалось Ivanhoe; 22.07.2011 в 13:40.
Старый 22.07.2011, 13:44   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Поблема здесь
X++:
_inventItemLocation.inventDimId = 'Axapta';
В DAX2009 пустая аналитика называется 'AllBlank', но как правильно написал Ivanhoe, лучше использовать InventDim::inventDimIdBlank()
__________________
Axapta v.3.0 sp5 kr2
Старый 22.07.2011, 15:43   #5  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
всё равно ошибки всякие повылезали, начиная от ";" и тд...
помогло вот это, взятое с иностранного сайта
X++:
// Created on 06 Jul 2010 by Jovan Bulajic
// This can be called to create a new item from code, for example CreateNewItem('AA01');
static void CreateNewItem(ItemId _itemId, ItemGroupId _itemGroup, ItemName _itemName)
{
    InventTable         inventTable;
    InventTableModule   inventTableModule;
    InventItemLocation  inventItemLocation;
    ;



    ttsbegin;

    // Master record in InventTable
    select forupdate inventTable;
    inventTable.initValue();
    // If InventTable has other mandatory fields in addition to
    // ItemGroupId and ItemId, they should be defined here
    inventTable.ItemGroupId = _itemGroup;
    inventTable.ItemId = _itemId;
    inventTable.ItemName = _itemName;
    inventTable.ItemType = ItemType::Item;
    // You can put default DimGroupId, ModelGroupId, etc. here
    inventTable.insert();

    // InventItemLocation for default dimension
    select forupdate inventItemLocation;
    inventItemLocation.initValue();
    inventItemLocation.ItemId = _itemId;
    inventItemLocation.InventDimId = InventDim::inventDimIdBlank();
    inventItemLocation.insert();

    select forupdate inventTableModule;
    // запасы
    inventTableModule.initValue();
    inventTableModule.ItemId = _itemId;
    inventTableModule.ModuleType = ModuleInventPurchSales::Invent;
    inventTableModule.insert();
    // покупка
    inventTableModule.initValue();
    inventTableModule.ItemId = _itemId;
    inventTableModule.ModuleType = ModuleInventPurchSales::Purch;
    inventTableModule.insert();
    // продажа
    inventTableModule.initValue();
    inventTableModule.ItemId = _itemId;
    inventTableModule.ModuleType = ModuleInventPurchSales::Sales;
    inventTableModule.insert();

    ttscommit;

}


Теперь возникает другой вопрос: как запускать job из job'a с какими-то параметрами?
Вот пример взятый из различных источников:
X++:
static void Jobs_MyJob(str _text)
{
;
    info(_text);
}
создали job для запуска, а затем через MenuItem
X++:
static void Jobs_ExecutingJob(Args _args)
{
    Args                     args;
;
    args = new Args();
    args.name(identifierStr(Jobs_MyJob));
    new menuFunction(menuItemActionStr(Jobs_MyJob), MenuItemType::Action).run(args);
    
}
но он не работает, выдаёт ошибку на строке "new"
поиск по форуму ничем не помог

Последний раз редактировалось niksen; 22.07.2011 в 15:50.
Старый 22.07.2011, 17:38   #6  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,318 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Есть самый простой способ создать номенклатуру без лишних табличек:
X++:
static void Job10(Args _args)
{
    InventTable          inventTable;
    AxInventTable        axInventTable;
    ItemId                _itemId = 'Ном001';
    ItemName             _itemName = 'Номенклатура 001';
    ;
    axInventTable = AxInventTable::construct();
    axInventTable.parmItemId(_itemId);
    axInventTable.parmItemName(_itemName);
    axInventTable.parmItemGroupId('МояГруппа');
    axInventTable.parmNameAlias(_itemName);
    axInventTable.validateInput(true);
    axInventTable.save();
    inventTable = axInventTable.inventTable();
}
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 22.07.2011 в 17:40.
Старый 26.07.2011, 08:22   #7  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
Если писать, как предложил sukhanchik, то надо дописать тогда ещё строчки
X++:
axInventTable.parmDimGroupId(_InventDimGroupId);
    axInventTable.parmItemType(ItemType::Item);
    axInventTable.parmModelGroupId(_InventModelGroupId);
Поправьте, если не прав, у меня без этих строчек не заработало
За это сообщение автора поблагодарили: sukhanchik (2).
Старый 26.07.2011, 09:07   #8  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,318 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от niksen Посмотреть сообщение
Если писать, как предложил sukhanchik, то надо дописать тогда ещё строчки
X++:
axInventTable.parmDimGroupId(_InventDimGroupId);
    axInventTable.parmItemType(ItemType::Item);
    axInventTable.parmModelGroupId(_InventModelGroupId);
Поправьте, если не прав, у меня без этих строчек не заработало
В целом согласен, но без этих строк у меня номенклатура создалась, поэтому я так и написал (выдрал кусок текста из кода).
Общая идея примера была в том, что в данном случае программисту не нужно заботиться о всяких там InventTableModule / InventItemLocation - связанных таблицах.

PS. Вспомнил - да, у меня номенклатура создалась - т.к. на момент ее создания я поставил validateInput(false) .
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: niksen (1).
Старый 23.08.2011, 14:51   #9  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
интересен теперь другой вопрос, чтобы не плодить множество тем:
как правильно, используя axInventTable выделить нужную запись и обновить её, либо же удалить?
как я понимаю, нужно использовать axInventTable.save для обновления-создания и axInventTable.delete, но как именно выбрать нужную запись и обновить-создать-удалить?
Старый 23.08.2011, 15:05   #10  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Наверное, как-то так: AxInventTable::newInventTable(inventTable), где inventTable - курсор с нужной номенклатурой.
__________________
Ivanhoe as is..
Старый 23.08.2011, 15:48   #11  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
вот что-то вроде начала
ItemId='_Болт' в начале, затем
X++:
ttsbegin;
              if (InventTable::find(_itemId,true)) ///// проверка на существование записи
                 {
                    select InventTable
                        where InventTable.ItemId == '_Болт';
                        {

                            AxInventTable.inventTable(InventTable);
                            
                        }
вопрос в том, что писать дальше, чтобы изменить данные, простое присвоение через AxInventTable.inventTable.имяПоля = значение не работает, а через parm-методы выдаёт ошибку "объект не инициализирован". Впрочем, ту же ошибку выдаёт, если вместо присвоения стоит AxInventTable.delete();

Последний раз редактировалось niksen; 23.08.2011 в 15:52.
Старый 23.08.2011, 15:52   #12  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
для проверки на существование используейте метод InventTable::exist()
Старый 23.08.2011, 17:50   #13  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Это вы так вольно изменили мой вариант? Или вообще его не рассматривали?
__________________
Ivanhoe as is..
За это сообщение автора поблагодарили: niksen (1).
Старый 24.08.2011, 00:05   #14  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,318 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
У меня совершенно прекрасно работает такой код, независимо от наличия записи в inventTable после отработки find:
X++:
    inventTable = InventTable::find(_itemId, true);
    axInventTable = AxInventTable::construct();
    axInventTable.inventTable(inventTable);
    axInventTable.parmItemId(_itemId);
    axInventTable.parmItemName(_itemName);
.....................
    axInventTable.validateInput(true);
    axInventTable.save();
    inventTable = axInventTable.inventTable();
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: S.Kuskov (2), niksen (1).
Старый 24.08.2011, 08:37   #15  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
пробовал вместо

X++:
 AxInventTable.inventTable(InventTable);
AxInventTable.delete();
X++:
AxInventTable::construct();
AxInventTable::newInventTable(InventTable);
AxInventTable.delete();
результат тот же, ошибка объекта не инициализирован
Старый 24.08.2011, 08:50   #16  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
вместо
X++:
AxInventTable::construct();
AxInventTable::newInventTable(InventTable);
AxInventTable.delete();
надо
X++:
axInventTable = AxInventTable::newInventTable(InventTable);
axInventTable.delete();
За это сообщение автора поблагодарили: niksen (1).
Старый 02.09.2011, 11:45   #17  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
Ivanhoe
рассматривал, но не заработало, потому что забыл где-то что-то дописать, видимо нельзя работать сонным
sukhanchik
Вариант с find отлично работает
ice
именно так теперь и делаю, забыл, что некоторые вещи нужно вызывать особым способом
всем спасибо
Теги
как правильно, номенклатура, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
как программно создать документ в DocuView алька DAX: Программирование 5 03.04.2007 18:44
Как программно создать платежное поручение? AK9 DAX: Программирование 3 13.09.2006 09:37
Создать программно складскую проводку с количеством = 0. vasiliy DAX: Программирование 5 26.12.2005 16:46
программно создать таблицу mne2001 DAX: Программирование 40 13.08.2004 15:46
Можно ли создать версии спецификации для номенклатуры с разными конфигурациями? Hard DAX: Функционал 4 08.12.2003 19:20

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

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

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