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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.09.2005, 15:47   #1  
Denicce is offline
Denicce
Участник
 
62 / 54 (2) ++++
Регистрация: 22.03.2005
Адрес: Москва
вставка знач. из Ax в Excel в именованую ячейку
Каким образом заставить Axapta не отражать ошибку при попытке определить COM объект xApplication.Range("Bookmark"), если не существует именованной ячейки "Bookmark" в шаблоне? Можно через try сделать, по крайней мере, отчет до конца дойдет, но в конце выдастся блок ошибок про неопределенные Range. Некрасиво это.

Есть идеи?
Старый 07.09.2005, 16:12   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
У объекта Application MS Excel есть коллекция Names, в которой находится список Named Range. Перед вызовом проверяйте этот список.
__________________
Axapta v.3.0 sp5 kr2
Старый 08.09.2005, 14:23   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ну, я сделал примерно так. Метод в ComExcelDocument_RU

PHP код:
// Существует ли указанный Range в листе Excel
// Возвращает true или false
// Имеет смысл при использовании именованных ячеек
// bookMark -> Excel bookmark name
public boolean rtg_existsRange(MSOfficeBookMark_RU bookMark,int _workSheetId 1)
{
    
COM         comRange,
                
comWorkSheet,
                
comApplication;

    
boolean     existsRange false;
    
str         strRange;
    ;

    if (
m_comDocument)
    {
        
comWorkSheet   this.getWorkSheet(_workSheetId);
        
comApplication m_comDocument.application();
        
comWorkSheet.activate();

        if (
comWorkSheet && comApplication)
        {
            try
            {
                
// Ошибка в Range генерит сообщение об ошибке, которое не подавляется Try...Catch
                // comRange = comApplication.range(bookMark);
                // Поэтому использую "макроподстановку" Evaluate
                
comRange comApplication.evaluate(bookMark);
                
// В объекте comRange нет метода Error(), поэтому штатно прочитать ошибку не получается
                // Конвертирую объект в строку и ищу в нем ключевое слово "ERROR"
                
strRange comRange.toString();
                if (
strScan(strRange,'ERROR',1,strLen(strRange)) == 0)
                {
                    
existsRange true;
                }
            }
            catch (
exception::Error)
            {
                
existsRange false;
            }
        }
    }
    return 
existsRange;

Старый 09.09.2005, 09:59   #4  
Denicce is offline
Denicce
Участник
 
62 / 54 (2) ++++
Регистрация: 22.03.2005
Адрес: Москва
Спасибо!!!
Старый 12.09.2005, 11:20   #5  
Denicce is offline
Denicce
Участник
 
62 / 54 (2) ++++
Регистрация: 22.03.2005
Адрес: Москва
Я немного другое решение придумал. Чтобы каждый раз не проверять в документе существование Name, я все Names загоняю в List сразу после открытия шаблона, потом уже через ф-ию inRange() проверяю имя ячейки в List.toString().
Не знаю, какой способ быстрее.
PHP код:
void prepareCellNamesList()
{
    
COM     comNamescomName;
    List    list;
    
int i;
    ;

    list = new List(
Types::String);
    
comNames m_comDocument.Names();

    for (
i=1i<=comNames.count(); i++)
    {
        
comName comNames.Item(i);
        list.
addEnd(comName.Name());
    }

    
namesList strRem(list.toString(), "<>");
}

// ADD by KDV (7-Сен-2005)  // KDV_LIZ_

boolean checkCellName(BookMark _bookMark)
{
    if (
namesList)
        return 
inRange(namesList_bookMark);
    else
        return 
true;

это два новых метода в COMExcelDocument_RU

и в ClassDeclaration объявил
Str namesList; // именованые ячейки
Старый 14.09.2005, 11:02   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Лично мне представляется такая логика крайне некорректной. Не в смысле кода, а именно сама идея.

Чтобы метод checkCellName() отработал корректно, ты должен предварительно, отдельным процессом, запустить на выполнение метод prepareCellNamesList().

Т.е., по "правильному", необходимо принудительно запускать метод prepareCellNamesList() изнутри собственно checkCellName(), если объект namesList не заполнен. А чтобы отличить "не заполненный", от "пустого", нужна еще одна переменная, определяющая сам факт выполнения метода prepareCellNamesList()

Кстати, гораздо разумнее использовать для этой цели объект-контейнер, а не символьную строку. Тогда поиска элемента - это функция ConFind() без дополнительного программирования.

В общем, как-то это "коряво" организовано. Лично я просто вернул бы из метода prepareCellNamesList() полученный список (RETURN namesList) и разбирался бы с полученным списком уже во вне класса COMExcelDocument_RU

Ну, и явная ошибка в методе checkCellName(). Почему, если НЕТ списка именованных ячеек возвращается true? Должно быть false.
Старый 15.09.2005, 16:25   #7  
Denicce is offline
Denicce
Участник
 
62 / 54 (2) ++++
Регистрация: 22.03.2005
Адрес: Москва
я метод prepare запускаю один раз, перед первой вставкой значения в именованную ячейку.

а вот если нет списка поименованных ячеек, я возвращаю true специально, чтобы не выполнять проверку. Идея в том, что не всегда адресация идет по поименованным ячейкам в Excel. иногда просто адресация, "A1" и т.д. Тогда надо true возвращать.

ну, тут еще подумать надоть.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
Dynamics AX: Calling an Excel Macro from X++ Blog bot DAX Blogs 1 26.05.2008 16:39
Arijit Basu: AX 2009 - Quick Overview Blog bot DAX Blogs 4 19.05.2008 14:47
Inside Dynamics AX 4.0: Usage Scenarios Blog bot DAX Blogs 0 04.10.2007 05:15
Karl Tolgu: The Atlas XL Microsoft Office Excel add-in by Globe Software uses the Dynamics AX Business Connector... Blog bot DAX Blogs 0 28.10.2006 16:40

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:12.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.