|
автор: Инна (24.10.2006 в 16:52) |
|
| Добрый день!
Есть основная таблица (большое кол-во полей), есть временные таблицы (точно такой же структуры), из которых время от времени надо подливать данные в основную таблицу. Запись должна подливаться целиком, за исключением поля идентификатора (счетчик) - оно должно просто наращиваться.
Вот не могу придумать, как бы это по-красивее сделать..
Перечислять все поля не хочется - их очень много. Да и база в процессе разработки, структура этой таблицы еще может сто раз поменяться.
Программно перебирать поля по очереди - тоже как-то стремно, вдруг по ошибке временная таблица окажется не той структуры - все закачается со сдвигом..
Очень бы выручила обычная звездочка в запросе (INSERT INTO ... SELECT ....* FROM ...), да это дурацкое поле счетчика мешает (из-за нарушений уникальности не все подливает).
Что бы придумать - посоветуйте, а?
Заранее спасибо. | |
|
| |
|
|
|
| Ну если так лень перечислять поля, да еще если поля эти могут менятся (во время разработки/переработки), то можно циклом пробежать по полям таблицы (например основной) сформировать строку из полей (f1, f2, f3, .... fn), акромя счетчика, и потом ее (полученную строку) использовать в INSERT INTO | |
|
| |
|
автор: Инна (25.10.2006 в 10:58) |
|
| Да, это вариант.
Тоже конечно геморройный, но все-таки :)
Спасибо! | |
|
| |
|
|
|
| "вдруг по ошибке временная таблица окажется не той структуры " - тогда * тоже приведет к ошибке.
видимо ничего другого, как программно перебирать поля исключив ключевое, не получится.
ну или всякая экзотика типа:
запрос на создание таблицы с данными из временной
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. | |
|
| |