каскадное поле со списком, вызывающее пустые поля в следующей записи - PullRequest
1 голос
/ 01 апреля 2010

У меня проблемы с каскадным списком. Все работает нормально с полями со списком и значения заполняются правильно.

Private Sub cmbAdjComp_AfterUpdate()
Me.cboAdjOff.RowSource = "SELECT AdjusterCompanyOffice.ID, 
AdjusterCompanyOffice.Address1, 
AdjusterCompanyOffice.Address2, 
AdjusterCompanyOffice.Address3, 
AdjusterCompanyOffice.Address4, 
AdjusterCompanyOffice.Address5 FROM" & _
" AdjusterCompanyOffice WHERE 
AdjusterCompanyOffice.AdjCompID = " & Me.cmbAdjComp.Column(1) & _
" ORDER BY AdjusterCompanyOffice.Address1"
Me.cboAdjOff = Me.cboAdjOff.ItemData(0)
End Sub

В дополнительном поле со списком есть запрос источника строки:

SELECT AdjusterCompanyOffice.ID, AdjusterCompanyOffice.Address1,    
AdjusterCompanyOffice.Address2, AdjusterCompanyOffice.Address3,
 AdjusterCompanyOffice.Address4, AdjusterCompanyOffice.Address5 FROM 
 AdjusterCompanyOffice ORDER BY AdjusterCompanyOffice.Address1;

Оба комбинированных списка имеют один и тот же источник управления.

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

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

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

Каким-то образом использование каскадных полей со списком создает конфликт с источником строки дополнительного поля со списком.

Надеюсь, это ясно! Ходили вокруг, чтобы найти ответ, но ничего не нашли.

любая помощь будет принята с благодарностью.

Спасибо

Noel

1 Ответ

0 голосов
/ 04 апреля 2010

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

Чтобы это исправить, вам нужно очистить фильтр во втором поле со списком. Для этого в событии OnCurrent вашей формы задайте для источника строк отфильтрованного поля со списком значение неотфильтровано:

  Me!cboAdjOff.RowSource = "SELECT AdjusterCompanyOffice.ID, AdjusterCompanyOffice.Address1, AdjusterCompanyOffice.Address2, AdjusterCompanyOffice.Address3, AdjusterCompanyOffice.Address4, AdjusterCompanyOffice.Address5 FROM AdjusterCompanyOffice ORDER BY AdjusterCompanyOffice.Address1"

Обычно я справляюсь с этим, создавая две константы в верхней части модуля формы, одну для оператора SELECT и одну для ORDER BY:

  cstrRecordsourceSelect = "SELECT AdjusterCompanyOffice.ID, AdjusterCompanyOffice.Address1, AdjusterCompanyOffice.Address2, AdjusterCompanyOffice.Address3, AdjusterCompanyOffice.Address4, AdjusterCompanyOffice.Address5 FROM AdjusterCompanyOffice"
  cstrRecordsourceOrderBy = "ORDER BY AdjusterCompanyOffice.Address1"

Тогда с этим гораздо легче справиться. В OnCurrent это выглядит так:

  Me!cboAdjOff.RowSource = cstrRecordsourceSelect & " " & cstrRecordsourceSelect 

... и в AfterUpdate вашего первого поля со списком:

  Me!cboAdjOff.RowSource = cstrRecordsourceSelect & _
    "WHERE AdjusterCompanyOffice.AdjCompID = " & Me!cmbAdjComp.Column(1) & _
    " " & cstrRecordsourceSelect

Это облегчает чтение кода, а также облегчает изменение источника строк, если это необходимо, поскольку вам нужно редактировать только константу.

...