|
26.03.2008, 14:40 | #1 |
Участник
|
Не корректно сохраняет запись в inventTable
Ситуация следующая:
1. Пользователь создает новую запись в номенклатуре на основании шаблона (ну это не столь важно). При создании на закладке «Обзор» указывает код номенклатуры (остальные обязательные поля заполняются на основании шаблона) 2. После этого переходит на другую запись в форме «Номенклатура» 3. Возвращается на исходную запись, и меняет Название номенклатуры 4. Переходит на закладку «Цена/Скидка» меняет цены 5. Переходит на закладку «Прочее» указывает не важно что и сохраняет запись. 6. Все изменения полей в таблице inventTable, которые были выполнены после шага 3, слетают. На сколько я понимаю для восстановления такой багги необходимо чтобы последовательно произошло следующее: • Переход на другую запись в форме • Возврат на исходную запись в форме • Изменение полей таблицы inventTable • Изменение полей таблицы inventTableModule • Изменение полей таблицы inventTable • Сохранение записи. Кто смог победить такую ситуацию? Ветку Очень просто: создать новую запись в таблицечитал, не помогло. |
|
26.03.2008, 15:17 | #2 |
Участник
|
На Dynamics AX 2009 (build 5.0.547.0) не воспроизводится.
Если это баг, то его уже починили, что есть ГУД |
|
26.03.2008, 15:32 | #3 |
Участник
|
|
|
26.03.2008, 15:22 | #4 |
Moderator
|
Наблюдал нечто подобное в заказах.
Алгоритм примерно такой же был - изменение полей, переход на другую запись, возврат на исходную запись. Специально воспроизвести не смог P.S. DAX 4.0 SP2 EE
__________________
С уважением, kvan. |
|
28.03.2008, 18:14 | #5 |
Участник
|
up.
|
|
28.03.2008, 18:51 | #6 |
Axapta Retail User
|
Может есть триггер какой нить на форме или таблице который реагирует на изменение одних полей и влияет на всю запись?
В retaile (правда не знаю, свои делали или нет) есть такое, что когда меняешь Единицы измерения - слетают настройки НДС. Попробуйте в этом направлении
__________________
Романтик.. |
|
31.03.2008, 14:12 | #7 |
Участник
|
Нашел я, то место в коде, которое приводит к возникновению ошибки.
Для начала, привожу более короткую цепоку действий, приводящую к ошибке: 1. Создаем новую номенклатуру, заполняем все обязательные поля 2. Сохраняем запись (это обязательно) 3. Меняем какие либо поля, относящиеся к таблице InventTable 4. Переходим на закладку Цена/Скидка и меняем цену в группе полей «Заказ на продажу» 5. Сохраняем запись – все изменения, сделанные на шаге 3, будут потеряны Ошибка кроется в методе update таблицы InventTableModule. X++: void update(boolean _updatePriceDate = true) { boolean updPrice; FormRun formRun; FormObjectSet formObjSet; int i; if (this.orig().Price != this.Price || this.orig().Markup != this.Markup || this.orig().PriceUnit != this.PriceUnit) { updPrice = true; if (_updatePriceDate) this.PriceDate = systemdateget(); } ttsbegin; super(); if (updPrice) { if (this.ModuleType != ModuleInventPurchSales::Sales) InventTable::updateAutoSalesPrice(this.ItemId, this.PriceDate); else { if (this.isFormDataSource()) { InventTable::updateAutoSalesPercent(this.ItemId); // refresh and reread inventTable datasource if exists in form formRun = this.dataSource().formRun(); for (i=1; i<= formRun.dataSourceCount(); i++) { if (formRun.dataSource(i).cursor().TableId == tablenum(InventTable)) { formObjSet = formRun.dataSource(i); break; } } //вот это приводит к ошибке --> if (formObjSet) { formObjSet.refresh(); formObjSet.reread(); } //вот это приводит к ошибке <-- } } } ttscommit; } X++: //вот это приводит к ошибке --> if (formObjSet) { formObjSet.refresh(); formObjSet.reread(); } //вот это приводит к ошибке <-- Если просто закомментировать код, то ошибка исчезнет, но он там для чего-то был написан. Кто, что может посоветовать? |
|
31.03.2008, 14:43 | #8 |
Участник
|
А попробуйте со след. содержанием метода update()
X++: void update(boolean _updatePriceDate = true) { boolean updPrice; FormRun formRun; FormObjectSet formObjSet; int i; InventTable inventTable; if (this.orig().Price != this.Price || this.orig().Markup != this.Markup || this.orig().PriceUnit != this.PriceUnit) { updPrice = true; if (_updatePriceDate) this.PriceDate = systemdateget(); } ttsbegin; super(); if (updPrice) { if (this.ModuleType != ModuleInventPurchSales::Sales) InventTable::updateAutoSalesPrice(this.ItemId, this.PriceDate); else { if (this.isFormDataSource()) { // refresh and reread inventTable datasource if exists in form formRun = this.dataSource().formRun(); for (i=1; i<= formRun.dataSourceCount(); i++) { if (formRun.dataSource(i).cursor().TableId == tablenum(InventTable)) { formObjSet = formRun.dataSource(i); inventTable = formObjSet.cursor(); break; } } if (!inventTable) { inventTable = InventTable::find(this.ItemId, true); } if (inventTable) { if (inventTable.updateAutoSalesPercent() && formObjSet) { formObjSet.refresh(); formObjSet.reread(); } } } } } ttscommit; } X++: server boolean updateAutoSalesPercent() { InventTableModule inventTableSales; InventTableModule inventTableBasic; ; if (this.SalesModel == SalesPriceModel::None) return false; inventTableSales = InventTableModule::find(this.ItemId,ModuleInventPurchSales::Sales,true); if (this.SalesPriceModelBasic == SalesPriceModelBasic::PurchPrice) inventTableBasic = InventTableModule::find(this.ItemId,ModuleInventPurchSales::Purch); else inventTableBasic = InventTableModule::find(this.ItemId,ModuleInventPurchSales::Invent); if (! inventTableSales || ! inventTableBasic) return false; switch(this.SalesModel) { case SalesPriceModel::Contributionratio: if (inventTableSales.pcsPrice()) { this.SalesContributionRatio = (inventTableSales.pcsPrice() - inventTableBasic.pcsPrice()) * 100 / inventTableSales.pcsPrice(); } break; case SalesPriceModel::PercentMarkup: if (inventTableBasic.pcsPrice()) { this.SalesPercentMarkup = (inventTableSales.pcsPrice() - inventTableBasic.pcsPrice()) * 100 / inventTableBasic.pcsPrice(); } break; default: } this.update(); return true; } |
|
|
За это сообщение автора поблагодарили: Starling (1). |
31.03.2008, 15:30 | #9 |
Участник
|
|
|