![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Даже не знаю как написать [D5, Microsoft Access 2K]
yaro © (2006-05-27 02:44:00)Всем салют!
Имеем:
Microsoft Access 2000, Delphi 5
Запрос вида: SELECT field0, (SELECT field1, fileld2 FROM table2 WHERE table2.field0 = table1.field0) FROM table1 WHERE [не важно]
Возвращает ошибку: типа нельзя возвращать из вложенного запроса более чем одно значение и приходится разбивать один вложенный запрос на два вложенных. Это не всегда удобно и быстро. Что делать?
Еще: Может мне под что-нибудь другое писать? Посоветуйте провайдер, желательно по принципу Client-Server, а не File-Server с поддержкой Stored-процедур и чтоб не такой громоздкий был, как Microsoft SQL-сервер, в котором от нормального приложения одно название осталось (весь под виртуальную машину написан, ставит кучу лабуды типа FrameWork'ов и тому подобное.
yaro (2006-05-27 13:14:00) [21]Я, ксати, не пронял. а где моя анкета? Небыл тут всего два или три года, а уже анкету стерли. (это было еще тогда, когда сайт назывался delphi-mastak, вроде так.)
yaro (2006-05-27 13:11:00) [22]
> транзакция открыватся только на минимальное время т.е. на
> время сохранение результата.
Согласен.
> если ты думаеш что проблема в "чемто", подойди к зеркалу,
> она в нем отражается... с вероятностью 99,8%.
А вот это уже наезд. На себя посмотри.
yaro (2006-05-27 13:07:00) [23]ЮЮ: Это был до ужаса упрощенный пример, зачем придираться?
Я, вроде ясно выразился, что необходимо из подзапроса возвращать более чем одно значение.
Реальный запрос выглядит так (вернее его участок):
'SELECT [Накладные].Код, ' +
' (SELECT Дата FROM [Состояния накладных] WHERE [Состояния накладных].Код = (SELECT MAX(Код) FROM [Состояния накладных] WHERE Накладные.Код = [Состояния накладных].Накладная)) as D, ' +
' [Типы накладных].Название, ' +
' [Sclad1].Название, ' +
' [Sclad2].Название, ' +
' [Основания].Название, ' +
' (SELECT Состояние FROM [Состояния накладных] WHERE [Состояния накладных].Код = (SELECT MAX(Код) FROM [Состояния накладных] WHERE Накладные.Код = [Состояния накладных].Накладная)), ' +
' [Типы накладных].Направление, ' +
' [Типы накладных].Код, ' +
' [Типы накладных].[Сегмент состояния] ' +
'FROM [Накладные], ' +
' [Типы накладных], ' +
' [Склады] as Sclad1, ' +
' [Агенты] as Sclad2, ' +
' [Основания] ' +
'WHERE [Накладные].Тип = [Типы накладных].Код ' +
' and [Типы накладных].Связь = 0 ' +
' and [Sclad1].Код = [Накладные].Склад ' +
' and [Sclad2].Код = [Накладные].Зависимый ' +
' and [Основания].Код = Накладные.Основание ';
теперь внимательно присмотритесь к строкам (SELECT Дата ...и (SELECT Состояние...
мне пришлось писать два вложенных запроса, вместо одного (SELECT Дата, Состояние...
sniknik (2006-05-27 09:04:00) [24]> что при выполнении задач в прелах одной транзакиции begintrans...committrans, а задача может выполняться долго,
> никто другой не может получить доступ к базе данных
еще одно непонимание принципов работы с sql сервером. по правильному задача может выплнятся сколь угодно долго, но транзакция открыватся только на минимальное время т.е. на время сохранение результата.
> ЭТО ЖЕ БЕШЕНАЯ ЗАГРУЗКА СЕТИ!!!!!
> Как с этим бороться?
ну не такая уж и бешенная. а боротся не надо, надо просто брать и использовать sql сервер, любой, тот же mssql, и использовать правильно, а то непонимая принципов клиент серверной технологии можно сделать еще более "БЕШЕНУЮ ЗАГРУЗКУ" (легко кстати, достаточно бездумно адаптировать любое файл серверное приложение под sql сервер, не трогая основ "файл серверности").
p.s. если ты думаеш что проблема в "чемто", подойди к зеркалу, она в нем отражается... с вероятностью 99,8%.
ЮЮ (2006-05-27 08:35:00) [25]
> SELECT field0, (SELECT field1, fileld2 FROM table2 WHERE
> table2.field0 = table1.field0) FROM table1 WHERE [не важно]
> я так понимаю, что проблема именно провайдера, а не самого
> Эксеса правильно?
Нет, это непонимание SQL. Ни один правильный сервер не должен браться за такое SQL предложение.
Построй в Access запрос на выборку полей из двух связанных таблиц и сравни правильный синтаксис со своим.
yaro (2006-05-27 03:15:00) [26]Еще одно уточнение:
Provider = Microsoft.Jet.OLEDB.4.0
я так понимаю, что проблема именно провайдера, а не самого Эксеса правильно?
При подключении к провайдеру что происходит? Сам провайдер у меня на машине лезет в сеть, открывает файл базы данных, если он не занят конечно (кстати, очень неудобно, что при выполнении задач в прелах одной транзакиции begintrans...committrans, а задача может выполняться долго, никто другой не может получить доступ к базе данных), делает что надо и говорит ответ? ЭТО ЖЕ БЕШЕНАЯ ЗАГРУЗКА СЕТИ!!!!!
Как с этим бороться?
yaro (2006-05-27 02:50:00) [27]в Продолжение "ЕЩЕ":
В Ацессе мне нравится, что интерфейс работы с таблицами довольно удобный (со всеми описаниями, возможностью создания групп и так далее, что не маловажно при разработке, когда проэкт большой и таблиц не меньше 50 очень просто "потеряться").
Очень интересно узнать о достоинствах и недостатках других распространенных БД.
Заранее спасибо.