2015-10-04 2 views
1

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

Private Sub LoadList() 

    Dim rs As DAO.Recordset 
    Dim db As DAO.Database 
    Dim strSQL As String 
    Dim condition As String 

    Set db = CurrentDb 

    condition = " WHERE Schedule_ID = " & ScheduleID 

    strSQL = "SELECT Shifts.Shift_ID, Shifts.Start_Date_Time, Shifts.End_Date_Time, Locations.Location_Name FROM Shifts, Locations " & _ 
"WHERE Schedule_ID = " & ScheduleID & " AND Locations.Location_ID = Shifts.Location ORDER BY Start_Date_Time" 

    'Set Recordset Query 
    Set rs = db.OpenRecordset(strSQL) 

    RecCount = recordCount("Shifts", condition) 
    Me.lblCount.Caption = "Shift Count: " & RecCount 

    rs.MoveFirst 
    For i = 0 To RecCount - 1 
    Me.lstShifts.AddItem rs!Shift_ID & ";" & rs!Start_Date_Time & " TO " & rs!End_Date_Time & " AT " & rs!Location_Name 
    rs.MoveNext 
    Next i 

    'Close Connections and Reset Variables 
    rs.Close 
    Set rs = Nothing 
    Set db = Nothing 

    listdirty = False 
End Sub 

В базе данных всего десять записей, и все же список загружает данные три раза (всего 30). Я прошел через код, а в переменной RecCount он был правильно инициализирован до десяти, а цикл for повторяется в десять раз, как ожидалось. Этот элемент LoadList не вызывается более одного раза, поэтому я не понимаю, почему записи отображаются в списке несколько раз. Есть идеи?

+0

Добавить 'Debug.Print strSQL', запустить код, скопировать текст оператора SELECT из окна Immediate и вставить его в SQL View нового запроса в конструкторе запросов. Когда вы запускаете этот запрос, сколько строк оно возвращается? – HansUp

+0

Он возвращает 10 строк. – Alan

+1

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

ответ

2

Каждый раз, когда вы вызываете процедуру LoadList(), она добавляет строки в список. Поскольку поле списка содержит 30 строк, несмотря на то, что набор записей источника содержит только 10, либо LoadList() вызывается 3 раза, либо вы сохраняете форму с непустым списком значений и добавляете еще 10 строк при каждом Form Load.

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

rs.MoveFirst 
Me.lstShifts.RowSource = vbNullString ' make sure value list starts empty 
For i = 0 To RecCount - 1 
    Me.lstShifts.AddItem rs!Shift_ID & ";" & rs!Start_Date_Time & " TO " & rs!End_Date_Time & " AT " & rs!Location_Name 
    rs.MoveNext 
Next i 

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

  1. Изменить поле списка в RowSourceType собственности из «Список значений» к «Таблица/запрос».
  2. Убедитесь, что счетчик столбца свойство в окне списка в значение 2.
  3. В вашей LoadList() процедуры, пересмотреть список полей запроса к SELECT Shifts.Shift_ID, Shifts.Start_Date_Time & ' TO ' & Shifts.End_Date_Time & ' AT ' & Locations.Location_Name
  4. Наконец, назначить обновленный запрос к RowSource собственности в окне списка в: Me.lstShifts.RowSource = strSQL
Смежные вопросы