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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Создание связи с запросом из другой базы
 
 автор: katerpeller   (16.06.2010 в 16:23)   личное сообщение
 
 

Господа, ввиду того, что я новичек, а поиск результатов не дал... Прошу помощи... хотя бы совета

Существует ли возможность создать связанный запрос из другой базы (так же как для связанной таблицы)?

Суть проблемы (зачем это нужно): Есть 15 разных баз под каждый отчет. Наверчено там трындец сколько... Теперь появилась необходимость свести показатели из этих 15 баз в один отчет, но при этом также массу чего нужно к этим данным подтянуть.
В каждой из этих баз есть итоговый запрос с уже правильными данными (т.е. инфой с нужными классификаторами).
В настоящий момент реализовано все через запросы на создание таблицы из каждой базы в одну.
Очень лениво каждый день при обновлении сводного отчета "лазить" во все 15 баз и запускать там эти запросы.

Баз этих 15 т.к. по размерам все в одну не влазит. Надеюсь понятно объяснил...

Думаю попробовать создать формочку с кнопками для запуска запросов на создание таблицы, но только из одной базы. Это хоть возможно?

Буду признателен хотя бы за идею...

  Ответить  
 
 автор: osmor   (16.06.2010 в 16:45)   личное сообщение
 
 

help по OpenDatabase

  Ответить  
 
 автор: katerpeller   (16.06.2010 в 17:13)   личное сообщение
 
 

посмотрел... с наскоку не вкурил... все на англицком. Буду разбираться...

  Ответить  
 
 автор: katerpeller   (17.06.2010 в 16:55)   личное сообщение
 
 

+1

  Ответить  
 
 автор: kot_k_k   (16.06.2010 в 17:02)   личное сообщение
 
 

а если такой вариант - в автозапуск (или на кнопку) базы № 1 вешаем код:

1. Запускаем нужный запрос,
2. Запускаем базу № 2 в ней автозапуском выполняем запрос и закрываем базу.
3. Запускаем базу № 3 в ней автозапуском выполняем запрос и закрываем базу.

и так 15 раз

вот так запускаем все что угодно
Dim stAppName As String
stAppName = "C:\Microsoft Office\Office10\msaccess.exe b:\baza.mdb"
Call Shell(stAppName, 0)

0 в параметре говорит о том что запускаем скрыто


Window is hidden and focus is passed to the hidden window. The vbHide constant is not applicable on Macintosh platforms.



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

  Ответить  
 
 автор: katerpeller   (16.06.2010 в 17:08)   личное сообщение
 
 

... ну как вариант - да... по крайней мере меньше кликов мышкой...

  Ответить  
 
 автор: kot_k_k   (16.06.2010 в 17:43)   личное сообщение
 
 


по крайней мере меньше кликов мышкой



клик только ОДИН!!!!

  Ответить  
 
 автор: Explorer   (16.06.2010 в 17:14)   личное сообщение
 
 


Существует ли возможность создать связанный запрос из другой базы (так же как для связанной таблицы)?



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

у меня гас.

  Ответить  
 
 автор: katerpeller   (16.06.2010 в 17:27)   личное сообщение
 
 

Главное не ссать!!! Все предусмотрено... свет запитан от отдельного дизель-генератора... Ай, Шайтанама!!!

  Ответить  
 
 автор: Explorer   (16.06.2010 в 17:40)   личное сообщение
 
 


свет запитан от отдельного дизель-генератора



я думаю нужно другой способ искать :)
не дело это - 15-ть запросов дергать

  Ответить  
 
 автор: katerpeller   (16.06.2010 в 17:44)   личное сообщение
 
 

Так вот и хочу искать...
Косяк в том, что без этих 15 баз - где по 30 разных запросов и "накруток" и куча таблиц с данными не получить те данные, которые нужно свести мне.

Пока все работает и настроено. Геморно, но делать так или иначе надо... или искать др. работу :-)))
Вот и хотел себе жизнь облегчить пока есть немного времени...

  Ответить  
 
 автор: Explorer   (16.06.2010 в 17:53)   личное сообщение
 
 


Пока все работает и настроено.



забей.

(первое правило)

  Ответить  
 
 автор: Lukas   (16.06.2010 в 18:22)   личное сообщение
 
 

"Лучшее - враг хорошего"

  Ответить  
 
 автор: DeBob   (16.06.2010 в 17:54)   личное сообщение
 
 

А кодом запускать запросы из других баз?

Dim dbs As Database
Dim wsp As Workspace
Dim qTest As QueryDef

Set wsp = DBEngine.Workspaces(0)
Set dbs = wsp.OpenDatabase("c:\testDB.accdb") ' база с запросом

Set qTest = dbs.QueryDefs("qTest") ' запрос в базе с запросом %)
dbs.Execute qTest.SQL ' выполняем этот самый запрос

dbs.Close

не покатит?

  Ответить  
 
 автор: katerpeller   (17.06.2010 в 10:18)   личное сообщение
 
 

Конечно покатит... До этого вроде уже добрался сам...

Хотя вот уж правда - лучшее - враг хорошего. Теперь хочется, чтобы в моей сводной базе таблицы не создавались...

Т.е. при запуске последнего запроса в конечной базе запускались все макросы, подтягивались данные из 15 запросов и усё. Даже чтобы лишних таблиц в конечной базе не создавалось...

Но это уже мечты.

Всем спасибо. Наверное остановлюсь на последнем варианте

  Ответить  
 
 автор: Анатолий (Киев)   (17.06.2010 в 10:51)   личное сообщение
 
 

Если во всех 15-ти базах запрос называется, например, "Итоги", то открыть его в своей БД можно так:
SELECT [Итоги].* FROM [Итоги] IN 'Путь к другому MDB'

В отчете , на событии Report_Open можно сформировать SQL строку, подставив желаемый путь, и всунуть ее в Me.RecordSource.

Добавлено.
Не досмотрел, что нужно свести данные из всех БД. Можно создать в основной БД запросы описанного выше вида и работать с ними. Если запросы однотипные, имеют одинаковое количество и назначение полей, и вам нужно получить суммарно записи из всех запросов, то можно создать один UNION запрос типа:
SELECT [Итоги].* FROM [Итоги] IN '1.mdb'
UNION ALL
SELECT [Итоги].* FROM [Итоги] IN '2.mdb'
UNION ALL
...

  Ответить  
 
 автор: katerpeller   (17.06.2010 в 12:58)   личное сообщение
 
 

Dim dbs As Database
Dim wsp As Workspace
Dim qTest As QueryDef

Set wsp = DBEngine.Workspaces(0)
Set dbs = wsp.OpenDatabase("c:\testDB.accdb") ' база с запросом

Set qTest = dbs.QueryDefs("qTest") ' запрос в базе с запросом %)
dbs.Execute qTest.SQL ' выполняем этот самый запрос

dbs.Close

Навертел как написано. Все классно!!!

Только не успокоюсь я никак... Есть еще одна заморока... как передать выполняемому запросу параметр (он используется в условии отбора). Вылазит соответственно ошибка "Слишком мало параметров. Требуется 1" Как это в коде прописать?

  Ответить  
 
 автор: katerpeller   (17.06.2010 в 13:55)   личное сообщение
 
 

Решил...

Sub Кнопка0_Click()

On Error GoTo ErrorHandler

Dim wrkAcc As Workspace
Dim dbsNorthwind As Database
Dim test1 As QueryDef

' Создаем Microsoft Access Workspace object.
Set wrkAcc = CreateWorkspace("", "admin", "", dbUseJet)
' Открываем базу с запросом
Set dbsNorthwind = wrkAcc.OpenDatabase("C:\say.mdb", _
True)

Set test1 = dbsNorthwind.QueryDefs("test1") ' запрос в базе с запросом %)
test1.Parameters(0).Value = CDate("01.06.2010") ' присваиваем значения параметра запроса
1: test1.Execute ' выполняем этот самый запрос

dbsNorthwind.Close
wrkAcc.Close

Exit Sub 'завершаем программу, чтобы не натыкаться постоянно на ErrorHandler:

ErrorHandler: 'Если таблица SAY уже есть, то удаляем её
If Err.Number = 3010 Then
Dim dbs As Object, strSQL As String
Set dbs = CurrentDb
strSQL = "DROP TABLE SAY;"
dbs.Execute strSQL
GoTo 1
End If
End Sub

  Ответить  
 
 автор: katerpeller   (17.06.2010 в 16:56)   личное сообщение
 
 

А кто-нибудь знает как при присвоении Textbox-у значения задать перенос по строкам???
Нужно чтобы значения каждой переменной отображалось построчно.

Пробывал так: ... = "Значение Y= & y & Chr(10) & "Значение Z= & z
Не работает... выдает знак вопроса в квадратике на месте Chr(10)

Хочется красоты... метод .Multiline не опознается...
Кто знает как библиотека зовется для этого?

  Ответить  
 
 автор: snipe   (17.06.2010 в 17:20)   личное сообщение
 
 

у акса Chr(13)
Chr(10) это у екселя

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

Эффект нулевой...
Нужна библиотека под это дело, т.к. для .multiline пишет Method or data member not found... Как называется не могу найти...
А без этого в одну строку херачит.

  Ответить  
 
 автор: Lukas   (17.06.2010 в 17:26)   личное сообщение
 
 


Me.txt1 = "First Row" & vbCrLf & "Second Row"

  Ответить  
 
 автор: katerpeller   (17.06.2010 в 17:31)   личное сообщение
 
 

Спасибо, но эффект тот же.
Извиняюсь забыл указать - Access 2007. Полагаю в 2003 проблем не возникло бы?

еще попробовал Me.еtxt1 = "First Row" & vbNewLine & "Second Row". Все-рно хрен.

  Ответить  
 
 автор: Lukas   (17.06.2010 в 17:40)   личное сообщение
48 Кб.
 
 

=>

  Ответить  
 
 автор: katerpeller   (17.06.2010 в 17:43)   личное сообщение
 
 





Классно что у вас работает... А можно пример рабочий с Textbox... Может я туплю чего?

  Ответить  
 
 автор: Explorer   (17.06.2010 в 17:44)   личное сообщение
 
 

проверь ссылки в референсах

  Ответить  
 
 автор: Lukas   (17.06.2010 в 17:49)   личное сообщение
17 Кб.
 
 

Пример =>

  Ответить  
 
 автор: Explorer   (17.06.2010 в 17:33)   личное сообщение
27 Кб.
 
 

vbCrLf = Chr (13) + Chr (10)

strText = "Запомните" + vbCrLf
strText = strText + "основные" + vbCrLf
strText = strText + "константы VB"
msgbox strText

==>>

  Ответить  
 
 автор: katerpeller   (17.06.2010 в 17:35)   личное сообщение
 
 

No result

  Ответить  
 
 автор: katerpeller   (17.06.2010 в 17:49)   личное сообщение
 
 

Все!!! Получилось... Спасибо. Просто глюк Access. Похерил старое поле вставил новое и все работает.
СПАСИБО ОГРОМНОЕ ЗА ПОМОЩЬ!!!!!!!!!!

  Ответить  
 
 автор: Lukas   (17.06.2010 в 18:02)   личное сообщение
 
 


...глюк Access...

Глюком Access-а считается то, что неоднократно повторяется у разных авторов.
Поскольку это встретилось впервые за два года и только у одного автора,
я склонен считать это "глюком автора".

  Ответить  
 
 автор: katerpeller   (17.06.2010 в 18:07)   личное сообщение
 
 

Нащальника, зачем ругаешься???

Просто до этого я руками проставлял в это поле значения. Сначала не мог записать в него новое, потом вот проблема с двумя строчками... Обе проблемы решены перезапуском базы... и выпиливанием старого поля.
Признаюсь - увидел форму и это поле впервые в жизни.... поэтому глюк автора тоже не исключён. Но при вставке вашего кода в поле писалось все в одну строку... Может и правда чего заглючил...пойду проветрюсь.

  Ответить  
 
 автор: Explorer   (17.06.2010 в 18:31)   личное сообщение
 
 


Но при вставке вашего кода в поле писалось все в одну строку



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

strText = "Первая срока" & vbCrLf & "Вторая строка"
Me.txtControl = strText

  Ответить  
 
 автор: Lukas   (17.06.2010 в 18:37)   личное сообщение
 
 

...вставлять переменную в нужное место
, до характерного щелчка.

  Ответить  
 
 автор: katerpeller   (18.06.2010 в 09:59)   личное сообщение
 
 

  Ответить  
 
 автор: katerpeller   (18.06.2010 в 12:14)   личное сообщение
 
 

Господа, а такой еще вопрос...

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

А есть ли возможность получить имя таблицы из строки SQL запроса. Чтобы передать через переменную в удаление таблицы = "DROP TABLE" & моя_переменная с именем таблицы;

Или у того запроса который выполняется есть какое свойство какую таблицу он меняет? Полазил нашел ссылку на таблицу только в строке SQL. Саму строку естественно загнать в переменную легко... А вот как из строки дернуть имя таблицы??? Функция Mid не совсем то что нужно, т.к. имя таблицы не всегда фиксировано, а хочется задать цикл и фигачить с одной кнопки передавая просто переменные в код.

  Ответить  
 
 автор: Explorer   (18.06.2010 в 12:21)   личное сообщение
 
 

нужно сначала удалять таблицу [DROP TABLE table_name] потом создавать новую [INSERT INTO table_name]или [CREATE TABLE table_name]

вообще перманентное создание и удаление объектов в БД ведет к распуханию базы и потребует постоянного ее обслуживания.

некоторые рекомендуют не создавать временные объекты в БД а создавать временные БД как объекты файловой системы.

ИМХО нужно еще разобраться что в твоем случае удобнее - удалять старые данные и заливать новые или удалять таблицы и создавать новые

  Ответить  
 
 автор: Гоблин   (18.06.2010 в 12:29)   личное сообщение
 
 

А вот такой вопрос. Коли 15 баз работает, а надо объединенное, то почему бы в каждой базе не создать запрос на добавление, который бы добавлял необходимые данные в таблицу для рассмотрения (скажем в определенное время) Пусть 15 баз работают на одну, а там уже работать с одной таблицей.
Или это не в тему.

  Ответить  
 
 автор: Lukas   (18.06.2010 в 13:08)   личное сообщение
 
 

Я бы, наверное, вообще сделал-бы файл-Мастер, который бы:
1. Создавал новый файл-ИтоговыхДанныхНаДату,
2. Пихал бы в него итоговые данные из 15 файлов-Данных
3. Опционально: пихал бы туда отчеты "из под брюшка", может исчо что-то, что нужно.
То есть, на выходе был бы самодостаточный файл на дату,
не зависящий от последующих изменений данных, структур таблиц, макетов отчетов и прочая.

  Ответить  
 
 автор: snipe   (18.06.2010 в 12:26)   личное сообщение
 
 

Запрос на создание таблицы автоматом удаляет таблицу с таким же именем (ну справедливости ради - выкидывает сообщение)
таким образом удалять принудительно (ручками) таблицу не нужно все происходит в процессе выполнения запроса
если напрягают сообщения то отключите их на время выполнения запроса
потом их надо обязательно включить (см help DoCmd.SetWarnings)

  Ответить  
 
 автор: katerpeller   (18.06.2010 в 12:34)   личное сообщение
 
 

Распухание - плохо. Согласен. Но не критично. Руками аналогично же получается...

А вот отключить всплывающие окна - не выход ибо в процессе выполнения кода выходит ошибка 3010 и выполнение кода прерывается пока эту таблицу не похеришь. Вопрос не в этом.

Вопрос в красоте. Хочется еще и имя таблицы куда были добавлены/удалены данные вывести в окошко (textbox) формы. Ну и заодно сделать код более гибким, в случае если например имя таблицы изменится...

Вообще у объекта Querydef есть свойство Type... добавление - 64, создание таблицы - 80. Буду думать как выдернуть имя таблицы из строки SQL. Просто думал есть более простой метод которого я не знаю/не нашел

  Ответить  
 
 автор: snipe   (18.06.2010 в 12:41)   личное сообщение
 
 

asd=CurrentDb.QueryDefs("Запрос1").SQL
выдергивает в переменную asd текст запроса
используя instr можно получить позицию начала Table и последующего ключевого слова (Order или Where) между ними находится название таблицы выдернуть Mid ом

  Ответить  
 
 автор: katerpeller   (18.06.2010 в 12:48)   личное сообщение
 
 

Спасибо... тоже думаю так. Отпишу как получится...

  Ответить  
 
 автор: katerpeller   (18.06.2010 в 13:11)   личное сообщение
 
 

Set test1 = dbsNorthwind.QueryDefs("test1") ' çàïðîñ â áàçå ñ çàïðîñîì %)
m = test1.SQL
k = test1.Type

If k = 64 Or k = 80 Then

txt = InStr(1, m, "INTO", 1) + 5
txt2 = InStr(txt, m, "[", 1)

If txt2 = txt Then
txt3 = InStr(txt, m, "]", 1) - 1
tabl_nm = Mid(m, txt + 1, txt3 - txt)
Else
txt3 = InStr(txt, m, " ", 1)
tabl_nm = Mid(m, txt, txt3 - txt)
End If
End If

Вот как-то так... Все работает. Естественно только для запроса на создание или добавление... над другими думать лень, т.к. не использую их в работе

  Ответить  
 
 автор: Explorer   (18.06.2010 в 13:30)   личное сообщение
 
 


между ними находится название таблицы выдернуть Mid ом



это феерическое решение - узнавать имена объетов собственных БД

пространство имен таблиц и запросов является жестко регламентированным справочником (как и имена полей таблиц и запросов и типы данных полей) - это все заведомо известно и сфомулированно на этапе проектирования БД

за исключением пользовательских запросов и таблиц если у пользователей есть привелегии на создание запросов и таблиц

выдергивать инстринг'ом имя таблицы из текста запроса это примерно то-же что вырезать гланды автогеном через известное место - та как бы выясняешь "а о чем и у кого спрашивает этот запрос" так ты же сам его писал!

  Ответить  
 
 автор: snipe   (18.06.2010 в 16:00)   личное сообщение
 
 

to Explorer
полностью с Вами согласен
однако пока доберешься до рационального способа мышления проходит много времени
приходится опираться на шестое чувство (обидно если это доходит через пятую точку) - самоучением занимаюсь однако(не все выходит - собака-лар)
более того автор сам так хотел

  Ответить  
 
 автор: katerpeller   (21.06.2010 в 14:50)   личное сообщение
 
 

Шикарный пост... я же грю... я новенькой. В Аксесе так сказать вторую неделю...
Решил задать "знающим" ребяткам вопрос... "мол, как бы вытащить имя таблы, а?" Я вот только так наверное сделать могу ("автогеном гланды"....) мож есть более мудрое решение, а?
Получаю ответ... "ага, делай...так оч.классно!!!"
Что же мешало меня направить на путь истинный???
P.S. А "автор сам так хотел" именно потому, что не знает как по-другому и привык думать своей головой, а не ждать, чтоб за тебя сделал кто-то. Хотелось лишь малюсенькой подсказки...самой крошечной...типа "выбрось автоген, возьми болгарку!!!"
Ну и без обид конечно... просто удивился двум последним постам.

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