|
|
|
| Суть такая не могу создать запрос, чтобы выполнялось следующие:
Есть открытая форма с 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 (последняя)
че делать, подскажите =) | |
|
| |
|
|
|
| а) в номере поле типа счетчик не можна использовать?
б) а зачем вы
Me.RecordSource = " SELECT Эталон.* FROM Эталон ORDER BY Эталон.№номер DESC;"
|
делаете? | |
|
| |
|
|
|
| можно попробовать счетчик поставить..
а это
Me.RecordSource = " SELECT Эталон.* FROM Эталон ORDER BY Эталон.№номер DESC;"
осталось видно от другой части кода.
поскажите как сделать основную часть запроса: копирование текущей в форме записи?
постараюсь еще раз объяснить по ясней :)
открыта форма с записью допустим № 110. На форме находятся поля "№Номер" - ключевое, "Эталон", "Дата" и тд.. Необходимо чтобы при нажатии кнопки, создавалась новая запись идентичная открытой, номер получал значение +1. | |
|
| |
|
|
|
| Например по 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
|
| |
|
| |
|
|
|
| fld.Value = Me.Recordset.Fields(fld.Name).Value
вот в этой строчке выдает ошибку "невозможно обновить поле" | |
|
| |
|
|
|
| "Эталон" - таблица или запрос? Возможно там есть вычисляемые поля, поэтому и ошибка.
Если нужны только 3 поля - упростите код, вместо If и For просто подставьте значения:
Me.Dirty = False 'Сохраняем изменения текущей записи
With Me.RecordsetClone
.AddNew
![№Номер] = Me![№номер]+1
![ДействительноДо] = Me![ДействительноДо]
![Эталон1] = Me![Эталон1]
.Update
Me.Bookmark = .LastModified 'Если нужно перейти на новую запись
End With
|
| |
|
| |
|
|
|
| блинн не получается ничего..
эталон - это таблица исходная и она же единственная, в ней ничего не вычисляется.
сделал по последнему Вашему совету - выдает ошибку на .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 (последняя)..
как тут быть? надо указать, чтоб номер считывался из поля на форме и на осонове этого номера уже копировалась запись. Мозги как это сделать не доходят (( или может есть другой путь?
вообщем жду Вашей помощи | |
|
| |
|
|
|
| Строчку вы добавили зря.
Какое исходное значение Me.AllowAdditions?
Покажите исходную строку в Me.RecordSource.
В принципе, в этой форме можете добавить новую запись ручками? | |
|
| |
|
|
|
| AllowAdditions - это разрешить добавление записи?
поставил True. Ручками запросто сождается новая запись.
"Покажите исходную строку в Me.RecordSource." - по подробней что надо сделать?
Не поймите меня не правильно, просто я дилетант еще.. | |
|
| |
|
|
|
| Ну так если AllowAdditions было False, а сейчас True, то и пробуйте добавить запись предложенным кодом. Должно работать, если нигде раньше не делали AllowAdditions = False.
>"Покажите исходную строку в Me.RecordSource." - по подробней что надо сделать?
Я имел ввиду текст запроса в свойстве RecordSource в конструкторе формы, но, ИМХО, это уже не нужно. | |
|
| |
|
|
|
| Я не много разобрался :) Ваш код срабатывает только в том случае, если открывается последняя запись. У меня они идут по пордяку 101, 102, 103, 105 и тд., когда открываешь 105 то тут все хорошо, запись копируется №номер + 1 = 106. А вот если копировать 102, то получается №номер 102 + 1 = 103 и тут вылазит резонная ошибка, что такой номер уже занят.
Вообщем надо как то наладить, чтоб поле номер считывалось по последнему значению, и к нему (последнему) прибавлялась еденица. Тогда все будет работать
P.S. использовать поле "счетчик" не выход | |
|
| |
|
|
|
| >>использовать поле "счетчик" не выход
в вашем случае? :)
почитайте в хелпе про bookmark | |
|
| |
|
|
|
| Но вы же сами писали: "НО данные беруться всегда из самой последней записи. ТО есть я открываю 106ую, а копируется 110 (последняя).. "
Если пришли к тому, что нужен максимальный номер +1, то:
...
![№номер] = NZ(DMax("[№номер]", "[Эталон]"))+1
... | |
|
| |
|
|
|
| СПАСИБО! работает, алилуя =))) | |
|
| |