Я все еще новичок в Access и бьюсь уже два дня. Пожалуйста, посмотрите ниже код, который я использовал. Это немного затянуто, и я не уверен, является ли это причиной моей проблемы (запуск занимает много времени, иногда Combobox зависает на 2-3 секунды), поскольку он проходит через код, а также через запрос ListParts. .
Я хочу знать, есть ли способ заставить Combobox предварительно загрузить запрос, чтобы, когда я начинаю вводить число, он не зависал? Обратите внимание: я нашел часть такого кода, но дополнил его, чтобы попытаться улучшить программу.
Ниже приведен код поля со списком PartType, которое является первым полем в записи. Как только это будет выбрано также из раскрывающегося списка, тогда
Private Sub PartType_AfterUpdate()
If Me!PartType.Value = "PARTS" Then
Me!PartNumber.RowSource = "ListPART"
Me!UnitPrice.Locked = True
ElseIf Me!PartType.Value = "LABOUR" Then
Me!PartNumber.RowSource = "ListLABOUR"
Me!UnitPrice.Locked = True
ElseIf Me!PartType.Value = "SUNDRIES" Then
Me!PartNumber.RowSource = "ListSUNDRIES"
Me!UnitPrice.Locked = False
ElseIf Me!PartType.Value = "SUBLET" Then
Me!PartNumber.RowSource = "ListBLANK"
Me!UnitPrice.Locked = False
End If
End Sub
Я также использовал этот код в подразделе Forms Change().
Private Sub Partnumber_Change()
'filter dropbox as you type
'If Len(PartNumber.Text) > 6 Then
'Dim rs As Recordset
'Set rs = CurrentDb.OpenRecordset(RecordSQL & " WHERE Code = '" & PartNumber.Text & "' ORDER BY [Code]")
'If (rs.BOF And rs.EOF) Then 'only requery on no exact match
' PartNumber.RowSource = RecordSQL & " WHERE Code Like '*' & PartNumber.text & '*' ORDER BY [Code]"
' PartNumber.Dropdown
'End If
'End If
End Sub
Дополнительным преимуществом является то, что у меня запущен следующий код, поскольку мне нужно проверить, была ли эта часть заменена. Как это работает, так это то, что он открывает другую форму, которая заполняется данными, а затем проверяет, есть ли буква «S» в заменяющем текстовом поле. Иногда может случиться так, что часть была заменена три или четыре раза.
Private Sub PartNumber_AfterUpdate()
If Me!PartType.Value = "PARTS" Then
'FilterComboAsYouType Me.PartNumber, "SELECT * FROM ListParts", "Code"
'PartNumber.LimitToList = False
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
'DoCmd.Requery "ListParts"
'PartNumber.LimitToList = True
'DoCmd.GoToRecord , , acNext
'DoCmd.GoToRecord , , acPrevious
DoCmd.Close acForm, "PartPricesSUB"
DoCmd.OpenForm "PartPricesSUB"
Forms!PartPricesSUB.Visible = False
'supercede 1
If Forms!PartPricesSUB!Supercede.Value = "S" Then
Me!PartNumber.Value = Forms!PartPricesSUB!SupercedeCode.Value
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
DoCmd.SetWarnings False
DoCmd.OpenQuery "UpdateSupercede1"
DoCmd.SetWarnings True
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
Forms!PartPricesSUB.Visible = False
DoCmd.Close acForm, "PartPricesSUB"
DoCmd.OpenForm "PartPricesSUB"
Forms!PartPricesSUB.Visible = False
MsgBox "This part number is a supercession here is the new code", vbOKOnly
Me!TotalPrice.Value = (Me!Qty.Value * Me!UnitPrice.Value) - ((Me!Qty.Value * Me!UnitPrice.Value) * Me![Discount])
'supercede 2
If Forms!PartPricesSUB!Supercede.Value = "S" Then
Me!PartNumber.Value = Forms!PartPricesSUB!SupercedeCode.Value
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
DoCmd.SetWarnings False
DoCmd.OpenQuery "UpdateSupercede1"
DoCmd.SetWarnings True
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
Forms!PartPricesSUB.Visible = False
DoCmd.Close acForm, "PartPricesSUB"
DoCmd.OpenForm "PartPricesSUB"
Forms!PartPricesSUB.Visible = False
MsgBox "This part number is a supercession here is the new code", vbOKOnly
Me!TotalPrice.Value = (Me!Qty.Value * Me!UnitPrice.Value) - ((Me!Qty.Value * Me!UnitPrice.Value) * Me![Discount])
End If
'supercede 3
If Forms!PartPricesSUB!Supercede.Value = "S" Then
Me!PartNumber.Value = Forms!PartPricesSUB!SupercedeCode.Value
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
DoCmd.SetWarnings False
DoCmd.OpenQuery "UpdateSupercede1"
DoCmd.SetWarnings True
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
Forms!PartPricesSUB.Visible = False
DoCmd.Close acForm, "PartPricesSUB"
DoCmd.OpenForm "PartPricesSUB"
Forms!PartPricesSUB.Visible = False
MsgBox "This part number is a supercession here is the new code", vbOKOnly
Me!TotalPrice.Value = (Me!Qty.Value * Me!UnitPrice.Value) - ((Me!Qty.Value * Me!UnitPrice.Value) * Me![Discount])
End If
'Supercede 4
If Forms!PartPricesSUB!Supercede.Value = "S" Then
Me!PartNumber.Value = Forms!PartPricesSUB!SupercedeCode.Value
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
DoCmd.SetWarnings False
DoCmd.OpenQuery "UpdateSupercede1"
DoCmd.SetWarnings True
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
Forms!PartPricesSUB.Visible = False
DoCmd.Close acForm, "PartPricesSUB"
DoCmd.OpenForm "PartPricesSUB"
Forms!PartPricesSUB.Visible = False
MsgBox "This part number is a supercession here is the new code", vbOKOnly
Me!TotalPrice.Value = (Me!Qty.Value * Me!UnitPrice.Value) - ((Me!Qty.Value * Me!UnitPrice.Value) * Me![Discount])
End If
'Supercede 5
If Forms!PartPricesSUB!Supercede.Value = "S" Then
Me!PartNumber.Value = Forms!PartPricesSUB!SupercedeCode.Value
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
DoCmd.SetWarnings False
DoCmd.OpenQuery "UpdateSupercede1"
DoCmd.SetWarnings True
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
Forms!PartPricesSUB.Visible = False
DoCmd.Close acForm, "PartPricesSUB"
DoCmd.OpenForm "PartPricesSUB"
Forms!PartPricesSUB.Visible = False
MsgBox "This part number is a supercession here is the new code", vbOKOnly
Me!TotalPrice.Value = (Me!Qty.Value * Me!UnitPrice.Value) - ((Me!Qty.Value * Me!UnitPrice.Value) * Me![Discount])
End If
Else
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
DoCmd.Close acForm, "PartPricesSUB"
DoCmd.OpenForm "PartPricesSUB"
Forms!PartPricesSUB.Visible = False
Me!Description.Value = Forms!PartPricesSUB!Description.Value
Me!UnitPrice.Value = Forms!PartPricesSUB!UnitPrice.Value
Me!DscCode.Value = Forms!PartPricesSUB!DscCode.Value
Me!Qty.Value = "1"
DoCmd.GoToControl "Qty"
Me!TotalPrice.Value = (Me!Qty.Value * Me!UnitPrice.Value) - ((Me!Qty.Value * Me!UnitPrice.Value) * Me![Discount])
End If
ElseIf Me!PartType.Value = "LABOUR" Then
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
DoCmd.Close acForm, "PartPricesSUB"
DoCmd.OpenForm "PartPricesSUB"
Forms!PartPricesSUB.Visible = False
Me!Description.Value = Forms!PartPricesSUB!Description.Value
Me!UnitPrice.Value = Forms!PartPricesSUB!UnitPrice.Value
Me!DscCode.Value = Forms!PartPricesSUB!DscCode.Value
Me!Qty.Value = "1"
DoCmd.GoToControl "Qty"
Me!TotalPrice.Value = (Me!Qty.Value * Me!UnitPrice.Value) - ((Me!Qty.Value * Me!UnitPrice.Value) * Me![Discount])
ElseIf Me!PartType.Value = "SUNDRIES" Then
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
DoCmd.Close acForm, "PartPricesSUB"
DoCmd.OpenForm "PartPricesSUB"
Forms!PartPricesSUB.Visible = False
Me!Description.Value = Forms!PartPricesSUB!Description.Value
Me!UnitPrice.Value = Forms!PartPricesSUB!UnitPrice.Value
Me!DscCode.Value = Forms!PartPricesSUB!DscCode.Value
Me!Qty.Value = "1"
DoCmd.GoToControl "Qty"
Me!TotalPrice.Value = (Me!Qty.Value * Me!UnitPrice.Value) - ((Me!Qty.Value * Me!UnitPrice.Value) * Me![Discount])
ElseIf Me!PartType.Value = "SUBLET" Then
DoCmd.GoToRecord , , acNext
DoCmd.GoToRecord , , acPrevious
DoCmd.Close acForm, "PartPricesSUB"
DoCmd.OpenForm "PartPricesSUB"
Forms!PartPricesSUB.Visible = False
Me!Description.Value = Forms!PartPricesSUB!Description.Value
Me!UnitPrice.Value = Forms!PartPricesSUB!UnitPrice.Value
Me!DscCode.Value = Forms!PartPricesSUB!DscCode.Value
Me!Qty.Value = "1"
DoCmd.GoToControl "Description"
Me!TotalPrice.Value = (Me!Qty.Value * Me!UnitPrice.Value) - ((Me!Qty.Value * Me!UnitPrice.Value) * Me![Discount])
Else
End If
DoCmd.GoToControl "Qty"
'PartNumber.RowSource = RecordSQL
End Sub
🤔 А знаете ли вы, что...
Access позволяет создавать формы для ввода и редактирования данных с помощью визуального конструктора.
Поле со списком рассчитано примерно на 1000 строк, может быть, на 5000 строк, и это все.
Итак, имейте в виду, что если вы разрешаете навигацию по записям в форме (а часто этого не следует делать), то при переходе к следующей записи, чтобы Access отображал/обновлял/поддерживал поле со списком, тогда оно должно быть получено из источник данных для поля со списком. ОДНА запись для поля со списком.
Конечно, если вы откроете (отбросите) поле со списком, то ему потребуется загрузить и отобразить 500 000 строк — такая конструкция просто не будет работать с таким количеством строк. Как я уже заметил, даже 5000 строк, вероятно, слишком много.
Тот факт, что вы видите ТОЛЬКО 3-5-секундную задержку, является свидетельством поразительных скоростей, которыми мы наслаждаемся сегодня с точки зрения компьютерной обработки. Однако ваша установка, скорее всего, на 100% работает на вашем компьютере, и если вы когда-нибудь планируете иметь несколько пользователей, то копия базы данных, скорее всего, будет находиться не на компьютере, а в общей папке или, что еще лучше, вы будете используя, скажем, SQL-сервер для внутренней базы данных. В любом случае, как только вы создадите сеть между вашей формой и источником данных, такой дизайн будет работать во МНОГО раз медленнее, чем тот, который у вас есть сейчас (в 100 раз медленнее). Это означает, что задержка в 3-5 секунд превратится в задержку в 400 секунд (6 минут или даже дольше!!!).
Итак, это поле со списком на 500 000 строк просто необходимо убрать, и оно вообще не будет работоспособным - просто нежизнеспособный выбор с точки зрения пользовательского интерфейса и нежизнеспособный выбор с технологической точки зрения.
Я имею в виду, как пользователь может пролистать и выбрать одну строку из 500 000 строк? Это просто не будет работоспособным решением.
Итак, некоторые решения:
Если это номер счета-фактуры, номер предложения, идентификатор продукта и т. д., попросите пользователя просто ввести это значение. Если требуется поиск какого-либо типа, то, конечно, вам нужно открыть какую-то форму поиска, которую сможет использовать пользователь, и он сможет выполнить поиск и найти идентификатор одной строки продукта с помощью удобной формы, которая позволяет такой поиск. После закрытия значение идентификатора PK (первичного ключа) одной строки может быть сохранено в вашей таблице.
Теперь, когда вы загружаете форму или перемещаетесь по записям, вы имеете дело с загрузкой и поиском в 500 000 строк, с которыми сталкивается поле со списком.
Итак, вам нужно создать красивую (но действительно красивую) форму, которая позволит пользователю искать и находить продукт - нечто гораздо большее, чем то, что может предоставить поле со списком, но, что более важно, не вытягивает 500 000 строк, а ПОТОМ представляет список выбор.
Итак, скажем, в моей форме есть опция выбора города. Моя таблица городов содержит около 150 000 строк. Итак, как уже отмечалось, поле со списком не будет работать.
Итак, мы создаем такой пользовательский интерфейс:
Обратите внимание, что, хотя у нас есть 150 000 строк, для выбора города достаточно всего нескольких щелчков мыши.
Итак, вместо поля со списком вам нужна форма поиска, и ДЕЙСТВИТЕЛЬНО хорошая, которая позволит пользователю выбрать этот продукт. Возможно, у вас есть несколько категорий, таких как тип продукта, тип запаса, местоположение или что-то еще. Добавив НЕСКОЛЬКО простых фильтров и категорий детализации, такой поиск становится простым для пользователя, но также удобен для базы данных, поскольку из базы данных нужно извлечь очень мало записей.
Приведенный выше пример не был Access, но в этом примере доступа вместо поля со списком для выбора клиента база данных клиентов довольно большая (несколько 100 000 строк). И снова мне пришлось заменить поле со списком всплывающей формой поиска. Это позволяет мне фильтровать по фамилии и имени. Таким образом, даже при нескольких 100 000 строк результирующий список фильтров будет содержать всего около 100-200 записей, и это будет быстро.
В некоторых случаях я делаю кнопку похожей на поле со списком «стрелка вниз», но на самом деле я использую кнопку. В целом концепция та же: мы запускаем форму, которая позволяет выполнять некоторую фильтрацию, и, таким образом, мы не извлекаем всю таблицу.
Вспомните любую систему, которую вы использовали в прошлом. Когда вы используете Google, он не загружает весь Интернет, и вы затем используете Ctrl-F, чтобы найти запись.
Когда вы используете какую-либо систему учета, вы ищете имя клиента или номер счета, и вам отображается список результатов, который вы можете выбрать. Итак, будет ли такое программное обеспечение базироваться на веб-сайте или на настольном компьютере?
Подумайте о любом приложении, которое вы использовали в прошлом: в нем предусмотрена некоторая форма поиска и средства, позволяющие сузить то, что вы хотите выбрать.