Пользовательский источник строки для поля комбинированного списка в длительной форме в Доступе

Вы можете создать число, используя:

select month(datecol) * 100 + (year(datecol) % 100)

. Для добавления нулей требуется немного больше работы:

select right('0' + convert(varchar(255), month(datecol) * 100 + (year(datecol) % 100)), 4)

Или вы можете использовать format():

[ 112]
13
задан DGM 17 September 2008 в 19:07
поделиться

11 ответов

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

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

Место поле комбинированного списка UNBOUND на форме. Тогда поместите текстовое поле BOUND для поля, которое Вы хотите отредактировать.

Удостоверяются, что поле комбинированного списка скрыто позади (ВЕСЬМА видимый, просто скрытый) позади текстового поля.

В событии OnCurrent заполняют поле списка необходимыми данными. Разрешение и "Предел для списка" его также.

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

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

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

15
ответ дан 1 December 2019 в 22:24
поделиться

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

1
ответ дан 1 December 2019 в 22:24
поделиться

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

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

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

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

3
ответ дан 1 December 2019 в 22:24
поделиться

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

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

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

[MySubForm].[Form]!MyID

, Который был бы ведущим свойством ссылки и MyID, будет дочернее свойство ссылки.

1
ответ дан 1 December 2019 в 22:24
поделиться

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

1
ответ дан 1 December 2019 в 22:24
поделиться

У меня есть более простой способ пойти, чем Gilligan. Это походит на большую работу, но это действительно не. Мое решение требует наличия моей длительной формы как таблица данных подчиненной формы. На моей подчиненной форме у меня есть два поля комбинированного списка поиска, среди других полей, названных оборудованием и Производителем. Оба просто содержат Длинное целое, вводят источник данных. Производитель должен быть фильтрован тем, что выбрано в оборудовании. Единственное время я фильтрую Производителя. 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 я сбросил Производителя. 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

Также необходимо повторно запросить поле комбинированного списка Manufacturer в событии Form_Current (т.е. Меня. Производитель. Перезапрос), и необходимо установить свойство Cycle этой подчиненной формы к "Текущей Записи".

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

Частный Sub sFrmEquip_Exit (Отмена Как Целое число)

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

Конец Sub

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

1
ответ дан 1 December 2019 в 22:24
поделиться

Что, если Вы выключаете опцию "Limit To List" и делаете некоторую проверку перед обновлением, чтобы подтвердить что, что пользователь, возможно, ввел в соответствиях что-то в списке, что Вы представили их?

0
ответ дан 1 December 2019 в 22:24
поделиться

Лучше...

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

0
ответ дан 1 December 2019 в 22:24
поделиться

Правовая оговорка: Я ненавижу Доступ со страстью.

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

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

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

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

-1
ответ дан 1 December 2019 в 22:24
поделиться

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

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

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

Надеюсь, это поможет

0
ответ дан 1 December 2019 в 22:24
поделиться

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

0
ответ дан 1 December 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: