Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Ограничение набора значений поля со списком  [new]
Ильин Сергей Юрьевич
Member

Откуда:
Сообщений: 248
Есть таблица Контракты (поля: КодКонтракта, НаименованиеКонтракта, КонтрактЗакрыт (логическое)).
Есть таблица Оплаты (поля: КодОплаты, ДатаОплаты, СуммаОплаты, КодКонтракта).
Определена связь один-ко-многим с обеспечением целостности данных: Контракты.КодКонтракта-Оплаты.КодКонтракта.
Есть форма Оплаты, источником записей для которой является таблица Оплаты.

Хочу, чтобы при занесении данных об оплате в форме Оплаты при выборе контракта в поле со списком Контрат в списке были бы только открытые контракты.

Варианты решения:

1. Можно в запрос источника строк поля со списком Контракт (SELECT Контракты.КодКонтракта, Контракты.НаименованиеКонтракта FROM Контракты) добавить инструкцию WHERE Контракты.КонтрактЗакрыт=No, но в этом случае при просматривании в форме Оплаты старых записей об оплате по закрытым контрактам эти контракты не будут отображаться в поле со списком Контракты.

2. Можно в запрос источника строк поля со списком Контракт (SELECT Контракты.КодКонтракта, Контракты.НаименованиеКонтракта FROM Контракты) добавить инструкцию WHERE Контракты.КонтрактЗакрыт=No or Контракты.КодКонтракта=[Forms]![Оплаты].[Контракт] и для события перехода с записи на запись формы Оплаты назначить код Контракт.Requery, тогда при просматривании в форме Оплаты старых записей об оплате по закрытым контрактам в режиме формы (видна только одна запись) проблем не возникает, но в режиме таблицы (видны все записи) возникает проблема, аналогичная указанной в пункте 1: закрытые контракты или не видны вовсе, или видны только закрытые контракты, совпадающие с закрытым контрактом в текущей записи.

Вариант решения этой задачи:
В запрос источника сторок поля со списком Контракт (SELECT Контракты.КодКонтракта, Контракты.НаименованиеКонтракта FROM Контракты) не добавлять инструкции WHERE Контракты.КонтрактЗакрыт=No или WHERE Контракты.КонтрактЗакрыт=No or Контракты.КодКонтракта=[Forms]![Оплаты].[Контракт]. А при наступлении события раскрытия списка поля со списком Контракт ограничивать этот список только набором открытых контрактов.
Подскажите, пожалуйста, каким должен быть соответствующий код.
Может быть рассмотренная задача решается как-то иначе?
13 май 05, 11:13    [1535693]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
ANTIVIR
Member

Откуда: МосквА
Сообщений: 1219
Неужели нельзя определить, что происходит на форме-ввод оплаты или просмотр старых данных, и в случае ввода оплаты делать пункт 1., а в случае старых делать пункт 1. без WHERE ?
13 май 05, 11:57    [1535967]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Ильин Сергей Юрьевич
Member

Откуда:
Сообщений: 248
А как это можно определить?
И как в зависимости от того, происходит ли в форме Оплаты добавление новой записи или просмотр (редактирование) старой записи, изменять запрос источника строк поля со списком Контракт?
13 май 05, 12:11    [1536097]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Iskander68
Member

Откуда: Королев М.О.
Сообщений: 877

Как вариант: открывать форму для редактирования и для добавления по разным
кнопкам. В форме для редактирования AllowAdditions = False. Форму для ввода
соответственно сделать DataEntry = True.
Можно открывать несколько экземляров формы. Вот пример процедуры в
глобальном модуле:

Option Compare Database
Option Explicit

Private colForms As New Collection
Private intForm As Integer
Const OffsetVert = 150
Const OffsetHoriz = 75


Public Sub OpenOrder(OrderNumber As String)
'Для добавления нового заказа вызывается OpenOrder("New").
On Error GoTo ERRTRAP

Dim frm As Form

Set frm = New Form_frmOrder

colForms.Add frm

intForm = intForm + 1

DoCmd.MoveSize intForm * OffsetHoriz, intForm * OffsetVert


With frm
..SetFocus
..NavigationButtons = False
..AllowAdditions = False

If OrderNumber = "New" Then
.DataEntry = True

Else
.Filter = "O.PO = " & OrderNumber
.FilterOn = True
'.Caption = "Заказ ? " & OrderNumber 'можно присваивать заголовок в
модуле формы
End If

..Visible = True

End With

EXIT_SUB:
Exit Sub

ERRTRAP:
Select Case Err.Number
Case 2448
MsgBox "Такого заказа нет в базе данных", vbInformation
Case Else

MsgBox "Произошла ошибка " & Err.Number & ". " & Err.Description,
vbInformation

End Select

Resume EXIT_SUB

End Sub


--
Regards
Alexander Artamonov


"Ильин Сергей Юрьевич" <nospam@sql.ru> сообщил/сообщила в новостях
следующее: news:1536097@sql.ru...
А как это можно определить?
И как в зависимости от того, происходит ли в форме Оплаты добавление новой
записи или просмотр (редактирование) старой записи, изменять запрос
источника строк поля со списком Контракт?
Тема Ответить

Posted via ActualForum NNTP Server 1.1

13 май 05, 12:32    [1536231]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Ильин Сергей Юрьевич
Member

Откуда:
Сообщений: 248
Большое спасибо, Iskander68.
Но вариант с открытием формы Оплаты в двух разных состояниях (для добавления/просмотра записей) кажется мне необоснованно громоздким для решения задачи ограничения набора возможных значений поля со списком Контракты.

Как вы думаете, может быть есть какой-то альтернативный более простой вариант?

В отсутствии других вариантов, мне кажется, проще остановиться на варианте из пункта 2:
автор
2. Можно в запрос источника строк поля со списком Контракт (SELECT Контракты.КодКонтракта, Контракты.НаименованиеКонтракта FROM Контракты) добавить инструкцию WHERE Контракты.КонтрактЗакрыт=No or Контракты.КодКонтракта=[Forms]![Оплаты].[Контракт] и для события перехода с записи на запись формы Оплаты назначить код Контракт.Requery, тогда при просматривании в форме Оплаты старых записей об оплате по закрытым контрактам в режиме формы (видна только одна запись) проблем не возникает, но в режиме таблицы (видны все записи) возникает проблема, аналогичная указанной в пункте 1: закрытые контракты или не видны вовсе, или видны только закрытые контракты, совпадающие с закрытым контрактом в текущей записи.

Ну и пусть, что закрытые контракты в режиме таблицы могут быть не видны. Чтобы увидеть закрытый контракт, достаточно будет перейти на одну из записей об оплате по этому контракту, и он проявится.
Как вы думаете, насколько этот вариант некорректный?
13 май 05, 12:59    [1536358]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Iskander68
Member

Откуда: Королев М.О.
Сообщений: 877

Я просто не пойму, с одной стороны нужно не видеть закрытые контракты, с
другой их видеть. Ну так и нужно включать/выключать подходящий фильтр. В чем
проблема?

--
Regards
Alexander Artamonov

Posted via ActualForum NNTP Server 1.1

13 май 05, 13:09    [1536434]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Ильин Сергей Юрьевич
Member

Откуда:
Сообщений: 248
Iskander68, а как и где включать/отключать эти фильтры технически?

Можно ли обойтись при этом без открытия формы Оплаты в разных состояниях (без открытия нескольких экземпляров формы Оплаты)?
13 май 05, 13:16    [1536487]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
lsnk
Guest
А может просто на событие после обновления этого поля поставить проверку на закрытие контракта, и в случае если он закрыт выдавать ошибку. И при вводе можно также добавить второе поле в поле со списком, что бы вводящий видел что контракт закрыт.
13 май 05, 13:40    [1536656]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Iskander68
Member

Откуда: Королев М.О.
Сообщений: 877

Технически - вставляется подходящий контрол - кнопка-выключатель, комбобокс,
радиокнопки. По его обновлению делается
Me.Filter = "bla-bla"
Me.FilterOn = True

--
Regards
Alexander Artamonov


"Ильин Сергей Юрьевич" <nospam@sql.ru> сообщил/сообщила в новостях
следующее: news:1536487@sql.ru...
Iskander68, а как и где включать/отключать эти фильтры технически?

Можно ли обойтись при этом без открытия формы Оплаты в разных состояниях
(без открытия нескольких экземпляров формы Оплаты)?
Тема Ответить

Posted via ActualForum NNTP Server 1.1

13 май 05, 13:40    [1536661]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Ильин Сергей Юрьевич
Member

Откуда:
Сообщений: 248
lsnk, контрактов может быть очень много, поэтому для облегчения работы наличие в списке поля со списком Контракт закрытых контрактов нежелательно.

Iskander68, если нужно отфильтровать записи в форме, то действительно подойдёт код:
Me.Filter = "Поле = 'ла-ла-ла'"
Me.FilterOn = True

Но мне нужно отфильтровать строки в списке поля со списком Контракт, причём сделать это нужно не по основному столбцу (КодКонтракта), а по дополнительному столбцу (КонтрактЗакрыт).
Каким должен быть код в этом случае?
14 май 05, 10:59    [1539357]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
@ndrey
Member

Откуда: Novosibirsk
Сообщений: 343
автор
Но мне нужно отфильтровать строки в списке поля со списком Контракт, причём сделать это нужно не по основному столбцу (КодКонтракта), а по дополнительному столбцу (КонтрактЗакрыт).
Каким должен быть код в этом случае?

Дык как и было написано:
автор
В отсутствии других вариантов, мне кажется, проще остановиться на варианте из пункта 2:
автор
2. Можно в запрос источника строк поля со списком Контракт (SELECT Контракты.КодКонтракта, Контракты.НаименованиеКонтракта FROM Контракты) добавить инструкцию WHERE Контракты.КонтрактЗакрыт=No or Контракты.КодКонтракта=[Forms]![Оплаты].[Контракт] и для события перехода с записи на запись формы Оплаты назначить код Контракт.Requery, тогда при просматривании в форме Оплаты старых записей об оплате по закрытым контрактам в режиме формы (видна только одна запись) проблем не возникает, но в режиме таблицы (видны все записи) возникает проблема, аналогичная указанной в пункте 1: закрытые контракты или не видны вовсе, или видны только закрытые контракты, совпадающие с закрытым контрактом в текущей записи

Тока на событие (например текущая запись) в форме повесить:
добавить инструкцию WHERE Контракты.КонтрактЗакрыт=No
или убрать ее из источника для списка... в зависимости от значения текущего поля...
14 май 05, 11:07    [1539399]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Ильин Сергей Юрьевич
Member

Откуда:
Сообщений: 248
В этом и состоит мой вопрос, как программно корректировать запрос источника строк поля со списком в форме?
Каким должен быть код?
14 май 05, 11:27    [1539494]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Iskander68
Member

Откуда: Королев М.О.
Сообщений: 877

Сергей Юрьевич, ну это же так просто:

Me.MyCombobox.RowSource = "Select ...."

Справка, судя по всему, не работает?
--
Regards
Alexander Artamonov


"Ильин Сергей Юрьевич" <nospam@sql.ru> сообщил/сообщила в новостях
следующее: news:1539494@sql.ru...
В этом и состоит мой вопрос, как программно корректировать запрос источника
строк поля со списком в форме?
Каким должен быть код?
Тема Ответить

Posted via ActualForum NNTP Server 1.1

14 май 05, 11:42    [1539552]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Ильин Сергей Юрьевич
Member

Откуда:
Сообщений: 248
Спасибо, Iskander68.
Попробую этот вариант чуть позже (сейчас очень занят).

Справка, конечно, работает. Но, когда знания в Access скромные, сложно сориентироваться, что искать в справочной системе.
14 май 05, 11:47    [1539575]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Ильин Сергей Юрьевич
Member

Откуда:
Сообщений: 248
Спасибо ещё раз. Всё работает.
Сейчас у меня сделано так:

Для события получения фокуса полем со списком Контракт назначен код:
Контракт.RowSource = "SELECT Контракты.КодКонтракта, Контракты.НаименованиеКонтракта FROM Контракты WHERE Контракты.КонтрактЗакрыт=No"
Контракт.Requery

Для события потери фокуса полем со списком Контракт назначен код:
Контракт.RowSource = "SELECT Контракты.КодКонтракта, Контракты.НаименованиеКонтракта FROM Контракты"
Контракт.Requery

Скажите, а можно ли сделать так:
В режиме конструктора для источника строк поля со списком Контракт задать основную инструкцию SELECT Контракты.КодКонтракта, Контракты.НаименованиеКонтракта FROM Контракты, а программно лишь включать или выключать дополнительную инструкцию WHERE Контракты.КонтрактЗакрыт=No?
14 май 05, 14:30    [1540275]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
ANTIVIR
Member

Откуда: МосквА
Сообщений: 1219
Мне кажется ваш вариант, и так просто до нельзя)
14 май 05, 14:32    [1540283]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Ильин Сергей Юрьевич
Member

Откуда:
Сообщений: 248
И всё-таки.
Спортивный интерес.
14 май 05, 14:33    [1540288]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Iskander68
Member

Откуда: Королев М.О.
Сообщений: 877

А в чем суть изменения источника строк на получение фокуса? При выборе
всегда будет один и тот же источник. Проще в свойствах его и указать. Я
чего-то не понимаю.

--
Regards
Alexander Artamonov


"Ильин Сергей Юрьевич" <nospam@sql.ru> сообщил/сообщила в новостях
следующее: news:1540275@sql.ru...
Спасибо ещё раз. Всё работает.
Сейчас у меня сделано так:

Для события получения фокуса полем со списком Контракт назначен код:
Контракт.RowSource = "SELECT Контракты.КодКонтракта,
Контракты.НаименованиеКонтракта FROM Контракты WHERE
Контракты.КонтрактЗакрыт=No"
Контракт.Requery


Для события потери фокуса полем со списком Контракт назначен код:
Контракт.RowSource = "SELECT Контракты.КодКонтракта,
Контракты.НаименованиеКонтракта FROM Контракты"
Контракт.Requery


Скажите, а можно ли сделать так:
В режиме конструктора для источника строк поля со списком Контракт задать
основную инструкцию SELECT Контракты.КодКонтракта,
Контракты.НаименованиеКонтракта FROM Контракты, а программно лишь включать
или выключать дополнительную инструкцию WHERE Контракты.КонтрактЗакрыт=No?
Тема Ответить

Posted via ActualForum NNTP Server 1.1

14 май 05, 15:05    [1540429]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Ильин Сергей Юрьевич
Member

Откуда:
Сообщений: 248
Когда поле со списком Контракт получает фокус и есть вероятность того, что контракт будет изменён, список не содержит закрытых контрактов.

Когда поле со списком Контракт теряет фокус, список содержит все контракты, чтобы при просмотре записей об оплате по закрытым контрактам эти контракты отображались в поле со списком Контракт.
14 май 05, 15:20    [1540509]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Iskander68
Member

Откуда: Королев М.О.
Сообщений: 877

Т.е. список можно трогать, только если хочешь получить список без закрытых
контрактов. Вообще, нетрадиционный подход. Более привычный - поставить
флаг - "показывать/не показывать" - и по выбору формировать список.

--
Regards
Alexander Artamonov


"Ильин Сергей Юрьевич" <nospam@sql.ru> сообщил/сообщила в новостях
следующее: news:1540509@sql.ru...
Когда поле со списком Контракт получает фокус и есть вероятность того, что
контракт будет изменён, список не содержит закрытых контрактов.

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

Posted via ActualForum NNTP Server 1.1

14 май 05, 15:27    [1540541]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Ильин Сергей Юрьевич
Member

Откуда:
Сообщений: 248
У оператора, работающего с формой, возможности выбора закрытого контракта быть не должно. А если такая необходимость всё же возникнет, то администратор сможет сделать это непосредственно в таблице.
14 май 05, 15:42    [1540611]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Iskander68
Member

Откуда: Королев М.О.
Сообщений: 877

Стало интересно. Киньте сжатым файлом, плиз.

--
Regards
Alexander Artamonov


"Ильин Сергей Юрьевич" <nospam@sql.ru> сообщил/сообщила в новостях
следующее: news:1540611@sql.ru...
У оператора, работающего с формой, возможности выбора закрытого контракта
быть не должно. А если такая необходимость всё же возникнет, то
администратор сможет сделать это непосредственно в таблице.
Тема Ответить

Posted via ActualForum NNTP Server 1.1

14 май 05, 15:44    [1540624]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение набора значений поля со списком  [new]
Ильин Сергей Юрьевич
Member

Откуда:
Сообщений: 248
Чуть позже я его выложу.
Сейчас опять много работы.
14 май 05, 15:45    [1540629]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить