Рассылка статей | Выпуск 25. Ответы на вопросы
Leadersoft.ru

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

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

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

Выпуск 25. Ответы на вопросы



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

На вопросы отвечают: Макеев Игорь и Малютин Николай. Дополнительно на вопросы (182 и 183) предыдущего выпуска 25 ответили Анатолий Лящук и Михаил Белодед. Они опубликованы на сайте в архиве статей подписки.

Вопрос 203(30.01.2000) Подскажите, пожалуйста, можно ли пользоваться общим справочником с сервера, если на двух машинах стоит одна БД, как это сделать, есть ли пример?
   Ответ 1. Игорь В. Макеев Можно. Хелп - "Связанные таблицы"
   Ответ 2. Виктор Конюков. Как сделать диспетчер связанных таблиц написано в примере 18 файла la_form1.mdb
Вопрос 205(31.01.2000) У меня вот такой вопрос: как можно установить курсор активной записи при клике на ней или при переходе стрелками в форме, которая находится в режиме таблицы и источник записей - это запрос из связанных таблиц ?
Нужно передать значение конкретного поля активной записи (визуально активной) как параметр открытия другой формы.
   Ответ. Игорь В. Макеев Это можно сделать через "аргументыОткрытия" (OpenArgs)
DoCmd.OpenForm "Форма", , , , , , Me.Поле. При этом ссылка на поле формы - это как раз и есть ссылка на это поле активной записи.
Вопрос 207(31.01.2000) Со времен работы с DBED (это такой досовский редактор dbf файлов:) у меня  осталась ностальгия по моментальному переключению между табличным видом данных и "колоночной формой", т.е. вот табличный вид:
Фирма Телефон Факс Адрес Директор
ABC 00001 000011 Street1 John Smith
XYZ 00002 000022 Street2 Mary Kay
Ну и т.д.
Теперь я делаю скроллинг по этой таблице пока курсор не доходит до названия
фирмы XYZ, жму Enter и опа - получаю колоночную форму типа:
Фирма XYZ
Телефон 00002
Факс 000022
Адрес Street2
Директор Mary Kay
А как бы это столь же просто и быстро сделать в Access?? (т.е. скроллинг и
переключением между таблицей и колоночной формой с данными из той строки,
где был курсор при нажатии на Enter).
   Ответ. Малютин Николай Создайте копию формы  как простую форму, а из исходной открывайте вторую форму с передачей в качестве аргумента номера записи
Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
DoCmd.OpenForm "Форма1_1", acNormal, , , , , Me.CurrentRecord
Form_Форма1_1.SetFocus
Me.Visible = False
End If
Вопрос 209(01.02.2000) Не знаю точно правильно ли я поступаю, но хочу сделать так: есть таблица | дата | товар | кол-во | откуда | куда | необходимо динамически вычислять кол-во товара на складе - имя задается в combobox. добавил в таблицу еще одно поле кол-во1 с отрицательными значениями равными кол-во. сделал два запроса (т.к. в одном не получается) с группировкой и ф-ей SUM.

strSQLK = "SELECT Товар,Откуда, SUM(колво) AS всегоО " & _
"FROM проводки " & _
"GROUP BY Товар,Откуда " & _
"HAVING Откуда = '" & cboИнфо.Text & "' "

With rstКПроводки
Set .ActiveConnection = cnnSklad
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockReadOnly
.Source = strSQLK
.Open
End With

strSQLO = "SELECT Товар,Куда, SUM(колво1Î) AS всегоК " & _
"FROM проводки " & _
"GROUP BY Товар,Куда " & _
"HAVING Куда = '" & cboИнфо.Text & "' "

With rstОПроводки
Set .ActiveConnection = cnnSklad
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockReadOnly
.Source = strSQLO
.Open
End With

Теперь необходимо из первого вычитать второе и получать кол-во товара на складе. Но как это делать я не знаю. Хотелось чтобы все происходило динамически. Если знаете ответ буду очень благодарен. Если этот путь невозможен, то подскажите другой, но есть одно условие - должна быть возможность вводить проводки задним числом, потому и пытаюсь вести подсчет динамически.
    Ответ. Малютин Николай Начал изучать работу с Access примерно с такого же вопроса
Вопрос 217(06.02.2000) С какими максимальными размерами баз данных Вам приходилось сталкиваться? Есть ли какой-нибудь предел в размере БД после которого Аксесс может работать не корректно?
   Ответ. Игорь В. Макеев По документации MSA 97 1 Гб (2Гб - 2000) для одного mdb.
Вопрос 218(06.02.2000) Я считаю, что данные должны быть в одном файле а программа в другом. Сделав новую версию программы, я поменяю только файл программы. Что Вы думаете об этом способе.
   Ответ. Игорь В. Макеев Хороший и рекомендуемый способ.
Вопрос 221(06.02.2000) Недавно я написал программу для моего друга. Но она у него не пошла. Толком что произошло, он  объяснить не смог. (общаемся мы только по email) У него английский Windows и английский Access, у меня эти программы на русском.
Могла ли проблема быть в том, что у нас программы разноязычные? Все имена в моей программе я делал английскими буквами.
  Ответ. Конечно, в базе данных сохраняется информация по алфавиту. Для контроля Вы можете использовать пример из la_prot.mdb для просмотра бинарной структуры файла.
Вопрос 224(06.02.2000) Есть два запроса, которые отбирают из разных таблиц числовые поля. При указании сортировки в запросах по этим полям они сортируются как числовые. Мне необходимо объединить два запроса для вывода этих данных в списке, что я и сделал запросом на объединение. Но теперь числовое поле сортируется как текстовое. Как мне его отсортировать как числовое?
   Ответ 1. Игорь В. Макеев В принципе, такого быть не должно, но можно попробовать явно привести данные к нужному типу CLng, CDbl и т.п.
   Ответ 2. Толмачева Галина. Если при объединении двух (или нескольких) запросов явно не перечислять поля, а указывать выбор всех полей (SELECT * FROM таблица), то в объединяемых запросах порядок следования полей должен быть одинаковым. Если порядок нарушен, то происходит объединение разных полей, и если одно из них символьное, то и результат получим символьный. По самим данным это не сразу видно, т.к. скорее всего в данных символьного поля были цифры.
Вопрос 226(06.02.2000) Большое количество кнопок в ленточной форме не только загромождает ее, но и нередко приводит к ошибкам пользователей. Прекрасным выходом был бы перенос всех кнопок в меню, вызываемое нажатием правой кнопки мышки, но я не знаю, существует ли такая возможность в Access (у меня Access97). Не могли бы Вы подсказать, реализуема ли подобная идея, и если да, то как.
   Ответ. Игорь В. Макеев Help "Контекстное меню", CommandBarControl
Вопрос 228(07.02.2000) В Ассеss 2.0 был макрос Autokey, в Help'е к Ассеss 2000 написано, что для этих целей теперь надо применять "обработку событий по типам объектов", но пример не написан. Огромная просьба написать пример обработки события "нажатие клавиши", например "1". Чтобы, к примеру, по нажатию "1" печаталась текущая форма.
   Ответ. Игорь В. Макеев Private Sub Form_KeyPress(KeyAscii As Integer)
 On Error Resume Next
 If KeyAscii = 49 Then DoCmd.PrintOut acPrintAll: KeyAscii = 0
End Sub
Только свойство формы «Перехват нажатия клавиш» (KeyPreview) надо в True установить
Вопрос 237(14.02.2000) Сейчас у меня появились проблемы с Access~ом, хочу спросить Вашего совета, как специалиста, что мне делать, а то я уже вторую неделю не могу спокойно работать. Программа постоянна сбоит, т. е. возникает какая-то критическая ошибка в результате которой ее приходится закрывать. Один раз мне удалось решить эту проблемы, я изменил в одном месте цепочку подчинений в форме и после
этого все заработало. Но на этом проблемы не закончились. По мере развития базы данных все равно опять время от времени сбоило.  Началось с того, что мне при нажатии Alt-F4 мне было не закрыть само окно программы, закрывалась только база данных. (Это было только с последней версией базы.) Сам же Access после этого было не закрыть ни какими силами,
 только через Ctrl-Alt-Del через снятие задачи. (Что бы это значило?) При более ранних версиях все закрывалось нормально. Короче, все кончилось все тем, что при открытии одной из форм мой Norton Crash Guard сразу же сообщает о сбое и предлагает сейвится, чего вообще по моим понятиям при нормальной программе быть не может, в любом случае форма должна открываться. Пробовал я перегнать все элементы базы данных в новый файл, таблицы и запросы перегнал, как только пробую перегонять формы, опять фатальная ошибка, Access сообщает что не хватает памяти, в общем работать нельзя.    Другие же программы вроде бы работают нормально. Скажите мне пожалуйста, этот Access 97 априори такой глючный,
или тут дело в моей системе или чем-то другом. Еще, скажите? пожалуйста, если база данных в принципе читается, то обязательно ли это означает, что на нормальной системе с ней можно будет работать, или может быть, что файл все равно испорчен. И можно ли избавится от
этих проблем, если перейти на Access 2000.
   Ответ 1. Игорь В. Макеев По поводу критических ошибок: поставить все SP, попробовать другой дистрибутив, пересоздать базу. По поводу невыхода: проверить закрытие и уничтожение всех объектов. Для логических полей использовать явное сравнение с True (False), т.е. If Me.chkBox = True then ... Для групп переключателей использовать Value. А иногда достаточно просто пересоздать базу.
  Ответ 2. Stanislaw Girman Если можно, дополнение к ответу мастера: У меня тоже был такой глюк давно, еще когда я был "меньше ростом". Действительно, для начала нужно прочитать книгу Алена Голуба про "Веревку достаточной длины, чтобы выстрелить себе в ногу ...", а также посмотреть какие требования к программисту ;-) появились в VB7(ака vb.net). И, самое главное, помогло исправление всех меток в кодах модулей класса форм на уникальные (да и в остальных всяческих модулях тоже). Не секрет, что все используют метки для безусловных переходов, особенно при обработке ошибок. Так вот, если эти метки в разных процедурах будут одинаковыми, то, вроде казалось бы, ничего страшного - компиллер будет "прыгать" по ним нормально на уровне процедур, но все-таки, поверьте, так делать не стоит !!!! Как только я все это исправил, база перестала без разрешения отваливаться и Dr.Watson навсегда забыл про Access.
  Ответ 3. Alexander Tumarov Я бы в добавок к написанному посоветовал бы проверить использование ActiveX элементов. В особенности от так называемых Third-party производителей. Многие пользователи создают такие элементы только на время жизни формы, и естественно при закрытии оной элемент должен быть уничтожен. Если элемент содержит ошибку то вполне возможна описанная в вопросе ситуация. При подобной проблеме перенос на Access 2000 проблемы не решит.
Вопрос 239(15.02.2000) Уважаемые профессионалы! Посоветуйте Чайнику - в FOXе есть оператор Set Carry to (перенос значения из поля предыдущей записи в такое же поле текущей, коротко так называемое поле повторения). Однако, в VBA этого в упор не  вижу (может это бревно в глазу...)
   Ответ 1. Игорь В. Макеев  В VBA этого нет.
   Ответ 2. Малютин Николай Самый простой способ - воспользоваться сочетаниями клавиш: Ctrl + '  (одинарная кавычка) - вставка в текущее поле значения из аналогичного поля предыдущей записи Ctrl+ " (двойная кавычка) - тоже самое. И использовать SendKeys
Все бы хорошо, но в программе это корректно работает с "английской" раскладкой, поэтому
придется усложнить. Пример применения:
' функция возвращает состояние текущей раскладки клавиатуры
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias
"GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
' функция устанавливает нужную раскладку
Private Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As
Long, ByVal flags As Long) As Long
' функция устанавливает нужную раскладку

Private Sub Form_Current()
Me.ID.SetFocus
End Sub

Private Sub ID_LostFocus()
If Me.ID.Text = "" Then Call PastePrev
End Sub

Private Sub PastePrev()
Dim strTemp As String
strTemp = String(9, 0)
GetKeyboardLayoutName (strTemp)
If InStr(strTemp, "409") = 0 Then
ActivateKeyboardLayout 1, 0    ' если раскладка не английская, то меняем на следующую
SendKeys "^'", True ' именно код клавиши <Ctrl> - "^" не позволяет напрямую использовать сочетание клавиш при вызове SendKeys  при русской раскладке
ActivateKeyboardLayout 1, 0    ' и восстанавливаем состояние раскладки (естественно, это корректно, если на машине установлены две раскладки - RUS и EN)
Else
SendKeys "^'", True
End If
Вопрос 241(16.02.2000) Не подскажете как программировать поле со списком из VBA. Например,
Select Case Primer ' Поле в форме
Case 1 ' Условие в поле формы
Ниспадающий список в соответствием с условием 1
Case 2
Ниспадающий список в соответствием с условием 2
Case 3
Ниспадающий список в соответствием с условием 3
End select
Ответ. Код поместите в событие списка Вход (Enter)
Private Sub ПолеСоСписком57_Enter()
   Select Case Primer ' Поле в форме
     Case 1 ' Условие в поле формы
         Me.ПолеСоСписком57.RowSource = "SELECT * FROM [Таблица1] WHERE [Primer]=" & Primer
     Case 2
         Me.ПолеСоСписком57.RowSource = "SELECT * FROM [Таблица1]"
     End select
End Sub
Вопрос 243(22.02.2000)   Существует ли программа, которая конвертит mdb файл в какой-нибудь обычный формат? А то есть файл .mdb, а ставить MSAccess ради того, чтобы прочитать этот файл не очень хочется.
   Ответ 1. Есть конвертор, который преобразует файл mdb в  файлы Visual Basic. Правда для серьезных баз данных это сделать не удастся. Связано это с тем, что базы данных имеют сложную структуру и для их корректной работы требуется специальная среда, включающая много dll-библиотек и других файлов. Например, для Delphi необходимо ставить BDE, для Access Jet, MSDE, IIS (Internet Information Sever для доступа из Интернета) и т.д. и т.п.
   Ответ 2. Ссылка: http://google.yahoo.com/bin/query?p=accesstovb&hc=0&hs=1
Вопрос 244(22.02.2000)   Как  в  запросе  в Between задать "с начала текущего месяца"? Юзер. Access-2000. Windows98
   Ответ. Надо использовать функции Date, DateSerial и американский формат. Например так, WHERE ([Дата] Between DateSerial(Year(Date()),Month(Date()),1) And #2/20/2005#). Пример вставлен в файл: la_query.mdb
Вопрос 245(22.02.2000)   Скажите как можно получить архивы всех FAQ и статей опубликованных на liac.
   Ответ. Сейчас нет такой возможности считать весь архив вопросов и статей без загрузки всего сайта, но база данных по ним обязательно будет сделана.
Вопрос 246(22.02.2000)   Еще, если Вас не затруднит, скажите пару слов, чем Access 2000 лучше в плане разработки приложения Access 97, и какие наиболее существенные полезные возможности там добавились. А то я не знаю, имеет ли смысл переходить на новую версию и какие преимущества это может дать.
  Ответ. Все функции перечислить сложно, но кое-что вспомнить можно: 
  1. DB. Увеличилась надежность базы данных по сравнению с Access 97.
  2. DB. Ядро Jet теперь можно заменить на MSDE (SQL Server). Удобно в плане перехода на SQL сервер.
  3. DB. Возможно сохранить базу данных в предыдущем формате (Access 97) при разумном проектировании.
  4. DB. Появилась опция автоматического сжатия базы данных при закрытии.
  5. DB. Можно отпечатать схему связей таблиц базы данных.
  6. DB. Ядро базы данных Jet хранит данные в формате Unicode.
  7. DB. База данных тесно интегрирована с ActiveX Data Objects (ADO), хотя и DAO работает отлично.
  8. DB. Используя функцию AutoCorrect можно изменить объект (поле) во всех формах, отчетах и запросах.
  7. VBA. Собственный локализованный редактор программных модулей заменен на VBA 6.
  9. VBA. Введены новые функции: StrRev(реверс строки), Split (разбор строки) и др.
  10. Формы. Добавлены правила условного форматирования для полей.
  11. Internet. Добавлены страницы доступа к данным.
  12. Internet. Активно используется язык XML (eXtensible Markup Language)
Вопрос 250(26.02.2000)     Ребята  у  вас  еся  зеркало  сайта,  а то у меня что-то загрузка идет оччччень туговато! :-(  если нет то могу предоставить место.
Вопрос 251(26.02.2000)   Как долго на сервере leadersoft.ru будут технические проблемы. Нет ли у Вашего сайта зеркала. Нельзя ли по почте получить бесплатные примеры форм, отчетов, программ и т.д.
Вопрос 253(26.02.2000)   Мне очень понравился Ваш сайт и то, какие базы Вы делаете. Однако я уже третий день не могу скачать бесплатные коды на ACCESS 2000. Все время пишется, что файл не доступен из-за загруженности сервера. Почему, он все время загружен? И когда мне можно будет скачать эти примеры?
   Ответ 1. Спасибо за помощь.
   Ответ 2. У сайта появился новый адрес: www.leadersoft.ru. Попробуйте скачать оттуда.
   Ответ 3. Проблемы загрузки файлов с сайта www.leadersoft.ru решить может только провайдер, а именно, компания ORC. Она ведет новый проект - newmail.ru (nm.ru). Настроить качественно работу newmail они не могут. Обращался неоднократно службу технической поддержки. Я так понимаю, что это новый интернет-бизнес (им также занимается сайт boom.ru). Цель бизнеса - раскрутить сайт и получить прибыль из рекламы на основном сайте или "заставить" владельцев ресурсов из-за технических проблем перейти на платный хостинг.
   Ответ 4. Несколько слов о хостинге у нас в России и за рубежом. Возможно эта информация Вам пригодиться для открытия своего бизнеса в Интернете. Найти лучший бесплатный хостинг в Рунете невозможно. Интересных предложений много, но ответственности ни какой. Зарегистрировать свой домен можно даже не имея паспорта, нужна только доверенность от мамы. Сам лично слышал, как консультировали по такой проблеме в РосНИИРОС.
   С другой стороны, на англоязычных сайтах есть интересные и бесплатные ресурсы. Например, bigfoot.com. За все время использования я получил только два предупреждения от них. Первое сообщение о том, что они установили в декабре 2000 новую антиспамерскую защиту (возможны проблемы доставки писем), а также сообщение по поводу вируса "LOVE BUG" (обратили внимание на то, что он рассылается через Microsoft Outlook).
   Конечно, рано или поздно Вас заинтересует возможность размещать свои Access базы данных в Интернете, чтобы оттуда можно было брать информацию. Для этого надо найти NT-хостинг. Связано это с тем, что для работы с mdb файлом и управлением ASP страницами требуется установить IIS сервер. Интересное предложение предлагает: www.readyhosting.com за 99$ в год. Вот оно: • 500MB Web Space, • Free New Domain Registration, • Unmetered Data Transfer, • Unlimited Email, • Unlimited Email Aliases, • Unlimited Autoresponders, • Web-Based Email, • Toll-Free Technical Support, • 24 Hour FTP Access, • 99.9% Uptime Guarantee, • 30 Day Money-Back Guarantee, • ASP Support, • Live Statistics, • FrontPage 2000 Extensions, • Cold Fusion 4.5, • Database Access, • CGI/Perl, • ASP Mail Component, • ASPEmail Component, • DevMailer Component, • Instant Setup!, • Password Protected Directories, • Daily Backups, • Custom 404 Error Page, • Server Side Includes (.stm, .shtm, .shtml), • RealAudio/Video, • PHP Server Extensions, • SSL Security, • E-commerce Shopping Cart by Cart32.com, • Control Panel, • SQL Server 2000, • ASP Simple Upload Component
   На 1 сервере они размещают не более 250 сайтов. Правда некоторые вещи мне не понравились. Например, то что нельзя будет хранить архивы программ или mp3 файлов. Но лучше сами прочтите FAQ сайта или напишите им письмо.
Вопрос 252(26.02.2000)   Мне необходимо заархивировать резервную копию базы данных. Для этого я использую функцию shell, но эта функция запускает программу в другом процессе. Значит я не могу (или не знаю как) отследить завершение процесса архивации, т.е. shell запустил программу rar.exe она начала архивировать файл, а моя собственная программа выполняется дальше. Хотя мне необходимо дождаться, когда же завершится процесс архивации и на жестком диске появится файл архива. Как решить эту проблему? Вообще есть ли другие функции для запуска программ из VBA?
  Ответ 1. Организуйте замкнутый цикл и проверяйте в нем наличие файла. Для корректной работы и выхода из программы добавьте DoEvents, тогда можно принудительно выйти из цикла по нажатию кнопки. Пример,
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
Do While Not fs.FileExists("a.zip")
DoEvents
Loop
  Ответ 2. Малютин Николай. Пример решения этой задачи ��утем создания процесса описан на http://am.rusimport.ru/MsAccess/
  Ответ 3. Игорь Лебедев
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As
Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As
Long, lpExitCode As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long

Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const STILL_ACTIVE = &H103

Public Sub Execute(ByVal ExecStr As String)
    Dim ProcessID As Long
    Dim ProcessHandle As Long
    Dim ProcessExitCode As Long

    ProcessID = Shell(ExecStr, vbMinimizedNoFocus)
    ' ожидаем завершения процесса
    ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID)
    If ProcessHandle <> 0 Then
        Do
            Call GetExitCodeProcess(ProcessHandle, ProcessExitCode)
            If ProcessExitCode <> STILL_ACTIVE Then
                Exit Do
            End If
            DoEvents
        Loop
        Call CloseHandle(ProcessHandle)
    End If
End Sub
Вопрос 254(26.02.2000) Нельзя ли поподробнее рассказать о процессе защиты программы в РосАПО.
   Ответ. РосАПО - это Российское агентство по правовой охране программ для ЭВМ, баз данных и топологий интегральных схем. Текущее название организации: Роспатент. Телефон +007-095-240-6354 (47-27 местный). Адрес. Бережковская набережная, д.25, стр. 1/А (проезд м. Киевская, тр. 17,34, авт. 91, 119 ~ 4 остановка "Библиотека"). Для грамотной регистрации программы желательно приобрести брошюру (Информационный бюллетень официальной регистрации), в которой дано полное описание законов и процесса регистрации. Для регистрации программы Вам потребуется:
   a) Заявление. На специальном бланке (форма РП) Вам нужно впечатать название программы, имя заявителя и другие сведения.
   б) Депонирующие материалы. Сюда входит реферат (название программы, имя заявителя, дата создания, назначение, технические характеристики, язык программирования, тип ЭВМ ), а также исходный текст программы (25 первых и 25 последних страниц). Оформление страниц: • формат бумаги A4, • черный текст, • поля: слева 20, сверху 17, далее по 7 мм. При желании можно добавить рисунки для идентификации форм.
   в) Пошлина. Стандартная регистрация длится 2 месяца и стоит 320 рублей для юридических лиц и 130 рублей для частных лиц. Вы можете ускорить регистрацию, если дополнительно внесете 1000 рублей (процедура регистрации длится всего 1 месяц), а если 2000 рублей - то все сделают за 5 дней. Оплата осуществляется через банк, который находится рядом с Роспатентом.
  P.S. Конечно, найти в базе данных начало и конец Вашей программы будет сложно, поэтому даю маленький совет, лучше берите код от каждой формы и модуля и удаляйте комментарии.

 

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

Loading