Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: хранение файлов с помощью Аксесса
 
 автор: Едрёныч   (19.12.2013 в 21:01)   личное сообщение
 
 

нужен совет по организации хранения файлов ( сканкопий договоров и приложений к ним). Как решаете такие задачи? Я поле гиперссылку создал, в котором храню ссылки к файлам, а вы как?

  Ответить  
 
 автор: Alex   (19.12.2013 в 21:06)   личное сообщение
 
 

Не, гиперссылка не удобно.
В БД хранить только путь + имя файла, а открывать в родном (для файла) приложении.
Вот:

Справочник разработчика MSAccess

Запуск программы, папки или документа

Декларируем:
Private Declare Function apiShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal Hwnd As Long, _
ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long

Public Const WIN_NORMAL = 1 'Открыть в Normal
Public Const WIN_MAX = 2 'Открыть в Maximized
Public Const WIN_MIN = 3 'Открыть в Minimized
Private Const Error_SUCCESS = 32&
Private Const Error_NO_ASSOC = 31&
Private Const Error_OUT_OF_MEM = 0&
Private Const Error_FILE_Not_FOUND = 2&
Private Const Error_PATH_Not_FOUND = 3&
Private Const Error_BAD_FORMAT = 11&

Обращение к функции:
strFile - полный путь к файлу который требуется запустить
lShowHow - в каком виде будет открыто приложение (смотрите декларирование констант)

Function fHandleFile(stFile As String, lShowHow As Long)
Dim lRet As Long, varTaskID As Variant
Dim stRet As String
lRet = apiShellExecute(hWndAccessApp, vbNullString, _
stFile, vbNullString, vbNullString, lShowHow)
If lRet > Error_SUCCESS Then
stRet = vbNullString
lRet = -1
Else
Select Case lRet
Case Error_NO_ASSOC:
varTaskID = Shell("rundll32.exe shell32.dll,OpenAs_RunDLL " & stFile, WIN_NORMAL)
lRet = (varTaskID <> 0)
Case Error_OUT_OF_MEM:
stRet = "Error: Out of Memory/Resources. Couldn't Execute!"
Case Error_FILE_Not_FOUND:
stRet = "Error: File not found. Couldn't Execute!"
Case Error_PATH_Not_FOUND:
stRet = "Error: Path not found. Couldn't Execute!"
Case Error_BAD_FORMAT:
stRet = "Error: Bad File Format. Couldn't Execute!"
Case Else:
End Select
End If
fHandleFile = lRet & _
IIf(stRet = "", vbNullString, ", " & stRet)
End Function

Примеры использования:
Открыть папку: fHandleFile("C:\TEMP\",WIN_NORMAL)
Послать письмо: fHandleFile("mailto:dash10@hotmail.com",WIN_NORMAL)
Открыть URL: fHandleFile("http://home.att.net/~dashish", WIN_NORMAL)
Запустить приложение: fHandleFile("С:\Winnt\notepad.exe", Win_NORMAL)

Автор: Dev Ashish

  Ответить  
 
 автор: Alex   (19.12.2013 в 21:47)   личное сообщение
 
 

Чуть не забыл!

Private Declare Function apiShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal Hwnd As Long, _
ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long

Это на самом деле одна строка! Знаки переносов нужно убрать. Никак работать не хотела пока не сообразил

  Ответить  
 
 автор: Alex   (19.12.2013 в 21:57)   личное сообщение
 
 

Вот еще нашел здесь же: http://www.hiprog.com/forum/read.php?id_forum=1&id_theme=11238&page=2
То же самое, только намного проще.

Только у меня глючит обработчик ошибок. Заремил его - работает. Правда переспрашивает: безопасно ли открывать файл.

  Ответить  
 
 автор: Alex   (19.12.2013 в 22:12)   личное сообщение
 
 

Вот так работает:

Private Sub Кнопка4_Click()
Call FHLinkOpen(ПутьКФайлу)
End Sub


Public Function FHLinkOpen(snamef$) As Boolean
On Error GoTo FHLinkOpen_Err
Application.FollowHyperlink snamef$, , True
FHLinkOpen = True
FHLinkOpen_Exit:
Exit Function
FHLinkOpen_Err:
MsgBox Error$
FHLinkOpen = False
Resume FHLinkOpen_Exit
End Function

p.s. работает не совсем корректно - jpg открывает в эксплорере , хотя acdsee для этого предназначена....

  Ответить  
 
 автор: Едрёныч   (19.12.2013 в 23:27)   личное сообщение
 
 

тут вопрос шире, как у вас организовано хранение? Ведь у каждого рамочного договора есть много приложений, а к ним, в свою очередь, может быть по несколько доп. соглашений. Как вы храните такую информацию, всё в одной таблице или в разных таблицах?

  Ответить  
 
 автор: snipe   (20.12.2013 в 06:05)   личное сообщение
 
 

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

для юзера процедура выглядит следующим образом
заполняется запись в форме, нажимается кнопка прикрепить документ, открывается форма выбора файла, юзер выбирает и все
в это время происходит копирование файла в создаваемую папочку с именем ID записи

как-то так

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList