powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Работа Access Jet
25 сообщений из 51, страница 2 из 3
Работа Access Jet
    #40086263
BoxaXP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg197311,

Ткни пожалуйста
...
Рейтинг: 0 / 0
Работа Access Jet
    #40086596
cylindr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoxaXP
Запрос сохраненный, используется как базовый в массе других запросов

в подобных случаях всегда помогает промежуточная временная таблица, в которую сливаете ваши данные из запроса и обращаетесь потом к ней. После всего таблицу очищаете до следующего раза.
...
Рейтинг: 0 / 0
Работа Access Jet
    #40086610
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Работа Access Jet
    #40086712
BoxaXP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg197311,

Спасибо это я читал, но у меня индексы построены, более того для данного запроса
индекс сделан покрывающий.

Вопрос то в том что запрос access где
WHERE (((dbo_Архив.ID_наработки) Between Get_In_Nach() And Get_In_Kon()))
или
WHERE ((dbo_Архив.ID_наработки) Between (Forms!Основная!Индекс_С) And (Forms!Основная!Индекс_по))
или запрос с параметрами

работает на порядок медленнее чем
WHERE dbo_Архив.ID_наработки Between (442561) And (442862)

По идее access перед выполнением запроса должен вычислить скалярные величины
т.е. запросы полностью идентичные.

И еще обратил внимание что ассess составной индекс для связанной таблицы
показывает как простой индекс по первому полю составного индекса
...
Рейтинг: 0 / 0
Работа Access Jet
    #40086714
BoxaXP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cylindr,

как она поможет в многопользовательской среде, все и так неплохо работает если просто переписывать запрос под указанные условия, но тогда приходиться ставить каждому свою клиентскую часть
...
Рейтинг: 0 / 0
Работа Access Jet
    #40086717
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoxaXP
но тогда приходиться ставить каждому свою клиентскую часть

- можно использовать не сохраненный запрос (строка sql)
- можно сохранять запрос с именем от диапазона (после выполнения удалять)
WHERE dbo_Архив.ID_наработки Between (442561) And (442862) => z442561442862
...
Рейтинг: 0 / 0
Работа Access Jet
    #40086736
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoxaXP
cylindr,

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

Возможно, я не прав... или не совсем прав... Но для своей базы я выбрал разделение.... И в таких случаях ( как писали выше) сначала программно (Currentdb.exectue) заполняю временную таблицу, формируя инструкцию в зависимости от нужных усливий, а после использования - чищу ее.
...
Рейтинг: 0 / 0
Работа Access Jet
    #40087056
BoxaXP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще вопрос? Кто нибудь пробовал сформировать запрос вида:

Select * From (eval("МояФункция()"));

где МояФункция() возвращает строку вида Select * from Mytabl where ID=3

или нечто подобное
Select * from Mytabl where МояФнкция()

где МояФункция() возвращает строку вида ID=3
...
Рейтинг: 0 / 0
Работа Access Jet
    #40087216
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BoxaXP
Еще вопрос? Кто нибудь пробовал сформировать запрос вида:

Select * From (eval("МояФункция()"));

где МояФункция() возвращает строку вида Select * from Mytabl where ID=3

или нечто подобное
Select * from Mytabl where МояФнкция()

где МояФункция() возвращает строку вида ID=3

Всегда так делаю. У меня в базах обычно есть таблица с единственной записью для оперативных значений. Например, текущая дата (не та, что на календаре, а та, что выбрал юзер для работы) храниться (и изменяется юзером) в этой таблице в поле cur_date. В общем модуле прописана функция CurDate(), получающая это значение запросом. А её уже использую, где потребуется. И в запросах, и модулях форм/отчетов.
...
Рейтинг: 0 / 0
Работа Access Jet
    #40087241
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BoxaXP

Select * from Mytabl where МояФнкция()

где МояФункция() возвращает строку вида ID=3

Этот вариант точно рабочий. А в первом... синтаксисом SQL не предусмотрен такой разврат))
...
Рейтинг: 0 / 0
Работа Access Jet
    #40087314
BoxaXP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Beliar
BoxaXP

Select * from Mytabl where МояФнкция()

где МояФункция() возвращает строку вида ID=3

Этот вариант точно рабочий. А в первом... синтаксисом SQL не предусмотрен такой разврат))

Рабочий Select * from Mytabl where ID=МояФнкция() , но медленно не используя индекс

А у Select * from Mytabl where МояФнкция()
Where не отрабатывает, тянется вся таблица
Пробовал
Код: sql
1.
2.
3.
4.
SELECT dbo_Архив.ID_наработки, dbo_Архив.ID_счётчика, dbo_Архив.ID_артикула, dbo_Архив.Коэф_цены, dbo_Архив.Ячейка, Sum(dbo_Архив.Значение) AS [Sum-Значение]
FROM dbo_Архив
GROUP BY dbo_Архив.ID_наработки, dbo_Архив.ID_счётчика, dbo_Архив.ID_артикула, dbo_Архив.Коэф_цены, dbo_Архив.Ячейка
HAVING (Eval("Str_SQL()"));



Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Function Str_SQL() As String
Dim ss As String
Dim st As String

If N_Period = K_Period Then
    st = "= (" & N_Period & ");"
Else
    st = "Between (" & N_Period & ") And (" & K_Period & ");"
End If

ss = "dbo_Архив.ID_наработки " & st
Str_SQL = ss
End Function



Может кто-то извращался чтобы в where динамическое условие сразу со скалярными значениями
...
Рейтинг: 0 / 0
Работа Access Jet
    #40087339
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BoxaXP

Может кто-то извращался чтобы в where динамическое условие сразу со скалярными значениями

Так забавно употребляешь слово "скалярные", будто еще и векторные бывают)))

Вообщем, помнится мне когда-то пробовал работать со свойством .sql объекта querydef.
Что-то вроде того:
Код: vbnet
1.
2.
3.
    Dim qd1 As QueryDef
    Set qd1 = CurrentDb.QueryDefs("твой_запрос")
    qd1.SQL = "SELECT то-то FROM оттуда-то WHERE такие-то;"


Ну дальше докуришь до своей ситуации. У тебя там jet и всё такое. Главное, что строку запроса какую нужно подсовываешь.
...
Рейтинг: 0 / 0
Работа Access Jet
    #40087411
BoxaXP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Beliar,

Сейчас так и сделано, но хочется уйти от перезаписи запроса, чтобы по сети мультипользовательский режим
...
Рейтинг: 0 / 0
Работа Access Jet
    #40087422
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BoxaXP
Beliar,

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

Ну ты же как-то функцию свою собирался применять. Где, в чем это должно было происходить?
...
Рейтинг: 0 / 0
Работа Access Jet
    #40087713
cylindr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoxaXP
чтобы по сети мультипользовательский режим

У каждого пользователя есть БД с формами? Я временные таблицы делал так: Название_Имяпользователя и соответственно обращался так же.
Что касается перезаписи запроса, то в чём проблема? Он же у каждого свой, хоть 100 раз в день перезаписывайте.
...
Рейтинг: 0 / 0
Работа Access Jet
    #40087860
BoxaXP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cylindr
BoxaXP
чтобы по сети мультипользовательский режим

У каждого пользователя есть БД с формами?


Да. А хотелось бы 1 БД с формами на сетевом диске для всех
и скорость выполнения запроса при использовании функции в where как при перезаписи запроса с явным указанием значений
...
Рейтинг: 0 / 0
Работа Access Jet
    #40088056
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BoxaXP, Я понял... ты хочешь, чтобы сохраненный запрос сам, без вмешательства из вне, менял свой sql-текст за счет некоей функции, содержащейся в нем же? Но средствами sql не предусмотрено изменение структуры запроса, sql-команд, операторов или имени запроса. Функция может содержать подзапрос, но ее значение воспринимается, как данные, а не как часть структуры. Функция Eval немного обнадеживает, но совсем немного, ведь она возвращает не само выражение аргумента, а уже вычисленное значение этого выражения. Т.е. указываешь в качестве аргумента ID=3, то Eval сначала вычислит, сколько будет ID=3, если она сможет это вычислить, то результат уже подставит вместо себя, а если нет, то выдаст ошибку. Да ты, скорее всего, сам знаешь это. Опять же, значение этой функции Eval, как и любой другой, не подсунуть в качестве части структуры запроса.
...
Рейтинг: 0 / 0
Работа Access Jet
    #40088308
BoxaXP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Beliar,
Все так. Но почему access запросы где where ID=Функция() /которая и выдает 3/
работают медленнее запросов где where ID=3 и не используют индексов.
По идее Функция() должна вычисляться до выполнения запроса. Как бы посмотреть
строку sql прямо перед выполнением с вычисленными выражениями и функциями.
...
Рейтинг: 0 / 0
Работа Access Jet
    #40088333
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoxaXP
По идее Функция() должна вычисляться до выполнения запроса. Как бы посмотреть
строку sql прямо перед выполнением с вычисленными выражениями и функциями.

Ваша функция дергается перед анализом каждой записи, а при заданном числе в условии нет побочных дерганий при отборе ...
С чего вы решили что функция должна выполняться один раз в начале перед выполнением ?
Ваш случай самый что ни на есть частный и узкий...
Чтобы это понять, я приведу простой пример:
1. Делаем запрос на выборку тестового поля (и нам нужно искусственно проставить в запросе нумерацию),
то есть добавляем в запрос функцию num1() ...
2. Заводим глобальную переменную в общем модуле i As Long
3. Делаем функцию в общем модуле:
Код: vbnet
1.
2.
3.
4.
Public Function num1 () As Long
i=i+1
num1 = i
End Function 


4. В кнопке на форме пишем
i=0
открываем запрос на выборку и видим нумерацию...
то есть при выборе каждой записи, запрос дергает функцию, которая возвращает текущий номер по порядку...
Отличие вашего случая лишь в том, что при каждом дергании функции получаются одни и те же значение...
Намекаю на то, что с индексами всё ОК, проблема в другом...
...
Рейтинг: 0 / 0
Работа Access Jet
    #40088379
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoxaXP, проблемы скуля решайте в скуле - причем тут акс, который просто морда? префикс dbo в названии таблиц должен уж сказать изначально был, или некластеризованные индексы...
и запросы лучше делать "там", а не таскать через коннекшн, в запросах "там" чего только нет и if и case -есть где разгуляться.
...
Рейтинг: 0 / 0
Работа Access Jet
    #40088465
cylindr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoxaXP
Да. А хотелось бы 1 БД с формами на сетевом диске для всех

Тогда нужно настраивать файл рабочих групп mdw и каждому пользователю делать ярлык. Также подключаться на сервер желательно по RDP. В 2010-м mdw вроде есть, но спрятан. В более новых не знаю.
...
Рейтинг: 0 / 0
Работа Access Jet
    #40088542
BoxaXP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag,

Да нет. проверял

Public Function My () As Long
msgbox "Test"
My = 3
End Function

если функция используется в where то вызов идет один раз, а если засунуть в select
или в параметр передать поле тогда конечно по разу на каждую запись.
...
Рейтинг: 0 / 0
Работа Access Jet
    #40088545
BoxaXP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alecko,
Все верно можно и прямыми запросами на sql оперировать, но опять же передача
параметров через перезапись запросов. Индексы то есть по полю отбора кластеризованный,
а индекс покрывающий запрос не кластеризованный.
Вот access использует покрывающий если
where ID=5, и НЕ использует если where ID=МояФункция()
...
Рейтинг: 0 / 0
Работа Access Jet
    #40088568
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoxaXP,
-что такое запросы на выборку,перекрестный,с параметрами,SQL запрос и изменение(обновление, добавление, удаление, создание таблицы)-знаю, а что есть "покрывающий" запрос не знаю
-если поле проиндексировано то как индекс может "не использоваться"??
...
Рейтинг: 0 / 0
Работа Access Jet
    #40088581
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku
BoxaXP,
-что такое запросы на выборку,перекрестный,с параметрами,SQL запрос и изменение(обновление, добавление, удаление, создание таблицы)-знаю, а что есть "покрывающий" запрос не знаю
-если поле проиндексировано то как индекс может "не использоваться"??

Прилагательное "покрывающий", видимо относится к индексу, а не запросу. Так бывает, когда знаки препинания не используют. Но тоже хотелось бы знать, что значит "индекс , покрывающий запрос".
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 2 из 3
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Работа Access Jet
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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