powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Посоветуйте как спозиционировать курсор в ленточной форме
22 сообщений из 22, страница 1 из 1
Посоветуйте как спозиционировать курсор в ленточной форме
    #39879259
alexko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть ленточная форма и на каждой строке есть кнопка "редактировать"
В вызываемой форме редактирования возможно удаление записи и после её закрытия нужно установить фокус ленточной формы на записи визуально предшествующей удаленной записи. Сама ленточная форма сложно отсортирована - стало быть чтение предыдущей записи через Recordset мало что дает.

Задача - при нажатии на конпку редактирования - нужно определить запись на форме которая на строку выше нажимаемой кнопке . Чтобы в случае удаления записи сделать вменяемый фокус на строке ленточной формы.
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39879262
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Access что ли? Неужели так сложно указывать среду разработки?
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39879459
alexko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sorry! Да ACCESS.

Ключевое поле в главной таблице [Дата ввода]; ленточная форма это formL
enterdate_clicked глобальная перепенная это Дата ввода на той строке где был вызов редактирования

Сначала я сделал функцию GetPrevDataEntry для нахождения Дата ввода на предыдущей строке формы formL

Код: 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.
Function GetPrevDataEntry() As Date
Dim dbs As DAO.Database
Dim rst As DAO.Recordset  'look help
Dim val As Double
Dim val_enterdate As Date
Dim Rindex As Integer
Dim Rindex_prev As Integer
Dim found_fl As Boolean
Dim enterdate_prev As Date
Dim stst As String

  Set rst = Forms.formL.Recordset

 Debug.Print "----------------"
 Rindex = 0
  rst.MoveFirst
  Do Until rst.EOF
   stst = rst![Наименование оборудования]
   Rindex = Rindex + 1                   'у первой записи Rindex=1
   val_enterdate = rst![Дата ввода]
   Debug.Print rst![Наименование оборудования] & " " & rst![Дата ввода]
   If val_enterdate = enterdate_clicked Then
     found_fl = True
     GoTo Exit_podrobnee
  Else
  End If
    
    enterdate_prev = rst![Дата ввода]  'запомним значение предыдущей записи
    Rindex_prev = Rindex
    rst.MoveNext
  Loop

Exit_podrobnee:
 If found_fl = True Then
  GetPrevDataEntry = enterdate_prev
End If

End Function



В кнопке удаления перед удалением я вызываю GetPrevDataEntry и после удаления пытаюсь спозиционировать вызывающую formL по предыдущему времени.

Код: 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.
41.
42.
43.
44.
Private Sub bt_del_record_Click()
On Error GoTo Err_bt_del_record_Click
Dim stLinkCriteria As String
Dim DataEntryPrev As Date
   
DataEntryPrev = GetPrevDataEntry  'определим время ввода предыдущей записи на форме fomL
Debug.Print "prev date:" & DataEntryPrev
     
     LastOp1 = "del"
     save_2_hist                           'И запишем в историю удаляемую запись
    
 'Me.Dirty = False
  
 ' If Me.Dirty Then
 '  MsgBox "Сначала нужно сохранить или отменить изменения в текущей записи"
 '  Exit Sub
 ' End If
    
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdDeleteRecord

          'нужно устновить на вызывающей форме ближайший индекс после удаления
    Forms![_Форма ввода].Form.Requery    'освежили форму редактирования (на ней теперь отображается первая запись)
    If CurrentProject.AllForms("formL").IsLoaded = True Then
       Forms![formL].Form.Requery
    End If
    
    'Адаптируем вызывающую форму
    If CurrentProject.AllForms("formL").IsLoaded = True Then
       'Forms![formL].Form.Requery
        'stLinkCriteria = "[Дата ввода]<" & Format$([Дата ввода], "\#mm\/dd\/yyyy hh\:nn\:ss\#")  'Соблюдаем американский формат времени!
        stLinkCriteria = "[Дата ввода]=" & Format$(DataEntryPrev, "\#mm\/dd\/yyyy hh\:nn\:ss\#")  'Соблюдаем американский формат времени!
        [Forms]![formL]![ed_Дата_ввода].SetFocus 'Для поиска по конкретному полю поле нужно установить на этом поле фокус
        [Forms]![formL].Recordset.FindFirst (stLinkCriteria)
    End If
         
Exit_bt_del_record_Click:
    Exit Sub

Err_bt_del_record_Click:
    MsgBox Err.Description
    Resume Exit_bt_del_record_Click
    
End Sub



После вызова функции GetPrevDataEntry перестает работать удаление записи - пишет команда удаления записи временно недоступна. Как только закоментировать вызов GetPrevDataEntry - удаление работает. Прямо замучился. ;)

Модератор: Тема перенесена из форума "Visual Basic".
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39879488
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexkoпишет команда удаления записи временно недоступна.установи курсор на запись - либо через любой метод Move рекордсета, либо GotoRecord ...
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39879530
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это не спасет "отца русской демократии" (Ильф,Петров 12 стульев)
Код: vbnet
1.
2.
3.
Private Sub Form_AfterDelConfirm(Status As Integer)
DoCmd.GoToRecord , , acPrevious
End Sub
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39879657
alexko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdkuА это не спасет "отца русской демократии" (Ильф,Петров 12 стульев)
Код: vbnet
1.
2.
3.
Private Sub Form_AfterDelConfirm(Status As Integer)
DoCmd.GoToRecord , , acPrevious
End Sub



Спасло! ;-)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim prevdate As Date

DoCmd.GoToRecord , , acPrevious
prevdate = [Дата ввода]        'перед удалением получаем инфу пред. строки
DoCmd.GoToRecord , , acNext  'снова возвращаемся

'...  и позиционируем вызывающую форму
         stLinkCriteria = "[Дата ввода]=" & Format$(prevdate, "\#mm\/dd\/yyyy hh\:nn\:ss\#")
        [Forms]![formL]![Дата ввода].SetFocus
        [Forms]![formL].Recordset.FindFirst (stLinkCriteria)



PS: Хотя мне, как говорил Граф Калиостро, было видение - я вдруг осознал, что будет гораздо красивее и яснее для пользователя если добавить кнопку "удалить запись" на ленточную форму, рядом с кнопкой "редактировать". Вероятно так и переделаю. А вообще это мой первй проект на VBA. До этого был правда CBuilder.
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39879658
alexko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sorry, забыл сказать спасибо! ;)
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39879682
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного замечаний...
alexkoСпасло! ;-)Зачем столько телодвижений с перемещением курсора в наборе, с поисками? Да ещё и без проверок... А если запись последняя? Куда же acPrevious ? А если вообще последняя?...
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39879742
alexko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПанургНемного замечаний...
alexkoСпасло! ;-)Зачем столько телодвижений с перемещением курсора в наборе, с поисками? Да ещё и без проверок... А если запись последняя? Куда же acPrevious ? А если вообще последняя?...


Как куда - если строк > 1 то на предыдущую (previous). Если строка последняя и она же единственная, то после её удаления задачи позиционирования не стоит.
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39879745
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexkoКак куда - если строк > 1 то на предыдущую (previous). Если строка последняя и она же единственная, то после её удаления задачи позиционирования не стоит.Я про ошибку говорю, которая будет благодаря этому коду.
И зачем поиск, когда можно перейти на запись
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39879892
alexko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПанургalexkoКак куда - если строк > 1 то на предыдущую (previous). Если строка последняя и она же единственная, то после её удаления задачи позиционирования не стоит.Я про ошибку говорю, которая будет благодаря этому коду.
И зачем поиск, когда можно перейти на запись

Вообще то я поторопился сказать что проблема решена c использованием DoCmd.GoToRecord , , acPrevious.
Как я говорил, источник данных для формы это таблица базы и в пропертях формы-ленты указано, что форма сортируется по трем колонкам. Т.е. по идее предыдущая запись из таблицы может не быть предыдущей на отображаемой на форме. Стало быть DoCmd.GoToRecord , , acPrevious выдает предыдущую запись из recordset. Это значит, что она может быть расположена где угодно на форме.

Значит мой первоначальный вариант с поиском по строкам самой формы был правильным, _по идее_. Или же просто нужно отказаться от удаления записи кнопкой на форме редактирования записи. Тогда не будет никакого геммороя. ;-)
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39879943
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexkoпо идее предыдущая запись из таблицы может не быть предыдущей на отображаемой на форме.

странно... если сортировать хоть по 10 колонкам (не меняя фильтр) имхо все записи которые идут после определенной, никогда не смогут встать перед ней после удаления одной из них, ну это как вдруг при удалении записи со значением 5, вдруг запись со значением 8 встанет перед записью со значением 4. Или я чет не так понимаю ?
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39880055
alexko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmagalexkoпо идее предыдущая запись из таблицы может не быть предыдущей на отображаемой на форме.

странно... если сортировать хоть по 10 колонкам (не меняя фильтр) имхо все записи которые идут после определенной, никогда не смогут встать перед ней после удаления одной из них, ну это как вдруг при удалении записи со значением 5, вдруг запись со значением 8 встанет перед записью со значением 4. Или я чет не так понимаю ?

Порядок записей в источнике не меняется, меняется их отображение на форме.
К примеру есть таблица заполненная по дате ввода. Если её показывать на ленточной форме без сортировки, то порядок записей один. Если применить сортировку по названию, то порядок записей показываемых в форме будет другой (совершенно не совпадающий с таблицей-источником). Стало быть когда мы удаляем запись на сортированной форме смежность строк на форме относительная - она зависит от сортировки формы. А задача стоит определить именно запись которая была перед удаляемой строкой на сортированной форме . Что бы после удаления записи установить там фокус формы.
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39880076
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А о том, что в таблице записи вообще не имеют порядка (грубо говоря"куча") мы вообще не вспоминаем. Их порядок задается только источником формы
alexkoПорядок записей в источнике не меняется...Это если источник "таблица"
А если источник "SELECT * FROM таблица ORDER BY поле1,поле2,поле3" очень даже меняется
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39880086
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexkoК примеру есть таблица заполненная по дате ввода. Если её показывать на ленточной форме без сортировки, то порядок записей один.Нет, это не таблица, это набор данных формы и естественная сортировка у него есть. В данном случае есть простой запрос
Код: sql
1.
TABLE TableName

он аналогичен
Код: sql
1.
SELECT * FROM TableName


alexkoЕсли применить сортировку по названию, то порядок записей показываемых в форме будет другой (совершенно не совпадающий с таблицей-источником).нет, у таблицы нет сортировки по определению. Это просто другая сортировка в другом наборе.
alexkoСтало быть когда мы удаляем запись на сортированной форме смежность строк на форме относительная - она зависит от сортировки формы.да, зависит
alexkoА задача стоит определить именно запись которая была перед удаляемой строкой на сортированной форме . Что бы после удаления записи установить там фокус формы.Не фокус формы, а сделать текущей - установить курсор (не путать с курсором на экране!). Предыдущей осталась та же запись в наборе что и была. Последующие записи в наборе сместились на одну - AbsolutePosition - 1
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39880193
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПанургПредыдущей осталась та же запись в наборе что и была. Последующие записи в наборе сместились на одну - AbsolutePosition - 1

"ЗАЧЕТ", ток я думаю, что если кому то не понятно было на примере 1,2,3,4,5,6,7,8, то тут только практика вылечит...
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39880195
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag..."ЗАЧЕТ", ток я думаю, что если кому то не понятно было на примере 1,2,3,4,5,6,7,8, то тут только практика вылечит... таки ДА!
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39880359
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
когда-то я увлекался такими "фокусами".
Ленточная форма, а внизу 3 кнопки. "Добавить", "Изменить", "Удалить".
Даже статью выкладывал Ленточная форма и закладки. на сайте Андрея Митина. Там и АлексейЕ отметился и Palarm . Да и тут я тоже слегка потоптался. Были варианты для ADP и MDB. Наиболее оптимальный по моему вариант АлексейЕ в одном из последних комментариев.
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39880372
alexko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,

Я тут поотлаживал и действительно все в порядке с перемещением по рекодсету и порядком отображением на форме. Удаление записи из формы редактирования тоже имеет право на жизнь. Еще раз спасибо. Вот финальная версия удаления:

Код: 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.
Private Sub bt_del_record_Click()       '(модуль формы редактирования записи [_Форма ввода])
On Error GoTo Err_bt_del_record_Click
Dim stLinkCriteria As String
Dim PrevRecDate As Date

DoCmd.GoToRecord , , acPrevious
PrevRecDate = [Дата ввода]
DoCmd.GoToRecord , , acNext, 1
   
     LastOp1 = "del"
     save_2_hist                           'И запишем в историю удаляемую запись
    
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdDeleteRecord
          
'       'Адаптируем вызывающую форму
      If CurrentProject.AllForms("formL").IsLoaded = True Then
         [Forms]![formL].Form.Requery             'Обновим вызывающую форму
         [Forms]![formL]![ed_Дата_ввода].SetFocus 'Для поиска по конкретному полю нужно установить на этом поле фокус!
         stLinkCriteria = "[Дата ввода]=" & Format$(PrevRecDate, "\#mm\/dd\/yyyy hh\:nn\:ss\#")  'Соблюдаем американский формат времени!
         [Forms]![formL].Recordset.FindFirst (stLinkCriteria)
     End If
         
         
Exit_bt_del_record_Click:
    Exit Sub

Err_bt_del_record_Click:
    MsgBox Err.Description
    Resume Exit_bt_del_record_Click
    
End Sub
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39880416
alexko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще вопросик новичка. Всегда ли можно заменить источник данных VBA формы с таблицы на SELECT запрос? А то как-то мне почему то странно видеть редактирование таблиц базы при помощи запроса SELECT. Я попробовал - вроде бы SELECT запрос работает и в этой неподобающей функции на изменение таблиц. ;)
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39880476
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexko, не пробовал читать что тебе написали в ответах?
...
Рейтинг: 0 / 0
Посоветуйте как спозиционировать курсор в ленточной форме
    #39880620
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexko.. А то как-то мне почему то странно видеть редактирование таблиц базы при помощи запроса SELECT.... а я то думал что редактируют только запросы на изменение-ан нет запросы на выборку тоже! Панургalexko, не пробовал читать что тебе написали в ответах?..а еще книшки и HELP
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Посоветуйте как спозиционировать курсор в ленточной форме
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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