powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Обработка выделенного диапазона записей.
11 сообщений из 36, страница 2 из 2
Обработка выделенного диапазона записей.
    #32337749
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо:
Set rs = CurrentDb.OpenRecordset("Select * from MойИсточник where id IN (" & ID_LIST & ")")
стандартная процедурина:

Код: plaintext
1.
2.
3.
4.
5.
6.
  Set db = CurrentDB()
Dim qdf As QueryDef
  Set qdf = db.CreateQueryDef("")
  qdf.SQL = mySQL
  qdf.Parameters( 0 ) = ...
  qdf.Parameters( 1 ) = ...
  Set rst = qdf.OpenRecordset()

и Фсе. (Этот прием используется обычно чтобы не обрабатывать "сложные" случаи - такие как дублирование кавычек в строковых "параметрах" и т.п. (или форматирование дат) при передаче данных непосредственно в сборку строки динамик ссыкуля. Хотя и последнее не столь сложно, как может показаться.).

ЗЫ. Напомню справку:

>>Пользователь имеет возможность создать временный объект QueryDef, задавая пустую строку в аргументе имя при вызове метода CreateQueryDef. Тот же результат будет получен, если задать пустую строку как значение свойства Name нового объекта QueryDef. Временные объекты QueryDef полезны в ситуации, когда требуется повторно выполнять динамические инструкции SQL без создания постоянных объектов в семействе QueryDefs. Временный объект QueryDef нельзя добавить ни в одно семейство, поскольку пустая строка не является допустимым значением имени постоянного объекта QueryDef.
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337788
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё сделал, но на заключительную строку:
DoCmd.OutputTo rst , , acFormatXLS, , True
получаю: "Несоответствие типа"

Методом CreateQueryDef пытаюсь создать временный запрос, но столкнулся с проблемой, что придётся прописывать длинное условие WHERE в аргументе SQL указанного метода.

Выходит, что указание Parametrs в этом случае бесполезно?
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337793
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Dim rst As DAO.Recordset
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337834
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полный текст процедуры:
Dim ctl As Control
Dim vItm As Variant
Dim Filtr As String
Dim rs As DAO.Recordset
Dim qd As QueryDef

Set ctl = Me!lСписок
For Each vItm In ctl.ItemsSelected
Filtr = Filtr & ctl.Column(0, vItm) & ", "
Next vItm
Filtr = Left(Filtr, Len(Filtr) - 2)
Set qd = CurrentDb.CreateQueryDef("")
qd.SQL = "Select * from истСписок where ID IN (" & Filtr & ")"

qd.Parameters(0) = [Forms]![мояФорма]![От]
qd.Parameters(1) = [Forms]![мояФорма]![По]
qd.Parameters(2) = [Forms]![мояФорма]![Клиент]
qd.Parameters(3) = [Forms]![мояФорма]![Отбор]

Set rs = qd.OpenRecordset()
DoCmd.OutputTo rs, , acFormatXLS, , True
На последней строке - знакомое сообщение о несоответствии типа и указание на переменную rs (замена её на qd ничего не дала)
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337842
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DoCmd.OutputTo типОбъекта [, имяОбъекта] [, форматВывода] [, имяФайла] [, автозагрузка][, файлШаблона]

типОбъекта	Одна из следующих встроенных констант:
acOutputForm (форма)
acOutputModule (модуль)
acOutputQuery (запрос)
acOutputReport (отчет)
acOutputTable (таблица)


Ищи метод .СopyFromRecordset Ёкселя. Он тут самое то.


2.
если в "параметрах" нет никакой бодяги, требующей спец обработки (форматирования дат, дублирования кавычек и т.п.) - просто клей строку в коде и открывай рекордсет.

Если хочешь попользовать уже существующую строку "источника данных" самого списка - програмно отрезай от нее заключительное ";" (если есть) и дошивай свои AND (... IN()). Вот именно тогда параметры можешь и передать как предложено.
!!!Я то считал, что строка с параметрами [Forms]![...]![...] у Вас _УЖЕ_ есть :0)

(правда, если в строке - источнике списка есть ORDER BY, или GROUP, HAVING и т.п. - то можешь программно врезаться _перед_ ними). Но это уже извращение (попадаешь в зависимость от конкретного порядка конструкций SQL. Есть правда предположение, что наилучшее место врезки - это после последнего WHERE в строке. Но оно тоже не всегда верно (подчиненные запросы в условиях отбора)).
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337858
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как понял их Хелпа - метод OutPutTo применяется с сохранённым объектам. У меня же - временный QueryDef, а про него в Хелпе что-то ничего нет.
На методы Ёкселя заморачиваться - последний для меня вариант(хотя остался самый железобетонный - таблицаТемр и занесение в неё записей построчно).
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337883
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в сетке есть статья по скорости вывода разными методами в Ёксель. Так CopyFromRecordset не самый худший.

Есть такая шняга - присоединить таблицу Ёкселя и выгружать набор прямо в нее. На местном сайте один из сторонников -Лох Позорный (войди в "Поиск", выбери участника и Excel).
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337898
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так я не спорю о скорости вывода, я о том, что раз CopyFromRecordset - метод Ёкселя, значит надо заморачиваться на подключение библиотеки, создание ссылки на Ёксель ...., а потом не забыть эту ссылку убить.
Значит из Аксесс только через ТемрТаблицу можно решить проблему?
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337922
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Подключать библиотеку только на разработку.
2. В процессе разработки объектные переменные определять AS OBJECT
3. Все константы библиотеки заменять значениями (вычислить в дебуггере)
4. Убить только объявленные объекты. (скорее всего один или 2).
5. После разработки отлючить библиотеку на фик. (если ты сделал криейтОлеОбьект как Object, то методы подтягиваются по мере надобности).
6. Преимущество: можешь выгрузить в шаблон хранящийся в твоей таблице - связанный объект XL и сохранить результат на диск только если потребует пользователь. (Не заморачиваешься с путями, именами и прочей лабудой). Правда в этом случае отпадают как OUTPUTTO, так и связывание таблицы (несохраненного файла). По крайней мере до момента, пока не сохранишь. Остается CopyFromRecordset и непосредственное редактирование содержимого ячеек (что много медленнее, но универсальнее).

__
Связывание таблицы екселя это не темп таблица. Это табличка, связанная через ISAM ёкселя (пункт Аксесса "внешние данные", тип XL, далее - по пунктам. Можно сделать и программно). Недостаток - надо описать поля на момент связывания, а не просто вывалить все, что получится.
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337942
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Связывание таблицы екселя это не темп таблица
я под ТемрТаблицей имел ввиду таблицу в локальной базе, в которую запросом будет добавляться каждая выделенная в списке запись и которую затем можно через OutputTo отоправить в Ёксель.
А на вопрос о временном QueryDef + OutputTo мне так и не ответили ...
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337964
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>А на вопрос о временном QueryDef + OutputTo мне так и не ответили

мдя. неужели выдержка из справки не внесла прояснение в затуманненный решением задачи мозг? OutputTo требует либо Имя (у темпа его нет) Либо АКтивности объекта на момент выполнения. Попробуйте открыть темповый запрос (как стандартный аксессовский грид, а не как рекордсет) и сделать его окно активным. :)

А способов много. Например кинуть данные SQL строки в форму (отчет), и опубликовать в XL уже форму (отчет). Только оно Вам надо? Можно генерить не темповую таблу, а _нормальный_ (именованный) qrydef, озаботясь уникальностью имени на момент создания (для разрешения коллизий промеж пользователями/сеансами), и не забывая порушить его по завершении выгрузки. Благо весь процесс от создания до удаления - в одной процедуре. Т.ч. имя хранить долго не надо. Ну и т.п.
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Обработка выделенного диапазона записей.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]