Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 11.01.2017
Сообщений: 83

Как в поле ДатаНачалаПункта получить значение поля ДатаОкончанияПункта но из предыдущей запаси

16.11.2017, 09:05. Показов 1877. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня форумчане! Прошу помочь вот стакой задачей, как в поле ДатаНачалаПункта получить значение поля ДатаОкончанияПункта но из предыдущей запаси, если стоит флажок у даты.
Пробовал соорудить код, но он почему-то не хочет работать (пишет, что мало настроек). - взял из этого поста: Как в поле [Ost2] получить значение поля [Ost1] но из предыдущей строки

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option Compare Database
Option Explicit
 
Public Function F_OST()
    Dim ПунктыГрафика As DAO.Recordset
    Dim OST2 As Integer
    Set ПунктыГрафика = CurrentDb.OpenRecordset("SELECT * FROM ПунктыГрафика ORDER BY ПунктыГрафика.Date;", dbOpenDynaset)
    OST2 = ПунктыГрафика("ДатаОкончанияПункта")
    ПунктыГрафика.MoveNext
    Do Until ПунктыГрафика.EOF
        ПунктыГрафика.Edit
            ПунктыГрафика("ДатаНачалаПункта") = OST2
            OST2 = ПунктыГрафика("ДатаОкончанияПункта")
        ПунктыГрафика.Update
        ПунктыГрафика.MoveNext
    Loop
    ПунктыГрафика.Close
    Set ПунктыГрафика = Nothing
End Function
Сделал на форме кнопку для запуска макроса.
Базу приложил. (Формат Access 2010).
Пользователь "Администратор" - там настроены поля с флажком и кнопка
Пароль для входа: 123456
Буду очень признателен за помощь в реализации данной задумки.
Вложения
Тип файла: rar Database1.rar (4.21 Мб, 5 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.11.2017, 09:05
Ответы с готовыми решениями:

Как в поле [Ost2] получить значение поля [Ost1] но из предыдущей строки
Доброго времени суток! начинаю осваивать Акса, скажите пожалуйста как решить задачу: Есть таблица в ней поля , , Как в...

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

Как получить значение из предыдущей строки результата?
Извините конечно... я тока начинаю изучать SQL так что сыльно не бейте)))) помогите... Как получить значение из предыдущей строки...

20
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
16.11.2017, 09:27
Цитата Сообщение от ershov_pavel Посмотреть сообщение
пишет, что мало настроек
потому что у вас в таблице ПунктыГрафика НЕТ ПОЛЯ с именем "Date", которое фигурирует в строке
Visual Basic
1
Set ПунктыГрафика = CurrentDb.OpenRecordset("SELECT * FROM ПунктыГрафика ORDER BY ПунктыГрафика.Date;", dbOpenDynaset)
А если такого поля нет, то естественно код и хочет знать, что это за параметр запроса такой ему попался...

Добавлено через 4 минуты
Это для начала. Хотя там и дальше не совсем понятно по этому коду... Исправил (как понимал) описанную выше ошибку - на следующей же строке теперь вылазит ошибка Overflow...

Добавлено через 1 минуту
Анализируя дальше ваш код, видим, что вы создаете переменную OST2 с типом данных Integer, и потом пытаетесь присвоить ей значение даты...

Добавлено через 1 минуту
В общем, попробуйте вот такой код функции. Не знаю, как он работает, но по крайней мере не выдает ошибок))

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Function F_OST()
    Dim ПунктыГрафика As DAO.Recordset
    Dim OST2
    Set ПунктыГрафика = CurrentDb.OpenRecordset("SELECT * FROM ПунктыГрафика ORDER BY ПунктыГрафика.ДатаНачалаПункта", dbOpenDynaset)
    OST2 = ПунктыГрафика("ДатаОкончанияПункта")
    ПунктыГрафика.MoveNext
    Do Until ПунктыГрафика.EOF
        ПунктыГрафика.Edit
            ПунктыГрафика("ДатаНачалаПункта") = OST2
            OST2 = ПунктыГрафика("ДатаОкончанияПункта")
        ПунктыГрафика.Update
        ПунктыГрафика.MoveNext
    Loop
    ПунктыГрафика.Close
    Set ПунктыГрафика = Nothing
End Function
1
1 / 1 / 0
Регистрация: 11.01.2017
Сообщений: 83
16.11.2017, 11:44  [ТС]
Цитата Сообщение от Kkarn Посмотреть сообщение
В общем, попробуйте вот такой код функции. Не знаю, как он работает, но по крайней мере не выдает ошибок))
Спасибо за помощь!)
Да код теперь без ошибок работает, но меняет не то что нужно.
Теперь пробую прикрутить флажок к функции. Хочу, чтобы менялись только те записи которые выбраны. И пересчитывал по порядку. Дата окончания первой выделенной записи должна быть датой начала следующей выделенной записи и т.д..
Ниже код

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Function F_OST()
If [Forms]![Администратор]![ПунктыГрафика подчиненная форма]![Флажок29] = True Then
    Dim ПунктыГрафика As DAO.Recordset
    Dim OST2
    Set ПунктыГрафика = CurrentDb.OpenRecordset("SELECT * FROM ПунктыГрафика ORDER BY ПунктыГрафика.ДатаНачалаПункта", dbOpenDynaset)
    OST2 = ПунктыГрафика("ДатаОкончанияПункта")
    ПунктыГрафика.MoveNext
    Do Until ПунктыГрафика.EOF
        ПунктыГрафика.Edit
            ПунктыГрафика("ДатаНачалаПункта") = OST2
            OST2 = ПунктыГрафика("ДатаОкончанияПункта")
        ПунктыГрафика.Update
        ПунктыГрафика.MoveNext
    Loop
    ПунктыГрафика.Close
    Set ПунктыГрафика = Nothing
End If
End Function
И собственно сам файл БД
Вложения
Тип файла: rar Database1.rar (4.21 Мб, 3 просмотров)
0
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
16.11.2017, 12:58
Мне кажется, вы не туда вставили проверку флажка...
По идее, если вам нужно учесть положение КАЖДОГО флажка, то нужно его проверку вставлять внутрь цикла Do Until. А то получается, что вы ОДИН РАЗ проверили положение флажка - и от этой проверки зависит потом обработка ВСЕХ записей рекордсета.

Добавлено через 2 минуты
Кстати, только сейчас вот подумал. Смотрите, вы выбираете рекордсет, который сортируется по полю ДатаНачалаПункта, так?
А потом в цикле вы ведь МЕНЯЕТЕ эти самые ДатыНачалаПункта... Как в этом случае сработает сортировка - вопрос очень интересный... Мне кажется, будет бардак. Возможно, рекордсет нужно сортировать не по этому полю, а например по полю счетчика?
1
1 / 1 / 0
Регистрация: 11.01.2017
Сообщений: 83
16.11.2017, 15:24  [ТС]
Цитата Сообщение от Kkarn Посмотреть сообщение
Мне кажется, вы не туда вставили проверку флажка...
Поместил в другое место проверку флажка, он все равно меняет везде где не нужно.
Сделал другой код, точнее по заимствовал и изменил под себя из поста: Рабочие дни из таблицы календаря
Автор: mobile
Код:

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
Private Sub btnCalc_Click()
    Dim db As DAO.Database, rsZ As DAO.Recordset, rsK As DAO.Recordset
    Dim s, i, n, dt, dtsled
    Set db = CurrentDb
    dt = Nz(Me.dt, Date)
    Set rsZ = db.OpenRecordset("select * from ПунктыГрафика")
    Do Until rsZ.EOF
     If [Forms]![Администратор]![ПунктыГрафика подчиненная форма]![Флажок29] = True Then
        rsZ.Edit
        i = rsZ!Длительность
        s = "select top " & i + 1 & " * from Kalendar " _
        & "where not NoWork and dated>=" & Format(dt, "\#mm\/dd\/yyyy\#")
        Set rsK = db.OpenRecordset(s)
        rsK.MoveLast
        rsK.MovePrevious
        rsZ!ДатаНачалаПункта = dt
        rsZ!ДатаОкончанияПункта = rsK!dated
        rsK.MoveNext
        dt = rsK!dated
        rsZ.Update
        rsZ.MoveNext
     End If
    Loop
End Sub
При установки флажка на несколько строк, код изменил все строки в таблице, а нужно было на выбранных.
Если все флажки снять, то Access зависает и вылетает.

Люди добрые помогите пожалуйста!!! Уже мозги пухнут...
БД приложил...
Вложения
Тип файла: rar Database1.rar (4.25 Мб, 2 просмотров)
0
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
16.11.2017, 15:36
Не, давайте вернемся к прошлому варианту кода пока что)
Вот я сидел над ним и думал. И что придумал: у вас же в рекордсет отбираются ВСЕ строки из таблицы "ПунктыГрафика", так же? У вас их в таблице - больше 20 штук, так? А вот в подчиненную форму отбираются только строки, связанные с конкретным мероприятием, на котором сейчас стоит курсор в другой подчиненной форме.
Вот и получается, что код работает, проходится по ВСЕМ записям из таблицы ПунктыГрафика, и обрабатывает их ВСЕ ПОДРЯД - оттого и получаются бог знает какие даты в итоге...

Добавлено через 2 минуты
Соответственно, нужно ОРГАНИЧИТЬ выборку рекордсета, чтобы в него попадали только пункты, связанные с конкретным мероприятием.
1
1 / 1 / 0
Регистрация: 11.01.2017
Сообщений: 83
16.11.2017, 15:50  [ТС]
Цитата Сообщение от Kkarn Посмотреть сообщение
нужно ОРГАНИЧИТЬ
Вот как раз над этим и ломаю голову. Я его хотел ограничить флажками.

Цитата Сообщение от Kkarn Посмотреть сообщение
рекордсет нужно сортировать не по этому полю, а например по полю счетчика?
Я думаю не выйдет, т.к. если пользователь внесет пункты и например один или несколько пропустил. Счетчик уже не по порядку будет.
И все это действие с кодом, нужно лишь для того, чтобы если пользователь ошибся, можно было это дело пересчитать, т.к. все эти пункты идут по порядку (один закончился, следом начинается следующий - ну как MS Project)

А за Ваши советы, Вам огромное спасибо!!! Хоть кто-то откликнулся)))

Цитата Сообщение от Kkarn Посмотреть сообщение
Не, давайте вернемся к прошлому варианту кода пока что)
Новый код, почти то-же самое, только он даты считает с учетом выходных и праздничных дней! А это очень удобно при планировании сроков!
0
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
16.11.2017, 15:56
Просто я сейчас анализирую именно прошлый вариант кода... Хотя в принципе, какая разница, если основная причина нестыковок, как мне кажется - именно в порядке сортировки рекордсета перед обработкой...
Смотрите, у вас в таблице ПунктыГрафика есть пункты, которые касаются Мероприятия 2.1. Их три штуки, и нумерация у них идет 2.1.0, 2.1.1 и 2.1.2. А вот в таблицу они занесены не в таком порядке, то есть под кодом счетчика 7 идет 2.1.1, под кодом 8 - 2.1.2, под кодом 43 - пункт 2.1.0 (первоначальный).
В принципе, я переделал код с учетом всех органичений рекордсета и т.д., но сейчас я в коде использую сортировку по коду счетчика, а она-то как раз и не подходит, учитывая такой вот порядок ввода пользователями... Хм, а если поставить сортировку по полю нумерации - интересно, как VBA воспримет такую сортировку?.. Сейчас проверим.
1
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
16.11.2017, 15:59
Кстати да, вариант работает. Задал сортировку по полю нумерации пунктов мероприятия).
Проверьте, мне кажется, так работает как нужно.
Вложения
Тип файла: rar Database1.rar (4.21 Мб, 4 просмотров)
1
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
16.11.2017, 16:14
Цитата Сообщение от ershov_pavel Посмотреть сообщение
Я его хотел ограничить флажками.
Стоп-стоп. Так вы хотели флажки использовать именно только для того, чтобы указывать ими пункты, связанные с конкретным мероприятием?.. То есть если, например, пункты касаются только мероприятия 2.1, то вы отмечаете флажками ВСЕ пункты, которые касаются этого мероприятия? Тогда я вам скажу, что флажки тут не нужны, поскольку мы уже ограничили рекордсет, указав в нем выбирать только те строки, которые касаются мероприятия, на котором сейчас в форме стоит курсор.

Добавлено через 7 минут
кстати, у mobile код - как всегда шикарный и красивый, сейчас вот любуюсь) И если вам нужно, чтобы оно заработало, то, опять же, нужно убрать вообще проверку на флажки (и сами флажки из формы и из таблицы - по ходу, они не нужны), и просто в строке

Visual Basic
1
Set rsZ = db.OpenRecordset("select * from ПунктыГрафика")
вместо этого написать

Visual Basic
1
Set rsZ = db.OpenRecordset(""SELECT * FROM ПунктыГрафика WHERE КодМероприятия=" & [Forms]![Администратор]![Мероприятия подчиненная форма]![КодМероприятия] & " ORDER BY НомерПунктиграфика")
Добавлено через 47 секунд
Таким образом вы уже ограничите рекордсет только теми записями, у которых - нужный код мероприятия.

Добавлено через 3 минуты
И да, все время забываю написать, что вы проверяете не тот флажок). Нужно проверять не флажок на самой форме (насколько я знаю, в случае с ленточной формой флажок как элемент управления - "один на всех"), а нужно проверять значение поля "Пересчет" в выбранном рекордсете.
Но это уже так, замечание после сказанного, поскольку, мне кажется, флажки там вообще уже не нужны.
1
1 / 1 / 0
Регистрация: 11.01.2017
Сообщений: 83
16.11.2017, 16:20  [ТС]
Цитата Сообщение от Kkarn Посмотреть сообщение
И если вам нужно, чтобы оно заработало, то, опять же, нужно убрать вообще проверку на флажки (и сами флажки из формы и из таблицы - по ходу, они не нужны)
Загвоздка в том, что в мероприятии будут пункты и часть из них будут грубо скажем не по порядку!
Например: Первые три пункта идут последовательно, 4 и 5 пункты со своим временным ограничением, а 6 допустим с другой датой.

Поэтому и нужно сделать так, чтобы пользователь, если ошибся при внесении пунктов, просто выделив их флажками взял, и пересчитал даты, и все стало на свои места.
0
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
16.11.2017, 16:25
хм... Сейчас, почти сделал вам второй вариант, по предложенному коду.
1
1 / 1 / 0
Регистрация: 11.01.2017
Сообщений: 83
16.11.2017, 16:31  [ТС]
Цитата Сообщение от Kkarn Посмотреть сообщение
хм... Сейчас, почти сделал вам второй вариант, по предложенному коду.
Буду очень признателен за второй вариант))) т.к. там есть учет дней с выходными и праздниками)))

Да и первый вариант меняет именно те пункты, которые выделены галочками!!!!))) Круто!!!!
0
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
16.11.2017, 16:33
Лучший ответ Сообщение было отмечено ershov_pavel как решение

Решение

Вот, проверьте.
Только я сначала по привычке полез править код в Модуле 2, а потом уже открыл форму и увидел ваши усовершенствования). Так что в коде, который в модуле 2, я нахимичил, можете его удалить сразу.
Да, и потом, я сначала таки убрал с формы галочки и делал код с расчетом без них. Потом прочитал ваше мнение - и вернул их на форму и их проверку в код.
Еще добавил команду обновления подчиненной формы, чтобы было видно, как обновляются поля.
И мне кажется, лучше просто добавить поле со "стартовой" датой добавить непосредственно на основную форму, рядом с кнопкой "Пересчитать даты", чтобы не вызывать еще лишнюю форму...
Вложения
Тип файла: rar Database1.rar (4.24 Мб, 2 просмотров)
1
1 / 1 / 0
Регистрация: 11.01.2017
Сообщений: 83
16.11.2017, 16:58  [ТС]
Цитата Сообщение от Kkarn Посмотреть сообщение
Вот, проверьте.
Спасибо!!!!) Все работает!)

Цитата Сообщение от Kkarn Посмотреть сообщение
добавить поле со "стартовой" датой добавить непосредственно на основную форму, рядом с кнопкой "Пересчитать даты", чтобы не вызывать еще лишнюю форму...
Завтра попробую это организовать! Как все сделаю, отпишусь.


Огромное спасибо Вам за помощь! Вы Человек с большой буквы!!!!!)
0
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
16.11.2017, 17:02
Лучший ответ Сообщение было отмечено ershov_pavel как решение

Решение

Да не надо завтра) Вот проверьте.
Вложения
Тип файла: rar Database1.rar (4.24 Мб, 7 просмотров)
1
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
16.11.2017, 17:08
Цитата Сообщение от ershov_pavel Посмотреть сообщение
Вы Человек с большой буквы
)) Не, мне просто скучно на работе.
1
1 / 1 / 0
Регистрация: 11.01.2017
Сообщений: 83
17.11.2017, 10:21  [ТС]
Цитата Сообщение от Kkarn Посмотреть сообщение
Да не надо завтра) Вот проверьте.
Доброе утро! Все работает как надо! Еще раз спасибо Вам!

В очередной раз убеждаюсь, что мир не без добрых людей!)

Добавлено через 2 часа 24 минуты
Цитата Сообщение от Kkarn Посмотреть сообщение
Вот проверьте.
Подскажите пожалуйста, такой момент. Возможно ли сделать, что после обновления дат, все флажки автоматически снимались? (Это нужно для, того чтобы случайно не изменить дату в другом мероприятии, если человек, просто забыл снять галку с пункта)
1
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
17.11.2017, 10:25
В принципе, вы в другом мероприятии все равно не измените дату, даже если там останется галочка. Потому что в коде обрабатываются сугубо те записи, которые касаются конкретного мероприятия, активного в данный момент.
Но да, в принципе, нужно это изменить, чтобы не оставлять за собой мусор. Щас глянем.
1
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
17.11.2017, 10:28
Лучший ответ Сообщение было отмечено ershov_pavel как решение

Решение

По сути, просто добавляем в код одну строку:

Visual Basic
1
rsZ!Пересчет = False
Вложения
Тип файла: rar Database1.rar (4.24 Мб, 7 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.11.2017, 10:28
Помогаю со студенческими работами здесь

Как получить значение переменной из предыдущей страницы
Как получить значение переменной из предыдущей страницы?

Значение из предыдущей записи этого же поля
Необходимо: Взять значение из поля 1 , проверить на соответствие критерию, если да - то в поле 2 указывается значение поля 1, если нет, то...

Заполнить значение поля таблицы из другого поля этой же таблицы, но предыдущей записи
У меня есть таблица кассовая книга. В ней содержатся данные по каждому рабочему дню: Дата, остаток на начало дня, приход, расход, остаток...

Поле, автоматически высчитывающее своё значение исходя из предыдущей записи
Уважаемые форумчане, помогите мне с моей проблемой. Имеется таблица следующей структуры: |IDОперация (PK,int)| |Приход (money)| ...

Как передать значение поля из ActiveX в поле броузера?
ActiveX написал на VB. Он принимает инфу из CОМ порта, обрабатывает и показывает результат в поле. Как передать значение из этого поля в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru