Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Присвоение значения полю типа "Вложение" с использованием VBA

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

Есть таблица "Письма" где последний столбец "Документ" - поле типа вложения где хранятся файлы.
Нужно просто эту таблицу скопировать в другую такую же по структуре существующую таблицу другой базы данных Access скажем в "Экспорт_Письма". Элементарно но...
В другой базе данных есть структура данных, и эта таблица экспортом самого Access не может быть скопирована, поскольку старую надо удалить. Запросом SQL невозможно это сделать поскольку хотя и выбрать множественное поле можно через SELECT и точку Письма.Документ.FileData, Письма.Документ.FileName, Письма.Документ.FileType, поле вложение состоит из 6 подполей.

Но в конструкции INSERT INTO нельзя использовать поля со множественным значением (это поле типа вложение). Можно только через конструкцию VALUES, но ээээ.... Если вы знаете как это сделать через SQL !!!!! Это просто было был шикарно.
Я постарался сделать через VBA. Вроде всё должно быть просто - надо создать два объекта recordset и поля одно присвоить полям другого. Конечно можно использовать методы .SaveToFile и .LoadFromFile и прогнав файлы через диск компьютера добиться результата. Но как это сделать напрямую - ничего не получается, просто море ошибок исправляя которые приходишь к другим и в итоге пришёл в тупик...

Итого на данный этап просто хочу в одной и той же базе данных скопировать все строки таблицы "Письма" в таблицу "Экспорт_Письма" - листинг следующий:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Public Sub Экспорт_данных()
'Открываем базу данных
Set текущаяБазаДанных = CurrentDb
'Для открытия другой базы данных будем использовать
'Set текущаяБазаДанных = OpenDatabase("Экспорт.accdb")
'Инициируем объекты рекордсет
Dim исхТаблица, редТаблица, запРедВложение, запИсхВложение As DAO.Recordset2
Dim редВложение, исхВложение As DAO.Field2
 
'Открываем таблицы
Set исхТаблица = текущаяБазаДанных.OpenRecordset("Письма", dbOpenTable)
'Set редТаблица = текущаяБазаДанных.OpenRecordset("Экспорт_Письма", dbOpenTable, dbInconsistent, dbOptimistic)
Set редТаблица = текущаяБазаДанных.OpenRecordset("Экспорт_Письма", dbOpenTable)
    'Очищаем строки записи
    Do While Not редТаблица.EOF
    редТаблица.Delete 'удаляем запись
    редТаблица.MoveNext 'переходим к следующей записи
    Loop
    'Прогоняем строки записи
    Do While Not исхТаблица.EOF
    редТаблица.AddNew 'добавляем новую запись
    'Перебераем поля записи
    For i = 0 To исхТаблица.Fields.Count - 1
    'Если последнее поле, то ...
    If Not исхТаблица.Fields(i).IsComplex Then
    редТаблица.Fields(i) = исхТаблица.Fields(i) 'Присваеваем значение полей
    End If
    Next i
    редТаблица.Update 'обновляем добавленную запись
    редТаблица.MovePrevious
    редТаблица.Edit
    For i = 0 To исхТаблица.Fields.Count - 1
    'Если последнее поле, то ...
    If исхТаблица.Fields(i).IsComplex Then
    'Инициируем поле вложение
    Set исхВложение = исхТаблица.Fields(i)
    Set редВложение = редТаблица.Fields(i)
    Set запИсхВложение = исхВложение.Value
    Set запРедВложение = редВложение.Value
    'Перебираем поле вложения
    Do While Not запИсхВложение.EOF
    'Перебераем поля нашего вложения
    запРедВложение.AddNew
    For j = 0 To запИсхВложение.Fields.Count - 1
    If Not IsNull(запИсхВложение.Fields(j).Value) Then
    [B]запРедВложение.Fields(j) = запИсхВложение.Fields(j) 'Присваеваем значение полей вложения[/B] Вот это вот строка вызывает ошибку!!!
    End If
    Next j
    запРедВложение.Update 'обновляем добавленное вложение
    запИсхВложение.MoveNext 'переходим к следующему вложению
    Loop
    запИсхВложение.Close
    запРедВложение.Close
    End If
    Next i
    редТаблица.Update 'обновляем изменённую запись
    исхТаблица.MoveNext 'переходим к следующей записи
    Loop
'Закрываем таблицы
исхТаблица.Close
редТаблица.Close
End Sub
Из изучения msdn. вроде понятно что вся особенность работы с полем типа Вложение заключается в том чтобы передать поле типа вложения через параметр .Value в объект Recordset.

Visual Basic
1
2
3
4
    Set исхВложение = исхТаблица.Fields(i)
    Set редВложение = редТаблица.Fields(i)
    Set запИсхВложение = исхВложение.Value
    Set запРедВложение = редВложение.Value
Ну или проще:

Set запИсхВложение = исхТаблица.Fields(i).Value
Set запРедВложение = редТаблица.Fields(i).Value

Мы получили recordset - где находятся все 6 подполей нашего поле "Документы".
Иии... дальше перебераем все подполя вложения в цикле

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
 Do While Not запИсхВложение.EOF
    'Перебераем поля нашего вложения
    запРедВложение.AddNew
    For j = 0 To запИсхВложение.Fields.Count - 1
    If Not IsNull(запИсхВложение.Fields(j).Value) Then
    [B]запРедВложение.Fields(j) = запИсхВложение.Fields(j)[/B] 'Присваеваем значение полей вложения
    End If
    Next j
    запРедВложение.Update 'обновляем добавленное вложение
    запИсхВложение.MoveNext 'переходим к следующему вложению
    Loop
И вот это вот строка запРедВложение.Fields(j) = запИсхВложение.Fields(j) 'Присваеваем значение полей вложения
- вызывала и вызывает ошибку.
"Run-time error '3164': Невозможно обновить поле" - и никак её не перепрыгнуть.
Интересно то, что данная конструкция проходит всё так 5 циклов - то есть 5 подполей нашего поля вложения заполняются, в том числе и двоичные данные файла!!! Но 6-ый цикл (присвоение 6-го последнего подполя) вызывает ошибку!!!

Изменение конструкции на

запРедВложение.Fields(j).Volume = запИсхВложение.Fields(j).Volume

ошибку не убирает.

Конструкция

Visual Basic
1
2
3
 If Not IsNull(запИсхВложение.Fields(j).Value) Then
    запРедВложение.Fields(j) = запИсхВложение.Fields(j) 'Присваеваем значение полей вложения
   End If
Была введена затем что когда цикла попадет на значение подполя Null то тоже выходит эта же ошибка
"Run-time error '3164': Невозможно обновить поле"
но цикл проходит только один раз - присваивается только одно подполе, до других 5-ти подполей цикл не доходит.

Я уже выделил отдельно присвоение полей простого типа

Visual Basic
1
2
3
4
5
6
7
8
9
 редТаблица.AddNew 'добавляем новую запись
    'Перебераем поля записи
    For i = 0 To исхТаблица.Fields.Count - 1
    'Если последнее поле, то ...
    If Not исхТаблица.Fields(i).IsComplex Then
    редТаблица.Fields(i) = исхТаблица.Fields(i) 'Присваеваем значение полей
    End If
    Next i
    редТаблица.Update 'обновляем добавленную запись
возвращаемся назад

Visual Basic
1
2
 редТаблица.MovePrevious
    редТаблица.Edit
, и присвоение одного этого поля с вложением

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 For i = 0 To исхТаблица.Fields.Count - 1
    'Если последнее поле, то ...
    If исхТаблица.Fields(i).IsComplex Then
    'Инициируем поле вложение
    Set исхВложение = исхТаблица.Fields(i)
    Set редВложение = редТаблица.Fields(i)
    Set запИсхВложение = исхВложение.Value
    Set запРедВложение = редВложение.Value
    'Перебираем поле вложения
    Do While Not запИсхВложение.EOF
    'Перебераем поля нашего вложения
    запРедВложение.AddNew
    For j = 0 To запИсхВложение.Fields.Count - 1
    If Not IsNull(запИсхВложение.Fields(j).Value) Then
    [B]запРедВложение.Fields(j) = запИсхВложение.Fields(j) 'Присваеваем значение полей вложения[/B] 
    End If
    Next j
    запРедВложение.Update 'обновляем добавленное вложение
    запИсхВложение.MoveNext 'переходим к следующему вложению
    Loop
    запИсхВложение.Close
    запРедВложение.Close
    End If
    Next i
Ничего не выходит
Помогите пожалуйста как в поле вложение запРедВложение добавить данные? через изменения каких свойств объекта это делается? Через Files? Values? или ещё что то.

База с макросом во вложении.

Заранее спасибо всем откликнувшимся!
Ответ:
Сообщение от mobile
Разобраться в Вашем коде сложновато. Лучше попробуйте процедуру, которая добавляет вложение в таблицу. Вставьте эту процедуру в свой код с нужными параметрами
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub addAttach(NomerKod, pathAttach)
'NomerKod - значение счетчика Код в т.Письма
'pathAttach - путь к документу и его имя с расширением. Например "c:\temp\Письмо.rtf"
    Dim rst As DAO.Recordset2, rstA As DAO.Recordset2, db As DAO.Database
    Set db = CurrentDb
    Set rst = db.OpenRecordset("select * from Письма where Код=" & NomerKod)
    rst.Edit
    Set rstA = rst.Fields("Документ").Value
    rstA.AddNew
    rstA.Fields("FileData").LoadFromFile pathAttach
    rstA.Update
    rst.Update
End Sub
Огромное спасибо за ответ!

вашу строку

Visual Basic
1
rstA.Fields("FileData").LoadFromFile pathAttach
я уже использовал и на этом построил первую версию своей процедуры. В ней файлы выгружались на диск с помощью
.SaveToFile и потом загружались обратно
в вашем случае это будет что то типа.

Visual Basic
1
2
rstB.Fields("FileData").SaveToFile pathAttach
rstA.Fields("FileData").LoadFromFile pathAttach
Но при этом все файлы будут скопированы на диск и там же останутся после работы процедуры.

Я же хочу обойтись без этого.

Добавлено через 29 минут
Ура товарищи!!! Проблема решена!
Может кому понадобиться инструкция по работе с полями типа Вложение.

Суть проблемы выяснилось после того как я убрал цикл перебора всех подполей поля вложения и вместо этого начал обращаться к конкретным подполям по их имени.

строки с 44 по 48
Visual Basic
1
2
3
4
5
                        For j = 0 To запИсхВложение.Fields.Count - 1
                            If Not IsNull(запИсхВложение.Fields(j).Value) Then
                                запРедВложение.Fields(j) = запИсхВложение.Fields(j) 'Присваеваем значение полей вложения Вот это вот строка вызывает ошибку!!!
                            End If
                        Next j
я заменил просто на
Visual Basic
1
2
3
запРедВложение.Fields("FileData").Value = запИсхВложение.Fields("FileData").Value 'Присваеваем значение полей вложения
запРедВложение.Fields("FileName").Value = запИсхВложение.Fields("FileName").Value
запРедВложение.Fields("FileType").Value = запИсхВложение.Fields("FileType").Value
И тут выяснилось что теперь вызывает ошибку именно это присвоение (строка 3):
Visual Basic
1
запРедВложение.Fields("FileType").Value = запИсхВложение.Fields("FileType").Value
То есть видимо тип файла ядро базы данных определяет сама автоматически и не позволяет заполнять это поле вручную.
Видимо даже больше - из всех 6-ти подполей которое содержит поле типа Вложение вручную можно заполнить только два это FileData и FileName остальные заполняются самим ядром базы данных. (я непрофессионал поэтому прошу простить меня за возможную делетантность). Самое главное что необходимо присвоить только два этих подполя и вложение скопируется в новую таблицу, остальные присваивать не надо.
Итого мой код работает и выглядит теперь так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Public Sub Экспорт_данных()
'Открываем базу данных
Set текущаяБазаДанных = CurrentDb
'Для открытия другой базы данных будем использовать
'Set текущаяБазаДанных = OpenDatabase("Экспорт.accdb")
'Инициируем объекты рекордсет
Dim исхТаблица, редТаблица, запРедВложение, запИсхВложение As DAO.Recordset2
 
'Открываем таблицы
Set исхТаблица = текущаяБазаДанных.OpenRecordset("Письма", dbOpenTable)
Set редТаблица = текущаяБазаДанных.OpenRecordset("Экспорт_Письма", dbOpenTable)
    
    'Очищаем таблицу
    Do While Not редТаблица.EOF
        редТаблица.Delete 'удаляем запись
        редТаблица.MoveNext 'переходим к следующей записи
    Loop
    
    'Заполняем таблицу
    'Прогоняем строки записи
    Do While Not исхТаблица.EOF
        редТаблица.AddNew 'добавляем новую запись
            'Перебераем поля записи. Не через коллекцию потому что нужно одновременно использовать ссылку на одно и то же поле но в разных Recordset'ах
            For i = 0 To исхТаблица.Fields.Count - 1
                'Если поле не типа мультизначение
                If Not исхТаблица.Fields(i).IsComplex Then
                    редТаблица.Fields(i) = исхТаблица.Fields(i) 'Присваеваем значение полей
                'Если поле типа мультизначение
                Else
                    'Иницилизируем Recordset'ы в которые передаём наше поле типа вложение
                    'Это и есть основное отличие - этот тип поле преедаётся на обработку в объект типа Recordset
                    Set запИсхВложение = исхТаблица.Fields(i).Value
                    Set запРедВложение = редТаблица.Fields(i).Value
                    'Перебераем все вложения нашего поля (вдруг там не один файл)
                    Do While Not запИсхВложение.EOF
                        запРедВложение.AddNew 'добавляем новое вложение
                        'Присваиваеми вложения одной таблицы в другую
                        запРедВложение.Fields("FileData").Value = запИсхВложение.Fields("FileData").Value
                        запРедВложение.Fields("FileName").Value = запИсхВложение.Fields("FileName").Value
                        запРедВложение.Update 'обновляем добавленное вложение
                        запИсхВложение.MoveNext 'переходим к следующему вложению
                    Loop
                    'Закрываем Recordset'ы
                    запИсхВложение.Close
                    запРедВложение.Close
                End If
            Next i
        редТаблица.Update 'обновляем изменённую запись
        исхТаблица.MoveNext 'переходим к следующей записи
    Loop
'Закрываем таблицы
исхТаблица.Close
редТаблица.Close
End Sub
Вопрос: Присвоение значению поля значение поля другой формы

Подскажите, плиз как реализовать, чтобы при нажатии кнопки "Заказать у поставщика2" на форме "Заказ", значение поля "Артикул2" принимало значение из другой формы. пример прилагаю. Не могу разобраться с орфографией написания кода.
Заранее спасибо
Ответ: Спасибо за ответ Вячеслав.
Идея не такая,но ваш подход мне тоже понравился, задача была с помощью формы:
1 лишить пользователя машинально изменить существующий заказ
2 При создании нового заказа, заносить номер заказа через дополнительную форму
3 Дать возможность изменить номер заказа, даже если он уже существует через эту же дополнительную форму
Я самоучка, все меотодом околонаучного тыка делаю, уж извините...
Мне нужно понять алгоритм присвоения значения поля одной формы из поля другой.
Вопрос: Есть таблица, где значение поля "номера строки" делятся без остатка на произвольное число. Запрос такой?

SQL
1
2
DELETE FROM TAB1
WHERE ID%n=0
Добавлено через 14 минут
Не дописал в задании: нужно удалить те значения поля
Ответ:
Сообщение от Alek70694
нужно удалить те значения поля
DELETE удаляет строку. Если нужно "удалить значение поля" (хотя обычно так не говорят), то
SQL
1
2
3
UPDATE tab1
SET fld1 = NULL
WHERE ...
Вопрос: Указание диапазонов/значений поля заголовка столбца перекрёстного запроса

Столкнулся с тем, что, при использовании функции IIf в качестве указания диапазонов\значений поля заголовка столбца перекрёстного запроса, можно делать только 14 "вложений". Как это можно одолеть?
P.S. Access 2003
Для примера: в качестве имени столбца выводятся года в диапазоне\значениях <=14;15;16;...;29;>=30 (т.е. 17 "вложений").
Спасибо.
Ответ: даты только строго по указанным годам (возрасту), а там, млин, я в примере убрал: "Поле3" это обрезанное значение поля "ДР".
Так стоп, это лучше сразу было б "возраст" в "Поле3" считать, я про то что не год и пересчитывать.

Добавлено через 33 минуты
всем спасибо, вопрос закрыт, свои ошибки понял
особенно спасибо mobile за ответ, как раз он то и наставил на путь истинный.
Вопрос: Суммирование значений полей

Здравствуйте имеется эдемент Список, которые принимает некоторые значения
Visual Basic
1
2
3
4
5
6
7
Private Sub NienieEeeaioia_AfterUpdate()
Dim s
s = "select name, number, year from list where name='" & Me.name.Column(0) & "'"
Me.Nienie.RowSource = s
Me.Nienie41.RowSource = s
 
End Sub
Подскажите пожалуйста как можно суммировать значения поля number?
Ответ:
Сообщение от parkito
как можно суммировать значения поля number?
Можно в этой же процедуре. В переменную уровня модуля формы или в свободное поле формы. В примере в переменную. Считается, что переменная Summa объявлена как публичная или уровня формы
Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub NienieEeeaioia_AfterUpdate()
Dim s
s = "select name, number, year from list where name='" & Me.name.Column(0) & "'"
Me.Nienie.RowSource = s
Me.Nienie41.RowSource = s
Summa=currentdb.openrecordset("select sum(number) from (" & s & ")").fields(0)
'Или в свободное поле
Me.Поле=currentdb.openrecordset("select sum(number) from (" & s & ")").fields(0)
End Sub
Добавлено через 5 минут
Конечно можно было бы обойти в цикле все записи рекордсета списка и суммировать значения. Но это дольше чем запросом
Вопрос: Выводит код вместо значений поля, при использовании промежуточной таблицы

Столкнулся с такой проблемой, уже чего только не перепробовал, ищу дельного совета.
Пишу курсач, создаю в делфи оконное приложение-магазин по продаже телефонов. Базу создаю в Access.
Есть:
1. Таблица "поступление". в ней поля(производитель=Samsung,Nokia,Lg; модель=s8,redmi 5,q6, цена поступления, количество, дата поступления). Информация в поля (Производитель и модель) берется из таблицы "Товары" и должно однозначно определяться парой производитель/модель

2. Таблица "товары" имеет поля: Производитель, модель, страна производства, камера, память и проч. тех хар-ки. Значения полей в эту таблицу методом подстановки перетекают из соответствующих таблиц, в которых перечислен весь список вариантов, допустим, таблица Производитель: Samsung, Sony, lg. Память: 8,16,32,64,128.

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

В моем случае таблица "товары" является промежуточной, она формирует конкретный набор значений полей, который свойствен конкретному телефону[samsung s8 - это конкретный набор]. В этом проблем нет. Проблема заключается в другом, а именно, когда я в таблице "поступление" обращаюсь к таблице "товары" через мастер подстановок, желая увидеть в полях "производитель" название, к примеру Samsung, и в поле "модель" тоже значение, например s8, вижу коды. Это беда
Оно то может и правильно, но только пользователю работать с кодом совсем не удобно и не понятно. как вывести конкретные значения полей? Уповаю на профессионала, покуда голову сломал уже в поисках решения
Ответ: да, огонь!, хотя поля "характеристики" при поступлении не важны, а вот при подборе товара они в самый раз

Добавлено через 4 минуты
Тогда несколько вопросов:
1. В делфи можно обратиться к формам, созданным в access? я изначально полагал, что делфи сама их создает, подгружая таюлицы
2. можно ли по коду в нашем случае товара получить значения определенных полей в таблице?
Вопрос: Как получить значение поля счетчика после добавления через rst.AddNew ?

Добрый день всем.

Есть таблица, в ней, само собой, первое поле - Код (счетчик), и несколько других.
Через код VBA добавляю в данную таблицу новую строку (через метод AddNew), заполняю поля, делаю метод Update.
При этом значение поля со счетчиком добавляется само.
Насколько я понимаю, при добавлении текущая строка рекордсета не меняется (проверял через AbsolutePosition).

Вопрос: как мне получить то значение, которое было автоматически присвоено полю Код (счетчик)? Учитывая, что добавленная строка, я так понимаю, не становится текущей (и в учебнике читал, что после метода Update текущей становится строка, которая была текущей до добавления).
Пытался "поймать" это значение в момент ДО обновления - так его на тот момент просто еще нет, я так понимаю...

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

Может, я придумал себе проблему на пустом месте?) Буду признателен за советы.
Ответ: Вопрос снимается. Неправильно "ловил" значение. Таки оно добавляется еще до метода Update, и его можно запросто взять.

Добавлено через 1 минуту
mobile, Спасибо, я как раз уже и сделал по первому из тех способов, которые там перечислены. Но все равно полезно почитать про другие.
Вопрос: Значение полей по умолчанию : "нет значения поля по умолчанию"; "Null";"0"

Форумчане, доброго времени суток!
Подскажите. пожалуйста, как правильно указывать значение поля по умолчанию в таблице Аксесс 2003??
"нет значения поля по умолчанию"; "Null";"0"
При переносе на MySQL выявилось такое безобразие. В аксессе все работает. В MySQL заработает ли ?
Что с этим делать?
Прошу по возможности описать подробнее.
Спасибо!
Ответ: ankan, в выложенном доке нет никаких указаний на дефолтные значения. Сообщения об ошибках только о повторяющемся таймстампе. Мне кажется, что вина сторонней программы-конвертора. Похоже, что она в числовых полях ставит значение по умолчанию равным 0 если не задано иное. Тогда, если продолжите пользоваться именно этим конвертором, действительно придется писать Null для дефолтных значений
Вопрос: Запрос на совпадение с одним из нескольких значений поля

Как сделать запрос, который выводит записи одной таблицы, определенное поле которого содержит значение, соответствующее любому из значений поля с несколькими значениями другой таблицы? Есть база данных квартир и заявок по ним. Таблица"Квартиры" имеет поле "район" с уникальным значением (квартира находится в одном районе). А таблица "Заявки" имеет поле "район" с несколькими значениями (клиент ищет квартиру в разных районах). Нужно сделать запрос который вы выдает все квартиры, которые подходят для заявки. То есть если клиент ищет квартиры районах: Ленинский, Октябрьский и Кировский, то запрос выдавал бы все квартиры которые находятся в этих районах.
Ответ: Вдогонку:
Dramsky
В таблице "Заявки" поле "Районы" у первого клиента выглядит так: "Октябрьский;Советский", у второго "Ленинский", у третьего "Ленинский; Октябрьский; Советский"
Многозначные поля есть очень не хорошо-честней и правильней подчиненная таблица (не говоря уже о том что в 2003,который еще используется, все связанное с многозначными полями работать не будет, а собрать строку-это просто)
Вопрос: Значение поля RDB$RELATION_TYPE в таблице RDB$RELATIONS is null

Добрый день.

Для некоторых обычных таблиц в RDB$RELATIONS значение поля RDB$RELATION_TYPE is null, хотя по идее должно быть 0.

В частности, к таким таблицам относятся IBE$VERSION_HISTORY и IBE$PARAMS_HISTORY.

Допустимы ли для этого поля значения is null?
Если да, то эквивалентен ли null значению 0?
Ответ:
Polesov
Если да, то эквивалентен ли null значению 0?

в системных таблицах - да. Это такой застарелый привет от Джима.