Vvmebel.com

Новости с мира ПК
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Access проверка на null

Access проверка на null

А втор Allen Browne, ноябрь 1999 г.
http://allenbrowne.com/casu-12.html
Перевод: А. Артамонов, октябрь 2011г.

Типичные ошибки с Null-ами

Вот некоторые распространенные ошибки обращения с Null -ами, которые допускают новички. Если у вас нет ясности насчет Null’ов, сначала прочитайте Nulls: Do I need them?

Ошибка № 1: Null-ы в критериях

Если вы вводите условии отбора под полем в конструкторе запросов, он возвращает только совпадающие с образцом записи. Null-ы при этом исключаются из отбора.
Например, скажем, у вас есть таблица компаний и адресов. Вам нужны два запроса: один, который выдает местные компании, другой ― все остальные . В строке условий отбора в первом запросе под полем Город вы вписываете:
«Бобруйск»
и во втором запросе :
Not «Бобруйск»
Неправильно! Ни один запрос не включит записи, у которых город Null.

Используйте Is Null . Во втором запросе, чтобы достичь желаемого результата, условия отбора должны выглядеть как:
Is Null Or Not «Бобруйск»
Примечание: Запросы DDL (языка определения данных) обращаются с Null-ами иначе. Например, Null-ы учитываются в таком типе запроса:
ALTER TABLE Table1 ADD CONSTRAINT chk1 CHECK (99 ‘TX’));

Ошибка № 2: Null-ы в выражениях

Результатом вычислений, включающих Null, обычно является Null. Например, новички иногда вводят выражение в источник данных текстового поля, чтобы вывести остаток к оплате:
=[СуммаКОплате] — [СуммаУплаченная]
Проблема в том, что если не было оплачено ничего, СуммаУплаченная является Null-ом, и в текстовом поле ничего не отображается.

Используйте функцию Nz(), чтобы указать значение для Null-а:
= Nz([СуммаКОплате], 0) — Nz([СуммаУплаченная], 0)

Ошибка № 3: Null-ы во внешних ключах

В то время, как Аксесс запрещает Null-ы в первичных ключах, он разрешает Null-ы во внешних. В большинстве случаев стоит явно запрещать эту возможность, ч тобы избежать висящих ссылок .
В типичной таблице для накладных, строки накладной хранятся в таблице НакладнаяСтроки, соединенной с таблицей Накладные по НакладнаяКод. Вы создаете связь между Накладные.НакладнаяКод и НакладнаяСтроки.НакладнаяКод с поддержкой ссылочной целостности . Этого недостаточно!
Если вы не установили свойство Обязательное поля НакладнаяКод в таблице НакладнаяСтроки на Да , Аксесс разрешает Null-ы. Чаще всего это случается, когда пользователь начинает добавлять строки в подформе, не создав сперва саму накладную в основной форме. Так как у этих записей нет соответствующей им записи в основной форме, эти висящие записи больше нигде не показываются снова. Пользователь уверен, что программа их удалила, хотя на самом деле они находятся в таблице.

Всегда выставляйте значение свойства Обязательное на Да в конструкторе таблиц, если только вам не нужна возможность иметь Null-ы во внешних ключах.

Ошибка № 4: Null-ы и типы, отличные от Variant.

В Visual Basic единственным типом данных, который может содержать Null является Variant. Когда бы вы ни присваивали значение поля в переменную с типом не-Variant, всегда нужно учитывать возможность, что в поле может содержаться Null. Посмотрите, что в этом коде модуля формы может пойти не так:
Dim strName as String
Dim lngID As Long
strName = Me.Отчество
lngID = Me.КодКлиента
Когда поле Отчество содержит Null, попытка присвоить Null переменной строкового типа породит ошибку .
Аналогично, присвоение значения КодКлиента числовой переменной может вызвать ошибку. Даже если КодКлиента является первичным ключом, код небезопасен: первичный ключ содержит Null в новой записи.

(a) Используйте тип Variant, если вам необходимо работать с Null-ами.
(b) Используйте функцию Nz() , чтобы указать значение вместо Null. Например::
strName = Nz(Me.Отчество, «»)
lngID = Nz(Me.КодКлиента, 0)

Error 5: Сравнение с Null

Выражение:
If [Фамилия] = Null Then
будет бессмысленно, так как никогда не может быть истинно. Даже если фамилия является Null-ом, VBA полагает, что вы спросили::
Является ли Неизвестное равным Неизвестному?
и всегда отвечает: “Откуда мне знать, равны ли ваши неизвестные друг другу? Здесь мы опять наблюдаем распространение Null : результат не является ни истинным ни ложным.

Используйте функцию IsNull() :
If IsNull([Фамилия]) Then

Ошибка № 6: Забыли, что Null ни Истина ни Ложь.

Выполняют ли эти две конструкции одну и ту же работу?
(a) If [Фамилия] = «Иванов» Then
MsgBox «Это Иванов”
Else
MsgBox «Это не Иванов»
End If

(b) If [Фамилия] <> «Иванов» Then
MsgBox «Это не Иванов»
Else
MsgBox «Это Иванов”
End If
Когда фамилия является Null-ом, эти два куска кода противоречат друг другу. В обоих случаях, первая часть If не срабатывает, и начинается выполнение Else, что приводит к противоречащим друг другу сообщениям.

Читать еще:  Like в access

(a) Учитывайте все три возможных результата сравнения — True, False, и Null :
If [Фамилия] = «Иванов» Then
MsgBox «Это Иванов”
ElseIf [Фамилия] <> «Иванов» Then
MsgBox «Это не Иванов”
Else
MsgBox «Мы не знаем, Иванов это или нет»
End If
(b) В некоторых случаях, функция Nz() позволит обработать два случая разом. Например, рассматривать Null и нулевую строку одинаково:
If Len(Nz([Фамилия],»»)) = 0 Then 

Проверка в VBA на NULL

Добрый день. Проблема такая в макросе VBA есть такая строка:

Хорошо прочитав значение — оно выводится вместо надписи, но когда значения NULL то выходит ошибка — invalid of is null в vba.

Хорошо делал проверку такого плана:

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

Проверка запроса SELECT на null
Помогите, пожалуйста, разобраться. В общем, в зависимости от того, какой ответ получится от.

Проверка значения на Null подчиненной формы в виде таблицы
Всем привет. Голову ломал два дня, и все-же решил обратиться снова на форум. Раньше у меня работал.

Проверка корректности ввода на VBA
Бд:книги кафедры. При этом в схеме данных у меня кольцо. Как реализовать проверку: Хотя бы один.

вы ошиблись, а я не заметила
ос_внеш = «» & DLookup(«[всего ос]», «[Итоги для отчета по ПАБ(внеш)]», «[всего ос]»)
к конце должно быть условие поиска, а у вас непонятно что

Добавлено через 1 минуту

исправил
ос_внеш = «» & DLookup(«[всего ос]», «[Итоги для отчета по ПАБ(внеш)]», «[код_подр]=» & текПодразделение)
где,
текПодразделение = [Forms]![Отчеты по ПАБ]![Подразделение_А].Value

Но все равно выходит пусто хотя данные в результатах запроса есть

Дальше исправьте вызовы типа:
DLookup(«[кол-во]», «[Итоги для отчета по ПАБ]», «[кол-во]»)
DLookup(«[план]», «[Итоги для отчета по ПАБ]», «[план]»)
DLookup(«[выполн]», «[Итоги для отчета по ПАБ]», «[выполн]»)
Они не верны — третьим аргументом идёт выражение условия отбора
Читайте пожалуйста Функция DLookup

. потом можно будет продолжить .
Вот насобирал для вас:

это не подразделение а = Подразделение, год выбираем с той же формы и месяц.

Добавлено через 8 минут

а что должно возвратить
. ведь надписи ос_внеш в отчете нет, значение сосчитали, но не вставили в отчет

достаточно и так
s1 = «» & DLookup(«[кол-во]», «[Итоги для отчета по ПАБ(внеш)]», «[Код_подр]=» & текПодразделение)
Me.внешние_а.Caption = s1
если найдет -вставит значение, иначе вставит пробел

но это не всегда допустимо —у вас есть деление одного значения на другое
в этом случае надо
—найти оба значения в s1 и s2
—если первое пустое len(s1)=0, то значение1=0, иначе значение1=val(s1)
—если второе пустое len(s2)=0 —значение2=1 , иначе значение2=val(s2)

не знаю только что делать, если первое не пустое, а второе пустоу

Oracle mechanics

Производительность СУБД и смежные вопросы

Операция filter(NULL IS NOT NULL) и запросы со связанными переменными

При выполнении запроса с NULL-евыми значениями связанных переменных условия типа COLUMN1 = :VAR1 превращаются в COLUMN1 = NULL и по определению становятся невыполнимыми (в том смысле, что запрос с таким условием в WHERE не возвращает строк), но при построении плана / выполнении запроса оптимизатор не всегда использует эту возможность сэкономить ресурсы

Например, при выполнении практическоого запроса (судя по тексту, выполняющему проверку на совпадение введённого в поле формы текста с ID либо логином клиента) с пустым значением переменной:

— запрос выполняется так же, как и для не NULL-евых значений переменных, с тем же значительным количеством излишних в этом случае чтений блоков бд

Тот же запрос без использования связанных переменных отрабатывает намного эффективнее:

— общая стоимость выполнения запроса оказывается меньше стоимости слагаемых: при заведомо невыполнимых условиях ненужные операции доступа к бд исключаются оператором filter(NULL IS NOT NULL)

Или на тестовом примере:

— и опять несмотря на ненулевую стоимость сканирования T1, стоимость всего запроса = 0, что логично — запросу получения результата не нужны данные бд

Поскольку таблица в этом примере «свежая» (без статистики) в соответсвии со значением по умолчанию параметра:

дополнительно выполняется избыточная операция dynamic sampling после получения значений связанных переменных (что важно для запросов со связанными переменными), уже на этапе выбора метода доступа к таблице:

— что добавляет небольшой overhead при разборе (hard parse) во время первого выполнения запроса

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

Читать еще:  Powerpoint вставка звука

К сожалению, замечательная операция filter(NULL IS NOT NULL) в явном виде не используется Oracle для того же запроса со связанными переменными:

— даже если при первом выполнении/разборе курсора (hard parse) в качестве значения связанной переменной использовался NULL — bind peeking в этом случае не помогает

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

— т.е., отображая в плане обычную операцию INDEX RANGE SCAN, предполагающую доступ к блокам индекса, Oracle в зависимости от значения связанной переменной может полностью исключать обращения к данным бд. Очень похоже на неявное использование аналога операции типа filter(NULL IS NOT NULL)

При не NULL-вом значении переменной индекс честно читается:

Важно отметить, что при выборе способа выполнения запроса (читать или не читать блоки) Oracle не использует статистику таблицы:

— т.о. в этом месте поведение Oracle основано на анализе значений связанных переменных (bind peeking) при каждом выполнении курсора на этапе soft parse:

Для первоначального практического запроса добиться того же эффекта можно с помощью пары дополнительных индексов + эквивалентно переформулировав текст запроса — заменив LEFT OUTER JOIN на UNION, таким образом приводя сложный запрос к объединению двух запросов с простыми одиночными предикатами:

— т.о. для NULL-евых значений связанных переменных Oracle может исключать логически избыточные чтения, заметно улучшая время выполнения запросов: с 3 секунд до 100 мс, например

Common Errors with Null

Here are some common mistakes newbies make with Nulls. If you are unclear about Nulls, first read Nulls: Do I need them?.

Error 1: Nulls in Criteria

If you enter criteria under a field in a query, it returns only matching records. Nulls are excluded when you enter criteria.

For example, say you have a table of company names and addresses. You want two queries: one that gives you the local companies, and the other that gives you all the rest. In the Criteria row under the City field of the first query, you type:

and in the second query:

Wrong! Neither query includes the records where City is Null.

Solution

Specify Is Null. For the second query above to meet your design goal of «all the rest», the criteria needs to be:

Note: Data Definition Language (DDL) queries treat nulls differently. For example, the nulls are counted in this kind of query:
ALTER TABLE Table1 ADD CONSTRAINT chk1 CHECK (99 ‘TX’));

Error 2: Nulls in expressions

Maths involving a Null usually results in Null. For example, newbies sometimes enter an expression such as this in the ControlSource property of a text box, to display the amount still payable:

The trouble is that if nothing has been paid, AmountPaid is Null, and so this text box displays nothing at all.

Solution

Use the Nz() function to specify a value for Null:

Error 3: Nulls in Foreign Keys

While Access blocks nulls in primary keys, it permits nulls in foreign keys. In most cases, you should explicitly block this possibility to prevent orphaned records.

For a typical Invoice table, the line items of the invoice are stored in an InvoiceDetail table, joined to the Invoice table by an InvoiceID. You create a relationship between Invoice.InvoiceID and InvoiceDetail.InvoiceID, with Referential Integrity enforced. It’s not enough!

Unless you set the Required property of the InvoiceID field to Yes in the InvoiceDetail table, Access permits Nulls. Most often this happens when a user begins adding line items to the subform without first creating the invoice itself in the main form. Since these records don’t match any record in the main form, these orphaned records are never displayed again. The user is convinced your program lost them, though they are still there in the table.

Solution

Always set the Required property of foreign key fields to Yes in table design view, unless you expressly want Nulls in the foreign key.

Error 4: Nulls and non-Variants

In Visual Basic, the only data type that can contain Null is the Variant. Whenever you assign the value of a field to a non-variant, you must consider the possibility that the field may be null. Can you see what could go wrong with this code in a form’s module?

Читать еще:  Access control allow origin iis

When the MiddleName field contains Null, the attempt to assign the Null to a string generates an error.

Similarly the assignment of the ClientID value to a numeric variable may cause an error. Even if ClientID is the primary key, the code is not safe: the primary key contains Null at a new record.

Solutions

(a) Use a Variant data type if you need to work with nulls.

(b) Use the Nz() function to specify a value to use for Null. For example:

Error 5: Comparing something to Null

is a nonsense that will never be True. Even if the surname is Null, VBA thinks you asked:

and always responds «How do I know whether your unknowns are equal?» This is Null propagation again: the result is neither True nor False, but Null.

Solution

Use the IsNull() function:

Error 6: Forgetting Null is neither True nor False.

Do these two constructs do the same job?

When the Surname is Null, these 2 pieces of code contradict each other. In both cases, the If fails, so the Else executes, resulting in contradictory messages.

Solutions

(a) Handle all three outcomes of a comparison — True, False, and Null:

(b) In some cases, the Nz() function lets you to handle two cases together. For example, to treat a Null and a zero-length string in the same way:

Проверка отсутствия/наличия значения. Предикат IS NULL

Проверка отсутствия/наличия значения. Предикат IS NULL

Предикат

IS [NOT] NULL

позволяет проверить отсутствие (наличие) значения в полях таблицы. Использование в этих случаях обычных предикатов сравнения может привести к неверным результатам, т.к. сравнение со значением NULL дает результат UNKNOWN (неизвестно).

Так, если требуется найти записи в таблице Pc, для которых в поле price отсутствует значение (поиск ошибок ввода), можно воспользоваться следующим оператором:

WHERE price IS NULL;

Похожие главы из других книг:

Проверка наличия звуковой системы

Проверка наличия звуковой системы Проверка наличия звуковой системы заключается в том, чтобы отследить, способен ли ваш компьютер:? воспроизводить звук;? записывать звук.К специальному устройству для воспроизведения и записи звука относится звуковая плата.Для проверки

11.2.1. Проверка наличия средств локализации

11.2.1. Проверка наличия средств локализации Современные дистрибутивы Linux (а тем более русифицированные) по умолчанию содержат системные средства локализации, перечисленные в предыдущем разделе.Чтобы убедиться в этом, проверьте, что у вас имеются каталоги /usr/share/locale/* и

26.5.5. Проверка наличия сообщения в очереди

26.5.5. Проверка наличия сообщения в очереди Наверное, вы не хотите, чтобы ваша программа ждала, пока в очереди появится нужное сообщение. Используя особенности системного вызова msgrcv(), можно написать код проверки наличия сообщения определенного типа в очереди. Напишем

Проверка попадания в диапазон. Предикат BETWEEN.

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

2. Неопределенные значения ( Null-значения)

2. Неопределенные значения (Null-значения) Слово Null используется для обозначения неопределенных значений в базах данных.Чтобы лучше понять, какие значения понимаются под неопределенными, рассмотрим таблицу, являющуюся фрагментом базы данных: Итак, неопределенное

4. Null-значения и логические операции

4. Null-значения и логические операции Обычно в системах управления базами данных непосредственно поддерживаются только три логические операции: отрицание ¬, конъюнкция & и дизъюнкция ?. Операции следования ? и равносильности ? выражаются через них с помощью

5. Null-значения и проверка условий

5. Null-значения и проверка условий Итак, из всего вышесказанного можно сделать вывод, что в логике систем управления базами данных имеются не два логических значения (True и False), а три, ведь Null-значение также рассматривается как одно из возможных логических значений. Именно

Предикат IS [NOT] NULL

Предикат IS [NOT] NULL IS NULL и его противоположность IS NOT NULL являются парой предикатов, которые не используют группирование. Поскольку NULL не является значением, эти операторы не являются операторами сравнения. Они проверяют утверждение, что объект в левой части имеет значение (IS

Установка значения в NULL

Установка значения в NULL Элемент данных может быть сделан NULL только в столбце, для которого не указано ограничение NOT NULL (СМ. разд. «Ограничение NOT NULL» главы 16).В операторе UPDATE символом назначения является «=»:UPDATE FOO SET COL3 = NULLWHERE COL2 = 4;В операторе INSERT передавайте ключевое слово NULL

Ссылка на основную публикацию
Adblock
detector