Показать сообщение отдельно
Старый 12.07.2007, 15:32   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2480 (88) +++++++++
Регистрация: 20.08.2005
Могу предложить такой вариант. В принципе, должен работать с массивами любых типов (в том числе и динамическими)
X++:
str con2Str_ext(container _in, str 10 sep = ',')
{
    int i;
    container c;
    int clen = conlen(_in);
    int k;
    str s;
    str res;
    int len;
    int pos;
    str 4 enumType;
    DictEnum dictEnum;
    enumId type;
    date dt;
    boolean first;
    ;
    res = "";
    for (k=1;k<=clen;k++)
    {
        c = [conpeek(_in, k)];
        s = BinData::dataToString(new ContainerClass(c).toBlob());
        s = strrem(s, "\r");

        if (substr(s, 1, 2) == "07")
        {
            if (substr(s, 3, 1) == "2")
            {
                len = str2int("0x" + substr(s, 7, 2) + substr(s, 5, 2));
                res += (res ? sep : "") + "[";
                first = true;
                switch (substr(s, 4, 1))
                {
                    case "0": // строка
                        pos = 0;
                        s = substr(s, 6*2+1, strlen(s));
                        while (strscan(s, "00", 1, strlen(s)))
                        {
                            pos = strscan(s, "00", 1, strlen(s));
                            if (pos mod 2 == 0) pos++;
                            c = ContainerClass::blob2Container(
                                    BinData::stringToData("0700" + substr(s, 1, pos-1) + "00ff"));

                            res += (!first ? sep : "") + con2str(c) ;
                            first = false;
                            s = strdel(s, 1, pos+1);
                        }
                        break;
                    case "1": // целое значение
                        for (i=0;i<len;i++)
                        {
                            c = ContainerClass::blob2Container(
                                    BinData::stringToData("0701" + substr(s, i*8 + 9, 8) + "ff"));

                            res += (!first ? sep : "") + con2str(c) ;
                            first = false;
                        }
                        break;
                    case "2": // значение с плавающей точкой
                        for (i=0;i<len;i++)
                        {
                            c = ContainerClass::blob2Container(
                                    BinData::stringToData("0702" + substr(s, i*20 + 9, 20) + "ff"));

                            res += (!first ? sep : "") + con2str(c) ;
                            first = false;
                        }
                        break;
                    case "3": // дата
                        for (i=0;i<len;i++)
                        {
                            c = ContainerClass::blob2Container(
                                    BinData::stringToData("0703" + substr(s, i*6 + 9, 6) + "ff"));
                            [dt] = c;
                            res += (!first ? sep : "") + date2str(dt, 123, 2, 2, 2, 2, 4) ;
                            first = false;
        //                    res += (res ? sep : "") + con2str(c) ;
                        }
                        break;
                    case "4": // енум
                        enumType = substr(s, 9, 4);
                        type = str2int("0x" + substr(enumType, 3, 2) + substr(enumType, 1, 2));
                        dictEnum = new DictEnum(type);
                        for (i=0;i<len;i++)
                        {
        /*                    c = ContainerClass::blob2Container(
                                    BinData::stringToData("0704" + substr(s, i*2 + 13, 2) + enumType + "ff"));
                            res += (res ? sep : "") + con2str(c) ;*/
// если необходимо выводить значения енума в числовом виде, 
// то надо убрать предыдущий комментарий и закомментировать эту строку
                            res += (!first ? sep : "") + /*dictEnum.name() + "::" + */dictEnum.value2Symbol(str2int("0x" + substr(s, i*2 + 13, 2)));
                            first = false;
                        }
                        break;
                }
                res += "]";
            }
            else
            {
                s = conpeek(c, 1);
                res += (res ? sep : "") + s;
            }
        }
    }
    return res;
}
Будет отличие в выводе для енумов по сравнению со стандатным - в функции они будут выводиться в соответствии со своими именами

Для динамических массивов возможно появление в конце пустых значений. Для енумов это будет элемент с EnumValue==0 (если он есть)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Logger (4).