Показать сообщение отдельно
Старый 03.02.2012, 20:03   #19  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,713 / 1201 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от imir Посмотреть сообщение
Не, я таки настаиваю - оно прирастает, сделайте побольше сom-вызовов в вашем джобе (см скрин).
В Вашем случае количество циклов роли не играет. Вы же закомментировали закрытие документа

X++:
excel.closeDocument(false);
Естесственно, что чем больше документов открыто, тем больше ресурсов потребляется. Снимите комментарии с закрытия документа и повторите проверку.

PS: Кстати, для справки.

В версии Ax2009 в классе ComExcelDocument_RU создали в ClassDeclaration переменную comWorkSheets. Однако в методе closeDocument() эта переменная не обнуляется. Отсюда возникают глюки после первого закрытия документа, поскольку не срабатывает метод getWorkSheets(), где как раз-таки этой переменной и должны присвоить значение.

Для лечения "по быстрому" надо в методе ComExcelDocument_RU.closeDocument() после успешного закрытия документа добавить пару строчек

X++:
m_comDocument = null;
comWorkSheets = null;
А если делать по серьезному, то в методе closeDocument() надо много чего добавлять Например, этот метод вообще не предусматривает вариант, когда в одном экземляре Excel открыто несколько книг (несколько файлов Excel).

X++:
// Учет возможности работы с несколькими книгами в одном экземпляре Excel в классе ComExcelDocument_RU
public void closeDocument(boolean _save = false, int _workBook = 1)
{
    COM comWorkBooks;
    COM comWorkBook;
    // RTG, 19.12.2005, МВБ -->
    int     countWorkBooks;             // количество рабочих книг
    boolean isClosedSelectedWorkBooks;  // Закрывается ли текущая рабочая книга
    // RTG, 19.12.2005, МВБ <--

    try
    {
        if (m_comApplication)
        {
            m_comApplication.cutCopyMode(false); // 08.04.2004, Использование нескольких листов 

            comWorkBooks = m_comApplication.workBooks();

            // RTG, 19.12.2005, МВБ -->
            /*
            comWorkBook  = comWorkBooks.item(_workBook);
            comWorkBook.close(_save);
            */

            countWorkBooks  = comWorkBooks.Count();
            if (_workBook > 0 && _workBook <= countWorkBooks)
            {
                comWorkBook                 = comWorkBooks.item(_workBook);
                isClosedSelectedWorkBooks   = (comWorkBook.name() == m_comDocument.name());
                comWorkBook.close(_save);
            }
            if (isClosedSelectedWorkBooks)
            {
                countWorkBooks  = comWorkBooks.Count();
                if (countWorkBooks)
                {
                    m_comDocument = comWorkBooks.Item(countWorkBooks);
                }
                else
                {
                    m_comDocument = null;
                    comWorkSheets = null;
                }
            }
            // RTG, 19.12.2005, МВБ <--

            return;
        }
    }
    catch (Exception::Error)
    {
        exceptionTextFallThrough();
    }
    catch(Exception::Internal)
    {
        exceptionTextFallThrough();
    }

    error(this.getCOMErrorMsg());

    if (comWorkBook)
    {
        comWorkBook.detach();
    }

    if (comWorkBooks)
    {
        comWorkBooks.detach();
    }
    
}
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 03.02.2012 в 20:37.
За это сообщение автора поблагодарили: Maxim Gorbunov (2).