|
|
|
Хранение документов в БД
|
|||
|---|---|---|---|
|
#18+
Не знаю, может быть стоило поместить этот вопрос в другой форум? :-( В своей БД храню документы (для простоты возьмем, например, тот же MS OFFICE). Для их редактирования выдираюих из БД во временный файл, и запускаю нужное приложение с параметром-именем файла. После внесения изменений пользователь сохраняет документ. Как отследить и обновить БД? Интересует сам принцип, язык любой, система - Windows. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 18:29:34 |
|
||
|
Хранение документов в БД
|
|||
|---|---|---|---|
|
#18+
Енто действительно скорее в другой форум. авторКак отследить и обновить БД? Надо пользовать OLE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 18:33:10 |
|
||
|
Хранение документов в БД
|
|||
|---|---|---|---|
|
#18+
DnicoНадо пользовать OLE. Согласен, это в случае если есть клиент как отдельное приложение. Но, предположим, существует еще и сайт, на котором по поисковому запросу выдается ссылка на документ. При клике на ссылке документ выдирается из БД, и помещается в тмп-файл скриптом на сервере. В ходе раздумий во время написания поста пришел к тому, что необходимо там же на сервере неким скриптом проверять дату изменения тмп-файла, и в случае отличия ее от предыдущей, обновлять БД. Никакой событийной модели взаимодействия с сервером БД похоже просто не может существовать в принципе. А как хотелось бы :-(((. PS. Подарите мне губозакаточную машинку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 18:45:47 |
|
||
|
Хранение документов в БД
|
|||
|---|---|---|---|
|
#18+
Ну тут можно в PHP или Perl обрабатывать события скорее всего и запихивать все обратно. Точно не скажу - не занимался ... Best regards, Dnico. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 18:54:04 |
|
||
|
Хранение документов в БД
|
|||
|---|---|---|---|
|
#18+
Dr_MikeНе знаю, может быть стоило поместить этот вопрос в другой форум? :-( В своей БД храню документы (для простоты возьмем, например, тот же MS OFFICE). Для их редактирования выдираюих из БД во временный файл, и запускаю нужное приложение с параметром-именем файла. После внесения изменений пользователь сохраняет документ. Как отследить и обновить БД? Интересует сам принцип, язык любой, система - Windows. У меня все просто - программа спрашивает у ползателя заносить ли измененный документ обратно в базу. Потому как вполне реальна такая ситуация: ползатель может вытащить документ, подправить его и отправить кому-нибудь по почте, но при этом изменения в базу вносить не надо. Следовательно, даже если отследиш, что документ был изменен - это еще не значит, что его необходимо изменять в базе. А изменения можно отследить по дате создания/последнего изменения, к примеру, или при помощи функции WIN API ReadDirectoryChanges ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 10:32:08 |
|
||
|
Хранение документов в БД
|
|||
|---|---|---|---|
|
#18+
мне кажется, документы в бд должны состоять из объектов бд, тоесть записей в таблицах. тогда штатные средства работы с бд, позволят эффективную работу с такими документами, иначе ваша система будет сильно зависеть от разработчиков третьего софта. в оффисные форматы можно выводить документы только в виде копии, ни к чему не обязывающей саму бд. а все изменения в бд, делать через соответствующие интерфейсы разработанные не какой-то малоизвестной майкрософт, а уважаемым васей пупкиным, как бы нелепо это не звучало :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 10:35:36 |
|
||
|
Хранение документов в БД
|
|||
|---|---|---|---|
|
#18+
Ну а вот как я, великий и ужасный, делаю. После экспериментов c MS Word + TOleContainer, а потом c MS Word + OLE я остановился на след. схеме: Использую компонент TWordApplication. Документы можно: Код: plaintext 1. 2. 3. 4. Схема такая: Чтобы отредактировать документ в табличке ATableName в поле AFieldName (идентификатор записи (Integer) AId), я вызываю процедуру: Код: plaintext 1. Таким образом, можно окрывать для редактирования любое число документов, не зависимо от состояния текущего курсора в рабочей базе. Все открытые документы фиксируются в специальном объекте типа TWordDocumentsCortage. Код: 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. Ну так вот, в компоненте TWordApplication обработчики OnDocumentBeforeClose и OnDocumentBeforeSave выполняют сохранение документов в базу. Вот: Код: 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. И вот: Код: 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. Вот, в общем, и все. Ну, вот еще мелочи - создание документа из шаблона: Код: 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. А вот функция редактирования: [SRC Delphi] procedure TForm1.EditDoc(ATableName, AFieldName : String; AId : Integer); var i : integer; DQry : TpFIBQuery; PDoc : PWordDocCortage; tmpFileName : String; FileName : OleVariant; begin PDoc := wdCortage.Doc('TBL', AId); // Смотрим в кортеже DQry := TpFIBQuery.Create(Self); try wdApp.Disconnect; if wdApp.Application <> nil then wdApp.Connect; DQry.Database := dbMain; DQry.Transaction := trWrite; if not DQry.Transaction.InTransaction then DQry.Transaction.StartTransaction; if not Assigned(PDoc) then // В кортеже нет, загружаем из базы try tmpFileName := NewTmpFile(); DQry.SQL.Text := 'Select ' + AFieldName + ' from ' + ATableName + ' Where ' + ATableName + '_ID = :ID'; DQry.Prepare; DQry.ParamByName('ID').AsInteger := AId; DQry.ExecQuery; DQry.FieldByName(AFieldName).SaveToFile(tmpFileName); if DQry.Transaction.InTransaction then DQry.Transaction.Commit; except on E : Exception do begin if DQry.Transaction.InTransaction then DQry.Transaction.Rollback; raise Exception.Create('Ошибка при загрузке документа из бызы'+ #13 + E.Message); end; end else // Found! - есть в кортеже, открываем существующий tmpFileName := PDoc^.FileName; if not FileExists(tmpFileName) then raise Exception.Create('Файл с документом не был создан!'); FileName := tmpFileName; OpenDoc(tmpFileName); // Открываем документ по имени файла wdApp.Visible := False; wdApp.Visible := True; wdApp.ActiveWindow.WindowState := wdWindowStateMinimize; wdApp.Documents.Item(FileName).Activate; wdApp.ActiveWindow.SetFocus; wdApp.ActiveWindow.WindowState := wdWindowStateMaximize; if not Assigned(PDoc) then // Отсутствует wdCortage.Add(ATableName, AFieldName, tmpFileName, dtMain.FieldByName(ATableName+'_Id').AsInteger) finally DQry.Free; end end; [/src] Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 15:12:04 |
|
||
|
Хранение документов в БД
|
|||
|---|---|---|---|
|
#18+
Вах, функция редактирования не отформатировалась: Код: 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 15:14:22 |
|
||
|
|

start [/forum/topic.php?fid=40&fpage=457&tid=1578053]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 370ms |

| 0 / 0 |
