2016-05-11 4 views
1

У меня есть большой стол. Я делаю форму, которая отображает таблицу, и позволяет пользователю использовать стандартные фильтры Access во многих разных полях, чтобы выбрать только некоторые данные. Затем, после того как пользователь использовал фильтры для выбора только некоторых данных, я хочу иметь возможность включать только результирующий набор записей (а не всю исходную таблицу) в различные запросы.Использование отфильтрованных записей из формы в запросе

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

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

ответ

1

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

Примечание: Form. является стандартным и не относится к вашей форме. Таким образом, ваша ссылка должна быть Me!SubformName!Form.RecordsetClone, если она вызвана из основной формы. MSDN

После создания клона, похоже, вы можете использовать sql, чтобы сбросить набор записей в таблицу temp. Но, как отметил @Andre, добавление PK было бы идеальным, чтобы уменьшить нагрузку на большие наборы записей. Создание SQL строки я нашел просто:

sql = "INSERT INTO TEMPTable VALUES" & rs.Fields("YourPKFieldNameFromSUBFORM")

Предполагая sql и rs были объявлены как строки и ваш клонированного записей соответственно, и TempTable уже создана с одной колонкой для вашего ПК. Source: #5 и MSDN Однако вам все равно нужно будет прокрутить каждую запись клона, поскольку оператор sql выводит только одну строку за раз.

+1

Я думаю также, что 'RecordsetClone' это путь, но он все равно придется вставьте данные во временную таблицу (только ПК, а затем присоедините ее к основной таблице или ко всем столбцам). – Andre

+0

Другими словами, нет прямого доступа к 'RecordsetClone' непосредственно в таблицу, и мне нужно пройти через нее и вручную вставить его, как я предложил в своем вопросе? – clum

+0

@clum Это выглядит так. :(Я попытался использовать строку sql, чтобы сбрасывать все строки, но выводит только первую запись. Вам нужно будет зацикливать, чтобы получить все значения из вашего клона в вашей таблице. – MoondogsMaDawg

0

В дополнение к ответу Кристофера D., вот окончательный код, который я закончил с использованием:

CurrentDb.Execute "DELETE FROM FilteredJobs" 
Dim rs As Recordset 
Set rs = Search_subform.Form.RecordsetClone 
rs.MoveFirst 
While Not rs.EOF 
    CurrentDb.Execute "INSERT INTO FilteredJobs VALUES (" & rs.Fields("JobID") & ")" 
    rs.MoveNext 
Wend 
+0

Важное замечание: это отлично работало во время разработки при использовании небольшое количество данных. При использовании в реальной жизни это занимает очень много времени, когда есть еще большой набор данных (например, когда нет фильтров или едва ограниченных фильтров). У меня все еще нет хорошего решения для этого , – clum