Тема: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Нужно вытащить все файлы из одной конфигурации TDMS и загрузить в другую конфигурацию.
Использую для этого VBAWord (просто написал процедурку в вордовом документе).
Вопросов в идентификации объектов и соответствующих им файлов нет.
Вопрос в том, как правильно вытащить файл из старой конфигурации так, чтобы он не остался там в "выписанном" состоянии, а потом затащить его в новую конфигурацию со своим именем.
Пока думаю делать так:
1. TDMSFile.CheckOut (<временное уникальное имя файла>)
2. Сохранение данных о файле и объекте во внешнем источнике данных
3. ShellCopy выписанного файла из папки TDMSFile.WorkFileName во временную папку со всеми файлами.
4. TDMSFile.CheckIn (<временное уникальное имя файла>)
Как потом буду затягивать - придумаю  :)

Еще вопросы:
1. Имя файла в методе CheckOut указывает имя файла под которым файл будет выгружен в папку WorkFileName?
2. Имя файла в методе CheckIn указывает на файл в папке WorkFileName, который надо загрузить в базу?
3. А если имя файла в методе CheckOut указать с полным путем - то CheckOut будет сделан по этому пути и свойство WorkFileName будет проигнорировано?
Извините за дурацкие вопросы, но я не совсем понимаю, как работает CheckOut - CheckIn.

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Еще вопросы:
1. Имя файла в методе CheckOut указывает имя файла под которым файл будет выгружен в папку WorkFileName?
2. Имя файла в методе CheckIn указывает на файл в папке WorkFileName, который надо загрузить в базу?
3. А если имя файла в методе CheckOut указать с полным путем - то CheckOut будет сделан по этому пути и свойство WorkFileName будет проигнорировано?
Извините за дурацкие вопросы, но я не совсем понимаю, как работает CheckOut - CheckIn.

Надо отличать методы у TDMSObject и TDMSFile
У TDMSObject - CheckOut - выгружает все файлы в директорию для выгрузки
У TDMSFile - CheckOut - выгружает конкретный файл с путём, указанным в параметре, т.е. тот, который Вы укажете.

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Нужно вытащить все файлы из одной конфигурации TDMS и загрузить в другую конфигурацию.
Использую для этого VBAWord (просто написал процедурку в вордовом документе).
Вопросов в идентификации объектов и соответствующих им файлов нет.
Вопрос в том, как правильно вытащить файл из старой конфигурации так, чтобы он не остался там в "выписанном" состоянии, а потом затащить его в новую конфигурацию со своим именем.
Пока думаю делать так:
1. TDMSFile.CheckOut (<временное уникальное имя файла>)
2. Сохранение данных о файле и объекте во внешнем источнике данных
3. ShellCopy выписанного файла из папки TDMSFile.WorkFileName во временную папку со всеми файлами.
4. TDMSFile.CheckIn (<временное уникальное имя файла>)
Как потом буду затягивать - придумаю

Имеется в виду не конфигурация, а настройка?
К сожалению, пока по техническим причинам связаться с 2-мя разными БД в ТДМС нельзя.

1. Если имеется в виду только файлы, то проще всего по GUID - т.е. сначала пишется "лог" по выгрузке, т.е. куда-угодно выгружается файл (пусть путь будет равняться "с:\temp\GUID объекта\имя файла"), и, к примеру, в excel в одну ячейку пишетсмя GUID объекта, а в другую путь к этому
файлу.
Потом при импорте просто бежим по всем строкам и делаем
set x = GetObjectByGUID(ячейка с гуидом) - и тупо checkin-им.

2. Если надо еще создать идентичные объекты (и если база большая), то просто: точно также к примеру 1 столбец - GUID текущего объекта, 2-й столбец - GUID объекта, куда входит, остальные столбцы - атрибуты. Дальше импортируем структуру - точно также бежим по строкам и воссоздаём нужную структуру. После этого пишем sql запрос в sql query analizer, в котором говорим use base1, use base2 - и по гуидам переливаем файл из одной базы в другую  :) В принципе можно всё написать на sql, но ИМХО проще через api. Файлы переливать через sql - потому что это в 10-ки раз быстрее - поверьте.


P.S. надо учитывать, что один лист в Еxcel-е  может содержать 65тысяч с небольшим строк. - делайте проверку, и переносите на следующий  лист.

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

У TDMSObject - CheckOut - выгружает все файлы в директорию для выгрузки
У TDMSFile - CheckOut - выгружает конкретный файл с путём, указанным в параметре, т.е. тот, который Вы укажете.

А при вызове TDMSFile.CheckOut файл блокируется? Т.е. потом обязательно делать TDMSFile.CheckIn?

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Имеется в виду не конфигурация, а настройка

Ы.ы.ы. А чем отличается конфигурация и настройка? Я думал, это синонимы.
На самом деле все гораздо хуже.
Надо объекты и файлы из одной настройки TDMS2 перетащить в другую настройку под TDMS3.

2. Если надо еще создать идентичные объекты (и если база большая), то просто: точно также к примеру 1 столбец - GUID текущего объекта, 2-й столбец - GUID объекта, куда входит, остальные столбцы - атрибуты.

Примерно так и сделал, только сохраняю во внешний файл. Получилось ОЧЧЕНЬ медленно, но зато работает  :)

(изменено: Anatoly, 3 апреля 2007г. 09:06:07)

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

погоди, а не проще просто проапгрейдить?
Если надо часть перенести, то точно также делаем экспорт структуры, экспорт нужных объектов. Потом импортируем их в пустую 2-шечную базу, потом её апгрейдим до 3-шки, потом переносим в нашу настройку  :)

Через скрипт 100% будет медленнее.

P.S.

Ы.ы.ы. А чем отличается конфигурация и настройка? Я думал, это синонимы.

ИМХО:
Конфигурация это - настройки БД, серверной части и т.д. Т.е.  именно конфигурация.
А "настройка" может не самое удачное слово, но ИМХО больше всего подходит.

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Новая настройка изначально создавалась под 3-ю версию с использованием всех ее фич. Т.е., так сказать, структура настройки в 2-ке и в 3-ке совсем не идентичны.

Потом импортируем их в пустую 2-шечную базу, потом её апгрейдим до 3-шки, потом переносим в нашу настройку

Что значит "переносим в нашу настройку"? Это как?

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Конфигурация это - настройки БД, серверной части и т.д. Т.е. именно конфигурация.
А "настройка" может не самое удачное слово, но ИМХО больше всего подходит.

Гы-гы. А имхо, надо наоборот  :) По аналогии с конфигурациями 1С. Да и вообще, Анатолий, сами посмотрите, как вы сформулировали:

Конфигурация это - настройки БД, серверной части

  :D
Впрочем, как скажате - так и будем называть. Главное - определится раз и навсегда с этими понятиями  :)

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

понятно, тогда мой вариант не подходит.

Что значит "переносим в нашу настройку"? Это как?

Имелось в виду стандартным(встроенным) импортом/экспортом.

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Понятно.

Еще раз спрошу, а то мы отвлеклись

Цитата
У TDMSObject - CheckOut - выгружает все файлы в директорию для выгрузки
У TDMSFile - CheckOut - выгружает конкретный файл с путём, указанным в параметре, т.е. тот, который Вы укажете.

А при вызове TDMSFile.CheckOut файл блокируется? Т.е. потом обязательно делать TDMSFile.CheckIn?

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Slava.Coder.Vrn пишет:

А при вызове TDMSFile.CheckOut файл блокируется? Т.е. потом обязательно делать TDMSFile.CheckIn?

Извини, пропустил этот постинг  :)
Файл не блокируется. Это аналог, что в UI делается правой кнопкой на файле - свойства - сохранить как.

(изменено: Slava.Coder.Vrn, 6 апреля 2007г. 10:47:53)

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

В общем, сделал. Работает  :) Спасибо большое за советы.
Теперь интересует вопрос оптимизации.
Очень много времени занимает обращение к объектам. Чтение каждого объекта идет "поатрибутно", значение каждого атрибута тут же пихается в файл с использованием стандартных средств VBA (Put/Get). Конечно, файловый ввод/вывод сильно тормозит (заводить буфер в памяти а потом целиком скидывать его содержимое в файл - даж не знаю, как в VBA это сделать).
Но еще сильнее тормозит "поатрибутное" обращение к объекту. Есть какая-нибудь возможность получать сразу дамп свойств объекта по заданному шаблону? Мож запрос в TDMS написать, который будет возвращать особым образом сформатированные строки из всех значений атрибутов каждого объекта, и запускать этот запрос из моей программки на VBA, и это будет быстрее? Запрос ведь выполняется на сервере?
Или, как еще ускорить мой экспорт/импорт? Пока у меня на экспорт ~1000 объектов уходит 10-12 мин, на импорт - ок 20 мин. Всего в базе около 10000 объектов, когда закончу отлаживатся, надо будет их все перетягивать. Как-то мне боязно немного за весьма вероятные сбои при такой длительности операций...

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Slava.Coder.Vrn пишет:

В общем, сделал. Работает  :) Спасибо большое за советы.
Теперь интересует вопрос оптимизации.
Очень много времени занимает обращение к объектам. Чтение каждого объекта идет "поатрибутно", значение каждого атрибута тут же пихается в файл с использованием стандартных средств VBA (Put/Get). Конечно, файловый ввод/вывод сильно тормозит (заводить буфер в памяти а потом целиком скидывать его содержимое в файл - даж не знаю, как в VBA это сделать).
Но еще сильнее тормозит "поатрибутное" обращение к объекту. Есть какая-нибудь возможность получать сразу дамп свойств объекта по заданному шаблону? Мож запрос в TDMS написать, который будет возвращать особым образом сформатированные строки из всех значений атрибутов каждого объекта, и запускать этот запрос из моей программки на VBA, и это будет быстрее? Запрос ведь выполняется на сервере?
Или, как еще ускорить мой экспорт/импорт? Пока у меня на экспорт ~1000 объектов уходит 10-12 мин, на импорт - ок 20 мин. Всего в базе около 10000 объектов, когда закончу отлаживатся, надо будет их все перетягивать. Как-то мне боязно немного за весьма вероятные сбои при такой длительности операций...

Связывайте объект к которому обращаетесь с переменной при помощи инструкции Set, это должно увеличить скорость.

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Edhunter, наверное, имеет в виду считывание сразу всей коллекции.
инструкция Set потребуется в любом случае.

Чтобы считать всю коллекцию атрибутов, без дальнейшего "пересчитывания", то используйте конструкцию with  ;)

Т.е., если Вы пишете

For each x in y.objects
  a = x.attributes(xxx)
  b = x.attributes(yyy)
  c = x.attributes(zzz)
next

то этот код будет работать медленнее, чем:

For each x in y.objects
  with x.attributes  
     a = .item(xxx)
     b = .item(yyy)
     c = .item(zzz)
  end with
next

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Ок, спасибо. Попробую  :)

(изменено: Anatoly, 6 апреля 2007г. 13:13:57)

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Slava.Coder.Vrn пишет:

Ок, спасибо. Попробую  :)

Просьба: установите таймер, и пришлите результаты по 1-му и 2-му вариантам.  ;) + конфигурацию машины.

(изменено: Slava.Coder.Vrn, 6 апреля 2007г. 16:47:14)

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Померил скорость. Считывал 100 объектов, 3370 атрибутов.

For each x in y.objects
  a = x.attributes(xxx)
  b = x.attributes(yyy)
  c = x.attributes(zzz)
next

Результат - 85 сек

For each x in y.objects
  with x.attributes  
     a = .item(xxx)
     b = .item(yyy)
     c = .item(zzz)
  end with
next

Результат - 87 сек
Мож все дело в том, что база на сетке? Т.е. самое узкое место - 100Мб сеть?

(изменено: Anatoly, 7 апреля 2007г. 12:24:44)

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Очень странно, что так долго.... Мне кажется, что у Вас тормоза из-за записи. Или же Вы только считываете??
Проверяли на работающей базе (т.е. люди на ней работали?)? Проверяли сколько раз?

Я написал такой код:

on error resume next
 dim t1,t2,t3
 t1 = timer
  For each obj in thisobject.ContentAll
     with obj.attributes
         a = .item(1).Value
         b = .item(2).Value
         c = .item(3).Value
         d = .item(4).Value
         e = .item(5).Value
         f = .item(6).Value
     end with    
 Next
t1 = timer - t1 
t2 = timer 
 For each obj in thisobject.ContentAll
         a = obj.attributes(1).Value
         b = obj.attributes(2).Value
         c = obj.attributes(3).Value
         d = obj.attributes(4).Value
         e = obj.attributes(5).Value
         f = obj.attributes(6).Value
 Next
t2 = timer - t2

t3 = timer 
 For each obj in thisobject.ContentAll
  Set y = obj.attributes
         a = y(1).Value
         b = y(2).Value
         c = y(3).Value
         d = y(4).Value
         e = y(5).Value
         f = y(6).Value
 Next
t3 = timer - t3

msgbox "Время1 = " & t1 & chr(13) & "Время2= " & t2 & chr(13) & "Время3 = " & t3 & chr(13) & "Количество объектов = " & ThisObject.ContentAll.Count

Результат:
Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Re: Как выгрузить файл из одной БД и загрузить в другую (используя TDMS Api)

Slava.Coder.Vrn пишет:

Померил скорость. Считывал 100 объектов, 3370 атрибутов.
...
Результат - 85 сек
...
Результат - 87 сек
Мож все дело в том, что база на сетке? Т.е. самое узкое место - 100Мб сеть?

1. Сеть не может быть узким местом. Траффик от этих запросов мизерный. Но нагрузка на сервер от 3370 запросов в случае неоптимизированного кода достаточно серьезная.
2. Необъяснимо отсутствие разницы в производительности.

Рекомендую
а) почистить мусор: Системные\Утилиты\Сборщик
б) обновить статистику: TDMS /create > Утилиты базы данных > Обновить статистику

И пришлите ваш код. Сдается мне, собака в другом месте  ;)