23.07.2018, 09:27 | #1 |
Участник
|
Местоположение
Как массово прописать местоположение? Скажем, выгружаем остатки по центральному складу в Excel. Там же вручную прописываем местоположение по каждой номенклатуре. И дальше хочу массово прописать местоположение в Axapta-е. Через какую операцию можно сделать, например, есть Управление складами -> Перенос, т.е. программным путем, через Business Connector могу создать Журнал переноса и прописать местоположение по предварительному списку. Или есть другие варианты?
Прошу прощения, если вопрос неуместный. Заранее благодарю, за помощь! |
|
23.07.2018, 10:07 | #2 |
Участник
|
Не совсем понял вопрос, но возможно стоит написать джоб?
|
|
23.07.2018, 10:27 | #3 |
Участник
|
В принципе можно и через JOB. Вопрос в том, что в центральном складе создали топологию склада, разбили на ячейки, теперь в Axapta-е по каждой номенклатуре, где хранятся в центральном складе, надо присвоить номер или код местоположении, т.е. где складские аналитики (InventDim.wMSLocationId). Ясно выразился или нет
|
|
23.07.2018, 11:55 | #4 |
Участник
|
Нет, не ясно. По крайней мере мне не ясно, может быть, кто-то понятливее найдется.
|
|
23.07.2018, 17:50 | #5 |
Участник
|
можно прибить все остатки с "пустыми" локациями и тут же создать новые остатки с корректными через инвентаризацию.
__________________
Felix nihil admirari |
|
|
За это сообщение автора поблагодарили: EVGL (2). |
23.07.2018, 22:56 | #6 |
Участник
|
Инвентаризацией, с технической точки зрения, проблему решим - весь товар "по ячейкам", только вот себестоимости можно будет смело сказать "гуд бай".
Если точно известно где что лежит и не нужно пересчитывать все номенклатуры по ячейкам, то переносы вполне подходят, но правда разносить их придется за пределами рабочего времени, так как на время нужно будет менять некоторые параметры (например, делать ячейку непервичной аналитикой опасно - можно получить некоторые проблемы в дальнейшем, но если она будет сразу первичной, то её придется указывать в проводках, а у нас перенос из пустых ячеек, поэтому на время разноски нужно будет делать её непервичной, после разноски включить флаг первичности, при этом на время закомментировав проверку смены настроек аналитики). |
|
|
За это сообщение автора поблагодарили: wojzeh (1). |
23.07.2018, 23:38 | #7 |
Участник
|
__________________
Felix nihil admirari |
|
24.07.2018, 06:32 | #8 |
Участник
|
Ну мы, вряд ли, поймаем момент, когда для перехода на учет по местам хранения у нас закрыт склад, не будут больше корректировать себестоимости прихода задним числом и т.п.
Если такого момента нет, то последующее закрытие склада списания откорректирует, а приходы по инвентаризации останутся с указанной себестоимостью. |
|
24.07.2018, 08:46 | #9 |
Злыдни
|
1. Создать местоположение "Остаток";
2. Для всех InventDim в InventSum с остатками в таблице прописать в качестве аналитики местоположения "Остаток"; 3. Сгенерить журнал переноса с местоположения "Остаток" в конкретные ячейки; 4. Разнести перенос.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
24.07.2018, 08:53 | #10 |
Участник
|
Технически сделать инвентаризацию или перенос - одинаково сложно. При этом по идеологии системы и с точки зрения истории и себестоимости, конечно, нужно делать перенос.
Но останутся вопросы про то, как вы собираетесь использовать потом местоположение. Какая у вас версия системы? Местоположения только на ЦС сделали или на всех складах системы?
__________________
Ivanhoe as is.. |
|
|
За это сообщение автора поблагодарили: wojzeh (1). |
24.07.2018, 13:21 | #11 |
Злыдни
|
Если версия 12, то в модуле DIEF есть готовая болванка DMFInventJournalTargetEntity
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
24.07.2018, 14:43 | #12 |
Участник
|
Интересно. А местоположение одно для всей номенклатуры? без паллет? Т.е. одна номенклатура всегда в одной ячейке?
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат! |
|
24.07.2018, 15:48 | #13 |
Участник
|
Ну где-то так:
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; }
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат! |
|
26.07.2018, 11:05 | #14 |
Участник
|
Местоположения настраиваются только по ЦС
|
|
26.07.2018, 11:16 | #15 |
Участник
|
А какая версия системы? До AX 2012 R3 нельзя было включить местоположения только для одного склада. Для упомянутой версии тоже всё совсем не просто.
__________________
Ivanhoe as is.. |
|
26.07.2018, 11:26 | #16 |
Участник
|
Ну да, я вот тоже думаю. Для 2009 все равно на каждом складе придется делать хотя бы одну ячейку и прописывать все номенклатуры в нее. Иначе группа аналитик с активным местоположением не даст двигать(купить/продать) товар без указания ячеек.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат! |
|
26.07.2018, 11:29 | #17 |
Участник
|
Всем спасибо, за отклики!
Все-таки решил сделать через Управление запасами -> Перенос. Для этого: 1) Выгружаю остатки по центральному складу. Список номенклатур с остатками будет формироваться в Excel-е. 2) Затем кладовщик прописывает по каждой номенклатуре местоположение. Количество номенклатур ориентировочно будет около 4-х тысяч. 3) Отредактированный список номенклатур, обратно загружаю в Axapta. Для этого программно создаю журнал переноса и дальше разноска в стандартном режиме. Перед этим модифицируется существующие группы аналитики, т.к. требуется добавить аналитику Местоположение и дополнительно других параметров. Об этом тоже подробно напишу, т.к. сделано малой кровью... То есть для новых условий, не были созданы новые группы аналитики, а лишь модернизировали существующие группы аналитики. Результаты позже напишу... |
|
26.07.2018, 11:57 | #18 |
Участник
|
А пробовал создать тестовый журнал переноса. Хотя бы с одной строкой? И разнести его. Что-то есть такое подозрение, что без плясок с бубном не получится.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат! |
|
26.07.2018, 12:27 | #19 |
Участник
|
Создание Журнал переноса через 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 |
Участник
|
Создается, это понятно. Разносится? Остатки получаются в ячейке?
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат! |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Местоположение (InventDim.wMSLocationId) | 10 | |||
Ячейки = Местоположение? | 10 | |||
Site в складской аналитике. Как лучше перевести? | 73 | |||
ОС и местоположение | 1 |
|