Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 40

Можно ли значение нескольких вычисляемых полей запроса взять из одного массива, возвращаемого пользовательской функцией?

11.05.2020, 00:16. Показов 814. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ситуация такая: сделал пользовательскую функцию, которая двумя запросами (один с группировкой, другой простой) вытаскивает из двух таблиц набор данных, их между собой арифметирует и возвращает итоговый результат.

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

Для понимания - я вытаскиваю
- суммарный объем по нескольким пунктам, входящим в одну накладную,
- суммарный вес,
- разные надбавки и скидки, влияющие на цену и которые привязаны к накладной,

и на их основе рассчитываю
- приведенный объем,
- стоимость за одну операцию,
- стоимость за другую,
- стоимость за третью и
- общую окончательную стоимость.

Вот эти рассчитанные данные (штук пять-шесть) мне нужно вывести в запросе отдельными полями.

Решение в лоб - в каждом вычисляемом поле запроса вставить свою функцию с разным параметром возвращаемого результата.
Но тогда получится что по каждой записи я 5-6 раз обращусь по сути к одной и той же функции, которая, соответственно, выполнит 5-6 пар одинаковых запросов (т.к. набор исходных данных для расчета каждого элемента один и тот же, они только по разному складываются/умножаются).

Мне видится это весьма расточительным делом, делать вместо двух 10-12 одних и тех же запросов.

Я могу для одной записи целевого запроса вычислить все необходимые мне возвращаемые результаты за один раз на основе двух запросов из функции и поместить их в массив. Только не соображу как мне вернуть в вычисляемые поля запроса значения элементов этого массива.

Ну и соответственно непонятно что должно инициировать это единственное для каждой записи обращение к "тяжелой" функции с расчетами, что бы она вернула (куда?) нужный массив с результатами.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.05.2020, 00:16
Ответы с готовыми решениями:

Оптимизация вычислений нескольких вычисляемых полей в таблице
Имеется таблица tbl_Group с полями Id, calc_0, calc_1, calc_2, calc_3, ... , calc_5 В этой таблице, согласно названию полей, все,...

Автозаполнение полей, зависимость нескольких полей от одного
Всем привет! Решил для работы создать незатейливую БД для учёта файлов посадочных мест различных электронных компонентов. Пока в БД...

Пусть zap-переменная типа запись,состоящая из нескольких полей. Можно ли инициализировать значение при помощи read(zap)
Пусть zap-переменная типа запись,состоящая из нескольких полей. Можно ли инициализировать значение при помощи read(zap)

16
1323 / 541 / 112
Регистрация: 29.03.2016
Сообщений: 1,307
11.05.2020, 00:24
А где в дальнейшем будут использованы данные запроса?
0
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 40
11.05.2020, 00:48  [ТС]
Ну он достаточно базовый получается и востребован в нескольких формах (в табличном виде), ну и плюс он же используется в других запросах

Добавлено через 9 минут
Добавлю, что использую вычисляемые поля вместо группировки одного запроса и создания потом второго с нужными результатами т.к., во первых, нужен обновляемый результирующий запрос, во вторых эту пользовательскую функцию использую и в других местах (других запросах или в полях формы/отчетов)
0
1323 / 541 / 112
Регистрация: 29.03.2016
Сообщений: 1,307
11.05.2020, 01:04
Можно так попробовать:
Вложения
Тип файла: zip db1.zip (11.9 Кб, 3 просмотров)
0
1323 / 541 / 112
Регистрация: 29.03.2016
Сообщений: 1,307
11.05.2020, 01:13
Я для "сложно/долго вычисляемых значений" пользую обычно коллекции инстансов классов/текстовых значений,
в которые единожды добавляю айтемы с ключем (значение ключевого поля, обычно),
и в дальнейшем при работе приложения пользую уже данные из коллекции,
получая их по значению ключевого поля.
Главное в таком подходе - не забыть пересчитать итоговые значения, при изменении значений полей, участвующих в вычислении.
0
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 40
11.05.2020, 03:34  [ТС]
Правильно ли я понял:
Определяем в модуле пользовательский тип данных с нужным количеством расчетных значений, в запросе в первом вычисляемом поле обращаемся к моей пользовательской функции, которая один раз "затратно" вытаскивает исходные данные и а) заполняет пользовательский тип, который остается заполненым на уровне модуля до следующего вызова "затратной" функции; б) возвращает в поле запроса одно из значений (что бы в холостую не гонять). Остальные вычисляемые поля в запросе обращаются уже каждый к своей "легкой" функции, которая считывает и возвращает нужное значение из заполненного пользовательского типа. Следующая запись в первом вычисляемом поле опять стартует "затратную" функцию, которая переписывает пользовательский тип.
В вашем примере вроде да, все работает, завтра у себя реализовать попробую. Спасибо за подсказку!
0
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 40
12.05.2020, 15:00  [ТС]
Сделал по подобию вычисляемые поля в своей базе, так то считаются нормально, но столкнулся с таким явлением: если в таблице (возвращаемой запросом) выделить/поперемещаться по первому вычисляемому полю (то, которое связано с первичной "затратной" функцией), то скачут значения во всех вторичных (возвращаемых "легкими" функциями) полях выделенной записи. Скачут - это значит отображают не реальное значение а (как я понял) значение соседней записи. Если выделить поле с "легкой функцией", то значение скачет только в этом поле. Если выделить поле не с функциями а простое, возвращаемое из таблицы, то значения не скачут. Вобщем, описал как мог, но лучше посмотреть глазами, пример во вложении. В чем может быть дело?
Вложения
Тип файла: zip Database2.zip (422.0 Кб, 0 просмотров)
0
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 40
12.05.2020, 15:08  [ТС]
Сорри, не совсем корректный файл (исходные данные), обновленный в этом посте выкладываю
Вложения
Тип файла: zip Database2.zip (301.6 Кб, 5 просмотров)
0
Эксперт MS Access
 Аватар для Eugene-LS
13176 / 5875 / 1505
Регистрация: 05.10.2016
Сообщений: 16,505
12.05.2020, 17:05
yup1975, вижу вы решили поиграться с размерностью данных (Double)!
Весьма поучительно!
Но у вас в БД :
- Integer
- Long Integer
- Currency
... и фсё!
Так и зачем такие "бешеные" вычисления с данными которых у вас нет = непонятно?
Ресурсы системы некуда девать?
0
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 40
12.05.2020, 20:19  [ТС]
Eugene-LS, согласен что не очень хорошо, но руки не дошли вдумчиво разобраться. На вскидку, почему то криво отображает значения если переменным с дробной частью назначить Single. В этом случае цифры получаются вида 0,720000028610229, даже если к ним применить Round, что режет глаз. Currency попробовал всем проставить - для денег самое то (ну собственно для них и предназначено), а вот для других значений (например для объема) не по феншую выводит 0,72р. Понятно что в целевом месте отформатирую как нужно, но что то глаз режет И Currency же тоже 8 байт, как и Double, реально легче с ними оперировать машине?
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,941
Записей в блоге: 4
12.05.2020, 20:43
Цитата Сообщение от yup1975 Посмотреть сообщение
Вот эти рассчитанные данные (штук пять-шесть) мне нужно вывести в запросе отдельными полями.
куда вывести
- сначала в запрос
- а потом и в отчет

может вам методику расчета поменять - считать все это в форме
0
Эксперт MS Access
26827 / 14507 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
12.05.2020, 20:43
yup1975, если выполнение запроса не требует очень быстрого ответа, то можно поставить дистинкт (неявная группировка) и ничего "скакать" не будет. На моей не очень быстрой машине запрос с дистинктом выполнялся 23 секунды. Что конечно намного больше исходного. Но зато правильно.
SQL
1
2
SELECT DISTINCT reestrTN.ID_TN, S_sum([ID_TN]) AS Сумма, S_m([ID_TN]) AS Масса, S_v([ID_TN]) AS Объем, S_mfp2([ID_TN]) AS МФП, S_prV([ID_TN]) AS ПривV
FROM reestrTN;
1
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 40
12.05.2020, 21:23  [ТС]
shanemac51, в форме тоже можно (и считаю), но хотелось сделать универсальную функцию к которой легко и быстро обращаться откуда угодно, т.к. эти вычисляемые данные много где используются. А в запросе данные нужны для последующей группировки и получения суммарных значений в разных разрезах. Но что то не быстро такой запрос с группировкой работает, поэтому наверно пойду по пути периодического (обновляемого пользователем по мере надобности) предварительного вычисления и сохранения в промежуточной таблице и дальше уже работать с этими данными из таблицы. Не очень нравится такой посредник, но по живому каждый раз считать долговато получается.

Добавлено через 1 минуту
mobile, спасибо за решение, попробую! Но интересно почему все же "скачет"
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,941
Записей в блоге: 4
12.05.2020, 21:36
Цитата Сообщение от yup1975 Посмотреть сообщение
А в запросе данные нужны для последующей группировки и получения суммарных значений в разных разрезах
одной из моих первых задач были СЧЕТА-ФАКТУРЫ
об интернете я тогда и не слышала(вернее не видела)
все итоги считала при вводе - уж очень тогда часто правила расчета тогда менялись и бухгалтерия пожелала не пересчитывать итоги по счету, только если не в контрольном режиме

поэтому все итоги считались и запоминались при вводе
соответственно все групповые итоги считались с ранее запомненных цифр
0
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 40
12.05.2020, 21:49  [ТС]
Да, можно и так, но имхо это не рационально. Я вот то же пойду, наверно, по пути записи и хранения в промежуточном месте этих итогов (пользователь будет с нужной периодичностью запускать запрос на обновление), но как то не нравится мне это.
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,941
Записей в блоге: 4
12.05.2020, 22:03
Цитата Сообщение от yup1975 Посмотреть сообщение
по пути записи и хранения в промежуточном месте этих итогов
вряд ли промежуточное место лучше основных таблиц

конечно многое зависит от схемы таблиц вашей базы
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,941
Записей в блоге: 4
12.05.2020, 22:35
и 2 типичные формы для работы с защитой от случайной корректуры
Миниатюры
Можно ли значение нескольких вычисляемых полей запроса взять из одного массива, возвращаемого пользовательской функцией?   Можно ли значение нескольких вычисляемых полей запроса взять из одного массива, возвращаемого пользовательской функцией?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.05.2020, 22:35
Помогаю со студенческими работами здесь

Выборка нескольких полей из вложенного запроса
Здравствуйте! Допустим есть 2 таблицы: Описание реквизита ATTRIBUTES с полями ID, CODE, NAME Связь реквизитов LINKS c полями ID,...

В структуре нужно из одного метода взять значение массива и перетащить в другой (другой метод)
struct matrix { public int sz; public void size() { Console.Write("Задайте размер...

Объединение нескольких полей запроса в поле формы
Здравствуйте! Вопрос. Есть запрос с полями: код (значения кода 1,2,3,4), потери (числовой формат). Нужно создать форму с одним полем, в...

Где можно взять исходник DLL с функцией простой обработки графики?
Кто-нибудь знает где можно взять исходник DLL с функцией простой обработки графики???

Суммирование вычисляемых полей.
На ленточной форме есть вычисляемые поля, при изменении значения одного из полей все поля должны просумироваться. При написании...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru