|
|
|
| Возникла вот какая проблема. Появилась необходимость небольшой модернизации БД, написанной в Акцесе, сразу скажу что в языках программирования почти ни бум-бум, но всё-таки задача передо мной стоит в её решении.
В БД есть программный модуль, вот он:
Public Function LogikaT1(DiapazonT1 As Double)
Dim popravka As String
If DiapazonT1 >= 10 And DiapazonT1 < 30 Then popravka = 1
If DiapazonT1 >= 30 And DiapazonT1 < 50 Then popravka = 2
If DiapazonT1 >= 50 And DiapazonT1 < 70 Then popravka = 3
If DiapazonT1 >= 70 And DiapazonT1 < 90 Then popravka = 4
LogikaT1 = popravka
End Function
Так вот, вопрос у меня вот в чём, как сделать чтобы описаным выше диапазонам присваивалось не заданное мной значение (popravka), а производились некоторые вычисления по определённому алгоритму, данные которых брались бы из таблиц/запросов (что то вроде [таблица1]![поле1]+[таблица1]![поле2]) ??????????
Заранее спасибо за помощь!!! | |
|
| |
|
|
|
| если бы постановка задачи была пояснее, то можно былоб и подсказать.
а производились некоторые вычисления по определённому алгоритму, данные которых брались бы из таблиц/запросов
|
А с такими неопределенностями...
ЗЫ.Как говорится "Телепаты с отпуске" | |
|
| |
|
|
|
| угу, щас поясню: вообщем эта popravka щас не некая константа, а вычисляется как произведение значений находящихся в Поле [T1] и [Коэфициент] таблицы [ВводДанных] | |
|
| |
|
|
|
| Так стоп!
По порядку: название таблицы и имена столбцов, текст запроса, где Поле [T1] и как расчитывается popravka.
В общем нучно корректно ставить задачу.
ЗЫ. Если на осмыслевание поставленной задачи нужно много времени, то, скорее всего, мимо такой задачи пройдут мимо (т.к. обычно своих гемороев достаточно). Это так, к слову
ЗЫ. Скорее всего на сегодня все, рабочий день почти закончен. | |
|
| |
|
|
|
| ща попробую сформулировать: есть таблица с данными, называется [VvodDannyh], вней куча полей - интересующие нас ,это [T1], [RaznostP1] - для диапазона 10-30, [RaznostP2]- для диапазона 30-50, [RaznostP3]- для диапазона 50-70, [RaznostP4]-- для диапазона 70-90, [Koeficient1], [Koeficient2], [Koeficient3], [Koeficient4] - для техже диапазонов . Также существует запрос на выборку данных [OsnZapros], в нём расчитывается нужная нам [Popravka1] как произведение [VvodDannyh]![RaznostP1]*[VvodDannyh]![Koeficient1], тоже самое с [Popravka2], [Popravka3], [Popravka4] - вобщем каждому диапазону соответствует своя [Popravka].
А суть заключается в том чтобы модуль автоматом определял к какому диапазону относится значение поля [T1] ( напрмер если Т1=23, то он относится к диапазону 10-30 и ему соответствует величина [Popravka1]) и приплюсовывал бы к нему соответствующиу поправку.
Вот, вроде всё, надеюсь что не сильно озадачил. | |
|
| |
|
|
|
| я бы в табличке [VvodDannyh] сделал бы поля [T1],[RaznostP] и [Koefficient]
[Popravka] определялась бы исходя из другой таблички такой структуры
[tbАmendment]
- AFrom - с
- ATill - до
-Аmendment - поправка
--------------------------------------
__AFrom_____ATill_____Аmendment ___
____10_______30_________1________
____31_______50_________2________
____51_______70_________3________
____71_______90_________4________
и потом в запросе бы подключал эту табличку
или функцию бы вашу переписал бы как определятор через DLookup(редко пользуюсь и вам не советую) или через FindFirst или кактамего...
в общем я поехал на шашлыки. я бы думал в таком направлении. | |
|
| |
|
|
|
| уххх, озадачился ещё больше :-) Спасибо за совет, буду думать | |
|
| |
|
|
|
| присоединяюсь. Оптимальное решение, т.к. могут меняться коэффициенты, потом и диапазоны, а затем и их общее количество. Так здесь это все можно будет настроить на уровне данных в таблицы, без изменения кода | |
|
| |
|
|
|
| в целом ряде случаев настройка границ диапазонов оказывается неоправданным избыточным решением, значительно усложняющим рабуту с данными
т.е. в случаях когда неперекрывающееся равномерное распределение границ диапазонов (заданная частота дискретизации) могло бы быть достаточным и отвечающим условиям задачи, применяют гибкие настройки а потом мучаются с установлением и контролем границ диапазонов чтобы не перекрывались чтобы были равномерными и проч.
например вычисление по календарю не кратное календарным единицам - неделям месяцам годам (например по декадам или по 12 - 30 - 90 - 180 дней и проч) такие задачи встречаются в производстве с протяженным но фиксированным по срокам циклом - в химии пищепроме и проч.
часто ошибаются применяя ненужные гибкие ручками настраиваемые диапазоны при стандартных статистических выборках... такие задачи встречаются везде - ABC анализ, вероятностный анализ, риск-менеджмент и подобное.
(кстати, правила распределения границ диапазонов могут быть заданы довольно сложными функциями, не обязательно линейными) | |
|
| |
|
|
|
| или чтобы он в этом модуле присваивал значению popravka, для какждого диапазона, уже вычисленное значение, которое будет находиться в запросе | |
|
| |
|
3 Кб. |
|
| просто на всякий случай
обратите внимание что в вашем случае операнды в выражениях сравнения представляют собой последовательный ряд простых чисел (при делении самого операнда на 10)...
вообщеговоря, как я понимаю, это вам задали академическую задачу? тогда...
выражение вида
[LogikaT1]=INT(([DiapazonT1]+10)/2/10)
|
решит ее быстро и без IF
PS
и еще - если вам решительно необходимо использовать в коде громоздкие конструкции (например если от числа строчек кода зависит зарплата) постарайтесь, по крайней мере, выбирать решения выглядящие более профессионально - например SELECT CASE или CHOOSE для подобных тем, как приведенная вами, задач
PPS
решение не проверял - не на чем | |
|
| |
|
|
|
| ЗЫ есчо раз
если вам необходимо в дальнейшем выполнять некоторые операции
можете использовать кострукции вида
SELECT CASE INT(([DiapazonT1]+10)/2/10)
CASE 1
делать что положено делать в диапазоне от 10 до 30
CASE 2
делать что положено делать в диапазоне от 30 до 50
CASE 3
делать что положено делать в диапазоне от 50 до 70
CASE 4
делать что положено делать в диапазоне от 70 до 90
CASE ELSE
ничего не делать, поскольку не положено
END SELECT | |
|
| |
|
|
|
| всё конечно хорошо, но эта Popravka будет постоянно меняться в зависимости от RaznostP и Koefficient, поэтому эта формула в нашем случае не применима.
А можно как-нибудь написать функцию что-то вроде If DiapazonT1 >= 10 And DiapazonT1 < 30 Then popravka = 1, только чтобы после Then была ссылка на поле Popravka1 в запросе OsnZapros ???
PS Сильно не бейте если прошу невозможного, в VBA, как и писАл выше, разбираюсь "как свинья в апельсинах" :-) | |
|
| |
|
|
|
|
задача не сложная, берется "здравым смыслом" | |
|
| |
|
|
|
| If DiapazonT1 >= 10 And DiapazonT1 < 30 Then popravka = DLookup( "[RaznostP1]*[Koeficient1]", "[VvodDannyh]")
If DiapazonT1 >= 30 And DiapazonT1 < 50 Then popravka = DLookup( "[RaznostP2]*[Koeficient2]", "[VvodDannyh]")
... | |
|
| |
|
|
|
| мдяя, длукап да по каждой записи в запросе... чудово | |
|
| |
|
|
|
| Силычу
Я исходил вот из этого: >сразу скажу что в языках программирования почти ни бум-бум
> | |
|
| |
|
|
|
| ИМХО тут не программирование
а математика и статанализ | |
|
| |
|
18 Кб. |
|
| диапазоны должны храниться в отдельной таблице как предлагал Силыч
единственное, что, может быть, уточнил бы - поскольку диапазоны не перекрываются - достаточно хранить только одну границу и коэффициент для этой границы...
однако (как я набросал в примере)
если предполагается что дискретность равномерная (зависит от задачи) то можно не хранить диапазоны а сразу приводить значение к Sampling Rate (интервал дискретизации) диапазонов...
в приведенном примере сэмплинг рэйт равен 20 (начинается со сдвигом 10)
10-30 = [20]
30-50 = [20]
50-70 = [20]
70-90 = [20]
в примере приведено всего четыре диапазона, хотя никто не мешает продолжить
90-110 = [20]
110-130 = [20]
поэтому в формуле было предложено
прибывавить сдвиг (10) и разделить на интервал дискретизации (20)
интервал дискретизации может быть и другим он может быть даже дробным или быть меньше единицы/нуля, или быть меньше сдвига
хотя оправданным, вероятно, будут только значения = INT > 1
теперь предположим, что у вас есть отдельная таблица в которой хранятся коэффициенты для каждого из диапазонов. если эти коэффициенты (зависимость) не могут быть описаны функцией (что упростило бы расчеты) то придется их хранить отдельно как предложил Силыч
таблица вида:
tblUselessDatas
RateRange (PK INTEGER)
RateValue (ANY NUMBER)
пример данных
1 | 34.5
2 | 34.7
3 | 34.8
4 | 35.0
тогда просто пишем запрос по основной таблице
с вычислением диапазона в который попадает значение
с джойном к таблице коэффициентов по PK диапазона | |
|
| |
|
|
|
| Спасибо всем ответившим!!!
Остановился на DLookup, конечно не самый лучший способ, согласен, но время шепчет идти максимально простым путём, да и возможности свои оцениваю реально - не быть мне программистом :-) | |
|
| |
|
|
|
|
|
| еще раз - тут НЕ В ПРОГРАММИРОВАНИИ дело
а в грамотной постановке ТЗ... в твоей задаче ничего хитрого нет :)
ты пример смотрел? | |
|
| |