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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.09.2007, 16:16   #1  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Excel: закрыть файл
Задача тривиальная: загрузить данные из Ex. Заранее скажу, что поиском уже искала, может конечно и проглядела.

пишу простой код

X++:
private void fileData()
{
    ComExcelDocument_RU  excelDocument = new ComExcelDocument_RU();
    ;

    info (time2str(timenow(),2,2));
    excelDocument.open(filePath);
    workSheet = 1;

    ttsbegin;

    _budget.AccountNum = excelDocument.getCellValue(ComExcelDocument_RU::numToNameCell(2,20), workSheet);
    _budget.insert();
    ttscommit;

    excelDocument.deleteRow(_excelRow+1);
    excelDocument.visible(false);
    excelDocument.finalize();
    info (time2str(timenow(),2,2));

}
В результате все работает, но вот сам файл фактически не закрывается. Что надо добавитьв код, чтобы файл закрылся.


И еще вопрос, что такое excelDocument.OpenDocement(dsfadf);
Старый 12.09.2007, 16:32   #2  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
excelDocument.closeDocument?
Старый 12.09.2007, 16:44   #3  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
выдает ошибку

Ошибка времени выполнения. : ComExcelDocument_RU Объект не инициализирован.
Трассировка стека:
\Classes\ComExcelDocument_RU\closeDocument
\Reports\Cat_BudgetImport\Methods\fileData - line 37
\Reports\Cat_BudgetImport\Methods\run - line 5
\Classes\SysReportRun\run - line 18
\Classes\RunBaseReport\run - line 32
\Classes\SysReportRun\run - line 8

А без - работает.

Последний раз редактировалось Arahnid; 12.09.2007 в 16:50.
Старый 12.09.2007, 17:40   #4  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
А excelDocument.closeDocument() стоит вместо excelDocument.finalize() или после?
Старый 12.09.2007, 18:35   #5  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
close заработал.
у меня и openDocement не работает - может вы и это подскажите

Последний раз редактировалось Arahnid; 12.09.2007 в 18:38.
Старый 12.09.2007, 18:38   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Arahnid, а как Вы думаете, что должен делать метод?
X++:
excelDocument.finalize();
Старый 12.09.2007, 18:59   #7  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Не знаю, в документации не нашла. Это был мой следующий вопрос (я понимаю, плакать хочется над знаниями)
Старый 12.09.2007, 19:08   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Если на пальцах:

Когда Вы написали
excelDocument = new ComExcelDocument_RU()
выделилась память под этот объект

когда Вы пишите
excelDocument.finalize();
вы сообщаете системе (сборщику мусора), что объект этот не используется и память, для него выделенную, можно освободить. Что он успешно и делает.

Поэтому любое обращение к этой переменной приведет к ошибке, так как переменная уже ни на что не ссылается.

Одним словом, все действия делайте до этого метода
Старый 12.09.2007, 23:09   #9  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Вопрос теперь такой: он все делает как я прошу и ожидаю, кроме одного. Одного - он открывает файл и считывает информацию. Затем сам его закрыает, сохраняет изменения. Все хорошо, одно плохо - он в момент того , когда считывает- открывает файл, и пользователь его видит. Хотелось бы, чтобы пользователь не видел , как аксапта открывает файл, как это можно сделать? или сие не поправимо?

Последний раз редактировалось Arahnid; 12.09.2007 в 23:18.
Старый 12.09.2007, 23:38   #10  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
у ComOfficeDocument_RU смотрите метод visible.
Старый 13.09.2007, 10:36   #11  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
именно благодаря этому методу он и закрывает в конце открытый для чтения документ, но мне надо, чтобы он даже не показывал открытие файла пользователю
Старый 13.09.2007, 10:43   #12  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
excelDocument.visible(false) - сразу после создания документа
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
Старый 13.09.2007, 10:44   #13  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
В методе open второй параметр как раз за это отвечает.
open(FileName _fileName, boolean _bVisible = true)
Передайте туда false и все должно получиться.
Старый 13.09.2007, 11:15   #14  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
а чем все же отличается open and openDocement?
Старый 13.09.2007, 11:22   #15  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Arahnid Посмотреть сообщение
а чем все же отличается open and openDocement?
Вы ведь сами можете это посмотреть.
Код этих классов полностью доступен

Open делает доп. проверки на существование файла и вызывает openDocument
Старый 13.09.2007, 14:55   #16  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Уже в пору сказать "Простите , что обращаюсь!"

А как сделать так , чтобы поставить защиту с паролем? Я что - то в классе по экселю этого не нашла.

И еще, а как поставить фильтр на файлы xls в окне диалога

filePathField = dlg.addFieldValue(typeid(Filenameopen),filePath,'Загружаемый файл '); - это я пишу в Dialog

Последний раз редактировалось Arahnid; 13.09.2007 в 15:03.
Старый 13.09.2007, 15:08   #17  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Не нашел оригинальный пост, с которого я содрал код, поэтому просто приведу метод, который использую я у себя:

X++:
void protectWorkBook(boolean _displayGridLines = true, boolean _protect = true, str _password = date2str(SystemDateGet(), 123, 2, 0, 2, 0, 4) + time2str(timeNow(), 0, 0))
{
    COM comWorkBook;
    COM comWorkSheets;
    COM comWorkSheet;
    COM comActiveWindow;
    int iCount, workSheetCount;
    int applVersion;
    ;

    if (prmIsDefault(_protect) && !this.doProtectWorkBook())
        return;

    if (!_protect)
        return;

    try
    {
        applVersion = str2int(m_comApplication.version());
        comWorkBook = m_comApplication.activeWorkBook();
        comWorkSheets = comWorkBook.workSheets();
        workSheetCount = comWorkSheets.count();
        for (iCount = 1; iCount <= workSheetCount; iCount++)
        {
            comWorkSheet = comWorkSheets.Item(iCount);
            if (applVersion >= 10)
            {
                comWorkSheet.protect(
                                    _password,          //password
                                    true,               //DrawingObjects
                                    true,               //Contents
                                    true,               //Scenarios
                                    true,               //UserInterfaceOnly
                                    true,               //AllowFormattingCells
                                    true,               //AllowFormattingColumns
                                    true,               //AllowFormattingRows
                                    false,              //AllowInsertingColumns
                                    false,              //AllowInsertingRows
                                    false,              //AllowInsertingHyperlinks
                                    false,              //AllowDeletingColumns
                                    false,              //AllowDeletingRows
                                    true,               //AllowSorting
                                    true,               //AllowFiltering
                                    true                //AllowUsingPivotTables
                                    );
            }
            else
            {
                comWorkSheet.protect(
                                    _password,          //password
                                    true,               //DrawingObjects
                                    true,               //Contents
                                    true,               //Scenarios
                                    true                //UserInterfaceOnly
                                    );
            }
            comWorkSheet.enableSelection(-4142);    //xlNoSelection
        }
        comActiveWindow = m_comApplication.activeWindow();
        comActiveWindow.displayGridLines(_displayGridLines);
    }
    catch
    {
        this.throwError(@"Произошла ошибка при блокировании редактирования рабочей книги Excel");
    }
}
Про диалог и xls
У диалога есть методы filenameLookupFilter и другие.
Используются вот так:
X++:
    _filenameLookupFilter = conIns(_filenameLookupFilter,1,"@SYS76040", '*.axc');
или просто вот так:
X++:
    _filenameLookupFilter = ['All files','*.*'];
За это сообщение автора поблагодарили: Sergey Petrov (1), xfree (1).
Старый 13.09.2007, 15:34   #18  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
с диалогом разобралась, примеры по функции нашла, спасибо.

А вот пример с protect не получилось, нет такой функции в классе ComExcelDocument_RU, адже похожего нет, но ведь такого не бывает?
Старый 13.09.2007, 15:38   #19  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Arahnid Посмотреть сообщение
нет такой функции в классе ComExcelDocument_RU, адже похожего нет, но ведь такого не бывает?
Конечно нету там такой функции.
Иначе я бы код выше не приводил.

Если она вам нужна, добавьте, изменив, чтобы компилировалось
Старый 13.09.2007, 16:55   #20  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
спасибо большое - доделала под себя и все заработало. Еще немного и будет пособие для начинающих )))
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Вызов Item() для коллекций Excel Владимир Максимов DAX: Программирование 15 17.08.2006 19:47
Как из Ax увидеть Excel файл? NJD DAX: Программирование 3 04.06.2004 14:06
Есть файл Excel по расчеты стоимости модулей Аксапты DDA DAX: Администрирование 9 06.03.2003 16:09

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

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

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