Страница: 1 |
Страница: 1 |
Вопрос: как скопировать таблицу?
Добавлено: 19.06.05 22:11
Автор вопроса: Whiskey | ICQ: 254-066-754
Ситуация такова:
Есть база .мдб и в ней таблица. В таблице были удалены некоторые записи и в поле с автосчётчиком остались от этого “пробелы”.
Я хочу чтобы в таблице записи снова стали по порядку.
Для этого хочу создать копию таблицы в той же базе под другим именем, потом создать пустую таблицу точно такой же структуры и с помощью обьекта recordset добавлять записи из старой таблицы в новую поштучно(на данный момент там ок 300 000 записей).
Я не знаю способа, как можно было бы скопировать таблицу полностью, с сохранением всех не только записей, но и свойств, заданных из среды MS Access, таких как Format, Lookup... Как задать эти свойства при создании базы програмно, я тоже не знаю.
Я пробовал копировать таблицу так(других способов не знаю):
SELECT * INTO ИмяТабл(куда) FROM ИмяТабл(откуда)
В итоге получилась таблица, содержащая те же данные, но в её свойствах Format и lookup совсем другие значения, отличные от оригинала. Например, в lookup было checkbox, а вновой таблице стало textbox. Свойство Format было Yes\No, а стало пустым.
Подскажите другие способы скопировать таблицу, а также, как задать вышеуказанные свойства полей при создании базы програмно (DAO). Не пинайте, если что – я новичок 
Ответы
Всего ответов: 4
Номер ответа: 1
Автор ответа:
Евгений
ICQ: 197548611
Вопросов: 2
Ответов: 2
Профиль | | #1
Добавлено: 28.07.05 07:42
Рецепт кажись есть...
пошагово...
1) создаёшь пустую базу данных
2) заходишь в меню файл --- внешние данные --- импорт
3) там выбираешь ту базу, откуда хочешь дёрнуть табличку
4) в появившемся окошке импорта жмёшь "дополнительно" и ставишь галочку "только структура"
5) импортируешь
!!!6) вот тебе готов скелетик таблички со всеми свойствами полей
ну а дальше можешь поступать следующим образом:
1) импортируешь опять эту же таблицу в новую базу НО уже полностью - т.е. структура и данные (само собой имена не должны совпадать... поменять имя ручками - не проблема)
2) в окне ВБА "tools---references" подключаешь Microsoft dao 3.6
3) код не сложен...
Option Explicit
Dim rsOLD As DAO.Recordset
Dim rsNEW As DAO.Recordset
Sub EXP_NEW()
Set rsOLD = CurrentDb.OpenRecordset("имя старой таблицы"
Set rsNEW = CurrentDb.OpenRecordset("имя старой таблицы"
rsOLD.MoveLast: rsOLD.MoveFirst
While Not rsOLD.EOF
rsNEW.AddNew
rsNEW.Fields(1) = rsOLD.Fields(1)
rsNEW.Fields(2) = rsOLD.Fields(2)
' и так далее - сколько полей нужно... только не
' присваивай значения в поле, где счётчик
rsNEW.Update
rsOLD.MoveNext
Wend
End Sub
!!! надеюсь, что я не ошибся в коде... если что дай сигнал...
И дальше просто экспортируешь новорождённую табличку в свою родную базу
Номер ответа: 2
Автор ответа:
Евгений
ICQ: 197548611
Вопросов: 2
Ответов: 2
Профиль | | #2
Добавлено: 28.07.05 07:44
... прости...конечно...
Set rsNEW = CurrentDb.OpenRecordset("имя новой таблицы"
Номер ответа: 3
Автор ответа:
Whiskey
ICQ: 254-066-754
Вопросов: 1
Ответов: 2
Профиль | | #3
Добавлено: 28.07.05 19:37
Проблему я решил так:
'references Microsoft Access 10.0 Object Library
' Microsoft DAO 3.6 Object Library
Dim ACCSS As New Access.Application
Dim DB As DAO.Database
Dim RSfrom As DAO.Recordset, RSto As DAO.Recordset
Dim Path As String
Path = App.Path & "\Data.mdb"
ACCSS.OpenCurrentDatabase Path
'делаем копию старой таблицы но с другим именем
DoCmd.TransferDatabase acImport, "Microsoft Access", Path, acTable, "Archyv", "Archyv1"
'удаляем старую таблицу
DoCmd.DeleteObject acTable, "Archyvas"
'создаём новую, но пустую таблицу с той же структурой
DoCmd.TransferDatabase acImport, "Microsoft Access", Path, acTable, "Archyvas1", "Archyvas", True
'открываем базу и копируем записи поштучно,
'поле с autonumber не трогаем, оно
'устанавливается само от 1 и по порядку
Set DB = OpenDatabase(Path)
Set RSfrom = DB.OpenRecordset("SELECT * FROM Archyv1 ORDER BY Nr"
Set RSto = DB.OpenRecordset("Archyv"
RSfrom.MoveFirst
Do Until RSfrom.EOF
RSto.AddNew
RSto!Field1 = RSfrom!Field1
RSto!Field2 = RSfrom!Field2
RSto!Field3 = RSfrom!Field3
RSto.Update
RSfrom.MoveNext
Loop
'затираем копию старой таблицы
DoCmd.DeleteObject acTable, "Archyv1"
Set RSfrom = Nothing
Set RSto = Nothing
Set ACCSS = Nothing
Set DB = Nothing
Номер ответа: 4
Автор ответа:
Whiskey
ICQ: 254-066-754
Вопросов: 1
Ответов: 2
Профиль | | #4
Добавлено: 28.07.05 19:46
Спасибо, Евгений, за ответ.