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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.10.2013, 13:33   #1  
rst is offline
rst
Участник
 
45 / 10 (1) +
Регистрация: 27.05.2005
Адрес: москва
Цитата:
Сообщение от Constantine Посмотреть сообщение
rst, почитайте эту тему, может что-то полезное найдете. Я так понимаю, что если у вас значение элемента больше 1024 символов, то работать с ним в НАВе проблематично.

Цитата:
Сообщение от rmv
Для работы с XML забудьте про writetext b пользуйтесь объектами и методами XML - xmlNode.nodeValue, setAttribute и тп., благо их хватает и для записи и для чтения.
Если уже совсем приспичило и размер значения в узле больше 1024 символов у XMLDOmTextNode есть метод substingData для чтения и appendData для записи.
Этот объект кстати можно использовать для обхода ограничений в 1024 при передачи значений между COM объектами, к примеру вызвать sql запрос любой длины через adoConnection.execute(XMLDOmTextNode.nodeValue).
коллеги, всем спасибо за обсуждение
дело продвигается, победа близка
rmv прав. указанных им методов XMLDOM хватает для решения моей конкретной задачи
Использовать нужно тип Navision BigText и потоки

выглядит примерно так :

......
IXMLDOMText:=XMLDOMDocument.createTextNode('');
Picture.CREATEINSTREAM(InStream);
PictureBigText.READ(InStream);
BigText2Node(PictureBigText,IXMLDOMText); //это то, что ниже
IXMLDOMElement:=XMLDOMDocument.createElement('Picture');
IXMLDOMElement.appendChild(IXMLDOMText);
X.appendChild(IXMLDOMElement);
......

и так :
......
LenIntegerRez:=BigText.GETSUBTEXT(BinaryBuff,PosIntegerPar,LenIntegerPar);
......
IXMLDOMText.appendData(TextPar);
......

есть вопросы к вам, коллеги.
про тип BigText и его функцию GETSUBTEXT
во-первых, прошу напомнить: она возвращает количество считанных символов. т.е. если мы указали считать 10 (третий параметр), а осталось считать только 2, то вернет 2, второй параметр - стартовая позиция, первый - буфер для считываемого значения.
прошу напомнить, потому что в справке отсутствует, на экспериментах хочу сэкономить
во-вторых задаю вопрос - КАК будет работать GETSUBTEXT с бинарными данными? в моем коде BinaryBuff - это буфер типа Binary. у меня создалось впечатление, что она некорректно работает на бинарных данных

есть ли у кого то опыт или просто мнение?

хочу поблагодарить за полезную ссылку, во многом оказавшую помощь по теме
http://dynamicsuser.net/forums/p/46262/233885.aspx
моего коллегу и одновременно руководителя
Старый 30.10.2013, 20:02   #2  
rst is offline
rst
Участник
 
45 / 10 (1) +
Регистрация: 27.05.2005
Адрес: москва
Цитата:
Сообщение от rst Посмотреть сообщение
дело продвигается, победа близка
раз уж взялся писать - хочу отчитаться о проделанной работе
итог таков

для большого текста используем 'Microsoft XML, v6.0'.IXMLDOMText
запись выглядит так : MyIXMLDOMText.appendData(MyText);
чтение выглядит так : MyBigText.ADDTEXT(MyIXMLDOMText.substringData(FromPosInt,BufLenInt));
для работы с бинарными данными необходимо использовать файлы, методы BigText не работают
файлы и BigText сопрягаются потоками как обычно
использую Base64


на верхнем уровне :

запись :
IF SomeRecord.BinData.HASVALUE THEN BEGIN
IXMLDOMTextLoc:=XMLDOMDocumentVarPar.createTextNode('');
SomeRecord.BinData.CREATEINSTREAM(InStreamLoc);
BinDataBigTextLoc.READ(InStreamLoc);
BinDataFileCreatedBooleanLoc:=BinDataFileLoc.CREATETEMPFILE;
BinDataFileNameText1024Loc:=BinDataFileLoc.NAME;
BinDataFileLoc.CREATEOUTSTREAM(OutStreamLoc);
BinDataBigTextLoc.WRITE(OutStreamLoc);
EncodeFile2Base64AndWrTextNode(BinDataFileLoc,IXMLDOMTextLoc);
BinDataFileLoc.CLOSE;
IXMLDOMElementLoc:=XMLDOMDocumentVarPar.createElement('BinData');
IXMLDOMElementLoc.appendChild(IXMLDOMTextLoc);
X.appendChild(IXMLDOMElementLoc);
END;

чтение :
GetNodeBigText(X,'BinData',Base64BigTextLoc);
IF Base64BigTextLoc.LENGTH>0 THEN BEGIN
FileNameText250Loc:=CreateTmpFileName(); //использовать CREATETEMPFILE нельзя
BinaryFileLoc.CREATE(FileNameText250Loc);
DecodeBase64BigText2File(Base64BigTextLoc,BinaryFileLoc);
BinaryFileLoc.CLOSE;
SomeRecord.BinData.IMPORT(FileNameText250Loc);
ERASE(FileNameText250Loc);
END;

оптимизация возможна
транспорт по HTTP работать должен
для меня на этом тема закрыта

всем участвовавшим в обсуждении - большое спасибо
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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