Рассылка статей | Выпуск 20. Борьба за скорость
Leadersoft.ru

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

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

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

Выпуск 20. Борьба за скорость

Введение.
    В этом выпуске рассказывается о некоторых вопросах, связанных с увеличением скорости работы базы данных, продолжаются короткие уроки для начинающих и даются ответы на вопросы по Access.


Новости магазина "Лидер Access".
   1. Вышла новая программа "Курс 2000", версия 4.3. Назначение ее - быстрое получение курсов валют из Центробанка. Теперь Вы можете распечатать календарь для любого курса валюты, а также улучшились характеристики программы по получению GBR, FRM и FIM. Программа распространяется бесплатно, но только для Access 2000. Вариант программы с возможностью чтения данных за любой период стоит 300 рублей. Открытый код VBA для добавления в Вашу складскую или банковскую программу стоит 300$.
   2. В прайс-листе появился таймер для профессионалов. Обязательно посмотрите его использование. Ссылки на программу и общий вид указаны ниже. Его свойства: имеет профессиональный дизайн, позволяет останавливать загрузку данных, свободно передвигается по желанию пользователя, легко управляется из VBA, не останавливает другие задачи пользователя, минимально загружает процессор. Применяется не только для отображения времени выполнения длительных задач в Access, но и для демонстрации Ваших профессиональных качеств. Цена 75 рублей.
   3. Еще один код, который распространяется магазином: Печать в Access 2000. Программа разработана с использованием API функций на языке Visual Basic для Microsoft Access 2000. После изучения кода Вы будете уметь получать информацию об установленных для разных операционных систем Windows принтерах и факсах, назначать любой из них по умолчанию (главным). Программа будет полезна в первую очередь разработчикам Access программ, создающим профессиональные приложения. Загрузите mde-пример и посмотрите его в работе. Цена 20 рублей.


Коды для Access 2000
   I. Файл la_form1.mdb. Добавлены следующие примеры. 16. Сумма прописью. Программа будет полезна для для разработчиков платежных поручений, т.к. добавлены решения в соответствии с последними указаниями Центробанка. 18. Диспетчер связанных таблиц. Данная программа заменяет стандартный диспетчер Access своим. 19. Цветные поля в форме. Показан пример, позволяющий форматировать поля, строки форм в зависимости от разных условий задачи. 20. Форматирование полей в форме. Небольшой пример на тему форматирования поля.
   II. Файл la_table1.mdb. Добавлен пример 11: "Сравнение свойств поля базы данных". Пример показывает встроенные свойства поля и те, которые Вы должны создать при программировании полей таблицы.
   III. Файл la_report1.mdb. Добавлен пример 16: "Изменение размеров страниц отчета". Пример показывает использование свойства отчета PrtDevMode. При подготовке использована справочная система Access.
   IV. Файл la_automat.mdb Добавлены примеры серверов автоматизации. 01. Рассылка почты через Outlook. Пример показывает как рассылать почту пользователям из Access. 02. Создание документа Word. Простой пример создания документа Word из Access.


Access 2000. Урок 2. Общая информация о таблицах
    Одним из самых главных объектов Access являются таблицы[1]. Удобство работы с ними и обеспечило громадную популярность этой базы данных. Условно таблицы можно разбить на две группы: внутренние и присоединенные из других файлов, например, mdb, dbf, db и т.п.
    Существует такое правило, что при сохранение информации в таблицах желательно, чтобы каждая строка была уникальной. Это достигается путем установки первичного ключа[2]. Он может состоять из одного или нескольких полей[3] таблицы. Если Вы не можете назначить подходящий ключ, то используйте поле Счетчик[4]. Использование таблиц без ключей возможно, но я Вам не рекомендую это делать на "реальных" базах данных.
    В Access есть несколько способов создания таблиц. Например, 1 - в режиме конструктора, 2- c помощью мастера, 3- путем ввода данных, 4- через запрос SQL[5], 5- с применением функции VBA[6]: CreateTableDef. 6- путем импорта таблиц из других баз данных, смотрите TransferDatabase. Каждый из этих способов имеет свои плюсы и недостатки, но какой лучше выбрать на этапах разработки базы данных решать Вам. Мы же остановимся сейчас на самом популярном - первом способе: "Создание таблицы в режиме конструктора".
    В этом режиме Вы визуально можете создать поля. Важно уметь давать короткие имена им. Например, [Номер документа] = [Nдок], [Название организации] = [Фирма], [Единица измерения]=[ЕдИзм]. Это связано с тем, что применяя короткие имена полей, Вы тем самым уменьшаете длину запросов и база данных работает быстрее, да и ошибок будет меньше.
    Кроме этого в конструкторе можно назначить свойства[7] полям. Например, "Размер", "Описание", "Подпись" и другие. Свойств полей в базе данных может быть очень много. Посмотрите пример 11 в файле la_table1.mdb, там указано, что при создании поля типа Дата/Время создается сразу 24 свойства. Еще четыре, а именно, Описание-Description, Маска ввода-InputMask, Формат поля-Format, Подпись-Caption являются "бутафорией", т.е. Вы их видите в конструкторе таблицы, но на самом деле их нет. Программисты Microsoft сделали это за тем, чтобы обеспечить минимальный размер базы данных. Из этого заключения следует, что эти свойства лучше не заполнять. Но это неправильно, например, без свойства "Описание" будет сложно понять назначение полей Вашей таблицы. Пример привожу за тем, чтобы Вы при создании таблиц программным путем помнили, что эти свойства сначала создаются, а только потом уже изменяются, иначе будет сгенерирована ошибка.
   В заключение хочу сказать, что проектирование таблиц - это искусство, и только "опыт" может подсказать Вам, как лучше их разрабатывать.
Словарь
   • [1] Таблицы (Table) - основной объект базы данных.
   • [2] Первичный ключ (PrimaryKey) - свойство таблицы.
   • [3] Поле (Field) - главный объект таблицы.
   • [4] Счетчик (AutoNumber) - специальное автозаполняемое поле в базы данных.
   • [5] VBA (Visual Basic For Applications) -язык программирования Бэйсик для офисных приложений.
   • [6] SQL (Си'квэл, Structured Query Language) - язык создания запросов к базе данных.
   • [7] Свойство (Property) - параметр структуры поля базы данных

Ответы на вопросы


 

Вопрос. Как можно увеличить скорость программы?
    Искал как-то я в Интернете решение проблемы "Переменная высота строк в отчете". Серьезной информации по отчетам не было, нашел только решение с подсчетом символов в поле. Применять его было нельзя из-за сложного алгоритма. Самостоятельно вышел на изящное решение, что надо рисовать прямоугольник вокруг поля при обработке события отчета Print. Смотрите файл: la_report.mdb, подписка 13 от 10.10.2000. Сейчас "обкатываю" еще одно оригинальное решение на эту тему. Заглянул на всякий случай в Рунет и нашел, что один "гений" в алгоритме по рисованию поля заменил шустрый оператор if else на "новейшую мину замедленного действия" - IIF(двойной если). А "Профи" настоятельно не рекомендуют применять его в basic- программах. Даю расшифровку фразы. "Миной замедленного действия" IIF() можно назвать потому, что он значительно моложе и на 70% медленнее оператора if else, да еще при неосторожном использовании приводит к "сваливанию" программы. Это анти-решение и подсказало мне опубликовать несколько коротких фраз по оптимизации кода. Повышение производительности базы данных в процентах указано в скобках. Информация сокращена до минимума. Надеюсь Вам будет понятно, о чем идет речь, но если, что неясно - пишите.
01. Используй оператор if else, вместо IIF() [70%]
02. Используй Long, т.е. Long лучше Byte, Integer и, конечно, Variant [20%,50%]
03. Применяй If-Else, чем Switsh, Shoose [50%]
04. Лучше проверяй строку так Len(s) = 0, чем s = "" [40%]
05. Лучше инициализируй строку так s = vbNullString, чем s = "" [65%]
06. Если возможно пиши так s = "AB", чем s = "A" & "B" [85%]
07. Вставляй строку в текст так Mid$(s,3,4)="like", чем s = Left$(s,2) & "like" & Mid(s,7) [45%]
08. Сравнивай строки так If StrComp(s1,s2,vbTextCompare) =0 then, чем If Ucase(s1) = Ucase(s2) [55%]
09. Лучше используй $-функцию, т.е. Left$ лучше Left [40%]
10. Цикл For...Next работает быстрее Do...Loop [50%]
11. При обработке целых чисел пиши j=i\10, чем j=i/10 [30%]
12. Точнее объявляй объекты: as CommandButton лучше As Control, еще лучше as Object [90%]
13. Цикл For Each...Next лучше, чем цикл For...Next для семейств объектов [98%].
14. Цикл For ...Next лучше, чем цикл For Each...Next для массивов [25%].
P.S. 1. Все тесты на скорость придумали и провели для Access 2000: Кен Гетц, Пол Литвин и Майк Гилберт. За что им большое спасибо.
2. Запомните наизусть фразу из документации по VBA, самый короткий код - не самый быстрый. Есть еще предложения по оптимизации кода, их я опубликую позже.
Вопрос 27. Помогите, пожалуйста, понять, есть ли возможность из приложения Access отправить Outlook Task Request?
Вопрос 81. У меня вопрос. Я подрабатываю в службе знакомств. Создал небольшую базу данных, где пока только наши клиентки (создал по примерам "Борей", достаточно симпатично). Я хочу что бы можно было связать каждую девушку с отдельным клиентом. Нужно что бы входящие и исходящие письма с каждым клиентом можно легко достать и отсылать их по e-mail из ACCESS
Вопрос 82. Расскажите, пожалуйста, как можно автоматизировать рассылку новостей (с помощью OutLook или средствами самого Access). В базе данных мы имеем определённый набор адресов электронной почты (который постоянно пополняется) и набор новостей. Как адреса так и новости разбиты на категории и их количество не постоянно. Определённые категории новостей рассылаются определённым категориям клиентов с учётом уже отправленных новостей и времени вступления в клуб. Поэтому такой сервис крайне необходим.
  Ответ. Когда я получил первую информацию на эту тему я подумал, что кто-то хочет стать спамером. Но после этих двух вопросов стало ясно, что проблема важна для многих. Поэтому и дал решение в примере N1 в файле: la_automat.mdb. Чтобы Вам не скучно было изучать Outlook вставил вымышленное письмо спамера к своим "родителям". Но адрес email рассылки указан реальный. От адресата несколько раз приходили письма купить базу данных клиентов и рассылать рекламу, т.е. стать спамером.
  О проблеме. Ее решают через применение клиента автоматизации. Короткий код я привожу здесь, чтобы Вам была понятна сама идея.
Set app = New Outlook.Application 'Открываем Outlook
Set itm = app.CreateItem(olMailItem) 'Создаем сообщение
itm.Subject = Me.Subject 'Определяем тему письма
itm.Body = Me.Body 'Вставляем текст письма
itm.Attachments.Add Me.File 'Присоединяем файл
itm.Recipients.Add Me.Email 'Добавляем адрес рассылки
itm.Send 'Посылаем письмо
app.Quit 'Закрываем Outlook
Более подробно, с использованием таблицы, где можно хранить электронные адреса и письма для рассылки смотрите в файле: la_automat.mdb.
 Вопрос 72 (16.11.2000). Буду признательна, если поможете справиться со следующей проблемой. Требуется выделять другим цветом поле или строку в ленточной форме в зависимости от конкретного значения поля текущей строки.
   Ответ. Эту проблему Microsoft решила только в версии 2000, в 97 она есть. Программисты Microsoft разработали три варианта условий при котором форматируется поле формы в Access: 1- в зависимости от его значения, 2 - в зависимости от некоторого выражения, которое может быть связано с другими полями, 3 - при получении фокуса, т.е. при входе в поле. Максимально в каждом варианте Вы можете рассматривать 3 условия форматирования. Чтобы полностью закрыть эту тему, посмотрите пример N19 в файле: la_form1.mdb
Вопрос 50. Подскажите, пожалуйста, как в вычисляемом поле запроса "Access" избавиться от 15 - 18 знаков после запятой? В вычисляемом поле перемножаются данные из поля с "длинным целым" (пробовал изменить на "целое") на данные из поля с "плавающей точкой (4 байт)" (пробовал и на 8 байт).
  Ответ.Игорь Макеев Format или написать функцию округления
Виктор Конюков Пример 20 на эту тему я привел в файле la_form1.mdb Его можно использовать для тренировки или быстрого просмотра разных форматов поля формы.
Вопрос 56. В одном из прошлых выпусков рассылки Вы упомянули о том, что Вам в программе "Склад и Реализация" удалось реализовать постоянную скорость доступа к данным в течение года. Насколько я понимаю, в данном случае скорость обработки данных не зависит от их объема, чего в случае работы с большими (по числу записей) таблицами быть НЕ МОЖЕТ. Объясните, пожалуйста, в общих чертах, как Вам удалось добиться такого результата, или пришлите ссылки на ресурсы Internet. Если Вы решили разбивать большие (по количеству записей) таблицы на несколько одинаковых небольших таблицах, тогда поясните, как Вы реализовали скоординированный доступ к этим таблицам.
   Ответ. Это ноу-хау. Подробности дать не могу. Сами понимаете, все мгновенно "раcтащат" наши "гении", и пользы никакой людям не принесут, да и сами ничему не научатся. Но кое-что рассказать можно. Во первых о ссылках. Есть у меня есть раздел на сайте "Ресурсы Access". Используя его, Вы можете выйти на любой сайт или архив программ в Рунете. Но сразу скажу, если отбросить файлы, которые копируют другие идеи, то информации получиться очень мало. А методы повышения скорости и оптимизации применения большого числа файлов и таблиц базы данных вообще никто не рассматривает. Ну а теперь о самой методике.
    Данная технология разрабатывалась для предприятий с низким производственным потенциалом, т.е. людей без высшего образования уже в зрелом возрасте. Им тратить время на изучение новых программ, SQL серверов или копаться в таблицах с 20 тысячами записей проблематично. Было ясно, что даже если им прикажет директор, и они полностью согласятся с ним, самостоятельно ничего изучать не будут и даже пальцем не пошевелят. Поэтому задача была поставлена такая, минимум данных, приличная скорость работы с компьютером и максимум автоматизации.
   Решение проблемы началось не с программирования, а с изучения методов расчета себестоимости, учета кассовых и банковских операций. Проанализировав проводки в документах предприятия, и частоту их использования, были вычислены таблицы, которые нужны складу, банку и кассе. Определена степень их важности и место хранения в базе данных. Установлены между ними связи. Только после всего этого разрабатывались, формы, запросы отчеты.
   Некоторая информация по структуре VBA. Общее число программ в модулях более 200. Чтобы управлять автоматически файлами, была создано специальное ядро системы. От репликации Microsoft пришлось отказаться и разработать собственный вариант. Вот пример ее применения. Если необходимо в эталонной базе данных добавить поле или изменить его размер в сторону увеличения, то при обращении к рабочей базе функция репликации должна это делать автоматически. А вот уже обратно, т.е. удалить поле или уменьшить его размер, она должна это делать только в ручном режиме, так как возможна потеря данных. Ядро системы должно без участия работника переводить остатки, вести нумерацию документов во всех файлов. Много чего пришлось решать, все коротко и не расскажешь. Тяжелый труд, применение клиент - сервер архитектуры проще. Но самое главное - это хороший результат. Дело в том, что увеличилась не только скорость базы данных, но сократилось время внедрения до 1 дня. Как это происходит. Приходит заказчик со своим прайс - листом, при нем вводится информация и печатаются все накладные, остатки и другие документы по складу. Задается вопрос, можно ли изменить в конструкторе отчет или форму. Показывается как это сделать. Если клиент - серьезный "покупатель", то договаривается об оплате, если "интересующийся", то просит схему таблиц или демо-версию. Естественно, никто ему это не даст, и он уходит расстроенный. Правда сейчас я планирую для тех, кто собирается переходить c dbf программ на Access опубликовать несколько примеров из сборника. Думаю, что и конкурентам что-то от этого перепадет.
   Работа над программой постоянно совершенствуется. Тестируется новая версия, в которой свободно можно будет изменять внешние отчеты и формы, не думая о привязке таблиц. Всем старым покупателям версия программы будет рассылаться бесплатно, при этом добавление новых таблиц и полей произойдет автоматически.
Вопрос 59. Вот столкнулся с такой проблемой. Как по Access 97 (из своей программы) вызвать - Диспетчер связанных таблиц? Как в Access 2.0 делается знаю, но в 97 это уже не проходит.
Вопрос 64. При разделении базы на mde и mdb файлы связи с таблицами можно обновить через диспетчер связанных таблиц. А как это сделать программным путем?
  Ответ. В принципе решить задачу очень легко. Сначала, найдите пункт меню, используя его имя или код в элементах управления. Далее выполните для него команду execute. С другой стороны, для серьезной программы лучше разработать свой диспетчер связанных таблиц.  Пример 18 на эту тему я привел в файле: la_report1.mdb. Дополнительно там, Вы найдете подробное решение Дмитрия Чернова. Используя 2 идеи Вы полностью решите свои проблемы.
Вопрос 83 (21.11.2000). Здравствуйте. Мне очень понравилась Ваша рассылка, но в силу определенных обстоятельств я пользуюсь Access97. Могу ли я относить описанное в Вашей рассылке к этой версии программы? Заранее благодарен
   Только частично, некоторых функций нет в Access 97.
Вопрос 86 (22.11.2000). Случилась такая проблема: при выводе в поле отчета (и формы) результата строковой функции (и string, и variant), содержащей русские буквы, выводятся знаки вопроса (на месте русских букв). Шрифты -- разные: от Arial до различных Type1. При этом вывод =CStr("русские буквы") -- без проблем. Пробовал Access 97 на w2000en, w95en, w98ru. Все с IE5 -- в доке встречал упоминания о кодировке рядом с IE; без IE5 под рукой ничего нет.
  Ответ. Вообще надо проверить работу Вашей программы на одном офисе, т.е. где только находится Access 97 или Access 2000. Связано это с тем, что у них другой метод работы с символами. У меня это встречалось, но очень редко. Исправлял повторным вводом символов. P.S. Второй способ - попытайтесь из базы данных сделать микро-код и протестировать.
Вопрос 86а (23.11.2000). Попробовал привязать Вашу функцию "Сумма прописью" к платежке. Все вроде хорошо, но заметил что при вводе суммы ровно 1000 руб. (копейки роли не играют) и далее кратно 1000, то есть без рублей после тысячи то в результат попадает: "Одна тысяча ХХ копеек" (ХХХ тысяч/тысяча), а хотелось бы получить "Одна тысяча рублей ХХ копеек". Такая же история и с миллионами и т.д. Посмотрев код функции я не нашел быстрого способа исправить это. Наверное придется писать условия для всех трех блоков (тысячи, миллионы, миллиарды)
   Ответ. Когда я публикую код, вытаскивая его из какой-нибудь своей программы, то я сокращаю его до минимума, чтобы было понятно логику программы. Код для "Суммы прописью" я добавил, посмотрите его и сравните со старым (раздел "Архив программ"). Решение не очень сложное. Мой совет. Подумайте немного сами, может получится и у Вас.
Вопрос 87 (23.11.2000). У нас в банке требуют при печати платежки, чтобы в графе сумма цифрами (поз.7) при указании суммы с копейками равными "00" стоял разделитель "=" между рублями и копейками, а при всех других случаях стоял "-". Я не понял до конца каким способом сделать это безболезненно для моей структуры (не добавляя доп. полей в таблицы и др.).
   Ответ. Тема "Платежное поручение" - неисчерпаема. Для тех, кто только вступает в ряды разработчиков Access и собирается помочь решить им эту сложную задачу, я добав��л в файл la_form1.mdb способ отображения суммы прописью, а также форматирование числа с разделителем разрядов по новым требованиям Центробанка.
Вопрос 92 (23.11.2000). Думаю следующий вопрос будет интересен многим.  Не подскажете ли Вы, как Отчете из двух таблиц, (главной и подчинённой) отобразить записи в подчинённой таблице не в столбик, например:
       поле главной таблицы
       поле подчинённой таблицы(запись 1)
       запись 2
        ....)
       а в строчку, например,
       поле главной таблицы
       поле подчинённой таблицы(запись 1, запись 2 ....)
   Ответ. Посмотрите пример как добавить поле в отчет mde файла. Принцип добавления полей вдоль строки такой же.
Вопрос 93 (23.11.2000). Возможно ли создание вычисляемых полей в таблицах Access ?
  Возможно.
1 способ. /Новая запись/ Вставьте функцию по умолчанию для поля. При создании новой записи в ваше поле будет записываться результат, определенной этой функцией.
2 способ. /Существующая запись/ Составьте для поля список на основе запроса, который будет использовать вашу таблицу. В таблице поле придется обновлять вручную, но если известен результат для него, то это не очень сложно. Примеры такой таблицы в mdb формате приведу позже.
Вопрос 94 (24.11.2000). Здравствуйте, у меня возникла проблема: необходимо посчитать срок (из одной даты вычесть другую) в годах, месяцах, неделях.
Стандартная операция возвращает целое число - количество дней. Можно конечно перевести в месяцы, но как быть, если год високосный?, если в этот промежуток времени попадает 29 февраля?
  С датами в Access работают как с целыми числами. Например, если Вам надо определить последнее число месяца делается это так.
d = Date 'Текущая дата
m = Month(d) 'Определяем месяц
y = Year(d) 'Определяем год
DLast = DateSerial(y, m + 1, 1) - 1 'Последний день месяца
Вопрос 95 (24.11.2000). DoCmd.OutputTo acOutputReport, Name_Report, acFormatTXT, , False если юзер нажмёт отмена в диалоге "Выбора пути сохранения файла",
Access выдаст окно с предупреждающим сообщением. Можно ли как-нибудь избавиться от него?
Ваш код можно улучшить таким образом:
On Error Resume Next
DoCmd.OutputTo acOutputReport, Name_Report, acFormatTXT, , False
Err.Clear
Вопрос 96 (24.11.2000). При разработке программы в MSA97 столкнулся с тем, что невозможно выполнить инструкцию DoCmd.OpenReport "MyReport", ,"MyQuery", если MyQuery является объединенным запросом. Может быть, использовать свойство RecordSourse для отчета? Пробовал, не получается. Даже будучи открытым в режиме предварительного просмотра, отчет не позволяет менять свое свойство RecordSource,
т.к. процесс печати, уже, мол, запущен. И советует изменять это свойство в процедуре обработки события Open. А это, как ни крути, означает, что придется сохранять отчет для этого запроса под другим именем, выставлять у него свойство RecordSource, и все это как-то... нерационально. А разница всего-то в источнике записей. Уверен, должно быть красивое решение, и эта мысль не дает мне покоя. Помогите идеей, если возможно.
   1. Вид команды такой: DoCmd.OpenReport "МойОтчет"[, "Вид отчета"][, "Запрос отчета"][, "Условие отбора записей"]. Если у Вас правильно составлен запрос и условие отбора, то все работает.  Таким образом Ваша команда может выглядеть следующим образом:
DoCmd.OpenReport "MyReport", acViewPreview, "MyQuery", "[Number]>10"
   P.S. Необходимо перед открытием отчета проверить наличие запроса "MyQuery" в базе данных, если он открывается, то все будет работать. Конечно поле [Number] можно из запроса и команды убрать.
   2. После начала форматирования отчета нельзя изменить его запрос, но можно применить к нему фильтр, т.е. из всех записей отобрать только нужные. Как использовать фильтр (условие отбора) описано в примере 15 файла: la_report1.mdb
Вопрос 97 (24.11.2000). А как узнать какие названия цветов может идентифицировать Access и можно ли изменять таким образом размер шрифта и сам шрифт для отдельных столбцов
   К примеру 06 в файле: la_table.mdb. К сожалению в самой таблице, в отдельном столбце, изменить шрифт не удастся. Это можно сделать только для всей таблицы. Откройте ее, поставьте курсор на заголовок окна или столбца и нажмите правую клавишу. Перед Вами отобразится меню, где Вы сможете изменять свойства таблицы или поля. Всего при форматировании таблицы Access поддерживаются 16 цветов (Красный (Red), Черный (Black) и т.п.) Дополнительно прочитайте об этом в справке по форматированию поля.
Вопрос 98 (24.11.2000). Вопрос 67 (16.11.2000). В Access2000 произвожу экспорт таблицы в формат Paradox, нормально экспортирует, но кодировка получаемой базы .db почему-то 866, не подскажите как сделать 1251. Если я правильно понял, суть вашей рекомендации:
HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Xbase]
"
DataCodePage"="OEM"
При работе с другими dbf файлами надо изменить OEM страницу на ANSI
"DataCodePage"="ANSI"
- соответственно, вместо Xbase - Paradox. Попробовал, в результате во-время сохранения: Непредвиденная ошибка драйвера внешней базы данных <10018>. Посмотрел help на Access2000, относительно DataCodePage: "Этот параметр используется только в том случае, если на данном компьютере не установлено приложение BDE." В моем случае BDE установлено и значение LANGDRIVER выбрано "Pdox ANSI Cyrillic". Не посоветуете, что можно еще сделать.
   Вы неправильно сделали изменение. Ключ Xbase устанавливает Access, и менять его на Paradox нельзя. Исправить в реестре можно только OEM или ANSI, указано зеленым цветом. В вашем случае я бы попробовал изменить ANSI в параметрах секции ..\Jet\4.0 на OEM. Например, написать "Pdox OEM Cyrilic". Рекомендацию не проверял, так что будьте внимательны при изменении реестра. Во вторых, при конвертации строк из одной базы данных в другую можно использовать функцию: StrConv(myText, vbUnicode).
Вопрос 99 (24.11.2000). Есть форма, в ней Календарь и два текстовых поля. Выбираем дату в Календаре - щелчок по кнопке - дата в ТextBox1(начальная дата), снова выбор в Календаре - щелчок по кнопке и дата в TextBox2 (конеч. дата). Теперь вопрос: Как открыть отчет, используя даты в TextBox1,TextBox2 и оператор BETWEEN. С одной датой работает: DoCmd.OpenReport "Отчет1", acPreview, "", "[Запрос1]![Дата]=[Forms]![Форма1]![TextBox1]" и с OR работает:
DoCmd.OpenReport "Отчет1", acPreview, "", "[Запрос1]![Дата]=[Forms]![Форма1]![TextBox1] or [Forms]![Форма1]![TextBox2]", а какой синтаксис у BETWEEN? Создать отчет на основе запроса с BETWEEN нет проблем! Но очень хочется так как сказано выше!
   При использовании запросов надо использовать американский стандарт записи, т.е. формат такой даты такой: #месяц/день/год#. Вот пример на эту тему:
SELECT * FROM [Мои книги] WHERE (((Дата) Between #9/14/2000# And #9/19/2000#));
В вашем случае я бы написал функцию usDate, которая бы конвертировала дату из списка в другой стандарт, т.е. запрос будет такой: DoCmd.OpenReport "Отчет1", acPreview, "", "(((Дата) Between " & usDate([Forms]![Форма1]![TextBox1]) & " And " & usDate([Forms]![Форма1]![TextBox2]) & "))"
Вопрос 100 (24.11.2000). Можно ли восстановить удалённые файлы в *.dbf ? Помогите!!!!!!
  Во первых, если Вы удалили файл dbf, то посмотрите его в корзине или используйте другую программу восстановления, например, утилиты Нортона.
  Во вторых, если Вы удалили записи в dbf и файл не сжали, то их можно восстановить. Каждая запись в dBase не удаляется, а отмечается флажком '*'. Поэтому Вам надо заменить '*' на ' ', тогда она появится. Программ на эту тему очень много, посмотрите в интернете или используйте какой-нибудь программный пакет для работы с dBase. С другой стороны, если Вы часто работаете с dBase файлами, напишите такую программу сами. Это не сложно. Файл dbf имеет самую простую структуру и очень полезен для изучения таблиц баз данных.
  P.S. За вопрос номер 100 спасибо. Желаю Вам огромных успехов в изучении dBase.
Вопрос 102 (27.11.2000). Результатом моего запроса являются два поля, например: ProductName и UserName. Мне же необходимо: ProductName и UserQuantity, т.е. для каждого продукта подсчитать, ск. Users его используют. Как можно сосчитать , сколько раз встречаются строки с каждым ProductName, упомянутым в таблице или запросе ? М.б. это можно сделать, "привязав" результат запроса к отчету ?
   1. Используйте запрос на группировку, например, SELECT ProductName, Count(ProductName) AS [UserQuantity] FROM [myTable] GROUP BY ProductName;
   2. Можно сделать группировку по ProductName в отчете, тогда запрос 1 не потребуется.
Вопрос 103 (27.11.2000). 1.Как сравнить в MS ACCESS две таблицы
  импортированные из EXCEL. Каждая из них содержит 13 столбцов (Название Индекс  Город Адрес  ФАМИЛИЯ ТЕЛЕФОН и т.д) и около 3000 строк - данные по организациям.   По сути это часть базы наших подписчиков. При этом почти все данные содержащиеся   в строках и столбцах в обоих файлах совпадают, за исключением 10% данных. Некоторые названия
организаций только похожи например в одном файле-таблице: "ООО Олала \ 400058 \Волгоград\Ул.  Костюченко,  49 \ кв.  1", в другом файле-таблице: "Опава ООО \ 400058\ Волгоград \ Ул. Костюченко,43  кв.  1".
  1. Для этого создается 3 таблица и индексируется по сравниваемым полям. Далее, через запрос на добавление, данные из первых 2 таблиц перезаписываются в третью. Индекс не позволит записать лишние записи в новую таблицу.
  2. Остается только вручную отобрать нужные записи. Писать программу анализирующую Ваши строки достаточно сложно.
Вопрос 104 (27.11.2000). Как удалить одинаковые данные из одной и той же таблицы. Например: строка1 "ООО Опава \ 400058 \Волгоград\Ул  Костюченко,  49 \ кв.  1"  строка 195 "ООО Опава \ 599999 \Москва\Ул  Костюченко,  49 \ кв.  1" При этом до удаления каждой строки обязательно чтобы программа спрашивала у пользователя удалять ли конкретную строку.   
  1. Надо написать запрос на группировку (см. пример 102) и отобрать записи, где счетчик <> 1
  2. Откройте этот запрос в программе на VBA и для каждой записи установите проверку на удаление.
  3. Если пользователь согласился на удаление строки, далее составьте запрос на удаление, используя данные из предыдущего запроса на группировку.
  P.S. Некоторые примеры по составлению запросов есть на сайте.
Вопрос 105 (27.11.2000). При импорте из файла EXCEL данные типа: июль01 вообще не импортируются. Как быть?
   Надо написать конвертер для перевода текстовых данных в тип Дата, функция - CDate. Пример конвертера есть на сайте.
Вопрос 107 (27.11.2000). • Написана база данных, которая должна работать под сетью (2 компьютера, один из которых является сервером). • Создана папка общего доступа, в которой я разместил таблицы. На каждом компьютере создан файл mdb, содержащий формы, модули, запросы и ссылки на общие таблицы, находящиеся на
сервере. • Но работа программ происходит настолько медленно, что с базой данных просто невозможно работать: - Загрузка формы происходит около 1 минуты. - Переход из записи на запись происходит около 5 секунд. Это несмотря на то, что я проанализировал в мастере
быстродействие, оптимизировал все, что только можно, и создал mde - файл.
    Эта же программа работает на порядок быстрее, если формы не отделять от таблиц, а создать единственную копию на сервере, к которой открыть доступ с обеих компьютеров. Но тогда возникают проблемы с блокировкой данных, при совместной работе, и проблема с открытием основной формы (если на втором компьютере она уже открыта, необходимо закрыть ее,
дать возможность открыть ее на 1-м, после этого открыть ее с окна базы данных).
   Здесь Вас может только выручить тест на скорость. Создайте у себя базу данных mde c одной формой, а на сервере разместите mdb с таблицей. Если скорость медленная, то надо настраивать программное обеспечение сервера (приоритеты доступа), если высокая, то надо копать у себя программный код (упрощать запросы, открывать их после загрузки формы и т.п.)
Вопрос 106 (27.11.2000). В Access в запросах используются различные функции по подмножествам, типа суммы, среднего, максимального и др. Так вот, есть ли там такая функция, которая бы суммировала не числа из подмножества, а строки, т.е. возвращала сумму строк. Она бы мне очень пригодилась.
  Изучите работу функции Count. Например, Count(*), Count([N]) и т.п. Данная функция возвращает число повторяемых строк в запросе.
Вопрос 108 (28.11.2000). В запросе поле МЕМО обрезается... Это происходит только в Access 2000... до конвертации подобных проблем не было. Почему??? И как это исправить? Все отчеты использующее это поле получаются неполные... Если есть возможность ответить мне сегодня, буду очень признательна!
   В поле Memo может быть 65335 символов. Лично у меня запросы и отчеты, созданные в Access 2000, на основе этого поля получаются. Попробуйте не импортировать данные, а присоединить таблицу Access 97, и через запрос на добавление передать данные в Access 2000. Если это не помогает, то надо сбросить данные в промежуточный файл (другого формата) и затем загрузить их в базу данных.
Вопрос 109 (29.11.2000). Я использую ODE Tools Wizard для Access 97. При включении в состав приложения Run Time, Setup Wizard выдает сообщение "No current record.", потом пустое окно сообщения со знаком "!" и завершает работу. Чего хочет эта штука я самостоятельно разобраться не смог.
  1.Сожмите базу данных путем импорта объектов.
  2. Возможно в вашем проекте, есть связанные таблицы. Скопируйте весь проект в другой каталог, а старую папку обязательно переименуйте. Попробуйте открыть в новом каталоге таблицы, если одна из них не открывается, то исправьте ошибку.
Вопрос 111 (01.12.2000). Здравствуйте! У меня вопрос. Есть три поля в таблице "Долг", ''Тариф'', ''К оплате". Как сделать чтобы записи полей "Долг" и "Тариф" суммировались, а результат записывался в поле "К оплате"? Очень буду благодарен, если получу ответ!(и если можно please по проще).
   Купите любую книгу по Access и прочтите ВНИМАТЕЛЬНО информацию по запросам на обновление данных. Я думаю, что у Вас все получится.
Вопрос 112 (04.12.2000). Существует несколько одинаковых по структуре форм (журналов) A,B,C... каждый из которых основан на своей таблице Ta,Tb,Tc. Каждая из этих форм связана с формой D (на таблице Td) по полю KOD. По нажатию кнопки в любой из них - открывается форма D. Как создать процедуру, которая бы по двойному щелчку в форме D возвращала бы значение D.KOD именно в ту форму из которой была вызвана? Вариант, типа IsLoaded(<Имя формы>) применяющийся по-моему в "Борее", проверяющий какая форма загружена, применять не хотелось бы,т.к. при добавлении новых форм связанных с той же Td нужно будет всегда менять код в форме D, а это очень неудобно.
 Отвечает Дмитрий Чернов
Решение 1.
В формах Ta, Tb и Tc в процедуре открытия формы D пишется следующее
DoCmd.OpenForm "D", acNormal, , , acFormAdd, acWindowNormal, Me.name
Forms("D").SetCallFormName = Me.name
'В форме в заголовке модуля описываем переменную sFormName и процедуру общения с ней SetCallFormName.
Private sCallFormName As String
Public Property Let SetCallFormName(fName As String)
   sFormName = fName
End Property
Решение 2.
Хотя можно и просто (без Property Let)
Public sCallFormName As String
А далее в событии DblClick или любом другом обращаемся к форме следующим образом:
Forms(sCallFormName).элемент_управления.свойство
Forms(sCallFormName).свойство
и т.д. У меня к примеру это выглядело так
Private Sub Form_Close()
Dim ctrl As Control
  If Len(sFormName) > 0 Then
    If Len(sCtrlName) > 0 Then
       DoCmd.SelectObject acForm, sFormName
       Set ctrl = Forms(sFormName).Controls(sCtrlName)
       ctrl.Requery
       ctrl.Value = Me!code.Value
    End If
  End If
End Sub
Вопрос 113 (04.12.2000). Я недавно стала изучать Access. У меня к Вам просьба. Никак не могу описать правильно переменные, чтобы сосчитать массу 1 м2, например, ниже нормы. Если не трудно то откликнитесь.
  Ответ. Для расчета массы используется формула [Масса] = [Плотность] * [Объем]. Напишите законченное решение для этой задачи. Если все получится, то далее усложните ее и введите новые поля.
Вопрос 114 (05.12.2000). Как средствами Access( или Outlook, или ещё какими то премудростями) можно в автоматическом режиме отправлять сообщения по адресам
электронной почты, которые являются полями в таблице Access.
 Данный вопрос уже встречался, поэтому на него будет дан ответ в следующей подписке N20 и обязательно приведен пример в файле mdb.
Вопрос 115 (05.12.2000). Интересует мнение (совет, практическая помощь) по следующему вопросу. Имеются dbf файлы упакованные(arj или zip) с паролем, при распаковке возможно получение нескольких dbf файлов(таблицы, их структура частично сходна). Название файлов изменяется, но не полностью. В названии 7 символов(первые две буквы одинаковы для всех файлов).Каким образом их "автоматом" можно присоединять к таблице в Access, при этом нужно добавить недостающие поля и внести в них нужные значения. Очень срочно!!!
  Вопрос о динамическом подключении dbf файлов рассматривался. Смотрите пример 1 в файле la_table.mdb
Вопрос 117 (06.12.2000). Читая Вашу публикация наткнулся на фразу: "...Если по логике Вашей программы необходимо использовать какую-нибудь функцию несколькими пользователями, то ее записывают в DLL библиотеку ..." Сам я пока не высоко летаю. Объясните, пожалуйста, как можно свои функции загонять в DLL, и как ими пользоваться.
   1 этап. Для этого пишите функцию в Access, отлаживаете ее и сохраняете в файле с расширением *.bas. Смотрите пункт Export File...
   2 этап. Теперь открываете Visual Basic (отдельная программа), создаете новый проект (dll библиотеку) и добавляете свой код. После компиляции проекта получите dll файл.
   3 этап. Размещаете библиотеку в системной директории Windows, там где больше всего dll файлов.
   4 этап. В Access декларируете (описываете) функцию и далее обращаетесь, как с обычной функцией. Смотрите примеры по обращению с такими функциями в файлах: la_form.mdb (для api интерфейса). Пример по теме в формате mdb дам позже.
Вопрос 118 (07.12.2000). Не так давно подписался на Вашу рассылку Access 2000 - программирование... В связи с чем у меня возник вопрос. Предположим, что есть база содержащая две таблицы - Товар и Клиент. Таблицы связаны отношением один-ко- многим. Одному наименованию товара соответствует несколько клиентов, купивших его. Почему в окне Схема Данных, куда таблицы были добавлены и объединены связью, со временем ( в частности после создания запросов) появляется третья таблица ( дубликат таблицы Товар). Эта таблица также объедена связью. Никаких проблем в работу базы эта ситуация не вносит. Удаление таблицы-дубликата ничего не меняет. После закрытия Схемы Данных и открытия его вновь таблица-дубликат появляется опять. Я не занимаюсь Accessом профессионально, но все же хотелось бы знать почему происходит подобное, чем это вызвано.
   Возможно у Вас остались связи в базе данных. Сжатие системы не помогает. Попробуйте создать пустую базу данных и импортировать в нее все элементы старой. Структура новой базы будет лучше, чем новой. Если поможет, то сообщите ответ.
Вопрос 120 (07.12.2000). Нам очень понравилась Ваша программа "Курсы валют", написанная на Access 2000. Не могли бы Вы прислать нам эту программу в формате Access 1997? Будем Вам очень признательны.
   Нельзя. Так как при переводе из Access 2000 в Access 97 возникают проблемы, которые можно решить только имея достаточно много свободного времени.
Вопрос 121 (07.12.2000). Я недавно начал изучать Access2000. В одной таблице есть поле с датами. Мне необходимо, чтобы в другой таблице в одноименном поле была возможность выбрать одну из дат в раскрывающемся списке. В конструкторе в подстановках данного поля (типа Date) нет вставки. Как это осуществить?
   В данной ситуации могу только посоветовать использовать другой тип поля, например, числовое. Добавьте в свойства поля форматы для ввода и отображения по типу Date. После этого Вы сможете назначить ему список.
Вопрос 122 (07.12.2000). Мне необходима срочная консультация по Access. Сообщите, пожалуйста, номер телефона в Москве, кто бы мог помочь.
   Я не знаю, чтобы кто-то консультировал бесплатно по телефону. Тут надо в совершенстве знать саму базу данных и иметь много свободного времени. Обязательно опубликую телефоны, если кто-то откликнется. Сам я не обучаю таким образом, т.к. являюсь консультантом одной производственной и 2x торгово-посреднических организаций на платной основе. 
Вопрос 123 (08.12.2000). Установил SQL Server 7.0,  настроил источник данных ODBC,  подключил таблицу в Access. Права на изменение и добавление данных у меня есть. Данные без проблем добавляются с помощью Visual Basic 6.0, с помощью программульки Sqlw. С помощью Access-овских запросов SQL к серверу тоже могу добавлять данные. Но не могу ни добавить ни изменить данные непосредственно в таблице, только
просмотр (использую тоже самое подключение ODBC). Что делать? Ведь данные проще изменять в форме, основанной на подключенной таблице.
   Вообще при подключении к внешним таблицам используются внутренние Access и внешние ODBC драйверы. Я бы поэкспериментировал с внутренними драйверами, но для этого надо знать точно тип базы данных, хранящийся на сервере.
Вопрос 123а (13.12.2000). Не могу скачать Лекции Access 2000 1.0
Вышлите, пожалуйста. С наезжающим 21 веком (теперь уж точно)
  Спасибо за поздравление, но 21 века ждать не надо. 
Вопрос 124 (13.12.2000). Хочу я открыть файл .mdb в Access. и вижу сообщение: "у вас нет прав доступа". Читал вашу статью в которой есть ссылка http://www.leadersoft.ru/ , но туда попасть не могу. Подскажите, как мне открыть мой файл, или где бы взять описание .mdb файлов.
  Никакой защиты на файлах нет. Так, что у Вас проблемы с настройками Office. Если его установить по умолчанию и на локальный компьютер, то Все заработает. 
Вопрос 125 (13.12.2000). Я не программист, но по роду своей работы столкнулся с необходимостью создания баз данных для ведения расчётов результатов хозяйственной деятельности на своём предприятии. Понимая, что эта задача сама по себе далеко не проста, для начала хотел бы освоить азы программирования. Посоветуйте где в сети можно найти литературу отвечающую моему уровню и потребностям.
Вопрос 126 (13.12.2000). Не подскажите где можно найти учебник по Аксесу в электронном виде о том как писать модули, примеры простых программ на VBA. Заранее благодарен за любой ответ.
  Учебник по Access, который бы решил все Ваши вопросы, Вы не найдете. Серьезный учебник может занимать более 1000 страниц, и никакой автор на его публикацию в Интернете открытых кодов не пойдет. Добавить к сказанному можно то, что через раздел "Ресурсы Access" Вы сможете выйти на сайт, предлагающий компьютерную литературу и заказать учебник по почте.
Вопрос 127 (13.12.2000). Я живу в Узбекистане, где литературы по программированию практически нет. Работаю в Access уже около полутора лет, все обучение происходит методом проб и ошибок. Сейчас занимаюсь разработкой программы "Склад", и столкнулся с проблемой, необходимо в отчете за месяц выводить остатки товара на конец прошлого месяца, создавать отдельную таблицу для хранения остатков, пробо��ал, но совсем запутался в своих программах. Может есть какой-то другой путь. И кроме этого, необходимо в конце года архивировать данные за прошедший год, очищать базу, сохранять остатки с прошлого года, и начинать новый год. Здесь вообще не знаю как подступиться к этой проблеме.
  1. Остатки по складу лучше формировать не в таблице, а через запрос SQL. В этом запросе Вам надо связать таблицы по справочникам и документам по складу. Этот же запрос можно использовать и в отчете.
  2. Вторая проблема, которую Вы рассматриваете очень сложная. Идеального совета нет. Попробуйте сначала научиться создавать файлы mdb файлы (см. лекции), далее хорошо изучите запросы на обновление, удаление и добавление. Обязательно составьте схему связей таблиц. После этого уже переходите к решению самой задачи.
Вопрос 128 (13.12.2000). Куда Вы подевались - нет не рассылок, нет сайта? Укажите, пожалуйста, адреса, м. б. новые!!!
   Временно частота выпусков уменьшена до 2 в месяц из-за недостатка свободного времени. Перебои в работе сайта: www.leadersoft.ru в последнее время связаны с Новой почтой. Я обращался к ним по данному вопросу, но они ничего сделать не могут. У них постоянно возникают перегрузки сервера. Иногда бывает, что нет ftp-доступа, а в другой раз страницы не открываются. Сейчас анализируется информация по данной проблеме. Возможен переход к другому провайдеру, но тогда об этом будет сообщение.
Вопрос. Разработайте, пожалуйста, мне программу ...
   Уважаемые господа, предприниматели, бизнесмены и просто случайные люди, читающие данный тест. Мы предлагаем Вам бесплатные услуги, но не работаем на халяву. Если Вы думаете, что разработка Access базы данных - это легкий и примитивный труд, то Вы сильно заблуждаетесь. Информация дается очень сложно, и короткий, в 10 строчек код, может разрабатываться сколько угодно долго, часы, дни и даже месяцы.  Единственно, чем сразу можно Вам помочь, так это разместить информацию о проблеме в конференции: www.leadersoft.ru. Ответ на вопрос дается только по истечении некоторого периода времени. Но если Вам срочно нужна новая программа, подробный ответ с написанием кода, то пишите разработчикам (смотрите Визитки), а также можете взять почтовые адреса из ответов в подписке. Могу гарантировать, что к Вам будут относиться более серьезно, если Вы напишите примерное письмо: "Уважаемый господин (...печатаете инициалы) Я посмотрел Вашу визитку (или решение). Предлагаемые Вами способы решения задач по Access,  мне понравились. Прошу дать ответ на следующий вопрос. У меня есть проблема, которая требует срочного разрешения (...даете полное описание) Если сможете, то решите ее, готов оплатить все расходы за консультацию и разработку программы. С уважением, (... печатаете имя, организацию и желательно должность)"

 

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

Loading