![]() |
#11 |
Участник
|
Могу предложить такой вариант. В принципе, должен работать с массивами любых типов (в том числе и динамическими)
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). |
Теги |
container, аналитика, баг, axapta |
|
|