Access, как програмно скопировать таблицу?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Руслан С.
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 21.06.2005 (Вт) 1:08
Откуда: Lithuania

Access, как програмно скопировать таблицу?

Сообщение Руслан С. » 21.06.2005 (Вт) 1:21

Ситуация такова:
Есть база .мдб и в ней таблица. В таблице были удалены некоторые записи и в поле с автосчётчиком остались от этого “пробелы”.

Я хочу чтобы в таблице записи снова стали по порядку.

Для этого хочу создать копию таблицы в той же базе под другим именем, потом создать пустую таблицу точно такой же структуры и с помощью обьекта recordset добавлять записи из старой таблицы в новую поштучно(на данный момент там ок 300 000 записей).

Я не знаю способа, как можно было бы скопировать таблицу полностью, с сохранением всех не только записей, но и свойств, заданных из среды MS Access, таких как Format, Lookup... Как задать эти свойства при создании базы програмно, я тоже не знаю.

Я пробовал копировать таблицу так(других способов не знаю):
SELECT * INTO ИмяТабл(куда) FROM ИмяТабл(откуда)
В итоге получилась таблица, содержащая те же данные, но в её свойствах Format и lookup совсем другие значения, отличные от оригинала. Например, в lookup было checkbox, а вновой таблице стало textbox. Свойство Format было Yes\No, а стало пустым.

Подскажите другие способы скопировать таблицу, а также, как задать вышеуказанные свойства при создании базы програмно (DAO).
Люблю повеселиться, а особенно - пожрать!!!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.06.2005 (Вт) 7:09

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 21.06.2005 (Вт) 8:17

Последний раз редактировалось Al Khamid 07.12.2007 (Пт) 23:06, всего редактировалось 1 раз.

Руслан С.
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 21.06.2005 (Вт) 1:08
Откуда: Lithuania

Сообщение Руслан С. » 21.06.2005 (Вт) 8:45

Al Khamid писал(а):Только непонятно, зачем нужна такая "стройность", зачем удалять "пробелы"? Думаешь, что счетчика не хватит на всю жизнь?

Понимаешь... надо, чтобы шеф никогда не узнал о стирании записей :wink:
Люблю повеселиться, а особенно - пожрать!!!

Руслан С.
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 21.06.2005 (Вт) 1:08
Откуда: Lithuania

Сообщение Руслан С. » 21.06.2005 (Вт) 9:22

Al Khamid писал(а):DoCmd.CopyObject, "Сотрудники (копия)", acTable, "Сотрудники"

вот что я сделал:
Dim A As Access.Application
Set A = New Access.Application

A.DoCmd.CopyObject "E:\Data.mdb", "Таблица1", acTable, "Таблица"

получил ошибку "You can't carry out this action at the present time"

Al Khamid писал(а):Программно и через SQL это прокатывает.


В таком случае может я зря заморачиваюсь с копированием, может нужно просто перенумеровать записи в оригинальной таблице?
А что, просто полю с автоинкремент присваиваешь новое значение и он его принимает? так просто?
Люблю повеселиться, а особенно - пожрать!!!

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 21.06.2005 (Вт) 12:03

А если хочешь чтобы шеф не видел пробелы, то можешь поступить так:
select * from имя_таблицы order by имя_поля счетчика
Этим самым ты получаешь всю таблицу упорядочную по возрастанию счетчика.
Потом делаешь цикл по количеству записей в таблице и меняешь значения поля счетчика по возрастанию с 1 до кол-ва записей, что-то типа типа:
rs.movefirst
for i= 1 to rs.recordcount
rs.edit
rs.fields("имя_поля_счетчика")=i
rs.update
rs.movenext
next i
Это можно и в макросе access сделать и не надо мучаться....

Руслан С.
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 21.06.2005 (Вт) 1:08
Откуда: Lithuania

Сообщение Руслан С. » 21.06.2005 (Вт) 15:58

Алексей К. писал(а):Это можно и в макросе access сделать и не надо мучаться....


Поле с автосчётчиком и первичным ключом...

при попытке редактирования
rs.fields("имя_поля_счетчика")=i
эта строка вызвала ошибку.

Итак, кто-нибудь может сказать, как из кода VB работать с обьектами из библиотеки Microsoft Access 10.0 Object Library?

В самом акцесе есть такая функция Export, это когда правым кликом на таблице. Там можно экспортировать только структуру таблицы или полностью всю таблицу с данными. Научите меня вызвать эту функцию из VB, пожалуйста.
Люблю повеселиться, а особенно - пожрать!!!

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 21.06.2005 (Вт) 16:06

читай описание на функцию TransferDatabase

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 21.06.2005 (Вт) 16:21

Руслан С. писал(а):
Al Khamid писал(а):Только непонятно, зачем нужна такая "стройность", зачем удалять "пробелы"? Думаешь, что счетчика не хватит на всю жизнь?

Понимаешь... надо, чтобы шеф никогда не узнал о стирании записей :wink:


А что за система, если не секрет?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Руслан С.
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 21.06.2005 (Вт) 1:08
Откуда: Lithuania

Сообщение Руслан С. » 21.06.2005 (Вт) 18:11

Sebas писал(а):А что за система, если не секрет?


да не секрет :)
програма написана одним програмером-студентом и предназначена для видеопроката.
Люблю повеселиться, а особенно - пожрать!!!

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 22.06.2005 (Ср) 7:46

лд
Последний раз редактировалось Al Khamid 07.12.2007 (Пт) 23:45, всего редактировалось 1 раз.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 22.06.2005 (Ср) 8:14

Я не знал что поле счетчик даже программно изменять нельзя, так что остается как уже говорили удалить поле-счетчик, потом создать.
Вот код:
Код: Выделить всё

база = App.Path + "\" + "db1.mdb"
таблица = "Таблица1"
Set db = OpenDatabase(база, False)
'удаляем поле-счетчик
db.Execute ("alter table таблица1 drop счетчик")
'создаем поле-счетчик
Set tbl = db.TableDefs(таблица)
Set fld = tbl.CreateField("счетчик", dbLong)
fld.Attributes = fld.Attributes + dbAutoIncrField
tbl.Fields.Append fld
db.Close

Ну и сам пример программы с базой (база изначально содержит "пробелы" в счетчике):
У вас нет доступа для просмотра вложений в этом сообщении.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.06.2005 (Ср) 12:39

Если ты смог удалить поле-счётчик, значит, в таблице нет связей по нему. А значит, это поле вообще не имеет смысла.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Руслан С.
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 21.06.2005 (Вт) 1:08
Откуда: Lithuania

Сообщение Руслан С. » 22.06.2005 (Ср) 14:25

Al Khamid писал(а): Поэтому так запросто меняя коды, мы нахрен убиваем всю накопленную информацию. Если этот код ни с чем не завязан, то его смысл вообще отпадает..


Раньше его вообще не было, но шеф попросил, чтобы можно было как-то контролировать целостность таблицы, вот и сделали ему поле пронумерованное и програмку, которая бегает по этому полю и говорит, когда находит окно. А связи нет. Смысл первичного ключа в данном случае в том, что его редактировать нельзя.

Al Khamid писал(а):В общем делаешь следующее: в свойствах поля счетчика (режим конструктора таблицы) свойство "новые значения" ставишь "Случайные" вместо "Последовательные". И вот тогда пойди разбери сколько было, сколько удалено.....


Это тоже не подходит, так как шеф контролирует порядок.

Al Khamid писал(а):Могу подкинуть программу для видеопроката.

Если можно... :) на мыло budhead (eta) bamba (тчк) lt
Люблю повеселиться, а особенно - пожрать!!!

Руслан С.
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 21.06.2005 (Вт) 1:08
Откуда: Lithuania

Сообщение Руслан С. » 22.06.2005 (Ср) 14:45

Я решил эту задачку так:

Option Explicit
Const Path As String = "C:\Data.mdb"

Sub Main()
Dim ACCSS as New Access.Aplication
Dim DB as DAO.DAtabase
Dim RSfrom as DAO.Recordset, RSto As DAO.recordset

ACCSS.NewCurrentDatabase Path

DoCmd.TransferDatabase acImport, "Microsoft Access", "C:\data.mdb", acTable, "Tbl_ORG", "Tbl_CopyORG"

DoCmd.DeleteObject acTable, "Tbl_ORG"

DoCmd.TransferDatabase acImport, "Microsoft Access", "C:\data.mdb", acTable, "Tbl_CopyORG", "Tbl_ORG", True

Set DB = OpenDatabase(Path)
Set RSfrom = DB.OpenRecordset("Tbl_CopyORG")
Set RSto = DB.OpenRecordset("Tbl_ORG")
RSfrom.MoveFirst
Do Until RSfrom.EOF
RSto.AddNew
RSto!Field1 = RSfrom!Field1
RSto!Field2 = RSfrom!Field2
RSto.Update
RSfrom.MoveNext
Loop
Set RSfrom = Nothing
Set RSto = Nothing
Set DB = Nothing
DoCmd.DeleteObject acTable, "Tbl_CopyORG"
Set ACCSS = Nothing

ВСЕМ БОЛЬШОЕ СПАСИБО ЗА УЧАСТИЕ
СПАСИБО Konst One ЗА ТО, ЧТО НАДОУМИЛ С ФУНКЦИЕЙ
TransferDatabase
Люблю повеселиться, а особенно - пожрать!!!


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList