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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.09.2011, 09:20   #1  
fara21 is offline
fara21
Участник
 
3 / 10 (1) +
Регистрация: 22.09.2011
Перекодировать код номеклатуры
MD AX 2009, kernel vers 5.0, Appl vers 5.0
Старый 23.09.2011, 09:21   #2  
fara21 is offline
fara21
Участник
 
3 / 10 (1) +
Регистрация: 22.09.2011
Можно ли перекодировать код номеклатуры на другой код, если были проводки, движения, есть в наличии?
Старый 23.09.2011, 09:24   #3  
fara21 is offline
fara21
Участник
 
3 / 10 (1) +
Регистрация: 22.09.2011
Цель перекодирования - привести в порядок номеклатурный справочник, исключить дублирующие записи с одинаковым наименованием.
Старый 23.09.2011, 09:28   #4  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
можно с помощью паспорта записи (правой кнопкой мыши на номенклатуре --> паспорт записи --> кнопка Переименовать).
но у этого метода есть проблемы с производительностью, похожее обсужени уже ведется в соседней ветке
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: fara21 (1).
Старый 25.09.2011, 20:56   #5  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от fara21 Посмотреть сообщение
Цель перекодирования - привести в порядок номеклатурный справочник, исключить дублирующие записи с одинаковым наименованием.
Для "объединения" номенклатуры используем код, как указано ниже.
Очень удобно "броться" с "задвоенностью" по номенклатуре.

При этом объединяются и проводки по номенклатуре, и текущие остатки в разрезе складских аналитик.


X++:
static server void renameItemIdAx(ItemId _fromItemId, ItemId _toItemId)
{
    inventTable               inventTable;
    inventTable               inventTableTo;
    inventTableModule         inventTableModule;
    InventItemLocation        inventItemLocation;
    inventSum                 inventSum;
    inventSum                 inventSumUpd;
    InventTxt                 inventTxt;
    InventSumReCalcItem       inventSumReCalcItem;
    ReqItemTable              reqItemTable;
    InventBatch               inventBatch;
    InventBatch               inventBatchFind;
    CustVendExternalItem      custVendExternalItem;
    InventItemBarcode         inventItemBarcode;
    InventItemBarcode         inventItemBarcodeFind;

    InventItemPurchSetup      inventItemPurchSetup;
    InventItemSalesSetup      inventItemSalesSetup;
    InventItemInventSetup     inventItemInventSetup;

    InventItemPrice           inventItemPrice;

    if (_fromItemId == _toItemId)
    {
        error(strfmt("Нельзя объединить номенклатуру %1 саму в себя", _toItemId));
        return;
    }

    inventTableModule.skipDataMethods(true);
    inventTableModule.skipDeleteActions(true);
    inventTableModule.skipDeleteMethod(true);

    inventItemLocation.skipDataMethods(true);
    inventItemLocation.skipDeleteActions(true);
    inventItemLocation.skipDeleteMethod(true);

    inventSumUpd.skipDataMethods();
    inventSumUpd.skipDeleteActions();
    inventSumUpd.skipDeleteMethod();

    inventTable = InventTable::find(_toItemId);

    if (inventTable.RecId == 0)
    {
        error(strfmt("Номер %1 не найден в справочнике номенклатуры", _toItemId));
        continue;
    }

    inventTable = InventTable::find(_fromItemId);

    if (inventTable.RecId == 0)
    {
        error(strfmt("Номер %1 не найден в справочнике номенклатуры", _fromItemId));
        continue;
    }

    ttsbegin;

    while select inventItemBarcode
    where inventItemBarcode.itemId == _fromItemId
    {
        delete_from inventItemBarcodeFind
        where inventItemBarcodeFind.itemId      == _toItemId &&
              inventItemBarcodeFind.itemBarCode == inventItemBarcode.itemBarCode;
    }

    while select inventBatch
    where InventBatch.itemId == _fromItemId
    {
        inventBatchFind = inventBatch::find(inventBatch.inventBatchId, _toItemId, true);
        if (inventBatchFind.RecId != 0)
            inventBatchFind.delete();

    }


    delete_from reqItemTable
    where reqItemTable.ItemId == _fromItemId;


    delete_from custVendExternalItem
    where custVendExternalItem.ItemId == _fromItemId;



    delete_from inventItemPurchSetup
    where inventItemPurchSetup.ItemId == _fromItemId;

    delete_from inventItemSalesSetup
    where inventItemSalesSetup.ItemId == _fromItemId;

    delete_from inventItemInventSetup
    where inventItemInventSetup.ItemId == _fromItemId;

    delete_from inventItemPrice
    where inventItemPrice.ItemId == _fromItemId;

    while select inventSum
    where inventSum.ItemId == _fromitemId
    {
        inventSumUpd = inventSum::find(_toItemId, inventSum.InventDimId, true);
        if (inventSumUpd.RecId !=0)
        {
            inventSumUpd.PostedQty              += inventSum.PostedQty;
            inventSumUpd.PostedValue            += inventSum.PostedValue;
            inventSumUpd.PhysicalValue          += inventSum.PhysicalValue;
            inventSumUpd.Deducted               += inventSum.Deducted;
            inventSumUpd.Received               += inventSum.Received;
            inventSumUpd.ReservPhysical         += inventSum.ReservPhysical;
            inventSumUpd.ReservOrdered          += inventSum.ReservOrdered;
            inventSumUpd.Registered             += inventSum.Registered;
            inventSumUpd.Picked                 += inventSum.Picked;
            inventSumUpd.OnOrder                += inventSum.OnOrder;
            inventSumUpd.Ordered                += inventSum.Ordered;
            inventSumUpd.Arrived                += inventSum.Arrived;
            inventSumUpd.QuotationReceipt       += inventSum.QuotationReceipt;
            inventSumUpd.QuotationIssue         += inventSum.QuotationIssue;
            inventSumUpd.AvailPhysical          += inventSum.AvailPhysical;
            inventSumUpd.AvailOrdered           += inventSum.AvailOrdered;
            inventSumUpd.PostedValueSecCur_RU   += inventSum.PostedValueSecCur_RU;
            inventSumUpd.PhysicalValueSecCur_RU += inventSum.PhysicalValueSecCur_RU;
            inventSumUpd.PhysicalInvent         += inventSum.PhysicalInvent;
            inventSumUpd.update();
        }
    }

    while select forupdate  inventSumUpd
    where inventSumUpd.ItemId == _toItemId
    {
        inventSumUpd.ItemId = "-1";
        inventSumUpd.doUpdate();
    }

    while select inventSum
    where inventSum.ItemId == _toItemId
    {
        info(inventSum.ItemId);
    }

    inventTable = InventTable::find(_toItemId, true);
    inventTable.ItemId = "-1";
    inventTable.doUpdate();

    update_recordset inventTableModule
    setting ItemId = "-1"
    where inventTableModule.ItemId == _toItemId;

    update_recordset inventItemLocation
    setting ItemId = "-1"
    where inventItemLocation.ItemId == _toItemId;

    delete_from inventTxt
    where inventTxt.ItemId == _toItemId;

    inventTable = InventTable::find(_fromItemId, true);
    inventTable.ItemId = _toItemId;
    inventTable.renamePrimaryKey();
    inventTable.doUpdate();

    inventTable = InventTable::find(_toItemId, true);
    inventTable.ItemId = "-2";
    inventTable.doUpdate();

    update_recordset inventTableModule
    setting ItemId = "-2"
    where inventTableModule.ItemId == _toItemId;

    update_recordset inventItemLocation
    setting ItemId = "-2"
    where inventItemLocation.ItemId == _toItemId;

    while select forupdate  inventSumUpd
    where inventSumUpd.ItemId == _toItemId
    {
        inventSumUpd.ItemId = "-2";
        inventSumUpd.doUpdate();
    }

    inventTable = InventTable::find("-1", true);
    inventTable.ItemId = _toItemId;
    inventTable.doUpdate();

    update_recordset inventTableModule
    setting ItemId = _toItemId
    where inventTableModule.ItemId == "-1";

    update_recordset inventItemLocation
    setting ItemId = _toItemId
    where inventItemLocation.ItemId == "-1";

    while select forupdate  inventSumUpd
    where inventSumUpd.ItemId == "-1"
    {
        inventSumUpd.ItemId = _toItemId;
        inventSumUpd.doUpdate();
    }

    inventTable = InventTable::find(_toItemId);

    inventTable = InventTable::find("-2", true);
    inventTable.delete();

    inventSumReCalcItem = new InventSumReCalcItem(_toItemId, false, CheckFix::Fix);
    inventSumReCalcItem.updateNow();

    ttscommit;
}
За это сообщение автора поблагодарили: fara21 (1).
Старый 23.09.2011, 09:31   #6  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Перекодировать можно.Правая кнопка мыши на коде номенклатуры в справочнике - Паспорт записи - переименовать.
А еще заглянуть вот сюда Производительность в Паспорте_записи
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
За это сообщение автора поблагодарили: fara21 (1).
Старый 23.09.2011, 09:39   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Переименование немного не то. Если вам необходимо не просто перекодировать один код в другой новый, а объеденить два уже существующих кода то тогда читайте про метод merge
За это сообщение автора поблагодарили: fara21 (1).
Старый 23.09.2011, 09:40   #8  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Коллеги, полагаю, что вопрос был не просто в смене кода артикула, но и в объединении нескольких артикулов в один
__________________
С уважением,
Вячеслав
Старый 23.09.2011, 14:39   #9  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от pitersky Посмотреть сообщение
Коллеги, полагаю, что вопрос был не просто в смене кода артикула, но и в объединении нескольких артикулов в один
Тогда можно зайти сюда Объединение номенклатур
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 23.09.2011, 14:02   #10  
mnt_dx is offline
mnt_dx
Участник
Axapta Retail User
Лучший по профессии 2014
 
1,747 / 188 (10) ++++++
Регистрация: 17.02.2011
Адрес: К Северу через Северо-Запад
Как вариант
1. Списать дублирующие номенклатуры и сделать приход "правильной".
либо
2. Провести инвентаризацию: указать 0 в дублирующей ном-ре и увеличить количество "правильной".
Старый 23.09.2011, 14:18   #11  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от mnt_dx Посмотреть сообщение
Как вариант
1. Списать дублирующие номенклатуры и сделать приход "правильной".
либо
2. Провести инвентаризацию: указать 0 в дублирующей ном-ре и увеличить количество "правильной".
еще надо подумать как в отчетах отразить, тк захотят увидить только одну "новую" номенклатуру и "ее" движения
Старый 23.09.2011, 14:40   #12  
ZornFire is offline
ZornFire
MS Dynamics AX 2012 R3
Аватар для ZornFire
Oracle
Злыдни
Ex AND Project
 
333 / 76 (3) ++++
Регистрация: 12.01.2009
Адрес: Москва
не проще сделать подснятие (читать как частичная инвентаризация) и далее работать с новой номенклатурой?
ведь переименовывать не правильно как то.
__________________
"Человек человеку волк, а зомби зомби зомби." (с)
С Уважением, Алексей Кабанов

Последний раз редактировалось ZornFire; 23.09.2011 в 14:55. Причина: пояснение слова подснятие
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Штрих код GBH DAX: Программирование 4 24.05.2011 14:36
Channel9: Peter Villadsen and Gustavo Plancarte: X++ to MSIL Blog bot DAX Blogs 30 24.08.2010 17:11
Код палеты Varmen DAX: Функционал 10 27.03.2008 15:54
Есть ли возможность вызывать код с вышележащих слоев ? FishLog DAX: Программирование 5 07.09.2004 17:24
Ошибка "необходимо заполнить 'основной код сотрудника' " alpin DAX: Функционал 2 04.12.2003 16:28

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

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

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