Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Добавление записей в таблицу - как бы извернуться?...
 
 автор: Инна   (24.10.2006 в 16:52)
 
 

Добрый день!
Есть основная таблица (большое кол-во полей), есть временные таблицы (точно такой же структуры), из которых время от времени надо подливать данные в основную таблицу. Запись должна подливаться целиком, за исключением поля идентификатора (счетчик) - оно должно просто наращиваться.
Вот не могу придумать, как бы это по-красивее сделать..
Перечислять все поля не хочется - их очень много. Да и база в процессе разработки, структура этой таблицы еще может сто раз поменяться.
Программно перебирать поля по очереди - тоже как-то стремно, вдруг по ошибке временная таблица окажется не той структуры - все закачается со сдвигом..
Очень бы выручила обычная звездочка в запросе (INSERT INTO ... SELECT ....* FROM ...), да это дурацкое поле счетчика мешает (из-за нарушений уникальности не все подливает).
Что бы придумать - посоветуйте, а?
Заранее спасибо.

  Ответить  
 
 автор: KrukVN   (24.10.2006 в 17:23)   личное сообщение
 
 

Ну если так лень перечислять поля, да еще если поля эти могут менятся (во время разработки/переработки), то можно циклом пробежать по полям таблицы (например основной) сформировать строку из полей (f1, f2, f3, .... fn), акромя счетчика, и потом ее (полученную строку) использовать в INSERT INTO

  Ответить  
 
 автор: Инна   (25.10.2006 в 10:58)
 
 

Да, это вариант.
Тоже конечно геморройный, но все-таки :)
Спасибо!

  Ответить  
 
 автор: osmor   (24.10.2006 в 17:34)   личное сообщение
 
 

"вдруг по ошибке временная таблица окажется не той структуры " - тогда * тоже приведет к ошибке.
видимо ничего другого, как программно перебирать поля исключив ключевое, не получится.
ну или всякая экзотика типа:
запрос на создание таблицы с данными из временной
SELECT * INTO tblTemp$ FROM Временная;
потом удаление из этой таблицы ключевого поля
currentdb.Execute ("ALTER TABLE table1 drop COLUMN id;")

  Ответить  
 
 автор: Аноним   (24.10.2006 в 17:46)
 
 

что-то я видно не ту кнобку нажал - можно лишнее делитнуть? :)))

  Ответить  
 
 автор: Инна   (25.10.2006 в 11:01)
 
 

Оо, спасибо!
Благодаря Вам мне пришло в голову, что временные таблицы можно будет попробовать сделать вообще без ключевого поля :)

  Ответить  
 
 автор: Аноним   (24.10.2006 в 17:42)
 
 

Инна, вы все с цистернами воюете? :)


такой запрос как вам нужно должен быть динамическим -

он будет состоять из Стэйтментов 2-х типов,

декларативная часть фиксированная - Insert Into ... From ...
и переменная часть - динамически формируемая функцией

т.е запрос вам нужно строить каждые раз по-новой в коде VBA

при построении запроса вы можете в цикле пробегать коллекцию Fields объекта TableDefs и налету формировать стринг вашего SQL запроса

лучше использовать цикл ForEach Field in TalbleName.Fields - попробуйте выполнить такой пример (таблица Example должна быть в базе)


Private Sub SomeButtonClick()
For Each Field In CurrentDb.OpenRecordset("Example").Fields
MsgBox Field.Name
Next
End Sub


и еще - довольно подробный пример есть в хелпе к VBA для Access.

  Ответить  
 
 автор: Аноним   (24.10.2006 в 17:44)
 
 

Инна, вы все с цистернами воюете? :)


такой запрос как вам должен быть динамическим -

он будет состоять из Стэйтментов 2-х типов,

декларативная часть фиксированная - Insert Into ... From ... и переменная часть - динамически формируемая функцией

т.е запрос вам нужно строить каждые раз по-новой в коде VBA

при построении запроса вы можете в цикле пробегать коллекцию Fields объекта Recordset (или иного - смотрите в приложенном рисунке) и налету формировать стринг вашего SQL запроса подхватывая имя каждого элемента коллекции. вы будете подставлять его в стринг вашего запроса.

лучше использовать цикл ForEach Field in TalbleName.Fields - попробуйте выполнить такой пример (таблица Example должна быть в базе)


Private Sub SomeButtonClick()
For Each Field In CurrentDb.OpenRecordset("Example").Fields
MsgBox Field.Name
Next
End Sub


и еще - довольно подробный пример есть в хелпе к VBA для Access.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList