MyTetra Share
Делитесь знаниями!
VBA при удалении ключевого поля выдать MsgBox - MS Access
16.03.2019
23:43
Текстовые метки: VBA, CreateDataBase, создание базы данных
Раздел: !Закладки - VBA - Access - CreateDataBase

cyberforum.ru

VBA при удалении ключевого поля выдать MsgBox - MS Access

10-15 минут



@TopolM

 

10

/

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

21737

/

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

3529

/

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

21737

/

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

 

10

/

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

21737

/

12346

/

2455

Регистрация: 28.04.2012

Сообщений: 13,561

03.04.2013, 20:53     VBA при удалении ключевого поля выдать MsgBox

[В закладки] [Окно ответа] #6

TopolM, ну это как бы на всякий случай. Мало ли, что может быть...
У меня в рабочих проектах в каждой (!!!) процедуре обязательно вставлен обработчик ошибок. Где есть, в том числе Case Else на всякий случай. И все сообщения об ошибках обязательно пишутся в лог. Если что-то случится, то всегда будет какой-то минимум "информации для размышления!" (с)

__________________
mailto: mobilegen@mail.ru

1


Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования