|
|
|
| Господа, ввиду того, что я новичек, а поиск результатов не дал... Прошу помощи... хотя бы совета
Существует ли возможность создать связанный запрос из другой базы (так же как для связанной таблицы)?
Суть проблемы (зачем это нужно): Есть 15 разных баз под каждый отчет. Наверчено там трындец сколько... Теперь появилась необходимость свести показатели из этих 15 баз в один отчет, но при этом также массу чего нужно к этим данным подтянуть.
В каждой из этих баз есть итоговый запрос с уже правильными данными (т.е. инфой с нужными классификаторами).
В настоящий момент реализовано все через запросы на создание таблицы из каждой базы в одну.
Очень лениво каждый день при обновлении сводного отчета "лазить" во все 15 баз и запускать там эти запросы.
Баз этих 15 т.к. по размерам все в одну не влазит. Надеюсь понятно объяснил...
Думаю попробовать создать формочку с кнопками для запуска запросов на создание таблицы, но только из одной базы. Это хоть возможно?
Буду признателен хотя бы за идею... | |
|
| |
|
|
|
|
| посмотрел... с наскоку не вкурил... все на англицком. Буду разбираться... | |
|
| |
|
|
|
|
| а если такой вариант - в автозапуск (или на кнопку) базы № 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.
|
возможно вариант не самый элегантный, но думаю имеет место быть.
Может кто еще поскажет как запустить акс и в базу передать параметр, что бы запустить нужную процедуру, а не ставит ее в автозапуск - так я не изгалялся ищё. | |
|
| |
|
|
|
| ... ну как вариант - да... по крайней мере меньше кликов мышкой... | |
|
| |
|
|
|
|
по крайней мере меньше кликов мышкой
|
клик только ОДИН!!!! | |
|
| |
|
|
|
|
Существует ли возможность создать связанный запрос из другой базы (так же как для связанной таблицы)?
|
очень много зависит от характеристик сети.
если в офисе будет гаснуть свет на тяжелых запросах - не удивляйся.
у меня гас. | |
|
| |
|
|
|
| Главное не ссать!!! Все предусмотрено... свет запитан от отдельного дизель-генератора... Ай, Шайтанама!!! | |
|
| |
|
|
|
|
свет запитан от отдельного дизель-генератора
|
я думаю нужно другой способ искать :)
не дело это - 15-ть запросов дергать | |
|
| |
|
|
|
| Так вот и хочу искать...
Косяк в том, что без этих 15 баз - где по 30 разных запросов и "накруток" и куча таблиц с данными не получить те данные, которые нужно свести мне.
Пока все работает и настроено. Геморно, но делать так или иначе надо... или искать др. работу :-)))
Вот и хотел себе жизнь облегчить пока есть немного времени... | |
|
| |
|
|
|
|
Пока все работает и настроено.
|
забей.
(первое правило) | |
|
| |
|
|
|
| "Лучшее - враг хорошего" | |
|
| |
|
|
|
| А кодом запускать запросы из других баз?
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
не покатит? | |
|
| |
|
|
|
| Конечно покатит... До этого вроде уже добрался сам...
Хотя вот уж правда - лучшее - враг хорошего. Теперь хочется, чтобы в моей сводной базе таблицы не создавались...
Т.е. при запуске последнего запроса в конечной базе запускались все макросы, подтягивались данные из 15 запросов и усё. Даже чтобы лишних таблиц в конечной базе не создавалось...
Но это уже мечты.
Всем спасибо. Наверное остановлюсь на последнем варианте | |
|
| |
|
|
|
| Если во всех 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
... | |
|
| |
|
|
|
| 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" Как это в коде прописать? | |
|
| |
|
|
|
| Решил...
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 | |
|
| |
|
|
|
| А кто-нибудь знает как при присвоении Textbox-у значения задать перенос по строкам???
Нужно чтобы значения каждой переменной отображалось построчно.
Пробывал так: ... = "Значение Y= & y & Chr(10) & "Значение Z= & z
Не работает... выдает знак вопроса в квадратике на месте Chr(10)
Хочется красоты... метод .Multiline не опознается...
Кто знает как библиотека зовется для этого? | |
|
| |
|
|
|
| у акса Chr(13)
Chr(10) это у екселя | |
|
| |
|
|
|
| Эффект нулевой...
Нужна библиотека под это дело, т.к. для .multiline пишет Method or data member not found... Как называется не могу найти...
А без этого в одну строку херачит. | |
|
| |
|
|
|
|
Me.txt1 = "First Row" & vbCrLf & "Second Row"
|
| |
|
| |
|
|
|
| Спасибо, но эффект тот же.
Извиняюсь забыл указать - Access 2007. Полагаю в 2003 проблем не возникло бы?
еще попробовал Me.еtxt1 = "First Row" & vbNewLine & "Second Row". Все-рно хрен. | |
|
| |
|
48 Кб. |
|
| => | |
|
| |
|
|
|
|
Классно что у вас работает... А можно пример рабочий с Textbox... Может я туплю чего? | |
|
| |
|
|
|
| проверь ссылки в референсах | |
|
| |
|
17 Кб. |
|
| Пример => | |
|
| |
|
27 Кб. |
|
| vbCrLf = Chr (13) + Chr (10)
strText = "Запомните" + vbCrLf
strText = strText + "основные" + vbCrLf
strText = strText + "константы VB"
msgbox strText
==>> | |
|
| |
|
|
|
|
| Все!!! Получилось... Спасибо. Просто глюк Access. Похерил старое поле вставил новое и все работает.
СПАСИБО ОГРОМНОЕ ЗА ПОМОЩЬ!!!!!!!!!! | |
|
| |
|
|
|
|
Глюком Access-а считается то, что неоднократно повторяется у разных авторов.
Поскольку это встретилось впервые за два года и только у одного автора,
я склонен считать это "глюком автора".
| |
|
| |
|
|
|
| Нащальника, зачем ругаешься???
Просто до этого я руками проставлял в это поле значения. Сначала не мог записать в него новое, потом вот проблема с двумя строчками... Обе проблемы решены перезапуском базы... и выпиливанием старого поля.
Признаюсь - увидел форму и это поле впервые в жизни.... поэтому глюк автора тоже не исключён. Но при вставке вашего кода в поле писалось все в одну строку... Может и правда чего заглючил...пойду проветрюсь. | |
|
| |
|
|
|
|
Но при вставке вашего кода в поле писалось все в одну строку
|
некоторые рекомендуют сначала собирать текст в переменной потом вставлять переменную в нужное место
strText = "Первая срока" & vbCrLf & "Вторая строка"
Me.txtControl = strText | |
|
| |
|
|
|
| ...вставлять переменную в нужное место
, до характерного щелчка. | |
|
| |
|
|
|
|
| Господа, а такой еще вопрос...
Запрос на создание таблиц... я его выполняю... выходит ошибка. что такая таблица уже есть, удаляю ее в этом случае... и перезапускаю запрос...
А есть ли возможность получить имя таблицы из строки SQL запроса. Чтобы передать через переменную в удаление таблицы = "DROP TABLE" & моя_переменная с именем таблицы;
Или у того запроса который выполняется есть какое свойство какую таблицу он меняет? Полазил нашел ссылку на таблицу только в строке SQL. Саму строку естественно загнать в переменную легко... А вот как из строки дернуть имя таблицы??? Функция Mid не совсем то что нужно, т.к. имя таблицы не всегда фиксировано, а хочется задать цикл и фигачить с одной кнопки передавая просто переменные в код. | |
|
| |
|
|
|
| нужно сначала удалять таблицу [DROP TABLE table_name] потом создавать новую [INSERT INTO table_name]или [CREATE TABLE table_name]
вообще перманентное создание и удаление объектов в БД ведет к распуханию базы и потребует постоянного ее обслуживания.
некоторые рекомендуют не создавать временные объекты в БД а создавать временные БД как объекты файловой системы.
ИМХО нужно еще разобраться что в твоем случае удобнее - удалять старые данные и заливать новые или удалять таблицы и создавать новые | |
|
| |
|
|
|
| А вот такой вопрос. Коли 15 баз работает, а надо объединенное, то почему бы в каждой базе не создать запрос на добавление, который бы добавлял необходимые данные в таблицу для рассмотрения (скажем в определенное время) Пусть 15 баз работают на одну, а там уже работать с одной таблицей.
Или это не в тему. | |
|
| |
|
|
|
| Я бы, наверное, вообще сделал-бы файл-Мастер, который бы:
1. Создавал новый файл-ИтоговыхДанныхНаДату,
2. Пихал бы в него итоговые данные из 15 файлов-Данных
3. Опционально: пихал бы туда отчеты "из под брюшка", может исчо что-то, что нужно.
То есть, на выходе был бы самодостаточный файл на дату,
не зависящий от последующих изменений данных, структур таблиц, макетов отчетов и прочая.
| |
|
| |
|
|
|
| Запрос на создание таблицы автоматом удаляет таблицу с таким же именем (ну справедливости ради - выкидывает сообщение)
таким образом удалять принудительно (ручками) таблицу не нужно все происходит в процессе выполнения запроса
если напрягают сообщения то отключите их на время выполнения запроса
потом их надо обязательно включить (см help DoCmd.SetWarnings) | |
|
| |
|
|
|
| Распухание - плохо. Согласен. Но не критично. Руками аналогично же получается...
А вот отключить всплывающие окна - не выход ибо в процессе выполнения кода выходит ошибка 3010 и выполнение кода прерывается пока эту таблицу не похеришь. Вопрос не в этом.
Вопрос в красоте. Хочется еще и имя таблицы куда были добавлены/удалены данные вывести в окошко (textbox) формы. Ну и заодно сделать код более гибким, в случае если например имя таблицы изменится...
Вообще у объекта Querydef есть свойство Type... добавление - 64, создание таблицы - 80. Буду думать как выдернуть имя таблицы из строки SQL. Просто думал есть более простой метод которого я не знаю/не нашел | |
|
| |
|
|
|
| asd=CurrentDb.QueryDefs("Запрос1").SQL
выдергивает в переменную asd текст запроса
используя instr можно получить позицию начала Table и последующего ключевого слова (Order или Where) между ними находится название таблицы выдернуть Mid ом | |
|
| |
|
|
|
| Спасибо... тоже думаю так. Отпишу как получится... | |
|
| |
|
|
|
| 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
Вот как-то так... Все работает. Естественно только для запроса на создание или добавление... над другими думать лень, т.к. не использую их в работе | |
|
| |
|
|
|
|
между ними находится название таблицы выдернуть Mid ом
|
это феерическое решение - узнавать имена объетов собственных БД
пространство имен таблиц и запросов является жестко регламентированным справочником (как и имена полей таблиц и запросов и типы данных полей) - это все заведомо известно и сфомулированно на этапе проектирования БД
за исключением пользовательских запросов и таблиц если у пользователей есть привелегии на создание запросов и таблиц
выдергивать инстринг'ом имя таблицы из текста запроса это примерно то-же что вырезать гланды автогеном через известное место - та как бы выясняешь "а о чем и у кого спрашивает этот запрос" так ты же сам его писал! | |
|
| |
|
|
|
| to Explorer
полностью с Вами согласен
однако пока доберешься до рационального способа мышления проходит много времени
приходится опираться на шестое чувство (обидно если это доходит через пятую точку) - самоучением занимаюсь однако(не все выходит - собака-лар)
более того автор сам так хотел | |
|
| |
|
|
|
| Шикарный пост... я же грю... я новенькой. В Аксесе так сказать вторую неделю...
Решил задать "знающим" ребяткам вопрос... "мол, как бы вытащить имя таблы, а?" Я вот только так наверное сделать могу ("автогеном гланды"....) мож есть более мудрое решение, а?
Получаю ответ... "ага, делай...так оч.классно!!!"
Что же мешало меня направить на путь истинный???
P.S. А "автор сам так хотел" именно потому, что не знает как по-другому и привык думать своей головой, а не ждать, чтоб за тебя сделал кто-то. Хотелось лишь малюсенькой подсказки...самой крошечной...типа "выбрось автоген, возьми болгарку!!!"
Ну и без обид конечно... просто удивился двум последним постам. | |
|
| |