powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Отследить изменения на закрытие и отмену формы
19 сообщений из 94, страница 4 из 4
Отследить изменения на закрытие и отмену формы
    #39502988
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23Но я так же хотела сказать, что проверку поля из первой таблицы так не сделать, потому что записи у меня добавляются путем присваивания поля со счетчиком из первой таблицы, связанному полю из второй таблицы для последующих записей. Я все время пытаюсь это сказать, вот код того как идет добавление:
Код: vbnet
1.
2.
3.
    lng_id = Me.id.Value
    DoCmd.GoToRecord , , acNewRec
    Me.id.Value = lng_id


Поэтому в моем случае проверка поля «applType» для первой таблицы, всегда будет сообщать об ошибке - значение всегда будет совпадать с данными в поле.
Разве здесь я не права?
При создании записи таким образом:
- в таблице applications запись не добавляется, а редактируется(если, конечно, пользователь внесет изменения)
- в таблице applDetails будут добавляться новые записи.
Соответственно код вот этой проверки:
Код: vbnet
1.
2.
3.
4.
5.
6.
    'Проверим applType на повторения
    If Not IsNull(DFirst("id", "applications", "applType=" & Me.applType)) Then
        MsgBox "Значение applType = " & Me.applType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
        Cancel = True
        Exit Sub
    End If



нужно переписать. Т.к. то, что я написал для редактирования существующей записи(таблицы applications) не подходит.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502989
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и вторую проверку тоже нужно переписать :)
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502996
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
например, так:
Код: 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.
36.
37.
38.
39.
40.
    'Проверим заполнено ли applType
    If IsNull(Me.applType) Then
        MsgBox "Не задано значение applType." & vbCr & vbCr & "Задайте applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
        Cancel = True
        Exit Sub
    End If
    
    'Проверять заполнено ли detailsType не надо - оно не обязательно к заполнению
  
    'Проверим applType на повторения
    If Me.NewRecord Then
        If Not IsNull(DFirst("id", "applications", "applType=" & Me.applType)) Then
            MsgBox "Значение applType = " & Me.applType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
            Cancel = True
            Exit Sub
        End If
    Else
        If Not IsNull(DFirst("id", "applications", "applType=" & Me.applType & " and id<>" & Me.id)) Then
            MsgBox "Значение applType = " & Me.applType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
            Cancel = True
            Exit Sub
        End If
    End If
  
    'Проверим detailsType на повторения
    If Not IsNull(Me.applType) Then
        If Me.NewRecord Then
            If Not IsNull(DFirst("applID", "applDetails", "detailsType=" & Me.detailsType)) Then
                MsgBox "Значение detailsType = " & Me.detailsType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение detailsType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
                Cancel = True
                Exit Sub
            End If
        Else
            If Not IsNull(DFirst("applID", "applDetails", "detailsType=" & Me.detailsType & " and applID<>" & Me.applID)) Then
                MsgBox "Значение detailsType = " & Me.detailsType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение detailsType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
                Cancel = True
                Exit Sub
            End If
        End If
    End If



кстати, хоть вам это сейчас и не интересно, я, думаю, что можно будет заблокировать крест и в tabbed интерфейсе. Будет время - попробую.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503006
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей,
решила уточнить, протестила Ваш код, все равно проверял и выдавал ошибку, я правда с ориентировалась и поменяла местами прописанный блок условия запросов в «Проверим applType на повторения» и «Проверим detailsType на повторения». Вроде срабатывает теперь как надо и отлавливает ошибку когда надо:

Код: 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.
36.
37.
38.
39.
40.
    'Проверим заполнено ли applType
    If IsNull(Me.applType) Then
        MsgBox "Не задано значение applType." & vbCr & vbCr & "Задайте applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
        Cancel = True
        Exit Sub
    End If
    
    'Проверять заполнено ли detailsType не надо - оно не обязательно к заполнению
  
    'Проверим applType на повторения
    If Me.NewRecord Then
        If Not IsNull(DFirst("id", "applications", "applType=" & Me.applType & " and id <>" & Me.id)) Then '- поменяла местами блок условия, иначе все равно срабатывал отлов ошибки
            MsgBox "Значение applType = " & Me.applType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
            Cancel = True
            Exit Sub
        End If
    Else
        If Not IsNull(DFirst("id", "applications", "applType=" & Me.applType)) Then
            MsgBox "Значение applType = " & Me.applType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
            Cancel = True
            Exit Sub
        End If
    End If
  
    'Проверим detailsType на повторения
    If Not IsNull(Me.applType) Then
        If Me.NewRecord Then
            If Not IsNull(DFirst("applID", "applDetails", "detailsType=" & Me.detailsType & " and applID <>" & Me.applID)) Then '- поменяла местами блок условия, иначе все равно срабатывал отлов ошибки
                MsgBox "Значение detailsType = " & Me.detailsType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение detailsType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
                Cancel = True
                Exit Sub
            End If
        Else
            If Not IsNull(DFirst("applID", "applDetails", "detailsType=" & Me.detailsType)) Then
                MsgBox "Значение detailsType = " & Me.detailsType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение detailsType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
                Cancel = True
                Exit Sub
            End If
        End If
    End If




Вакшуль Сергейкстати, хоть вам это сейчас и не интересно, я, думаю, что можно будет заблокировать крест и в tabbed интерфейсе. Будет время - попробую.
Если честно, то очень интересно, не откажусь и от такого варианта знать как это возможно было бы реализовывать. И если что приму участие в тестировании.

Спасибо Вам еще раз за огромную помощь мне, за потраченное время в решении для меня двух больших проблем.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503008
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и напоследок,
насчет классов - 20706929
Не знаю, будете ли применять, но если да, то выкладываю последнюю их версию. Используйте этот код.
Все-таки тогда делал впопыхах, кое-что нужно было подправить (обработку откатов событий - Cancel=true).

Там важный момент - порядок инициализации:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub Form_Open(Cancel As Integer)
    'Подключим и настроим поведенческие классы
    'Порядок инициализации классов должен быть именно таким: сначала exitDlg, а потом уже cbbHandler и cmdButtons
    '
    exitDlg.Initialize Me       'Класс диалога по ESC нужно инициализировать первым. Только в этом случае управление доступом к кнопке закрытия окна(Х) будет работать корректно
    cbbHandler.Initialize Me
    cmdButtons.Initialize Me
    
    Set cmdButtons.SaveButton = Me.Кнопка12
    Set cmdButtons.newButton = Me.newButton
    Set cmdButtons.deleteButton = Me.deleteButton
End Sub
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503235
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль СергейНе знаю, будете ли применять, но если да, то выкладываю последнюю их версию. Используйте этот код.
Обязательно буду, хочу разобраться в Вашем примере, спасибо. Это очень грамотный и талантливый подход, я это сразу поняла, как только Вы его предложили. Мне это очень интересно, главное разобраться.
Сергей в тысячный раз выражаю Вам свою благодарность за помощь в решении непосильной для меня проблемы, за пример и потраченное время на все вместе взятое.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503277
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,

в принципе ваши таблицы --это вариант накладных
--есть головная часть(не повторяются)
--и может быть табличная часть
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503283
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,

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

если добавить в ключ дату --то это приведет к запрету повтора товарной позиции в данной накладной
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503330
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,

пример прилагаю
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503332
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503637
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА,
прошу меня извинить, что отвечаю с опозданием, разбираюсь в коде Сергея и попутно пытаюсь привести свой код в порядок.
Спасибо, что тоже заинтересовались моей темой. Я просмотрела Ваш пример, но тут есть некоторые нюансы, которые были согласованы с заказчиком. Форма для заполнения должна быть как можно проще для пользователей - не иметь ни лишних дополнительных кнопок, ни тем более дополнительных всплывающих форм для другого какого-либо ввода. Им нужно, чтобы заполнение данными было в одной простой форме. Я даже по этому не стала делать форму с подчиненной формой.
С моей стороны в этом отношении просьба была выполнена - простая форма, кнопок по минимуму (сохранить, добавить, ну и кнопки переходов по записям для просмотра).

Вы писали:
ПЕНСИОНЕРКАесли добавить в ключ дату --то это приведет к запрету повтора товарной позиции в данной накладной
Не сильно поняла Вашу мысль. То что акс отлавливает в моих 2-х полях ошибку это и есть запрет повтора, аксес таким образом и пытается сказать пользователю, что в этих полях должно быть значение уникальным. Моя же проблема была связана с тем, что после срабатывания ошибки аксес не удерживает текущую запись, чтобы юзер мог исправить.
До того момента, как Сергей помог мне с запросом я пыталась осуществлять проверку перед сохранением, и кстати говоря в общем смысле, я шла то в правильном направлении, но только код моей проверки, который я пыталась изначально использовать не совсем подходил для моего варианта работы формы. Я приводила здесь пример своего кода, который нарыла в нете: 20703030
А здесь Сергей хорошо разъяснил момент, который происходит у меня на самом деле: 20712254
и в конечном итоге помог с запросом.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503659
хм-м-м
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nataxa23но только код моей проверки, который я пыталась изначально использовать не совсем подходил для моего варианта работы формы.
Я приводила здесь пример своего кода, который нарыла в нете:
Код: vbnet
1.
2.
3.
dim s
s="select count(*) from t where f = 'MyCriteria'"
if currentproject.connection.execute(s).fields(0)=0 then msgbox "Нет данных"


Уж подобное надо делать без запинки самостоятельно.
А не нарывать в нете.
Какое-то тяжелое впечатление производит вся эта страшно многословная тема.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503937
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23Форма для заполнения должна быть как можно проще для пользователей - не иметь ни лишних дополнительных кнопок, ни тем более дополнительных всплывающих форм для другого какого-либо ввода
не могу припомнить какой-то тупости у исполнителей
--две минуты пояснений при установке им всегда было достаточно
--затем они обычно спрашивали, а можно ли добавить некие плюшечки типа фильтра/поиска/распечатки

конечно я делала работу с повтором немного по другому(не люблю системную ругань, обычно пишу свою)

например в вашем случае возможно применила бы форму1 с подчиненной формой2
--ввожу в свободное поле формы1 значение для первой таблицы
-----если найдено --высвечиваю запись из первой таблицы и в подчиненной форме --записи из второй(если есь)
-----если не найдено --запрос добавить запись в таб1 или отказаться
--ввожу в свободное поле формы1 значение для второй таблицы
-----если не нашла --добавляю
-----если нашла показываю предупреждение, что запись во второй таблице и даю возможность оператору исправиться(при этом он видит в подчиненной форме, а что же уже есть в таблице2 по заданному полю из таблицы1)
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39504317
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimportВакшуль Сергейguest_rusimport,

я с наскока не нашел API код, который может заблокировать крестик, если приложение работает в tabbed интерфейсе.
также не нашел код, который может заблокировать крестик у формы, развернутой на весь экран(не всплывающей), при работе в традиционном ранее оконном интерфейсе(не tabbed).
Если найдете источник, поделитесь, пожалуйста. Хотелось бы добить тему.
Здравствуйте, Сергей! Поиски не увенчались успехом, хотя вопросы такие встречал, именно апишного решения не нашел. Хотя мне это кажется странным, ведь должно же оно быть. Но к сожалению сам не силен в этом вопросе. Тоже было бы интересно посмотреть решение.

Я еще поковырял тему, но не очень успешно.
До самого креста через API я не добрался. Дело в том, что и сам крест, и ярлычки вкладок, и серая область, на которой они лежат, являют собой единое окно, с одним дескриптором. До этого окна я дохожу, двигаясь от главного окна Access вниз, используя
Код: vbnet
1.
GetWindow(hwndCurrent, GW_CHILD)

и
Код: vbnet
1.
GetWindow(hwndCurrent, GW_HWNDNEXT)


или просто сразу из формы вот так:
Код: vbnet
1.
2.
3.
4.
    'Узнаем координаты окна формы
    lRetr = apiGetWindowRect(Me.hWnd, lpRect)
    'Получим дескриптор окна нужной области
    xHandle = apiWindowFromPoint(lpRect.Left + 1, lpRect.Top - 1)


а потом блокирую:
Код: vbnet
1.
2.
    'Скроем окно
    ShowWindow xHandle, SW_HIDE



В результате получается, что блокируется не только крест, но и все ярлычки. Т.е. нельзя переключится на другую форму, пока не разблокируешь:
Код: vbnet
1.
2.
    'Покажем окно
    ShowWindow xHandle, SW_SHOWNA



Собственно это и все, чего смог добиться. Не нравится.
На картинке ниже в окне Spy++ видно блокируемое окно. Видно, что внутрь уже не войдешь :(
А Inspect.exe легко доходит до креста(тоже видно на картинке). Inspect.exe использует UI Automation:
https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009(v=vs.85).aspx
Но как из VBA с ней работать - понятия не имею. Но даже если бы и смог, то нужны будут библиотеки, которые нужно за собой тащить. Короче, цель средства не оправдывает.

Хотя, возможно, это просто я не в курсе, как от этого окна(область ярлычков с крестиком) добраться до креста и взять его под контроль.
Если у кого-то есть идеи, было бы интересно послушать.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39504331
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро, Сергей
а так попробуйте, по идее, для найденного дескриптора окна должен заблокироваться только крестик
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
    Dim lRetr As Long, xHandle As Long, lngMenu As Long
    Dim lpRect As typRect
    'Узнаем координаты окна формы
    lRetr = apiGetWindowRect(Me.hwnd, lpRect)
    'Получим дескриптор окна нужной области
    xHandle = WindowFromPoint(lpRect.Left + 1, lpRect.Top - 1)

    lngMenu = GetSystemMenu(xHandle, 0)
    Call DeleteMenu(lngMenu, 6, MF_BYPOSITION)


где
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Declare Function apiGetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hwnd As Long, lpRect As typRect) As Long
Private Type typRect
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Integer, ByVal yPoint As Integer) As Integer
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal wRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Const MF_BYPOSITION = &H400
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39504357
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе утро, guest_rusimport :)

Код: vbnet
1.
lngMenu = GetSystemMenu(xHandle, 0)


lngMenu в результате будет равно 0, т.е. ссылку на системное меню мы не получим.
У этого окна нет доступного системного меню. Но, даже если с помощью GetSystemMenu того "единого" окна мы и получили бы ссылку на его системное меню, то его крест(Close button) это не тот крест, который нам нужно заблокировать.
Я так понимаю, что крест, закрывающий вкладки, это не Close button обычного окна Windows. Это контрол.
Т.е. та область, на которую мы получили дескриптор:
Код: vbnet
1.
2.
    'Получим дескриптор окна нужной области
    xHandle = WindowFromPoint(lpRect.Left + 1, lpRect.Top - 1)


это в терминах Access - подчиненная форма, на которой лежат контролы управления:область для ярлычков, сами ярлычки и та самая заветная кнопка "крестик", управляющая видимостью ярлычков. Как до нее добраться и контролировать, я не знаю.

Как возможное направление решения главной задачи(выдать сообщение по клику на область "креста"), думаю, можно получить примерные координаты кнопки "крест", а дальше, отловить клик. Допустим клик отловили, но можно ли его отменить и как - я не знаю, нужно разбираться. Почему я говорю "примерные координаты", потому, что если вертикальные размеры мы знаем, то горизонтальные - нет.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39504380
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вакшуль СергейДопустим клик отловили, но можно ли его отменить и как - я не знаю, нужно разбираться.
Посмотрел - да, можно. Нужно будет оформить это в код
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39504406
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С точки зрения использования 2003 акса было бы интересно посмотреть это решение -
Вакшуль Сергей... код, который может заблокировать крестик у формы, развернутой на весь экран(не всплывающей), при работе в традиционном ранее оконном интерфейсе(не tabbed)...
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39516078
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimportС точки зрения использования 2003 акса было бы интересно посмотреть это решение -
Вакшуль Сергей... код, который может заблокировать крестик у формы, развернутой на весь экран(не всплывающей), при работе в традиционном ранее оконном интерфейсе(не tabbed)...

получилось, но есть и ложка дегтя:
20774213
...
Рейтинг: 0 / 0
19 сообщений из 94, страница 4 из 4
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Отследить изменения на закрытие и отмену формы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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