Приветствую, знатоки!
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);
}
Подобное поведение в Windows возникает, если вместо кода
X++:
comDispFunction = new ComDispFunction(comPropertyValue, "Name", COMDispContext::PropertyPut);
insertIntoComVariant(conpeek(property, 1));
comDispFunction.call(comVariant);
использовать код
X++:
insertIntoComVariant(conpeek(property, 1));
comPropertyValue.Name(comVariant);
Я грешу на ComDispFunction. Есть у кого-нибудь идеи?
Еще немного информации к размышлению: у нашего предприятия имеется несколько самописных программ на Visual FoxPro, которые благополучно запустились под Linux и нормально выгружают данные в OpenOffice.