Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Печать текущей записи


Автор: Dmitrimel 23.10.2006, 14:42
Есть форма, в которой отображаются записи из нескольких таблиц, подскажите как сделать такую волшебную кнопочку, чтобы она выводила на печать текущую запись из формы в читаемом ввиде (что-то вроде отчета).
Заранее спасибо.
Пожалуйста, описывайте свои действия более побробно, т.к. я пока новичок в этом деле.

Автор: Юдифь 24.10.2006, 01:02
Создать отчёт, основанный на тех же таблицах. Объединяющее поле для всех этих таблиц у тебя наверняка есть? В условии поставить в запросе на это поле: form![название формы]![название поля формы].

Автор: Akina 24.10.2006, 08:16
Если на форме отображаются те данные, которые надо напечатать - выводи на печать не записи таблиц, а содержимое контролов формы.

Автор: Dmitrimel 24.10.2006, 09:20
Цитата(Юдифь @ 24.10.2006,  01:02)
Создать отчёт, основанный на тех же таблицах. Объединяющее поле для всех этих таблиц у тебя наверняка есть? В условии поставить в запросе на это поле: form![название формы]![название поля формы].

Спасибо тебе огромное, все получилось.

Добавлено @ 09:21 
Цитата(Akina @ 24.10.2006,  08:16)
Если на форме отображаются те данные, которые надо напечатать - выводи на печать не записи таблиц, а содержимое контролов формы.

а вот тут можно подробнее???

Автор: Karam_S 22.4.2009, 11:27
У меня для решения проблемы "Печать текущей записи из формы" в моей базе маленько не хватает тяму.

1. Есть сложная форма, объединяющая 3 таблицы.
2. Есть отчёт, выводящий всю совокупность записей. Он основан не на самостоятельном (отдельном) запросе, а на встроенном в отчёт. 
3. Необходимо через кнопку из формы выводить на печать через оформление отчёта текущую запись формы.

Что делаю: 1. Создал в отчёте условие " WHERE ([Для отзыва по всем].Фамилия=form![Проверка работ]![Фамилия]) "  

                                   В итоге при открытии отчёта появляется окно "form!Проверка работ!Фамилия" с полем для введения значения.

Пояснение:    Отчёт выполнить на самостоятельном (отдельном) запросе не получилось, т.к. при передаче текстового значения через запрос в отчёте отображались только первые 5-6 строк, а остальной текст не отображался. 
Чтобы обойти эту проблему, построил отчёт через непосредственное обращение к полям таблицы и необходимым полям из другого запроса.

Прошу помочь.

Автор: Karam_S 22.4.2009, 16:58
Решение частично найдено.
Дело в том, что если делается указание на открытую форму, то надо использовать слово "Forms".
Поэтому использование условия "WHERE ([Для отзыва по всем].Фамилия=forms![Проверка работ]![Фамилия])" помогло! smile 

Но проблема всё-таки до конца не решена.
Дело в том, что требуется вывести запись, удовлетворяющую одновременно нескольким условиям, часть из которых указаны в подчинённой форме. И здесь уже указанная ссылка не срабатывает.
Так условия "WHERE ПредстРаботы.Проверена=Forms![Работа с замечаниями]!Проверена" (где "Forms![Работа с замечаниями]!Проверена" - поле в подчинённой форме) выдаёт при вызове окно-запрос с полем на значение, куда требуется вручную вводить дату. Если это значение ввести, то отчёт отображается с соответствующей записью.
Возникает вопрос, как задавать условия в отношении подчинёных форм?

Автор: Karam_S 25.4.2009, 15:45
Для решения проблемы делаю первые шаги в VBA.
Вот так: 
Код

Option Compare Database
Private Sub ПечТекЗап_Click()
Dim stFilter As String
stFilter = "[Фамилия]=Forms![Проверка работ]![Фамилия]"
    DoCmd.OpenReport "01_0 Отзыв", acViewPreview, , stFilter
End Sub

                       срабатывает. "Проверка работ" - главная форма.

Вот так: 
Код

Private Sub ПечТекЗап_Click()
Dim stFilter As String
stFilter = "ПрРаб=3"
    DoCmd.OpenReport "01_0 Отзыв", acViewPreview, , stFilter
End Sub

                         тоже срабатывает. ("ПрРаб" - это поле типа "числовой" из подчинённой формы "Работа с замечаниями").

Но вот так (когда требуется вывести запись, удовлетворяющую двум условиям):
Код

Private Sub ПечТекЗап_Click()
Dim stFilter As String
stFilter = "[Фамилия]=Forms![Проверка работ]![Фамилия] And ПрРаб=3"
    DoCmd.OpenReport "01_0 Отзыв", acViewPreview, , stFilter
End Sub

                          не срабатывает.

И ещё один вопрос.
Плохо, конечно, что значение поля "ПрРаб" явно указано.
Как задать условие полю "ПрРаб"  равное тому, что выводится в форме "Работа с замечаниями"? Вот такая запись:
Код

stFilter = "[ПрРаб]=Forms![Работа с замечаниями]![ПрРаб]" 

                         приводит к пустому результату в отчёте.

Может я не по тому пути пошёл?
Цель одна - через кнопку из формы выводить на печать через оформление отчёта текущую запись формы.

Автор: Karam_S 26.4.2009, 07:55
Проблема решена.

Благодаря подробному faq-разъяснению Geo, Владимир Саныч http://www.sql.ru/faq/faq_topic.aspx?fid=156

1. Использую отчёт со встроенным запросом, где условием указываем поле главной формы и поле подчинённой формы. Например,
Код

WHERE ([Для отзыва по всем].Фамилия=Forms![Проверка работ].Controls!Фамилия And ПредстРаботы.ПрРаб=Forms![Проверка работ].Controls![Работа с замечаниями].Form.Controls!ПР);
 
Здесь ссылка на подчинённую форму имеет специальный синтакси: Forms![Форма1].Controls![Форма2].Form.Controls![Поле1].Value

2. В главной форме на событие кнопки указываю команду vba для открытия отчёта
Код

Private Sub ПечТекЗап_Click()
    DoCmd.OpenReport "01_0 Отзыв по фильтру", acViewPreview
End Sub

Т.е. простая команда без условий.

В общем-то всё. smile 
К сожалению, с условиями vba разобраться до конца так и не смог.
Не знаю правильно это или нет, но работает. Может кто подскажет решение по-лучше?

Только что, нашел ещё одну особенность (здесь http://www.askit.ru/custom/vba_office/m12/12_07_access_report_object.htm), если не указывать аргумент acViewPreview, то отчёт будет отправлен сразу на печать без отображения окна просмотра.
Код

     DoCmd.OpenReport "01_0 Отзыв по фильтру"

Так изложение будет полнее.  smile 

Автор: bopoha 29.4.2009, 11:02
Karam_S, зря вы использовали "Forms![Проверка работ].Controls![Работа с замечаниями].Form.Controls!ПР" в самой строке.
На мой взгляд передавать условие поиска лучше отчету извне, чтобы он ничего об этом не знал:

Например (Код должен быть реализован в модуле формы "Проверка работ"):
Код

Private Sub ПечТекЗап_Click()
    Dim stFilter As String
    
    stFilter = "[Фамилия]= " & Me.Фамилия & " And ПрРаб = " & Me("Работа с замечаниями").Form.Controls("ПР")

    DoCmd.OpenReport "01_0 Отзыв по фильтру", acViewPreview, , stFilter
End Sub


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

Тут про формы можно почитать подробнее http://5codelines.net/povyshenie-soprovozhdaemosti-chast-1-formy/

Автор: Karam_S 29.4.2009, 17:31
bopoha спасибо за поправку и наводку! 

Я убрал условия из отчёта и опробовал предложенный код  smile 
Код

Dim stFilter As String
    stFilter = "[Фамилия]= " & Me.Фамилия & " And ПрРаб = " Me("Работа с замечаниями").Form.Controls("ПР")

Но vb выдал ошибку.

Я заменил способ записи:
Код

stFilter = "[Фамилия]= " & Me.Фамилия & " And ПрРаб = Forms![Проверка работ].Controls![Работа с замечаниями].Form.Controls!ПР"

Тогда после нажатия кнопки стал появляться запрос фамилии (хотя форма открыта).

Я ещё раз заменил способ записи:
Код

"[Фамилия]= Forms![Проверка работ].Controls!Фамилия" & " And ПрРаб = Forms![Проверка работ].Controls![Работа с замечаниями].Form.Controls!ПР"

И тогда всё заработало!  smile 
Возможно, предложенный первоначально синтаксис не сработал потому, что в разных версиях access правила его составления несколько меняются. 
У меня стоит версия 2007.

Автор: bopoha 29.4.2009, 17:46
Цитата(Karam_S @  29.4.2009,  17:31 Найти цитируемый пост)
Тогда после нажатия кнопки стал появляться запрос фамилии (хотя форма открыта).

Хм. Запрос фамили у вас не мог отрыться, если поля бы не существовало, произошла бы ошибка. 

Цитата(Karam_S @  29.4.2009,  17:31 Найти цитируемый пост)
У меня стоит версия 2007.

Это не важно.

Кстати, в моем коде ошибка:
Цитата(bopoha @  29.4.2009,  11:02 Найти цитируемый пост)
stFilter = "[Фамилия]= " & Me.Фамилия & " And ПрРаб = " Me("Работа с замечаниями").Form.Controls("ПР")


Нужно так:
Код

stFilter = "[Фамилия]= " & Me.Фамилия & " And ПрРаб = " & Me("Работа с замечаниями").Form.Controls("ПР")

Автор: Karam_S 30.4.2009, 11:45
Странно, последняя версия вашего кода 
Код

stFilter = "[Фамилия]= " & Me.Фамилия & " And ПрРаб = " & Me("Работа с замечаниями").Form.Controls("ПР")

выводит окно с запросом введения фамилии.

После следующей правки
Код

stFilter = "[Фамилия]= Forms![Проверка работ].Controls!Фамилия" & " And ПрРаб = " & Me("Работа с замечаниями").Form.Controls("ПР")

вновь всё заработало! (без запросов).

Таким образом, запись
Код

"[Фамилия]= " & Me.Фамилия 

вызывает запрос. Вместо того, чтобы взять данные из поля формы.

Пробую так
Код

"[Фамилия]= " & Me("Проверка работ").Form.Controls("Фамилия")

тогда появляется ошибка 2465 - "Приложению акцесс не удаётся найти поле "Проверка работ", указанное в выражении".
Хотя я думаю, почему поле "Проверка работ", ведь указываю поле "Фамилия".

Автор: bopoha 30.4.2009, 12:09
Я походу понял. Как называется форма, на которой выполняется код? Я предполагал, что это форма - "Проверка работ".

Замените 
Цитата(Karam_S @  30.4.2009,  11:45 Найти цитируемый пост)
Me("Проверка работ").Form.Controls("Фамилия")


на 

Код

Forms("Проверка работ").Controls("Фамилия")

Автор: Karam_S 30.4.2009, 13:30
Исходное предположение правильное: главная форма - "Проверка работ"; в ней же кнопка, т.е. выполняется код.
Последний предложенный вариант кода 
Код

Forms("Проверка работ").Controls("Фамилия")

также вызывает окно запроса "Введите значение параметра" для ввода фамилии.
Если фамилию вручную ввести, то задание благополучно уходит на принтер.

Автор: bopoha 30.4.2009, 14:23
Цитата(Karam_S @  30.4.2009,  13:30 Найти цитируемый пост)
Forms("Проверка работ").Controls("Фамилия")

Это выражение содержит строку?

Тогда нужно так:
Код

stFilter = "[Фамилия]= '" & Me.Фамилия & "' And ПрРаб = " & Me("Работа с замечаниями").Form.Controls("ПР")

Т.е. обрамить значение Me.Фамилия в одинарные ковычки.

Цитата(Karam_S @  30.4.2009,  13:30 Найти цитируемый пост)
Присоединённый файл  vbcode.jpg 134,29 Kb

Вы зачем взяли в ковычки выражение Me(..... ? Этого делать не нужно.

Автор: Karam_S 30.4.2009, 15:53
Всё получилось! smile 
Заработало! smile 
Большое спасибо!!! Хорошо, когда есть люди, которые готовы помочь. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)