Всем привет! Срочно требуется помощь. Есть 2 проблемы которые не могу решить.
1 в accesse при составлении отчета нужно отсечь часть данных из тестового поля.(В поле название и почтовый адрес предприятия, арес начинается с индекса) Что нужно сделать чтобы выдавалось только имя предприятия?
2. Форма сделана на основе запроса на выборку.Переход по записям осуществляется с помощью Scroll, как запретить переход? Мне нужно чтобы переход осуществлялся при вводе данных в поле?
база данных в Access
Модератор: Naeel Maqsudov
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
1.
Это, вообще говоря, неправльно хранить адрес и название в одном поле. Правило Кодда №1 - "Поля должны быть атомарными". Если еще не поздно, то настоятельно рекомендую переделать.
Удостовериться, что в строке встречается индекс пожно по условию:
iif([Предприятие] Like "* [0-9][0-9][0-9][0-9][0-9][0-9]*";...;...)
Далее по instr надо искать цифры, стоящие после других цифр... теоретически можно, но формула получится неимоверно длинная... (мягко
говоря)
Если хотите, можно попробовать написать функцию на VBA и вызывать ее из запроса. Сколько записей в таблите максимально предполагается? А то может VBA окажется плохим решением из-за быстродействия (точнее медленнодействия)...
Однако, я бы все переделал...
Представляете, а если оператор ошибется и введет 5 цифр вместо 6-ти?
2.
Задача, прямо скажем нетривиальная...
Самый простой способ: иметь отдельную форму для ввода новых записей.
В основной форме (для просмотра и правки) делаем "Разрешить добавление = False", создает аналогичную форму (можно просто копированием). В ней свойство "Ввод данных" установить в True.
Теперь из гланой модально вызываем вторую (для этого добавляем кнопку).
Получится добавление записи через отдельное окно, в котором будут видны только добавляемые записи. Прокрутка естественно останется, но она будет выпоняться только между одной-несколькими новыми записями.
Другое, более красивое решение - это обработать событие "До обновления" у формы, но тут надо уметь писать макросы.
Теперь, если пользователь на форме что-нибудь поправит, то если проверка корректности на пройжет, никакой скроллинг его никуда не пустит. Будет только БИП-ать и все. (Или не все... если Beep заменить на MsgBox)
Еще не забывайте про такое свойство формы как "Цикл табуляции", возможно оно Вам пригодится.
Это, вообще говоря, неправльно хранить адрес и название в одном поле. Правило Кодда №1 - "Поля должны быть атомарными". Если еще не поздно, то настоятельно рекомендую переделать.
Удостовериться, что в строке встречается индекс пожно по условию:
iif([Предприятие] Like "* [0-9][0-9][0-9][0-9][0-9][0-9]*";...;...)
Далее по instr надо искать цифры, стоящие после других цифр... теоретически можно, но формула получится неимоверно длинная... (мягко

Если хотите, можно попробовать написать функцию на VBA и вызывать ее из запроса. Сколько записей в таблите максимально предполагается? А то может VBA окажется плохим решением из-за быстродействия (точнее медленнодействия)...
Однако, я бы все переделал...
Представляете, а если оператор ошибется и введет 5 цифр вместо 6-ти?
2.
Задача, прямо скажем нетривиальная...
Самый простой способ: иметь отдельную форму для ввода новых записей.
В основной форме (для просмотра и правки) делаем "Разрешить добавление = False", создает аналогичную форму (можно просто копированием). В ней свойство "Ввод данных" установить в True.
Теперь из гланой модально вызываем вторую (для этого добавляем кнопку).
Получится добавление записи через отдельное окно, в котором будут видны только добавляемые записи. Прокрутка естественно останется, но она будет выпоняться только между одной-несколькими новыми записями.
Другое, более красивое решение - это обработать событие "До обновления" у формы, но тут надо уметь писать макросы.
Код: Выделить всё
Private Sub Form_BeforeUpdate(Cancel As Integer)
'выполняем проверку правильности заполнения всех полей на форме
if ДанныеНеПолные then
Beep
Cancel = True
end if
End Sub
Еще не забывайте про такое свойство формы как "Цикл табуляции", возможно оно Вам пригодится.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
(1)
Вобщем так:
Добавьте в проект "Модуль". Откройте его и вставьте туда функцию
В конструкторе запроса для отчета добавьте поле
Адрес:GetAddress([Организация])
Но это все-таки медленное решение... Лучше разделить поля.
PS
"[0-9]" для Like эквивалентно "#".
Вобщем так:
Добавьте в проект "Модуль". Откройте его и вставьте туда функцию
Код: Выделить всё
Public Function GetAddress(Name_Adress As String) As String
If Name_Adress Like "* ######*" Then
i = 1
Do Until Mid(Name_Adress, i) Like "######*"
i = i + 1
Loop
GetAddress = Mid(Name_Adress, i)
Else
GetAddress = "---"
End If
End Function
Адрес:GetAddress([Организация])
Но это все-таки медленное решение... Лучше разделить поля.
PS
"[0-9]" для Like эквивалентно "#".