Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / как передать запросу имя таблицы параметром? / 15 сообщений из 15, страница 1 из 1
15.08.2003, 16:32
    #32237872
Yur
Yur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
То есть существует несколько схожих групп таблиц.
Как избежать написание нескольких одинаковых запросов (по запросу для каждой группы), которые будут отличаться только именами таблиц?
...
Рейтинг: 0 / 0
15.08.2003, 16:35
    #32237875
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
Надо полагать, что "схожие" есть "одинаковые"
Отсюда вопрос: почему бы не завести одну таблицу и не парить мозги ни себе не людям?
...
Рейтинг: 0 / 0
15.08.2003, 16:43
    #32237890
NoRoV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
Хороший топик. Я сам когда-то задавался таким вопросом (у меня годовые таблицы разные, различие в названии - год). Ответа не нашел. Но можно используя команду Execute или напрямую используя переменную:
set Tbl=currentdb.openrecorbset(SQLStr,dbOpenDynaset)
...
Рейтинг: 0 / 0
15.08.2003, 16:44
    #32237894
Yur
Yur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
Дело в том, что под группой понимается куча таблиц с разной структурой (в каждой группе по 15 разных таблиц). Склеивать соответствующие (одинаковые по полям) таблицы разных групп (для того, чтобы забабахать обработку всего массива одним запросом) нельзя в силу нарушения логики информации. Посему - подскажите пожалуйста, как передать запросу имена таблиц параметрами?
...
Рейтинг: 0 / 0
15.08.2003, 16:49
    #32237905
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
Можно, например, программно редактировать текст запроса. Или, еще проще, сделать промежуточный запрос select * from mytable1, в твоем запросе ссылаться на него, а при изменении таблицы просто подменять этот запрос на select * from mytable2.
...
Рейтинг: 0 / 0
15.08.2003, 16:49
    #32237906
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
Сорри
я не заметил слово "групп" :)
...
Рейтинг: 0 / 0
15.08.2003, 16:50
    #32237908
Витал
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
Как Параметром не знаю. А переопределить SQL запроса программно можно с помощью QueryDefs
...
Рейтинг: 0 / 0
15.08.2003, 16:59
    #32237918
Nick987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
Если под запросом понимать сохраненный запрос, то, видимо, никак. А если по запросом понимать строку с SQL-запросом, то ответ очевиден.
...
Рейтинг: 0 / 0
15.08.2003, 17:59
    #32237990
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
А что мешает програмно менять текст сохранённого запроса?
...
Рейтинг: 0 / 0
15.08.2003, 18:03
    #32237996
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
Если ты имеешь ввиду написать сколько нужно запросов и подставлять их, то этот вариант не отвечает на вопрос:
Как избежать написание нескольких одинаковых запросов (по запросу для каждой группы), которые будут отличаться только именами таблиц
...
Рейтинг: 0 / 0
15.08.2003, 18:22
    #32238017
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
Есть решение.

Код: plaintext
1.
2.
3.
PARAMETERS p Short;
SELECT First(Choose(p,t1.a,t2.a,t3.a)) AS a, First(Choose(p,t1.b,t2.b,t3.b)) AS b
FROM t1, t2, t3
GROUP BY Choose(p,t1.cou,t2.cou,t3.cou);


Правда, у него куча недостатков:

1. Работает медленно.
2. Требует наличия ключа в каждой из таблиц, причем во всех таблицах ключ должен состоять из одинакового числа полей (в моем примере поле одно и оно названо cou).
3. Выдает нередактируемый набор данных.

На мой взгляд, решение Geo от 16:49 лучше.
...
Рейтинг: 0 / 0
15.08.2003, 18:35
    #32238028
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
На всякий случай расшифровываю. Если подставить, например, p=1, то запрос сработает так, как будто написано:

Код: plaintext
1.
2.
SELECT First(t1.a) AS a, First(t1.b) AS b
FROM t1, t2, t3
GROUP BY t1.cou;


То есть для каждой записи таблицы t1 будет выдана одна запись, и в ней соответствующие поля той же таблицы. Таблицы t2 и t3 приплетены почем зря - на скорость действия запроса влияют, а в конечном результате не участвуют.
...
Рейтинг: 0 / 0
15.08.2003, 20:54
    #32238091
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
возможно повторю кого-нибудь:

*сформировать в VBA строку запроса SSS, где вместо имен таблиц - строковые переменные.

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

далее удаляется запрос(ы) ХХ

далее (не помню точно текст команд) сохраняется запрос под именем ХХ полученный с помощью строки SSS.

запускается отчет или форма на основании запроса ХХ.

форма или отчет могут использоваться до тех пор пока не произойдут действия*

если имена таблиц отличаются только годом строку SSS можно формировать испоьзуя только один параметр - год.
...
Рейтинг: 0 / 0
16.08.2003, 00:12
    #32238127
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
Еще один недостаток моего решения. Оказалось, что если в одной из таблиц нет данных, то этот запрос всегда возвращает 0 записей.

Для компенсации предлагаю (это первая версия, ее можно совершенствовать) создать таблицу OneLine той же структуры, что и t1, t2, t3, но с гарантированной одной записью, причем дать ключу значение, которое в настоящих данных не встречается, и писать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
PARAMETERS p Short;
SELECT First(Choose(p,t1.a,t2.a,t3.a)) AS a, First(Choose(p,t1.b,t2.b,t3.b)) AS b
FROM
[select * from t1 union select * from OneLine]. AS t1,
[select * from t2 union select * from OneLine]. AS t2,
[select * from t3 union select * from OneLine]. AS t3
GROUP BY Choose(p,t1.cou,t2.cou,t3.cou)
HAVING Choose(p,t1.cou,t2.cou,t3.cou) Not In (select cou from OneLine);


***

А вот совсем другое решение, гораздо более простое.

1. Делаем запрос, называем его U:

Код: plaintext
1.
2.
3.
4.
select *,  1  as t from t1
union
select *,  2  as t from t2
union
select *,  3  as t from t3;


(Вместо * можно перечислить нужные поля.)

2. Делаем второй запрос:

Код: plaintext
1.
PARAMETERS p Short;
select * from U where t=p


И это все, и оно работает без проблем.
...
Рейтинг: 0 / 0
16.08.2003, 14:25
    #32238228
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать запросу имя таблицы параметром?
Ко второму решению вариант:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
PARAMETERS p Text;
SELECT * FROM [
select *,  "t1"  as t from t1
union
select *,  "t2"  as t from t2
union
select *,  "t3"  as t from t3
]. AS U
WHERE t=p;


Во-первых, одним запросом, во-вторых, в параметр передается именно имя таблицы, как и было заказано, а не номер.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / как передать запросу имя таблицы параметром? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]