SQL запрос в MS access с многочисленными связанными таблицами

SupremeB
Дата: 02.12.2009 12:46:03
Доброго всем времени суток.
Ситуация:
Существует специальная папка, в которую скидывается информация по городам. Информация в виде excel-файлов (2007).
В access (2007) существуют связанные таблицы ко всем этим екселевским файлам соответственно. В sql прописан запрос на соединение всех этих файлов в один.

Система работы следующая: новые файлы каждую неделю скидываются в эту специальную папку - заменяя старые. В access-е эти файлы добавляются к предыдущему массиву информации.
Все бы хорошо...
НО: не всегда кол-во файлов excel одинаков, т.е. в какую-то неделю может быть 24 города, а в какую-то 22, а в запросе sql прописаны все 24 и когда запрос не видит недостающий связанный файл он выдает ошибку- "Ядро базы access не может найти привязанный файл и т.п."
Можно ли в sql как-то прописать, что- "если нет файла не обращай внимания на него и работай с тем что есть" или эту проблему можно как-то по-другому решить в access-e

Спасибо.
P.S. запрос прикреплен в тхт файле
mds_world
Дата: 02.12.2009 12:57:14
SupremeB,

если правильно понял, то самый простой выход - поставить в код директиву On Error Resume next. Если файла нет и возникнет ошибка, сработает перенаправление действия кода.

Но можно и иначе - просматривать какие файлы есть в папке и только по ним качать данные. Обычно такой цикл делают с помощьб Dir.
mds_world
Дата: 02.12.2009 12:59:03
О, не обратил внимания, что все города прописаны в одном запросе!!! А зачем? Почему нельзя сделать цикл по городам в отдельности?
SupremeB
Дата: 02.12.2009 13:05:13
Огромное спасибо за ответы.
Я просто неопытный - как сделать цикличность не знаю. Если не трудно расскажите как, буду очень признателен.
тут
Дата: 02.12.2009 13:33:59
mds_world
Дата: 02.12.2009 13:34:35
SupremeB,
сделайте табличку Города с полями
id NameSity NameXlsfile

И, примерно такую процедуру (с учетом моего незнания процесса у вас)
Dim s, rst as DAO.Recordset, db as Database, nameTown, NameXls
On Error Resume Next
Set db=CurrentDB
Set rst=db.Openrecordset("Select * from Города")
rst.Movelast: rst.MoveFirst

Do Until.rst.Eof
  nameTown=rst!NameSity
  NameXls=rst!NameXlsfile
  s="текст запроса на вставку одного города Where NameXlsfile='" & NameXls
  db.Execute
Next 
Про текст запроса ничего сказать не могу, поскольку вы не привели необходимое описание процесса

В этой процедуре, в цикле обходится таблица Города и сразу же в коде строится и выполняется запрос на вставку данных по этому городу
SupremeB
Дата: 02.12.2009 13:56:41
Немножко не понял.
Может будет понятнее если я выложу запрос который сейчас есть:

INSERT INTO [база арматура] ( [№ п/п], [наименование профиля], марка, НТД, размер, диапозон, раскрой, [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], Трейдер, дата, месяц, Неделя, филиал, подразделение )
SELECT [%$##@_Alias].[№ п/п], [%$##@_Alias].[наименование профиля], [%$##@_Alias].марка, [%$##@_Alias].НТД, [%$##@_Alias].размер, [Справочник_размер-арматура].Диапозон, [%$##@_Alias].раскрой, [%$##@_Alias].[Мин Цена конкурента ( маркетолог)], [%$##@_Alias].[Мин Цена конкурента (менеджер)], [%$##@_Alias].Трейдер, [%$##@_Alias].дата, Дата_месяц_переходник.Месяц, Дата_месяц_переходник.Неделя, [Справочник-переходник филиалы].[Филиал наз2], [%$##@_Alias].подразделение
FROM (((
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура анапа] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура астрахань] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура барнаул] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура волгоград] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура екб] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура ижевск] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура иркутск] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура казань] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура кемерово] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура краснодар] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура москва] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура ннг] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура новосибирск] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура омск] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура пермь] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура ростов] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура самара] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура саратов] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура сочи] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура спб] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура тюмень] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура ульяновск] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура уфа] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура челябинск] union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база_арматура ярославль]union all
select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from [база шапка]) AS [%$##@_Alias] INNER JOIN [Справочник_размер-арматура] ON [%$##@_Alias].размер = [Справочник_размер-арматура].Размер)
LEFT JOIN [Справочник-переходник филиалы] ON [%$##@_Alias].филиал = [Справочник-переходник филиалы].[Филиал наз1]) LEFT JOIN Дата_месяц_переходник ON [%$##@_Alias].дата = Дата_месяц_переходник.Дата;
SupremeB
Дата: 02.12.2009 14:13:01
Внизу там справочники два присоединены, но это не столь важно.
отакота
Дата: 02.12.2009 14:40:30
Можно переписать запрос так, чтобы вместо вашего union-подзапроса там была выборка из одной исходной таблицы (имя которой туда динамически подставляется) и выполнять этот запрос в цикле по заранее сделанному списку исходных таблиц - с предварительной проверкой наличия файла соответсвующей таблицы в вашем исходном каталоге.
mds_world
Дата: 02.12.2009 14:44:13
Не проверял


Города
id NameSity NameXlsfile
1 анапа база_арматура анапа
2 астрахань база_арматура астрахань
3 барнаул база_арматура барнаул
4


Sub addFromXls()

  Dim s, rst as DAO.Recordset, db as Database, nameTown, NameXls
  dim slkt, fm
  On Error Resume Next
  slkt="INSERT INTO [база арматура] ( [№ п/п], [наименование профиля], марка, НТД, размер, " _
  & " диапозон, раскрой, [Мин Цена конкурента ( маркетолог)], [Мин Цена конкурента   (менеджер)], " _
  & " Трейдер, дата, месяц, Неделя, филиал, подразделение ) " _
  & " SELECT [%$##@_Alias].[№ п/п], [%$##@_Alias].[наименование профиля], [%  $##@_Alias].марка, " _
  & " [%$##@_Alias].НТД, [%$##@_Alias].размер, [Справочник_размер-арматура].Диапозон, " _
  & " [%$##@_Alias].раскрой, [%$##@_Alias].[Мин Цена конкурента ( маркетолог)], " _
  & " [%$##@_Alias].[Мин Цена конкурента (менеджер)], [%$##@_Alias].Трейдер, " _
  & " [%$##@_Alias].дата, Дата_месяц_переходник.Месяц, Дата_месяц_переходник.Неделя, " _
  & " [Справочник-переходник филиалы].[Филиал наз2], [%$##@_Alias].подразделение " _
  & " FROM " 

  fm="  (select [№ п/п], [наименование профиля], [марка], [НТД], [размер], [раскрой], [Мин Цена конкурента ( маркетолог)], " _
  & " [Мин Цена конкурента (менеджер)], [Трейдер], [дата], [филиал], [подразделение] from "

  Set db=CurrentDB
  Set rst=db.Openrecordset("Select * from Города")
  rst.Movelast: rst.MoveFirst

  Do Until.rst.Eof
    nameTown=rst!NameSity
    NameXls=rst!NameXlsfile
    fm=fm & " [" & rst!NameXlsfile & "]) "
    s= slkt & fm 
    db.Execute
  Next 
End Sub[/SRC]