Вопросы | ms-access

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

Вопрос

DGM | 48054 просмотров | рейтинг: 0

Я искал вокруг, и кажется, что это ограничение в MS Access, поэтому мне интересно, какие творческие решения другие нашли эту загадку. Если у вас есть непрерывная форма, и вы хотите, чтобы поле было полем со списком параметров, специфичных для этой строки, Access не сможет выполнить поставку; источник строки поля со списком запрашивается только один раз в начале формы, и, таким образом, отображает неправильные параметры для остальной части формы. Следующим шагом, который мы все пытаемся, конечно, является использование события onCurrent для запроса поля со списком, которое фактически ограничивает параметры данной строкой. Однако в этот момент Access сходит с ума и запрашивает все поля со списком для каждой строки, и часто результатом является исчезновение и повторное появление параметров в других строках, в зависимости от того, выбрали ли они параметр, действительный для источник строки текущей записи. Единственное решение, которое я нашел, это просто перечислить все доступные варианты, все время. Есть какие-нибудь креативные ответы? Редактировать Кроме того, я должен отметить, что причина для поля со списком состоит в том, чтобы иметь запрос в качестве таблицы поиска, реальное значение должно быть скрыто и сохранено, в то время как отображается удобочитаемая версия ... несколько столбцов в строке поля со списком источник. Таким образом, изменение предела для списка не помогает, потому что идентификаторы, которых нет в текущем запросе источника строки, не будут иметь подходящей для чтения человеком части. В этом конкретном случае непрерывные формы имеют большой смысл, поэтому, пожалуйста, не говорите мне, что это неправильное решение. Я прошу любые творческие ответы.



Ответы

BIBD

+ -1 -
Отказ от ответственности: я ненавижу доступ со страстью. Не используйте непрерывные формы. Они красная сельдь для того, чего ты хочешь достичь. Непрерывные формы - это одна и та же форма, повторяемая снова и снова с разными данными. Это уже мешает нормальному режиму работы Access, поскольку одна и та же форма не может быть открыта несколько раз. Поведение, которое вы видите, такое же, как и в Access. Каждый из этих элементов управления ComboBox фактически является одним и тем же элементом управления. Вы не можете влиять на одного, не затрагивая других. По сути, то, что вы сделали здесь, это столкновение с областью, где Access больше не подходит для вашего проекта (но не может отказаться, потому что он уже представляет большой объем работы). То, что кажется наиболее вероятным способом действий здесь, это подделать это действительно хорошо. Запустите запрос к данным, а затем создайте элементы формы программно на основе результатов. Это достаточный объем работы, так как вы будете самостоятельно дублировать функциональность обработки данных в Access. Ответить на редактирование: Но как они есть, непрерывные формы не могут выполнить то, что вы хотите. Вот почему я предложил подделать ваши собственные непрерывные формы, потому что непрерывные формы имеют реальные ограничения в том, что они могут делать. Не зацикливайтесь на конкретной реализации, которую вы не можете отпустить, когда она перестает работать.  


David-W-Fenton

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


Philippe Grondier

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


Gilligan

+ 3 -
использовать непрерывные формы .. определенно. Фактически вы можете создавать целые приложения с отличным и интуитивно понятным пользовательским интерфейсом, построенным на непрерывных формах. Не слушай тост! Ваше решение перечисления всех доступных вариантов является правильным. На самом деле нет другого чистого решения. Но вы ошибаетесь, когда говорите, что Acccess сходит с ума. В непрерывной форме вы можете видеть каждую строку как экземпляр подробного раздела, где поле со списком является свойством, общим для всех экземпляров подробного раздела. Вы можете обновить это свойство для всех экземпляров, но не можете установить его для одного конкретного экземпляра. Вот почему Access ДОЛЖЕН отображать одни и те же данные в выпадающем списке для всех записей! Если вам нужно принимать только специфичные для записи значения в этом комбинированном списке, используйте событие beforeUpdate, чтобы добавить процедуру управления. Если новое значение не может быть принято, вы можете отменить обновление данных, вернув предыдущее значение в поле. Вы не можете установить для свойства limitToList значение «Нет», если связанные данные (те, которые хранятся в элементе управления) скрыты. Это логично: как машина может принять ввод новой строки данных, когда связанное поле (не видно) остается пустым?  


Basel Juma

+ 1 -
Я не думаю, что непрерывные формы Access вообще должны быть осуждены, но я определенно считаю, что их следует избегать для РЕДАКТИРОВАНИЯ ДАННЫХ. Они отлично работают со списками и предоставляют вам значительно больше возможностей форматирования, чем просто списки (и с ними гораздо проще работать, хотя, конечно, они не поддерживают множественный выбор). Если вы хотите использовать непрерывную форму для перехода к записям для редактирования, используйте подчиненную форму, отображающую подробные данные для редактирования, и используйте значение PK из подчиненной формы для поля ссылки. Это можно сделать с помощью непрерывной формы, в которой вы размещаете подчиненную форму детали в верхнем или нижнем колонтитуле, связанной с PK таблицы за непрерывной формой. Или, если вы используете непрерывную форму для отображения дочерних данных в родительской форме, вы можете связать подробную подчиненную форму со ссылкой на PK в непрерывной подчиненной форме, что-то вроде:
 [MySubForm].[Form]!MyID
 

Это было бы свойство хозяина ссылки, а MyID было бы дочерним свойством ссылки.


BIBD

+ -1 -
Я также ненавижу Access, но вы должны играть с картами, которые вам сдаются. Непрерывные формы - замечательная вещь в Access, пока вы не столкнетесь с какой-либо сложностью, как это обычно бывает, как в этом случае. Вот что я хотел бы сделать, столкнувшись с этой ситуацией (и я уже реализовывал подобные обходные пути): Поместите UNBOUND комбобокс на форму. Затем поместите BOUND textBox для поля, которое вы хотите редактировать. Убедитесь, что поле со списком скрыто позади (НЕ невидимо, просто скрыто) позади текстового поля. В событии OnCurrent заполните listBox необходимыми данными. Идите вперед и лимит, чтобы перечислить это тоже. В событии OnEnter или OnClick элемента textBox укажите фокус комбинированного списка. Это выведет комбобокс на первый план. Когда фокус покидает поле со списком, он снова прячется. В событии AfterUpdate выпадающего списка установите значение текстового поля равным значению выпадающего списка. В зависимости от вашей ситуации могут потребоваться некоторые другие детали, но они должны более или менее достичь вашей цели, не добавляя слишком много сложности.  


David-W-Fenton

+ 0 -
У меня есть более простой путь, чем Гиллиган. Кажется, много работы, но на самом деле это не так. Мое решение требует наличия моей непрерывной формы в виде таблицы данных подчиненной формы. В моей подчиненной форме у меня есть два комбинированных списка поиска, среди прочих, называемых «Оборудование» и «Производитель». Оба просто держат длинную целую клавишу в источнике данных. Производитель должен быть отфильтрован по тому, что выбрано в Оборудование. Единственный раз, когда я фильтрую Manufacturer.RowSource, находится в событии Manufacturer_GotFocus. Private 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
 

End Sub В Manufacturer_LostFocus я также сбрасываю Manufacturer.RowSource для всех производителей. Это необходимо сделать, поскольку при первом щелчке в подчиненной форме события GotFocus запускаются для всех элементов управления, включая «Производителя», даже если вы не обновляете никакие поля. Private Sub Manufacturer_LostFocus ()
 Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
 

End Sub В событии Enter производителя вы должны проверить, выбрано ли оборудование, если не установлено фокус на оборудование. Private Sub Manufacturer_Enter ()
 If Nz(Me.EquipmentID, 0) = 0 Then
    '-- Must select Equipment first, before selecting Manufacturer
    Me.Equipment.SetFocus
End If
 

End Sub Вам также необходимо запросить комбинированный список «Производитель» в событии Form_Current (т.е. Me.Manufacturer.Requery), а для свойства Cycle этой подчиненной формы следует установить значение Текущая запись. Кажется достаточно простым, но вы еще не закончили. Вы также должны сбросить Manufacturer.RowSource для всех производителей в событии SubForm_Exit в родительской форме, если пользователь переходит к списку производителей, но не делает выбор и щелкает где-то в родительской форме. Пример кода (в родительской форме): Private Sub sFrmEquip_Exit (Отмена как целое число)
 Me.sFrmEquip.Controls("Manufacturer").RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
 

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


Philippe Grondier

+ 1 -
лучше ... Задайте для поля со списком «Источник управления» столбец запроса, в котором будут храниться значения из этого поля со списком.  


Gilligan

+ 3 -
Для меня я думаю, что лучший и самый простой способ - это создать временную таблицу, в которой есть все ваши связанные поля плюс дополнительное поле, которое является полем да / нет. Затем вы будете использовать эту таблицу в качестве источника данных для непрерывного для. Вы можете использовать onLoad для заполнения временной таблицы нужными вам данными. Я думаю, что после этого легко сделать цикл выбора, просто небольшой цикл для чтения поля yeas / no из временной таблицы. Я надеюсь, это поможет


Теги

ms-access