Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 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
Спасибо, Евгений, за ответ.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам