Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
блин, добился того, что выполняется сохранённый запрос с параметрами, но как его открыть в отчёте, если он просит SQL текст, а он длинный и ручками клеить его неохота?
Может как-то сбросить всё во временнн. таблицу и открыть на ней отчёт?
Private Sub Report_Open(Cancel As Integer)
    Dim strWhereCategory As String
    Dim q As DAO.QueryDef, p As DAO.Parameter
    Dim rs As Recordset
    
    Set q = CurrentDb.QueryDefs("_дляО_ТабельРабот2")
    'For Each p In q.Parameters
    '    Debug.Print p.Name
    'Next
    q.Parameters("[ПарамНачМесяца]").Value = #1/1/2005#
    q.Parameters("[ПарамКонМесяца]").Value = #1/1/2006#
    Set rs = q.OpenRecordset()
    q.Close:
    Set q = Nothing
    Do Until rs.EOF
        Debug.Print rs![Исполнитель]
        rs.MoveNext
    Loop
    
    
    Me.Report.RecordSource
    
    [color=red]Recordset = rs[/color]
    
    'rs.Close:
    'Set rs = Nothing

End Sub
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
11 ноя 05, 17:29    [2061504]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
вероятно самое простое, это так
- изменить запрос с обычного на создание таблицы, тогда после его запуска как выше указано данные будут в врем.табле и на ней отчёт.
ТАК?
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
11 ноя 05, 17:39    [2061541]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Karfaqen
Member

Откуда:
Сообщений: 7010
Petro123
изменить запрос с обычного на создание таблицы

Ну что за экстрим-то...;) А почему же вы не хотите сделать Replace по списку параметров в SQL? В чем проблема?
11 ноя 05, 18:28    [2061696]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
Karfaqen
Petro123
изменить запрос с обычного на создание таблицы

Ну что за экстрим-то...;) А почему же вы не хотите сделать Replace по списку параметров в SQL? В чем проблема?

время поджимает, обязательно сделаю.
Пока такой вариант впереди ручной склейки голимого текста SQL в том что,
удобнее отлаживать запросы (я их конструктором запросов делаю). А так пришлось бы при изменении:
- вырезать из кода VBA
- вставить в конструктор запросов
- убрать переносы строк в VBA
- отладить
-всё обратно :)

Удачи и спасибо всем!
11 ноя 05, 19:12    [2061822]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Iskander68
Member

Откуда: Королев М.О.
Сообщений: 877

author

время поджимает, обязательно сделаю.
Пока такой вариант впереди ручной склейки голимого текста SQL в том что,
удобнее отлаживать запросы (я их конструктором запросов делаю). А так пришлось бы при
изменении:
- вырезать из кода VBA
- вставить в конструктор запросов
- убрать переносы строк в VBA
- отладить
-всё обратно :)

Удачи и спасибо всем!


Про Debug.Print слышал?


--
Regards
Alexander Artamonov

Posted via ActualForum NNTP Server 1.3

11 ноя 05, 19:37    [2061903]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Karfaqen
Member

Откуда:
Сообщений: 7010
Какая склейка, какой перенос?

Вы будете делать именно так как вы описали - стройте, отлаживайте и сохраняйте все ваши SQL только в конструкторе запросов. А при открытии отчета берете нужный SQL сохраненного запроса, и просто заменяете в нем параметры на свои значения. Все! В VBA Тексты SQL вообще не пишутся при таком походе.

Воля ваша, конечно, но по-моему это намного проще...
11 ноя 05, 19:52    [2061946]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
Iskander68
это анекдот, но про это я не догадался )))))))))))
Karfaqen
про это я догадался, когда уже ответ Вам отправил. Обязательно сделаю позже, счас время поджимает.

ЗЫ. Практики нет, вот и не знаю многих элементарных вещей именно в подходах Access и редактора VBA.
В других языках всё немного по другому.

Удачи!
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
12 ноя 05, 14:58    [2063043]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18305
автор
В других языках всё немного по другому


т.е. во всех языках одинаково, только в аксе всё по хреновому?
12 ноя 05, 23:17    [2063389]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
рекордсет можно присвоить напрямую отчету
me.recordset = rst

но
если отчет не содержит групп и суммовых полей
иначе надо при открытии рекордсета его обернуть в несколько слоев шейпинга - весьма замороченное дело. как это сделать мне как то втолковывал alekseik (логин очень похож на мой и может показаться что у меня шиза и я сам себе рассказываю в форуме)
12 ноя 05, 23:29    [2063403]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Karfaqen
Member

Откуда:
Сообщений: 7010
АлексейК
рекордсет можно присвоить напрямую отчету
me.recordset = rst
но если отчет не содержит групп и суммовых полей

Так ведь нет же его у отчета в Ac2000...
Compile error же: Method or data member not found же.
13 ноя 05, 19:08    [2063965]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
да, простите запамятовал XP ADP
13 ноя 05, 23:32    [2064294]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
Karfaqen
Какая склейка, какой перенос?

Вы будете делать именно так как вы описали - стройте, отлаживайте и сохраняйте все ваши SQL только в конструкторе запросов. А при открытии отчета берете нужный SQL сохраненного запроса, и просто заменяете в нем параметры на свои значения. Все! В VBA Тексты SQL вообще не пишутся при таком походе.
Воля ваша, конечно, но по-моему это намного проще...

пришлось перейти на Ваш вариант и вот почему. Соринку в глазу вычищал, а вот бревно не заметил :).

Если выбрасывать данные во временную таблицу и на ней строить отчёт, то в многопользовательской БД никто другой отчёт не построит, т.к. до закрытия отчёта он будет "держать" таблицу.
==================
Делаю по вашему варианту, но предвижу, что если запрос с параметрами, то тексте SQL появятся доп.строки. Значит надо без параметров, а заменять Replace какие-нибудь конкретные значения искуственно вставленные в запрос.

ЗЫ. Метод этот мне не нравился тем что вместо Accessa парсингом и подстановкой параметров занимаюсь я сам (это в век то космических кораблей )). Правда у меня и версия старовата (2000).
14 ноя 05, 15:35    [2066529]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
Karfaqen допустим ваш вариант:
Private Sub Report_Open(Cancel As Integer)
On Error GoTo errOpen
    'получить сохраненный SQL
    Dim sqlString: sqlString = CurrentDb.QueryDefs("ИмяЗапроса").sql
    sqlString = Mid(sqlString, InStr(1, sqlString, "SELECT "))
    
    'замена формальных параметров на фактические из формы параметров
    Dim f As Form: Set f = Forms("Форма_условия")
    sqlString = Replace(sqlString, "[номер_месяца]", Nz(f("номер_месяца"), 0))
    sqlString = Replace(sqlString, "[фио]", "'" + Nz(f("фио"), "") + "'")
    
    'подстава источника
    Me.RecordSource = sqlString
    Exit Sub

errOpen:
    MsgBox Error, 48
    Cancel = True
End Sub
при моём запросе, основанном на другом 1-3 запросах, тоже не катит.
Dim sqlString: sqlString = CurrentDb.QueryDefs("ИмяЗапроса2").sql
ИмяЗапроса2 выдаёт
SELECT ФФФФФФФФФФФФФФФФ AS ВВВВВВВВВВВВВВ
FROM ИмяЗапроса1;
вместо имя запроса - ИмяЗапроса1 обернуть в скоби и пропарсить сам текст запроса что ли?
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
14 ноя 05, 15:48    [2066620]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Karfaqen
Member

Откуда:
Сообщений: 7010
Petro123
предвижу, что если запрос с параметрами, то тексте SQL появятся доп.строки. Значит надо без параметров, а заменять Replace какие-нибудь конкретные значения искуственно вставленные в запрос.

Верно, в тексте QueryDef.SQL в этом случае есть доп.строки, и в моем примере это уже учтено. SQL параметризованного запроса начинается так:
PARAMETERS Par1 Long, Par2 Text ( 255 )...; SELECT ...

Обратите внимание на строку в моем примере:
sqlString = Mid(sqlString, InStr(1, sqlString, "SELECT "))
После нее в sqlString находится чистый запрос-SELECT без начальной строки описания параметров.

Далее подстановка параметров в этот SQL в общем виде выглядит так:
For Each par In CurrentDb.QueryDefs("Запрос").Parameters
    actParam = "тут получаем фактический параметр"
    sqlString = Replace(sqlString, "[" + par.name + "]", actParam)
Next par
где actParam - берем откуда хочется (с учетом имени и типа параметра, имени запроса, имени отчета, наличия открытых форм, значений по умолчанию и т.д. и т.п).

Причем, чтобы отвязаться от разносолов в отчетах, в Report_Open можно просто писать во всех отчетах что-то типа:
Me.RecordSource = GetMyReportSource(Me)
а в GetMyReportSource делать все разборки и подстановку параметров.

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

В этом случае придется написать некую функцию, которая будет: 1) анализировать FROM-секцию запроса на предмет участия там других подзапросов (проверяя имена по списку QueryDefs); 2) брать их SQL и так же (опционно) актуализировать их параметры; 3) вставлять получившийся текст в парент-запрос в скобках вместо имени подзапроса (с алиасом имени подзапроса). Причем делать это надо итерационно в расчете на заранее неопределенную глубину вложенности запросов.

Словом, вырисовывается не очень скорая развязка для вашей срочной работы. А учитывая, что по ходу дела там наверняка найдется пара как всегда внезапных грабель, то может стоит все же поискать более другое решение...?
14 ноя 05, 20:17    [2067651]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Karfaqen
Member

Откуда:
Сообщений: 7010
Petro123
если выбрасывать данные во временную таблицу и на ней строить отчёт, то в многопользовательской БД никто другой отчёт не построит, т.к. до закрытия отчёта он будет "держать" таблицу

Временные таблицы лучше вообще не делать в той же БД, что и основные данные. Временные (пользовательские) таблицы надо делать во временных БД где-нибудь по локальным путям. Например, в Environ("TEMP").

При первом обращении создаете новую базу там, потом используете ее как временное хранилище для операторских данных, а при выходе из приложения просто удаляете ее.
14 ноя 05, 20:33    [2067683]     Ответить | Цитировать Сообщить модератору
 Re: Ac2000 отчёту нельзя присвоить RecordSet&  [new]
Karfaqen
Member

Откуда:
Сообщений: 7010
А вообще, если вам требуется лишь упомянутые вами два режима использования QueryDefs - 1) в качестве источников отчетов/форм и 2) для отладки SQL при разработе этих источников, то можно чуть изменить общий принцип задания/описания параметров в ваших запросах.

Ведь если вы в своей базе не используете QueryDef с параметрами для создания Recordset на их основе, то эти параметризованные запросы как таковые вам не нужны.

Например, запрос БЕЗ описания параметров в нем:
Select * From T Where F=[PARAM]
все равно при открытии спросит у вас значение PARAM в диалоге ввода.

Единственное отличие от запроса с параметром - здесь для параметра не задан тип при помощи конструкции PARAMETERS, и поэтому при его вводе валидация типа не производится.

A если вы в запросе напишете так:
Select * From T Where F=GetMyParameters(...)
то ваш запрос будет получать свой параметр как значение возвращаемое функцией.

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

При этом вы будете иметь возможность тестировать SQL, открывая для просмотра QueryDef. А при открытии отчета вообще не надо будет менять источник - сработает отлаженный вами запрос.

Правда, в этом случае вам придется пройтись по всем запросам и сделать адекватную замену для всех имеющихся там параметров. Ну и понятное дело, такие функционально-зависимые запросы не будут работать в левой базе, где нет должного VB-кода. Вобщем, смотрите.
14 ноя 05, 21:32    [2067755]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить