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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.12.2011, 11:08   #1  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Добрый день всем.
Передо мной встала задача провести выгрузку а затем загрузку данных в XML формате. Начал разбираться с XMLport-ами вначале. Почитав форум пришёл к выводу что нужно делать через XMLDOM.
Наваял простенький примерчик
Код:
rItem.RESET;
rItem.SETRANGE("No.",'1000','9000');
CREATE(XMLDocOut);

ProcesType := '';
XMLCurrNode := XMLDocOut.documentElement;
WITH XMLDOMManagement DO BEGIN
  IF AddElement(
    XMLCurrNode,'NO',
    rItem."No.",DocNameSpace,XMLNewChild) > 0
  THEN
    EXIT;
  IF AddElement(
    XMLCurrNode,'DESCRIPTION',
    rItem.Description,DocNameSpace,XMLNewChild) > 0
  THEN
    EXIT;
  IF AddElement(
    XMLCurrNode,'UNIT_PRICE',
    FORMAT(rItem."Unit Price"),DocNameSpace,XMLNewChild) > 0
  THEN
    EXIT;
END;
XMLDocOut.save(path);
Выдаёт ошибку:
Цитата:
Не создан экземпляр этой переменной автоматизации.
Чтобы создать экземпляр, можно создать новую переменную или присвоить значение существующей.
Ошибку выдало на AddElement.
Решил упростить пример... точнее позаимствовал до нельзя простенький пример из форума http://forum.mazzy.ru/index.php?show...63&#entry28563
Код:
CREATE(xmlDocument);
xmlDocument.load(path);
xmlHeader := xmlDocument.documentElement;

xmlRecord := xmlDocument.createNode('element','Record',''); // тут ошибка


xmlHeader.appendChild(xmlRecord);
xmlDocument.save(path);
И на выделенной строке выходит таже ошибка. Анализируя существующие примеры в NAV убедился что именно так и нужно писать.
Версия NAV 2009. XMLDOM пробовал 3-ю версию и 6-ю.
Что я не так делаю?
Признаюсь честно до этого с XML не работал. Поэтому буду очень признателен за рабочий кусок кода выгрузки из какой либо таблицы(по фильтру), выбранных полей в XML.
Заранее спасибо!
Старый 07.12.2011, 12:46   #2  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Пишите универсально для любой таблицы через recordref и fieldref, структура примерно такая
<rec table_no="27">
<f no="1" value="zuzu"/>
....
<f no="99999999999" value="zuzu"/>

</table>
Старый 07.12.2011, 13:02   #3  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Цитата:
Сообщение от rmv Посмотреть сообщение
Пишите универсально для любой таблицы через recordref и fieldref, структура примерно такая
<rec table_no="27">
<f no="1" value="zuzu"/>
....
<f no="99999999999" value="zuzu"/>

</table>
Ну это само собой буду делать так... но для начало на элементарных примерах хочется увидеть результат... У меня же не отрабатывает почему то
Старый 07.12.2011, 13:15   #4  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
У xml документа строгая внутренняя структура, похожая на дерево, и должен быть обязательный корневой элемент.
Есть замечательный кодеюнит 6224 XML DOM Management, в котором собраны ф-ции для работы с xml документом с отловом ошибок.
Пример будет построен на использовании ф-ций, указанного кодеюнита.
Код:
CREATE(xmlDocument);
// тэг Root будет нашим корнем. 
// при создании документа в loadxml подставляется начальный заголовок файла,
//  а при разборе путь до загружаемого файла

xmldocument.loadxml := '<?xml version="1.0" encoding="utf-8"?><Root/>';
// Указываем переменную на корневой элемент
XMLNode := xmldocument.documentElement;

  IF AddElement(XMLNode,'Message', '', NameSpace, XMLNodeChild) > 0 THEN
    EXIT;
  
  //Переходим внутрь тега Message
  XMLNode := XMLNodeChild;
  IF AddElement(XMLNode, 'sender', 'Вася', NameSpace, XMLNodeChild) > 0 THEN
    EXIT;
  
  IF AddElement(XMLNode, 'recipient', 'Петя', NameSpace, XMLNodeChild) > 0 THEN
    EXIT;
  
  IF AddElement(XMLNode, 'issue', format(today), NameSpace, XMLNodeChild) > 0 THEN
    EXIT;

  // переходим в тэг root
  XMLNodeChild := XMLNode;
  XMLNode := XMLNodeChild.parentNode;

   // Создаем следующий тег
  IF AddElement(XMLNode, 'Message2', '', NameSpace, XMLNodeChild) > 0 THEN
    EXIT;
  
  XMLNode := XMLNodeChild;
  IF AddElement(XMLNode, 'Item', 'Велик', NameSpace, XMLNodeChild) > 0 THEN
     EXIT;

xmldocument.save(path);

Переменные
XMLNode Automation 'Microsoft XML, v3.0'.IXMLDOMNode
XMLNodeChild Automation 'Microsoft XML, v3.0'.IXMLDOMNode
NameSpace Text 255

Документ будет иметь следующий вид:
Код:
  <?xml version="1.0" encoding="utf-8" ?> 
  <Root>
   <Message>
    <sender>Вася</sender> 
    <recipient>Петя</recipient> 
    <issue>2011-12-02</issue> 
   </Message>
   <Message2>
    <Item>Велик</Item>
   </Message2>
  </Root>
Если есть, то посмотрите как сделаны кодеюниты 6225 и кажется 6226.
Старый 07.12.2011, 13:46   #5  
raniel is offline
raniel
Участник
Аватар для raniel
 
239 / 11 (1) +
Регистрация: 20.10.2006
Спасибо InTacto!!!
Мне не хватало вот этой строки:
Код:
xmldocument.loadxml := '<?xml version="1.0" encoding="utf-8"?><Root/>';
Сейчас вроде всё заработало....буду теперь всё это адаптировать под свою задачу.
 


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

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

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