07.10.2003, 14:54 | #1 |
Участник
|
где найти информацию?
При разработке автоматической разноски строк складского журнала, возникла потребность в обращении к методам класса InventMovement, но что из себя представляет этот класс как он работает непонятно - слишком витиевато написано - отсюда возникла потребность найти хоть какое-то описание, чтобы по возможности отсеч как можно больше путей слепого поиска.
Подскажите пожалуйста, где можно подчерпнуть информации по этой тематике. Заранее огромное спасибо |
|
07.10.2003, 16:27 | #2 |
Banned
|
Как и по всем остальным классам приложения, источников информации по InventMovement нет.
Если упрощать, то InventMovement - это класс, абстрагирующий все потенциальные источники складских проводок, как-то: строки заказов и закупок, строки складских журналов и т.д. Помимо этого класс отвечает за разноску складских движений в ГК, т.е. абстрагирует контировку, типы проводок. Более того, методы updateLedger... эту самую разноску и выполняют. Немного нелогично, но уж как есть. |
|
08.10.2003, 09:42 | #3 |
Участник
|
Таким образом решение поставленной задачи автоматической разноски я вижу следующим образом:
Фактически необходимо разработать класс, метод которого и будет и заниматься разноской, что-то типа этого boolean createJournalLine() { InventJournalTrans journalLine; InventDim _inventDim; InventDim inventDimIssue; InventDim inventDimReceipt; ..... InventMovement _movement; InventJournalCheckPost journalCheckPost; ; inventJournalTable = InventJournalTable::find(inventJournalId);// ищется соответствующий журнал, если нет то заводится if(!inventJournalTable) { this.createJournalTable(inventJournalId); inventJournalTable = InventJournalTable::find(inventJournalId); } journalLine.initFromInventJournalTable(inventJournalTable); journalLine.journalType= InventJournalType::Transfer; _movement = InventMovement::construct(journalLine); // теперь бы неплохо создать экземпляр класса InventMovement // а вот дальше начинается самой интересное - кикае методы использовать, чтобы наконецто зарезервировать, то ли этот InventMovement::setAutoReserving(journalLine); ... // то ли еще какой, journalLine.inventDimId = InventDim::findOrCreate(inventDimIssue).inventDimId; journalLine.toInventDimId = InventDim::findOrCreate(inventDimReceipt).inventDimId; journalLine.initValue(); journalLine.write(); if (journalLine.inventDimId != inventDimIssue.inventDimId) { inventDimIssue.data(InventDim::find(journalLine.inventDimId)); inventDimIssue.write(); } if (journalLine.toInventDimId != inventDimReceipt.inventDimId) { inventDimReceipt.data(InventDim::find(journalLine.toInventDimId)); inventDimReceipt.write(); } // после всего етого необходимо разнести journalCheckPost = InventJournalCheckPost::construct(); journalCheckPost.getLast(); journalCheckPost.parmPost(NoYes::Yes); journalCheckPost.parmJournalNum(inventJournalTable.JournalId); //journalId journalCheckPost.parmVoucher(''); journalCheckPost.parmComplete(NoYes::Yes); journalCheckPost.parmJournalCheckPostType(JournalCheckPostType::Post); journalCheckPost.parmJournalCheckPostDialog(JournalCheckPostDialog::Invent); journalCheckPost.run(); journalCheckPost.jobStatistics(); // ну и посмотреть на результаты работы return true; } таким образом остается непонятным как осуществляется резервирование и какие используются методы А может быть предложенный вариант не совсем оптимелен. Подскажите пожалуйста, выскажите свои мысли по етому поводу. Заранее огромное спасибо |
|
08.10.2003, 12:22 | #4 |
----------------
|
Цитата:
Фактически необходимо разработать класс, метод которого и будет и заниматься разноской, что-то типа этого
boolean createJournalLine() Учтите, что "2 в одном = бардак"! У складского журнала есть свойство "Резервирование" (Reservation), которое приводит к автоматическому резервированию при выполнении journalLine.insert() или jornalLine.update() Естественно, что все поля у строки должны быть заполнены (в том числе и складские аналитики) перед этой операцией. Если будет интересно, то в методах insert и update на InventJournalTrans можно посмотреть как использовать классы InventMovement и InventUpdate. |
|
08.10.2003, 16:48 | #5 |
Участник
|
на самом деле все распихано в 3 метода и вопрос стоит не в этом как это красивее выглядит, а в том, что конкретно необходимо сделать, чтобы разноска состоялась.
При данном положении вещей, разноски не происходит. Выдается сообщение об ошибке, что как будто незарезервировано необходимое количество товара, хотя если сделать тоже самое, но при помощи соотвествующей формы, т.е. в ручную, то все получается нормально. Вывод, не происходит программого резервирования. Как это сделать непонятно. Подскажите пожалуйста как это сделать программно. Да еще невозможно информацию о складской аналитике вписать, не вписывается и все тут. Может кто сталкивался с подобной задачей. какая-то большая путаница и в чем ошибка не понятно Заранее огромное спасибо |
|
08.10.2003, 17:50 | #6 |
----------------
|
путаница
1. Какая версия Axapta?
2. Созданные классом журналы разносятся из формы? 3. Можете выложить весь код класса, а то по кускам мало что понятно. |
|
09.10.2003, 10:46 | #7 |
Участник
|
ну так вот
Версия Axapt'ы - 2.5 теперь про разноски Сначала приведу листинги методов Допустим исходная информация хранится в некоторой таблице а ЕЕ необходимо поместить в соответствующие поля табличек, участвующих в формировании складского журнала и разнести полученные журналы. (разнести - предполагает выполнение таких же дейстий как и при нажатии на кноку разнести на соответствующих кнопках при ручном формировании строк журнала) // назначение этого метода лежит в формировании строк исходной таблицы а, он работает и поэтому останавливаться на нем нет никакого смысла void zagruzkaAll() { OdbcConnection C; Statement S; ResultSet R; a TableA; LoginProperty LP = new LoginProperty(); ; LP.setDSN("a"); C = new OdbcConnection(LP); S = C.createStatement(); R = S.executeQuery ('SELECT * FROM b'); while (R.next()) { TableA.inventJournalId = R.getString(1); TableA.inventLineId = R.getString(2); TableA.weight = R.getReal(3); TableA.date_ = R.getDate(4); // TableA.time = R.getInt(5); TableA.vesId = R.getInt(6); TableA.inventLocationIssue = R.getString(7); TableA.wmsLocationIssue = R.getString(8); TableA.inventLocationReceipt = R.getString(9); TableA.wmsLocationReceipt = R.getString(10); TableA.wmsPalletId = R.getString(11); TableA.MOLIssue = R.getString(12); TableA.MOLReceipt = R.getString(13); TableA.controllerId = R.getString(14); TableA.passwordId = R.getString(15); TableA.inventBatchId = R.getString(16); TableA.prodDate = R.getDate(17); TableA.godnost = R.getDate(19); TableA.inventGTDID_RU = R.getString(20); TableA.posted = R.getBoolean(21); TableA.insert(); } } // основное назначение этого метода - формирование по каждой строке исходной таблицы соответстующих строк складского журнала void raznoska() { a TableA; ; while select forUpdate TableA where TableA.posted == 0 { this.createJournalLine( TableA.inventJournalId, TableA.inventLineId, TableA.weight, TableA.date_, TableA.time, TableA.vesId, TableA.inventLocationIssue, TableA.wmsLocationIssue, TableA.inventLocationReceipt, TableA.wmsLocationReceipt, TableA.wmsPalletId, TableA.MOLIssue, TableA.MOLReceipt, TableA.controllerId, TableA.passwordId, TableA.inventBatchId, TableA.prodDate, TableA.prodTime, TableA.godnost, TableA.inventGTDID_RU); TableA.posted = 1; TableA.update(); } } // в этом методе иедт непосредственное формирование строки сладского журнала boolean createJournalLine(InventJournalId inventJournalId, str 20 inventLineId, Weight weight, JournalTransDate _date, JournalTransTime time, VesId vesId, InventLocationId inventLocationIssue, wmsLocationId wmsLocationIssue, InventLocationId inventLocationReceipt, wmsLocationId wmsLocationReceipt, wmsPalletId wmsPalletId,EmplId MOLIssue, EmplId MOLReceipt, EmplId controllerId, str passwordId, InventBatchId inventBatchId, SchedToDate ProdDate, SchedToTime ProdTime, godnostDate godnost, inventGTDId_RU inventGTDId_RU) { InventJournalTrans journalLine; InventDim _inventDim; InventDim inventDimIssue; InventDim inventDimReceipt; InventMovement _movement; InventJournalCheckPost journalCheckPost; ; inventJournalTable = InventJournalTable::find(inventJournalId); // здесь на основании исходных данных таблицы а ищется необходимый журнал, если он не найден, тогда от создается новым, как формируется его inventJournalId - не принципиально, главное, что это работает и ошибки здесь нет if(!inventJournalTable) { this.createJournalTable(inventJournalId); inventJournalTable = InventJournalTable::find(inventJournalId); } journalLine.initFromInventJournalTable(inventJournalTable); journalLine.journalType= InventJournalType::Transfer; _movement = InventMovement::construct(journalLine); // ниже производится заполнение полей строки журнала, за учета этой информации в таблицу InventJournalTrans добавлены некоторые поля journalLine.ItemId = inventLineId; journalLine.Qty = weight; journalLine.date_ = _date; journalLine.time_ = time; journalLine.vesId = vesId; journalLine.ProdDate = ProdDate; journalLine.ProdTime = ProdTIme; journalLine.godnost = godnost; //----------------------------------------------------------------------------------- // что делается этой строкой - до конца непонятно и очень хотелось бы знать вообще нужна она или нет InventMovement::setAutoReserving(journalLine); // далее для каждойсроки журнала ищутся или заводятся строки складской аналитики, для заноса информации о складе journalLine.inventDimId = InventDim::findOrCreate(inventDimIssue).inventDimId; journalLine.toInventDimId = InventDim::findOrCreate(inventDimReceipt).inventDimId; journalLine.initValue(); journalLine.write(); inventDimIssue.InventLocationId = 'Zakup';//inventLocationIssue; // для примера вводится название склада, которое в конечном счете почему то не отображается на форме - тоже еще один интересный вопрос // inventDimIssue.inventDimId = journalLine.InventDimId; inventDimIssue.write(); if (journalLine.inventDimId != inventDimIssue.inventDimId) { inventDimIssue.data(InventDim::find(journalLine.inventDimId)); inventDimIssue.write(); } if (journalLine.toInventDimId != inventDimReceipt.inventDimId) { inventDimReceipt.data(InventDim::find(journalLine.toInventDimId)); inventDimReceipt.write(); } inventDimIssue.update(); inventDimReceipt.update(true); // здесь поисходит вызов метода, который и осуществляет разноску this.sendToRaznoska(); return true; } // данный метод разносит сформированную строку, он работает нормально - это подтверждают проведенные тесты этого метода - если сформировать в ручную строку, а потом вызвать данный метод, то он нормально все разнесет, но если это попытаться сделать автоматически, то разноски не произойдет даже в том злучае, если это сделать вручную void sendToRaznoska() { InventJournalCheckPost journalCheckPost; ; journalCheckPost = InventJournalCheckPost::construct(); journalCheckPost.getLast(); journalCheckPost.parmPost(NoYes::Yes); //yes journalCheckPost.parmJournalNum(inventJournalTable.JournalId); //journalId journalCheckPost.parmVoucher(''); //'' journalCheckPost.parmComplete(NoYes::Yes); //yes journalCheckPost.parmJournalCheckPostType(JournalCheckPostType::Post); journalCheckPost.parmJournalCheckPostDialog(JournalCheckPostDialog::Invent); journalCheckPost.run(); journalCheckPost.jobStatistics(); } Таким образом можно подвести итог: разноска производится автоматически правильно сформированного журнала (т.е. строк сформированных не этим классом), при формировании строки журнала не выполняются какие-то действия, который по всему видимому должны выполняться внешними классами (предположительно классом InventMovement)? по мимо того что не происходит формирования строк журнала, информация о складской аналитике также не заносится. Как это сделать правильно и что как использовать другие классы, - вот на эти вопросы очень бы хотелось получить советы. Подскажите пожалуйста. Заранее огромное спасибо |
|
09.10.2003, 17:12 | #8 |
Участник
|
нужели никто не знает ответа на такой вот вопрос, неужели эта проблема не имет хоть какого - нибудь приемлемого решения.
|
|
09.10.2003, 18:28 | #9 |
----------------
|
мда..
Примерно так
PHP код:
Ответьте все-таки на вопрос: ЗАЧЕМ сразу после создания строки разносится журнал??? |
|
10.10.2003, 11:12 | #10 |
Участник
|
Огромаднейшее спасибо, теперь понятно в чем была обшибочка.
Путаница возникла. А на самом деле никакой сразу разноси не происходит, строка вида this.sendToRaznoska(); была добавлено просто в качестве примера, каким возможным поведением должен был обладать класс Еще раз огромное спасибо, очень даже приятно, когда есть с кем обсудить сложившуюся путаницу. |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|