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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.10.2013, 18:42   #1  
rst is offline
rst
Участник
 
45 / 10 (1) +
Регистрация: 27.05.2005
Адрес: москва
коллеги, всех приветствую

как экспортировать / импортировать BLOB в / из XML.Attribute ('а) ?

(MS XMLDOM)
Старый 21.10.2013, 14:16   #2  
srg is offline
srg
Участник
 
116 / 10 (1) +
Регистрация: 20.08.2013
зайди на форму Excel Templeate, на кнопке "функции глянь"- menu items (код)

можешь по этому подобию сделать форму, на которой будешь выгружать и загружать.
Старый 21.10.2013, 17:13   #3  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
Fierce, в стандартном наве нет этой формы (по крайней мере в 4-ке), возможно это что-то самописное.
rst, вам в BLOB'ы именно отдельные элементы загружать\выгружать надо или весь XML-документ? Если весь документ, то забрать документ можно как-то так:
Код:
Record.CALCFIELDS(XML);
IF Record.XML.HASVALUE THEN
BEGIN
  Record.XML.CREATEINSTREAM(InStream);
  xmlDoc.load(InStream);
END;
А записывать в BLOB видимо нужно через OutStream.
Старый 21.10.2013, 17:33   #4  
srg is offline
srg
Участник
 
116 / 10 (1) +
Регистрация: 20.08.2013
Вот, код кнопки (для экспорта)


на он пуше

Код:
CALCFIELDS(BLOB);
IF BLOB.HASVALUE THEN BEGIN
  BLOBRef.Blob := BLOB;
  ThreeTierMgt.BLOBExport(BLOBRef,"File Name",TRUE);
END;
Вот, код кнопки (для импорта)

Код:
TemplateExists := BLOB.HASVALUE;
BLOBRef.Blob := BLOB;
Filename := ThreeTierMgt.BLOBImport(BLOBRef,'*.xls',TRUE);
IF Filename = '' THEN
  EXIT;
IF TemplateExists THEN
  IF NOT CONFIRM(Text001,FALSE,TABLECAPTION,Code) THEN
    EXIT;
BLOB := BLOBRef.Blob;
WHILE STRPOS(Filename,'\') <> 0 DO
  Filename := COPYSTR(Filename,STRPOS(Filename,'\') + 1);
"File Name" := Filename;
CurrForm.SAVERECORD;
Constantine
Мне говорят, что в четверке есть такая функция тоже.
сказали, есть в "персонал и зарплата" -> "НАСТРОЙКА" -> "настройка модуля и зарплаты" - >ОКНО - "Т формы"


вот fob(forma ексель темплейт)
Старый 22.10.2013, 09:00   #5  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
Fierce, у нас нет модуля Зарплаты, видимо поэтому и не нашел эту форму. Ваш код, на сколько я понимаю, выгружает и загружает BLOB в файл, а не в переменную, как нужно топикстартеру, хотя я может и неправильно его понял.
Старый 22.10.2013, 11:01   #6  
rst is offline
rst
Участник
 
45 / 10 (1) +
Регистрация: 27.05.2005
Адрес: москва
Цитата:
Сообщение от Fierce Посмотреть сообщение
зайди на форму Excel Templeate, на кнопке "функции глянь"- menu items (код)

можешь по этому подобию сделать форму, на которой будешь выгружать и загружать.
Fierce, спасибо

что за форма ? (ID)

не нашел в моем кронусе 5.0

если форма нестандартная, могли бы Вы выложить ее (или нужную часть кода) сюда, если конечно реальные владельцы интеллектуальной собственности не слишком против
Старый 22.10.2013, 11:19   #7  
srg is offline
srg
Участник
 
116 / 10 (1) +
Регистрация: 20.08.2013
Цитата:
Сообщение от rst Посмотреть сообщение
Цитата:
Сообщение от Fierce Посмотреть сообщение
зайди на форму Excel Templeate, на кнопке "функции глянь"- menu items (код)

можешь по этому подобию сделать форму, на которой будешь выгружать и загружать.
Fierce, спасибо

что за форма ? (ID)

не нашел в моем кронусе 5.0

если форма нестандартная, могли бы Вы выложить ее (или нужную часть кода) сюда, если конечно реальные владельцы интеллектуальной собственности не слишком против
5233 - форма в кронусе. (Human Resources Setup)
5218 - таблица которая используется. (Human Resources Setup)
на форме открываем вкладку "Т формы", идем на лукап любого шаблона, а там уже переход на Ексель темплейт форму

14919 - табла Excel Template
14919 - форма Excel Templates
Старый 22.10.2013, 12:53   #8  
rst is offline
rst
Участник
 
45 / 10 (1) +
Регистрация: 27.05.2005
Адрес: москва
Цитата:
5233 - форма в кронусе. (Human Resources Setup)
5218 - таблица которая используется. (Human Resources Setup)
на форме открываем вкладку "Т формы", идем на лукап любого шаблона, а там уже переход на Ексель темплейт форму

14919 - табла Excel Template
14919 - форма Excel Templates
к большому сожалению не то что, нужно, спасибо за попытку помочь

для интересующихся темой:
http://www.mibuso.com/forum/viewtopi...283653#p283653
Старый 22.10.2013, 13:02   #9  
rst is offline
rst
Участник
 
45 / 10 (1) +
Регистрация: 27.05.2005
Адрес: москва
Цитата:
Сообщение от Constantine Посмотреть сообщение
А записывать в BLOB видимо нужно через OutStream.
Constantine, Вы совершенно правы. Проблема в том и состоит - как создать потоки ввода вывода, чтобы можно было направить их в/из XML.Element.Value
Старый 22.10.2013, 18:07   #10  
rst is offline
rst
Участник
 
45 / 10 (1) +
Регистрация: 27.05.2005
Адрес: москва
Цитата:
Сообщение от rst Посмотреть сообщение
Constantine, Вы совершенно правы. Проблема в том и состоит - как создать потоки ввода вывода, чтобы можно было направить их в/из XML.Element.Value
формулирую вопрос явно, из общения вне форума выясняется, что это требуется

IXMLDOMAttribute.value представляет собой тип Navision - Variant и тип COM - VARIANT *

http://msdn.microsoft.com/en-us/library/ms757007(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/sak564ww.aspx

вопрос в принципе в том и состоит - как создать из Navision потоки InStream OutStream для работы с COM VARIANT *
потому что то, что в Navision с любыми строками, большими Text1024 (binary аналогично) надо работать через потоки - априори ясно

интуитивно хочется некоей функции MSXMLDOM.CreateStream, порождающей требуемый поток

всем интересующимся темой большое спасибо
Старый 23.10.2013, 17:12   #11  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
rst, почитайте эту тему, может что-то полезное найдете. Я так понимаю, что если у вас значение элемента больше 1024 символов, то работать с ним в НАВе проблематично.
Старый 24.10.2013, 19:22   #12  
rst is offline
rst
Участник
 
45 / 10 (1) +
Регистрация: 27.05.2005
Адрес: москва
Цитата:
Сообщение от Constantine Посмотреть сообщение
rst, почитайте эту тему, может что-то полезное найдете. Я так понимаю, что если у вас значение элемента больше 1024 символов, то работать с ним в НАВе проблематично.
Цитата:
Сообщение от Constantine Посмотреть сообщение
InTacto по-моему собаку съел на XML'е, так что вероятнее всего он прав. Ваша переменная Auda может вернуть поток? Может у нее какие-то еще методы есть? Если у вас будет входящий поток с данными, его можно будет потом перегнать в исходящий поток и сохранить на диск.
большое спасибо, 'Constantine', очень полезная ссылка. смотрю у Вас были те же ожидания, что и у меня,
Цитата:
Сообщение от rst
интуитивно хочется некоей функции MSXMLDOM.CreateStream, порождающей требуемый поток
и они не оправдались, Albeit реализовал библиотечку. почитаю побольше про MSXML в соответствии с советами rmv и если не найду, попытаюсь сделать то же самое.
Старый 29.10.2013, 13:33   #13  
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   #14  
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, время: 17:11.