AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.04.2010, 15:24   #1  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Container, bin data, Binary, base64
Добрый день..

Надо контейнер перенести через ХМЛ. Поэтому встаёт вопрос, как перекодировать контейнер.

ХМЛ полюбому будет просить определённый формат (без спец символов). Пока удалось строку закодировать в base64, но вот как контейнер переделать в нормальную строку или Binary/Base64 незнаю.

Контейнер у меня очень сложный - вложенные контейнеры. поэтому я больше предпочёл бы Binary.

BinData и Binary между собой несовместымы. к тому же функция setData() в Ахапте вообще глухая - даже инфолог после неё не работает (если в Job-e запускаю)

Подскажите где копать?
Старый 06.04.2010, 16:28   #2  
PavelX is offline
PavelX
MCTS
MCBMSS
 
46 / 97 (4) ++++
Регистрация: 08.09.2006
Адрес: Красноярск
Может быть функция con2str() класса Global Вам поможет? Только для вложенных контейнеров ее надо будет дописать...
Старый 06.04.2010, 16:52   #3  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Я написал рекурсивную функцию. Только вот теперь лень писать рекурсивную "str2con" .
В контейнерах могут также быть и любые другие данные.

Пока остановился на этом очень не красивом варианте

X++:
public client static Binary con2Binary(container _c)
{
    BinData         bd = new BinData();
    Binary          b;
    int             i;
    int             num;
    Array           SafeArray;
    ;

    // setData - does not work
    new BinaryIo('a','w').writeExp(_c);
    bd.loadFile('a');

    SafeArray = bd.getVariant().safeArray();
    num = SafeArray.lastIndex();

    b = new Binary(num+1);
    for(i=1; i<(num+1); i++)
        b.byte(i-1, SafeArray.value(i));

    return b;
}
Старый 08.04.2010, 10:40   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Может, имеет смысл посмотреть метод global::XMLString().
За это сообщение автора поблагодарили: Poleax (1).
Старый 08.04.2010, 11:45   #5  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Да, функция XMLString возвращает то что надо, но вот подумал. это же огромный ХМЛ код...
У меня будет >200.000 записей с таким контейнером.

Проблема в таком случае, что Ахапта не умеет загружать такой большой ХМЛ фаил (>400Мб), если работаем с ДОМ-ХМЛ (встроенные классы Ахапта XMLDocument и подобные)

Вторая проблема - в контейнере иногда хранится бинарные данные (картинка и т.д.)

Сейчас я остановился на том, что из ХМЛ получаю нормальный Base64 (если смотреть через дебагер по байтам). Но вот нет ни одной ф-ии, которая могла бы загрузить обратно в контейнер (для этого мне надо бинарнэ данные загрузить в файл и тогда читать с помощью BinData + read() + getData())
Старый 08.04.2010, 12:25   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Можно сделать так
X++:
{
    ContainerClass  cs;
    container       c = [1, ["sdklf", "лывоадфа", 01\12\2009], 2.3, "klsdffa"];
    container       c1;
    str             s;
    ;
    cs = new ContainerClass(c);
    s = BinData::dataToString(cs.toBlob());
    info (s);

    c1 = ContainerClass::blob2Container( BinData::stringToData(s) );

    conview(c);
    conview(c1);
}
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: mazzy (2), Logger (6), perestoronin (1), Delfins (2), gl00mie (2).
Старый 08.04.2010, 12:33   #7  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Вот спасибо.. теперь только проверить, как будет работать [Ах3 -> Ах5]

Последний раз редактировалось Delfins; 08.04.2010 в 13:13.
Старый 08.04.2010, 12:45   #8  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Этот код я в DAX2009 писал
__________________
Axapta v.3.0 sp5 kr2
Старый 08.04.2010, 12:46   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Или вы хотите передавать из Ax3 в DAX2009?
__________________
Axapta v.3.0 sp5 kr2
Старый 08.04.2010, 13:13   #10  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Всё отлично работает! Мега-респект.. долго мучался с вариациями встроенных функций.

PS: надо с любой версии в любую (3->4, 3->5, 5->4, 5->5)
Старый 08.04.2010, 13:21   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Из тройки в более старшие версии так не получится передавать

Внутренний формат контейнера, в связи с переходом на юникод, был переработан начиная с четверки. По-этому, попытка загрузить из внутреннего представления тройки может привести к различным глюкам, вплоть до падения клиента.
__________________
Axapta v.3.0 sp5 kr2
Старый 08.04.2010, 13:26   #12  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Это ты думал если передавать как бинарник через BASE64
Или через предложенный вариант!?

У меня получилость из 3-ки в 5-ку по твоему методу. Или он не будет работать, если будут уникод данные?
X++:
ContainerClass::blob2Container( BinData::stringToData(s) );
Старый 08.04.2010, 13:45   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Со строками будет засада.
Первое вхождение строки в контейнер восстановится, а вот то, что дальше - с большой вероятностью нет
__________________
Axapta v.3.0 sp5 kr2
Старый 08.04.2010, 19:42   #14  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Да, проверил.
Через RemoteDesktop на сервере фигня заимпортировалась.

А вот на Виндовз-7 нормально.. походу дела, надо как-то заставить это всё дело работать в уникоде (и в Ах3 и в Ах5 на сервере)
Теги
container, xml

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Binary -> Container Fedor DAX: Программирование 16 28.04.2014 10:59
axStart: Change data on a data source on a Form Blog bot DAX Blogs 0 04.09.2008 15:05
axaptapedia: Container Blog bot DAX Blogs 0 06.03.2007 00:33
String or binary data would not be truncated DreamCreator DAX: Программирование 4 22.02.2005 03:06
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:33.