gifts2017

Универсальный вариант XML-обмена данными для v8.1

Опубликовал Андрей Акулов (DrAku1a) в раздел Программирование - Практика программирования

Предлагаемый простой механизм позволит обмениваться даже между абсолютно разными конфигурациями.
Более того, возможно чтение данных, выгруженных с помощью программы, написанной на Delphi. При этом сама выгрузка-загрузка потребует гораздо меньше усилий.

При обмене допускается использовать только простые типы данных - текст, число, дата, булево. Никаких ссылок!

 
Суть метода при обмене 1С - 1С:

Выгрузка: данные предварительно нужно собрать в таблицу значений, например, с помощью запроса "Выбрать...". Затем таблицу значений записать в формате XML.

Загрузка: данные загружаются в таблицу значений, после этого можно работать уже с таблицей значений, а не с XML-файлом. Это проще и код будет более читабелен.


Суть метода при обмене Delphi - 1С:

Если вы занимаетесь задачей переписывания базы в 1С из другой учетной системы, может возникнуть необходимость переноса данных - при этом придется потратить время на разработку обработки обмена, отладку, возможно даже придется использовать сторонние разработки бррр... Или вызывать к 1С из внешней программы - но и тут в работе будет немало тонких моментов. Как вариант для разовой выгрузки-загрузки вполне сгодится XML. Но не спешите ваять "выгружалку" - возможно, Вам подойдет существующее решение.

Выгрузка: используем библиотеку компонентов Jedi - компонент JvgExportXML. Я выгружал данные из Firebird-базы и Access.

Сайт Delphi-Jedi

Загрузка: данные также загружаются в таблицу значений (той же функцией, что и при обмене 1С-1С). Формат обмена совместим с форматом экспорта от Jedi. После загрузки можно работать дальше уже с таблицей значений.

В прилагаемой обработке в основной форме есть процедура "ЗаписатьТаблицуXML(ИмяФайла, ТЗ, ИндикаторПроцесса=Неопределено)", которая соответственно названию, выгружает таблицу ТЗ в файл. Процедуру скопируйте в свою обработку и вызывайте при выгрузке данных. Функция "ПрочитатьТаблицуXML(ИмяФайла)" загружает таблицу и в случае успеха возвращает ее в качестве результата.

Сама обработка тоже пригодится - можно будет просмотреть содержимое выгруженных ранее таблиц.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ЧтениеТаблицыXML.epf
.epf 8,10Kb
09.01.11
621
.epf 8,10Kb 621 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Игорь Исхаков (Ish_2) 09.01.11 09:09
1. В конфигурации-источнике Таблицу значений можно создать и записать ЗначениеВФайл(..).
2. В конфигурации-приемнике прочитать ЗначениеИзФайла().

А статья вообще о чём ?


2. Андрей Акулов (DrAku1a) 09.01.11 13:21
Ish_2 пишет:

1. В конфигурации-источнике Таблицу значений можно создать и записать ЗначениеВФайл(..).
2. В конфигурации-приемнике прочитать ЗначениеИзФайла().

А статья вообще о чём ?


Да, действительно. С помощью ЗначениеВФайл(..) можно и дерево значений выгружать и загружать... Выходит статья ниочем :|
Хотя все-же может пригодится тем, кто переносит данные не из 1С...
3. Ярослав Радкевич (WKBAPKA) 10.01.11 00:03
ну разве что разобрать файл в дерево, полезно было бы для некоторых целей, и то, вроде такие разработки тут уже выкладывали... а так, не понятно, как можно древовидную структуру разложить в плоский список эффективно?!
4. Андрей Акулов (DrAku1a) 10.01.11 08:15
WKBAPKA пишет:
а так, не понятно, как можно древовидную структуру разложить в плоский список эффективно?!


В Delphi, да и в других БД для этих целей применяется два поля:
ID тип AutoInc (счётчик) - идентификатор строки,
RootID тип Integer (целочисленное 4 байта) - ссылка на родителя.
Можно еще добавить поле
Level тип число - уровень текущей записи, но Дельфисты это поле вычисляют во время выполнения.

У записей самого верхнего уровня RootID или не заполнено или установлено в -1. Автоинкрементные поля заполняются начиная с 0 или 1 - поэтому у таких записей "родителей" нет.
Такая структура удобна - берешь запись, читаешь ID и ищешь подчиненные по RootID. При построении дерева - то-же самое только в рекурсии...
Чтобы перенести элемент в другую группу достаточно изменить у него значение RootID.
Чтобы перенести группу со всеми подчиненными элементами - достаточно изменить RootID в строке, соответствующей группе.
Выходит, довольно удобная организация.

В нашем случае нужно добавлять два поля и пройтись по ним заполняя счетчиком. Попутно заполняя RootID у подчиненных значением Родитель.ID... Наверняка можно в запросе и что покрасивше придумать или еще как оптимизировать...
5. Ярослав Радкевич (WKBAPKA) 11.01.11 09:58
работа с динамическими списками мне известна... ;) просто в чем смысл?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа