|
|
|
| Продолжение предыдущего поста.
Есть две таблицы с одинаковой структурой table_Data и table_Data_temp.
у которых есть ключевое поле типа счетчик - ID (primary key)
С помощью инструкции INSERT INTO копирую запись из table_Data в table_Data_temp.
Затем необходимо после внесенных изменений либо сохранить запись на старое место в таблице table_Data, либо добавить запись в table_Data.
С первой задачей справился, выполнив сначало удаление старой записи в table_Data, а затем INSERT INTO table_Data FROM table_Data_temp .
А со второй задачей возникли проблемы - нарушение уникальности ключа.
strSQL = "INSERT INTO table_Data SELECT table_Data_temp.* FROM table_Data_temp;"
CurrentDb.Execute (strSQL)
|
А как выполнить запрос на добавлениеь с новым уникальным ID ? | |
|
| |
|
|
|
| запрос на обнолвение "update .... where table_Data.id = table_Data_temp.id" | |
|
| |
|
|
|
| Инструкция UPDATE требует указывать имена полей таблицы, а у меня их более сотни. Очень не хочется этим заниматься.
А нельзя придумать что-нить с ' * ' ?
кроме того мне нужна копия записи с новым ID. | |
|
| |
|
|
|
|
имена полей таблицы, а у меня их более сотни
|
может ты чегото не туда делаешь???
кроме того мне нужна копия записи с новым ID. -
|
копия нужна для чего-то или как как отличаем копию от оригинала?
а зачем тебе 2 строки - одна со старыми данными другая с измененными - или тебе логи изменний нужно хранить - на сколько глубоко??? и зачем в одной и тойже таблице - размер имеет значение.
может програмно? | |
|
| |
|
|
|
| Копию записи делаю для того, чтобы дальше ее редактировать, а не создавать запись а потом заполнять вручную несколь десятков полей, когда достаточно будет изменить только несколько. Проще говоря использую одну запись в качестве шаблона для другой.
Проблему решить удалось следующим способом:
сделал копию структуры исходной таблицы
- DoCmd.TransferDatabase acExport, "Microsoft Access", CurrentDb.Name, acTable, tableSource, tableTemp, True
затем удалил в tableTemp индекс
CurrentDb.Execute "ALTER TABLE table_temp DROP CONSTRAINT поле_ID;"
|
затем удалил само поле т.к. это поле - счетчик и добавил его одратно, но уже как Integer
CurrentDb.Execute "ALTER TABLE table_temp DROP COLUMN поле_ID;"
CurrentDb.Execute "ALTER TABLE table_temp ADD COLUMN поле_ID Integer;"
|
Теперь для того чтобы добавить в исходную таблицу запись из временной необходимо
сначало добавить в исходную таблицу новую запись - .AddNew но без .Update
а затем присвоить полю ID временной таблицы значение поля ID исходной и выполнить запрос на добавление
Set rs = CurrentDb.OpenRecordset(table)
rs.AddNew
Me!поле_ID = rs!поле_ID
Set rs = Nothing
Me.Refresh
strSQL = "INSERT INTO table SELECT table_temp.* FROM table_temp WHERE поле_ID = "& Me!поле_ID & ";"
CurrentDb.Execute (strSQL)
|
| |
|
| |