Введение. В данном выпуске рассматриваются 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 |