|
|
|
| есть ленточная форма, в нее передается из другой формы (с которой первая вызывается по кнопке) параметр id. По id эта ленточная форма отбирает и выводит записи. В записи имеются такие поля как датаначало, датаконец. Обычно по одному id отбирается несколько записей (это этапы планируемых работ, а дата1 и дата2 это даты начала и конца).
Необходимо сделать так чтобы при изменении даты2 (т.е. даты конца какого-то этапа) автоматически на этот же срок сдвинулась дата1 следующего этапа (очередность этапов можно отследить только по датам). То есть, по сути, чтобы когда меняешь дата2 в текущей записи, сдвигалась дата1 в следующей записи....
ну вот запутано объяснил еслит кто сможет помочь, заранее благодарен! | |
|
| |
|
|
|
| Присваиваете значение даты переменной OldData. на событии афетр апдэйт с помощью функцииDateDiff вычисляете разницу между oldData и введенной датой. После увеличиваете значение необходимых дат на полученную разницу. | |
|
| |
|
|
|
| а как обратиться к следующей записи? так как дату надо поменять будет там... | |
|
| |
|
|
|
|
With Me.Recordsetclone
.Bookmark = Me.Bookmark
.MoveNext
If Not .EOF Then
.Edit
![Date1] = NewDate
.Update
End If
End With
|
| |
|
| |
|
|
|
| СПАСИБО Ваш вариант почти работает! объясню почему почти, при изменении date2, ваш вариант кода вносит необходимые изменения в следующую запись в date1... но после access выдает сообщение
"пока вы правили эту запись, она была изменена другим пользователем. Если сохранить запись, исправления другого пользователя будут потеряны.
копирование исправлений в буфер позволит просмотреть изменения, внесеные другим пользователем, а затем, при необходимости, втсавить свои исправления обратно.
и доступны две кнопки:
"копировать в буфер", "отменить изменения""
таким образом сами вносимые изменения в date2 не сохраняются, а в date1 (следующей записи) все нормально изменяется и сохраняется...
как преодолеть эту проблему? в чем загвоздка не подскажете? | |
|
| |
|
|
|
| ИМХО, после того, как вы изменили 1-ю запись в форме, ее нужно сохранить (например: Me.Dirty=False), а затем лезть в Me.Recordsetclone и менять другую запись.
Какое событие вы используете для выполнение этого кода? Надо AfterUpdate поля с датой. | |
|
| |
|
|
|
| да использую afterupdate на поле date2. | |
|
| |
|
|
|
| ооо , спасибо Me.Dirty=False меня спасло!
только вот не понял допустим у меня
data2 = 29.07.2008
data1 = 02.04.2009
вот когда делаю изменение data2 на 30.07.2008, получаю data1 (следующей записи) = 03.04.2009
все ок, а когда меняю назад то есть 30.07.2008 изменяю на 29.07.2008 то получаю data1 (следующей записи) = 01.04.2009...
почему так не подскажете? | |
|
| |
|
|
|
| вот код
Private Sub ПланОконч_GotFocus()
date_end = Me.ПланОконч
End Sub
Private Sub ПланОконч_AfterUpdate()
Me.Dirty = False
dif = ДатаПланОкончание - date_end
With Me.RecordsetClone
.Bookmark = Me.Bookmark
.MoveNext
If Not .EOF Then
.Edit
![ДатаПланНачало] = ДатаПланНачало + dif
.Update
End If
End With
End Sub | |
|
| |
|
|
|
| Как вы думаете почему такая разница при изменении дат? | |
|
| |
|
|
|
| Из вашего кода я не понял, что такое Me.ПланОконч, и чем оно отличается от ДатаПланОкончание. А также, где описаны перемнные dif и date_end, и какого они типа.
Поясню на дата1 и дата2 (как в вопросе):
Dim dif As Variant
dif = Me!Дата2 - Me!Дата2.OldValue
If IsNull(dif) Then Exit Sub
Me.Dirty = False
...
.Edit
![Дата1] = ![Дата1] + dif
.Update
|
Событие ПланОконч_GotFocus() и переменная date_end не нужны. | |
|
| |
|
|
|
| date_end определена как public as date
ПланОконч - это название поля ленточной формы, а ДатаПланОкончание - это данные этого поля.
dif не описал совсем:( | |
|
| |
|
|
|
| Событие ПланОконч_GotFocus() и переменная date_end убрал.
код переписал так:
Private Sub ПланОконч_AfterUpdate()
Dim dif As Variant
dif = Me!ПланОконч - Me!ПланОконч.OldValue
If IsNull(dif) Then Exit Sub
Me.Dirty = False
With Me.RecordsetClone
.Bookmark = Me.Bookmark
.MoveNext
If Not .EOF Then
.Edit
![ДатаПланНачало] = ДатаПланНачало + dif
.Update
End If
End With
End Sub
вот в одну сторону работает нормально изменяю в поле ПланОконч дату с 29.07 на 30.07.
тогда в следующей записи меняются данные ДатаПланОкончание с 02.04 на 03.04.
ВСЕ ОК
и пробую после этого поменять назад с 30.07 на 29.07
при этом косяк какой то... смотрю в отладчике на строчку
![ДатаПланНачало] = ДатаПланНачало + dif
и виджу что ![ДатаПланНачало] = 03.04, а ДатаПланНачало = 02.04 (как бы старые данные откуда-то)? и получается когда добавляется -1 итоговая дата не 02.04 а 01.04 :( | |
|
| |
|
|
|
| о блин сам виноват вы же написали ![ДатаПланНачало] = ![ДатаПланНачало] + dif
а я ошибся и написал ![ДатаПланНачало] = ДатаПланНачало + dif.. поэтому и была ошибка....
СПАСИБО за помощь! | |
|
| |
|
|
|
| а вообще как принято называть поле также как данные в нем? чтобы не возникало путаницы?
как у меня с ПланОконч и ДатаПланОкнчание ? | |
|
| |
|
|
|
|
![ДатаПланНачало] = ДатаПланНачало + dif
Здесь ![ДатаПланНачало] - поле следующей записи в RecordsetClone, а ДатаПланНачало - поле текущей записи в форме.
Надо так:
![ДатаПланНачало] = ![ДатаПланНачало] + dif
Улавливаете разницу?
------------------------------
Не успел!
Насчет совпадения имен контролов с именами полей в источнике - это дело вкуса. Я практикую совпадение, если только контрол в процессе работы не меняет свой источник.
Например примечание может быть подключено к полю, а в некоторый момент становится вычисляемым.
А вот обращение к элементам формы как у вас - это нехорошо. Меня запутало сразу, вас запутает через время.
=ДатаПланНачало - это плохо, т.к. непонятно, это Элемент, переменная или функция.
=Me.ДатаПланНачало - лучше, но так принято обращаться к свойствам или методам объекта
=Me!ДатаПланНачало - еще лучше, т.к. "!", это признак обращения к дочернему объекту, но если в имени есть пробелы - нужны еще квадратные скобки.
Поэтому я не ленюсь везде в коде писать =Me![ДатаПланНачало], причем все имена - латинскими буквами (для надежности). | |
|
| |
|
|
|
| да так и написал:) я уже все понял!
единственное наверно просто я неправильно называю что то, раз вы не поняли когда я первый раз код написал?
у меня в ленточной форме так
два поля: названия ПланНач и ПланОконч и данные в них ДатаПланНачало и ДатаПланОкончание... | |
|
| |
|
|
|
| СПАСИБО ЕЩЕ РАЗ ЗА ПОМОЩЬ!!!! разобрался теперь как со следубщими записями работать! | |
|
| |