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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.03.2008, 14:40   #1  
Starling is offline
Starling
Участник
Дети Юза
 
530 / 76 (4) ++++
Регистрация: 20.10.2005
Адрес: Kiev
Не корректно сохраняет запись в inventTable
Ситуация следующая:
1. Пользователь создает новую запись в номенклатуре на основании шаблона (ну это не столь важно). При создании на закладке «Обзор» указывает код номенклатуры (остальные обязательные поля заполняются на основании шаблона)
2. После этого переходит на другую запись в форме «Номенклатура»
3. Возвращается на исходную запись, и меняет Название номенклатуры
4. Переходит на закладку «Цена/Скидка» меняет цены
5. Переходит на закладку «Прочее» указывает не важно что и сохраняет запись.
6. Все изменения полей в таблице inventTable, которые были выполнены после шага 3, слетают.
На сколько я понимаю для восстановления такой багги необходимо чтобы последовательно произошло следующее:
• Переход на другую запись в форме
• Возврат на исходную запись в форме
• Изменение полей таблицы inventTable
• Изменение полей таблицы inventTableModule
• Изменение полей таблицы inventTable
• Сохранение записи.

Кто смог победить такую ситуацию?

Ветку Очень просто: создать новую запись в таблицечитал, не помогло.
Старый 26.03.2008, 15:17   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
На Dynamics AX 2009 (build 5.0.547.0) не воспроизводится.
Если это баг, то его уже починили, что есть ГУД
Старый 26.03.2008, 15:22   #3  
kvan is offline
kvan
Moderator
Аватар для kvan
Дети Юза
 
775 / 49 (3) +
Регистрация: 07.08.2002
Адрес: Donetsk
Наблюдал нечто подобное в заказах.
Алгоритм примерно такой же был - изменение полей, переход на другую запись, возврат на исходную запись.
Специально воспроизвести не смог

P.S. DAX 4.0 SP2 EE
__________________
С уважением, kvan.
Старый 26.03.2008, 15:32   #4  
Starling is offline
Starling
Участник
Дети Юза
 
530 / 76 (4) ++++
Регистрация: 20.10.2005
Адрес: Kiev
Цитата:
Сообщение от kashperuk Посмотреть сообщение
На Dynamics AX 2009 (build 5.0.547.0) не воспроизводится.
Если это баг, то его уже починили, что есть ГУД
Хорошо вам там с Dynamics AX 2009

А у кого нибудь производиться на MSDAX 40?
Старый 28.03.2008, 18:14   #5  
Starling is offline
Starling
Участник
Дети Юза
 
530 / 76 (4) ++++
Регистрация: 20.10.2005
Адрес: Kiev
up.
Старый 28.03.2008, 18:51   #6  
xenikk is offline
xenikk
Axapta Retail User
Аватар для xenikk
Axapta Retail User
 
30 / 10 (1) +
Регистрация: 20.06.2007
Адрес: Moscow
Может есть триггер какой нить на форме или таблице который реагирует на изменение одних полей и влияет на всю запись?
В retaile (правда не знаю, свои делали или нет) есть такое, что когда меняешь Единицы измерения - слетают настройки НДС. Попробуйте в этом направлении
__________________
Романтик..
Старый 31.03.2008, 14:12   #7  
Starling is offline
Starling
Участник
Дети Юза
 
530 / 76 (4) ++++
Регистрация: 20.10.2005
Адрес: Kiev
Нашел я, то место в коде, которое приводит к возникновению ошибки.
Для начала, привожу более короткую цепоку действий, приводящую к ошибке:
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;
}
Дело в том, что update таблицы InventTableModule вызывается раньше update таблицы InventTable. Соответсвенно вызов:
X++:
//вот это приводит к ошибке -->
                if (formObjSet)
                {
                    formObjSet.refresh();
                    formObjSet.reread();
                }
//вот это приводит к ошибке <--
приводит к тому, что все изменения пользователя слетают.
Если просто закомментировать код, то ошибка исчезнет, но он там для чего-то был написан.

Кто, что может посоветовать?
Старый 31.03.2008, 14:43   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А попробуйте со след. содержанием метода 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;
}
метод updateAutoSalesPercent видимо сделали не статическим. Вот его код, на всякий случай:
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  
Starling is offline
Starling
Участник
Дети Юза
 
530 / 76 (4) ++++
Регистрация: 20.10.2005
Адрес: Kiev
Цитата:
Сообщение от kashperuk Посмотреть сообщение
А попробуйте со след. содержанием метода update()
Приведенный выше код, ситуацию исправляет.
Спасибо.
Теги
ax2009, ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Баг inventTable Eldar9x DAX: Программирование 23 20.01.2010 11:29
Спозиционироваться на запись Eldar9x DAX: Программирование 11 02.07.2007 18:03
Ошибка при импорте демоданных (Axapta 3.0 CIS SP1) KocDm DAX: Администрирование 2 11.08.2005 12:04
Программно записи в InventTable djoker DAX: Программирование 8 02.12.2004 16:59
Как Узнать из класса - Текущую выбранную запись в таблице djoker DAX: Программирование 1 01.12.2004 07:36
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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