powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вложения в Access 2007
18 сообщений из 18, страница 1 из 1
Вложения в Access 2007
    #36542182
Kvasnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть база книг в Access 2007, фотография обложки каждой книги сохранена в поле «вложение».
Мне надо организовать поиск книг по разным параметром, что бы в результате пользователь видел фотографии всех найденных им книг.
Проблема в том, что очевидное решение - сформировать запрос и создать на его основе ленточную форму не совсем подходит. Необходимо, что бы все обложки шли не друг под другом, а отображались на одной форме слева направо.
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #36542309
Роман.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kvasnikov
Вы себе все усложняете.Ленточная форма оптимальное решение,но если хотите по другому,то
1.Можно сделать обычную форму на основе Вашего запроса ,отображайте по одной обложке и перемещайтесь по записям стандартными кнопками Вперед и назад.
2.Можно сделать обычную форму на основе Вашего запроса ,положить на неё к примеру три имажда и программировать кнопки вперед и назад для отрисовки следующих обложек
3.Можно на обычную форму навтыкать (программно) кучу контролов ,что бы увидеть ка вы хотите ВСЕ обложки сразу, но если к примеру их будет 100 и более ,то смысл теряется ,картинки то будут маленькие.

имхо предпочтительные варианты это ленточная форма и первый пункт
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #36542407
Kvasnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Роман.2.Можно сделать обычную форму на основе Вашего запроса ,положить на неё к примеру три имажда и программировать кнопки вперед и назад для отрисовки следующих обложек
Вот у меня как раз с этим загвоздка - я располагаю на форме три объекта "вложение" и они все отображают одну и ту же картинку - не понимаю как им задать отображение разных картинок.
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #36542812
Роман.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kvasnikov,
В базе оптимально хранить пути к картинкам,с сами файлы отдельно.
В форме источник данных запрос с полем "путь" ,плюс поле счетник от 1 до N (как в запросе сделать счетчик см фак).На форме три объекта "Рисунок" -все отвязвнные ,на событие "ОбластьДанных_Format"
вешаете обработчик где и отрисовываете Ваши обложки по три штуки
например
Код: plaintext
1.
2.
3.
Me.Рисунок1.Picture =МояФункция( 1 )
Me.Рисунок2.Picture =МояФункция( 2 )
Me.Рисунок3.Picture =МояФункция( 3 )
даллее программируете кнопки назад и вперед-алгоритм продумайте сами
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #36544330
Kvasnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил размещать картинки, только не по три, а все сразу, поэтому придется их размещать налету.
Первая проблема с которой столкнулся, как мне отчистить форму, то есть удалить все уже имующиеся контролы на ней, что бы заново разместить необходимое количество картинок.
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #36544482
Роман.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kvasnikov,
Не понял проблемы.Что мешает удалить все контролы в конструкторе ? или содать новую чистую форму?
Далее создавайте все контролы налету.Ищите по форуму "CreateControl" и смотрите примеры.Вообще это способ достаточно геморойный и не нужный.Представьте что надо будет вывести 200 обложек на одной форме.Вы замучаетесь выставлять размеры и позиции контролов, к тому же картинки будут маленькие и в них не разглядишь рисунок .Какой в этом смысл ? Не идите на поводу у заказчика,предложите ему другой вариант.Ленточная форма и первые два варианта будут работать гораздо быстрее .Представьте что кроме 200 картинок Ван нужно ещё будет вывести Названия ,комментарии и т.д. .Имхо в Вашем случае этот вариант худший.
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #36544753
Kvasnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Роман, мне Ваш вариант тоже больше нравится, но надо сделать так, что бы найденные книги были сгруппированы по автору, тематике и т.д., а в ленточной форме это получается очень криво.
Я понимаю все сложности создания динамической формы, но в данном случае только она обеспечить наиболее качественный результат.

Я знаю как создавать объекты через "CreateControl", проблема в другом - у меня есть готовая пустая форма, я ее открываю, размещаю на ней изображение всех обложек и сохраняю эту форму, что бы пользователю не предлагали сохранить ее при выходе. То есть теперь моя пустая форма превратилась в заполненную форму и перед выводом результатов следующего запроса мне надо удалить на этой форме все существующие объекты - вот как это сделать я не знаю.
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #36545473
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kvasnikovно надо сделать так, что бы найденные книги были сгруппированы по автору, тематике и т.д., а в ленточной форме это получается очень криво.
Такое очень даже неплохо получается когда на главной форме без источника помещается ленточная форма и элемент ею управляющий - список, комбобокс, другая подформа. В управляющем контроле выбираем группу, которую надо смотреть в ленточной. Ленточная (или табличная) форма фильтруется по выбранной группе. Получается отчетливый интерфейс с хорошо выраженной структурой.
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #36545620
Роман.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автормне надо удалить на этой форме все существующие объекты - вот как это сделать я не
знаю
Код: plaintext
DeleteControl
Вам в помощь
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #36545621
Роман.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
Do While Forms("Форма1").Controls.Count >  0 
    Application.DeleteControl "Форма1", Forms("Форма1").Controls( 0 ).Name
Loop
удалит все контролы.
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #36545660
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман.
Код: plaintext
1.
2.
Do While Forms("Форма1").Controls.Count >  0 
    Application.DeleteControl "Форма1", Forms("Форма1").Controls( 0 ).Name
Loop
удалит все контролы.Непременное условие для исполнения - форма должна быть в режиме конструктора.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вложения в Access 2007
    #39370663
Djois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kvasnikov,
Добрый день/ вечер, вижу что давно поднимали вопрос по полю с типом вложение, может подскажите способ как можно программно или с помощью SQL его очистить.
Запросом на обновление не выполняется (пишет что ...запрос не может включать поле, допускающее одновременно несколько значений.)
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #39371290
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Djois,

Я знаю способ работы с полями для нескольких значений через Recordset2.
Соответственно, только через VBA.
Ищите по этому ключевому слову
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #39372436
Djois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игортан, спасибо

как программно очистить вложение разобрался (более или менее)
но нужно это делать массово, отбирать записи по дате и очищать поле с вложениями
попытался сделать функцию
получилось что-то вроде этого
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 Public Function DeleteAttacmtnV(codI As Integer)
    Dim rst As DAO.Recordset, rst1 As DAO.Recordset
    Dim Cod, Counter
    Cod = codI
        Set rst = CurrentDb.OpenRecordset("select * from T_PlanDepartament where Cod=" & codI)
        rst.Edit
        Set rst1 = rst.Fields("FileV").Value
        Counter = rst1.AbsolutePosition
If Counter = -1 Then
         Exit Function
         Else
         While Counter <> -1    'ничего лучше не придумал как в цикле чистить если в вложении несколько файлов
           rst1.Delete
           rst.Update
        Set rst = CurrentDb.OpenRecordset("select * from T_PlanDepartament where Cod=" & codI)
        rst.Edit
        Set rst1 = rst.Fields("FileV").Value
        Counter = rst1.AbsolutePosition
        'MsgBox rst1.AbsolutePosition
        Wend
End If
End Function


с одной записью справляется хорошо, но когда массово запускаю (в запросе) что-то не клеится, отрабатывает но чистит не всё
поковыряюсь ещё, может и разберусь
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #39372503
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Djois,

Для поля с вложением нужно использовать DAO.Recordset2
не два рекордеста
это есть тип рекордсета для работы именно с этими полями
не нашел сейчас примера старого....
порезал...перешел на сохранение картинок в папке рядом с бд.

что то вы здесь намудрили.
Где здесь цикл прохода по записям главного запроса
и зачем во вложеном цикле открываете рекордсет заново?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
If Counter = -1 Then
         Exit Function
         Else
         While Counter <> -1    'ничего лучше не придумал как в цикле чистить если в вложении несколько файлов
           rst1.Delete
           rst.Update
        Set rst = CurrentDb.OpenRecordset("select * from T_PlanDepartament where Cod=" & codI)
        rst.Edit
        Set rst1 = rst.Fields("FileV").Value
        Counter = rst1.AbsolutePosition
        'MsgBox rst1.AbsolutePosition
        Wend
End If


На сколько помню и логически правильно:
Открываем рекордсет
заходим в цикл для прохода строк рекордсета
в нем уже открываем рекордсет2
и в рекордсете2 уже в цикле пробегаем по вложениям
конец цикла рекордсета2
конец цикла рекордсета
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #39373362
Djois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игортан,
ИгортанДля поля с вложением нужно использовать DAO.Recordset2
Спасибо большое, обязательно попробую, я вообще решил что 2 это очепятка :)

Игортани зачем во вложеном цикле открываете рекордсет заново?
если в вложении больше 1 файла второй и последующий не удалялись без этого, возможно с DAO.Recordset2 такого и не будет.
и после программного удаления база чистится не полностью т.е. если я все вложения почищу через VBA- сожму БД? размер будет значительно больше чем если удалить поле с вложением и сжать базу. (Опять же возможно что с DAO.Recordset2 это пройдё)
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #39373371
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Djois,

Сейчас на коленке переписал своим видением кода.
Не гарантирую, нужно проверить.

В своем первом посте я это и имел ввиду
Ну и обработчик ошибок сюда же добаить
Код: vbnet
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.
Public Function DeleteAttacmtnV(codI As Integer)
Dim rst As DAO.Recordset, rst1 As DAO.Recordset2

Set rst = CurrentDb.OpenRecordset("select * from T_PlanDepartament where Cod=" & codI)
If Not rst.EOF Then
    While rst.AbsolutePosition > 0
        rst.Edit
        Set rst1 = rst.Fields("FileV").Value
        If Not rst1.EOF Then
            While rst1.AbsolutePosition > 0
                rst1.Delete
            
    '        Set rst = CurrentDb.OpenRecordset("select * from T_PlanDepartament where Cod=" & codI)
    '        rst.Edit
    '        Set rst1 = rst.Fields("FileV").Value
    '        Counter = rst1.AbsolutePosition
            'MsgBox rst1.AbsolutePosition
            Wend
        End If
        
        rst.Update
        rst.MoveNext
    Wend
End If
End Function
...
Рейтинг: 0 / 0
Вложения в Access 2007
    #39374180
Djois
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игортан, спасибо

нашёл на вражеском ресурсе
чистит хорошо, быстро и даже можно выбрать тип файлов которые нужно удалить
Код: vbnet
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.
Function RemoveAttachment(strRemoveFile As String, Optional strFilter As String) As Long
'RemoveAttachment "*.pdf" 'вызов функции - можно указать удаляемые файлы
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset2
    Dim rsA As DAO.Recordset2
    Dim fld As DAO.Field2
    Set dbs = CurrentDb
    If Len(strFilter) > 0 Then 'tblAttachments - запрос на выборку записей в которых чистим вложения 
        Set rst = dbs.OpenRecordset("SELECT * FROM tblAttachments WHERE " & strFilter)
    Else
        Set rst = dbs.OpenRecordset("tblAttachments")
    End If
    Set fld = rst("FileV") 'FileV - имя поля с вложениями
    Do While Not rst.EOF
        Set rsA = fld.Value
        Do While Not rsA.EOF
            If rsA("FileName") Like strRemoveFile Then
                rsA.Delete
                RemoveAttachment = RemoveAttachment + 1
            End If
            rsA.MoveNext
        Loop
        rsA.Close
        Set rsA = Nothing
        rst.MoveNext
    Loop
    rst.Close
    dbs.Close
    Set fld = Nothing
    Set rst = Nothing
    Set dbs = Nothing
    MsgBox "Успешно! Удалено вложений - " & RemoveAttachment
End Function



Осталась пока одна проблема после удаления всех вложений и последующего сжатия размер БД остаётся большим.

т.е. до удаления вложений размер =700 мб
после удаления всех вложений и сжатия 250 мб
а если пересоздать само поле вложения т.е. в конструкторе таблиц удалить поле FileV (тип - вложение) сохранить таблицу и заново в таблице создать поле FileV (тип - вложение) и после сжать БД размер станет = 850 кб.
Отсюда вывод, что не всё очищается ... буду искать дальше :)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вложения в Access 2007
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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