|
|
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
вместо: Set rs = CurrentDb.OpenRecordset("Select * from MойИсточник where id IN (" & ID_LIST & ")") стандартная процедурина: Код: plaintext 1. 2. 3. 4. 5. 6. и Фсе. (Этот прием используется обычно чтобы не обрабатывать "сложные" случаи - такие как дублирование кавычек в строковых "параметрах" и т.п. (или форматирование дат) при передаче данных непосредственно в сборку строки динамик ссыкуля. Хотя и последнее не столь сложно, как может показаться.). ЗЫ. Напомню справку: >>Пользователь имеет возможность создать временный объект QueryDef, задавая пустую строку в аргументе имя при вызове метода CreateQueryDef. Тот же результат будет получен, если задать пустую строку как значение свойства Name нового объекта QueryDef. Временные объекты QueryDef полезны в ситуации, когда требуется повторно выполнять динамические инструкции SQL без создания постоянных объектов в семействе QueryDefs. Временный объект QueryDef нельзя добавить ни в одно семейство, поскольку пустая строка не является допустимым значением имени постоянного объекта QueryDef. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 13:35 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Всё сделал, но на заключительную строку: DoCmd.OutputTo rst , , acFormatXLS, , True получаю: "Несоответствие типа" Методом CreateQueryDef пытаюсь создать временный запрос, но столкнулся с проблемой, что придётся прописывать длинное условие WHERE в аргументе SQL указанного метода. Выходит, что указание Parametrs в этом случае бесполезно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 13:52 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Dim rst As DAO.Recordset ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 13:54 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Полный текст процедуры: 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 ничего не дала) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 14:12 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
1. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Ищи метод .СopyFromRecordset Ёкселя. Он тут самое то. 2. если в "параметрах" нет никакой бодяги, требующей спец обработки (форматирования дат, дублирования кавычек и т.п.) - просто клей строку в коде и открывай рекордсет. Если хочешь попользовать уже существующую строку "источника данных" самого списка - програмно отрезай от нее заключительное ";" (если есть) и дошивай свои AND (... IN()). Вот именно тогда параметры можешь и передать как предложено. !!!Я то считал, что строка с параметрами [Forms]![...]![...] у Вас _УЖЕ_ есть :0) (правда, если в строке - источнике списка есть ORDER BY, или GROUP, HAVING и т.п. - то можешь программно врезаться _перед_ ними). Но это уже извращение (попадаешь в зависимость от конкретного порядка конструкций SQL. Есть правда предположение, что наилучшее место врезки - это после последнего WHERE в строке. Но оно тоже не всегда верно (подчиненные запросы в условиях отбора)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 14:19 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Как понял их Хелпа - метод OutPutTo применяется с сохранённым объектам. У меня же - временный QueryDef, а про него в Хелпе что-то ничего нет. На методы Ёкселя заморачиваться - последний для меня вариант(хотя остался самый железобетонный - таблицаТемр и занесение в неё записей построчно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 14:40 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
в сетке есть статья по скорости вывода разными методами в Ёксель. Так CopyFromRecordset не самый худший. Есть такая шняга - присоединить таблицу Ёкселя и выгружать набор прямо в нее. На местном сайте один из сторонников -Лох Позорный (войди в "Поиск", выбери участника и Excel). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 14:57 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Так я не спорю о скорости вывода, я о том, что раз CopyFromRecordset - метод Ёкселя, значит надо заморачиваться на подключение библиотеки, создание ссылки на Ёксель ...., а потом не забыть эту ссылку убить. Значит из Аксесс только через ТемрТаблицу можно решить проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 15:04 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
1. Подключать библиотеку только на разработку. 2. В процессе разработки объектные переменные определять AS OBJECT 3. Все константы библиотеки заменять значениями (вычислить в дебуггере) 4. Убить только объявленные объекты. (скорее всего один или 2). 5. После разработки отлючить библиотеку на фик. (если ты сделал криейтОлеОбьект как Object, то методы подтягиваются по мере надобности). 6. Преимущество: можешь выгрузить в шаблон хранящийся в твоей таблице - связанный объект XL и сохранить результат на диск только если потребует пользователь. (Не заморачиваешься с путями, именами и прочей лабудой). Правда в этом случае отпадают как OUTPUTTO, так и связывание таблицы (несохраненного файла). По крайней мере до момента, пока не сохранишь. Остается CopyFromRecordset и непосредственное редактирование содержимого ячеек (что много медленнее, но универсальнее). __ Связывание таблицы екселя это не темп таблица. Это табличка, связанная через ISAM ёкселя (пункт Аксесса "внешние данные", тип XL, далее - по пунктам. Можно сделать и программно). Недостаток - надо описать поля на момент связывания, а не просто вывалить все, что получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 15:19 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
>Связывание таблицы екселя это не темп таблица я под ТемрТаблицей имел ввиду таблицу в локальной базе, в которую запросом будет добавляться каждая выделенная в списке запись и которую затем можно через OutputTo отоправить в Ёксель. А на вопрос о временном QueryDef + OutputTo мне так и не ответили ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 15:28 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
>>А на вопрос о временном QueryDef + OutputTo мне так и не ответили мдя. неужели выдержка из справки не внесла прояснение в затуманненный решением задачи мозг? OutputTo требует либо Имя (у темпа его нет) Либо АКтивности объекта на момент выполнения. Попробуйте открыть темповый запрос (как стандартный аксессовский грид, а не как рекордсет) и сделать его окно активным. :) А способов много. Например кинуть данные SQL строки в форму (отчет), и опубликовать в XL уже форму (отчет). Только оно Вам надо? Можно генерить не темповую таблу, а _нормальный_ (именованный) qrydef, озаботясь уникальностью имени на момент создания (для разрешения коллизий промеж пользователями/сеансами), и не забывая порушить его по завершении выгрузки. Благо весь процесс от создания до удаления - в одной процедуре. Т.ч. имя хранить долго не надо. Ну и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 15:46 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32337834&tid=1677956]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
143ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 424ms |

| 0 / 0 |
