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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.04.2004, 10:07   #1  
Сергей Щербак is offline
Сергей Щербак
Участник
 
22 / 10 (1) +
Регистрация: 09.10.2002
Адрес: Москва
? Как программно создать строку номенклатуры???
Всем привет! Разбирался с методами создания строки номенклатуры при интерактивном вводе новой номенклатуры. Пытаюсь создать с помощью кода - не хочет добавлять новую строку - меняет текущую. Есть у кого-нить пример как енто проделать???
Старый 23.04.2004, 10:39   #2  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
PHP код:
InventTable    _inventTable
InventTableModule    _inventTableModule
InventItemLocation    _inventItemLocation

InventItemGroup    _inventItemGroup
InventDimGroup    _inventDimGroup
InventModelGroup    _inventModelGroup

CustTable    _custTable
CustGroup    _custGroup

SalesTable    _salesTable
SalesTableType    _salesTableType
SalesLine    _salesLine

SalesFormLetter    _salesFormLetter
;

// === Создаем номенклатурные позиции == 
_inventItemGroup InventItemGroup::find('TestGroup'); 
if (! 
_inventItemGroup

_inventItemGroup.ItemGroupId 'TestGroup'
_inventItemGroup.insert(); 


_inventDimGroup InventDimGroup::find('TestGroup'); 
if (! 
_inventDimGroup

_inventDimGroup.dimGroupId 'TestGroup'
_inventDimGroup.insert(); 


_inventModelGroup InventModelGroup::find('TestGroup'); 
if (! 
_inventModelGroup

_inventModelGroup.ModelGroupId 'TestGroup'
_inventModelGroup.NegativeFinancial NoYes::Yes
_inventModelGroup.PostOnhandFinancial NoYes::Yes
_inventModelGroup.PostOnhandPhysical NoYes::Yes
_inventModelGroup.insert(); 


_inventTable InventTable::find('TestItem1'); 
if (! 
_inventTable

_inventTable.ItemGroupId 'TestGroup'
_inventTable.ItemId 'TestItem1'
_inventTable.ItemType ItemType::Item
_inventTable.DimGroupId 'TestGroup'
_inventTable.ModelGroupId 'TestGroup'
_inventTable.insert(); 

Старый 23.04.2004, 10:49   #3  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
а дальше
Андре, а где же создаются вот эти таблички?
PHP код:
InventTableModule    _inventTableModule
InventItemLocation    _inventItemLocation
Старый 23.04.2004, 10:53   #4  
andreynikolai is offline
andreynikolai
Участник
 
133 / 10 (1) +
Регистрация: 11.04.2002
Да это точно их то же ведь надо создать, иначе в форме InventTable не увидишь созданную позицию, там датасоурсы связаны по InnerJoin.

Единственное, надо создать записей в InventTableModule столько, сколько
в Enum ModuleInventPurchSales, задав соотв. ModuleType.
Старый 23.04.2004, 10:58   #5  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Андре, а где же создаются вот эти таблички?
Гм... похоже не аккуратно выполнил операцию copy-paste

Потерялся вот этот кусочек:
PHP код:
// --- itModule 
_inventTableModule InventTableModule::find('TestItem1'ModuleInventPurchSales::Invent); 
if (! 
_inventTableModule

_inventTableModule.ItemId 'TestItem1'
_inventTableModule.ModuleType ModuleInventPurchSales::Invent
_inventTableModule.insert(); 


_inventTableModule InventTableModule::find('TestItem1'ModuleInventPurchSales::Purch); 
if (! 
_inventTableModule

_inventTableModule.ItemId 'TestItem1'
_inventTableModule.ModuleType ModuleInventPurchSales::Purch
_inventTableModule.insert(); 



_inventTableModule InventTableModule::find('TestItem1'ModuleInventPurchSales::Sales); 
if (! 
_inventTableModule

_inventTableModule.ItemId 'TestItem1'
_inventTableModule.ModuleType ModuleInventPurchSales::Sales
_inventTableModule.insert(); 


// -- iiLocation 
_inventItemLocation InventItemLocation::findDefault('TestItem1'); 
if (! 
_inventItemLocation

_inventItemLocation.ItemId 'TestItem1'
_inventItemLocation.inventDimId 'Axapta'
_inventItemLocation.insert(); 

Старый 23.04.2004, 13:30   #6  
Сергей Щербак is offline
Сергей Щербак
Участник
 
22 / 10 (1) +
Регистрация: 09.10.2002
Адрес: Москва
Thumbs up
Большое спасибо!!!
А какую смысловую нагрузку несет поле InventDimId в таблице InventItemLocation
Старый 23.04.2004, 16:58   #7  
andreynikolai is offline
andreynikolai
Участник
 
133 / 10 (1) +
Регистрация: 11.04.2002
А разве там есть такое поле ?
Там вроде бы InventLocationId должно быть
Старый 23.04.2004, 17:09   #8  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Цитата:
А разве там есть такое поле ?
Там вроде бы InventLocationId должно быть
В 2.5 было InventLocationId, в 3.0 его убрали, но сделали inventDimId и включили его к тому же в первичный ключ.
Старый 23.04.2004, 17:13   #9  
andreynikolai is offline
andreynikolai
Участник
 
133 / 10 (1) +
Регистрация: 11.04.2002
Понятно, в трешке значит местоположение регулируется сразу комбинацией
аналитик, а не только одним складом.
Старый 23.04.2004, 17:16   #10  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Цитата:
Изначально опубликовано Сергей Щербак
А какую смысловую нагрузку несет поле InventDimId в таблице InventItemLocation
Это поле является ссылкой на таблицу, в которой хранится комбинация номенклатурных и складских аналитик соответствующих данной записи (в частности поле склад).
Старый 22.07.2011, 13:26   #11  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
пробовал этот код использовать в AX 2009, номенклатура не появляется, но создать с таким же именем нельзя, в таблицах SQL она есть. Подскажите, как программно этого добиться в 2009ой версии?
Старый 22.07.2011, 13:37   #12  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (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   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Поблема здесь
X++:
_inventItemLocation.inventDimId = 'Axapta';
В DAX2009 пустая аналитика называется 'AllBlank', но как правильно написал Ivanhoe, лучше использовать InventDim::inventDimIdBlank()
__________________
Axapta v.3.0 sp5 kr2
Старый 22.07.2011, 15:43   #14  
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   #15  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 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   #16  
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   #17  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 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   #18  
niksen is offline
niksen
Участник
Самостоятельные клиенты AX
 
284 / 28 (1) +++
Регистрация: 05.07.2011
Адрес: Татарстан
интересен теперь другой вопрос, чтобы не плодить множество тем:
как правильно, используя axInventTable выделить нужную запись и обновить её, либо же удалить?
как я понимаю, нужно использовать axInventTable.save для обновления-создания и axInventTable.delete, но как именно выбрать нужную запись и обновить-создать-удалить?
Старый 23.08.2011, 15:05   #19  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Наверное, как-то так: AxInventTable::newInventTable(inventTable), где inventTable - курсор с нужной номенклатурой.
__________________
Ivanhoe as is..
Старый 23.08.2011, 15:48   #20  
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.
Теги
как правильно, номенклатура, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
как программно создать документ в 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, время: 00:34.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.