![]() |
|
|
![]()
|
|
| Андрей |
|
|||
|
Unregistered |
Неужели в дельфийском BDE нельзя использовать вложенные запросы, т.е. конструкции вида SELECT ... FROM SELECT ... ? Что же это за изврат то? Или я не прав? Очень бы хотелось ошибаться... |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
BDE - это тебе не SQL-сервер. Ты еще погорюй, что там всяких дружеских функций нет для даты, конвертации и прочего
Увы, такое он не умеет. |
|||
|
||||
| Андрей |
|
|||
|
Unregistered |
Мда...
Дельфи отстой... BDE маздай... |
|||
|
||||
| Vit |
|
||||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Промашечка вышла, Дельфи тут не причём, он не выполняет никаких запросов, запрос передаётся драйверу и именно драйвер выполняет эти операции.
Тут можно отчасти согласится , хотя я не знаю ни одной локальной базы данных и ни одной системы драйверов для локальных баз данных, которые бы поддерживали вложенные запросы. Чтобы Вас успокоить - ODBC и DAO тоже не поддерживают их. Теперь разберёмся с самими вложенными запросами. Вложенные запросы не являются стандартом в SQL следовательно каждый производитель драйвера сам решает поддерживать их или нет. Кстати даже многие сервера баз данных не поддерживают такие запросы. Теперь как всё-таки выполнить такой запрос? Прежде всего хотелось бы услышать какую базу данных вы используете? Если это сервер баз данных (MS SQL Server, Oracle, IB и т.п.), то нечего пинять на BDE, надо просто использовать соответствуюшие системы доступа к базам данных - например ADO. Если базы данных локальные (например Paradox или MS Access) то это легко делается через View... Создаёте View, затем его кверите - другого способа с локальными базами данных я не знаю и очень подозреваю что его нет. И последнее: в 99% случаев вложенный запрос можно заменить на соответствующий Join. -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
||||
|
|||||
| Андрей |
|
||||||||||
|
Unregistered |
Ради интереса зашел в Access и написал SELECT * FROM (SELECT * FROM Table) - и все работает, дельфи же это и видеть не хочет.
Я использую Paradox. A View он кстати тоже не воспринимает! К тому же насколько я знаю при использовании view существует довольно много ограничений. |
||||||||||
|
|||||||||||
| Vit |
|
||||||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Ну не надо путать, конечно сама среда обычно более мощная, чем доступ извне. Многие опции могут быть даже не доступны извне совсем и дело тут не в Дельфи и даже не в BDE. Все драйвера для доступа к MS Access для BDE/ODBC написаны Микрософтом, а не Борландом - и они не предусмотрели такой возможности.
Опять же поправляю - дельфи вообще НИЧЕГО с кверёй не делает, всё что делает компонент TQuery это передаёт строку запроса драйверу и берёт от него результат, никаких запросов сам компонент не делает! Найдите драйвер который будет обеспечивать выполнения таких кверей и они будут работать.
Paradox довольно старая система, одна из самых старых и никогда вложенных запросов не поддерживала. View же поддерживаются очень хорошо. Например создайте в каталоге с таблицами текстовый файл с именем "MyQuery.sql", внутри файла напишите: Select * From MyTable Сохраните его. Теперь из Парадокса или из дельфи запустите кверю: Select * from MyQuery или Select * from "MyQuery.sql" и получите результат. На счёт ограничений view - в чём ограничения? Реально использование View абсолютно не отличается от вложенного запроса, так как вложенный запрос делается путём создания временной View и затем запуск квери на её результате. И на последок маленький совет - если это возможно, то перейдите на MS Access + ADO компоненты и там эти запросы будут идти на ура. Да и база данных более новая и возможностей у неё больше. Тем более что последние версии Дельфи очень хорошо поддерживают ADO и имеют мощные компоенты для работы с ним. -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
||||||
|
|||||||
| Юля |
|
|||
|
Unregistered |
Андрей!
Да все будет хорошо!!! Напишешь ты эту курсовую! зы:я ведь ничего не перепутала? |
|||
|
||||
| Medved |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 1 Всего: 154 |
Почему нельзя, можно! Вот пример: Я использовал стандартный компонент доступа к базам данных (TQurey) и работал через BDE с алиасом BDDEMOS, с таблицей animals.db вот мой запрос (с вложенным запросом)
у меня все работет и все получилось! -------------------- |
||||
|
|||||
| МММ |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 354 Регистрация: 18.6.2002 Репутация: нет Всего: 1 |
Хоть "убейте" меня, а разве View работает для локальных таблиц?
Насчет Oracle, он прекрасно понимает вложенные запросы.... |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 1 Всего: 154 |
Эта конструкиця, детище Майкрософтовских программистов..... такое же как и тип Variant. И то и другое использовать не рекомендуется...... это я ИМХО считаю плохим стилем... конструкиця SELECT * FROM (SELECT * FROM Table) не является уникальной, в том смысле, что эту же задачу можно решить другим способом, альтернативным, просто поменяв логику запроса. ( смотри выше, там я привел тебе альтернативу) Это так, же как и использование переходов к меткам (GO TO), лучше это не использовать, и доказано, что с помощью управляющих конструкций,можно обойтись в программировании и без них (переходов),а их использование как всем известно, является плохим стилем программирования -------------------- |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 1 Всего: 154 |
Да, с началом сесси в ВУЗах, чувствую, прибавиться у нас посетителей на форуме...... -------------------- |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Я же привёл пример как сделать View для парадокса. Или что-то непонятно? Я могу код выложить, но вроде должно и так быть всё ясно. -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| МММ |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 354 Регистрация: 18.6.2002 Репутация: нет Всего: 1 |
я имел в виду CREATE VIEW MyTable AS select * from 'table.dbf' |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Конструкция "CREATE VIEW" действительно не доступна, но тем ни менее View можно очень легко создать и очень легко ими пользоваться, я пользовался даже многовложенными View для генерации очень сложный Crystal Report рапортов - в некоторых случаях это очень мощное средство. А если надо создать View, то можно это сделать в пару строк и без квери:
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| МММ |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 354 Регистрация: 18.6.2002 Репутация: нет Всего: 1 |
Хорошо , делаю так:
есть файл 555.sql содержание
на форме Query1 с запросом
выдается ошибка |
||||
|
|||||
| Юля |
|
|||
|
Unregistered |
СПАСИБО вам!!! чтобы мы без вас делали... |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Прошу прощения, ввёл публику в заблуждение. Действительно вариант с View не проходит, хотя это очень странно. Видимо парсер запросов Дельфи не пропускает такой запрос, потому что все остальные программы работающие через BDE воспринимают его совершенно адекватно: Paradox, Database Desktop, Crystal Report.
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Андрей |
|
|||
|
Unregistered |
А у меня view работает! Попробуйте создавать файл SQL не вручную, а сохранением через SQL Builder дельфи в том же каталоге где лежат таблицы БД. Только минус в том, что теперь не получается использовать параметрические запросы... |
|||
|
||||
| Андрей |
|
|||
|
Unregistered |
Юля, спасибо за моральную поддержку за то что показала мне этот замечательный форум, и вообще за все С меня поцелуй |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Чем дальше, тем всё любопытственнее. А можешь показать содержимое полученного sql файла? Чудес же не бывает, если это работает, занчит мы что-то упускаем в формате... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Чем дальше, тем всё любопытственнее. А можешь показать содержимое полученного sql файла? Чудес же не бывает, если это работает, занчит мы что-то упускаем в формате...Или они делают QBE, если QBE то он поддерживает параметры... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Андрей |
|
|||
|
Unregistered |
Вот полное содержимое SQL файла:
/* ALIAS: Base */ SELECT DISTINCT Prihtov.KodTipTov, Classif.Tip, Prihtov.KodTov, Tovar.Tovar, Ei.EI, SUM( Prihtov.Kol ) PrihKol, 0 RashKol FROM "prihod.DB" Prihod INNER JOIN "prihtov.DB" Prihtov ON (Prihtov.NDok = Prihod.NDok) INNER JOIN "tovar.DB" Tovar ON (Prihtov.KodTov = Tovar.Kod) INNER JOIN "classif.DB" Classif ON (Prihtov.KodTipTov = Classif.Kodtip) INNER JOIN "ei.DB" Ei ON (Tovar.Edizm = Ei.KodEI) WHERE Prihod.KodSkl = 1 GROUP BY Classif.Tip, Prihtov.KodTipTov, Prihtov.KodTov, Tovar.Tovar, Ei.EI UNION SELECT Rashtov.KodTipTov, Classif.Tip, Rashtov.KodTov, Tovar.Tovar, Ei.EI, 0 PrihKol, SUM( Rashtov.Kol ) RashKol FROM "rashod.DB" Rashod INNER JOIN "rashtov.DB" Rashtov ON (Rashtov.NDok = Rashod.NDok) INNER JOIN "tovar.DB" Tovar ON (Rashtov.KodTov = Tovar.Kod) INNER JOIN "classif.DB" Classif ON (Rashtov.KodTipTov = Classif.Kodtip) INNER JOIN "ei.DB" Ei ON (Tovar.Edizm = Ei.KodEI) WHERE Rashod.KodSkl = 1 GROUP BY Rashtov.KodTipTov, Classif.Tip, Rashtov.KodTov, Tovar.Tovar, Ei.EI |
|||
|
||||
| МММ |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 354 Регистрация: 18.6.2002 Репутация: нет Всего: 1 |
Андрей
что то тут не так ....... Во первых: UNION - Операция, которая служит для объединение из двух запросов, в котором второй запрос выбирает строки, исключенные первым. Это называется внешним объединением. Во вторых: как ты в SQL Builder сделал UNION и где вообще у тебя view? |
|||
|
||||
| Medved |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 1 Всего: 154 |
абсолютно неправильно..... существует два вида объединения таблиц - внешние объедниения и внутренние. внешнее объединение выполняется с помощью конструкции
а внутренне определяется в конструкции WHERE
теперь представьте, что в таблице студенов, не во всех записях проставлено ID курса.... в первом случае выберуться все записи где проставлен и не проставлен ID курса (при внешнем объеденении), а во втором (при внутреннем объеденении), только те, где проставлен ID курса. а оператор UNION используется для объединения результатов двух разных запросов в один набор данных.... но обязательно условие, что количество полей и их тип будут идентичны.... P/S/ в Oracle не существует конструкции INNER JOIN....ON, но внешне объединения осущестляются так же как и внтуренние (в констукии WHERE) но после подчиненного значения ставиться знак плюсика в скобках....
-------------------- |
||||||||
|
|||||||||
| Андрей |
|
|||
|
Unregistered |
Всем спасибо! Ваши советы очень помогли, усе получилось, курсовая сдана!!!
|
|||
|
||||
| Tishka |
|
|||
|
Unregistered |
К стати может кто нибудь объяснит тупому, как передать параметр к запросу в MS Access.
Когда мы находимся в среде MS Access, такой запрос выдаёт окошко введи переменную, а как ето сделать средствами Delphi + BDE. |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Модератор: Пожалуйста, один топик - один вопрос. Хотите спросить - сделайте свой топик Параметер передаётся примерно так: query1.params.parambyname('MyParam').value:='My Value'; -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |