LEADERSOFT.ru Разработка на заказ программ и сайтов
ЕСЛИ БАЗА ВАМ НУЖНА В ЛИДЕРСОФТ ЗАЙДИ СПЕРВА!
Список всех статей ... Подписка на новости (рассылка через subscribe.ru)




































Выпуск 37. Применение ListView

Подписка: "Access 2000 - программирование и готовые решения"
Дата:         31.05.2002
Сайт:         http://www.leadersoft.ru
  Новости
    31.03.2002. Добавлены примеры в файлы la_report1.mdb и la_activex1.mdb. Описание этих примеров дано в этом выпуске ниже.
    30.03.2002. Вышла рассылка для специалистов "Профессионально об Access". В этой подписке дается описание класса, который может быть применяться при разработке справочников Access, например, для учета клиентов, работников, товаров и т.п.

Вопрос:  Расскажите, пожалуйста, зачем нужен элемент ListView
Ответ. ListView - этот элемент имитирует рабочую область стола Windows. Таким образом, с помощью него Вы можете создать в форме базы данных область, с иконками которые можно будет передвигать или при двойном нажатии вызывать нужную программу или объект базы данных.
   Данный элемент не встроен в Access, поэтому, прежде чем его использовать надо сделать ссылку на библиотеку mscomctl.ocx через редактор VBA. Также с этим объектом используется другой элемент ImageList. Он необходим для сохранения иконок. Настройку и связь этих элементов в форме лучше использовать через конструктор, т.е. дважды нажмите на элемент и перед Вами отобразиться окно с группой вкладок и настройками. Пример использования этих элементов дан ниже.

' la_activex1.mdb (Пример 11) ===========================================
' Данный код необходимо добавить в форму
Public myNewList As MicrosoftList
Private Sub Form_Load()
If myNewList Is Nothing Then
Set myNewList = New MicrosoftList
Set myNewList.Tree = Me.myList.Object
' Загружаем узлы дерева из запроса
myNewList.Load "sqlListView"
End If
End Sub
' MicrosoftList =======================================================
' Объявляем класс ListView из Mscomctl.ocx
Public WithEvents Tree As MSComctlLib.ListView

' События при нажатии на иконку
Private Sub Tree_DblClick()
MsgBox Me.Tree.SelectedItem.Text, vbInformation, "Двойное нажатие"
End Sub

' Загрузка элемента данными из запроса
Public Function Load(strSQL As String) As Boolean
Dim myKey As String, idx As Long
Dim rst As ADODB.Recordset
On Error GoTo 999

' Загрузка дерева
Set rst = New ADODB.Recordset
rst.Open strSQL, Application.CurrentProject.Connection
Me.Tree.ListItems.Clear
idx = 1
Do Until rst.EOF
' Создание узла и его ключей
myKey = "la_" & rst!Тип
Me.Tree.ListItems.Add idx, myKey, Nz(rst!Наименование), "PC", "PC"
rst.MoveNext
idx = idx + 1
Loop
Load = True

998:
rst.Close
Set rst = Nothing
Err.Clear
Exit Function
999:
Load = False
MsgBox Err.Description
On Error Resume Next
Resume 998
End Function
Вопрос:  1832
Тема:      Отчеты
Пример:  la_report1.mdb (№20)
Ссылка: http://www.leadersoft.ru/cgi-bin/rusboard/data/1832.htm
Сообщение: Есть одна проблема. Это организация вывода на печать. Дело в том что мне необходимо распечатывать из всей таблицы только одну запись, которая активна в форме (кстати как сгенерировать отчет только по этой одной записи а не по всей таблице).
Ответ.     Самое простое - это на этапе открытия отчета изменить источник записей, т.е sql запрос. Для ссылки на объект формы используйте объект Forms, например, "Select * From [Справочник] WHERE Цена = " & [Forms]![frmСправочник]![Цена]. Пример:

Private Sub Report_Open(Cancel As Integer)
Me.RecordSource = "SELECT * From Cправочник WHERE [Цена]<50"
End Sub

Вопрос:  1858
Тема:      Отчеты
Пример:  la_report1.mdb (№19)
Ссылка: http://www.leadersoft.ru/cgi-bin/rusboard/data/1858.htm
Сообщение: Форматируется отчет (расчетная ведомость) по сотрудникам предприятия. Столбцы отчета представляют собой наименования кодов начислений и удержаний в текущем месяце, количество которых подсчитывается на этапе открытия отчета. Подскажите, как можно вообще можно изменить размер отчета во время исполнения программы.
Ответ. Вариантов может быть несколько. Один из способов это создать несколько подчиненных отчетов и при необходимости менять источник данных при открытии основного отчета. Например,
Private Sub Report_Open(Cancel As Integer)
If MsgBox("Изменить поля отчета?", vbInformation + vbOKCancel) = vbOK Then
Me.subReport.SourceObject = "Отчет.Пример 19_sub2"
End If
End Sub
Вопрос:  1880
Тема:      Отчеты
Пример:  la_report1.mdb (№20)
Ссылка: http://www.leadersoft.ru/cgi-bin/rusboard/data/1880.htm
Сообщение: Как вывести в отчете сумму на каждом листе? У меня в отчете несколько листов. Приходится общую сумму листа считать вручную. Общую сумму отчета делать умею, но вот каждого листа в отдельности нет.
Ответ. Николай Малютин Если "превлечь" немного программирования, то это можно решить так:
1. В нижнем колонтитуле отчета (там, где выводятся номер страницы) создаем поле для отображения суммы.(назовем P1)
2. В свойствах раздела "НижнийКолонтитул" назначаем процедуру на событие "Форматирование"
3. Аналогично процедуру "форматирование" для ОбластиДанных
4. И пишем несколько строк программы

Option Compare Database
Dim sSum
Private Sub НижнийКолонтитул_Format(Cancel As Integer, FormatCount As Integer)
Me.P1.Value = sSum
sSum = 0
End Sub

Private Sub ОбластьДанных_Format(Cancel As Integer, FormatCount As Integer)
sSum = Me.V1.Value + sSum
End Sub
Виктор Конюков: Идея интересная и очень нужная, особенно при формировании бухотчетности. Но потребуется дополнение к программе, т.к. при форматировании с отчетом из нескольких страниц к сумме каждый раз будет добавляться первая строка таблицы следующей страницы.
Вопрос:  1928
Тема:      Запросы
Ссылка: http://www.leadersoft.ru/cgi-bin/rusboard/data/1928.htm
Сообщение: При использовании запроса на добавление в таблицу при случайном нажатии происходит добавление несколько раз одного блока, т.е. дублирование добавления. Как этого можно избежать?
Ответ. Один из вариантов заключается в том, что в событии Click, после выполнения запроса, добавляется цикл в котором происходит временное отключение кнопки.
Private Sub Кнопка0_Click()
Dim i As Long
' DoCmd.RunSQL "..."
Me.Кнопка1.SetFocus ' Меняем фокус
For i = 0 To 5000
Me.Кнопка0.Enabled = False
Next
Me.Кнопка0.Enabled = True
End Sub