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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.10.2003, 14:54   #1  
Valia is offline
Valia
Участник
 
139 / 23 (1) +++
Регистрация: 09.07.2003
Адрес: там
? где найти информацию?
При разработке автоматической разноски строк складского журнала, возникла потребность в обращении к методам класса InventMovement, но что из себя представляет этот класс как он работает непонятно - слишком витиевато написано - отсюда возникла потребность найти хоть какое-то описание, чтобы по возможности отсеч как можно больше путей слепого поиска.

Подскажите пожалуйста, где можно подчерпнуть информации по этой тематике.

Заранее огромное спасибо
Старый 07.10.2003, 16:27   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Как и по всем остальным классам приложения, источников информации по InventMovement нет.

Если упрощать, то InventMovement - это класс, абстрагирующий все потенциальные источники складских проводок, как-то: строки заказов и закупок, строки складских журналов и т.д.

Помимо этого класс отвечает за разноску складских движений в ГК, т.е. абстрагирует контировку, типы проводок. Более того, методы updateLedger... эту самую разноску и выполняют. Немного нелогично, но уж как есть.
Старый 08.10.2003, 09:42   #3  
Valia is offline
Valia
Участник
 
139 / 23 (1) +++
Регистрация: 09.07.2003
Адрес: там
Таким образом решение поставленной задачи автоматической разноски я вижу следующим образом:

Фактически необходимо разработать класс, метод которого и будет и заниматься разноской, что-то типа этого

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  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
Фактически необходимо разработать класс, метод которого и будет и заниматься разноской, что-то типа этого
boolean createJournalLine()
Вы хотите в одном методе совместить создание строк, разноску журнала?
Учтите, что "2 в одном = бардак"!

У складского журнала есть свойство "Резервирование" (Reservation), которое приводит к автоматическому резервированию при выполнении
journalLine.insert() или jornalLine.update()
Естественно, что все поля у строки должны быть заполнены (в том числе и складские аналитики) перед этой операцией.

Если будет интересно, то в методах insert и update на InventJournalTrans можно посмотреть как использовать классы InventMovement и InventUpdate.
Старый 08.10.2003, 16:48   #5  
Valia is offline
Valia
Участник
 
139 / 23 (1) +++
Регистрация: 09.07.2003
Адрес: там
на самом деле все распихано в 3 метода и вопрос стоит не в этом как это красивее выглядит, а в том, что конкретно необходимо сделать, чтобы разноска состоялась.

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

Да еще невозможно информацию о складской аналитике вписать, не вписывается и все тут.

Может кто сталкивался с подобной задачей. какая-то большая путаница и в чем ошибка не понятно

Заранее огромное спасибо
Старый 08.10.2003, 17:50   #6  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
путаница
1. Какая версия Axapta?
2. Созданные классом журналы разносятся из формы?
3. Можете выложить весь код класса, а то по кускам мало что понятно.
Старый 09.10.2003, 10:46   #7  
Valia is offline
Valia
Участник
 
139 / 23 (1) +++
Регистрация: 09.07.2003
Адрес: там
ну так вот
Версия 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  
Valia is offline
Valia
Участник
 
139 / 23 (1) +++
Регистрация: 09.07.2003
Адрес: там
нужели никто не знает ответа на такой вот вопрос, неужели эта проблема не имет хоть какого - нибудь приемлемого решения.
Старый 09.10.2003, 18:28   #9  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
мда..
Примерно так
PHP код:
boolean createJournalLine(InventJournalId inventJournalIdItemId inventLineId
                          Weight weight
JournalTransDate _dateJournalTransTime time,
                          
VesId vesIdInventLocationId inventLocationIssue,
                          
wmsLocationId wmsLocationIssueInventLocationId inventLocationReceipt,
                          
wmsLocationId wmsLocationReceiptwmsPalletId wmsPalletId,EmplId MOLIssue,
                          
EmplId MOLReceiptEmplId controllerIdstr passwordIdInventBatchId inventBatchId,
                          
SchedToDate ProdDateSchedToTime ProdTimegodnostDate godnostinventGTDId_RU inventGTDId_RU)
{
    
InventJournalTrans  journalLine;

    
InventDim _inventDim;
    
InventDim inventDimIssue;
    
InventDim inventDimReceipt;
;

    
inventJournalTable InventJournalTable::find(inventJournalId);

    if(!
inventJournalTable)
    {
        
this.createJournalTable(inventJournalId);
        
inventJournalTable InventJournalTable::find(inventJournalId);
    }

    
// Скорее всего, ненужный кусок кода, но обратите на него внимание
    
if(inventJournalTable.Reservation != ItemReservation::Automatic)
    {
        
inventJournalTable.Reservation ItemReservation::Automatic;
        
inventJournalTable.update();
    }

    
journalLine.clear();

    
// Инициализируем строку журнала
    
journalLine.initFromInventJournalTable(inventJournalTable);
    
journalLine.initFromInventTable(InventTable::find(inventLineId));

    
journalLine.Qty weight;

    
journalLine.date_    _date;
    
journalLine.time_    time;
    
journalLine.vesId    vesId;
    
journalLine.ProdDate ProdDate;
    
journalLine.ProdTime ProdTIme;
    
journalLine.godnost  GodNost;

    
// далее для каждойсроки журнала ищутся или заводятся строки складской аналитики, для заноса информации о складе
    
_inventDim.clear();
    
_inventDim.InventLocationId inventLocationIssue;
    
_inventDim.WMSLocationId    wmsLocationIssue;
    
_inventDim.WMSPalletId      wmsPalletId;
    
_inventDim.InventBatchId    inventBatchId;
    
_inventDim.inventGTDId_RU   inventGTDId_RU;
    
inventDimIssue InventDim::findOrCreate(_inventDim);

    
_inventDim.InventLocationId inventLocationReceipt;
    
_inventDim.WMSLocationId    wmsLocationReceipt;
    
inventDimReceipt InventDim::findOrCreate(_inventDim);

    
journalLine.inventDimId   inventDimIssue.inventDimId;
    
journalLine.toInventDimId inventDimReceipt.inventDimId;

    
// а теперь создаем строку!!!
    
journalLine.insert();

    
// здесь поисходит вызов метода, который и осуществляет разноску
    // интересно, а ЗАЧЕМ сразу после создания строки разносится журнал???
    
this.sendToRaznoska();

    return 
true;

Оставил нарушения BP и негибкость в отношении складских аналитик, чтобы код можно было узнать
Ответьте все-таки на вопрос: ЗАЧЕМ сразу после создания строки разносится журнал???
Старый 10.10.2003, 11:12   #10  
Valia is offline
Valia
Участник
 
139 / 23 (1) +++
Регистрация: 09.07.2003
Адрес: там
Огромаднейшее спасибо, теперь понятно в чем была обшибочка.
Путаница возникла.

А на самом деле никакой сразу разноси не происходит, строка вида
this.sendToRaznoska();
была добавлено просто в качестве примера, каким возможным поведением должен был обладать класс

Еще раз огромное спасибо, очень даже приятно, когда есть с кем обсудить сложившуюся путаницу.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ALEG: Где можно найти информацию о планах и стратегии вендора? Blog bot DAX Blogs 0 22.11.2006 03:10
Где найти русскую Аксапту на попробовать? win311 DAX: Прочие вопросы 6 28.06.2005 15:02
Где Axapta 3.0 хранит лицензионную информацию? last DAX: Прочие вопросы 3 23.03.2005 12:50
Где что хранится? Kengo DAX: Программирование 10 11.11.2004 13:05
Где возможно найти документацию по SP3? NeveB DAX: Администрирование 10 24.09.2004 10:38

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

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

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