Двойной вызов

Программирование на Active Server Pages и VBScript.
skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Двойной вызов

Сообщение skiperski » 17.04.2006 (Пн) 12:54

Есть страница которая по шаблону строит документ Word и показывает результат в браузере. Вроде бы как работает, но почему-то вызывается два раза. Т.е. страницу вызываю один раз, а она почему-то создаёт два файла. Кроме того, там ещё пара вопросов. Я впишу их прямо в код.
Код: Выделить всё
<%@ LANGUAGE=VBScript %>
<%Option Explicit

Response.Expires = -100
Response.Buffer = true


Dim FileName, FilePath
Dim WordApp   'Word.Application
Dim WordDoc   'Word.Document

FileName = "report" & GetFormatedDate(Now) & ".doc"
FilePath = "tmp\" & FileName

On Error Resume Next

Set WordApp = Server.CreateObject("Word.Application")
WordApp.Visible = False

'Доп.вопрос: почему не катит Open, а только Add? Потому что DOT?
'Set WordDoc = WordApp.Documents.Open(Server.MapPath("report.doc"), False)
Set WordDoc = WordApp.Documents.Add(Server.MapPath("report.dot"), False)

'форматируем документ
'OrderFields(WordDoc)

'сохраняем документ во временный файл
WordDoc.SaveAs Server.MapPath(FilePath), 0 'wdFormatDocument

WordDoc.Close
Set WordDoc = Nothing

WordApp.Quit
Set WordApp = Nothing

On Error GoTo 0


'выводим данные в поток
FlushDoc FilePath, "application/ms-word"



Dim fso, file
Set fso = Server.CreateObject("Scripting.FileSystemObject")

'удаляем временный файл документа
'удаление закомментарено специально, чтобы видеть сколько файлов получилось
'fso.DeleteFile(Server.MapPath(FilePath))

Response.End



'Возвращает строку даты в формате yyyymmddhhnnss
'Функции Format() в VBScript нет
Function GetFormatedDate(ByVal dt)
   GetFormatedDate = Year(dt)
   GetFormatedDate = GetFormatedDate & Right("00" & Month(dt), 2)
   GetFormatedDate = GetFormatedDate & Right("00" & Day(dt), 2)
   GetFormatedDate = GetFormatedDate & Right("00" & Hour(dt), 2)
   GetFormatedDate = GetFormatedDate & Right("00" & Minute(dt), 2)
   GetFormatedDate = GetFormatedDate & Right("00" & Second(dt), 2)
End Function

'выводит содержимое документа в поток Response.Content
Sub FlushDoc(ByVal FilePath, ByVal ContentType)

   Dim objStream 'ADODB.Stream
   Dim FileName

   FilePath = Replace(FilePath, "/", "\")
   FileName = Mid(FilePath, InStrRev(FilePath, "\") + 1)

   Set objStream = Server.CreateObject("ADODB.Stream")
   objStream.Type = 1
   objStream.Open

   objStream.LoadFromFile Server.MapPath(FilePath)
   Response.ContentType = ContentType
   Response.AddHeader "content-length", objStream.Size
   Response.AddHeader "content-disposition", "inline; filename=" & FileName
   Response.BinaryWrite objStream.Read
   Response.Flush

   objStream.Close
   Set objStream = Nothing

End Sub
%>

Теперь, если выполнить этот код один раз, то в папке tmp получим два файла. Чому так?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.04.2006 (Пн) 13:13

Как именно не катит .Open? У меня катит вот. Другое дело, что шаблон открывается как шаблон, а чтобы открыть его как новый документ на основе шаблона - да, через add.

И, переобъявление FileName внутри FlushDoc - так и задумывалось?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 17.04.2006 (Пн) 13:32

GSerg писал(а):Как именно не катит .Open? У меня катит вот. Другое дело, что шаблон открывается как шаблон, а чтобы открыть его как новый документ на основе шаблона - да, через add.

Так я и думал! Это несущественный вопрос.

GSerg писал(а):И, переобъявление FileName внутри FlushDoc - так и задумывалось?

Ага, передаётся только путь, а из него уже вырезается имя файла. Функция должна быть независима от основной программы. Это только для примера она в общем модуле, а так инклудится.

А вот почему два вызова происходит я не понимаю.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 17.04.2006 (Пн) 14:55

Забыл ещё одно: может можно вообще обойтись без функции FlushDoc() и, соответственно, без промежуточного сохранения документа во временный файл? Специалисты по VBA, подскажИте есть ли у Word.Application или Document что-нибудь вроде TextStream.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.04.2006 (Пн) 15:25

Нету. Если бы был, ух...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 17.04.2006 (Пн) 17:24

Жаль.

И всё-таки интересует ответ на основной вопрос: почему вызов происходит дважды? Причём, если вызывать по частям, т.е. отдельно саму конвертацию и сохранение в файл или только вывод сохранённого файла, то всё работает нормально. А вот вместе они как-то странно себя ведут.

И хочется убедиться, что это не у меня глюки. Проверьте, пожалуйста, у себя. Код есть, нужен любой вордовский темплейт и папка tmp. В коде поменять имя темплейта и можно тестировать. Если не в лом, сделайте доброе дело.


Вернуться в ASP и VBScript

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList