Передача записей между исходниками, отчетами - PullRequest
2 голосов
/ 28 апреля 2011

У меня есть форма, которая будет генерировать отчет для рассылки. Форма открывает набор записей со всеми необходимыми полями. Я хочу узнать, как передать этот набор записей в отчет, чтобы мне не нужно было снова открывать этот набор записей.

Аналогичным образом, иногда я также хочу передать набор записей между формами (без отношения основной / подчиненной формы), как я могу это сделать?

Еще один маленький вопрос, когда я открываю форму в виде таблицы, она всегда очень большая. Как я могу ограничить его размер при открытии?

Спасибо!

РЕДАКТИРОВАТЬ:

Чтобы быть более понятным, скажите, что у меня есть "ФОРМА", когда пользователь нажмет на кнопку, "Отчет" будет открыт. Я хочу, чтобы «Отчет» использовал набор записей, который уже создан (открыт) в «ФОРМЕ».

Также в «ФОРМЕ» есть текстовое поле, заполненное пользователями, я также хочу показать его в «Отчете».

EDIT2:

Я устал, но не могу вставить набор записей или заполнить поле в моем отчете из текстового поля в моей форме, очень раздражает ..

Ответы [ 3 ]

2 голосов
/ 28 апреля 2011

Этого можно добиться, просто передав правильный оператор SQL в свой отчет.Это можно сделать с помощью вступительных аргументов.

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

Решение № 1
Если ваша форма использует запрос или оператор SQL, вы можете использовать это решение.

Код в вашей форме:

DoCmd.OpenReport "rptReportName", acViewPreview, , , acWindowNormal, Me.RecordSource

Код в вашем отчете:

Private Sub Report_Open(Cancel As Integer)
    Me.RecordSource = Nz(Me.OpenArgs, "")
End Sub

Решение # 2
Используйте это решение, если ваша формаиспользует свойство фильтра формы для фильтрации до правильного набора записей.Я предполагаю, что вы хотите передать это условие фильтрации в отчет.Вам нужно будет настроить отчет так, чтобы он использовал тот же RecordSource, что и ваша форма (или он должен по крайней мере содержать таблицу / поля, которые будут включены в ваш оператор фильтра).Проблема заключается в том, что передача источника записей вашего отчета в форму не пропускает фильтр, который вы могли бы установить в форме.

DoCmd.OpenReport "rptReportName", acViewPreview, , Nz(Me.Filter, ""), acWindowNormal

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

Edit1
Из исходного поста не было ясно, какую проблему пытался решить ОП.Я неправильно предположил, что у него возникли проблемы с отображением в отчете тех же записей, что и в его форме.Похоже, что операционному оператору скорее нужно предпринять две поездки на сервер для получения записей.

Поскольку вы не можете установить значение набора записей в отчете о доступе, лучшим вариантом может быть создание локальной таблицы доступа и простоиспользуйте его как временную таблицу.Я не знаю, каков размер вашего набора записей.Если он достаточно большой (более 5000 записей), это решение может быть не очень хорошей идеей.Одна проблема, о которой я могу подумать, заключается в том, что это приведет к тому, что со временем файл приложения внешней базы данных будет раздуваться, если у вас не будет настройки файла для запуска Compact и Repair при закрытии.

2 голосов
/ 29 апреля 2011

Я думаю, что беспокойство по поводу двух поездок на сервер неоправданно.

Если бы вы использовали серверную часть Jet / ACE, Jet бы кэшировал данные локально, и не было бы повторного извлечения, если данные не были изменены (в этом случае я думаю, что вы, вероятно, захотите актуальных данных нет?)

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

Это выглядит как случай преждевременной оптимизации.

0 голосов
/ 28 апреля 2011

Ну, если я понял из вашего вопроса, вам нужно манипулировать данными в таблице, зная / не зная номер набора записей.
Если это так, вам нужно изменить менталитет доступа к данным в таблице, потому что продвигать номер набора записей в вашем списке не совсем правильно, обычно мы продвигаем данные, а номера записей скрыты.
Поэтому, когда вы читаете свою таблицу, попробуйте передать свои поля в переменные для последующего использования или передать их непосредственно в представление списка.
Способ доступа к таблице для получения всех данных, поступающих из другого процесса, который всегда менялся.
Но даже если вы хотите сохранить номера записей для последующего использования, попробуйте объявить имя в качестве публичной переменной как ArrayList(), тогда при чтении из таблицы вы можете использовать 'Variable'.add(RecordNumber).
Поэтому, когда вам нужно получить доступ к определенному номеру, возьмите номер строки чтения из списка, позвонив по номеру VariableName(ListViewLineNumber) Пожалуйста, сообщите мне, если это решение близко к вам решение проблемы.

...