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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.07.2018, 09:27   #1  
TalgatAb is offline
TalgatAb
Участник
 
18 / 11 (1) +
Регистрация: 31.01.2018
Местоположение
Как массово прописать местоположение? Скажем, выгружаем остатки по центральному складу в Excel. Там же вручную прописываем местоположение по каждой номенклатуре. И дальше хочу массово прописать местоположение в Axapta-е. Через какую операцию можно сделать, например, есть Управление складами -> Перенос, т.е. программным путем, через Business Connector могу создать Журнал переноса и прописать местоположение по предварительному списку. Или есть другие варианты?

Прошу прощения, если вопрос неуместный. Заранее благодарю, за помощь!
Старый 23.07.2018, 10:07   #2  
SCP_00 is offline
SCP_00
Участник
 
19 / 19 (1) ++
Регистрация: 24.04.2018
Не совсем понял вопрос, но возможно стоит написать джоб?
Старый 23.07.2018, 10:27   #3  
TalgatAb is offline
TalgatAb
Участник
 
18 / 11 (1) +
Регистрация: 31.01.2018
В принципе можно и через JOB. Вопрос в том, что в центральном складе создали топологию склада, разбили на ячейки, теперь в Axapta-е по каждой номенклатуре, где хранятся в центральном складе, надо присвоить номер или код местоположении, т.е. где складские аналитики (InventDim.wMSLocationId). Ясно выразился или нет
Старый 23.07.2018, 11:55   #4  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Нет, не ясно. По крайней мере мне не ясно, может быть, кто-то понятливее найдется.
Старый 23.07.2018, 17:50   #5  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
можно прибить все остатки с "пустыми" локациями и тут же создать новые остатки с корректными через инвентаризацию.
__________________
Felix nihil admirari
За это сообщение автора поблагодарили: EVGL (2).
Старый 23.07.2018, 22:56   #6  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Инвентаризацией, с технической точки зрения, проблему решим - весь товар "по ячейкам", только вот себестоимости можно будет смело сказать "гуд бай".
Если точно известно где что лежит и не нужно пересчитывать все номенклатуры по ячейкам, то переносы вполне подходят, но правда разносить их придется за пределами рабочего времени, так как на время нужно будет менять некоторые параметры (например, делать ячейку непервичной аналитикой опасно - можно получить некоторые проблемы в дальнейшем, но если она будет сразу первичной, то её придется указывать в проводках, а у нас перенос из пустых ячеек, поэтому на время разноски нужно будет делать её непервичной, после разноски включить флаг первичности, при этом на время закомментировав проверку смены настроек аналитики).
За это сообщение автора поблагодарили: wojzeh (1).
Старый 23.07.2018, 23:38   #7  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
погоди, а почему мы должны терять себестоимость? или мы о разных вещах говорим? (я не консалтер)

Нажмите на изображение для увеличения
Название: cost.png
Просмотров: 353
Размер:	78.3 Кб
ID:	11971
__________________
Felix nihil admirari
Старый 24.07.2018, 06:32   #8  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Ну мы, вряд ли, поймаем момент, когда для перехода на учет по местам хранения у нас закрыт склад, не будут больше корректировать себестоимости прихода задним числом и т.п.
Если такого момента нет, то последующее закрытие склада списания откорректирует, а приходы по инвентаризации останутся с указанной себестоимостью.
Старый 24.07.2018, 08:46   #9  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
1. Создать местоположение "Остаток";
2. Для всех InventDim в InventSum с остатками в таблице прописать в качестве аналитики местоположения "Остаток";
3. Сгенерить журнал переноса с местоположения "Остаток" в конкретные ячейки;
4. Разнести перенос.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 24.07.2018, 08:53   #10  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Технически сделать инвентаризацию или перенос - одинаково сложно. При этом по идеологии системы и с точки зрения истории и себестоимости, конечно, нужно делать перенос.

Но останутся вопросы про то, как вы собираетесь использовать потом местоположение. Какая у вас версия системы? Местоположения только на ЦС сделали или на всех складах системы?
__________________
Ivanhoe as is..
За это сообщение автора поблагодарили: wojzeh (1).
Старый 24.07.2018, 13:21   #11  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Технически сделать инвентаризацию или перенос - одинаково сложно. При этом по идеологии системы и с точки зрения истории и себестоимости, конечно, нужно делать перенос.
Если версия 12, то в модуле DIEF есть готовая болванка DMFInventJournalTargetEntity
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 24.07.2018, 14:43   #12  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
Интересно. А местоположение одно для всей номенклатуры? без паллет? Т.е. одна номенклатура всегда в одной ячейке?
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!
Старый 24.07.2018, 15:48   #13  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
Ну где-то так:
X++:
static void BAH029(Args _args)
{
    InventTrans         inventTrans;
    InventDim           inventDim;
    InventSum           inventSum;
    TmpPalletItemQty    tmpTable;

// считать ячейки для номенклатур из файла

    void importFromFile(FilenameOpen _fileName)
    {
        #avifiles
        #define.ItemIdCol(0)
        #define.WMSLocationIdCol(1)
        #define.FirstRow(1)   //подразумевается, что в табличке есть строка заголовка. Если нет, поставить 0

        CCADOConnection         cn          = new CCADOConnection();
        CCADOCommand            command     = new CCADOCommand();
        CCADORecordSet          recordSet   = new CCADORecordSet();
        ComExcelDocument_RU     comExcel;
        str                     sheetName;
        SysOperationProgress    progressFile;
        counter                 itemCount;
        ;

        comExcel  = new ComExcelDocument_RU();
        comExcel.open(_fileName, false);
        sheetName = comExcel.getActiveSheetName_AC();
        comExcel.closeDocument();
        comExcel.finalize();

        cn.open(strfmt('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%1;Extended Properties="Excel 12.0;HDR=YES;IMEX=1";', _fileName));
        command.activeConnection(cn);

        command.commandText(strfmt('SELECT count(*) FROM [%1$]', sheetName));
        recordSet   = command.execute();

        progressFile = SysOperationProgress::newGeneral(#aviUpdate,
                    strfmt("Импорт данных из файла %1", _fileName),
                    recordSet.fields().itemIdx(0).value());
        command.commandText(strfmt('SELECT * FROM [%1$]', sheetName));
        recordSet   = command.execute();

        ttsbegin;

        while (!recordSet.EOF())
        {
            progressFile.incCount();
            itemCount++;
            if (itemCount >= #FirstRow)
            {
                tmpTable.clear();
                tmpTable.ItemId           = recordSet.fields().itemIdx(#ItemIdCol).value();
                tmpTable.WMSLocationId    = recordSet.fields().itemIdx(#WMSLocationIdCol).value();
                tmpTable.insert();
                
                progressFile.setText(strfmt("Код %1", tmpTable.ItemId));
            }
            recordSet.moveNext_AC();
        }

        ttscommit;

        cn.close();

        progressFile.kill();

        info(strfmt("Импорт файла завершен. Обработано строк: %1", itemCount));

    }

    importFromFile("D:\\номенклатуры.xlsx");

    ttsbegin;
    while select inventSum
        where inventSum.PhysicalInvent
            && inventSum.ItemId == "Ставка за обработку"    //тест для одной номенклатуры
    {
        while select forupdate inventTrans
            where inventSum.ItemId      == inventTrans.ItemId   &&
                  inventSum.InventDimId == inventTrans.inventDimId
        {
            select firstonly tmpTable
                    where   tmpTable.ItemId         == inventTrans.ItemId;
            if (tmpTable)                   //если номенклатуры не было в файле, то ничего не меняем.
            {
                inventDim = InventDim::find(inventTrans.inventDimId);
                inventDim.wMSLocationId = tmpTable.WMSLocationId;    //считанная из файла ячейка для данной номенклатуры
                inventDim = InventDim::findOrCreate(InventDim);
                inventTrans.inventDimId = inventDim.inventDimId;
                inventTrans.update();       // по умолчанию dropInventOnHand= NoYes::No, значит пересчитает InventSum и нам ее пересчитывать не нужно
            }
        }
    }
    ttscommit;
}
там есть методы с суффиксом _AC, это кажись какие-то наши доработки. Ну не суть, думаю, что считать данные из файла сами сможете.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!
Старый 26.07.2018, 11:05   #14  
TalgatAb is offline
TalgatAb
Участник
 
18 / 11 (1) +
Регистрация: 31.01.2018
Местоположения настраиваются только по ЦС
Старый 26.07.2018, 11:16   #15  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от TalgatAb Посмотреть сообщение
Местоположения настраиваются только по ЦС
А какая версия системы? До AX 2012 R3 нельзя было включить местоположения только для одного склада. Для упомянутой версии тоже всё совсем не просто.
__________________
Ivanhoe as is..
Старый 26.07.2018, 11:26   #16  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
Ну да, я вот тоже думаю. Для 2009 все равно на каждом складе придется делать хотя бы одну ячейку и прописывать все номенклатуры в нее. Иначе группа аналитик с активным местоположением не даст двигать(купить/продать) товар без указания ячеек.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!
Старый 26.07.2018, 11:29   #17  
TalgatAb is offline
TalgatAb
Участник
 
18 / 11 (1) +
Регистрация: 31.01.2018
Post
Всем спасибо, за отклики!

Все-таки решил сделать через Управление запасами -> Перенос. Для этого:

1) Выгружаю остатки по центральному складу. Список номенклатур с остатками будет формироваться в Excel-е.
2) Затем кладовщик прописывает по каждой номенклатуре местоположение. Количество номенклатур ориентировочно будет около 4-х тысяч.
3) Отредактированный список номенклатур, обратно загружаю в Axapta. Для этого программно создаю журнал переноса и дальше разноска в стандартном режиме.

Перед этим модифицируется существующие группы аналитики, т.к. требуется добавить аналитику Местоположение и дополнительно других параметров. Об этом тоже подробно напишу, т.к. сделано малой кровью... То есть для новых условий, не были созданы новые группы аналитики, а лишь модернизировали существующие группы аналитики.

Результаты позже напишу...
Старый 26.07.2018, 11:57   #18  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
А пробовал создать тестовый журнал переноса. Хотя бы с одной строкой? И разнести его. Что-то есть такое подозрение, что без плясок с бубном не получится.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!
Старый 26.07.2018, 12:27   #19  
TalgatAb is offline
TalgatAb
Участник
 
18 / 11 (1) +
Регистрация: 31.01.2018
Создание Журнал переноса через Business Connector

Код:
                                 // Запуск специального класса для формирования журнала перемещения, в данном случае класс называется "ALA_CreateTransferJournal"
                                 using (bc.AxaptaObject axClass = ax.CreateAxaptaObject("ALA_CreateTransferJournal", con))
                                 {
                                    // Запускаем метод класса "CoCreate"
                                    object axJournalId = axClass.Call("CoCreate");
                                    // Проверяем возвратное значение метода. При успешной создании, метод возвращает номер журнала
                                    // Если значение не пустое, то обновляем локальную базу веб приложения
                                    if (axJournalId != null && axJournalId.ToString().Length > 0)
                                    {
                                       using (var cmd = cnn.CreateCommand())
                                       {
                                          cmd.CommandType = CommandType.Text;
                                          cmd.CommandText = "UPDATE dbo.InventJournalTable SET axJournalId = @axJournalId, axDescription = @axDescription ";
                                          cmd.CommandText += "WHERE (JournalId = @JournalId)";
                                          cmd.Parameters.Add("@axJournalId", SqlDbType.NVarChar, 20).Value = axJournalId;
                                          cmd.Parameters.Add("@axDescription", SqlDbType.NVarChar, 200).Value = axDescription;
                                          cmd.Parameters.Add("@JournalId", SqlDbType.Int).Value = journalId;
                                          cmd.ExecuteNonQuery();
                                          result = string.Format("1 Журнал: {0} {1}", axJournalId, axDescription);
                                       }
                                    }
                                 }
                              }
                              // Закрываем соединение
                              ax.Logoff();
X++:
public JournalId CoCreate()
{
    InventJournalTrans  inventJournalTrans;
    NumberSeq           numberSeq;
    // ----------------------
    InventLocationId    inventLocationIdFrom, inventLocationIdTo;
    ALA_InventPIC       inventPicFrom, inventPicTo;
    ItemId              itemId;
    Qty                 qty;

    InventDimGroupId    dimGroupId;
    InventJournalId     axJournalId;
    JournalNumOfLines   numOfLines = 0;
    str                 dimension1, dimension2, dimension5, dimension3, dimension7;

    str 100             userName;
    str 1000            sLine;

    List                hList = new List(Types::String);
    List                list = new List(Types::String);
    ListIterator        iterator, itemIterator;
    Container           packedList, itemList;

    int                 i;
    ;

    if (conLen(con) > 0)
    {
        ttsBegin;

        sLine = conPeek(con, 1);
        hList = Global::strSplit(sLine, '|');
        if (hList.elements() > 0)
        {
            iterator = new ListIterator(hList);
            while (iterator.more())
            {
                packedList += iterator.value();
                iterator.next();
            }

            transDate = str2date(conPeek(packedList, 1), 213);
            inventLocationIdFrom = conPeek(packedList, 2);
            inventPicFrom = conPeek(packedList, 3);
            inventLocationIdTo = conPeek(packedList, 4);
            inventPicTo = conPeek(packedList, 5);
            userName = conPeek(packedList, 6);
            dimension2 = conPeek(packedList, 7);
            dimension1 = conPeek(packedList, 8);
            dimension5 = conPeek(packedList, 9);
            dimension3 = conPeek(packedList, 10);
            dimension7 = conPeek(packedList, 11);
            axJournalId = conPeek(packedList, 12);

            // проверка на повторный запуск
            if (axJournalId)
            {
                if (InventJournalTable::find(axJournalId).RecId)
                  return "";
            }

            inventJournalTable.clear();
            numberSeq = new NumberSeq();
            numberSeq = NumberSeq::newGetNum(InventParameters::numRefInventJournalId());

            // ** Init value InventJournalTable
            inventJournalTable.initValue();
            inventJournalTable.JournalId = numberSeq.num();
            inventJournalTable.JournalNameId = "Перенос";
            inventJournalTable.TPF_Dimension[1] = dimension1;
            inventJournalTable.TPF_Dimension[2] = dimension2;
            inventJournalTable.TPF_Dimension[5] = dimension5;
            inventJournalTable.TPF_Dimension[3] = dimension3;
            inventJournalTable.TPF_Dimension[7] = dimension7;
            inventJournalTable.initFromInventJournalName(InventJournalName::find(InventParameters::find().TransferJournalNameId));
            inventJournalTable.Description = strFmt("%1 => %2, МОЛ-(%3) от %4", inventLocationIdFrom,
               inventLocationIdTo, inventPicTo, transDate);
            inventJournalTable.SystemBlocked = true;
            inventJournalTable.insert();

            journalId = inventJournalTable.JournalId;

            for (i = 2; i <= conLen(con); i += 1)
            {
               sLine = conPeek(con, i);
               list = Global::strSplit(sLine, '|');
               if (list.elements() > 0)
               {
                   itemIterator = new ListIterator(list);
                   while (itemIterator.more())
                   {
                       itemList += itemIterator.value();
                       itemIterator.next();
                   }
                   itemId = conPeek(itemList, 1);
                   qty    = str2num(conPeek(itemList, 2));

                   dimGroupId = InventTable::find(itemId).DimGroupId;
                   if (ALA_DimGroupId::find(dimGroupId).DimGroupId)
                   {
                       if (ALA_DimGroupId::find(dimGroupId).AnalyticsType == ALA_GroupAnalytics::NewAnalytics)
                          this.CreateInventJournalTrans(journalId, transDate, inventLocationIdFrom, inventLocationIdTo, inventPicTo, itemId, qty, dimension1, dimension2, dimension5, dimension3, dimension7, inventJournalTable);
                       else
                          this.CreateOldInventJournalTrans(journalId, transDate, inventLocationIdFrom, inventLocationIdTo, inventPicTo, itemId, qty, inventJournalTable);
                   } else
                   {
                       this.CreateOldInventJournalTrans(journalId, transDate, inventLocationIdFrom, inventLocationIdTo, inventPicTo, itemId, qty, inventJournalTable);
                   }

                   itemList = conDel(itemList, 1, conLen(itemList));
               }
            }

            inventJournalTable.SystemBlocked = false;
            inventJournalTable.update();

            select count(RecId) from inventJournalTrans where inventJournalTrans.JournalId == journalId;
            numOfLines = str2int(int642str(inventJournalTrans.RecId));
            inventJournalTable.NumOfLines = numOfLines;
            inventJournalTable.update();
        }

        ttsCommit;
    }

    return journalId;
}
Создается без проблем...
Старый 26.07.2018, 12:30   #20  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
Создается, это понятно. Разносится? Остатки получаются в ячейке?
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Местоположение (InventDim.wMSLocationId) TalgatAb DAX: Программирование 10 05.02.2018 09:44
Ячейки = Местоположение? IntoTheRain DAX: Функционал 10 14.03.2010 00:00
Site в складской аналитике. Как лучше перевести? mazzy DAX: Прочие вопросы 73 07.01.2008 12:18
ОС и местоположение Swetik DAX: Функционал 1 09.04.2004 14:24

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

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

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