powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Обработка BeforeUpdate во время NotInList
17 сообщений из 17, страница 1 из 1
Обработка BeforeUpdate во время NotInList
    #39365099
VeraK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня!
Снова прошу помощи, никак мне не победить эту штуку..

Смысл в том, что юзеры повадились вводить новые товары с пробелами в начале.
Я ставлю Trim в процедуре NotInList.
Если после Trim оказывается, что товар уже есть, то нужно его выбрать в комбобоксе.
Если нет - то оттриммить и добавить через форму acDialog.
Через тернии я вроде поняла примерно, как должен работать код, но теперь новая проблема.

У меня стоит проверка комбобокса BeforeUpdate. Если эту проверку товар не проходит, то NotInList стопорится с ошибкой, причём ошибки выдаёт разные... Мне надо, чтобы вновь созданный товар нельзя было выбрать в комбо, если не пройдена проверка.

Не знаю, понятно ли объясняю (( Может, меня вообще не в ту степь занесло?
Если использовать ctl = NewData вместо ctl.Text = NewData, то BeforeUpdate не возникает.
Если использовать acDataErrAdded, то ошибка вылезает, что отсутствует в списке.

Код ниже, пример в приложении. Проблема при добавлении товара типа ' Пельмени 5' или ' Пельмени 19' с пробелом в начале.

Код: vbnet
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.
Private Sub ВидПельменей_BeforeUpdate(Cancel As Integer)
    MsgBox "До обновления. Такое значение нельзя добавить."
    Cancel = True
    ВидПельменей.Undo
End Sub

Private Sub ВидПельменей_NotInList(NewData As String, Response As Integer)
    Dim ctl As Control
    Set ctl = Me.ActiveControl
    NewData = Trim(NewData)
    If DCount("ВидПельменей", "Пельмени", "ВидПельменей='" & NewData & "'") > 0 Then
        ctl.Undo
        ctl.Text = NewData
        Response = acDataErrContinue
        GoTo ExitSub
    End If
    If MsgBox("'" & NewData & "'" & " отсутствует в каталоге." & vbNewLine & "        Добавить?", vbYesNo) = vbYes Then
        DoCmd.OpenForm "Пельмени", , , , acFormAdd, acDialog, NewData
        NewData = DLookup("ВидПельменей", "Пельмени", "Код=" & DMax("Код", "Пельмени"))
        ctl.Undo
        ctl.RowSource = ctl.RowSource
        ctl.Text = NewData
        Response = acDataErrContinue
        GoTo ExitSub
    Else
        MsgBox "Выберите из списка."
        With ctl
            .Undo
            .Dropdown
        End With
        Response = acDataErrContinue
    End If
ExitSub:
    Set ctl = Nothing
End Sub
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39365218
Piple0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VeraK,

Как вариант - разбейте выбор и добавление на 2 окна. В комбобоксе оставьте только поиск и выбор. Добавление в справочник - по кнопке, расположенной рядом. Поиск внутри комбобокса я делаю так:
Код: vbnet
1.
2.
3.
4.
5.
Private Sub ПоискКлиент_NotInList(NewData As String, Response As Integer)
Me.ПоискКлиент.RowSource = "SELECT Код, Название FROM Клиенты where Название like '*" & NewData & "*'"
Response = 0
Me.ПоискКлиент.Dropdown
End Sub



Для добавления открывается отдельное окно справочника, которое при закрытии рефрешит комбобокс, и проставляет в него только что добавленное значение.
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39365225
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VeraK,
как вариант
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39365309
VeraK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Piple0,
вариант, хотя и не очень удобный, форма табличная и кнопку сбоку городить не очень удобно. Но, возможно, придётся так сделать, спасибо!
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39365310
VeraK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,

в вашем примере у меня тоже не получается добавить товар с пробелом в начале, который потом убирается - та же ошибка об отсутствии в списке (
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39365326
Piple0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно без кнопки открывать форму ввода. У комбобокса стандартное свойство есть - форма, открываемая для добавления данных, если значения нет в списке.
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39365354
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Piple0Можно без кнопки открывать форму ввода. У комбобокса стандартное свойство есть - форма, открываемая для добавления данных, если значения нет в списке.Не на всех версиях. Появилось недавно.
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39365378
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бред то какой.

К чему фсе эти сложносочиненности?
Удаляйте пробелы в событии контрола Изменение.
И не трахайте мозг.
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39365444
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VeraK,
немного кривовато, но Ваша "хотелка" выполнится после добавления этого;
Код: vbnet
1.
2.
3.
4.
5.
6.
Private Sub пельмени_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 32 And (Len(Me.пельмени.Text) = 0 or Me.пельмени.Text= " ") Then
MsgBox "первым символом не может быть пробел"
SendKeys ("{LEFT}")
End If
End Sub
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39365450
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вернее так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Private Sub пельмени_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 32 And (Len(Me.пельмени.Text) = 0 or Me.пельмени.Text= " ") Then
MsgBox "первым символом не может быть пробел"
Me.пельмени = Null
SendKeys ("{LEFT}")
End If
End Sub
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39366178
Александр Маркин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku - любитель месаг?
----------------------------------------

на событие чанге добавь.
Код: vbnet
1.
2.
3.
If Trim(Me![Поле1].Text) = "" Then
Me![Поле1] = ""
End If
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39366315
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VeraKСмысл в том, что юзеры повадились вводить новые товары с пробелами в начале.
Я ставлю Trim в процедуре NotInList.Делайте по-другому.
Просто не позволяйте вводить лидирующие пробелы.
Следующим образом:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
 Dim intShiftDown As Boolean, _
     intAltDown As Boolean, _
     intCtrlDown As Boolean, _
     PKeyConst As Long
 intShiftDown = (Shift And acShiftMask) > 0
 intAltDown = (Shift And acAltMask) > 0
 intCtrlDown = (Shift And acCtrlMask) > 0
 If Me.ActiveControl.Name = "ВидПельменей" Then
  If KeyCode = 32 And Not intAltDown And Not intShiftDown And Not intCtrlDown Then
   If Me.ActiveControl.SelStart = 0 Then
    KeyCode = False
   End If
  End If
 End If
End Sub

Процедуры ВидПельменей_AfterUpdate и ВидПельменей_BeforeUpdate вообще уберите.
Процедуру ВидПельменей_NotInList особо не рассматривала, что-то она мне не очень нравится.
Но пока в задуманном Вами виде она работать будет.
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39366316
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или покороче, без проверки на модификаторы:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
 If KeyCode = 32 And Me.ActiveControl.Name = "ВидПельменей" Then
  If Me.ActiveControl.SelStart = 0 Then
   KeyCode = False
  End If
 End If
End Sub
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39366332
VeraK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Piple0,
да, есть такая возможность, попробовала. Форма открывается на первой записи, а не на новой, это не очень подходит..

aleks2, sdku, Александр Маркин, __Michelle,
при печати с клавиатуры проблема решилась, спасибо.

Теперь при вставке товара с пробелом через Ctrl+V не получается ((
Если обрабатывать его по KeyUp, то событие NotInList не возникает, как, впрочем, и остальные..

Код: vbnet
1.
2.
3.
Private Sub поле1_KeyUp(KeyCode As Integer, Shift As Integer)
    If KeyCode = 86 And Shift = 2 Then Me![поле1]= LTrim(Me![поле1].Text)
End Sub



Если ставить Me![поле1] .Text = LTrim(Me![поле1].Text) - то все события возникают, но рано, пользователь после Ctrl+V ещё впишет, может, что-нить.

P.S. Процедуру BeforeUpdate убрать не могу, там проводится проверка на ввод недопустимого товара (нельзя выбрать два товара одной категории в заказе). Отдельная песня..
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39366334
VeraK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понапихала в итоге обработчики ошибок, вроде работает, надо погонять, не полезут ли другие коды ошибок.
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39366669
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VeraK....Смысл в том, что юзеры повадились вводить новые товары с пробелами в начале.....
Вы хотите предусмотреть ВСЕ "косяки" юзеров-до сих пор это не удавалось (защитившись от одного "косяка" юзеры придумают три новых-процсс защиты от невнимательности и безответственности пользователей стремится к бесконечности..-проще "поотрубать" им руки)
...
Рейтинг: 0 / 0
Обработка BeforeUpdate во время NotInList
    #39367082
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VeraK...Теперь при вставке товара с пробелом через Ctrl+V не получается ((
Если обрабатывать его по KeyUp, то событие NotInList не возникает, как, впрочем, и остальные..Ну-ну...
А если пользователи станут делать вставку не через Ctrl+V, а путем выбора пункта Вставить из контекстного меню?
Чем будете вылавливать лидирующие пробелы? Будете анализировать содержимое буфера обмена API-функциями?
Делайте проще. Вот так.
С учетом порядка наступления событий для поля со списком
KeyDown —> KeyPress —> Dirty —> Change —> KeyUp —> NotInList —> Error
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Sub ВидПельменей_KeyDown(KeyCode As Integer, Shift As Integer)
 If KeyCode = 32 And ВидПельменей.SelStart = 0 Then
  KeyCode = False
 End If
End Sub

Private Sub ВидПельменей_Change()
 If Left(ВидПельменей.Text, 1) = " " Then
  ВидПельменей.Text = LTrim(ВидПельменей.Text)
 End If
 .............................
 .............................
End Sub

И процедура NotInList значительно сокращается:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub ВидПельменей_NotInList(NewData As String, Response As Integer)
 With ВидПельменей
  Response = acDataErrContinue
  If MsgBox("Значение '" & NewData & "'" & " отсутствует в каталоге." & vbNewLine & _
            "Добавить новое значение?", vbExclamation + vbYesNo) = vbYes Then
   DoCmd.OpenForm "Пельмени", , , , acFormAdd, acDialog, NewData
   .RowSource = .RowSource
  Else
    MsgBox "Пожалуйста, выберите значение из списка", vbExclamation + vbOKOnly
   .Undo
   .Dropdown
  End If
 End With
End Sub
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Обработка BeforeUpdate во время NotInList
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]