Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Модернизация программного модуля
 
 автор: energy   (28.07.2007 в 17:00)   личное сообщение
 
 

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

В БД есть программный модуль, вот он:

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]) ??????????

Заранее спасибо за помощь!!!

  Ответить  
 
 автор: ГлазастыйМышь   (28.07.2007 в 17:15)   личное сообщение
 
 

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

А с такими неопределенностями...

ЗЫ.Как говорится "Телепаты с отпуске"

  Ответить  
 
 автор: energy   (28.07.2007 в 17:29)   личное сообщение
 
 

угу, щас поясню: вообщем эта popravka щас не некая константа, а вычисляется как произведение значений находящихся в Поле [T1] и [Коэфициент] таблицы [ВводДанных]

  Ответить  
 
 автор: ГлазастыйМышь   (28.07.2007 в 17:54)   личное сообщение
 
 

Так стоп!
По порядку: название таблицы и имена столбцов, текст запроса, где Поле [T1] и как расчитывается popravka.
В общем нучно корректно ставить задачу.

ЗЫ. Если на осмыслевание поставленной задачи нужно много времени, то, скорее всего, мимо такой задачи пройдут мимо (т.к. обычно своих гемороев достаточно). Это так, к слову
ЗЫ. Скорее всего на сегодня все, рабочий день почти закончен.

  Ответить  
 
 автор: energy   (29.07.2007 в 08:42)   личное сообщение
 
 

ща попробую сформулировать: есть таблица с данными, называется [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]) и приплюсовывал бы к нему соответствующиу поправку.

Вот, вроде всё, надеюсь что не сильно озадачил.

  Ответить  
 
 автор: Силыч   (29.07.2007 в 10:05)   личное сообщение
 
 

я бы в табличке [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 или кактамего...
в общем я поехал на шашлыки. я бы думал в таком направлении.

  Ответить  
 
 автор: energy   (29.07.2007 в 10:46)   личное сообщение
 
 

уххх, озадачился ещё больше :-) Спасибо за совет, буду думать

  Ответить  
 
 автор: ГлазастыйМышь   (29.07.2007 в 18:13)   личное сообщение
 
 

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

  Ответить  
 
 автор: Explorer   (30.07.2007 в 13:01)   личное сообщение
 
 

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

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

например вычисление по календарю не кратное календарным единицам - неделям месяцам годам (например по декадам или по 12 - 30 - 90 - 180 дней и проч) такие задачи встречаются в производстве с протяженным но фиксированным по срокам циклом - в химии пищепроме и проч.

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

(кстати, правила распределения границ диапазонов могут быть заданы довольно сложными функциями, не обязательно линейными)

  Ответить  
 
 автор: energy   (28.07.2007 в 17:39)   личное сообщение
 
 

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

  Ответить  
 
 автор: Explorer   (29.07.2007 в 13:00)   личное сообщение
3 Кб.
 
 

просто на всякий случай

обратите внимание что в вашем случае операнды в выражениях сравнения представляют собой последовательный ряд простых чисел (при делении самого операнда на 10)...

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

выражение вида

[LogikaT1]=INT(([DiapazonT1]+10)/2/10) 


решит ее быстро и без IF

PS

и еще - если вам решительно необходимо использовать в коде громоздкие конструкции (например если от числа строчек кода зависит зарплата) постарайтесь, по крайней мере, выбирать решения выглядящие более профессионально - например SELECT CASE или CHOOSE для подобных тем, как приведенная вами, задач

PPS

решение не проверял - не на чем

  Ответить  
 
 автор: Explorer   (29.07.2007 в 13:36)   личное сообщение
 
 

ЗЫ есчо раз

если вам необходимо в дальнейшем выполнять некоторые операции

можете использовать кострукции вида

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

  Ответить  
 
 автор: energy   (29.07.2007 в 14:27)   личное сообщение
 
 

всё конечно хорошо, но эта Popravka будет постоянно меняться в зависимости от RaznostP и Koefficient, поэтому эта формула в нашем случае не применима.
А можно как-нибудь написать функцию что-то вроде If DiapazonT1 >= 10 And DiapazonT1 < 30 Then popravka = 1, только чтобы после Then была ссылка на поле Popravka1 в запросе OsnZapros ???

PS Сильно не бейте если прошу невозможного, в VBA, как и писАл выше, разбираюсь "как свинья в апельсинах" :-)

  Ответить  
 
 автор: Explorer   (30.07.2007 в 10:01)   личное сообщение
 
 


>всё конечно хорошо,


задача не сложная, берется "здравым смыслом"

  Ответить  
 
 автор: Анатолий (Киев)   (30.07.2007 в 10:46)   личное сообщение
 
 

If DiapazonT1 >= 10 And DiapazonT1 < 30 Then popravka = DLookup( "[RaznostP1]*[Koeficient1]", "[VvodDannyh]")
If DiapazonT1 >= 30 And DiapazonT1 < 50 Then popravka = DLookup( "[RaznostP2]*[Koeficient2]", "[VvodDannyh]")
...

  Ответить  
 
 автор: Силыч   (30.07.2007 в 10:55)   личное сообщение
 
 

мдяя, длукап да по каждой записи в запросе... чудово

  Ответить  
 
 автор: Анатолий (Киев)   (30.07.2007 в 13:06)   личное сообщение
 
 

Силычу
Я исходил вот из этого: >сразу скажу что в языках программирования почти ни бум-бум
>

  Ответить  
 
 автор: Explorer   (30.07.2007 в 13:18)   личное сообщение
 
 

ИМХО тут не программирование

а математика и статанализ

  Ответить  
 
 автор: Explorer   (30.07.2007 в 12:05)   личное сообщение
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 диапазона

  Ответить  
 
 автор: energy   (30.07.2007 в 17:57)   личное сообщение
 
 

Спасибо всем ответившим!!!
Остановился на DLookup, конечно не самый лучший способ, согласен, но время шепчет идти максимально простым путём, да и возможности свои оцениваю реально - не быть мне программистом :-)

  Ответить  
 
 автор: Силыч   (30.07.2007 в 18:32)   личное сообщение
 
 

мдя...

  Ответить  
 
 автор: Explorer   (30.07.2007 в 18:56)   личное сообщение
 
 

нудык...

  Ответить  
 
 автор: Explorer   (30.07.2007 в 18:54)   личное сообщение
 
 

еще раз - тут НЕ В ПРОГРАММИРОВАНИИ дело

а в грамотной постановке ТЗ... в твоей задаче ничего хитрого нет :)

ты пример смотрел?

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList