СообЧа > База Знаний > Базы данных > MS Access

Вопрос

На машине стоял MSOffice 2000. Понадобилось удалить его и поставить MSOffice 97. После этого Access 97 выдает сообщение «Отсутствует лицензия на использование MS Access на этом компьютере» и закрывается. При этом Word и Exel работают.

Ответ

Пропишите в реестре следующее:

[HKEY_CLASSES_ROOT\Licenses\ 8CC49940-3146-11CF-97A1-00AA00424A9F\Retail]

@=''yubcdcprktpjtapmmfdacmupasbhscddncgp''

A.F.

Вопрос

Имеется таблица с полями: приход/расход; наименование; количество; цена.
Как сформировать запрос, отображающий:
наименование; мин. цена прихода; макс. цена прихода; мин. цена расхода; макс. цена расхода?

Ответ

Одним запросом вряд ли удастся, так как у тебя и приход, и расход в одной колонке, но с разными знаками, насколько я понял. Разобьем на два запроса.
Примерно так:

(Запрос1):
SELECT (наименование), (приход/расход) as приход1, (приход/расход) as приход2, приход/расход) as расход1, приход/расход) as расход2,
FROM table
WHERE приход1>0, приход2>0, расход1<0, расход2<0

(Запрос2):
SELECT (наименование), min(приход1), max(приход2), min(расход1), max(расход2) FROM (Запрос1)
GROUP BY (наименование)


Запрос1 должен быть сохраненным
Запрос2 Можно генерить прямо из кода.

Из конференции Expert_FAQ

Вопрос

Для чего нужен Код (понял, что-то типа пароля) при создании группы? Ведь он не может нигде использоваться! Его вводить никуда не надо.

Ответ

Вообще весь принцип защиты базы построен на PID коде группы и пользователя. Поэтому если даже создать группу с именем «НАШ ЗАЩИЩЕННЫЙ ФАЙЛ РАБОЧЕЙ ГРУППЫ», но не указать PID код, то доступ к базе получить невозможно.

А насчет нигде не используется — так это просто потому, что его использование просто скрыто от пользователя. Нужен он потому, что «ничто не вечно под луной» и системы иногда «летят», так вот для того, чтобы восстановить работоспособность системы, нужно создать новый файл рабочей группы с PID кодом старой — и в ней восстановить всех пользователей.

Сергей

Вопрос

Есть база на аксесе 2000, в которой есть таблица oper и поля с типом «дата/время», формат — краткая дата.
На Delphi через АДО при помощи компонета ADOQuery осуществляем запрос

Select *
From oper
where oper.date_v='29.08.2002'


в результате чего получаем сообщение об ошибке «Data type mismatch in criteria expression».
Если в условии запроса даты нет, то все работает нормально.

Ответ

Заключите дату в символы #: #29.08.2002#
В Access-овском SQL дата заключается в #

Vladimir

Иногда еще ему требуется не #29.08.2002#, а #29/08/2002#

vitaly

Вопрос

Стандартные кнопки по переходам по записям не устраивают. Создал свои. Отобразил Количество записей. И текущую тоже в Поле Current. Но вот только незадача. Текущая — НЕРЕДАКТИРУЕМАЯ. И в ней поэтому нельзя ввести число (которое нужно для быстрого перехода). Вопрос как можно это исправить?
Прописываю это в поле Данные/ПолеCurrent как = CurrentRecord

Ответ

А вот последнее — как раз лишнее.
Поле должно быть свободным, а вставлять значение нужно в модуле (событие Form_Current), ну и навесить процедуру на событие поля BeforeUpdate (переходить к нужной записи).

Alex

Вопрос

Проблема в том, что в течении дня Access должен запускаться несколько раз и каждый раз с разным макросом. (макрос с именем autoexec поэтому не подходит). Есть ли возможность (а если есть, то прошу пример), при запуске Access'a указать имя макроса, который необходимо запустить?

Сейчас решаю проблему с помощью AutoIt (программа, эмулирующая нажатия кнопок на клавиатуре и перемещение мыши), но она работает неустойчиво.

Ответ

Если в ярлыке, а именно
"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" (этот ярлык нужно создать), после кавычек поставить пробел и написать:

"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE"
C:\www\ddd.mdb /Xqqq

www — Путь к твоей базе — Английскими буквами
ddd — Название базы — Английскими буквами
qqq — Название макроса — Английскими буквами

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

Из конференции Expert_FAQ

Вопрос

Есть база по клиентам, которым я хочу отсылать письма по e-mail. Создаю для этих целей в таблице поле, выбираю тип «гиперссылка» и вношу туда адреса (например, ivan@durak.ru). Но в форме при щелчке по полю с адресом выдается ошибка, что, мол, http://ivan@durak.ru неправильная ссылка. Строка mailto:ivan@durak.ru работает, но … базой я пользуюсь не один и мне трудно будет объяснить всем пользователям, почему нужно вносить адрес в таком виде. Как можно выйти из моей ситуации?

Ответ

Тут я вижу два пути решения (может, их и больше, но это надо думать…:-)
1. Посадить mailto: в поле как значение по умолчанию, тогда пользователь будет только дописывать нужный адрес.
2. Изменить принцип ввода информации: вводить не в таблицу(сетку), а с помощью отдельной формы, в которой mailto: будет пристегиваться к адресу, скажем, в процедуре AfterUpdate- tbMail.Text = «mailto:» & tbMail.Text

Анатолий

Вопрос

Я сделал регистрацию входа в базу (фиксируется юзер, время входа и выхода). Все это пишу в отдельную таблицу, которую с интересом просматриваю. Но процедуры регистрации привязаны к открытию/закрытию формы, открываемой по умолчанию. А ведь всегда найдется «прошаренный юзер», который откроет базу, удерживая shift. При этом в моей таблице доступа ничего не запишется. Как же зарегистрировать все открытия базы?

Ответ

Если из другой базы запустить вот такую процедуру:
Sub AllShiftsOut()
Dim mdb As Database, prp As Property, app As New
Access.Application
app.OpenCurrentDatabase
"C:\Databases\Private\K31.mdb"
Set mdb = app.CurrentDb
Set prp = mdb.CreateProperty("AllowBypassKey", dbBoolean, False)
mdb.Properties.Append prp
app.CloseCurrentDatabase
Set prp = Nothing
Set mdb = Nothing
Set app = Nothing
End Sub

…то попробуйте-ка потом открыть указанную в 3-ей строчке базу с shift'ом… На всякий случай рекомендую потренироваться с копией, а когда надоест, проделать ChangeProperty на True

Alex

Вопрос

Вопрос — как в MS Access97 сделать недоступной кнопку закрытия приложения (собственно Access-а), чтобы сделать для пользователя закрытие базы данных только специальной кнопкой?

Ответ

В форме делаешь 2 кнопки, вод код для них:

(где Click14 и click15 название кнопки)

Private Sub Click14_Click()
InitApplication_No
' функция скрытия кнопки закрытия окна
Access End Sub
Private Sub click15_Click()
InitApplication_Yes
' функция показа кнопки закрытия окна
Access End Sub
Function InitApplication_No()
On Error GoTo er Dim c As CloseCommand Set
c = New CloseCommand c.Enabled = False
'передача значения модулю класса "CloseCommand"
Exit Function er: MsgBox "Error 0" & Err.Number & " " & Err.Description, vbCritical, "Внимание"
End Function Function
InitApplication_Yes()
On Error GoTo er Dim c As CloseCommand Set
c = New CloseCommand c.Enabled = True
'передача значения модулю класса "CloseCommand"
Exit Function er: MsgBox "Error 0" & Err.Number & " " & Err.Description, vbCritical, "Внимание"
End Function


Потом создаешь не просто МОДУЛЬ (Module), а КЛАСС МОДУЛЬ (Class Module) с названием CloseCommand и вставляешь этот код: (на панели управления есть иконка сохранить «дискетка» перед ней есть иконка «модуль» и маленькая стрелочка, жми на ее и выбери Class Module)

Option Compare Database
Option Explicit Private
Declare Function
GetSystemMenu Lib "user32"
(ByVal hWnd As Long, _ ByVal bRevert As Long)
As Long Private Declare Function EnableMenuItem Lib "user32"
(ByVal hMenu As _ Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long)
As Long Private Declare Function GetMenuItemInfo Lib "user32"
Alias _ "GetMenuItemInfoA"
(ByVal hMenu As Long, ByVal un As Long, ByVal b As _ Long, lpMenuItemInfo As MENUITEMINFO)
As Long Private Type MENUITEMINFO cbSize
As Long fMask
As Long fType
As Long fState
As Long wID
As Long hSubMenu
As Long hbmpChecked
As Long hbmpUnchecked
As Long dwItemDdwItemData
As Long dwTypeData
As String cch
As Long End Type Const MF_GRAYED = &H1&
Const MF_BYCOMMAND = &H0&
Const SC_CLOSE = &HF060& Public Property Get Enabled()
As Boolean Dim hWnd
As Long Dim hMenu
As Long Dim result
As Long Dim MI
As MENUITEMINFO MI.cbSize = Len(MI)
MI.dwTypeData = String(80, 0)
MI.cch = Len(MI.dwTypeData)
MI.fMask = MF_GRAYED
MI.wID = SC_CLOSE
hWnd = Application.hWndAccessApp
hMenu = GetSystemMenu(hWnd, 0)
result = GetMenuItemInfo(hMenu, MI.wID, 0, MI)
Enabled = (MI.fState And
MF_GRAYED) = 0
End
Property Public
Property Let
Enabled(boolClose As Boolean) Dim hWnd
As Long Dim wFlags
As Long Dim hMenu
As Long Dim result
As Long
hWnd = Application.hWndAccessApp
hMenu = GetSystemMenu(hWnd, 0)
If Not boolClose Then
wFlags = MF_BYCOMMAND Or MF_GRAYED Else
wFlags = MF_BYCOMMAND And Not MF_GRAYED
End
If result = EnableMenuItem(hMenu, SC_CLOSE, wFlags)
End Property


При нажатии в форме на 1 кнопку (которую создали) — X становится не доступным, при нажатии на 2 кнопку — X работает. Не забудь поставить в обоих кнопках в разделе события, в строке нажатие кнопки вот это — [Процедура обработки событий]

Из конференции Expert_FAQ

Вопрос

Есть база данных сотрудников, как мне ежедневно узнавать, к примеру, день рождения, не создавая каждый раз новый запрос.

Ответ

Нетрудно :

SELECT table.поле_дня_варенья FROM table WHERE
(((table.поле_дня_варенья)=Date()));

а там хоть форму создавай на этом запросе, хоть при старте базы открывай, если есть записи.

Николай

Вопрос

Как из среды Access запустиь файл *.chm? У меня получилось только через bat'ник.

Ответ

Через редактор VBA. На сколько я помню, там процедура есть такая Shell. Посмотри про нее в справке, синтаксис у нее не сложный.

Из конференции Expert_FAQ

Вопрос

Мне необходимо в базе из формы печатать отчет, но только страницу, номер которой равен номеру записи, на которой я нахожусь в форме для добавления.

Ответ

Создай запрос, точную копию таблицы, в форме в место таблицы поставь этот запрос. (открываешь форму в режиме конструктор, ничего не трогая жмешь на панели управления кнопку «Свойства» потом вкладка «Данные». В источнике записи выбираешь этот запрос.) Точно также и в отчете.

Из конференции Expert_FAQ

Вопрос

Имеется БД на Clipper в DOSе с его же (Clipper) индексными файлами и таблицами формата DBASE 5. Необходимо обрабатывать эту БД в сетевом многопользовательском режиме например в ACCESS 97. Как это сделать? Решение проблемы в «лоб», т.е. присоединением таблиц без использования индексов т.к. ACCESS 97 не поддерживает индексные файлы Clipper формата, результата не дали, Многопользовательского доступа не получилось, хотя соответствующий флажок в свойствах присоединенной таблицы был проставлен, а так же нет возможности обновлять индексы.

Ответ

В принципе, можно и на Clippere в DOSе обрабатывать эту БД в сетевом многопользовательском режиме. Проблема, наверное, в том, если я правильно понял, что вы хотите перейти из DOSa в Win. Попробуйте посмотреть www.hotsoft.ru, http://spravki.main.ru/clipper/ca-clipper.htm
может, что подойдет. Если нет, Visual Fox все же ближе, чем ACCESS 97, хотя структура индексного файла, конечно? разная.

Gorbusha

Вопрос

Меня интересует следующий вопрос: можно ли сделать так, чтобы при запуске файла базы сразу запускалась входящая в нее форма, а при завершении работы с формой — файл закрывался?

Ответ

Можно!

В параметрах запуска базы ставишь имя формы и она автоматически будет открываться.

На событие закрытия формы вешаешь такую строку

Private Sub Form_Close()
Application.Quit
End Sub

Из конференции Expert_FAQ

Вопрос

Есть главная форма F1, подчиненная форма F2 и вызываемая форма с ActiveX Calendar. Задача-ввод числа в поле с курсором формы F2. Кто подскажет подробно как прописать путь к подчиненной форме

Ответ

Да очень просто — путь пишется [главная форма]![подчиненная форма]![имя поля]

Из конференции Expert_FAQ

Вопрос

Подскажите пожалуйста, как реализовать поиск по базе данных через форму. Т.е. есть таблица, там есть улица, дом, корпус, квартира и т.д. и есть форма, где есть соответствующие поля, как сделать так, чтобы можно было искать по нескольким параметрам, например, по квартире и дому. Запросом не получается.

Ответ

Обычно это делается через фильтры или SQL запросы, что суть одно и тоже.

В этом случае Вам нужно создать форму(или поля), где вы будете задавать критерии для будущего фильтра (запроса). Причем можно использовать маски ("ул. Ленин*" и т.д.) Далее по имеющимся значением полей фильтруем нужную форму, или открываем эту форму на запросе примерно такого вида:

SELECT Таблица.улица, Таблица.дом, Таблица.район

FROM Таблица

WHERE ((([Таблица].[улица]) Like [forms]![УсловияОтбора].[улица]) AND

(([Таблица].[дом]) Like [forms]![УсловияОтбора].[дом]));

В нужной форме остануться только отфильтрованные записи. Фильтр работает во много раз быстрее чем стандартный поиск. Особенно при большом количестве записей. (У меня в таблице ~250000 записей. Стандартным поиском пользоваться невозможно)

Из конференции Expert_FAQ

Вопрос

Подскажите, с помощью 97 аксеса отправить e-mail на smtp сервер или хотя бы как передавать команды smtp серверу. Если несложно, приведите пример.

Ответ

Нужно использовать контрол WINSCK.OCX (как в VB) присоединяемся к серверу:

winsock1.connect "SMTP-СЕРВЕР","ПОРТ-SMTP-СЕРВЕРА"
doevents
if winsock1.state=sckconnected then

отсылать команды следует таким образом:
winsock1.senddata "КОМАНДА1"
endif

получение данных с сервера осуществляется в Sub'е:
Private sub winsock1_dataarrival( … )
dim str as string
winsock1.getdata str
str — полученный ответ от сервера
end sub

Из конференции Expert_FAQ

Вопрос

У меня вопрос по созданию запроса в Access.
Предположим есть БД с таблицей tblName:

поля: ИМЯ ФАМИЛИЯ
записи: Иван Иванов, Иван Петров, Петр Иванов.
Необходимо создать запрос типа: SELECT * FROM tblName WHERE имя=[введите имя].

Как сделать, чтобы пользователь не вводил параметр запроса (имя), а выбрал бы из списка имеющихся?

Ответ

Создай служебный группировочный запрос, в котором будет только одно поле — «Имя». Именно группировочный, чтобы, например, «Иван» не повторялось несколько раз.

Этот группировочный запрос сделай источником записей для ниспадающего списка в форме (назовем ее «Выбор_критериев»). А сей элемент формы пусть называется «ниспадающий_список_имен».

В этой же форме повесь кнопку которая запускает твой запрос (с помощью Мастера кнопок). Запрос надо будет маленько изменить (см. ниже), чтобы он брал значение из этого ниспадающего списка.

SELECT * FROM tblName WHERE
имя=[Forms]![Выбор_критериев]![ниспадающий_список_имен]

Вопрос

Меня интересует следующий вопрос: Мне необходимо написать макрос или каким—либо другим способом сделать так, чтобы за какое—то время (неделя, к примеру) до наступления определенной даты (хранящейся в поле таблицы), выдавалось сообщение. Причем чтобы просматривались все строки таблицы, и строки с удовлетворяющими этому условию датами добавлялись в список.

Может быть, у вас есть какие — либо образцы макросов или советы, как это сделать?

Ответ

Я сделал так.

Создал свойство базы типа дата и в него занес дату, когда должен запускаться обработчик.

При каждом открытии я проверяю дата сегодня не больше внесенной в свойство. Если равна или больше (типа запускать надо было вчера, а это воскресенье либо не работали с базой), то запускается обработчик

1. Рассчитываешь след дату запуска.
2. Выполняешь все что тебе нужно (собственно твой алгоритм)
3. Если обработка прошла успешно то записываешь в свойство дату след. запуска (см. п.1)

Все

Р.S. Если Дата храниться в таблице то алгоритм тот же, но в начале у меня было так, но не понравилось так, как нужно было делать несколько подобных обработок на разные даты и по разным алгоритмам потом таки я опять перешел к таблице, но там все слишком сложно и запущено .

Из конференции Expert_FAQ

Вопрос

Как создать connection к базе данных, не прописанной в SystemDSN?

Ответ

Если это БД MS Access, то вот так:

Set oConn = Server.CreateObject("ADODB.Connection")

oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db1.mdb"

"C:\db1.mdb" замените на путь и имя Вашей БД. Абсолютный путь из относительного можно получить методом MapPath объекта Server:

curdir=Server.MapPath ("db1.mdb")

Из конференции Expert_FAQ

Вопрос

Как можно создать запрос, в котором условие отбора динамически меняется? (т.е. есть БД типа: дата, описание. Мне необходимо осуществить запрос по дате, но каждый раз по разной).

Ответ

Нужно вместо параметра даты, которое вводится в поле условие в построителе запроса, ввести несуществующее поле. Например [Любая дата] Тогда при выполнении запроса MS Acсess будет выводить запрос с просьбой ввести значение этого недостающего поля.

BSP

Нужно в поле Условие поставить функцию, которую пропишите в модуле.

Unknown

Вопрос

У меня очень уж большой файл базы на аксессе. Как можно уменьшить его?

Ответ

На каком-то сайте вычитал интересную вещь: чтобы сжать базу, необходимо ввести

MSACCESS.EXE "Имя базы (с полным путем)" /decompile.

Далее, после открытия базы (она сама это сделает, сматерившись пару раз), сжимаем ее обычным способом — Свойства … Сжать базу данных. У меня с 9,2 Мб уменьшилась до 3,8.

Фомин Антон

Можно в самом Акцессе — меню сервис и там сжатие базы, а если через код, то подключи msjro15.dll у нее есть CompactDatabase.

kasssib

Вопрос

Почему-то в Access2000 в функции MsgBox не работают символы форматирования '@'. Есть ли какая-то возможность форматировать текст сообщения? Понятно, что можно сделать форму, но очень не хочется.

Ответ

MS в Access2000 сменил VB for Access на VB for Application со всеми вытекающими последствиями.
Форматировать можно, добавляя в строку сообщения символы CR и LF:

msg$ = "Строка 1" & chr$(13) & chr$(10) & "Строка 2"

Правда, в этом случае надо простится с выделением жирным шрифтом (хотя, возможно, есть какие-то ухищрения, чтобы этого добиться)

Вопрос

Имеется одна общая база данных в локальной сети. Каким образом можно открыть базу данных для редакции нескольким пользователям одновременно?

Ответ

Сервис — Параметры — вкладка Другие — общий доступ
Также снять галку (если есть) Блокировка записей при открытии БД там же.

Из конференции Expert_FAQ

Вопрос

Такая проблема — импортирую данные из таблицы фокспро с дискеты в Access. Данные из него Access взял. Но не все. 3 записей не досчитались. И не заругался, ничего не сказал. Скажите, как можно программно проверить, нормально читается файл или нет?

Ответ

Лучше всего делать так: с дискеты сначала переписываешь файл на винчестер, а затем уже из него импортируешь. А при переписывании и узнаешь, нормально он читается или нет. Если нет — он просто не перепишется. А на предмет проверки — можешь сравнить размеры исходного и конечного файлов.

Дмитрий Данелия

Вопрос

Есть MDE файл, созданный в Access 97. При открытии его в Access 2000 выдается «Преобразование и подключение MDE не допускается». Способа запустить данный файл в Access 2000 найти не удалось. Есть возможность поставить на один компьютер Access 97 и Access 2000?

Ответ

У меня на компьютере уже 1,5 года работает такая связка.
Статью из Microsoft KB прислать не могу, за давностью времен потерялась. Но, по-моему, найти ее нетрудно будет по ключевым словам «Access 97 Access 2000». Расскажу, как к 2000-му акцесу добавить 97.

Идешь в папку с установленным офисом 2000 и переименовываешь файл Access.exe (или как его там), Микрософт предлагала расширение .sav, но мой опыт говорит, что это не принципиально.
Такая же операция проводится с файлом шрифта hatten.ttf
Устанавливаешь Офис 97 в другую папку (хотя можно установить только Акцесс 97, как делал я)
Переименовываешь Access.sav обратно в .exe
Переименовываешь Hatten.sav обратно в .ttf (скорее всего, файл будет уже существовать).
Работаешь.

ПРИМЕЧАНИЕ:
Какой Акцесс последний открывался, тот и перехватывает на себя обработку .MDB и .MDE файлов.
Возможно, файл шрифта носит название не Hatten, а какое-либо другое, похожее (мне лень смотреть :)). Но, думаю, разберешься.

Вадим

Если заливать офис на чистый ПК, то можно поставить MSO 97, а затем — MSO 2000 (разумеется, сохраняя MSO 97 и в другой каталог). Никаких проблем под Win 98/NT 4 не было (под Win XP комбинация MSO 97 + MSO 2K + MSO XP привела к тому, что нормально работает только MSO XP). Кстати, если MDE файл был нужен только для извлечения данных (т.е. не в качестве интерфейса), то можно было залинковать на его таблицы любую базу, созданную под MS Access 2000/XP.

fedorovandrey

Вопрос

При создании таблицы в Access 2000 надо чтобы числа были с 2 знака после запятой. Делаю так:
Тип данных — Числовой,
Размер поля — Одинарное с плавающей точкой
Формат поля — Основной
Число десятичных знаков — 2
Но в таблице не получается 2 знака после запятой. Почему?

Ответ

В окне свойств таблицы следует установить свойство Число десятичных знаков (DecimalPlaces). Присоединенный элемент управления, созданный в форме или отчете, наследует значение свойства Число десятичных знаков, установленное в базовой таблице или запросе. Поэтому нет необходимости определять это свойство отдельно для каждого созданного присоединенного объекта.
Свойство Число десятичных знаков (DecimalPlaces) не учитывается, если для свойства Формат поля (Format) выбрано значение Основной.
Т.е., скорее всего, у тебя пустое свойство Format для этого поля таблицы, а потому по умолчанию применяется «Основной». Введи туда что-то вроде " # ###,## " — и все будет ОК.

Сергей

Вопрос

Поле итоговой суммы считает не все промежуточные суммы. Что делать?

Ответ

Это скорее всего происходит из-за того, что ты считаешь в сумму по вычисляемым полям, а Аксесс не выполняет в формах и отчетах операции над вычисляемыми полями, решить проблему очень легко — создай запрос, в котором вычисли значения полей, по которым у тебя не считалась сумма (вообще-то это относится не только к итоговой сумме, но и ко всем операциям) , либо в уже существующем запросе вычисли значения этих полей.

Из конференции Expert_FAQ

Вопрос

У меня установлен ACCESS 2000 как часть MS OFFICE. Есть база в dbf формате. Также установлен PARADOX 7. Так вот при установке связи с DBF файлом или при попытке импортировать файл в таблицу данные в ней предстают в виде непонятных символов, такое впечатление, что кодировка другая. Несколько дней назад все было ОК.

Ответ

Был подобный эффект при подключении Foxpro баз данных под 1С
Там секрет, скорее всего, в кодировке Dos 866 и windows 1251. Нужно в реестре покопаться и поменять кодировку в твоей версии Access(9.0)
Для этого запустить regedit.exe, найти ключ

HKEY_LOCAL_MACHINE\ Software Microsoft\ Jet<ваша версия>EnginesXbase>

Там найти значение DataCodePage и исправить его значение с ANSI на OEM
OEM соответствует 866 кодировке Dos, Ansi — 1251 Windows.

Николай

Вопрос

Возможно ли в MS Access97 сделать так, чтобы при истечении срока даты цвет надписи менялся на другой?

Например в форме у товара ставится дата истечении срока сертификата, и если форма открывается после истечения данного срока, то цвет даты меняется на красный

Ответ

Я обычно делаю так:

На событие <Текущая запись> (Current) формы вешаешь процедурку, которая проверяет больше или меньше текущая дата даты в поле (допустим me.срок) Если больше, то свойству поля me.срок — <Цвет границы> (BorderColor) или <Цвет текста> (ForeColor) (по желанию) выставляешь 255 (красный) или какой другой. Если же нет, то 0 (черный)

Событие <Текущая запись> (Current) будет возникать всегда при открытии формы и при переходе на другую запись.

Вот примерно, что получиться:

Private Sub Form_Current()
If Me.срок <= Date
Then Me.срок.ForeColor = 255
Else Me.срок.ForeColor = 0
End
If End
Sub


Из конференции Expert_FAQ

Вопрос

Данные вводятся в access, потом собирается текстовый файл и передается эл.почтой, на приеме старая фоксовая программа, получается конфликт кодировок. Как быть?

Ответ

Можно сразу переводить текстовые строки при записи в файл в нужную кодировку. Вот функции для этого:

Public Declare Function OemToChar Lib "user32" Alias "OemToCharA" _
(ByVal lpszSrc As String, ByVal lpszDst As String) As Long ' Из DOS в WIN
Public Declare Function CharToOem Lib "user32" Alias "CharToOemA" _
(ByVal lpszSrc As String, ByVal lpszDst As String) As Long ' Из WIN в DOS


В модуле формы объявляешь переменные:

Dim l_lReturn As Long
Dim strSource, strDestin As String


Пишешь преобразованные строки в файл:
Open "MyFile.txt" For Output As #1
MyStringVar = "Просто строка"
strSource = MyStringVar
strDestin = Space$(Len(strSource))
l_lReturn = CharToOem(strSource, strDestin)
Print #1, strDestin
Close #1


В итоге в файле MyFile.txt — текст в DOS-кодировке

Если использовать внешнюю программу вроде recoder.exe, то вызвать ее из бейсика можно оператором Shell («командная строка») Также можно использовать функцию API WinExec или (для крутых:-)) ShellExecute — они дают больше возможностей для управления запускаемой программой.

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd _
As Long) As Long
Public Const SW_SHOWNORMAL = 1
Public Const SW_SHOWMAXIMIZED = 3


Пример:

strDoc = "MyDocuments\MyDocFile.doc"
ShellExecute Me.hwnd, vbNullString, strDoc, vbNullString, _
"C:\", SW_SHOWMAXIMIZED

Вопрос

Во время работы с MS Access столкнулся с такими терминами «информационно-логическая модель предметной области», «схема модели данных». Что это такое ? Если можно, подробнее.

Ответ

Термин «информационно-логическая модель предметной области» используется в процессе разработки проекта базы данных. Разработка базы данных начинается с постановки задачи, в процессе которой разрабатывается информационно-логическая модель реального процесса, который должен моделироваться в базе данных.
В постановке задачи в реальном процессе выделяются объекты (как правило, это реальные документы или процессы), которые в базе данных будут реализованы в виде таблиц, отношения между объектами реализуются в виде связей между таблицами. Грубо говоря, получая задание на разработку базы данных, разрабатывают блок-схему, описывающую процесс.
Термин «схема модели данных» — это схема данных, т.е. визуально это диаграмма связей между таблицами в базе данных. Увидеть ее или модифицировать можно, нажав на панели инструментов иконку Схема данных.
Подробнее можно почитать в книгах, главы «Разработка проекта базы данных» и т.п.

Serg Ostashenko



Copyright © 2000-2004 Сообщество Чайников
Контактная информация