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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.01.2011, 14:25   #21  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от AvrDen Посмотреть сообщение
У нас это требование руководства - хранить "историю"....
Не самое лучшее решение...

А вы предлагали альтернативные варианты руководству ?

Чем не устраивает хранение истории обработанных счетов на оплату например ?
Там есть вся необходимая информация по истории заказа.

Не удаляя строки заказов вы неизбежно будете получать тормоза. Со временем будет только хуже.
Старый 13.01.2011, 14:27   #22  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Цитата:
Сообщение от AvrDen Посмотреть сообщение
При анализе нашли, что больше тормоза происходят в методе salesLine.lowestSalesStatus, который вызываеться из salesTable.updateBackStatus. Скорее всего из-за того что нет индекса по SalesId,SalesStatus в таблице salesLine. В итоге получается что при обработке заказа больше 1000 строк на обработку одной строки уходит порядка 10 сек.
Не очень понятно, поможет ли индекс, ведь в том запросе второе поле SalesStatus сравнивается не на совпадение, а на "больше". По идее, индекс дает эффект только при условии на равенство... или я не прав ?
Старый 13.01.2011, 14:28   #23  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Цитата:
Сообщение от someOne Посмотреть сообщение
Не удаляя строки заказов вы неизбежно будете получать тормоза. Со временем будет только хуже.
Да мы оставляем так называемую "оперативную" историю (т.е заказы за последний год)
Старый 13.01.2011, 15:01   #24  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
У вас какие-нибудь отчёты строятся по строкам заказов? Если да, то какие?
__________________
С уважением,
Вячеслав
Старый 14.01.2011, 06:01   #25  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Цитата:
Сообщение от pitersky Посмотреть сообщение
У вас какие-нибудь отчёты строятся по строкам заказов? Если да, то какие?
Нет, отчетов по строкам заказов нет. Но пользователи изначально работают с формой Заказы, она содержит много модификаций для удобства восприятия информации. И если предложить работать с формой накладных, то у них возникнет дискомфорт в работе. Пользователи сильно противяться этому.
Старый 14.01.2011, 11:09   #26  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Изменили код Classes\SalesFormLetter\postUpdate
X++:
protected void  postUpdate()
{
    SalesParmTable  localSalesParmTable;
    ParmId          parmIdPrev;
    SalesId         salesIdPrev;
    ;

    ttsbegin;

    localSalesParmTable = this.setForUpdateSalesParmTable();

    localSalesParmTable.StartDateTime = startDateTimeTable;
    localSalesParmTable.EndDateTime   = DateTimeUtil::newDateTime(systemdateget(),timenow(),DateTimeUtil::getUserPreferredTimeZone());

    localSalesParmTable.updateParmJobStatusExecuted();

    salesParmLine.clear();
    // Sales totals are nulled in order to force a recalculation of the sales totals
    // which are then stored in the SalesTable.estimate field for utilization during credit limit check
    salesTotals = null;

    recordListSalesParmLine.first(salesParmLine);
    while (salesParmLine)
    {
        if (salesParmLine.OrigSalesId != salesIdPrev || salesParmLine.ParmId != parmIdPrev)
        {
            //counting number of SalesOrders we deal with
            if (salesParmLine.OrigSalesId != salesIdPrev)
            {
                ++numberOfRecords;
            }
            //  13.01.2011 AVRDV -->
            /*
            salesTable = salesParmLine.salesTable(true);
            if (salesTable)
            {
                salesTable.updateDocumentStatus(this.documentStatus());
                salesTable.updateBackStatus();
                this.updateSalesType();
                this.createBackorderLines();
                salesTable.updateDeadline(salesParmUpdate.RespiteDate);

                if (salesTable.SalesId != salesParmTable.SalesId)
                {
                    // If this is not the primary sales order in the summary order,
                    // void the credit card preauthorization that may exist as it is no longer valid
                    this.voidCreditCardPreauthorize();
                }
            }
            */
            //  13.01.2011 AVRDV <--
            localSalesParmTable = salesParmLine.salesParmTable(true);
            if (localSalesParmTable)
            {
                localSalesParmTable.updateParmJobStatusExecuted();
            }
        }

        salesIdPrev = salesParmLine.OrigSalesId;
        parmIdPrev  = salesParmLine.ParmId;

        if (!recordListSalesParmLine.next(salesParmLine))
            break;
    }
    //   13.01.2011 AVRDV -->
    salesTable = SalesTable::find(salesIdPrev,true);
    if (salesTable)
    {
        salesTable.updateDocumentStatus(this.documentStatus());
        salesTable.updateBackStatus();
        this.updateSalesType();
        this.createBackorderLines();
        salesTable.updateDeadline(salesParmUpdate.RespiteDate);

        if (salesTable.SalesId != salesParmTable.SalesId)
        {
            // If this is not the primary sales order in the summary order,
            // void the credit card preauthorization that may exist as it is no longer valid
            this.voidCreditCardPreauthorize();
        }
    }
    //   13.01.2011 AVRDV <--

    ttscommit;
}
В результате получили обработку заказа на 2500 строк 10 минут, вместо 20 минут.
Старый 14.01.2011, 12:25   #27  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
а если процессы изменятся?
Старый 14.01.2011, 13:05   #28  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
какие процессы?
Старый 14.01.2011, 13:09   #29  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от AvrDen Посмотреть сообщение
какие процессы?
например обработка нескольких заказов
Старый 14.01.2011, 13:11   #30  
Bober is offline
Bober
Участник
 
311 / 104 (4) +++++
Регистрация: 29.05.2007
Цитата:
Сообщение от ice Посмотреть сообщение
а если процессы изменятся?
А почему в случае изменения процессов Вас беспокоит только эта модификация, а не 10 тысяч других, сделанных ранее?
Ясно же, что если меняются процессы, то много чего нужно пересматривать и проверять будет. Заложиться заранее на то, что именно и как изменится - невозможно. А конкретная проблема есть уже сейчас, и решать её нужно, и весьма эффективное решение найдено. Искренне поддерживаю автора.
За это сообщение автора поблагодарили: AvrDen (1).
Старый 14.01.2011, 13:51   #31  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Цитата:
Сообщение от ice Посмотреть сообщение
например обработка нескольких заказов
Обработка нескольких заказов, проходит корректно(меняется и статус Заказа и статус документа)
Старый 17.01.2011, 14:29   #32  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от AvrDen Посмотреть сообщение
Изменили код Classes\SalesFormLetter\postUpdate

В результате получили обработку заказа на 2500 строк 10 минут, вместо 20 минут.
Не корректная модификация. Это будет работать только в том случае, если в пределах отобранных salesParmLine будут только записи с одинаковым значением OrigSalesId. Если окажется что есть несколько значений OrigSalesId, то код будет не корректным.

Необходимо сохранить salesIdPrev, например в SET (он автоматически отбросит дубли в момент записи), а потом сканировать полученный SET, чтобы перебрать все SalesId.

X++:
Set   setSalesId = new Set(types::String);
SetIterator   si;
;

// Перебор salesParmLine
recordListSalesParmLine.first(salesParmLine);
while (salesParmLine)
{
    (...)
    salesIdPrev = salesParmLine.OrigSalesId;
    setSalesId.add(salesIdPrev);
    (...)
}    // while (salesParmLine)


// Перебор salesTable на которые есть ссылка в salesParmLine
si = new SetIterator(setSalesId)
while (si.more())
{
    salesIdPrev = si.value();
    salesTable = SalesTable::find(salesIdPrev, true)
    (...)
    si.next();
}    // while (si.more())

(...)
Теги
как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Создание производственного заказа программно ena_ax DAX: Программирование 7 23.09.2011 11:38
Цены в строке заказа меняются при изменении шапки заказа s.alex DAX: Функционал 8 14.04.2009 11:27
Статус "Отменено" в строках заказа oleg61858 DAX: База знаний и проекты 12 16.10.2007 23:28
Цена на дату создания заказа/закупки George Nordic DAX: Функционал 2 29.06.2005 15:56
Сообщение по обработке строк заказа... Venera DAX: Функционал 5 21.06.2004 13:51

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

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

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