2013-12-06 4 views
1

У меня есть источник записи формы, установленный в сложный SQL-выбор. Это прекрасно работает. Если это помогает знать, макет формы является табличным. Ниже приведен пример данных:combobox rowsource на основе источника записи исходного поля (отдельного)

order carrier billto employee 
1  smgd horm chrnic 
2  axxm sele chrnic 
3  smgd horm redned 
4  mcta cron greand 
5  mcta cron greand 

Его принципиально невыполненные записи заказа. Я хочу, чтобы поле со списком отображало разные имена сотрудников (chrnic, redned, greand) на основе текущих записей. Я буду кодировать его, чтобы отфильтровать форму. Кажется просто, но у меня возникли проблемы

вещи я пытался:

  • попытался установить RowSource в me.recordsource, но получить
    • Вероятно, что мне нужно, чтобы разобрать & редактировать эту строку
  • Я скопировал сложный запрос & поставить в качестве источника записей комбинированного окна &, который работал, чтобы фильтровать форму, так что я знаю, что логика фильтра правильно. Я просто хочу, чтобы он был динамическим, поэтому нам нужно только изменить инструкцию SQL в одном месте, если это необходимо
+0

Пожалуйста, просмотрите ваше заявление sql. или добавить ** Выберите «Отдельный сотрудник» из таблицы ** в качестве источника строк combobox. – Hiten004

+0

Имейте в виду, что это пример данных, поддерживающих это, например: SELECT orders.order, orderdetail.carrier, orderdetail.billto, orderdetail.employee FROM orders o JOIN orderdetail od ON o.order = od.order WHERE orders.billed = false – greggmcfg

ответ

1

«У меня есть источник записи формы, разработанный для выработки SQL-запроса».

Сохраните этот запрос как названный QueryDef. Я сделаю вид, что вы выбрали qryRecordSource как имя.

«Я хочу, чтобы поле со списком, чтобы показать различные имена сотрудников ... на основе текущих записей»

Для коробки использования источника строки комбо ...

SELECT DISTINCT employee 
FROM qryRecordSource 
ORDER BY 1; 

, а затем фильтровать форму на основе выбора комбо, добавить командную кнопку, cmdApplyFilter, и использовать это в процедуре события нажмите ...

Me.Filter = "[employee] = '" & Me.YourComboName.Value & "'" 
Me.FilterOn = True 

Если имена сотрудника может включать апостроф, использовать это для выражения Filter ...

Me.Filter = "[employee] = '" & _ 
    Replace(Me.YourComboName.Value, "'", "''") & "'" 

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

SELECT "*** ALL ***" AS employee 
FROM Dual 
UNION 
SELECT employee 
FROM qryRecordSource 
ORDER BY 1; 

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

If Me.YourComboName.Value = "*** ALL ***" Or _ 
     IsNull(Me.YourComboName.Value) Then 
    Me.Filter = vbNullString 
    Me.FilterOn = False 
Else 
    Me.Filter = "[employee] = '" & Me.YourComboName.Value & "'" 
    Me.FilterOn = True 
End If 

И на самом деле вам даже не понадобится командная кнопка. Вы можете установить Filter из события AfterUpdate комбо.

+0

@greggmcfg Я изменил второй запрос из 'UNION ALL' только на' UNION'. С помощью 'UNION' запрос возвращает только уникальные строки, поэтому' DISTINCT' больше не требуется. – HansUp

+0

Не уверен, что вы подразумеваете под 'QueryDef', на основе вашего имени. Предполагаю, вы просто имеете в виду объект запроса. Дух, кажется таким очевидным сейчас. Ваше последнее утверждение - это направление, в котором я хочу идти, но как отключить фильтр без кнопки? – greggmcfg

+0

Правильно, объект QueryDef является объектом запроса. Если вы используете запрос, подобный второму примеру для вашего источника со списком строк, вы можете использовать событие «AfterUpdate» комбо, чтобы проверить, выбрана ли его выбранная строка = '*** *** *** ***. Если это равно, FilterOn = False'. В противном случае создайте и примените фильтр, как в блоке 'Else'. – HansUp

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