Макрос и обновление поля отчета

vta73
Дата: 03.12.2009 15:07:23
С помощью макроса открываю отчет в режиме просмотра и задаю значение свободного поля. Но оно выводится, только если, не закрывая отчет, перевести его в режим конструктора и опять в режим просмотра. Как сделать, чтобы поле обновлялось сразу?
vta73
Дата: 03.12.2009 18:34:01
Обновляю поле програмно - то же самое:
OpenReport "имя", acViewPreview
Reports("имя").имя_поля.Value = "значение"
Отчет открывается, нужное поле не заполнено. Перехожу в режим конструктора и обратно - появляется значение. Как сделать это грамотно?
отакота
Дата: 03.12.2009 18:38:00
попробуйте задать значение в обработке события "форматирование" (того раздела отчета, где находится ваш элемент управления).
vta73
Дата: 03.12.2009 21:47:00
Спасибо, работает. А еще есть варианты? Просто тогда это значение нужно передавать либо через OpenArgs, либо через глобальную переменную, это не совсем удобно, особенно, когда полей несколько. Хочелось бы это делать в той же процедуре, где открывается отчет.
отакота
Дата: 04.12.2009 08:51:54
vta73
Спасибо, работает. А еще есть варианты? Просто тогда это значение нужно передавать либо через OpenArgs, либо через глобальную переменную, это не совсем удобно, особенно, когда полей несколько. Хочелось бы это делать в той же процедуре, где открывается отчет.
Дело в том, что заполнение контролов отчета данными происходит НЕ в произвольные моменты, а только в специальные (события OnFormat, OnPrint), т.е. отчет наполняется данными не тогда когда хотите вы, а тогда когда может он.

Поэтому "передавать" данные в отчет - это как бы не совсем подходящая концепция, имхо, более подходящим было бы "получение" отчетом данных. Т.е. отчет сам берет данные - тогда, когда он может и оттуда, откуда он умеет.

Собственно, это как раз то, что отчет делает в отношении данных, получаемых из своего источника (RecordSource). Поэтому наилучший способ "передать" отчету нужные данные - включить эти данные в запрос-источник этого отчета.

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

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