Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Проверка значения поля при заполнении формы


Автор: AlPin 2.1.2007, 19:08
Всем здраствуйте.
Я в БД, макросах и VBA новичок.
Проблема такая:
Дана таблица, а к ней форма с полями: Табельный номер, Фамилия, Дата принятия, Дата увольнения.
Как сделать так, чтобы Access проверял (когда заполняешь форму), что поле "Фамилия" не пустое и только потом позволял вводить в "Дата принятия"

Автор: Rodman 2.1.2007, 19:20
при помощи VBA проверяй

что то типа
Код

if(Edit.Text=' ')...

Автор: AlPin 2.1.2007, 19:33
Форма ленточная.
Когда проверяю при получении фокуса на "Дата принятия":
Код

if Фамилия.Text="" then MsgBox("Введите фамилию"):Фамилия.SetFocus

постоянно выскакивает сообщение, даже если поле "Фамилия" не пустое.
Помогите скорее, пока праздники хочу доделать.

Автор: Юдифь 3.1.2007, 03:32
Если поставить на свойство "выход" поля "фамилия" так?

Код

If IsNull(фамилия) Then MsgBox ("Введите фамилию")
DoCmd.CancelEvent


вторая строка - если не хочешь, чтобы выпустила из поля "фамилия", пока не введешь значение

А вообще, если в таблице на это поле поставить свойство "обязательное поле", то при выходе из записи будет выскакивать предупреждение, что поле должно быть заполнено обязательно.

Автор: AlPin 3.1.2007, 18:23
Если поставить в таблице "обязательное поле" у фамилии, то если в форме пропустить ее и ввести какую-нибудь дату, потом стереть ее, то при закрытии достает окошко с информацией, что поле не может быть Null, а если мне уже расхотелось вводить новые данные. Вылазеет окошко с ошибкой, чего мне не надо.

Я точно так же хочу сделать и с полем "Дата увольнения" куда допускается вводить данные только если поле "Дата принятия"заполнено.

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

Сейчас пытаюсь сделать при помощи макросов, но получается немного не так как надо

Автор: Юдифь 4.1.2007, 03:20
Это тебе к сведению: если ты даже заполнишь всю запись и не хочешь сохранять ее, то нажимаешь <esc>, и запись удаляется.
А что касается моего примера - то у меня все срабатывает, и из поля не выпускает, пока не введу данные. Может, ты что-то не так делаешь?

Автор: AlPin 5.1.2007, 18:43
За сведения спасибо, не знал.
Я так и не смог сделать чего хотел, ладно, пусть Access высвечивает свои окошки с ошибками вместо моих.

Тогда другой вопрос:
В другой ленточной форме из этой же БД поле "Табельный номер" выбирается из выпадающего списка, состоящего из тех, кто на данный момент работает (т.е. не уволен) и вводятся 2 даты (начало-конец работы).
Как сделать проверку, чтобы 1 и тот же рабочий (одинаковый табельный номер) не мог выполнять 2 работы в одно время?

Автор: dionisiu 6.1.2007, 14:03
скрин формы приложи, а то не понятно.
также опиши таблицу, в которой хранятся данные (которые нужно контролировать на отсутствие совпадений)
видимо, форма - типа табеля учёта рабочего времени.
Они бывают разные: по отдельному подразделению (бригада, участок, отдел ...) и по предприятию.
В первом случае - один работник в одном табеле дважды попасть не может, а во втором - может, если среди месяца было перемещение (частый случай для строительства - перевод с участка на участок), хотя и быть на двух участках в один день не должен (бывает, конечно, что на одном участке 4 часа, и на другом участке 4 часа).

а вот фраза
Цитата(AlPin @  5.1.2007,  18:43 Найти цитируемый пост)
чтобы 1 и тот же рабочий (одинаковый табельный номер) не мог выполнять 2 работы в одно время? 

это, конечно, не хорошо, но ведь бывает совмещение и/или расширение объёма работ.


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

Автор: AlPin 6.1.2007, 18:23
Совмещения быть не должно (рабочий - это водитель, который совершает междугородние рейсы).

Вот такая форма:
Код типа транспорта|Номер маршрута|Длина маршрута|Табельный номер водителя|Дата выхода|Дата возвращения

Нужно сделать так:
Если если есть одна запись с табельным номером, допустим, 1
и вводится вторая, уже другая запись с таким же табельным номером, то надо проверить, чтобы промежуток между датами не перекрывался

Т.е., чтобы проверялись условия:
Дата_выхода_2>Дата_возвращения_1 or Дата_возвращения_2<Дата_выхода_1
Вот только я не знаю, как это реализовать.

Автор: dionisiu 9.1.2007, 11:27
если идёт срожайшая последовательность заполнения данных (то есть никакой документ не проводится "задним числом"), то вторая часть условия "Дата_возвращения_2<Дата_выхода_1" не обязательна (к тому же, её трудно реализовать)

Если описанные тобой названия полей формы РАВНЫ таким же полям некоей таблицы (предположим, Рейсы), то можно попытаться в свойства поля "Дата выхода" (условие на значение) вписать такой код:

Код

>=DMax("[Дата возвращения]", "[Рейсы]", "[Табельный номер водителя]=Forms![Рейсы]![Табельный номер водителя]")


Однако, таблица должна иметь как минимум одну запись для каждого водителя, иначе придётся сильно усложнять это условие. Пробуй мастер функций

Автор: Akina 9.1.2007, 13:06
Цитата(AlPin @  6.1.2007,  19:23 Найти цитируемый пост)
Т.е., чтобы проверялись условия:
Дата_выхода_2>Дата_возвращения_1 or Дата_возвращения_2<Дата_выхода_1
Вот только я не знаю, как это реализовать.

Код

Select *
From MyTable
Where (Date21 Between Date11 AND Date 12)
   OR (Date22 Between Date11 AND Date 12)

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

Автор: dionisiu 10.1.2007, 10:21
Akina, автор имел ввиду сравнить данные в ПОЛЯХ Дата_возвращения и Дата_выхода в ТЕКУЩЕЙ ЗАПИСИ с данными в тех же полях ПРЕДЫДУЩЕЙ ЗАПИСИ. Ваш запрос пытается найти данные в НЕСУЩЕСТВУЮЩИХ полях. Или это - недокументированный способ обращения к предыдущим записям? тогда - снимаю шляпу.


Автор: Akina 10.1.2007, 10:32
dionisiu, я удивлен...

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

Однако для текущей записи мы берем не значение поля записи в таблице БД, а содержимое контрола, т.е. литерал, и подставляем его в запрос. Т.е. имеем нечто типа:

Код
'extreme draft
strSQL = "Select * From MyTable Where (" & _
          Date21.Text & _
          " Between Date11 AND Date 12) OR (" & _
          Date22.Text & _
          " Between Date11 AND Date 12)"
Set rs = OpenRecordset(strSQL)
If rs.RecordCount > 0 Then MsgBox "Фигня какая-то..."

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)