Пользовательский источник строки для комбинированного поля в непрерывном режиме в Access

Я искал вокруг, и кажется, что это ограничение в MS Access, поэтому мне интересно, какие креативные решения другие нашли для этой головоломки.

Если у вас есть непрерывная форма, и вы хотите, чтобы поле было полем со списком опций, относящихся к этой строке, Access не может выполнить доставку; источник строки со списком только запрашивается один раз в начале формы и, таким образом, показывает неправильные параметры для остальной части формы.

Следующим шагом, который мы все пытаемся, конечно, является использование события onCurrent для запроса поля со списком, которое фактически ограничивает параметры данной строки. Тем не менее, на данный момент Access переходит в гайки и запрашивает все комбинированные поля для каждой строки, а результат часто является результатом исчезновения и повторного отображения параметров в других строках, в зависимости от того, выбрали ли они параметр, действительный для источник текущей записи.

Единственное решение, которое я нашел, - это просто все доступные параметры, все время. Какие-нибудь творческие ответы там?

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

В этом конкретном случае непрерывные формы имеют большой смысл, поэтому, пожалуйста, не говорите мне, что это неправильное решение. Я прошу любых творческих ответов.

Ответ 1

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

Вот что я сделал бы, когда столкнулся бы с этой ситуацией (и раньше я использовал подобные обходные пути):

Поместите в форму поле со списком UNBOUND. Затем поместите текстовое поле BOUND для поля, которое вы хотите изменить.

Удостоверьтесь, что поле со списком скрыто (НЕ невидимо, просто скрыто) за текстовым полем.

В событии OnCurrent заполните listBox необходимыми данными. Идите вперед и "Ограничьте список".

В событии OnEnter или OnClick текстового поля выделяется фокус со списком. Это выведет на передний план выпадающий список. Когда фокус покидает поле со списком, он снова скроется.

В событии AfterUpdate в поле со списком установите значение текстового поля равным значению поля со списком.

В зависимости от вашей ситуации могут возникнуть некоторые другие детали, но это должно более или менее выполнить вашу задачу, не добавляя слишком много сложностей.

Ответ 2

используйте непрерывные формы.. определенно. Фактически вы можете создавать целые приложения с большим и интуитивно понятным пользовательским интерфейсом, основанным на непрерывных формах. Не слушайте тост!

Ваше решение о перечислении всех доступных вариантов является правильным. На самом деле нет другого чистого решения. Но вы ошибаетесь, когда говорите, что Acccess сходит с ума. В непрерывной форме вы можете видеть каждую строку как экземпляр раздела детали, где combobox является свойством, общим для всех экземпляров раздела подробностей. Вы можете обновить это свойство для всех экземпляров, но не можете установить его для одного конкретного экземпляра. Вот почему Access ДОЛЖЕН отображать те же данные в выпадающем списке для всех записей!

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

Вы не можете установить для свойства limitToList значение "Нет", где скрытые данные (тот, который хранится в элементе управления) скрыт. Это логично: как машина может принимать ввод новой строки данных, когда связанное поле (не видимое) остается пустым?

Ответ 3

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

Ответ 4

Я не думаю, что доступ к непрерывным формам должен быть осужден вообще, но я определенно считаю, что их следует избегать для РЕДАКТИРОВАНИЯ ДАННЫХ. Они отлично подходят для списков и дают вам значительно больше возможностей форматирования, чем простой список (и с ними намного проще работать, хотя они, конечно же, не допускают многоэкранный выбор).

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

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

[MySubForm].[Form]!MyID

Это будет свойство link master, а MyID будет дочерним свойством link.

Ответ 5

Мы также сталкиваемся с этим много в наших заявлениях. То, что мы нашли, было хорошим решением: Просто покажите все строки в выпадающих списках. Затем, как только пользователь войдет в compobox в определенную строку, отредактируйте sourceource (с фильтром для этой строки). Когда комбобокс теряет фокус, вы можете повторно установить источник строк для отображения всего.

Ответ 6

У меня есть более простой способ, чем Гиллиган. Это похоже на большую работу, но на самом деле это не так. Мое решение требует наличия моей постоянной формы в качестве описания подформы. На моей подформе у меня есть два сопоставления для поиска, среди других полей, называемых "Оборудование и производитель". Оба просто содержат ключ Long Integer в источнике данных. Изготовителю необходимо отфильтровать то, что выбрано в Оборудовании. Единственный раз, когда я фильтрую Manufacturer.RowSource в событии Manufacturer_GotFocus.

Частный Sub Manufacturer_GotFocus()

If Nz(Me.Equipment, 0) > 0 Then
    Me.Manufacturer.RowSource = GetMfrSQL()  '- gets filtered query based on Equipment
Else
    Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
End If

Конец Sub

В Manufacturer_LostFocus я reset Manufacturer.RowSource всем производителям. Вам нужно сделать это, потому что, когда вы впервые нажимаете в подформе, события GotFocus запускаются для всех элементов управления, включая производителя, даже если вы фактически не обновляете какие-либо поля.

Частный Sub Manufacturer_LostFocus()

Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"

Конец Sub

В поле "Enter" производителя вы должны проверить, было ли оборудование выбрано, если не установить фокус на "Оборудование".

Частный Sub Manufacturer_Enter()

If Nz(Me.EquipmentID, 0) = 0 Then
    '-- Must select Equipment first, before selecting Manufacturer
    Me.Equipment.SetFocus
End If

Конец Sub

Вам также необходимо потребовать комбобокс производителя в событии Form_Current (т.е. Me.Manufacturer.Requery), и вы должны установить для свойства Cycle этой подформы текущую запись.

Кажется довольно простым, но вы еще не закончили. Вы также должны reset Manufacturer.RowSource всем производителям в событии SubForm_Exit в родительской форме в случае, если пользователь отправляется в combobox производителя, но не делает выбор и кликает где-то в родительской форме. Пример кода (в исходной форме):

Частный Sub sFrmEquip_Exit (Отменить как целое)

Me.sFrmEquip.Controls("Manufacturer").RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"

Конец Sub

Есть еще одна часть этого, которая не чиста. Когда вы нажимаете на "Производитель" и имеете несколько строк в сетке таблицы данных, поле "Производительность" будет пустым в других строках (данные под списками не сохранены), в то время как вы меняете производителя в текущей строке. После того, как вы перейдете из этого поля, текст в других полях производителя появится снова.

Ответ 7

Это, кажется, работает хорошо. CBOsfrmTouchpoint8 - это сокращение, сокращенное до квадрата выпадающего списка. CBOsfrmTouchpoint14 - текстовое поле, которое составляет остальную часть пространства. Никогда не говори никогда:

  Private Sub CBOsfrmTouchpoint8_Enter()  

  If Me.CBOsfrmTouchpoint8.Tag = "Yes" Then  
  CBOsfrmTouchpoint14.SetFocus  
  Me.CBOsfrmTouchpoint8.Tag = "No"  
  Exit Sub  
  End If  

  Me.CBOsfrmTouchpoint8.Tag = "No"  
  Me.CBOsfrmTouchpoint8.RowSource = "XXX"  
  Me.CBOsfrmTouchpoint8.Requery  
  Me.CBOsfrmTouchpoint8.SetFocus  
  End Sub 

  Private Sub CBOsfrmTouchpoint8_GotFocus()  
  Me.CBOsfrmTouchpoint14.Width = 0  
  Me.CBOsfrmTouchpoint8.Width = 3420  
  Me.CBOsfrmTouchpoint8.Left = 8580  
  Me.CBOsfrmTouchpoint8.Dropdown  
  End Sub

  Private Sub CBOsfrmTouchpoint8_LostFocus()  
  Me.CBOsfrmTouchpoint8.RowSource = "XXX"  
  Me.CBOsfrmTouchpoint8.Requery  
  End Sub 

  Private Sub CBOsfrmTouchpoint8_Exit(Cancel As Integer)  
  Me.CBOsfrmTouchpoint14.Width = 3180  
  Me.CBOsfrmTouchpoint8.Width = 240  
  Me.CBOsfrmTouchpoint8.Left = 11760  
  Me.CBOsfrmTouchpoint8.Tag = "Yes"  
  End Sub

Ответ 8

Что делать, если вы отключите параметр "Ограничить список" и выполните некоторую проверку перед обновлением, чтобы подтвердить, что то, что пользователь набрал, совпадает с чем-то в списке, который вы им представили?

Ответ 9

Лучше...

Установите в поле со списком "Источник управления" столбец запроса, в котором будут сохранены значения из вашего комбинированного поля.

Ответ 10

Для меня я думаю, что лучший способ и простой способ - создать временную таблицу со всеми связанными полями плюс дополнительное поле, которое является полем yeas/no.

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

Я думаю, что после этого легко перейти к выборам, просто небольшой цикл для чтения поля yeas/no из временной таблицы.

Я надеюсь, что это поможет

Ответ 11

Используйте OnEnter событие, чтобы заполнить поле со списком, не используйте фиксированный rowsource.

Ответ 12

Я только что сделал. Моим решением было использовать источник фиксированной строки, связанный с запросом. Запрос WHERE ссылается на элемент управления формой, т.е. Client=Forms!frmMain!ClientTextBox. Только это заполнит поле со списками с данными первой строки. Тогда трюк должен установить событие "On Enter", которое просто выполняет повторный запрос в комбинированном поле, например. ComboBox1.Requery, это будет повторно запрашивать это поле со списком и будет только перетаскивать данные, относящиеся к этой строке записи.

Надеюсь, что это сработает и для вас!

Ответ 13

Отказ от ответственности: я ненавижу доступ со страстью.

Не используйте непрерывные формы. Они - красная селедка, чего вы хотите достичь. Непрерывные формы - это одна и та же форма, повторяемая снова и снова с разными данными. Он уже является клоном обычного режима доступа Access, поскольку вы не можете иметь одну и ту же форму, открытую несколько раз. Поведение, которое вы видите, "как предусмотрено" в Access. Каждый из этих элементов управления ComboBox на самом деле является одним и тем же элементом управления. Вы не можете повлиять на него, не затрагивая остальных.

В принципе, то, что вы сделали здесь, запускается в область, где Access больше не подходит для вашего проекта (но не может канавы, поскольку он представляет собой большой объем работы уже).

То, что кажется наиболее вероятным курсом действий здесь, - это подделка его действительно хорошо. Запустите запрос к данным, а затем создайте элементы формы программно на основе результатов. Это довольно объемная работа, так как вы сами будете копировать хороший бит функций обработки данных Access.

Ответить Редактировать:
Но как бы то ни было, непрерывные формы не могут выполнить то, что вы хотите. Вот почему я предложил подделывать ваши собственные непрерывные формы, потому что непрерывные формы имеют реальные ограничения в том, что они могут делать. Не зацикливайтесь на конкретной реализации, которую вы не можете отпустить, когда она перестает работать.