0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 284
1

Выгрузка всех файлов из базы..

16.06.2015, 13:50. Показов 16437. Ответов 47
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, необходимо выгрузить все файлы в папки с ID доком пытаюсь делать так:

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub Click(Source As Button)
Dim session As NotesSession
Set session = New NotesSession
Set db = session.CurrentDatabase
Set col = db.AllDocuments
Set col1 = db.GetView("default")
 
If col.Count <> 0 Then
Set doc = col.GetFirstDocument
Do While Not( doc Is Nothyng )
Set rtitem = doc.GetFirstItem( "Body" )
If (rtItem.Type = RICHTEXT) Then
Forall o In rtitem.EmbeddedObjects
fileCount = fileCount + 1
If (o.Type = EMBED_ATTACHMENT) Then Call o.ExtractFile("c:\temp\" & o.Name)
End Forall
End If
Call session.UpdateProcessedDoc( doc )
Set doc = col.GetNextDocument(doc)
Loop
End If
End Sub
Выгружается 96 файлов а дальше ошибка "Несоответствие типов в методе ForAllInit: найдено FROMVAR, ожидался Unknown" В чем может быть проблема не пойму?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2015, 13:50
Ответы с готовыми решениями:

Выгрузка файлов из базы
Добрый день. Коллеги пытаемся выгрузить файлы из базы. При нажатии кнопки DwnFile появляется...

Выгрузка файлов из базы данных
Задача заключается в том, чтобы приложения скачивало файл(которой представлен в базе в виде...

Выгрузка файлов из базы в каталог
БП 3.0. Выгрузил файлы из базы в каталог. Но размер базы не уменьшился. так должно быть? Думал из...

Обмен с мобильным приложением. Выборка и выгрузка всех документов из одной базы в другую
Здравствуйте, делаю моб. приложение на 1С. Хочу выгрузить документы из одной базы(ПК) в другую...

47
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 812
16.06.2015, 13:53 2
Битый документ попался. Попробуй найти его и открыть в клиенте, наверняка выскочит какая-то ошибка, типа "32К".
0
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 284
16.06.2015, 14:02 3
Цитата Сообщение от garrick
Битый документ попался. Попробуй найти его и открыть в клиенте, наверняка выскочит какая-то ошибка, типа "32К".
как можно исключить такие доки ? ) И как найти его )
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
16.06.2015, 14:16 4
возможно - через ДХЛ
0
0 / 0 / 0
Регистрация: 07.04.2014
Сообщений: 633
16.06.2015, 14:35 5
Цитата Сообщение от JohnLemon
как можно исключить такие доки ? ) И как найти его )
Если у тебя вьюшка сортирована то:
в цикле While принтуй номер итерации.
После ошибки, номер геморойного дока будет последний принтованный номер +1.


Цитата Сообщение от JohnLemon
как можно исключить такие доки
On Error Resume Next пропустит все ошибки и не прервёт цикл... Также, можешь нормально обработать ошибку и в обработчике сохранить в список unids геморойных доков. Потом с ними врукопашную разберёшься.
ЗЫ
лучче даже, не сохранять юниды, а сразу слать весь гемор в какой нить фолдер, там и грести.
0
0 / 0 / 0
Регистрация: 25.12.2010
Сообщений: 246
16.06.2015, 14:52 6
Также стоит позаботится об одноименных файлах. Лучше выгружать в подпапку, именованную UNID-ом, и учитите, что если попадутся одноименные в одном документе, то название при выгрузке у них будет неожиданное.
0
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 284
17.06.2015, 06:57 7
Цитата Сообщение от Shandrik
Лучше выгружать в подпапку, именованную UNID-ом
Я так и планировал сделать...
Вот сделал в роде обработку ошибок, 1 обрабатывается, а если вторая то останавливается скрипт. Проблема скорее всего что вообще нету атачей в доке!

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Sub Click(Source As Button)
 
 
Dim session As NotesSession
Set session = New NotesSession
Set db = session.CurrentDatabase
Set view = db.GetView("all")
Set doc = view.GetFirstDocument
l = 0
lblNorm:
While Not(doc Is Nothyng)
On Error Goto lblErrs
l = l +1
Print(l)
Set rtitem = doc.GetFirstItem( "Body" )
If (rtItem.Type = RICHTEXT) Then
Forall o In rtitem.EmbeddedObjects
If (o.Type = EMBED_ATTACHMENT) Then Call o.ExtractFile("c:\temp\" & o.Name)
End Forall
End If
Set doc = view.GetNextDocument(doc)
Wend
Exit Sub
lblErrs:
Messagebox "Error "
Set doc = view.GetNextDocument(doc)
Goto lblNorm
Exit Sub
End Sub
0
0 / 0 / 0
Регистрация: 27.10.2011
Сообщений: 2,124
17.06.2015, 08:26 8
Не проверял, но попробуйте:

.SpoilerTarget">Спойлер: Код


LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Sub Click(Source As Button)
On Error Goto Handler
dym ErrStr as String
Dim session As  New NotesSession
Set db = session.CurrentDatabase
Set view = db.GetView("all")
view.autoupdate = false
Set doc = view.GetFirstDocument
 
While Not(doc Is Nothyng)
Set rtitem = doc.GetFirstItem( "Body" )
If (rtItem.Type = RICHTEXT) Then
Forall o In rtitem.EmbeddedObjects
If (o.Type = EMBED_ATTACHMENT) Then
Call o.ExtractFile("c:\temp\" & o.Name)
end if
End Forall
End If
nextDoc:
Set doc = view.GetNextDocument(doc)
Wend
 
view.autoupdate = True
 
Exit Sub
 
Handler:
ErrStr = {Error: } & Error$ & { in line } & erl
if not doc is nothyng then ErrStr = ErrStr & chr(10) & doc.universalId
if session.IsOnServer then
Print ErrStr
else
msgbox ErrStr, 16
end if
if not doc is nothyng then resume nextDOc
if not view is nothyng then view.autoupdate = True
Exit Sub
End Sub
0
0 / 0 / 0
Регистрация: 25.12.2010
Сообщений: 246
17.06.2015, 09:00 9
После 11-й строки проверьте rt-item на Nothyng
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
17.06.2015, 09:30 10
положили выборку на диск, в виде ДХЛ, натравили LAX - всё!
0
0 / 0 / 0
Регистрация: 25.12.2010
Сообщений: 246
17.06.2015, 09:54 11
Мне не надо, чтобы хорошо, мне надо, чтобы ты ... (с)
0
0 / 0 / 0
Регистрация: 25.12.2010
Сообщений: 246
17.06.2015, 10:19 12
Если надо выгрузить все файлы из документов, то может стоит получать EmbeddedObjects не от определенного айтема, а прямо от НотесДокумента?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 812
17.06.2015, 10:22 13
Цитата Сообщение от lmike
положили выборку на диск, в виде ДХЛ, натравили LAX - всё!
Если ошибка про 32К, то выгрузка DXL по-моему тоже должна "споткнуться" об такой документ. Любая попытка чтения полей такого документа генерит ошибку. Надо строить обход таких документов через On Error Goto...

LotusScript
1
2
3
4
5
6
7
Set doc = view.GetFirstDocument
On Error Goto NextDoc
if doc.HasEmbedded then
.....
end if
NextDoc:
Set doc = view.GetNextDocument(doc)
0
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 284
17.06.2015, 10:50 14
Цитата Сообщение от lmike
положили выборку на диск, в виде ДХЛ, натравили LAX - всё!
LAX не в курсе даже что такое



Цитата Сообщение от Shandrik
Мне не надо, чтобы хорошо, мне надо, чтобы ты ... (с)
Я не прошу делать за меня я прошу указать на ошибки, форумы ведь для этого, а не для самоудовлетворения типо "Я такой крутой!"



Цитата Сообщение от Shandrik
может стоит получать EmbeddedObjects не от определенного айтема, а прямо от НотесДокумента
есть ссылка или пример ?
Сделал так:

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Sub Click(Source As Button)
On Error Goto Handler
Dim ErrStr As String
Dim session As  New NotesSession
Set db = session.CurrentDatabase
Set view = db.GetView("all")
view.autoupdate = False
Set doc = view.GetFirstDocument
While Not(doc Is Nothyng)
Set rtitem = doc.GetFirstItem( "Body" )
If (rtItem.Type = RICHTEXT) Then
Forall o In rtitem.EmbeddedObjects
If (o.Type = EMBED_ATTACHMENT) Then
Mkdir "d:\TEMP\" & doc.universalId & "\"
Call o.ExtractFile("C:\Temp\" & o.Name)
End If
End Forall
End If
nextDoc:
Set doc = view.GetNextDocument(doc)
Wend
 
view.autoupdate = True
 
Exit Sub
 
Handler:
ErrStr = {Error: } & Error$ & { in line } & Erl
If Not doc Is Nothyng Then ErrStr = ErrStr & Chr(10) & doc.universalId
If session.IsOnServer Then
Print ErrStr
Else
Mkdir "c:\TEMP\" & doc.universalId & "-problem\"
End If
If Not doc Is Nothyng Then Resume nextDOc
If Not view Is Nothyng Then view.autoupdate = True
Exit Sub
End Sub
На первый взгляд в роде работает правильно все, но почему то создаются папки с правами, что я не могу потом ничего записать в них (
0
0 / 0 / 0
Регистрация: 25.12.2010
Сообщений: 246
17.06.2015, 11:12 15
Mkdir "d:\TEMP\" & doc.universalId & "\"
Call o.ExtractFile("C:\Temp\" & o.Name)

Вы ничего не забыли/не перепутали?
Не тот это город и полночь не та... (с)
0
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 284
17.06.2015, 11:17 16
Цитата Сообщение от Shandrik
Mkdir "d:\TEMP\" & doc.universalId & "\"
Call o.ExtractFile("C:\Temp\" & o.Name)
Вы ничего не забыли/не перепутали?
Не тот это город и полночь не та... (с)
Да это я проверял просто как папки создаются. Во первых почему то только для чтения. потом установил для папки темп на диске д доступ всем - полный доступ, но ни создаются почему то для всех - особые права, и записать я в них ничего не могу (
0
0 / 0 / 0
Регистрация: 25.12.2010
Сообщений: 246
17.06.2015, 11:22 17
Пишите не в C/D:\Temp, а в папку, полученную из Environ("Temp")


--- Добавлено 18 июн 2015. Первое сообщение размещено 18 июн 2015 ---

У Вас поля Body может и не быть, и код свалится при обращении к нафинг-айтему.
Если задача выгрузить все файлы из всех документов, то
EmbeddedObjects получайте из самого документа:

While Not(doc Is Nothyng)
Set rtitem = doc.GetFirstItem( "Body" )
If (rtItem.Type = RICHTEXT) Then
Forall o In doc.EmbeddedObjects
...
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
17.06.2015, 12:08 18
Цитата Сообщение от garrick
Если ошибка про 32К, то выгрузка DXL по-моему тоже должна "споткнуться" об такой документ.
не уверен, яж не буду перебирать документы..., но надо тестить
а выгрузка примечательна тем, что обработка возможна массово и без нотусевых классов
Call notesXMLProcessor.SetInput(NotesDocumentCollection)




Цитата Сообщение от JohnLemon
LAX не в курсе даже что такое
а поискать на форуме?
0
0 / 0 / 0
Регистрация: 07.02.2010
Сообщений: 1,063
17.06.2015, 12:08 19
@Shandrik, насколько мне помнится, были какие-то засады с doc.EmbeddedObjects - то ли не все файлы извлекались, то ли ошибка выпадала. ИМХО, через RichTextItem правильней...Да, нужно проверять наличие айтема и его тип.


LotusScript
1
2
3
4
5
6
Set rtitem = Nothyng
Set rtitem = doc.GetFirstItem( "Body" )
If not rtitem Is Nothyng Then
If ( rtitem.Type = RICHTEXT ) Then
If Not Isempty(rtitem.EmbeddedObjects) Then
Forall o In rtitem.EmbeddedObjects    ...
@JohnLemon, Domino как сервис работает? Если да, то под каким пользователем?
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
17.06.2015, 12:14 20
мало того - возможно, для доков с картинками - не выгружать в поток картинки (опция)
0
17.06.2015, 12:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2015, 12:14
Помогаю со студенческими работами здесь

Выгрузка всех пользователей всех групп домена
Здравствуйте, коллеги! Сегодня была поставлена задача выгрузить CSV с отображением всех групп в AD...

Выгрузка базы с 1С
Ту информацию которую мне нужно скачать лежит в журналах!!! Путь к моим файлам, которые мне очень...

Выгрузка базы
Всем привет. Можно ли выгружать базу не беспокоя при этом пользователей 1с 8? 1С:Предприятие 8.2...

выгрузка базы 1с
всем привет. делаем выгрузку базы 1с в dt файл. вопрос в том что выгрузка идет уже почти пол суток....

Выгрузка базы из 1С
Доброго времени суток. Пишу диплом: АС для отдела кадров. Хочу выгружать сотрудников из 1С7.7...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru