база данных в Access

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Raina
Сообщения: 1
Зарегистрирован: 14 фев 2005, 00:35
Откуда: N Novgorod

Всем привет! Срочно требуется помощь. Есть 2 проблемы которые не могу решить.
1 в accesse при составлении отчета нужно отсечь часть данных из тестового поля.(В поле название и почтовый адрес предприятия, арес начинается с индекса) Что нужно сделать чтобы выдавалось только имя предприятия?
2. Форма сделана на основе запроса на выборку.Переход по записям осуществляется с помощью Scroll, как запретить переход? Мне нужно чтобы переход осуществлялся при вводе данных в поле?
Аватара пользователя
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.
Теперь из гланой модально вызываем вторую (для этого добавляем кнопку).
Получится добавление записи через отдельное окно, в котором будут видны только добавляемые записи. Прокрутка естественно останется, но она будет выпоняться только между одной-несколькими новыми записями.

Другое, более красивое решение - это обработать событие "До обновления" у формы, но тут надо уметь писать макросы.

Код: Выделить всё

Private Sub Form_BeforeUpdate(Cancel As Integer)
  'выполняем проверку правильности заполнения всех полей на форме
  if ДанныеНеПолные then
    Beep
    Cancel = True
  end if
End Sub

Теперь, если пользователь на форме что-нибудь поправит, то если проверка корректности на пройжет, никакой скроллинг его никуда не пустит. Будет только БИП-ать и все. (Или не все... если Beep заменить на MsgBox)

Еще не забывайте про такое свойство формы как "Цикл табуляции", возможно оно Вам пригодится.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

(1)
Вобщем так:
Добавьте в проект "Модуль". Откройте его и вставьте туда функцию

Код: Выделить всё

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 эквивалентно "#".
Ответить