|
|
|
| А 2007
Уважаемые эксперты!
Тупиковая ситуация. Помогите пож. добрым советом реализовать следующую задачу (просто уверен что пригодится многим):
Имеется таблица тАбонплата с полями: [ТекущийТариф] без пустых значений,
[ДатаИзменения] и [НовыйТариф] могут содержать Null.
Как создать запрос с четвёртым (вычисляемым) полем [АбонплатаЗаМесяц].
Алгоритм должен быть таким:
если тариф не менялся([ДатаИзменения] Is Not Null) то [АбонплатаЗаМесяц] = [ТекущийТариф],
а если менялся (начинается самое интересное) то (ТекущийТариф / на кол-во дней в месяце взятого из ДатаИзменения и * на кол-во дней от первого числа месяца до ДатаИзменения) + (ТекущийТариф / на кол-во дней в месяце взятого из ДатаИзменения и * на кол-во дней от ДатаИзменения до последнего числа месяца).
Например если [ДатаИзменения]=#10.05.2007#, а [ТекущийТариф]=60, [НовыйТариф]=80 :
(60/31*9)+(80/31*22)=74,19.
Как энту халеру реализовать на практике не могу представить.
P.S.
В VBA и SQL слабоват. | |
|
| |
|
|
|
| киньте сюда табличку с небольшим кол-вом данных | |
|
| |
|
7 Кб. |
|
| Прошу прощения у меня А 2003
Скинул пример таблицы | |
|
| |
|
|
|
| Ну как-то вот так.
Правда в ВАшей таблице при наличии даты нет знаечния нового тарифа... я добавил ил нужно добавить проверку иначе получите фигню
SELECT N, [Наименование тарифа], IIf(IsNull([Дата]),[Текущий],(([Текущий]/Day(DateSerial(Year([Дата]),Month([Дата])+1,1)-1))*(Day([Дата])-1))+(([Новый]/Day(DateSerial(Year([Дата]),Month([Дата])+1,1)-1))*(Day(DateSerial(Year([Дата]),Month([Дата])+1,1)-1)-Day([Дата])))) AS NewTariff
FROM тАбонплата;
|
| |
|
| |
|
8 Кб. |
|
| ну или вот | |
|
| |
|
|
|
| Проверил.
Что-то не катит, подбил на калькуляторе первый изменённый тариф, должно быть 4244. а не 4077.
Где может быть промах ? | |
|
| |
|
|
|
| Ошибку нашел
SELECT тАбонплата.N, тАбонплата.[Наименование тарифа], IIf(IsNull([Дата]),[Текущий],(([Текущий]/Day(DateSerial(Year([Дата]),Month([Дата])+1,1)-1))*(Day([Дата])-1))+(([Новый]/Day(DateSerial(Year([Дата]),Month([Дата])+1,1)-1))*(Day(DateSerial(Year([Дата]),Month([Дата])+1,1)-1)-Day([Дата])+1))) AS newTariff
FROM тАбонплата;
|
| |
|
| |
|
|
|
| Ууууурррррааааа заааработала!!!!
Огромное спасибо! | |
|
| |
|
15 Кб. |
|
| Вот блин незадача .
Только с этим разобрался и пошел дальше, как абонотдел дал под дых.....кхе,кхе.
(Раньше они это считали вручную)
В продолжении этой темы появились новые вопросы.
Сложность реализации заключается в следующем:
Есть таблица Абоненты с полями ДатаУстановки, ДатаОткл, ДатаВкл, Абонплата.
Как начислить абонплату за прошлый месяц [color=red](с учетом возможности изменения тарифа)[/color] в поле Абонплата предусмотрев любые варианты, например:
1. ДатаУстановки раньше прошлого месяца, (проблем нет, считаем за весь месяц)
2. ДатаУстановки в прошлом месяце без изменения тарифа
3. ДатаУстановки в прошлом месяце до изменения тарифа
4. ДатаУстановки после изм.тар.
5. ДатаОткл и ДатаВкл без изменения тар.
6. ДатаОткл до изм.тар. ДатаВкл после
7. ДатаОткл и ДатаВкл до изм.тар.
8. ----- / ------ / ------ / ----- после изм.тар.
9. ДатаОткл до или после изм.тар. без ДатаВкл в прошлом месяце или наоборот
Ну и т.д.
Причем в промежутке между ДатаОткл и ДатаВкл абонплата неначисляется, так же неначисляется и до ДатаУстановки
Ну и как Вам эта головоломка? Лично у меня уже чайник закипел....
Молю о помощи, взываю к ....... | |
|
| |