Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как открыть Word для просмотра содержимого OLE? / 25 сообщений из 29, страница 1 из 2
30.09.2004, 23:14:20
    #32719271
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Что-то не найду никак...

Есть [Таблица], в ней [Поле] ("Поле объекта OLE"). В нем живет word'овский документ. Можно ли открыть word с этим документом, не создавая временного файла и не используя для этого форм? Цели сохранить изменения, сделанные в word'е, обратно в поле не стоит.

Спасибо.
...
Рейтинг: 0 / 0
30.09.2004, 23:29:35
    #32719280
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
А дубель-кряк по этому полю разве делает не это?
...
Рейтинг: 0 / 0
01.10.2004, 00:42:21
    #32719315
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Хочется программно, не используя при этом форм и временных файлов.
...
Рейтинг: 0 / 0
01.10.2004, 01:17:44
    #32719323
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
хто база (MS SQL или мдб)
через что планируется доступ (ДАО или АДО)
и ПОЧЕМУ без форм и файлов???????

Думаю, СОВСЕМ без файлов не обойтись.
Особенно, если хранятся именно доки и именно в двоичном вордовом оле формате
- с разделами, вложенными доками и картинами.

Для простых текстов можно просто вставлять содержимое в (новый) док
из stream или задействовать getChunk



(с выражением лица)
...
Рейтинг: 0 / 0
01.10.2004, 09:38:14
    #32719480
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
хто база (MS SQL или мдб)
mdb
через что планируется доступ (ДАО или АДО)
DAO
и ПОЧЕМУ без форм и файлов???????
Хочу часть отчетов хранить в базе, и формировать их в ворде. Сохранять при этом их не требуется. Обрабатывать паровоз возможных ошибок при работе с файлами (файл уже есть, файл не получается удалить, файл не успел удалиться, трам-пам-пам) нет никакого желания. И таскать дополнительную форму из программы в программу тоже неудобно. :(
Для простых текстов можно просто вставлять содержимое в (новый) док
из stream или задействовать getChunk
А вот здесь поподробнее можно? Как в новый док из stream класть данные? Или это имеется в виду именно текст вообще без форматирования?
...
Рейтинг: 0 / 0
01.10.2004, 10:51:02
    #32719633
aleks3
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Посмотри по этому адресу

Практическая работа с Word.

Хотя статья предназначена для начинающих, надеюсь, что и более опытные программисты найдут в ней кое-что полезное. Например, работу с Word без файлов на диске.



http://hiprog.com/access/article.asp?id=379
...
Рейтинг: 0 / 0
01.10.2004, 10:56:10
    #32719647
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Спасибо :)
...
Рейтинг: 0 / 0
01.10.2004, 11:02:08
    #32719671
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Но это через форму. Не то. Так я умею.
Форму не надо (во всяком случае пока жива надежда на возможность обойтись без нее)...
...
Рейтинг: 0 / 0
01.10.2004, 11:09:50
    #32719701
aleks3
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
те как без формы не понятно
...
Рейтинг: 0 / 0
01.10.2004, 11:15:45
    #32719721
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Есть
Код: plaintext
currentdb.openrecordset("select myOLE from MyTable").fields(0)
есть
Код: plaintext
1.
dim wa as object
set wa = createobject("word.application")
хочу посмотреть в word'е содержимое поля myOLE таблицы MyTable, которое суть вордовый же документ. При этом не хочу таскать за процедурой форму из одного поля, не хочу создавать файлы для того, чтобы сохранять на диске то, что и так там есть, и есть в памяти.
...
Рейтинг: 0 / 0
01.10.2004, 15:24:13
    #32720228
CtrlAlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Так приравнять переменные скорее всего не получится, подозреваю у них разный формат объекта. Если же насильно переопределить, то возможны всяческие глюки. Если чрез файл не хочется, то можно таки через форму. Но форму не сохранять и не показывать.
Вот код, правда для Excel (Word хуже знаю).

Код: plaintext
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.
Sub OpenExcel()
Dim F As Form
Dim C As BoundObjectFrame
Dim Name As String

Set F = CreateForm
F.Visible = False

F.RecordSource = "TableExcel"

Set C = Application.CreateControl(F.Name, acBoundObjectFrame, , , "Pole_Excel")
C.Verb = - 2 
Name = F.Name
DoCmd.OpenForm Name, acNormal, , , acFormReadOnly, acHidden
Forms(Name).Controls( 0 ).Action = acOLEActivate
With Forms(Name).Controls( 0 ).Object.Application
    .UserControl = True
    .Sheets.Copy
    .ActiveWorkbook.Saved = True
End With

DoCmd.Close acForm, Name, acSaveNo
Set C = Nothing
Set F = Nothing
End Sub
...
Рейтинг: 0 / 0
01.10.2004, 15:35:38
    #32720263
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
2Олл

Чем дальше, тем страшнее.

В случае с временными файлами:

Поскольку других способов я не нашел, стал делать через файл. Мышой кладу в OLE-поле файл Word размером 40 кб. Затем пытаюсь сохранить его на диск посредством GetChunk. Оказывается, что FieldSize у этого поля порядка 80 кб. Естественно, открыть такой файл не получается. Можно, конечно, класть файл в базу посредством AppendChunk, но это не удобно, хочется оставить себе возможность редактировать эти отчеты прямо из Access, не делая лишних движений.

Кроме того, в заголовке ворда вылезает тем более корявое название, чем более страшное имя я даю временному файлу. Но по сравнению с предыдущим это неважно.

В случае с использованием контрола OLE:

При Action = acOLEActivate Word сразу становится Visible, вне зависимости от того, был ли он до этого загружен в память с установкой visible=false, или нет. Это неудобно - либо лишнее моргание пользователю при подготовке отчета:
Код: plaintext
1.
forms("myform")("myole").action = acoleactivate
getobject(,"word.application").visible=false
либо он будет сидеть, не касаясь клавиатуры и мыши, и "нервно курить" (с) не помню чей, пока в загруженном шаблоне отчета программа расставит необходимые данные.

Как победить хоть что-нибудь из этого?

2СtrlAlt
Аналогично, и, кроме того, форму все равно придется делать заранее, иначе эта программа не будет работать в mde.
...
Рейтинг: 0 / 0
01.10.2004, 15:38:55
    #32720272
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Сейчас еще попробую http://www.sql.ru/forum/actualthread.aspx?tid=17943
, но это сразу и "дополнительная форма" и "временный файл", то есть совершенно противоположный желаемому способ.
...
Рейтинг: 0 / 0
01.10.2004, 15:46:03
    #32720292
Hummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
2 Geo
Вот поэтому я никогда не работаю с OLE в аксесе. Всё время использую BLOB поля - и проблем не знаю. Пользователи просто после редактирования в ворде указывают путь к файлу в аксесе для сохранения изменений и всё...
Да, неудобнее чем в ОЛЕ в Аксесе, зато легко переносимо на НЕТ:)
...
Рейтинг: 0 / 0
01.10.2004, 16:06:24
    #32720359
CtrlAlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Я тоже OLE не использую. Глючное оно.
...
Рейтинг: 0 / 0
01.10.2004, 16:41:15
    #32720462
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
2 Geo

не надо ОЛЕ оно много места жрет, глючное

заливай файлы целиком
...
Рейтинг: 0 / 0
01.10.2004, 20:25:14
    #32720860
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Вероятно, вы правы. Так и буду делать. Спасибо всем :)
...
Рейтинг: 0 / 0
02.10.2004, 02:17:50
    #32720974
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
апаздал.
день был плохой, а понеделник будет еще хуже...
((;;;

Geo
Или это имеется в виду именно текст вообще без форматирования?

Да.

Касательно собственно изначальной постановки - рабочих "советов" у меня нет.
Если ослабить требование на недопустимость временного файла, то близким к запрошенному выглядит такой вариант - вставить файл без установления связи, после чего удалить временный файл.
с пропуском доступа к базе и с точностью до обработки ошибок:

Код: plaintext
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.
  'это путь к каталогу, в который будем сыпать временные файлы 
 'типа можно хадействовать  
 'Public Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _ 
 '(ByVal nBufferLength As Long, ByVal lpBuffer As String) As LongDim strFileFavoritePath As String 
  strFileFavoritePath = "C:\ТРампампам\Временные документы\"
   '----------------------------- 
   'здесь высыпали файлы (не приводится), дальше работаем с вордом 
   '------------------------ 
  
  Dim wordApp As Word.Application
  Dim wrdDoc As Word.Document
   '... 
  Set wordApp = New Word.Application
   'создаем новый пустой файл по умолчательному образцу normal.dot 
  Set wrdDoc = wordApp.Documents.Add(DocumentType:=wdNewBlankDocument, Visible:=False)
  
   'меняем дефолтный каталог для открытия файлов на свой любимый 
   wordApp.ChangeFileOpenDirectory strFileFavoritePath
    wrdDoc.Range( 0 ,  0 ).InsertFile FileName:="ChunkedFromDB.doc", Range:="", _
        ConfirmConversions:=False, Link:=False, Attachment:=False
        
    'типа удалим временный файл 
   Kill strFileFavoritePath & wordApp.PathSeparator & "ChunkedFromDB.doc"

    'вернем взад дефолтный каталог для открытия файлов  
    дефолтный каталог для открытия файлов 
   wordApp.ChangeFileOpenDirectory wordApp.Options.DefaultFilePath(Path:= 0 )
 
    'отобразим результат 
   wrdDoc.Windows(wrdDoc.Name).Visible = True
      




Geo
mdb
DAO

тохды чанки...


Geo
Хочу часть отчетов хранить в базе, и формировать их в ворде.


не поняль...
тут как бы две задачи в одной можно вычитать.
1) документохранилище - хранить в виде документов Word сформированные отчеты как "твердые электронные копии".
2) документ Ворд как описатель
(и, возможно - приложение Ворд как конструктор) отчета,
по которому некий механизм исполнения будет строить отчет.

все-таки любопытно - куда рулить будешь?


Geo
Сохранять при этом их не требуется. Обрабатывать паровоз возможных ошибок при работе с файлами (файл уже есть, файл не получается удалить, файл не успел удалиться, трам-пам-пам) нет никакого желания. И таскать дополнительную форму из программы в программу тоже неудобно. :(


форма, как видно, не потребуется.
А кое-что про ошибки все-таки придется. Но не страшный паровоз....


ЗЫ
щё раз пардону за влезание в закрытый топик...
...
Рейтинг: 0 / 0
02.10.2004, 17:13:14
    #32721123
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Victoshaне поняль...
тут как бы две задачи в одной можно вычитать.
1) документохранилище - хранить в виде документов Word сформированные отчеты как "твердые электронные копии".
2) документ Ворд как описатель
(и, возможно - приложение Ворд как конструктор) отчета,
по которому некий механизм исполнения будет строить отчет.
все-таки любопытно - куда рулить будешь?

Нужно 2) - в базе живет шаблон отчета, который, при наличии достаточных прав, пользователь может изменять, придерживаясь определенных правил, чтобы программа потом могла этот шаблон заполнить. Сложный генератор мне не нужен, пока делаю для простых отчетов с небольшим количеством данных, которые проще сделать в ворде, чем в Access.

Хотелось для наглядности отображать эти шаблоны при просмотре/редактировании (именно шаблоны, а не сами отчеты) в OLE-полях, а формировать уже в ворде. Но как-то не получается. Поэтому сделал, как подытожил АлексейК - в базе живут шаблоны, вставленные не посредством оле-полей, а залитые из файлов.
...
Рейтинг: 0 / 0
02.10.2004, 19:48:47
    #32721165
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
кажется, поняль...
думаю, приведенный мной код не пригодится за ненадобностью.


(с выражением лица)
...
Рейтинг: 0 / 0
03.10.2004, 14:41:40
    #32721312
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Попутно еще вопрос родился. Помогите малограмотному. Сел перечитывать, что я вчера наковырял:

Код: plaintext
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.
  Dim ff As Integer
  Dim b() As Byte
  Dim rs As DAO.Recordset
  Dim lSizeFile As Long
  Dim lOffsFile As Long
  Dim s As String
  
  Const BufSize =  32768 
  
  Set rs = трам-пам-пам
  s = трум-пум-пум  ' путь и имя к файлу 
    
  lSizeFile = FileLen(s)
  ff = FreeFile
  ReDim b(BufSize)
  Open s For Binary Access Read As #ff
  rs.Edit
  rs![Содержимое] = Null
  Do While lOffsFile < lSizeFile
    Get #ff, , b
    rs("Содержимое").AppendChunk b()
    lOffsFile = lOffsFile + BufSize
  Loop
  rs.Update
  Close #ff
  Kill s

Это работает, но я не понимаю, почему. Размер файла не кратен размеру буфера (буфер 32 кб, а файл 40 кб). Почему акцесс правильно читает файл? У него в байтовом массиве где-то хранится количество заполненных элементов, или что?

Т.е. я бы понял, если б он со строкой так работал, но для строки, видимо, концом у него является нуль-символ или аналог, если в этом тексте заменить массив на строку, то читается (и записывается) небольшой кусок от необходимых 40 килобайт. А в массив-то они куда заполненность прикрутили?
...
Рейтинг: 0 / 0
03.10.2004, 15:34:11
    #32721329
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
хотя вру...
При чтении файла поле заполняется неправильно, как и ожидалось, размер его после выполнения вышеуказанного кода кратен 32 килобайтам. Это я поправил, а почему при записи в файл из поля его размер получается правильным??

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  ReDim b(BufSize -  1 )
  Open s For Binary Access Write As #ff
  Do While lOffsFile < lSizeFile
    b() = rs![Содержимое].GetChunk(lOffsFile, _
                                   IIf((lOffsFile + BufSize) > lSizeFile, _
                                       lSizeFile - lOffsFile, _
                                       BufSize))
    Put #ff, , b()
    lOffsFile = lOffsFile + BufSize
  Loop
...
Рейтинг: 0 / 0
03.10.2004, 16:58:58
    #32721343
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
Geoхотя вру...
При чтении файла поле заполняется неправильно, как и ожидалось, размер его после выполнения вышеуказанного кода кратен 32 килобайтам. Это я поправил, а почему при записи в файл из поля его размер получается правильным??

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  ReDim b(BufSize -  1 )
  Open s For Binary Access Write As #ff
  Do While lOffsFile < lSizeFile
    b() = rs![Содержимое].GetChunk(lOffsFile, _
                                   IIf((lOffsFile + BufSize) > lSizeFile, _
                                       lSizeFile - lOffsFile, _
                                       BufSize))
    Put #ff, , b()
    lOffsFile = lOffsFile + BufSize
  Loop


патамушта F1=
F1 DAO360.chm GetChunk
The data that a GetChunk call returns is assigned to variable. If Size is greater than the remaining data, the GetChunk method returns only the remaining data without padding variable with empty spaces. If the field is empty, the GetChunk method returns a null value.

В переводе на русский это означает, что инициализация массива в твоем коде не нужна - GetChunk всегда возвращает указатель на НОВЫЙ массив.

иметь ввиду два обстоятельства
1) если читаешь "поле мемо", то возвращать результат getchunk можно в строку. если поле "ОЛЕ", то ТОЛЬКО в байтовый массив.
2) GetChunk глючит, если используется на рекордсете, образованном на запросе с группировкой - http://support.microsoft.com/default.aspx?scid=kb;en-us;250640
...
Рейтинг: 0 / 0
03.10.2004, 17:06:57
    #32721349
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
авторпатамушта F1=

Благодарствую :)

Все работает, спасибо.
...
Рейтинг: 0 / 0
03.10.2004, 17:07:40
    #32721351
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть Word для просмотра содержимого OLE?
еще замечание

если размеры файла/поля не слишком велики - читай все за раз-
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  Dim b() As Byte
  
  Dim rS As DAO.Recordset
  Dim tField As DAO.Field
  
  Set rS = db.OpenRecordset("ТвойЗапрос")
  Set tField = rS.Fields![ТвоеПолеОле]
 <...>  
  b() = tField.GetChunk( 0 , tField.FieldSize)
   <...>  

  rS.Close
либо поэкспериментируй с размером чанка, в целях определения общй максимальной производительности, величинами кратными размеру страницы - типа 4 - 8 - 16 - 32 кб, для а97 начинать с 2х кб.
То ли придумалось, то ли вспомнилось - по совокупности затрат для А97 на "всем старом" встречалась рекомендация в 8 кб



(с выражением лица)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как открыть Word для просмотра содержимого OLE? / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]