2014-01-16 2 views
0

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

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

Можно ли использовать DoEvents для решения этой проблемы?

Ниже приведен мой код. Я подозреваю, что видеть весь этот код не нужно, но я делюсь всем этим на всякий случай.

Я использую Access.

Спасибо!

Option Compare Database 'Use database order for string comparisons 
Option Explicit 
Dim QuoteLogForm As Form 
Public KeystrokeCount As Integer 

'Define the similarity threshold for the matches list 
Const SIMIL_THRESHOLD As Single = 0.83 
Private m_strDialogResult As String 

'The basis of this code was derived from http://www.accessmvp.com/tomvanstiphout/simil.htm 

Private Sub Form_Current()  
    Matches 
End Sub 

Private Sub Matches() 
     'This sub calls the functions necessary to generate a query that lists 
     'the KFC RFQ #'s whose similarity exceeds the threashold, as defined above. 

     Dim sql As String 
     Dim strOpenArgs As String 
     Dim strInClause As String 

     'OpenArgs contains the part # to find similars for. 
     strOpenArgs = Replace(Replace(Nz(Me.Part_Number_Textbox.Value), "-", ""), " ", "")    'Nz changes Nulls to blanks 

     'Call the GetSimilarPartNos function below. 
     'This function returns a string of KFC RFQ #'s that exceed the threashold, wrapped in single quotes and separated by commas. 
     strInClause = GetSimilarPartNos(strOpenArgs) 

     'If any similar part numbers were found, run a query to select all the listed records 
     If VBA.Len(strInClause) > 0 Then 
      'Select records whose KFC RFQ #'s are found in the strInClause list, sort from most to least similar 
      sql = "select * from [Matches List Query] where [KFC RFQ #] in (" & strInClause & ")" ' order by SimilPct desc, DateShort desc" 

      '[Forms]![Price Form Parent]![Price Form].[Form].Customer_Filter_Box 
      Set Me.[Matches List Form].Form.Recordset = CurrentDb.OpenRecordset(sql, dbOpenSnapshot) 
     Else 
      'If no similar KFC RFQ #'s were found, select no records 
      sql = "select * from [Matches List Query] where 1 = 0" 
      Set Me.[Matches List Form].Form.Recordset = CurrentDb.OpenRecordset(sql, dbOpenSnapshot) 
     End If 

End Sub 

Private Function GetSimilarPartNos(ByVal strPartNo As String) As String 
'The GetSimilarPartNos function calls the fnSimil function and compiles a list (strInClause) 
'of KFC RFQ #'s whose part numbers exceed the threashold 
     Dim rs   As DAO.Recordset 
     Dim strInClause As String 
     Dim sngSimil As Single 

     'Erase all previous values in the [Quote Log].Simil field 
     CurrentDb.Execute "update [Quote Log] set Simil = 0", dbFailOnError 

     Set rs = CurrentDb.OpenRecordset("Quote Log")  ', dbOpenTable) 

     'Loop to calculate the similarity of all part numbers 
     While Not rs.EOF     'Loop until the end 
      Dim curPartNo As String 
      curPartNo = Replace(Replace(Nz(rs![Part #]), "-", ""), " ", "") 
      If rs![KFC RFQ #] = Me.[KFC RFQ #] Then 
       GoTo 120 
      End If 
      sngSimil = fnSimil(curPartNo, strPartNo) 

      'If the part number similarity value of a single record is greater than the 
      'threashold (as defined above), add the record's KFC RFQ # to strInClause 
      'strInClause forms a list of KFC RFQ #'s whose part numbers exceed the threashold 
      'in similarity, wrapped in single quotes and separated by commas 
      If sngSimil >= SIMIL_THRESHOLD Then 
       strInClause = strInClause & "'" & rs![KFC RFQ #] & "'," 
       'Show the Simil value on this form 
       rs.Edit 
       rs!Simil = sngSimil 
       rs.Update 
      End If 
120 rs.MoveNext 
     Wend 
     rs.Close 
     Set rs = Nothing 

     'Once the strInClause is completed, remove the last comma from the list 
     If Len(strInClause) > 0 Then strInClause = VBA.Left$(strInClause, Len(strInClause) - 1) 
     GetSimilarPartNos = strInClause 
End Function 

ответ

0

Пользовательский интерфейс висит, потому что работа выполняется потоком пользовательского интерфейса. Если вы хотите (или нуждаетесь) более отзывчивое приложение, вам нужно разгрузить работу в фоновый поток. Насколько мне известно, для VBA это не что-то для сердца, но вы можете взглянуть, VBA + Threads in MS Access.

Поскольку доступ представляет собой базу данных, он страдает всеми недостатками любой базы данных, главным образом находя данные, хранящиеся на медленных, обычно вращающихся носителях. Я предлагаю вам взглянуть на эту статью: Create and use an index to improve performance, чтобы помочь вам создать эффективные индексы для ваших запросов, если вы уже не индексировали их. Вам также необходимо рассмотреть последствия для работы WHERE, JOIN и ORDER BY предложения в ваших запросах. Убедитесь, что ваши индексы оптимизированы для ваших запросов, и ваши данные хранятся логически, так как они будут запрошены. Кроме того, если база данных не находится на машине, с которой выполняются запросы, у вас есть задержка ввода-вывода сети в ожидании ожидаемой задержки ввода-вывода. Это может существенно повлиять на производительность чтения в базе данных.

+0

Может ли DoEvents использоваться, чтобы этот запрос мог работать без висящей формы? – likearock83

+0

'DoEvents' просто позволяет потоку пользовательского интерфейса обрабатывать события пользовательского интерфейса, он будет вводить пользовательский интерфейс пользователя, но я сомневаюсь, что он будет быстрее загружать данные. Единственный вред, который я предвижу при использовании DoEvents, заключается в том, что пользователь мог выбрать опцию из списка, и до того, как он завершил выполнение этого запроса, пользователь мог выбрать новый элемент из раскрывающегося списка, начиная второй запрос , –

+0

У моих пользователей нет проблем с тем, как медленно загружаются данные в списке. Их неудовлетворенность заключается в том, что REST формы зависает до загрузки списка. Я не совсем понимаю функцию DoEvents. В том числе, где в моем коде можно разместить и какой код следует добавить. Я видел, что он использовался в Do While, но много циклов, но не знаю, будет ли это подходящим в моем случае. Если бы вы могли помочь в любом случае, я был бы признателен. – likearock83

0

Возможно, у вас может быть неправильное событие формы. Событие form_Current срабатывает между каждой записью, и я не могу себе представить, что вам действительно нужно. Вместо этого попробуйте переместить рутину «Матчи» в событие OnLoad.

Смежные вопросы