Рассылка статей | Выпуск 14. Как отпечатать отчет на разных принтерах?
Leadersoft.ru

Рассылка статей

Программирование и готовые решения

В этом разделе сайта дается информация от https://leadersoft.ru о статьях по программированию, ответах на вопросы и др. Статьи рассылаются подписчикам и публикуются на разных сервисах. Возможно некоторая информация устарела и ссылки не работают, но эти сведения могут быть полезны, если Вы серьезно занимаетесь разработкой баз данных

Выпуск 14. Как отпечатать отчет на разных принтерах?

Введение. В данном выпуске рассматриваются 27 вопросов пользователей. Всего добавлено 10 программ в файлы: la_form.mdb, la_form1.mdb, la_report.mdb, la_report1.mdb, la_array.mdb.

[Отчеты]. Вопрос 1. Есть процедура, которая автоматизирует печать отчетов. Необходимо в зависимости от некоторых условий печатать один и тот же отчет на разные сетевые принтеры. Как программно указать под какой принтер форматировать и соответственно печатать отчет.
Ответ. Самый короткий способ, минуя API-интерфейс, Вы найдете в файле: la_report1.mdb. Кроме этого Microsoft дает несколько примеров изменения настроек принтера в зависимости от операционной системы: Windows 3.11, 95 и NT. Посмотрите их по ссылкам: 1. Setting Printer to Item in the Printers Collection Fails, 2. Set Which Printer Is the System Default Printer
[Проблема]. Вопрос 2. Добрый день, если Вам не сложно, найдите несколько минут и посмотрите мой mdb. В форме "Капиталовложения" при многократном переходе от узла к узлу в TreeView происходит ошибка "нехватка памяти". Причём только под Windows 98 (под 2000 такого нет). Ошибка выскакивает и в Access 2000 и в Access 97 (текст функций конечно немного отличается). Я определил, что эту ошибку вызывает Sub Дерево_NodeClick, а точнее строка: "Me.Bookmark = Me.RecordsetClone.Bookmark" (при её отключении этого глюка нет). Как можно ещё синхронизировать TreeView и форму?
Ответ. Замечания к коду.
• Во первых, уберите лишние ссылки в базе данных. Смотрите tools/references…
• Во вторых, в своих лекциях, в конце курса, я предупредил, что могут быть проблемы с названиями на русском языке. Вообще некоторые буквы русского алфавита нельзя использовать в названиях функций, например, Ч(ч). Исправьте названия функций. Например, Function поиск_младшей_дочери(имя_дерева As Object) As Node назовите
Public Function Search_young_daughter(name_tree as Object) as Node.
• В третьих, Set rds = CurrentDb.OpenRecordset(таблица, dbOpenDynaset) не желательно использовать, лучше написать программу длиннее
Dim dbs as Database
Set dbs = CurrentDb
Set rds = dbs.OpenRecordset(myTable, dbOpenDynaset)
• В четвертых, необходимо освобождать память объектов, т.е. почаще посылать через команду Nothing в корзину: Set dbs = Nothing, или Set rds = Nothing
• В пятых, поставьте обработчики ошибок: On Error GoTo …
PS. Возможно этих изменений будет недостаточно, т.к. ошибка у Вас связана с элементом TreeView. Советую Вам для этого элемента завести подчиненную форму, тогда программа заработает.
[Проблема]. Вопрос3. Извините, если я не совсем по теме задаю вопрос. Ситуация следующая: Два компьютера (1) на одном Window 98SE и Ассess97+SP2 на нем же находится 2 MDB-файла (в одном программа в другом таблицы) (2) на другом WindowsNT4+SP6 и Ассess97+SP2. Если на (1) база открыта, то при попытке открыть эту же базу на (2) происходит практически зависание (2) на 2 - 5 минут, после чего она открывается. Если судить по TaskManeger-у то зависание происходит до того как в списке процессов появляется MS Access. Компьютеры в одном сетевом сегменте, протокол TCP/IP. Другие файлы (допустим документы Word) по сети открываются быстро. В чем может быть проблема?
Ответ.
• Во первых, создайте полностью две пустые базы данных и попытайтесь провести эксперименты с ними. Если они открываются нормально, как Word, значит сетевой протокол и настройки Access установлены правильно.
• Во вторых, выберите одну пустую базу данных и импортируйте из старой базы все элементы: таблицы, формы и т.п. Проверьте размер старой базы по отношению к новой созданной базе. Если она больше новой ~ 30 %, значит при редактировании базы Access у Вас остались лишние связи, которые и влияют на загрузку Access. Такие же действия проделайте и с другой базой.
• В третьих, один файл надо конвертировать в mde формат, смотрите подписку о разделении баз данных на mdb и mde.
• Комментарий. К сожалению программы сжатия (запускаемые из меню и модуля VBA CompactDatabase) в Access 97 и 2000 работают неправильно. Приведу пример на своей базе данных "Склад и Реализация". Сжав программу стандартными действиями, я не успокаиваюсь на этом, далее сжимаю ее по своему алгоритму. Иногда мне удается сжать mdb-файл на 40-45%. Потом делаю из mdb mde файл, который бывает меньше полученного обычным путем mde файла на 8-9%. Все это приводит к тому, что программа быстро загружается и корректно работает в сети из компьютеров, имеющих разные операционные системы.
[Таблицы]. Вопрос 4. Если Вас не затруднит, ответьте, пожалуйста, на такой вопрос. При копировании данных таблицы Access через буфер обмена, при вставке этих данных в другое приложение по умолчанию копируются также названия столбцов. Можно ли исключить копирование названий столбцов?
Ответ.
    Обычным способом сделать нельзя, попробуйте программным способом. Непонятно, зачем Вам это нужно. Если Вы скопировали таблицу в Excel или Word, то там названия столбцов выделяются и удаляются все вместе очень просто.
[Таблицы]. Вопрос 5. Каким образом считать определенную ячейку из таблицы, возможно я где-то пропустил Help. Например: поле 4, запись 3. С помощью Recordset это на составляет труда, а более простой метод - как в Excel (D3) ?
Ответ.
Обратиться как в Excel к таблице невозможно. В ней может быть несколько миллионов записей. Но если Вам нравиться такая система поиска, возьмите функцию GetRow, она позволяет прочитать все(часть) записей в массив. Массив 2x мерный: myTable(x,y), где x-это поля, y –строчки, совсем как в Excel. Пример есть в файле: la_array.mdb, “Поиск как в Excel(GetRow)” PS. Советую испытать программу с массивом в несколько тысяч записей, прежде, чем использовать в работе.
[Проблема]. Вопрос 6. При обработке события Отсутствие в списке (я просто обращаюсь в подчиненную табличную форму и добавляю запись ) блокируется клавиатура, все приходит в норму после щелчка мыши в любом месте главной формы.
Ответ.
    Если у Вас блокируется клавиатура, то это означает, что программа выполняет какие-то «зацикленные» действия, т.е. операционная система не получает «сообщений» от Вашей программы. Попробуйте вставить в разные точки программы команду: DoEvents.
[Формы] Вопрос 7. Подскажите, пожалуйста, как сделать на всю строку курсор в табличной или ленточной форме. Я использую в табличной форме для события "текущая запись" команду" выделить строку", но это на мой взгляд коряво.
Ответ.
    Я примерно также выделяю строку, и мне это кажется «коряво». Пример для ленточной формы посмотрите в файле: la_form1.mdb. Не забудьте откорректировать код для разных нажатий клавиши мыши.
[Формы] Вопрос 8. У меня есть несколько вопросов по эксесу... Вот захотелось мне сделать прогу "Платёжки". Вроде и правильно создал таблицы... А вот у меня не получается сделать форму, чтоб в ней при выборе "Плательщика" из выпадающего меню - сразу сами вписывались остальные поля: код, мфо, кредит, счет и т.д. Я никак не пойму, как делается ссылка на файл, в котором лежит все это, в смысле в редакторе "Подстановка" (файл, список, файл со списком). Соответственно (даже при составлении "Схема данных") в "меню списка полей" нету списка полей всех нужных мне таблиц, из которых бы я вручную сам подставлял поля( ибо в авто/форма ничего не катит) :-((( Может я не так понятно выражаюсь - тогда буду как-то по другому излагать. Эксес начал только юзать, так шо ногами не пинать, plz :-)
Ответ.
    Пример «Заполнение реквизитов» найдете в программе la_form1.mdb. PS. Небольшой совет. Когда-то и я начал изучать Access 2.0 c «Платежки». Но чтобы Ваша программа стала профессиональной необходимо добавить к ней разные свойства. Например, у меня в программе «Банк предприятия» можно: • получать автоматически курсы валют • заполнять банковские реквизиты плательщика по БИК, • печать поручения на специальных бланках, • осуществлять быстрый поиск плательщика по списку • выделять НДС и много других.
[Формы] Вопрос 9. Как сделать в форме вычисление? "Поле1" делится на "Поле2" (при этом поле2 имеет постоянное значение, и при переходе на другую запись должно автоматически переноситься), а результат выводится в "Поле3"
Ответ.
    Пример «Автозаполнения полей в форме» найдете в программе la_form1.mdb.
[Формы] Вопрос 10. Подскажите начинающему, как сделать в запросе поиск по нескольким полям, чтобы в одном из полей для поиска вводить части слова и подстановочные знаки, например вводим К*зл а находим Кезлав, Козлов и т.д.
Ответ.
    В запросе надо использовать ключевое слово Like. Пример для данного поиска Вы найдете в программе «Поиск по нескольким полям»: la_form.mdb. Там я добавил код «Поиск по шаблону» для Вашего случая.
[Проблема] Вопрос 11. Сия конструкция проработала на IIS3 1,5 года
<% strTB1= Request("sqlri")
set objConn = server.createobject("ADODB.Connection")
objConn.Open "dnsalias"
set cm = Server.CreateObject("ADODB.Command")
cm.ActiveConnection = objConn
cm.CommandText ="INSERT INTO Table1 (item1) VALUES (?)"
set objparam=cm.createparameter(, 200, , 255, strTB1)
cm.parameters.append objparam
if strTB1 <> "" then
cm.execute
end if %>
После переноса на IIS5 (W2000) выдала: [Microsoft][Драйвер ODBC Microsoft Access] В операции должен использоваться обновляемый запрос. Жалуется на строку cm.execute. На уговоры не поддается. =( Кто такой обновляемый запрос? Как быть?
Ответ.
    Это происходит потому, что драйвер ODBC "не понимает" ваши SQL запросы, т.к. различия в командах SQL могут быть различными. Попробуйте упростить задачу, используйте только ANSI SQL. Впервые я получил сообщение «В операции должен использоваться обновляемый запрос» в программе «Зарплата и Кадры». Пришлось разделить SQL-запрос на две части. Первая часть создавала временную таблицу. Вторая часть запроса брала данные из таблицы и продолжала вычисления.
[Проблема] Вопрос 12. Есть БД на Oracle. Если работаю с ней через MS Access, то "сложные" запросы выполняются и получаю приемлемый результат. Поскольку запрос получается на MS SQL (или Access, не знаю как правильно), то есть подозрение, что где-то есть интерпретатор, который конвертирует в понятный для Oracle вид. Каким образом можно получить запрос в "удобоваримом" для Oracle виде, т.е. на PL/SQL?
Ответ.
    Я не специалист по Oracle, но могу сказать, что связь Access и Oracle осуществляется через драйверы ODBC, которые поставляются как Microsoft так и Oracle. Какой лучше из них, не знаю. Интерпретатор (драйвер ODBC) конвертирует данные одной базы данных в другую. Например, из Oracle в Access: Float -> Double, Long->Memo. Если Вы используете типы полей Oracle, которых нет в Access, то они конвертируются в поле Text с соответствующим размером точности. PS. Таким образом, возможное решение Вашей проблемы лежит в плоскости ODBC. (нужно найти подходящий драйвер ODBC).
[Отчеты]. Вопрос 13. Не могли ли вы написать про создание отчетов, и если возможно можно ли в Access сделать свое законченное приложение(setup/install) - что бы работал на тачке, где нет Access?
Ответ.
    Программы по отчетам Вы найдете в файле: la_report.mdb и la_report1.mdb. Небольшую информацию о том, как создать законченное приложение на Access я дал в подписке. Кроме этого, у меня на сайте в разделе «Другие» есть ссылка на статью, где подробно описывается об этом. PS. Вообще, если Вы разрабатываете коммерческую программу, лучше подумайте о том, как сделать доступным заказчику для изменения отчеты, формы и т.п. Потому что, если он будет покупать программу, то первый вопрос, который он задаст Вам, звучит примерно так: «Можно ли изменить отчеты в программе?».
[Формы]. Вопрос 14. Как сделать, что бы сортировка на форме производилась в порядке ввода данных.
Ответ.
    Вам надо создать на форме кнопку, которая бы сортировала записи и далее «находила» запись формы, с которой Вы работали ранее. Пример «Сортировка в форме» Вы найдете в файле: la_form1.mdb
[Отчеты]. Вопрос 15. Многих (и меня в том числе) интересует возможность при помощи Access2000 публиковать данные из аксессовской базы в формате html в виде ленточной формы (или хотя-бы табличной). Визард не позволяет получить такое отображение. Возможно ли в Аксессе, не привлекая дополнительных средств (Нотепадов и т.д. :-) ) смастерить страничку с динамически обновляющимися данными в ленточном или табличном виде?
Ответ.
    В Access есть страницы доступа к данным. Я разработал одну такую и даже пытался разместить ее в Интернете. Но, но этот способ публикации информации в Интернете не самый лучший. Он еще не развит, да и открывается html-файл медленно, поэтому лучше воспользуйтесь другими средствами публикации.
[Формы]. Вопрос 16. У меня такой вопрос. Я заранее не знаю на каком мониторе (с каким разрешением) будут работать мои программы, поэтому получается, что созданная мной форма либо не влазит в экран, либо часть экрана остается пустой. Что можно сделать?
Ответ.
    Посмотрите пример «Как определить разрешение экрана» в программе la_form.mdb
[Формы] Вопрос 17. Еще один вопрос. Может не Вам, но если можете, подскажите. В запросе к серверу SQL я могу явно указать параметр для отбора записей (например, дату). Как указать в запросе, чтобы этот параметр брался из поля формы? Ссылка типа Forms!NameForm!Pole не проходит.
Ответ.
    Попробуйте ссылку написать так Eval(Forms!NameForm!Pole), тогда функция Eval вернет в SQL значение, а не ссылку. PS. Если не получиться, то надо составлять запрос: sSql=«SELECT * FROM [MyTable] WHERE [myDate]=» & Forms!NameForm!Pole. Дата в поле должна иметь американский стандарт.
[Проблемы]. Вопрос 18 . У меня возникла следующая проблема: Имеется база данных на ~30000 записей, находящейся на файл-сервере Nowell 3.12. Начиная с некоторого момента сервер стал выдавать сообщение о том, что ему не хватает памяти для "залочивания" изменяемых записей, и базу пришлось перенести на локальную машину. Что очень не удобно. Попытки поиграть с режимом блокирования записей ничего не дали, памяти добавить на сервер нет возможности. Возможно, я что-то упустил? Подскажите, как быть. (Конечно изменить алгоритм работы можно, но хотелось бы иметь и другой вариант решения проблемы)
Ответ.
    Попробуйте сжать базу данных по алгоритму, который я привел выше для двух mdb файлов. Сначала создаете пустой mdb файл, а далее в него путем импорта вставляете таблицы и другие объекты.
[Списки]. Вопрос 19. Я работаю на Access 97. У меня на форме список с источником строк, направленным на запрос с параметрами. Когда форма (и, соответственно, запрос) открыты, я изменяю значения параметров запроса (через компонент QueryDef) и выполняю Requery у списка. При этом открываются диалоги ввода параметров, а установленные мною значения параметров игнорируются. Почему?
Ответ.
    Я вообще запросы с параметрами не использую, но в списках запросы изменяю очень часто. При «входе» (ПолеСоСписком1_Enter) в список и «после обновления» ПолеСоСписком1_AfterUpdate). Поэтому, попробуйте составить запрос без параметров. Например, напишите так: sSQL = “SELECT * FROM [MyTable] WHERE [Код]=” & Me.Kod. Далее присвойте эту строку списку: Me.ПолеСоСписком1.RowSource = sSQL
[Формы]. Вопрос 20. Остался такой вопрос. Кнопка в форме: в исходном состоянии запрещено изменение и добавление. При нажатии на кнопку - меняются свойства и теперь можно вводить изменения или, например, добавить. При этом происходят какие-то изменения в форме, например, цвет кнопки меняется на красный.
Ответ.
    Пример, «Включить редактирование в форме», смотрите файл: la_form.mdb
[Отчеты]. Вопрос 21. Вопрос. В отчете печатаются фамилии и какая-то сумма. Необходимо в конце получить ИТОГО. Например, Вася 200, Маня 305, Ваня 276,5 ИТОГО 781,5
Ответ.
    Для получения результатов в отчете необходимо провести группировку по нужным записям и использовать функцию sum() для поля Сумма. Это выглядит так: sum([Сумма]). Пример «Суммирование в отчетах» дан в файле: la_report1.mdb для книг.
[Проблема]. Вопрос 22. Недавно начал программировать на Access. На строчку Dim dbs As Database в Access-e выдается ошибка user-defined type not defined. Хотя в Ваших лекциях (программа калькулятор) все проходит нормально. В чем может быть проблема??
Ответ.
    При работе с запросами, таблицами необходимо установить ссылку на DAO (например, Microsoft DAO 3.6 Object Library). Дополнительно прочтите Лекцию 2d, далее при редактировании своей программы выберите меню Tools - References и установите нужную ссылку. Внимание!. Порядок ссылок может иметь существенное значение. Могли бы получить ответ и раньше, если бы прочли на сайте раздел FAQ для лекций.
[Таблицы]. Вопрос 23. У меня возникла небольшая проблема с объектом RecordSet и её методом Delete. Я знаю, как добавить записи в базу с помощью метода AddNew. Теперь возникла необходимость удаления Записей из таблицы. Скажем так, существует необновляемый запрос, в состав которого входит таблица, из которой будут удаляться записи. У этой таблицы в запросе есть свой Код, с помощью которого будут удаляться записи. Код выглядит так.
Dim tbl as Recordset, db as database, Kod As String
Kod = [Поле в запросе, соответствующее этому коду]
set db = currentdb
set tbl = db.OpenRecordset("MyTable",dbOpenDynaset)
tbl.delete
Метод tbl.delete удалят поочерёдно записи из таблицы начиная с первой. А вот как сделать то что бы он удалял только ту строку, которая на данный момент активна в запросе (на которой стоит курсор) и соответствует Ключевому полю Kod Описаному Ниже.
Ответ.
    Для позиционирования в запросе существует метод tbl.FindFirst. Смотрите примеры в файле: la_form.mdb. В вашем случае, я бы написал по другому: db.execute “DELETE * FROM [MyTable] WHERE [Kod]=” & me.Kod. Пример «Как удалить запись через SQL?» возьмите из файла: la_form1.mdb
[Другие]. Вопрос 24. Я только подписался и не все понимаю в рассылках. Но сама рассылка мне понравилась. И сходу несколько вопросов по теме …
Ответ.
    Сходу не получится, т.к. пострадают другие подписчики, которые прислали вопросы раньше. Технология ответа следующая. Все вопросы, присланные по адресу , хранятся у меня в папке «Подписка». И так, если к Вам не пришло никаких сообщений, то я его получил. Далее я разбираю почту и даю ответ в подписке в порядке очередности. Вы, также получите сообщение, что вопрос попал в подписку. Кроме этого, все вопросы сортируются и попадают на сайт www.leadersoft.ru в разные разделы. Если Вы имеете срочный вопрос, то Вы можете получить на него ответ быстрее. Для этого в письме дайте пометку «Срочный» и отошлите его, я дам ответ о его получении. Услуга платная, расценки следующие: 5 (пять) рублей «За консультацию по Access», 50 (пятьдесят) рублей «За программу по Access». Оплата через сайт: www.webmoney.ru
[Отчеты] Вопрос 25. Подскажите, пожалуйста, по вопросу №5 (рассылка 13). Возле "цена" - печатать "новая" - добавляю еще одну такую же процедуру с другим условием и для другого поля. Отчет не хочет получаться, пишет что-то про ошибку печати в программе.
Ответ.
    Я добавил VBA - код для другого поля, смотрите файл: la_report.mdb
[Проблема]. Вопрос 26. Razdelil bazu ! Tablici v odnoj direktorii , aplikacii v drugoj . pitajus iz MDB sdelat MDE, vidajot takoe soobshenie. Chital help , napisano chto vrode chto to sdelat s podlinkovannimi bazami. Chto mozno sdelat ?
Ответ.
    Правильно Access дает Вам сообщения. Прежде чем, создавать mde файл из mdb, свяжите последний с реальными таблицами, которые Вы разместили в другом файле. Для этого используйте пункт меню «Диспетчер связанных таблиц»
[Лекции]. Вопрос 27. Napishi pojailusta etu programu c English mazvaniyami a to u menya ne rabotaet na Win98(English) and Offise 2000 mne ocheni nujni lektsii po Access
Ответ.
    Я планирую это сделать. Но на эту работу нужны деньги. Вы можете ускорить выход лекций на английском языке. Задайте нужный Вам вопрос. На него будет дан ответ на английском языке и написана программа. Услуга - платная, стоимость определите сами. Оплатить можно через www.webmoney.ru
[Другие] Вопрос 28. Dear Leader: I subscribed for Access recently, and started receiving information from issue 11. Could you, please, help me to get issues 1 - 10? Thank you in advance.
Ответ.
    Hellow! You can receive all archive: www.leadersoft.ru. With the best regards, Victor Konjukov

Добавить комментарий

Loading