powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Рекордсет на основе запроса
25 сообщений из 102, страница 2 из 5
Рекордсет на основе запроса
    #32573507
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не болтай! Построй, запусти, проверь время. Если будет медленно, выстави на форум структуру таблиц и результирующий запрос, посмотрим, подумаем... :)))
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32573593
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rivkin Dmitry
Код: plaintext
1.
2.
3.
se = "SELECT " & MyDateFormat([Forms]![000_Volume]![Date]) & " As Ext1, Sum(...) As Ext2 " & _
"FROM Tbl1 ... " & _
"GROUP BY " & _
"ORDER BY Ext1"


Послушай чей-то я видать не догоняю. Мне это в модуль писать или SQL запрос такой в таблицу загнать
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32573659
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikP Rivkin Dmitry
Код: plaintext
1.
2.
3.
se = "SELECT " & MyDateFormat([Forms]![000_Volume]![Date]) & " As Ext1, Sum(...) As Ext2 " & _
"FROM Tbl1 ... " & _
"GROUP BY " & _
"ORDER BY Ext1"


Послушай чей-то я видать не догоняю. Мне это в модуль писать или SQL запрос такой в таблицу загнать

Твой запрос, видимо, хранимый?

Прежде чем ты его откроешь, делаешь так:

Dim db as DataBase: Set db= CurrentDb
Dim Qd as QueryDef: Set qd = db.QueryDefs("MyQry")

qd.SQL = "SELECT " & MyDateFormat([Forms]![000_Volume]![Date]) & " ...

Все, пользуся запросом, как хочешь, текст его уже сохранен.
Удобно еще и тем, что когда ты его откроешь в построителе, увидешь все наглядно. И прогнать можешь на время
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32573714
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему мы друг друга немного не понимаем.

Объясняю картину:
1.Есть таблица в ней поле MEMO в котором хранится запрос
2.Запрос основан на другом запросе с определенными параметрами и таблице
3.На основе таблицы в которой храниться запрос построена форма в ней есть поле в котором указан текст запроса(поле MEMO)
4.В форме также есть график, у которого RowSourse присваивается ссылка на поле с текстом запроса
5.В форме также есть группа переключателей "Дата" и список на основании которых меняются данные запроса
6.Надо сделать экспорт данных получаемых в результате запроса в Excel через кнопку
7.Но OpenRecordset ругается и не хочет пускать текст запроса (надо 5 параметров)
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32573743
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извини, не понимаю, зачем текст запроса хранить в таблице, для этого и существуют хранимые запросы. Но это не меняет дела. То что касалось

qd.SQL = "SELECT " & MyDateFormat([Forms]![000_Volume]![Date]) & " ...

переделай как
UPDATE MEMO_Tbl SET MEMO = "SELECT " & MyDateFormat([Forms]![000_Volume]![Date]) & " ...

и все осталось, как у тебя
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32573823
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за поддержку. Я пропаду на немного попробую все переварить, может на самом деле наворотил лишку. Приду в себя объявлю результаты
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574087
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rivkin Dmitry
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Function MyDateFormat(dum As Integer) As String

    Select Case dum
    Case  1 
        MyDateFormat = Format([Date], "dd/mm/yy")
    Case  2 
        MyDateFormat = CByte((([Date] - # 12 / 31 / 2000 #) - CByte(([Date] - # 12 / 31 / 2000 #) /  364  -  0 . 4999 ) *  364 ) /  7  +  0 . 6 )
    Case  3 
        MyDateFormat = Format([Date], "mmmm  yy")
    Case  4 
        MyDateFormat = Format([Date], "q  yy")
    Case  5 
        MyDateFormat = Format([Date], "yyyy")
    End Select

End Function


Послушай а откуда функция берет [Date] ? На сколько я понимаю там должна быть конкретная дата, которую функция преобразует в нужный формат.
В результате должна быть ссылка на запрос или таблицу
Я правильно понял?
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574396
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, что Rivkin Dmitry на форуме нет. Может кто другой подскажет?
Вопрос в принципе простой
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574402
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[Дата] тоже надо в функцию передавать в виде аргумента
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574412
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и я так же подумал. По другому ведь ее не видно
Спасибо за помощь! Буду разбирать дальше
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574445
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пришел. При написании функции я пользовался текстом запроса автора и в третий раз за сегодня был не внимателен. [Дата] является полем таблиц [00_Дата].Дата и [001_Регион].Дата. Поэтому, передавать параметр в функцию не надо, но функцию надо слегка изменить:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Function MyDateFormat(dum As Integer) As String

    Select Case dum
    Case  1 
        MyDateFormat = "Format([Date], ""dd/mm/yy"")"
    Case  2 
        MyDateFormat = "CByte((([Date] - #12/31/2000#) - CByte(([Date] - #12/31/2000#) / 364 - 0.4999) * 364) / 7 + 0.6)"
    Case  3 
        MyDateFormat = "Format([Date], ""mmmm  yy"")"
    Case  4 
        MyDateFormat = "Format([Date], ""q  yy"")"
    Case  5 
        MyDateFormat = "Format([Date], ""yyyy"")"
    End Select

End Function

Я очень извиняюсь, наверное, поспешил
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574517
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К стати проверил скорость функции со вставкой даты как второго параметра
Работает в 5 раз медленее

И еще. А каким образом [Date] будет браться из таблиц, если ни таблицы, ни запрос к таблицам не открыты?
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574522
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikPК стати проверил скорость функции со вставкой даты как второго параметра
Работает в 5 раз медленее

И еще. А каким образом [Date] будет браться из таблиц, если ни таблицы, ни запрос к таблицам не открыты?

В 5 раз медленнее чего? Если функция не работает, что мы проверяли?
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574532
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос через IIf
Код: plaintext
1.
2.
3.
SELECT IIf([Forms]![000_Объемы]![Дата]= 1 ,Format([Дата],"dd/mm/yy"),IIf([Forms]![000_Объемы]![Дата]= 2 ,CByte((([Дата]-# 12 / 31 / 2000 #)-CByte(([Дата]-# 12 / 31 / 2000 #)/ 364 - 0 . 4999 )* 364 )/ 7 + 0 . 6 ),IIf([Forms]![000_Объемы]![Дата]= 3 ,Format([Дата],"mmmm  yy"),IIf([Forms]![000_Объемы]![Дата]= 4 ,Format([Дата],"q  yy"),IIf([Forms]![000_Объемы]![Дата]= 5 ,Format([Дата],"yyyy")))))) AS Выражение2
FROM 000_V
GROUP BY IIf([Forms]![000_Объемы]![Дата]= 1 ,Format([Дата],"dd/mm/yy"),IIf([Forms]![000_Объемы]![Дата]= 2 ,CByte((([Дата]-# 12 / 31 / 2000 #)-CByte(([Дата]-# 12 / 31 / 2000 #)/ 364 - 0 . 4999 )* 364 )/ 7 + 0 . 6 ),IIf([Forms]![000_Объемы]![Дата]= 3 ,Format([Дата],"mmmm  yy"),IIf([Forms]![000_Объемы]![Дата]= 4 ,Format([Дата],"q  yy"),IIf([Forms]![000_Объемы]![Дата]= 5 ,Format([Дата],"yyyy"))))));
Работает быстрее в 5 раз чем через функцию
Код: plaintext
1.
2.
3.
SELECT MyDateFormat([Forms]![000_Объемы]![Дата],[Дата]) AS Выражение1
FROM 000_V
GROUP BY MyDateFormat([Forms]![000_Объемы]![Дата],[Дата]);
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574550
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погодь немного, я постараюсь расписать все. Со скоростью - мне не понятно.
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574578
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прежде всего, в этом выражении - ошибка и твой запрос не должен работать вообще:

Код: plaintext
1.
2.
3.
4.
5.
IIf([Forms]![000_Объемы]![Дата]= 1 ,Format([Дата],"dd/mm/yy"),
IIf([Forms]![000_Объемы]![Дата]= 2 ,CByte((([Дата]-# 12 / 31 / 2000 #)-
CByte(([Дата]-# 12 / 31 / 2000 #)/ 364 - 0 . 4999 )* 364 )/ 7 + 0 . 6 ),
IIf([Forms]![000_Объемы]![Дата]= 3 ,Format([Дата],"mmmm  yy"),
IIf([Forms]![000_Объемы]![Дата]= 4 ,Format([Дата],"q  yy"),
IIf([Forms]![000_Объемы]![Дата]= 5 ,Format([Дата],"yyyy")))))) 
отсутствует один оператор
Д.быть
IIf([Forms]![000_Объемы]![Дата]=1,Format([Дата],"dd/mm/yy"),
IIf([Forms]![000_Объемы]![Дата]=2,CByte((([Дата]-#12/31/2000#)-
CByte(([Дата]-#12/31/2000#)/364-0.4999)*364)/7+0.6),
IIf([Forms]![000_Объемы]![Дата]=3,Format([Дата],"mmmm yy"),
IIf([Forms]![000_Объемы]![Дата]=4,Format([Дата],"q yy"),
IIf([Forms]![000_Объемы]![Дата]=5,Format([Дата],"yyyy") , < expression > )))))
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574592
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю как, но он работает и работает прилично.
Если хочешь проверь сам. Только таблицу свою подставь и все. Желательно, чтобы в таблице было строк где-нибудь 50 000. Сразу увидишь разницу
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574594
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О птичках. У меня база mdb на Access 2000
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574630
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А дату выдает правильно? И насколько я помню, запрос не открывается в рекордсете?

Функцию я сварганил такую:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Function MySql(dum As Integer) As String
    Dim slct As String, Grp As String, Ord As String
    
    Select Case dum
    Case  1 
        slct = "Format([Date], ""dd/mm/yy"")"
        Grp = "Format([Date],""dd/mm/yy""), Year([Date])*365+Month([Date])*31+Day([Date]) "
        Ord = "Format([Date],""dd/mm/yy"") "
    Case  2 
        slct = "CByte((([Date] - #12/31/2000#) - CByte(([Date] - #12/31/2000#) / 364 - 0.4999) * 364) / 7 + 0.6)"
        Grp = "CByte((([Date]-#12/31/2000#)-CByte(([Date]-#12/31/2000#)/364-0.4999)*364)/7+0.6), CByte(([Date]-#12/31/2000#)/7+0.6) "
        Ord = "CByte((([Date]-#12/31/2000#)-CByte(([Date]-#12/31/2000#)/364-0.4999)*364)/7+0.6) "
    Case  3 
        slct = "Format([Date], ""mmmm  yy"")"
        Grp = "Format([Date],""mmmm  yy""), Year([Date])*12+Month([Date]) "
        Ord = "Format([Date],""mmmm  yy"") "
    Case  4 
        slct = "Format([Date], ""q  yy"")"
        Grp = "Format([Date],""q  yy""), Year([Date])*4+CByte(Month([Date])/3+0.2) "
        Ord = "Format([Date],""q  yy"") "
    Case  5 
        slct = "Format([Date], ""yyyy"")"
        Grp = "Format([Date],""yyyy""), Year([Date]),0) "
        Ord = "Format([Date],""yyyy"") "
    End Select
    
    MySql = "SELECT " & slct & _
        ", Sum([001_Region].[Sum-Sold_Kg]) As Tonnage " & vbCrLf & _
        "FROM 00_Date " & vbCrLf & _
        "LEFT JOIN 001_Region " & vbCrLf & _
        "ON [00_Date].[Date] = [001_Region].[Date] " & vbCrLf & _
        "GROUP BY " & Grp & vbCrLf & _
        "ORDER BY " & Ord

End Function

Вызов ее вернет тебе текст запроса

Код: plaintext
MySql([Forms]![000_Объемы]![Дата])
Например, если [Forms]![000_Объемы]![Дата] = 1, получишь

Код: plaintext
1.
2.
3.
4.
5.
SELECT Format([Date], "dd/mm/yy"), Sum([001_Region].[Sum-Sold_Kg]) As Tonnage 
FROM 00_Date 
LEFT JOIN 001_Region 
ON [00_Date].[Date] = [001_Region].[Date] 
GROUP BY Format([Date],"dd/mm/yy"), Year([Date])* 365 +Month([Date])* 31 +Day([Date]) 
ORDER BY Format([Date],"dd/mm/yy") 

Если 2:
Код: plaintext
1.
2.
3.
4.
5.
SELECT CByte((([Date] - # 12 / 31 / 2000 #) - CByte(([Date] - # 12 / 31 / 2000 #) /  364  -  0 . 4999 ) *  364 ) /  7  +  0 . 6 ), Sum([001_Region].[Sum-Sold_Kg]) As Tonnage 
FROM 00_Date 
LEFT JOIN 001_Region 
ON [00_Date].[Date] = [001_Region].[Date] 
GROUP BY CByte((([Date]-# 12 / 31 / 2000 #)-CByte(([Date]-# 12 / 31 / 2000 #)/ 364 - 0 . 4999 )* 364 )/ 7 + 0 . 6 ), CByte(([Date]-# 12 / 31 / 2000 #)/ 7 + 0 . 6 ) 
ORDER BY CByte((([Date]-# 12 / 31 / 2000 #)-CByte(([Date]-# 12 / 31 / 2000 #)/ 364 - 0 . 4999 )* 364 )/ 7 + 0 . 6 ) 

Запрос я не запускал, таблицы лень делать. Вместо русских слов, подставил английские, иначе не вижу текст. Тебе надо вернуть все назад.
Возможно, что я что-то напутал или ошибся. Проверь. Если что не так - стучи!
Я пока на форуме. Пробуй. Удачи!
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574635
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, что так развернул!
Сегодня полностью опробовать не получится. Скоро с работы уйду. Результат скажу завтра.
Еще раз спасибо. Намучался наверно писавши. Объемчик не малый
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574646
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Писать (ударение) не трудно - копируй себе, сложно проверять, что правильно сложил все. А еще волнение - правильно ли я твою задачу понимаю, а то может быть зря воздух сотрясаю...
Хотя и корысть есть - вдруг правильно понял и правильео тиснул - мой код опубликован будет!!! 8-)
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574660
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ты еще не ушел, а что ты вычисляешь в выражении
Код: plaintext
CByte(((Date - # 12 / 31 / 2000 #) - CByte((Date - # 12 / 31 / 2000 #) /  364  -  0 . 4999 ) *  364 ) /  7  +  0 . 6 )
?
Я что-то не въехал. Если номер текущей недели в году то есть готовая функция format(date,"ww"), которая и возвращает значение. Тогда стоит подправить нашу функцию в соответствующих местах.
А что здесь Year([Date])*12+Month([Date]) и здесь Year([Date])*4+CByte(Month([Date])/3+0.2) ???
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574895
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rivkin DmitryЕсли ты еще не ушел, а что ты вычисляешь в выражении
Код: plaintext
CByte(((Date - # 12 / 31 / 2000 #) - CByte((Date - # 12 / 31 / 2000 #) /  364  -  0 . 4999 ) *  364 ) /  7  +  0 . 6 )
?
Я что-то не въехал. Если номер текущей недели в году то есть готовая функция format(date,"ww"), которая и возвращает значение. Тогда стоит подправить нашу функцию в соответствующих местах.
А что здесь Year([Date])*12+Month([Date]) и здесь Year([Date])*4+CByte(Month([Date])/3+0.2) ???

1. Ты правильно понял вычисляется номер недели. Только в формате ww есть один минус. Он считает, что в году 53 недели, а на самом деле их 52 просто 53-я переходит в 1. При сравнении разных годов по неделям это не прокатывает.

2. Year([Date])*12+Month([Date]) считает номер недели, но прибавляет к ней год

3. Year([Date])*4+CByte(Month([Date])/3+0.2) то же, что и 2 только не месяц, а квартал

Для чего все это нужно:

Если брать несколько годов и сортировать их, то текстовый формат даты будет сортироваться не корректно. Вот для этого и нужен еще один столбец в запросе по которому будет производиться сортировка.
А 2-й вариант предлагает сам мастер в Access, когда делаешь диаграмму, ну а остальное сам наваял по аналогии
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574905
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе утро!
Понятно с датами - твои прблемы.
Я думаю, что функцию, что я крапал, нужно уточнить. Во всех местах, где написано

"Format([Date] ....

надо написать "Format([00_Date].[Date]

иначе в запросе будет неопределенность с полями выборки
...
Рейтинг: 0 / 0
Рекордсет на основе запроса
    #32574922
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати! Когда я предлагал два запроса (один с функцией, а другой с IIf) и IIf работал в 5 раз быстрее, то там скорее всего дело вот в чем:

IIf обращается в форму смотрит на значение переключателя и сразу форматирует весь массив

Функция обращается в форму к переключателю на каждой записи, а это не к чему. из-за этого и тормозит

Но я смотрю последний вариант вроде бы это исключил. Я случаем не ошибаюсь, а то может надо сначала скорректировать???
...
Рейтинг: 0 / 0
25 сообщений из 102, страница 2 из 5
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Рекордсет на основе запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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