17.06.2014, 10:49 | #1 |
Участник
|
ComDispFunction
Приветствую, знатоки!
Axapta 3.0 CIS SP3 Build 9.2 На предприятии сложилась такая ситуация, что мы переходим на Linux. Наши администраторы запустили клиент Axapta под Linux, и сейчас возникла необходимость перевести отчетность из Microsoft Office в OpenOffice. С этой целью были модернизированы классы ComOfficeDocument_RU, ComExcelDocument_RU и ComWordDocument_RU. Код прилагается. OpenOffice.xpo Под управлением Windows все работает замечательно. Однако при запуске под Linux наблюдается странное поведение: возникает ощущение, что свойства, создаваемые в методе OOo_CreateProperties, не передаются OpenOffice Calc. X++: protected ComVariant OOo_CreateProperties(container _list) { Array array; Com comPropertyValue; ComDispFunction comDispFunction; ComVariant comVariant; container property; int i; void insertIntoComVariant(anytype _value) { Array arrayLocal; int iLocal; ; switch (typeOf(_value)) { case Types::String, Types::RString: comVariant.bStr(_value); break; case Types::Integer: comVariant.int(_value); break; case Types::Real: comVariant.decimal(_value); break; case Types::Date: comVariant.date(_value); break; case Types::Enum: if (M_Func::getEnumId(_value) == enumnum(boolean)) comVariant.boolean(_value); else comVariant.bStr(strfmt("%1", _value)); break; case Types::Container: arrayLocal = new Array(Types::Integer); for (iLocal = 1; iLocal <= conlen(_value); iLocal++) { arrayLocal.value(iLocal, conpeek(_value, iLocal)); } comVariant = ComVariant::createFromArray(arrayLocal); break; } } ; comVariant = new ComVariant(); array = new Array(Types::Class); for (i = 1; i <= conlen(_list); i++) { property = conpeek(_list, i); comPropertyValue = m_comApplication.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); comDispFunction = new ComDispFunction(comPropertyValue, "Name", COMDispContext::PropertyPut); insertIntoComVariant(conpeek(property, 1)); comDispFunction.call(comVariant); comDispFunction = new ComDispFunction(comPropertyValue, "Value", COMDispContext::PropertyPut); insertIntoComVariant(conpeek(property, 2)); comDispFunction.call(comVariant); array.value(i, comPropertyValue); } return ComVariant::createFromArray(array); } X++: comDispFunction = new ComDispFunction(comPropertyValue, "Name", COMDispContext::PropertyPut); insertIntoComVariant(conpeek(property, 1)); comDispFunction.call(comVariant); X++: insertIntoComVariant(conpeek(property, 1)); comPropertyValue.Name(comVariant); Еще немного информации к размышлению: у нашего предприятия имеется несколько самописных программ на Visual FoxPro, которые благополучно запустились под Linux и нормально выгружают данные в OpenOffice. Последний раз редактировалось Xardas; 17.06.2014 в 11:03. |
|
17.06.2014, 15:26 | #2 |
Британский учённый
|
OMG, не завидую вашей службе поддержки
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
19.06.2014, 10:01 | #3 |
Участник
|
Проведенное тестирование выявило, что проблема не в ComDispFunction. Свойства COM-объекта присваиваются и читаются в штатном режиме. Теперь подозрения на код
X++: m_comDocument = m_comDesktop.LoadComponentFromUrl(this.OOo_TranslateFileName(_template), "_blank", 0, this.OOo_CreateProperties([["Hidden", true], ["AsTemplate", true]])); |
|