Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2014, 23:04   #1
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию вычисление поля процент от выданный деньги

Здравствуйте ребята . В СУБД MS.SQL Изначально задача у меня был такой. Например в таблице хранится
----------------------------------
Дата оформления - где ограничения default getdate(),
Наименование - nvarchar(30)
выданный деньги - money
---------------------------------
10.07.2014 выдали деньги . Что запрос сразу добавил 10% и потом каждой через 10-день добавил 10% от выданный деньги .
Это задача решил катим образом

1. Создаю таблица
Код:
create Table Tab1
(
	id int identity(1,1) primary key,
	dat_vidan datetime default getdate(), -- Дата оформления
	naimenovanie nvarchar(40) not null, -- Наименование
	vidan_deng money -- выданный деньги
);
2. Добавляю несколько запись
Код:
insert into Tab1(naimenovanie, vidan_deng)
values(N'Телевизор',200),
           (N'Ноутбук',280),
           (N'Телефон',40),
           (N'Что то',45)
3. И запросе читаю кол-во день и для процент делаю вычисление поля где первый раз добавляю 10% и потом каждое через 10 день
Код:
select id, dat_vidan, naimenovanie, vidan_deng, 
DATEDIFF(DAY,dat_vidan,GETDATE()) as [Кол-во ден] ,
(vidan_deng+ vidan_deng/100*10) +(vidan_deng /100*10) *(DATEDIFF(DAY,dat_vidan,GETDATE())/10) as [деньги+%]
from Tab1
Это да работает хорошо ! Но задача поставили еще чуть-чуть трудны для меня не магу решать

Т.З если vidan_deng money -- выданный деньги меньше или равно 50 то процент по любому на это поля as [деньги+%] добавил 5 .
То есть если выдали 40 то с процентом 45 . или выдали 28 нету разница от: 1 руб. до: 50 руб. То по любому процент почитал запрос 5 руб.
Вопрос: Скажите пожалуйста как это реализовать ?

Последний раз редактировалось xxbesoxx; 13.08.2014 в 23:06.
xxbesoxx вне форума Ответить с цитированием
Старый 13.08.2014, 23:12   #2
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Функция ROUND здесь не прокатит ....... Думаю применить IF...ELSE Но еще думаю как ? Ребята помогите решать это задача
xxbesoxx вне форума Ответить с цитированием
Старый 13.08.2014, 23:12   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Код:
select id, dat_vidan, naimenovanie, vidan_deng, 
DATEDIFF(DAY,dat_vidan,GETDATE()) as [Кол-во ден] ,
case when vidan_deng money<=50 then 
   (vidan_deng+ vidan_deng/100*10) +(vidan_deng /100*10) *(DATEDIFF(DAY,dat_vidan,GETDATE())/10)+5
else
   (vidan_deng+ vidan_deng/100*10) +(vidan_deng /100*10) *(DATEDIFF(DAY,dat_vidan,GETDATE())/10)
end  as [деньги+%]
from Tab1
Идея ясна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.08.2014, 23:16   #4
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Stilet Друг спасибо за быстрый ответ ! За внимание , Идея ясна да попробую и напишу что получится

Вот так если делаю ! Сразу добавляет да на выданный деньги 5 руб. Но когда меняю дата на компьютере на 10 день перёд УЖЕ НЕ ПРАВИЛЬНО читает деньги который <=50
Код:
select id, dat_vidan, naimenovanie, vidan_deng, 
DATEDIFF(DAY,dat_vidan,GETDATE()) as [Кол-во ден] ,
case when vidan_deng <=50 then 
  (vidan_deng +5)+ (vidan_deng +5) *(DATEDIFF(DAY,dat_vidan,GETDATE())/10)
else
   (vidan_deng+ vidan_deng/100*10) +(vidan_deng /100*10) *(DATEDIFF(DAY,dat_vidan,GETDATE())/10)
end  as [деньги+%]
from Tab1
Я хочу делать так, Что сразу добавил 5 руб. и каждое через 10 день тоже 5 руб. пока не понял где допускаю ошибки

Последний раз редактировалось Stilet; 14.08.2014 в 08:08.
xxbesoxx вне форума Ответить с цитированием
Старый 14.08.2014, 08:11   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Код:
(vidan_deng +5)+ 5*(DATEDIFF(DAY,dat_vidan,GETDATE())/10)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.08.2014, 08:16   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Цитата:
НЕ ПРАВИЛЬНО читает деньги который <=50
Код:
(vidan_deng +5)+ (vidan_deng +5) *(DATEDIFF(DAY,dat_vidan,GETDATE())/10)
Выделенное убрать.
Желательно предусмотреть отрицательный результат DateDiff
Желательно параметризовать процент, период и расчёт минимального платежа извне, или хотя бы переменными (по аналогии с константами), чтобы потом не накосячить при изменениях бизнесмодели.
phomm вне форума Ответить с цитированием
Старый 14.08.2014, 08:49   #7
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Спасибо ребята ... Stilet Все правильно работает . Огромное ВАМ СПАСИБО .

Цитата:
Сообщение от phomm Посмотреть сообщение
Код:
(vidan_deng +5)+ (vidan_deng +5) *(DATEDIFF(DAY,dat_vidan,GETDATE())/10)
Выделенное убрать.
Желательно предусмотреть отрицательный результат DateDiff
Желательно параметризовать процент, период и расчёт минимального платежа извне, или хотя бы переменными (по аналогии с константами), чтобы потом не накосячить при изменениях бизнесмодели.
Ну если предусмотреть отрицательный результат DateDiff нечего страшного потому что в поля vidan_deng money -- выданный деньги нечего я не изменяю . Делаю просто вычисление поля ! и вряд ли оператор дату будет менять на компьютере .
Тема можно закрыть ребята .... Огромное вам спасибо

Последний раз редактировалось Stilet; 14.08.2014 в 11:04.
xxbesoxx вне форума Ответить с цитированием
Старый 14.08.2014, 11:08   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
и вряд ли оператор дату будет менять на компьютере .
Дададада )))
А я тебе могу привести миллион примеров когда опер меняет дату, и еще умудряется оправдаться за это. Мы, админы, голову ломаем как так, когда суммы левой датой идут, а это оказывается "так нужно было".
Так что не зарекайся.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.08.2014, 13:05   #9
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

в моем случае заботиться на него ЭТО личное ! Stilet Это для ломбард техники. и если оператор будет поменять дату! на квитанция который формируется с помощью FastReport там же на квитанции Дата печатов: = SYSDATE и сразу будет видно если кто то менял дата ! И если они потом поставить "текущая дата" все станет на своего месте ... Потому что vidan_deng money -- выданный деньги который они видали клиенту это запрос там нечего не меняет.
Но в общем да надо запретить изменение даты на компьютере
xxbesoxx вне форума Ответить с цитированием
Старый 14.08.2014, 13:14   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну по крайней мере я бы не сколько запретил, сколько предупредил пользователя повнимательнее следить за датой. Дело тут даже не в том что юзеру захочется. Вдруг батарейка сядет, и будет у тебя исчисление с 1890-го года. Минусы пойдут. Пичаль.
Так что ты бы предусмотрел хотя бы защиту от минусов при разнице дат.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
процент материала Nickolai47 C# (си шарп) 2 19.02.2013 17:46
Вычисление поля delphi xxbesoxx БД в Delphi 5 20.04.2012 11:58
Процент. ROBERT033 Microsoft Office Excel 7 13.05.2011 00:05
Вычисление значения и процент от результата Teon Microsoft Office Excel 5 10.02.2011 01:24
Процент загруженности asd48 Общие вопросы C/C++ 13 07.06.2009 21:04