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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.08.2007, 14:30   #1  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
[Excel] - Несколько версий Excel на машине клиента
Добрый день.

У клиента на машине стоит одновременно несколько версий Excel.
Задача: дать возможность пользователю указать, с какой именно Excel будет работать Аксапта.
Вопрос: - как явно указать, с какой версией Excel должна работать Аксапта.

Решение в лоб не сработало:

X++:
    comApplication1 = new COM('Excel.Application.11');
    comApplication2 = new COM('Excel.Application.12');
Данный код порождает два объекта, первый - 'Excel.Application.11', второй - 'Excel.Application.12' (так говорит мне отладчик). В реальности я вижу, что открылись две excel-ны последней версии.
Причина такого поведения кроется в реестре: HKEY_CLASSES_ROOT\\Excel.Application.11 и HKEY_CLASSES_ROOT\\Excel.Application.12 имеют один и тот же CLSID.

Похоже, что при установке новой версии Excel, инсталлятор заодно подправляет записи в реестре, относящиеся к предыдущей версии Excel. Можно ли этого избежать при установке? Можно ли в такой ситуации (когда две версии Excel уже установленны именно в таком виде) вызвать из Аксапты нужную версию Excel ?
Старый 06.08.2007, 15:00   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А если вместо new COM('Excel.Application.11') явно указать GUID класса (new COM('{00024500-0000-0000-C000-000000000046}'); )?
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Gustav (3).
Старый 06.08.2007, 15:36   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Да, как всё же некоторые вещи зашориваются постоянной однобокостью ('Excel.Application' да 'Excel.Application')...

Пока AndyD волшебного пендаля не даст, сам никогда лишний раз не пойдешь и не прочитаешь в хелпе, что...
Цитата:
Remarks
The class name of a COM object is either its ProgID (programmatic identifier) or CLSID (class identifier):

ProgIDs have the following format: <program>.<component>.<version> (e.g. "AXAPI.Axapta.1 "). Note that the version element of the ProgID can often be omitted.

CLSID s are 128 bit values and have to following format: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} (e.g. "{80F444A1-46FF-11D2-8459-0008C7A0D1EA}").
AndyD, cпасибо. Пока не знаю, помогло ли это Андре, но я для себя запомнил эту альтернативу


P.S. Андре, если не секрет, зачем это клиенту? Из-за миллиона строк, который позволяет 12 (но в то же время на большинстве машин, наверное, еще только 11)? Спасибо заранее, если ответите
За это сообщение автора поблагодарили: belugin (1).
Старый 06.08.2007, 17:47   #4  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
А если вместо new COM('Excel.Application.11') явно указать GUID класса (new COM('{00024500-0000-0000-C000-000000000046}'); )?
Хм... Так у меня по этому GUID уже Excel.12 зарегистрирован. Соответсвенно, он и запускается.
Сделал поиск строки 'Excel.Application.11' в ветви CLSID - нету. Хотя стоит, запускается и работает.
Старый 06.08.2007, 17:48   #5  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Да, еще, в других местах реестра Excel встречается именно под этим CLSID. Хм... может они вообще не отличаются CLSID.Excel.11 и CLSID.Excel.12?
Старый 06.08.2007, 17:50   #6  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Андре, если не секрет, зачем это клиенту?
1) Официально заявлена поддержка только Excel.11. Один из юзеров поставил 12 совместно с 11-м Excel. Сносить 12 он не хочет, а аксапту надо заставить работать с 11-ой версией.
2) Я поставил оба Excel и хочу иметь возможность тестировать работоспособность программы на обеих версиях Excel.
Старый 06.08.2007, 18:37   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Андре Посмотреть сообщение
Сделал поиск строки 'Excel.Application.11' в ветви CLSID - нету. Хотя стоит, запускается и работает.
еще днем мне в голову "мозговым штурмом" приходила такая заднепроходная полуручная процедура:

- вне Аксапты закрыть все текущие экземпляры Excel;
- запустить вне Аксапты нужную версию Excel (в единственном экземпляре)
- получить ссылку в Аксапте на этот экземпляр Excel при помощи COM::getObject('Excel.Application');

может, на что сгодится мыслишка?
Старый 07.08.2007, 09:41   #8  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
небольшой офф-топик про новости Excel 2007
Коль скоро тема балансирует между Excel.Application.11 и Excel.Application.12, или - более понятно - между Excel 2003 и Excel 2007, то показалось полезным привести попавшуюся по ходу ссылку на Возможности Office Excel 2007, не поддерживаемые в более ранних версиях Excel
Старый 07.08.2007, 10:37   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Gustav Посмотреть сообщение
еще днем мне в голову "мозговым штурмом" приходила такая заднепроходная полуручная процедура:

- вне Аксапты закрыть все текущие экземпляры Excel;
- запустить вне Аксапты нужную версию Excel (в единственном экземпляре)
- получить ссылку в Аксапте на этот экземпляр Excel при помощи COM::getObject('Excel.Application');

может, на что сгодится мыслишка?
Еще можно поискать CLSID у которого LocalServer показывает на нужное приложение.
Код:
[HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer]
@="C:\\PROGRA~1\\MICROS~2\\OFFICE11\\EXCEL.EXE /automation"
"LocalServer"=hex(7):38,5d,67,41,56,6e,2d,7d,66,28,5a,58,66,65,41,52,36,2e,6a,\
  69,45,58,43,45,4c,46,69,6c,65,73,3e,21,44,65,40,5d,56,7a,28,72,3d,66,60,31,\
  6c,66,71,60,3f,52,26,20,2f,61,75,74,6f,6d,61,74,69,6f,6e,00,00
Или попробовать просто взять CLSDID приведенный выше
Старый 07.08.2007, 11:08   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Насколько я понимаю, Excel не поддерживает версионность COM-интерфейса. Т.е. чтобы физически была возможность запустить разные версии Excel через COM-интерфейс в реестре должны быть разные CLSID для разных версий. Но реально CLSID одинаковый для любой версии Excel. Вопрос только в том, что именно он запускает.

Это значит, что чтобы сделать возможность выбора версии Excel через COM-интерфейс надо иметь возможность напрямую править сам реестр. Изменить настройки (привязку) CLSID к конкретной версии Excel.

Не думаю, что в этом есть смысл. Ведь если официально прописано о поддержке определенной версии Excel, то установка другой версии - это риск самого пользователя.

Кроме того, конечно, некоторые свойства и методы COM-интерфейса в разных версиях меняются, но в основном, все остается без изменений. Так что, думаю, не должно быть особых проблем при работе со старшей версией, кроме некоторых специфических ситуаций.

Да, проверить какую же версию Excel подхватил COM-интерфейс можно через свойство version()

X++:
Com     excel;
;

excel = new Com("Excel.Application");
info(strFmt("%1",excel.version()));
За это сообщение автора поблагодарили: Андре (5), aidsua (1).
Старый 07.08.2007, 11:26   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
INFO: Автоматизация Office в системе, где установлено несколько версий пакета MS Office:
Цитата:
Бытует мнение, что при автоматизации Office в системе, где установлены пакеты несколько версий Office, можно указать загружаемую версию приложения с помощью программного идентификатора PROGID, который уникален для каждой версии продукта (например, для загрузки Excel 2000 служит идентификатор Excel.Application.9, Excel 2002 соответствует Excel.Application.10, а Office Excel 2003 — Excel.Application.11). В действительности это не так. Для Excel 2000, 2002 и 2003 используется один и тот же идентификатор класса (CLSID), а это значит, что версия приложения, загружаемая с одним из программных идентификаторов (PROGID), определяется только порядком установки версий программы.
т.е. похоже, что человеку надо просто переустановить 11, чтобы запускать ее автоматом, а новомоднюю 12 будет для своих утех запускать вручную
За это сообщение автора поблагодарили: vladz (1).
Старый 07.08.2007, 13:45   #12  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Владимир Максимов,
Цитата:
Насколько я понимаю, Excel не поддерживает версионность COM-интерфейса.
Спасибо. Очень похоже на то.
Теги
excel

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Выделить несколько диапазонов одновременно (в Excel) MironovI DAX: Программирование 31 23.12.2016 15:12
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
aEremenko: Несколько серверов DAX на одной машине Blog bot DAX Blogs 3 30.11.2006 08:13
Вызов Item() для коллекций Excel Владимир Максимов DAX: Программирование 15 17.08.2006 19:47
Как быть если у клиента несколько адресов доставки? Rafael DAX: Функционал 7 12.03.2002 22:49

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

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

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