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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.12.2004, 15:43   #1  
kostas is offline
kostas
Участник
 
28 / 10 (1) +
Регистрация: 27.01.2004
Адрес: Владимир
! Транзакции, опять различия в 2-х и 3-хзвенках
Всем, добрый день!

Задача:
На основе имеющегося в SalesTable заказа с типом «Журнал» необходимо создать собственно заказы. Имеем класс extends RunBase, в нем метод run, который и привожу.
На обработку по переменным _days, td, DateBegin и DateEnd не обращайте внимания, суть не в этом.
Проблема:
Алгоритм проходит на ура в 2-хзвенке. В 3-хзвенке тоже, если обрабатываемые «журналы» содержат одну строку, т.е. одну запись в SalesLine, и ОДНУ И ТУ ЖЕ НОМЕНКЛАТУРУ. Но если в «журнале» две и более строки или в следующем журнале ДРУГАЯ НОМЕНКЛАТУРА, то Аксапта выдает ошибку:
«Идентификатор номенклатуры не может быть заменен при наличии складских проводок
Модификации были отменены.»
Причем возникает она после salesLineNew.insert(); на ВТОРОЙ строке или на ПЕРВОЙ с НОВОЙ НОМЕНКЛАТУРОЙ в следующем «журнале», короче: когда меняется номенклатура!

В чем причина ошибки?
К сожалению человека, писавшего этот код нет сейчас в нашей команде. Да и если он откликнется, то, вряд ли сможет помочь, нет у него Аксапты под рукой

PHP код:
public void run()
{
    
SalesTable  salesTablesalesTableNew;
    
SalesLine   salesLinesalesLineNew;
    
boolean     queryRunEmpty true;
    
QueryBuildDataSource qbd;
    
Date   td;
    
M039_SalePatternDayOfWeek   _sale;
    
int     i;
    
container   _days;
    
DictTable       dictTable;
    
DictField       dictField;
    
SalesIDBase     salesIdBase;
;


    
//добавлем в условие аналитику продавца
    
qbd queryRun.query().dataSourceNo(1);
    
qbd.addRange(fieldId2Ext(fieldnum(SalesTable,dimension),1)).value(division.value());

//    info (qbd.toString());
    //пробегаем по выборке
    
while (queryRun.next())
    {
        
queryRunEmpty false;
        
salesTable queryRun.get(tablenum(SalesTable));//преобразуем строку запроса к виду таблицы
        
_sale salesTable.M039_SalePatternDayOfWeek;

        
_days connull();
        for (
i=1i<=7+=1)
        {
            if (
_sale[i])
                
_days conins(_days,conLen(_days)+1,i);//заполняем контейнер номерами дней недели из шаблона
        
}

        
td DateBegin.value();
        while (
td <= DateEnd.value())
        {
            if (
confind(_days,dayofwk(td)))//нашли искомое
            
{
//                info (date2str(td,123,2,2,2,2,4)+" "+int2str(dayofwk(td)));
                
ttsbegin;
                
salesTableNew.clear();

                
//перепишем все поля из шаблона
                
dictTable = new DictTable(tablenum(SalesTable));
                for (
i=1;i<=dictTable.fieldCnt();i++)
                {
                    
dictField dictTable.fieldObject(dictTable.fieldCnt2Id(i));
                    
salesTableNew.(dictField.id()) = salesTable.(dictField.id());
                }

                
salesTableNew.initValue();
                
salesIdBase NumberSeq::newGetNum(SalesParameters::numRefSalesId()).num();
                
salesTableNew.salesId      salesIdBase;
                
salesTableNew.salesType    SalesType::Sales;
                for (
i=1i<=7+=1)
                {
                    
salesTableNew.M039_SalePatternDayOfWeek[i] = false;
                }
                
salesTableNew.M039_SalePatternDayOfWeek[dayofwk(td)] = true;
                
salesTableNew.DeliveryDate td;

                
salesTableNew.insert();
//                ttscommit;

                //перепишем все строки шаблона
                
while select salesLine where salesLine.SalesId == salesTable.SalesId /*order by LineNum*/
                
{
//                    ttsbegin;
                    
SalesLineNew.clear();
                    
//перепишем все поля из строк шаблона
                    
dictTable = new DictTable(tablenum(SalesLine));
                    for (
i=1;i<=dictTable.fieldCnt();i++)
                    {
                        
dictField dictTable.fieldObject(dictTable.fieldCnt2Id(i));
                        
salesLineNew.(dictField.id()) = salesLine.(dictField.id());
                    }
                    
salesLineNew.initValue();
                    
salesLineNew.initFromSalesTable(salesTableNew);
                    
salesLineNew.M039_PatternQty salesLine.SalesQty;
//                    salesLineNew.salesId      = salesIdBase;
//                    info (salesIdBase);
                    
salesLineNew.insert();
//                    ttscommit;
                
}
            
ttscommit;
            }

            
td td 1;
        }

    }
    if (
queryRunEmpty)
    {
        
info ("Неправильно заданы условия выбора шаблона по созданию заказов. Шаблон не найден.");
    }

Старый 10.12.2004, 16:48   #2  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Добавьте перед вставкой
salesLineNew.RecId = 0;
Старый 10.12.2004, 17:09   #3  
kostas is offline
kostas
Участник
 
28 / 10 (1) +
Регистрация: 27.01.2004
Адрес: Владимир
Wamr
большое спасибо!

Почему же в 2-хзвенке фокус проходит?
Что еще нужно знать про проблемы кеширования в 3-хзвенке или где это найти, только доходчиво и ясно?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
А построение перекрестных ссылок опять сожрет всю память и завесит систему нафих Alex_K DAX: Администрирование 15 04.09.2009 22:00
Откат транзакции за вчерашний день??? Возможно в SQL2000??? director DAX: Администрирование 5 16.12.2005 11:26
опять про setFocus() на Grid ... =)) NetBus DAX: Программирование 1 15.11.2005 13:52
Транзакции: баг или фича ? Yury DAX: Программирование 4 21.02.2003 17:54
транзакции andreynikolai DAX: Программирование 2 20.06.2002 17:51

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

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

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