Показать сообщение отдельно
Старый 25.09.2008, 19:20   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,658 / 1162 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если это запрос через COM-объекты, то попробуй принимать значения как тип ComVariant

X++:
ComVariant retVal;
;

retVal = Choose.();

// Если ожидается значение типа int
print retVal.int();
pause;

// Если ожидается значение типа str
print retVal.bStr ();
pause;
Можно сделать анализ типа возвращенного значения через свойство comVariant.variantType() для написания универсальной обработки

Вот выдрал метод по преобразованию типов ComVariant из своего класса на Ax2.5

X++:
// Преобразование полученного значения
anyType getValue(ComVariant _comVariant)
{
//    Com     comValue;
    ;

    switch (_comVariant.variantType())
    {
    case COMVariantType::VT_BOOL :
        return _comVariant.boolean();       // boolean
    case COMVariantType::VT_BSTR :
        return _comVariant.bStr();          // str
    case COMVariantType::VT_UI1 :
        return _comVariant.byte();          // int
    case COMVariantType::VT_I1 :
        return _comVariant.char();          // int
    case COMVariantType::VT_CY :
        return _comVariant.currency();      // real
    case COMVariantType::VT_DATE :
        return _comVariant.date();          // date
    case COMVariantType::VT_DECIMAL :
        return _comVariant.decimal();       // real
    case COMVariantType::VT_R8 :
        return _comVariant.double();        // real
    case COMVariantType::VT_R4 :
        return _comVariant.float();         // real
    case COMVariantType::VT_DISPATCH :
//        return _comVariant.iDispatch();           // дескриптор COM-интерфейса. Число.
        return COM::createFromVariant(_comVariant); // Преобразую в ссылку на объект
    case COMVariantType::VT_I4 :            // int
        return _comVariant.int();
//        return _comVariant.long();          // теоретически, это должно быть VT_I8, но такого значения нет, поэтому VT_I4 читается как int()
    case COMVariantType::VT_UNKNOWN :
        //return _comVariant.iUnknown();                // дескриптор COM-интерфейса. Число.
        return COM::createFromVariant(_comVariant);     // Преобразую в ссылку на объект
    case COMVariantType::VT_ERROR :
        return _comVariant.sCode();         // int
    case COMVariantType::VT_I2 :
        return _comVariant.short();         // int

    case COMVariantType::VT_UI4 :
        return _comVariant.uInt();         // int
        //return _comVariant.uLong();         // теоретически, это должно быть VT_UI8, но такого значения нет, поэтому VT_I4 читается как int()
    case COMVariantType::VT_UI2 :
        return _comVariant.uShort();        // int
    case COMVariantType::VT_VARIANT :
        return _comVariant.variant();       // COMVariant
    case COMVariantType::VT_SAFEARRAY :
        return _comVariant.safeArray();     // array
    default :
        throw error(strFmt("Неизвестны правила обработки типа %1", _comVariant.variantType()));

    }
}
За это сообщение автора поблагодарили: niktata (1).