Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: работа с датами
 
 автор: joka   (29.07.2008 в 11:13)   личное сообщение
 
 

есть ленточная форма, в нее передается из другой формы (с которой первая вызывается по кнопке) параметр id. По id эта ленточная форма отбирает и выводит записи. В записи имеются такие поля как датаначало, датаконец. Обычно по одному id отбирается несколько записей (это этапы планируемых работ, а дата1 и дата2 это даты начала и конца).
Необходимо сделать так чтобы при изменении даты2 (т.е. даты конца какого-то этапа) автоматически на этот же срок сдвинулась дата1 следующего этапа (очередность этапов можно отследить только по датам). То есть, по сути, чтобы когда меняешь дата2 в текущей записи, сдвигалась дата1 в следующей записи....

ну вот запутано объяснил еслит кто сможет помочь, заранее благодарен!

  Ответить  
 
 автор: FORMAT   (29.07.2008 в 11:58)   личное сообщение
 
 

Присваиваете значение даты переменной OldData. на событии афетр апдэйт с помощью функцииDateDiff вычисляете разницу между oldData и введенной датой. После увеличиваете значение необходимых дат на полученную разницу.

  Ответить  
 
 автор: joka   (29.07.2008 в 17:12)   личное сообщение
 
 

а как обратиться к следующей записи? так как дату надо поменять будет там...

  Ответить  
 
 автор: Анатолий (Киев)   (29.07.2008 в 18:17)   личное сообщение
 
 


With Me.Recordsetclone
  .Bookmark = Me.Bookmark
  .MoveNext
 If Not .EOF Then
  .Edit
  ![Date1] = NewDate
  .Update
 End If
End With

  Ответить  
 
 автор: joka   (31.07.2008 в 14:41)   личное сообщение
 
 

СПАСИБО Ваш вариант почти работает! объясню почему почти, при изменении date2, ваш вариант кода вносит необходимые изменения в следующую запись в date1... но после access выдает сообщение
"пока вы правили эту запись, она была изменена другим пользователем. Если сохранить запись, исправления другого пользователя будут потеряны.

копирование исправлений в буфер позволит просмотреть изменения, внесеные другим пользователем, а затем, при необходимости, втсавить свои исправления обратно.
и доступны две кнопки:
"копировать в буфер", "отменить изменения""

таким образом сами вносимые изменения в date2 не сохраняются, а в date1 (следующей записи) все нормально изменяется и сохраняется...

как преодолеть эту проблему? в чем загвоздка не подскажете?

  Ответить  
 
 автор: Анатолий (Киев)   (31.07.2008 в 15:07)   личное сообщение
 
 

ИМХО, после того, как вы изменили 1-ю запись в форме, ее нужно сохранить (например: Me.Dirty=False), а затем лезть в Me.Recordsetclone и менять другую запись.

Какое событие вы используете для выполнение этого кода? Надо AfterUpdate поля с датой.

  Ответить  
 
 автор: joka   (31.07.2008 в 15:31)   личное сообщение
 
 

да использую afterupdate на поле date2.

  Ответить  
 
 автор: joka   (31.07.2008 в 15:35)   личное сообщение
 
 

ооо , спасибо 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...

почему так не подскажете?

  Ответить  
 
 автор: joka   (31.07.2008 в 15:38)   личное сообщение
 
 

вот код

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

  Ответить  
 
 автор: joka   (01.08.2008 в 09:01)   личное сообщение
 
 

Как вы думаете почему такая разница при изменении дат?

  Ответить  
 
 автор: Анатолий (Киев)   (01.08.2008 в 11:37)   личное сообщение
 
 

Из вашего кода я не понял, что такое 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 не нужны.

  Ответить  
 
 автор: joka   (01.08.2008 в 12:16)   личное сообщение
 
 

date_end определена как public as date

ПланОконч - это название поля ленточной формы, а ДатаПланОкончание - это данные этого поля.

dif не описал совсем:(

  Ответить  
 
 автор: joka   (01.08.2008 в 12:32)   личное сообщение
 
 

Событие ПланОконч_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 :(

  Ответить  
 
 автор: joka   (01.08.2008 в 12:36)   личное сообщение
 
 

о блин сам виноват вы же написали ![ДатаПланНачало] = ![ДатаПланНачало] + dif
а я ошибся и написал ![ДатаПланНачало] = ДатаПланНачало + dif.. поэтому и была ошибка....

СПАСИБО за помощь!

  Ответить  
 
 автор: joka   (01.08.2008 в 12:38)   личное сообщение
 
 

а вообще как принято называть поле также как данные в нем? чтобы не возникало путаницы?
как у меня с ПланОконч и ДатаПланОкнчание ?

  Ответить  
 
 автор: Анатолий (Киев)   (01.08.2008 в 12:42)   личное сообщение
 
 


![ДатаПланНачало] = ДатаПланНачало + dif
Здесь ![ДатаПланНачало] - поле следующей записи в RecordsetClone, а ДатаПланНачало - поле текущей записи в форме.
Надо так:
![ДатаПланНачало] = ![ДатаПланНачало] + dif

Улавливаете разницу?

------------------------------
Не успел!

Насчет совпадения имен контролов с именами полей в источнике - это дело вкуса. Я практикую совпадение, если только контрол в процессе работы не меняет свой источник.
Например примечание может быть подключено к полю, а в некоторый момент становится вычисляемым.
А вот обращение к элементам формы как у вас - это нехорошо. Меня запутало сразу, вас запутает через время.
=ДатаПланНачало - это плохо, т.к. непонятно, это Элемент, переменная или функция.
=Me.ДатаПланНачало - лучше, но так принято обращаться к свойствам или методам объекта
=Me!ДатаПланНачало - еще лучше, т.к. "!", это признак обращения к дочернему объекту, но если в имени есть пробелы - нужны еще квадратные скобки.
Поэтому я не ленюсь везде в коде писать =Me![ДатаПланНачало], причем все имена - латинскими буквами (для надежности).

  Ответить  
 
 автор: joka   (01.08.2008 в 12:46)   личное сообщение
 
 

да так и написал:) я уже все понял!

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

два поля: названия ПланНач и ПланОконч и данные в них ДатаПланНачало и ДатаПланОкончание...

  Ответить  
 
 автор: joka   (01.08.2008 в 12:49)   личное сообщение
 
 

СПАСИБО ЕЩЕ РАЗ ЗА ПОМОЩЬ!!!! разобрался теперь как со следубщими записями работать!

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList