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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.03.2007, 11:02   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ошибки Word 2003 при работе в терминальном режиме
AXAPTA 2.5 SP3 + Word 2003

Через ComWordDocument_RU открываю заренее созданный файл шаблона, наполняю имеющиеся в нем FormField и показываю результат пользователю.

Если работа происходит в обычном сетевом режиме, т.е. экземпляр Word создается на машине клиента, то все в порядке.

Но если приложение запускается через терминал, то непредсказуемым образом, на самых разных командах выскакивают совершенно "идиотские" сообщения об ошибках. Ну, например, на команде

m_comApplication.version()

Может выскочить "неверное число параметров"!

Самое неприятное в том, что возникает не какая-то одна фиксированная ошибка, а ошибки возникают именно случайным образом. На случайной команде. Соответственно, иногда документ формируется вполне успешно и без ошибок.

Полное ощущение, что иногда теряются или перепутываются адреса памяти. Как будто вместо ссылки на один объект по тому же адресу оказалась ссылка на другой объект. Хотя и в области памяти отведенной для Word

В чем может быть причина подобного поведения?

AXAPTA 2.5 SP3 + Word 2003
Старый 01.03.2007, 11:20   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Может быть причина в версии операционной системы ?

На клиенте у вас наверняка win2000 или XP
А при работе в терминалке наверняка серверная ось а-ля Win2003.
Старый 01.03.2007, 11:36   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Да. Ну и что? Каким образом это может влиять?

Насколько я понимаю, при работе в терминальном режиме я полностью работаю в Win2003. Есть конфликт Office 2003 и Win2003?
Старый 01.03.2007, 14:41   #4  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Да. Ну и что? Каким образом это может влиять?

Насколько я понимаю, при работе в терминальном режиме я полностью работаю в Win2003. Есть конфликт Office 2003 и Win2003?
А установку оffice на TerminalServer проводили с учетом рекомендаций? Там специальный ключик есть и последовательность установки
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 01.03.2007, 15:01   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
И чем отличается установка на сервер от установки на обычный ПК? Какие специальные ключи и последовательность установки?
Старый 01.03.2007, 16:04   #6  
somebody is offline
somebody
Участник
 
128 / 30 (2) +++
Регистрация: 30.04.2003
Адрес: Москва
Володя,
посмотри по ссылке http://support.microsoft.com/kb/828955/

Возможно, при установке Office было нарушено следующее:
Цитата:
По умолчанию некоторые компоненты имеют состояние Недоступно. Не меняйте состояние таких компонентов на Запускать с моего компьютера. Это может привести к возникновению неполадок в работе приложений Office, которые используют данные компоненты.
Внимание! По умолчанию некоторые компоненты имеют состояние Недоступно. Это необходимо для оптимизации работы в среде служб терминалов, включая устранение непредвиденных ошибок. Не изменяйте состояние таких компонентов на значение «Запускать с моего компьютера».
Надо снести и заново поставить Office. Или, как положено, поставить на другую терминалку, где нет Office.
Старый 01.03.2007, 16:16   #7  
somebody is offline
somebody
Участник
 
128 / 30 (2) +++
Регистрация: 30.04.2003
Адрес: Москва
Да, забыл...
А сервиспак на офис установлен? Должен быть SP2. Сначала попробуй установить его.
Если уже установлен, то накати на новую установку офиса. Если будут проблемы, см. http://support.microsoft.com/kb/906323
Старый 01.03.2007, 16:50   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Дима, спасибо, попробуем переустановить Office. Хотя, конечно "найти другую терминалку, где нет Office" пока невозможно.

А SP2 уже накатили.
Старый 01.03.2007, 16:57   #9  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
И чем отличается установка на сервер от установки на обычный ПК? Какие специальные ключи и последовательность установки?
Ключ относился к Office XP, это я промахнулся. Ссылку Вам кинули правильную.
Цитата:
Сообщение от somebody Посмотреть сообщение
Володя,
посмотри по ссылке http://support.microsoft.com/kb/828955/

Возможно, при установке Office было нарушено следующее:

Надо снести и заново поставить Office. Или, как положено, поставить на другую терминалку, где нет Office.
В 2003 исправили "бяку" с установкой на терминал, где приходилось дополнительные шаманские действия делать.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 21.02.2008, 18:20   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Post
Если у кого-то возникнет похожая проблема, то решение найдено (не прошло и года ). Основные причины следующие:

1. При передаче значений, отличных от целочисленных, в методы объектов Word желательно оборачивать их в класс COMVariant(). Т.е. передавать в качестве параметра не строку, а объект.

Следует обратить внимание на методы создания нового документа на базе шаблона и работу с полями Word.

Например, создание документа на базе шаблона:

X++:
    COM         comDocuments;
    COMVariant  varTemlateName;
    ;

(...)

            if (_template)
            {
                varTemlateName = new COMVariant(COMVariantInOut::IN, COMVariantType::VT_BSTR);
                varTemlateName.bStr(_template);
                m_comDocument = comDocuments.Add(varTemlateName);
            }
            else
            {
                m_comDocument = comDocuments.Add();
            }

(...)

2. Следует избегать сложных "вложенных" функций с включением обращений к свойствам Com объектов.

Например, высока вероятность ошибки при использовании такого синтаксиса

X++:
if (str2num(m_comApplication.version()) >= 9)
Однако еще не было ошибок в таком синтаксисе

X++:
numVersion = str2num(m_comApplication.version());
if (numVersion >= 9)

Короче, на терминалке "халява" - не проходит. Необходимо более строго следить за синтаксисом.
За это сообщение автора поблагодарили: russ (1), kashperuk (5), Logger (5), alex55 (1), plumbum (1).
Старый 21.02.2008, 18:28   #11  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
ага, получается, запустить и не дышать.
Но, спасибо за описание.
Старый 21.03.2011, 09:59   #12  
jkspb is offline
jkspb
Участник
 
18 / 20 (1) +++
Регистрация: 03.03.2009
Аналогичная проблема возникает и при создании отчетов в ексель.

По утверждению EMEA Dynamics AX Support, одной из причин может быть фишка операционки - ghost window.
Они предлагают следующие варианты решения проблем:
Цитата:
Workaround 1:
Disable Window Ghosting as described in this post.

Workaround 2:
Debug the X++ code down to the line that is causing the error. Once identified, insert one line before this statement a call to the yield method of the xInfo class.

Example:
infolog.yield();
namespace = outlook.getNamespace(#mapidef);

Workaround 3:
Debug the X++ code down to the line that is causing the error. Once identified, place the statement inside a try / catch block. In the catch block simply retry the operation.

Example:
int retryCount = 3;
//...
try
{
namespace = outlook.getNamespace(#mapidef);
}
catch(Exception::Error)
{
retryCount--;

if(retryCount > 0)
retry;
else
throw(Exception::Error);
}
В моем случае, при массовой печати в ексель, помогает только добавление команды
X++:
infolog.yield();
перед каждой командой обращения к COM объекту.

Последний раз редактировалось jkspb; 21.03.2011 в 10:05.
Старый 27.09.2011, 10:41   #13  
spidolo is offline
spidolo
Участник
 
1 / 10 (1) +
Регистрация: 27.09.2011
Пробуй Microsoft Office 2003 Русская версия, там всё норм должно работать
Старый 01.11.2012, 06:36   #14  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
Подниму старую тему
Волею судеб сейчас мы работаем на Axapta 3.0 SP4 Build #11.0
При том корпоративный MS Office уже 2007 SP1

При передаче данных в Excel стала все чаще появляться ошибка "неверное число параметров". Прочитала эту тему, но в том проблема, что у нас нет возможности воспользоваться добавлением команды infolog.yield(); для устранения проблемы. Такого метода на infolog у нас просто нет.
Есть ли смысл написать его самим? Кто может поделиться этим волшебным кодом?
Старый 01.11.2012, 11:09   #15  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Перепешите метод класса ComOfficeDocument_RU.visible() следующим образом

X++:
// Show / hide application
public void visible(boolean _bVisible = true)
{
    ComVariant      comVariant;
    COMDispFunction funcDisp;
    ;

    if (!m_comApplication)
        throw error(StrFmt("@DIS100406", this.GetApplicationName()));

    this.activate(_bVisible); // Activate application, if necessary

    comVariant = ComVariant::createFromBoolean(_bVisible);
    // RTG, 05.08.2010, МВБ -->
    // По непонятным причинам в Excel 2007 следующая команда ИНОГДА приводит к ошибке
    // Метод был вызван с неверным числом параметров.
    // Чтобы ее обойти необходимо сделать присвоение свойству через COMDispFunction
//    m_comApplication.Visible(comVariant);

    funcDisp = new COMDispFunction(m_comApplication, "Visible", COMDispContext::PROPERTYPUT);
    funcDisp.call(comVariant);
    funcDisp.finalize();
    // RTG, 05.08.2010, МВБ <--

}
После этого сделайте инкрементную компиляцию класса ComOfficeDocument_RU
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Antonuch (1).
Старый 30.06.2017, 04:46   #16  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
Прошло время. Волею судеб сейчас мы все еще работаем на Axapta 3.0 SP4 Build #11.0
При том корпоративный MS Office уже 2013.
Ошибка работы с Excel снова появилась, причем метод visible() уже переделан.
Обращение к Excel происходит вот таким образом:

excel = new COMExcelDocument_RU();
excel.newFile(#ReportTemplatePath_FileServer + "ApplicationFSS.xltx", false);

excel.insertValue(bookmark, substr(_content, i, 1));

Подскажите, как все же еще можно переделать.
Старый 30.06.2017, 07:35   #17  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
Цитата:
Сообщение от Fizik Посмотреть сообщение
Прошло время. Волею судеб сейчас мы все еще работаем на Axapta 3.0 SP4 Build #11.0
При том корпоративный MS Office уже 2013.
Ошибка работы с Excel снова появилась, причем метод visible() уже переделан.
Обращение к Excel происходит вот таким образом:

excel = new COMExcelDocument_RU();
excel.newFile(#ReportTemplatePath_FileServer + "ApplicationFSS.xltx", false);

excel.insertValue(bookmark, substr(_content, i, 1));

Подскажите, как все же еще можно переделать.
Добавлю, что в классе ComExcelDocument_RU уже переделаны методы getWorkSheet и getWorkSheets, как указано на странице Как правильно обернуть в ComVariant метод getWorkSheets() класса ComExcelDocument_RU
Старый 03.07.2017, 13:42   #18  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Fizik Посмотреть сообщение
Прошло время. Волею судеб сейчас мы все еще работаем на Axapta 3.0 SP4 Build #11.0
При том корпоративный MS Office уже 2013.
Ошибка работы с Excel снова появилась, причем метод visible() уже переделан.
Обращение к Excel происходит вот таким образом:

excel = new COMExcelDocument_RU();
excel.newFile(#ReportTemplatePath_FileServer + "ApplicationFSS.xltx", false);

excel.insertValue(bookmark, substr(_content, i, 1));

Подскажите, как все же еще можно переделать.
У нас зарубежный клиент, так что вместо COMExcelDocument_RU мы используем свои кастомные наработки. Офис 2013, Аксапта версии 4.0.
Вставить значение можно так:
X++:
public void insertValue(BookMark _bookMark, anyType _anyVal, int _workSheet = 1)
{
    COM comRange;
    ;

    this.checkExistDocument();

    comRange = this.findRange(_bookMark, _workSheet);

    this.insertValueInRange(comRange, _anyVal);
}
X++:
// Creates object range type named the same way as Excel bookmark
// bookMark -> Excel bookmark name
public COM findRange(PPO_MSOfficeBookMark bookMark, int _workSheet = 1) // was protected
{
    COM comRange,
        comWorkSheet;
    COM comApplication;
    ;

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

        if (comWorkSheet && comApplication)
        {
            comRange = comApplication.range(bookMark);
        }
    }
    return comRange;
}
X++:
// Exporting value in Range object
// comRange -> Range object
// anyVal -> Varible for export to Range object
protected void insertValueInRange(COM _comRange, anyType _anyVal)
{
    _comRange.value2(_anyVal);
}
Думаю, преобразовать код под свои нужды сможете без проблем.
__________________
// no comments
За это сообщение автора поблагодарили: Logger (1).
Теги
документация, com-объект

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибки при работе Axapta fPtr DAX: Администрирование 1 23.08.2007 10:40
Ошибки при работе в трехзвенке tolstjak DAX: Администрирование 3 29.03.2007 12:01
[ANN] WordSL - использование Word 2003 в качестве визуального редактора xsl... belugin DAX: База знаний и проекты 0 26.09.2006 09:12
Вопрос по работе с таблицей в word Protey DAX: Программирование 2 24.08.2006 09:30
Как импортировать из Word chuf DAX: Программирование 4 21.06.2003 15:33
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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