С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 01.08.2018
Сообщений: 55

Как выбрать последнюю запись?

06.08.2018, 16:32. Показов 5072. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть таблица. В ней 4 столбца, во всех ячейках содержатся даты.
В первую строку даты я вношу руками. А дальше хочу их размножить макросом.

Давайте для примера ограничимся одним столбцом.
Мне нужно к последней записанной дате добавить 26 недель.
Это вроде понятно:
PureBasic
1
DateAdd("ww", 26, X)
Но не понятно как записать в переменную Х дату, которая хранится в последней строке этого столбца.

Предполагаю, как поместить результат вычислений в новую строку - мне тоже будет не понятно.
Буду очень благодарен, если кто напишет макрос целиком.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.08.2018, 16:32
Ответы с готовыми решениями:

Как выбрать последнюю запись перед указанной датой?
Доброго времени суток! В Access'е новичек. Подскажите, пожалуйста, как из таблицы "Баланс" выбрать последнюю запись перед датой...

Как найти последнюю запись в таблице?
Не могу найти последнюю запись в таблице. Вот один из вариантов как искал: Dim etomoja As Variant etomoja...

Как оставить в поле формы последнюю просмотренную запись?
есть формы, с комбобоксами.при работе пользователь переключает значения в боксах. Как сделать так, чтобы последнее указанное значение...

51
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
06.08.2018, 16:36
Вам явно не сюда, а в раздел Экселя). Судя по описываемой вами ситуации, вы применеяте к Аксесу именно экселевскую логику...
Начнем с того, что в Аксесе НЕТ понятия "последняя строка". Задал другую сортировку - и привет, строки поменялись.

Добавлено через 1 минуту
Само собой, что поставленную вами задачу решить МОЖНО, но это будет выглядеть явно не так, как вы это себе представляете.
1
Эксперт MS Access
 Аватар для Eugene-LS
12058 / 5843 / 1492
Регистрация: 05.10.2016
Сообщений: 16,429
06.08.2018, 16:37
Цитата Сообщение от avuremybe Посмотреть сообщение
если кто напишет макрос целиком.
По макросам тут спецов нет (хоть и понимают многие).
Решайте на VBA - будет проще!
0
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
06.08.2018, 16:42
По идее (если отбросить сам факт того, что скорее всего автор вопроса неправильно ставит перед собой задачу), это можно решить через VBA работой с рекордсетом таблицы.

Добавлено через 1 минуту
Если набросаете хотя бы примерную базу с готовой таблицей, в которой можно будет показать пример, то могу решить на VBA.
И опять же, в Аксесе мы все действия выполняем не прямо непосредственно в таблице, а в формах.
1
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
06.08.2018, 16:43
avuremybe,

Нужно создать последовательность из 26-ти записей?
Поищите здесь в разделе "запрос Digits".
Он должен помочь.
0
Эксперт MS Access
 Аватар для Eugene-LS
12058 / 5843 / 1492
Регистрация: 05.10.2016
Сообщений: 16,429
06.08.2018, 16:57
Цитата Сообщение от Capi Посмотреть сообщение
Поищите здесь в разделе "запрос Digits".
Опять?!!!
... ну не то решение ... не то.
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
06.08.2018, 17:26
Можно по-разному, это да.
Например, INSERT в цикле.
Или просто в рекордсет писать.

А использовать MSysObjects не обязательно.
Подойдет любая непустая таблица.
0
Эксперт MS Access
 Аватар для Eugene-LS
12058 / 5843 / 1492
Регистрация: 05.10.2016
Сообщений: 16,429
06.08.2018, 17:34
Цитата Сообщение от Capi Посмотреть сообщение
Можно по-разному, это да.
Например, INSERT в цикле.
Или просто в рекордсет писать.
А использовать MSysObjects не обязательно.
Супер!
Очень рад за вас!
(дале не стану, это последний раз)
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
06.08.2018, 18:56
Eugene-LS,

Вы неправильно соединили высказывания.
Имелось в виду, что таблица в запросе Digits - не обязательно MSysObjects.

А рады почему?
0
0 / 0 / 0
Регистрация: 01.08.2018
Сообщений: 55
07.08.2018, 08:36  [ТС]
На VBA я и хочу это реализовать.

Прикрепляю тестовую базу:
Имеется таблица с перечнем имеющегося оборудования.
Каждая машина имеет 4 категории запчастей, обслуживание которых производится с разным временным интрвалом (26, 52, 104 и 130 недель). Этим интервалам соответствуют столбцы в таблице с датами.
Первичные даты (от которых отталкиваться) я забиваю руками.

А дальше я вижу ситуацию так:
Я в форме выбираю из выпадающего списка нужное мне оборудование и нажатием на кнопку скрипт добавляет мне новые записи в таблицу с датами.
А именно - к последней дате в столбце "Период 26" добавляет 26 недель, в столбце "Период 52" - 52 недели и так далее.
Количество добавляемых записей - было бы идеально, если бы добавлялся год. Правда скрипт придется усложнить IF'ами, чтобы он проверял, не будет ли новая дата выходить за установленные рамки.
Вложения
Тип файла: 7z Test_DB_2.7z (420.1 Кб, 4 просмотров)
0
0 / 0 / 0
Регистрация: 01.08.2018
Сообщений: 55
07.08.2018, 10:36  [ТС]
К слову, за неделю поиска в гугле, я так и не узнал, как мне занести последнюю запись из запроса в переменную, чтобы подставить ее в функцию DateAdd("ww", 26, X).
Я работал на С и на РНР - там все предельно просто. А тут банально значение в переменную неделю занести не могу. Ну т.е. как занести значение понятно, не понятно только как это значение получить.
Есть какой-то объект Recordset (а может и не объект. справка в одном предложении называет его и объектом, и свойством, и ссылкой, и клоном объекта и еще чем-то там, не помню уже). Я не до конца понимаю, что он собой являет, но в нем вроде как хранятся записи. Как я понял, я могу в него поместить свой запрос.
Но как добыть из этого Recordset'a значение, которое хранится в нужной мне ячейке, я так узнать и не смог.
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
07.08.2018, 11:27
Лучший ответ Сообщение было отмечено avuremybe как решение

Решение

Цитата Сообщение от avuremybe Посмотреть сообщение
как мне занести последнюю запись из запроса в переменную
Может быть, Вы хотите сказать "значение определенного поля последней записи присвоить переменной" ?
Это легко.
Вопрос только, как определить "последнюю запись" - записи становятся последними или первыми только в результате сортировки.
Если "последняя" - запись с максимальным значением, то имеем:
Visual Basic
1
переменная = CurrentDb.OpenRecordset("SELECT TOP 1 поле FROM таблица ORDER BY поле DESC").Fields(0)
1
0 / 0 / 0
Регистрация: 01.08.2018
Сообщений: 55
07.08.2018, 11:47  [ТС]
Capi, хотел протестировать, но мне при попытке запустить мой скрипт пишет "Object required" и подсвечивает желтым первую строку (где Private Sub)
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Кнопка21_Click()
Dim d As Date
Dim rst As Recordset
Dim db As Database
 
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT Machines.Оборудование, [Stored dates].[Период 26], [Stored dates].[Период 52], [Stored dates].[Период 104], [Stored dates].[Период 130] FROM Machines INNER JOIN [Stored dates] ON Machines.[Номер машины] = [Stored dates].Оборудование WHERE (((Machines.[Номер машины]) = [Формы]![ДатыОбслуживания]![ВыборОборудования])) ORDER BY [Stored dates].id;")
Set d = rst.Fields("Период 26")
 
rst.AddNew
rst.Fields("Период 26").Value = DateAdd("ww", 26, d)
 
rst.Update
rst.Close
End Sub
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
07.08.2018, 11:57
avuremybe,

Насчет подсвечивания заголовка процедуры ничего не могу сказать.
В целом вроде все, условно говоря, верно.
Но в рекордсет достаточно выбирать только [Stored dates].[Период 26], ведь другие поля не используются здесь.
0
0 / 0 / 0
Регистрация: 01.08.2018
Сообщений: 55
07.08.2018, 12:16  [ТС]
Установил переменной d тип Variant.
Теперь ругается на строку "Set rst = . . ." - говорит "Слишком мало параметров. Требуется 1."
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Êíîïêà21_Click()
 
Dim d As Variant
Dim rst As Recordset
 
Set rst = CurrentDb.OpenRecordset("SELECT Machines.Îáîðóäîâàíèå, [Stored dates].[Ïåðèîä 26], [Stored dates].[Ïåðèîä 52], [Stored dates].[Ïåðèîä 104], [Stored dates].[Ïåðèîä 130] FROM Machines INNER JOIN [Stored dates] ON Machines.[Íîìåð ìàøèíû] = [Stored dates].Îáîðóäîâàíèå WHERE (((Machines.[Íîìåð ìàøèíû]) = [Ôîðìû]![ÄàòûÎáñëóæèâàíèÿ]![ÂûáîðÎáîðóäîâàíèÿ])) ORDER BY [Stored dates].id;")
Set d = rst.Fields("Ïåðèîä 26")
 
rst.AddNew
rst.Fields("Ïåðèîä 26").Value = DateAdd("ww", 26, d)
rst.Update
rst.Close
 
End Sub
 Комментарий модератора 
сначала переключитесь на русскую раскладку клавиатуры
затем копируйте код и вставляйте на форум
0
Мы один, давай на "ты"
3836 / 1382 / 343
Регистрация: 16.06.2016
Сообщений: 3,273
07.08.2018, 12:34
Цитата Сообщение от avuremybe Посмотреть сообщение
Set d = rst.Fields("Период 26")
Цитата Сообщение от avuremybe Посмотреть сообщение
скрипт пишет "Object required" и подсвечивает желтым первую строку
Access в шоке.
Убери Set...

Добавлено через 2 минуты
+ название поля заключи в квадратные скобки.

Цитата Сообщение от avuremybe Посмотреть сообщение
за неделю поиска в гугле, я так и не узнал, как мне занести последнюю запись из запроса в переменную, чтобы подставить ее в функцию DateAdd("ww", 26, X).
Я работал на С и на РНР - там все предельно просто.
Для начала надо читать документацию.
1
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
07.08.2018, 14:08
Цитата Сообщение от avuremybe Посмотреть сообщение
Но как добыть из этого Recordset'a значение, которое хранится в нужной мне ячейке, я так узнать и не смог.
а в курсе, что ячеек в таблицах в Акцессе тоже нет?
0
0 / 0 / 0
Регистрация: 01.08.2018
Сообщений: 55
07.08.2018, 14:11  [ТС]
Панург, ничего не изменилось.
"Слишком мало параметров. Требуется 1." и подсвечивает Set rst
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Кнопка21_Click()
 
Dim d As Variant
Dim rst As Recordset
 
Set rst = CurrentDb.OpenRecordset("SELECT Machines.Оборудование, [Stored dates].[Период 26], [Stored dates].[Период 52], [Stored dates].[Период 104], [Stored dates].[Период 130] FROM Machines INNER JOIN [Stored dates] ON Machines.[Номер машины] = [Stored dates].Оборудование WHERE (((Machines.[Номер машины]) = [Формы]![ДатыОбслуживания]![ВыборОборудования])) ORDER BY [Stored dates].id;")
d = rst.Fields([Период 26])
 
rst.AddNew
rst.Fields("Период 26").Value = DateAdd("ww", 26, d)
rst.Update
rst.Close
 
End Sub
Добавлено через 1 минуту
Цитата Сообщение от alvk Посмотреть сообщение
ячеек в таблицах в Акцессе тоже нет?
Для пересечения строк и столбцов тут новое слово придумали?
0
0 / 0 / 0
Регистрация: 01.08.2018
Сообщений: 55
07.08.2018, 14:21  [ТС]
Поправил синтаксис во всех полях.
Теперь вообще не понятно, на что оно ругается.

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Кнопка21_Click()
 
Dim d As Variant
Dim rst As Recordset
 
rst = CurrentDb.OpenRecordset("SELECT Machines.Оборудование, [Stored dates].[Период 26], [Stored dates].[Период 52], [Stored dates].[Период 104], [Stored dates].[Период 130] FROM Machines INNER JOIN [Stored dates] ON Machines.[Номер машины] = [Stored dates].Оборудование WHERE (((Machines.[Номер машины]) = [Формы]![ДатыОбслуживания]![ВыборОборудования])) ORDER BY [Stored dates].id;")
d = rst.Fields([Период 26])
 
rst.AddNew
rst.Fields([Период 26]).Value = DateAdd("ww", 26, d)
rst.Update
rst.Close
 
End Sub
Вообще, у меня с самого начала были подозрения, что Fields() берет весь столбец, а не последнюю запись.
Миниатюры
Как выбрать последнюю запись?  
0
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
07.08.2018, 14:23
Цитата Сообщение от avuremybe Посмотреть сообщение
Для пересечения строк и столбцов тут новое слово придумали?
Нет, не придумали. Пересечения просто нет. Есть поле и куча записей в этом поле, записи можно сортировать и фильтровать и отображать как угодно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.08.2018, 14:23
Помогаю со студенческими работами здесь

Как записать последнюю запись поля из запроса в таблицу?
Запрос построен на основе таблицы в которую необходимо автоматически записать текущее полугодие. В запросе реализовано так: period:...

Как отразить на форме последнюю запись с другой формы
Добрый день! сразу скажу, что Акцесс на уровне чайника, языков не знаю. Есть форма Трудовой договор, где можно выбрать сотрудника из уже...

Как в подчинённой форме сделать текущей последнюю запись
Помогите, кто сможет. :-) У меня есть основная форма и подчинённая. В основной форме есть кнопка, по нажатии на которую вызывается форма...

Как автоматом подставить последнюю запись в поле со списком
Добрый день. Имеется форма1 для добавления нового клиента, которая запускается из другой формы2. Суть следующая: Я открываю форму2 и если у...

Как вставить в поле со списком последнюю строку или запись из необходимой таблицы
Здравствуйте уважаемые форумчане. Я начинающий в access. Суть вопроса в следующем: необходимо, чтобы при открытии формы, в поле со списком...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru