Проблема с отчетами (vba)

endless
Дата: 30.11.2009 17:52:19
Доброго времени суток,

Вопрос наверно глупый, но тем не менее ответа на него я пока найти не смог.
Если я на vba написал запрос и результат хочу вывести в виде отчета, затем отчет надо распечатать, то на каком событии это можно сделать???? На событии Open (как и на всех остальных) появляется ошибка "Run-Time Error '-2147352567 (80020009)' ": You can't assign a value to this object. В свойствах отчета никаких запретов на добавление записей нет.

Подскажите пожалуйста решение данной проблемы.
Заранее благодарен
Rivkin Dmitry
Дата: 30.11.2009 17:59:27
На VBA запросы не пишутся, они пишутся на языке SQL.
Для того, чтобы резульбаб запроса вывести в отчете, сначала надо этот отчет создать.
В свойствах отчета нет никаких разрешений на редактирование, добавление и удаление записей. Для этих целе существуют формы.
Таким образом, общий ответ таков: создать запрос, сохранить его либо вставить соурсом в новый макет отчета. Создать отчет. Запустить с фильтром или без
endless
Дата: 30.11.2009 19:12:44
Rivkin Dmitry,

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

Окей, тогда подробнее.

1) Создал отчет в конструкторе и сделал на нем textbox

2) В VBA обрабатываю процедуру (пример)

Dim rec_UserName  as Recordset
Dim UserFIO as String

Set rec_UserName = currentdb.OpenRecordset ("SELECT FIO FROM tbl_Users WHERE Profile='" & profile1 & "' ")
UserFIO = rec_UserName.Fields![FIO]
3) Я получил запись, теперь хочу вывести UserFIO в отчете. Я на 100% уверен, что это можно сделать, только как? Я только знаю, как програмно сделать этот запрос источником записей для отчета, а вот дальше не получается, все равно ошибки....
отакота
Дата: 30.11.2009 19:24:41
endless
Я только знаю, как програмно сделать этот запрос источником записей для отчета, а вот дальше не получается, все равно ошибки....
если вы точно знаете как и когда следует установить ваш запрос источником записей отчета, то "дальше" - только убедиться, что созданный вами textbox имеет в свойстве "данные" - FIO - имя поля этого источника, которое там надо показать. И все, потом открыть отчет.

Если вы так делали, и все равно ошибка, то покажите ваш код, устанавливающий источник отчета (и уточните, на какой там строке и какая ошибка)
ё
Дата: 30.11.2009 19:25:50
endless,

можно передать в параметре OpenArgs команды открытия отчета
DoCmd.OpenReport "ИмяОтчета", acViewPreview, , , , UserFIO
и потом в Report_Open - вставить в textbox
textbox.Value = Me.OpenArgs

хотя и не самое красивое решение,
почему вы это значение не можете получить в источнике отчета?
endless
Дата: 01.12.2009 10:18:11
в хэлпе есть пример, как устанавливать RecordSource

Sub cmboCompanyName_AfterUpdate()
    Dim strNewRecord As String
    strNewRecord = "SELECT * FROM Customers " _
        & " WHERE CustomerID = '" _
        & Me!cmboCompanyName.Value & "'"
    Me.RecordSource = strNewRecord
End Sub

Дальше вот:

Dim NewSource As String
Dim rec_source as Recordset

NewSource = "SELECT FIO FROM Users WHERE UserProfile='" & profile1 & "' "
Me.RecordSource = NewSource 


Если как-то попробовать открыть записи:

Set rec_source = CurrentDb.OpenRecordset(NewSource)
Me.txtTest = rec_a.Fields![FIO]

то возникает ошибка: Run-Time Error '-2147352567 (80020009)' ": You can't assign a value to this object

только вот как объекту(textbox) присвоить в свойствах FIO ???
me.txtTest.Properties. (item,parent,count,aplication) что-то я там пока не нашел ничего похожего на control source....
отакота
Дата: 01.12.2009 10:46:30
Если на открытии отчета сделать так как вы пишете:
endless
Dim NewSource As String
NewSource = "SELECT FIO FROM Users WHERE UserProfile='" & profile1 & "' "
Me.RecordSource = NewSource 

Тогда все, что вы пытаетесь делать дальше:
endless
Если как-то попробовать открыть записи:

Set rec_source = CurrentDb.OpenRecordset(NewSource)
Me.txtTest = rec_a.Fields![FIO]

то возникает ошибка: Run-Time Error '-2147352567 (80020009)' ": You can't assign a value to this object
вообще НЕ нужно.

После того, как вы задали свойство RecordSource отчета, у вас автоматически все связанные контролы отчета получат данные из этого источника. Для этого, как уже говорилось, нужно просто в макете отчета задать свойство "Данные" этим контролам - найдите его в бланке свойств вашего txtTest - туда надо написать FIO.
develed
Дата: 01.12.2009 10:56:01
А если вместо textbox использовать label и свойство Caption, тоже ошибка?
отакота
Дата: 01.12.2009 11:01:42
вдогонку
если уж совсем никак не получается в бланке свойств в конструкторе отыскать источник данных контрола, можете программно его установить в том же коде:
Dim NewSource As String
NewSource = "SELECT FIO FROM Users WHERE UserProfile='" & profile1 & "' "
Me.RecordSource = NewSource 
Me.txtTest.ControlSource = "FIO" '<-вот так
endless
Дата: 01.12.2009 12:00:33
отакота,
Дело не в том, что я не могу в бланке свойств в конструкторе отыскать источник данных контрола (я уже сделал подобный отчет стандартными средствами), а в том, что я хочу разобраться как это все сделать кодом, потому что я очень не люблю конструкторы и мастера аксеса и использую их только в безвыходных ситуациях.

Написал как вы посоветовали, выводится пустая страница без соответствующей записи, ошибок при этом не возникает

Вот код:
Private Sub Report_Open(Cansel As Integer)

Dim NewSource As String

NewSource = "SELECT FIO FROM Users WHERE UserProfile='" & profile1& "' "

Me.RecordSource = NewSource

Me.txtTest.ControlSource = "FIO" '<-вот так

End Sub

Наименование таблиц и параметров указано правильно.