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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Запрос на копирование записи, 2003 версия
 
 автор: Miami   (17.06.2008 в 16:29)   личное сообщение
 
 

Суть такая не могу создать запрос, чтобы выполнялось следующие:

Есть открытая форма с 10ю полями, среди них есть ключевое поле "№номер".

Теперь мне надо создать кнопку "Новый" и чтоб при нажатии происходило примерно следующие - создается новая запись, где ключевое поле получает значение +1 к последнему, а все значения в полях этой формы остаются как были. То бишь надо создать копию этой же записи, только чтоб поле "№Номер" получило значение +1 к последнему ну и появилась новая запись.

изложил как мог =)

вот что я делал
Private Sub Кнопка12_Click()
Dim N As Integer
Me.RecordSource = " SELECT Эталон.* FROM Эталон ORDER BY Эталон.№номер DESC;"

N = Me![№номер]

CurrentDb.Execute "insert into Эталон ([№Номер],[ДействительноДо], [Эталон1]) Select " & (N + 1) & " , [ДействительноДо], [Эталон1] From Эталон where №Номер=" & N

Me.RecordSource = "SELECT ПоНомеру.* FROM ПоНомеру Where [№номер] = " & (N + 1)
Me.AllowAdditions = False
End Sub


намудрил конечно, но запись появляется новая, поле №номер получает +1 и записывается, но данные считываются всегда только с поледней записи, то есть открываю 106 а копируется всегда 110 (последняя)

че делать, подскажите =)

  Ответить  
 
 автор: Кабан   (17.06.2008 в 17:06)   личное сообщение
 
 

а) в номере поле типа счетчик не можна использовать?
б) а зачем вы

Me.RecordSource = " SELECT Эталон.* FROM Эталон ORDER BY Эталон.№номер DESC;"

делаете?

  Ответить  
 
 автор: Miami   (18.06.2008 в 01:49)   личное сообщение
 
 

можно попробовать счетчик поставить..

а это
Me.RecordSource = " SELECT Эталон.* FROM Эталон ORDER BY Эталон.№номер DESC;"
осталось видно от другой части кода.

поскажите как сделать основную часть запроса: копирование текущей в форме записи?

постараюсь еще раз объяснить по ясней :)
открыта форма с записью допустим № 110. На форме находятся поля "№Номер" - ключевое, "Эталон", "Дата" и тд.. Необходимо чтобы при нажатии кнопки, создавалась новая запись идентичная открытой, номер получал значение +1.

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

Например по Click кнопки (если в форме разрешено добавление записей):

Dim fld as DAO.Field
    Me.Dirty = False  'Сохраняем изменения текущей записи
With Me.RecordsetClone
    .AddNew
 For Each fld In .Fields
  If fld.Name = "№Номер" Then
    fld.Value = Me![№номер]+1
  Else
    fld.Value = Me.Recordset.Fields(fld.Name).Value
  End If
 Next
    .Update 
    Me.Bookmark = .LastModified 'Если нужно перейти на новую запись
End With

  Ответить  
 
 автор: Miami   (18.06.2008 в 11:39)   личное сообщение
 
 

fld.Value = Me.Recordset.Fields(fld.Name).Value

вот в этой строчке выдает ошибку "невозможно обновить поле"

  Ответить  
 
 автор: Анатолий (Киев)   (18.06.2008 в 13:40)   личное сообщение
 
 

"Эталон" - таблица или запрос? Возможно там есть вычисляемые поля, поэтому и ошибка.
Если нужны только 3 поля - упростите код, вместо If и For просто подставьте значения:

    Me.Dirty = False  'Сохраняем изменения текущей записи 
With Me.RecordsetClone 
    .AddNew 
    ![№Номер] = Me![№номер]+1 
    ![ДействительноДо] = Me![ДействительноДо] 
    ![Эталон1] = Me![Эталон1] 
    .Update  
    Me.Bookmark = .LastModified 'Если нужно перейти на новую запись 
End With

  Ответить  
 
 автор: Miami   (18.06.2008 в 16:15)   личное сообщение
 
 

блинн не получается ничего..
эталон - это таблица исходная и она же единственная, в ней ничего не вычисляется.

сделал по последнему Вашему совету - выдает ошибку на .Update "не возможно обновить".

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

Me.RecordSource = " SELECT Эталон.* FROM Эталон ORDER BY Эталон.№номер DESC;"
Me.Dirty = False  'Сохраняем изменения текущей записи
With Me.RecordsetClone
    .AddNew
    ![№номер] = Me![№номер] + 1
    ![ДействительноДо] = Me![ДействительноДо]
    ![Эталон1] = Me![Эталон1]
    .Update
    Me.Bookmark = .LastModified 'Если нужно перейти на новую запись
End With

---- то есть добавил срочку
Me.RecordSource = " SELECT Эталон.* FROM Эталон ORDER BY Эталон.№номер DESC;"
как я понимаю это источник записей, да?

после таких преобразований, запись новая создается, номер +1 делает, НО данные беруться всегда из самой последней записи. ТО есть я открываю 106ую, а копируется 110 (последняя)..
как тут быть? надо указать, чтоб номер считывался из поля на форме и на осонове этого номера уже копировалась запись. Мозги как это сделать не доходят (( или может есть другой путь?

вообщем жду Вашей помощи

  Ответить  
 
 автор: Анатолий (Киев)   (18.06.2008 в 16:26)   личное сообщение
 
 

Строчку вы добавили зря.
Какое исходное значение Me.AllowAdditions?
Покажите исходную строку в Me.RecordSource.
В принципе, в этой форме можете добавить новую запись ручками?

  Ответить  
 
 автор: Miami   (18.06.2008 в 16:35)   личное сообщение
 
 

AllowAdditions - это разрешить добавление записи?
поставил True. Ручками запросто сождается новая запись.

"Покажите исходную строку в Me.RecordSource." - по подробней что надо сделать?
Не поймите меня не правильно, просто я дилетант еще..

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

Ну так если AllowAdditions было False, а сейчас True, то и пробуйте добавить запись предложенным кодом. Должно работать, если нигде раньше не делали AllowAdditions = False.

>"Покажите исходную строку в Me.RecordSource." - по подробней что надо сделать?
Я имел ввиду текст запроса в свойстве RecordSource в конструкторе формы, но, ИМХО, это уже не нужно.

  Ответить  
 
 автор: Miami   (19.06.2008 в 01:18)   личное сообщение
 
 

Я не много разобрался :) Ваш код срабатывает только в том случае, если открывается последняя запись. У меня они идут по пордяку 101, 102, 103, 105 и тд., когда открываешь 105 то тут все хорошо, запись копируется №номер + 1 = 106. А вот если копировать 102, то получается №номер 102 + 1 = 103 и тут вылазит резонная ошибка, что такой номер уже занят.

Вообщем надо как то наладить, чтоб поле номер считывалось по последнему значению, и к нему (последнему) прибавлялась еденица. Тогда все будет работать

P.S. использовать поле "счетчик" не выход

  Ответить  
 
 автор: Кабан   (19.06.2008 в 10:12)   личное сообщение
 
 

>>использовать поле "счетчик" не выход
в вашем случае? :)

почитайте в хелпе про bookmark

  Ответить  
 
 автор: Анатолий (Киев)   (19.06.2008 в 10:30)   личное сообщение
 
 

Но вы же сами писали: "НО данные беруться всегда из самой последней записи. ТО есть я открываю 106ую, а копируется 110 (последняя).. "

Если пришли к тому, что нужен максимальный номер +1, то:
...
![№номер] = NZ(DMax("[№номер]", "[Эталон]"))+1
...

  Ответить  
 
 автор: Miami   (19.06.2008 в 15:36)   личное сообщение
 
 

СПАСИБО! работает, алилуя =)))

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