c yberforum.ru
VBA при удалении ключевого поля выдать MsgBox - MS Access
10-15 минут
@TopolM
1 0
/
10
/
2
Регистрация: 31.03.2013
Сообщений: 107 |
|
|
|
[В закладки ] [Окно ответа] #1 |
03.04.2013, 11:11. Просмотров 742. Ответов 5
Метки нет
(
Все метки
)
Столкнулся с такой проблемой мне нужно удалять поля в таблицах, всё это прекрасно работает, но нужно ещё предусмотреть то, если пользователь пытается удалить ключевое поле, то чтоб место окна ошибки компилятора выдавало сообщение MsgBOx.
PureBasicВыделить код |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 |
Private Sub Del_Fil_Click() '--------------Обработчик удаления--------------------------------------////
If IsNull(Show_Tb) Then
MsgBox "не выбрана ТБ", vbOKOnly
Exit Sub
End If
If IsNull(Show_Fil) Then
MsgBox "Не выбрано поле", vbOKOnly
Exit Sub
End If
Dim Message, Ocno
Dim dbs As Database, tdf As TableDef, fld As Field
Set dbs = CurrentDb
Set tdf = dbs.TableDefs(Show_Tb.Value)
Message = "Удалить" + Show_Fil.Value + "?"
Ocno = MsgBox(Message, vbYesNo)
If Ocno = vbYes Then
tdf.Fields.Delete (Me.Show_Fil.Value)
If Err.Number = 3303 Then MsgBox "Нельзя удалить поле по ошибке 3303",vbOKOnly
tdf.Fields.Refresh
Show_Fil.RowSource = Show_Tb
End If | |
| |
|
0 |
mobile
2 1737
/
12346
/
2455
Регистрация: 28.04.2012
Сообщений: 13,561 |
|
|
03.04.2013, 13:58 VBA при удалении ключевого поля выдать MsgBox |
[В закладки ] [Окно ответа] #2 |
Если интересует именно первичный ключ и вы знаете имя поля, то проверить можно так
Visual BasicВыделить код |
1 |
If Instr(currentdb.TableDefs("ИмяТаблицы").Indexes("PrimaryKey").Fields, "ИмяПоля")>0 Then | |
|
Добавлено через 2 часа 2 минуты
Впрочем, ваc, кажется, интересует обход ошибки, а не именно примарикеу. В процедуре не хватает OnError
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 |
Private Sub Del_Fil_Click() '--------------Обработчик удаления--------------------------------------////
On error goto errend
If IsNull(Show_Tb) Then
MsgBox "не выбрана ТБ", vbOKOnly
Exit Sub
End If
If IsNull(Show_Fil) Then
MsgBox "Не выбрано поле", vbOKOnly
Exit Sub
End If
Dim Message, Ocno
Dim dbs As Database, tdf As TableDef, fld As Field
Set dbs = CurrentDb
Set tdf = dbs.TableDefs(Show_Tb.Value)
Message = "Удалить" + Show_Fil.Value + "?"
Ocno = MsgBox(Message, vbYesNo)
If Ocno = vbYes Then
tdf.Fields.Delete (Me.Show_Fil.Value)
tdf.Fields.Refresh
Show_Fil.RowSource = Show_Tb
End If
NoErr:
Exit Sub
errend:
Select Case Err.Number
Case 3303
MsgBox "Нельзя удалить поле по ошибке 3303",vbOKOnly
Case Else
MsgBox Err.Number, Err.Descripton
End Select
Resume NoErr
End Sub | |
|
__________________ mailto: mobilegen@mail.ru |
|
1 |
@minob
3 529
/
1103
/
94
Регистрация: 13.03.2011
Сообщений: 1,513 |
|
|
03.04.2013, 15:38 VBA при удалении ключевого поля выдать MsgBox |
[В закладки ] [Окно ответа] #3 |
Сообщение от
mobile
Если интересует именно первичный ключ и вы знаете имя поля, то проверить можно так
Visual BasicВыделить код |
1 |
If Instr(currentdb.TableDefs("ИмяТаблицы").Indexes("PrimaryKey").Fields, "ИмяПоля")>0 Then | |
|
Наверное, я чего-то недопонял.
Создал таблицу Tab с двумя полями Id_txt - счетчик, ключевое и txt - текстовое.
Проверяю поле Id_txt
Visual BasicВыделить код |
1
2 |
?Instr(currentdb.TableDefs("Tab").Indexes("PrimaryKey").Fields, "Id_txt")
2 | |
|
т.к. 2>0, то поле Id_txt - ключевое, что соответствует действительности.
Проверяю поле txt
Visual BasicВыделить код |
1
2 |
?Instr(currentdb.TableDefs("Tab").Indexes("PrimaryKey").Fields, "txt")
5 | |
|
т.К. 5>0, то поле txt - также ключевое, что не соответствует действительности. |
|
1 |
mobile
2 1737
/
12346
/
2455
Регистрация: 28.04.2012
Сообщений: 13,561 |
|
|
03.04.2013, 16:14 VBA при удалении ключевого поля выдать MsgBox |
[В закладки ] [Окно ответа] #4 |
Исправим
Visual BasicВыделить код |
1
2 |
?instr(currentdb.TableDefs("tab").Indexes("PrimaryKey").Fields, "+" & "txt")
0 | |
|
Добавлено через 1 минуту
Visual BasicВыделить код |
1
2 |
?instr(currentdb.TableDefs("tab").Indexes("PrimaryKey").Fields, "+" & "Id_txt")
1 | |
|
Добавлено через 13 минут
Но правильнее будет просматривать коллекцию
Visual BasicВыделить код |
1
2
3
4
5
6
7
8
9
10
11
12 |
Public Function indf(tbl, fld)
Dim i, db As DAO.Database
Set db = CurrentDb
indf = False
With db.TableDefs(tbl).Indexes("PrimaryKey")
For i = 0 To .Fields.Count - 1
If .Fields(i).Name = fld Then
indf = True
End If
Next
End With
End Function | |
|
Visual BasicВыделить код |
1
2 |
?indf("tab","txt")
False | |
|
Добавлено через 7 минут
Нахождение имени ключевого поля с помощью Instr действительно может дать ложные совпадения. Проход по коллекции полей дает точный ответ
__________________ mailto: mobilegen@mail.ru |
|
1 |
@TopolM
1 0
/
10
/
2
Регистрация: 31.03.2013
Сообщений: 107 |
|
|
03.04.2013, 20:44 [ТС] VBA при удалении ключевого поля выдать MsgBox |
[В закладки ] [Окно ответа] #5 |
mobile
Не могли бы вы пояснить зачем необходима данная строка? (не могу точно уловить), мне кажется для обработки других кодов ошибок?
Visual BasicВыделить код |
1
2 |
Case Else
MsgBox Err.Number, Err.Descripton | |
| |
|
0 |
mobile
2 1737
/
12346
/
2455
Регистрация: 28.04.2012
Сообщений: 13,561 |
|
|
03.04.2013, 20:53 VBA при удалении ключевого поля выдать MsgBox |
[В закладки ] [Окно ответа] #6 |
TopolM, ну это как бы на всякий случай. Мало ли, что может быть... У меня в рабочих проектах в каждой (!!!) процедуре обязательно вставлен обработчик ошибок. Где есть, в том числе Case Else на всякий случай. И все сообщения об ошибках обязательно пишутся в лог. Если что-то случится, то всегда будет какой-то минимум "информации для размышления!" (с)
__________________ mailto: mobilegen@mail.ru |
|
1 |
|