Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Елемент "Список"


Автор: Alibaba 19.11.2009, 21:27
Есть таблицы:

ТаблицаБанки
МФО     Банк    Адрес
300111 БанкА улицаА
300222 БанкБ улицаБ

ТаблицаАктивы
МФО      Дата           РазмерАктивов
300111 01.01.2009 100
300111 01.02.2009 150
300222 01.03.2009 200
300222 01.04.2009 250

Есть Форма, которая отображает поля из ТаблицаБанки.
На форме есть элементы "Кнопка", с помощью которых
двигаюсь по записям ТаблицаБанки.

На форме разместил элемент "Список" дал ему имя - СписокДат

-----------------------------------------------------
Код

Private Sub ВыбираемДату()
'--- из СписокДат выбраем дату
 a = СписокДат.Value
 If IsNull(a) Then
  ПодписьДат.Caption = "Почему NULL?????"
 Else
  ПодписьДат.Caption = a
 End If
End Sub

Private Sub Form_Current()
'--- для СписокДат формируем SQL запрос
 m = ПолеМФО.Value
 s = "SELECT Дата FROM ТаблицаАктивы WHERE МФО = " + Trim(Str(m)) + " ORDER BY 1 DESC;"
 СписокДат.RowSource = s
 ВыбираемДату
End Sub

Private Sub СписокДат_AfterUpdate()
 ВыбираемДату
End Sub
-----------------------------------------------------

Когда я запускаю форму
происходит событие Form_Current,
которое формирует запрос и вызывает мою процедуру ВыбираемДату
в этой процедуре СписокДат.Value=NULL. ПОЧЕМУ?????
Ведь визуально в СписокДат я вижу даты.

Когда в СписокДат выбираю дату,
происходит событие AfterUpdate, которое вызывает мою процедуру ВыбираемДату
и в этом случае СписокДат.Value = выбранной дате!!!!! (как и должно быть)

Когда двигаюсь по записям ТаблицаБанки с помощью кнопок "Вперед", "Назад"
тоже происходит событие Form_Current
и СписокДат.Value содержит старое значение!!!!!!!

Например, если мы были на первой записи
МФО = 300111, даты: 01.01.2009, 01.02.2009
СписокДат.Value = 01.01.2009

когда переходим на следующую запись
МФО = 300222, даты: 01.03.2009, 01.04.2009
СписокДат.Value не обновляется и по прежнему равно - 01.01.2009

Почему визуально видно в СписокДат новые значения
а при обращении к переменной она содержит старое значение?



Автор: Akina 19.11.2009, 23:52
Цитата(Alibaba @  19.11.2009,  22:27 Найти цитируемый пост)
Когда я запускаю форму
происходит событие Form_Current,
которое формирует запрос и вызывает мою процедуру ВыбираемДату
в этой процедуре СписокДат.Value=NULL. ПОЧЕМУ?????

Ознакомьтесь с порядком возникновения событий при загрузке формы.

Цитата(Alibaba @  19.11.2009,  22:27 Найти цитируемый пост)
Почему визуально видно в СписокДат новые значения
а при обращении к переменной она содержит старое значение?

Потому что визуально его видно гораздо позже, чем выполняется обращение к нему.

Цитата(Alibaba @  19.11.2009,  22:27 Найти цитируемый пост)
Когда двигаюсь по записям ТаблицаБанки с помощью кнопок "Вперед", "Назад"
тоже происходит событие Form_Current
и СписокДат.Value содержит старое значение!!!!!!!

Кривой код кнопки.

Автор: Alibaba 20.11.2009, 21:38
Цитата(Akina @ 19.11.2009,  23:52)
Цитата(Alibaba @  19.11.2009,  22:27 Найти цитируемый пост)
Когда я запускаю форму
происходит событие Form_Current,
которое формирует запрос и вызывает мою процедуру ВыбираемДату
в этой процедуре СписокДат.Value=NULL. ПОЧЕМУ?????

Ознакомьтесь с порядком возникновения событий при загрузке формы.


Порядок такой:
Open → Load → Resize → Activate → Current

Цитата(Akina @ 19.11.2009,  23:52)
Цитата(Alibaba @  19.11.2009,  22:27 Найти цитируемый пост)
Когда двигаюсь по записям ТаблицаБанки с помощью кнопок "Вперед", "Назад"
тоже происходит событие Form_Current
и СписокДат.Value содержит старое значение!!!!!!!

Кривой код кнопки.


Код кнопки сгенерировался автоматически
когда я положил кнопку на форму:

Код

Private Sub КнопкаВперед_Click()
On Error GoTo Err_КнопкаВперед_Click
  DoCmd.GoToRecord , , acNext
Exit_КнопкаВперед_Click:
    Exit Sub
Err_КнопкаВперед_Click:
    MsgBox Err.Description
    Resume Exit_КнопкаВперед_Click
End Sub



Автор: Akina 21.11.2009, 09:58
Цитата(Alibaba @  20.11.2009,  22:38 Найти цитируемый пост)
Порядок такой:
Open → Load → Resize → Activate → Current

А дальше? Когда читаются данные - посмотрел?

Цитата(Alibaba @  20.11.2009,  22:38 Найти цитируемый пост)
Код кнопки сгенерировался автоматически
когда я положил кнопку на форму:

Угу... в нём не учтено появление поля, не привязанного к источнику данных формы. Дописывайте необходимый код руками.

Автор: Alibaba 24.11.2009, 18:24
Цитата(Akina @ 21.11.2009,  09:58)
Дописывайте необходимый код руками.

А какой код необходимо дописать?

Автор: Alibaba 26.11.2009, 21:27
Народ, помогите, пожалуйста, бьюсь как рыба об лёд, ничего не получается.

обновление данных СписокДат.Requery не помогает

Код

Private Sub КнопкаВперед_Click()
On Error GoTo Err_КнопкаВперед_Click
  DoCmd.GoToRecord , , acNext

  СписокДат.Requery

Exit_КнопкаВперед_Click:
    Exit Sub
Err_КнопкаВперед_Click:
    MsgBox Err.Description
    Resume Exit_КнопкаВперед_Click
End Sub

Автор: Akina 26.11.2009, 23:45
http://forum.vingrad.ru/forum/topic-260944.html

Автор: bopoha 27.11.2009, 17:06
Alibaba, с чего вы решили, что Value должно перезаполнятся при подчитке в список новых данных? Так вот не должно, т.к. Value отображает выбранное значение. А оно не имзенилось.
Чтобы этот атрибут менялся. Списку нужно указать имя поля в атрибут данные. См. свойсва списка. Тогда при переходе к следующей записи у вас изменится выбранное значение. По этому значению в списке найдется строка, которая и подсветится выбранной.

Автор: Alibaba 1.12.2009, 23:36
Цитата(bopoha @ 27.11.2009,  17:06)
Чтобы этот атрибут менялся. Списку нужно указать имя поля в атрибут данные.

Когда мы двигаемся по записям ТаблицаБанки, для СписокДат формируем SQL запрос:

Код

Private Sub Form_Current()
'--- для СписокДат формируем SQL запрос
 m = ПолеМФО.Value
 s = "SELECT Дата FROM ТаблицаАктивы WHERE МФО = " + Trim(Str(m)) + " ORDER BY 1 DESC;"
 СписокДат.RowSource = s

 a = СписокДат.Value 'Здесь некорректная работа!!!!!!!!

End Sub


Как видим, имя поля, которое нужно указать списку (СписокДат) в атрибутах данных - это Дата

Давайте рассмотрим аттрибуты для елемента СписокДат:
Тип источника строк: таблица или запрос
Источник строк: "SELECT Дата FROM ТаблицаАктивы ORDER BY 1 DESC;"
Данные: здесь нельзя выбрать поле Дата. Здесь предлагается выбрать поля из списка полей из главной таблицы ТаблицаБанки (смотри мое первое сообщение от 19.11.2009, 21:27)
Если я руками прописываю поле Дата, игнорируя предложенный список, то во время работы появляется сообщение: 

"Ошибка 2424
Введенное выражение содержит поле, элемент управления или имя свойства, которые Access не может найти"

Автор: bopoha 1.12.2009, 23:50
Цитата(Alibaba @  1.12.2009,  23:36 Найти цитируемый пост)
Данные: здесь нельзя выбрать поле Дата. Здесь предлагается выбрать поля из списка полей из главной таблицы ТаблицаБанки (смотри мое первое сообщение от 19.11.2009, 21:27)

Все правильно. Здесь и должны показываться поля главной таблицы.

Для указанной кофигурации данный элемент управления работает правильно. Не должно в Values появляется значение! И точка. Желаемое поведение от Списка не является стандартным.
Если вам необходимо получить значение первой строки, то получите его соответствующим образом:
Код

Me.Список.ItemData(0)


Вот пример использования:
Код

Public Sub CM_ListSelectFirst(ByRef ctl As Control)
' Скоков С.А. 2009-02-25
' Выбрать первое значение в поле со списком или списке
    With ctl
        If Not (.ControlType = acListBox Or .ControlType = acComboBox) Then
            Exit Sub
        End If
    
        If .ListCount > 0 Then
            .Value = Nz(.ItemData(0))
        End If
    End With
End Sub

Автор: Alibaba 23.1.2010, 02:09
В прикрепленной базе данных находится форма и две таблицы: Банки (главная таблица), Филиалы (подчиненная таблица).

Когда мы двигаемся по главной таблице Банки РамкаБанка отображает фото банка.
При этом подчиненная форма отображает те филиалы, которые есть у данного банка.

Я хочу, кликая на различные филиалы в подчиненной форме - получать в РамкеФилиала - фото филиала.

Скажите, пожалуйста, как это сделать?

Автор: bopoha 26.1.2010, 16:16
При помощи событий. Дока: http://5codelines.net/events1/

Автор: Alibaba 28.1.2010, 20:19
bopoha, ок, про события почитал.

В Вашем примере:
http://forum.vingrad.ru/index.php?showtopic=254535&view=findpost&p=1837317

если поле T_ADRES типа: "Поле объекта OLE" (хочу хранить там картинки)
как на форме f_klient_edit_ отобразить данное поле?
Стандартный элемент "Поле" не хочет показывать "Поле объекта OLE".


Автор: bopoha 28.1.2010, 23:55
Alibaba, для обображения кратинок есть специальный элемент управления. Я не храню скртинки в бд, а в файловой системе. Тогда все реализуется очень просто: при переходе на запись элементу управления указывается путь к файлу картинки.

Автор: Alibaba 29.1.2010, 12:40
bopoha, элемент управления для отображения картинок нашел: "Присоединенная рамка обьекта".

Можно еще вопрос: зачем Вы создаете три формы f_klient_main, f_klient_lite_spis_, f_klient_edit_?
Почему нельзя решить данный пример используя одну форму - f_klient_main (все елементы расположить на одной форме)?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)