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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2015, 23:51   #1
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию T-SQL INSERT каждого 10 дней

Здравствуйте ребята .... Ест такой таблиц
Код:
create table Tab1
(id int identity(1,1) primary key,
 c_fio nvarchar(30), -- фио клиента
 dt datetime default getdate(), -- дата оформления 
 mon money, -- не имеет значение это ЗП , цена или Кредит ... смотрите так что это деньги и все
)
У этого Tab1 есть еще дочерняя таблица Tab2

Код:
create table Tab2
 (id int identity(1,1),
 dt datetime default getdate(),
 mon money,
 Tab1ID int not null,
 constraint FK_tab2 foreign key (Tab1ID) references Tab1(id) on delete cascade
 )
На Tab1 есть такой триггер
Код:
CREATE TRIGGER  NachislINSERT
ON Tab1 FOR INSERT
AS
BEGIN
    ------ Читаем процент из выданы деньги и сразу сохраняю в таблицу  Tab2
    insert Tab2  (Tab1ID, mon)
    select I.id, 
	   case 
           when I.mon <50 then 5 -- если выданы деньги < 50 тогда всеравно начисляем процент 5 Руб
	   when I.mon >50 then I.mon/100*10 -- если выданы деньги > 50 разделить на 100 * 10
	end  
    from inserted I
END
При вставке запись на Tab1 триггер работает как хотел и здесь все нормально
Код:
insert into Tab1(c_fio, mon) values(N'Вася', 270)  
insert into Tab1(c_fio, mon) values(N'Петя', 45)
все нормально работает , смотрю
Код:
select * , -- Суммировать начислены процент
           isnull((select SUM(mon) 
           from Tab2
           where Tab1.id=Tab2.Tab1ID
           ),0)[Начислен процент]
from Tab1
И после 9 дней начисляю процент по дням из Tab1.mon . то есть, если на какой то Вася выдано деньги 20.09.2015 у него сразу начисляет триггер 10% и потом ! после 30.09.2015 каждого дня начисляется 1%
Код:
insert Tab2(mon, Tab1ID)  output 'inserted.Tab2'[inserted.Tab2],inserted.*
select mon/100*1 ,id
from Tab1 
where Tab1.dt<dateadd(day, -9, cast(GETDATE() as date))
and not exists( 
	       select * 
	       from Tab2 
	       where Tab1.id=Tab2.Tab1ID 
               and cast(Tab2.dt as date)=cast(GETDATE() as date)
              )
Вопрос: Как делать так что после 9 дня начислял 10% каждого 10-ого дня только один раз ? То есть, это insert выполняется каждого дня и хочу что проверял последние дата начисление , так
Код:
 select top 1 dt from Tab2 order by dt desc
и где "Tab2.dt= дата" больше 9-ого дня начислял 10%

Последний раз редактировалось xxbesoxx; 26.10.2015 в 00:12.
xxbesoxx вне форума Ответить с цитированием
Старый 26.10.2015, 00:22   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

И все эти периодические начисления в таблицу пишутся? Зачем? Что мешает на весу их вычислять запросом или, если он больно сложным получается, в хранимке?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.10.2015, 07:43   #3
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
И все эти периодические начисления в таблицу пишутся? Зачем?
1) Спасибо за внимание
2) Потому что "Бухгалтер" захотел что он мог посмотрет информацию детально , на пример вот так
Код:
  select T1.c_fio as ФИО, T1.dt as [Дата выдачи] , 
         T2.dt as [Дата начисление], 
		 T2.mon as [Начислени процент]
  from Tab1 T1 inner join Tab2 T2 on T1.id=T2.Tab1ID
Цитата:
если он больно сложным получается
Какой бы это не было больно и сложно вот "Бухгалтеру" Я не магу послать и за этого был вынужден хранить в таблице это начислены процент чтобы Я мог потом его показать детально.! кому, когда и сколько начислено "когда он захочет"

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

Я так думаю что надо выбрать последние "дата начислены" из Tab2 и потом сравнит на "текущие дату"
Последние "дата начислены"
Выбираю так
Код:
SELECT D.DT_Nachislen
FROM (SELECT T1.*, 
     (SELECT  TOP 1 T2.dt  from Tab2 T2 
      WHERE  T2.Tab1ID=T1.id ORDER BY T2.dt DESC) AS DT_Nachislen FROM Tab1 T1) D
Но не понял как здесь это написать правильно
Код:
insert Tab2(mon, Tab1ID)  output 'inserted.Tab2'[inserted.Tab2],inserted.*
select mon/100*10, -- Вот здесь 10%
       id
from Tab1 
-- Вот здесь месте Tab1.dt нелзя сравнит на тот запрос который уже есть выше ?
where  Tab1.dt <dateadd(day, -9, cast(GETDATE() as date))
and not exists( 
	       select * 
	       from Tab2 
	       where Tab1.id=Tab2.Tab1ID 
               and cast(Tab2.dt as date)=cast(GETDATE() as date)
              )
Вот так пишет что ошибка
Код:
insert Tab2(mon, Tab1ID)  output 'inserted.Tab2'[inserted.Tab2],inserted.*
select mon/100*10, -- Вот здесь 10%
       id
from Tab1 
where  (SELECT D.DT_Nachislen
        FROM (SELECT T1.*, 
        (SELECT  TOP 1 T2.dt  from Tab2 T2 
        WHERE  T2.Tab1ID=T1.id ORDER BY T2.dt DESC) AS DT_Nachislen 
        FROM Tab1 T1) D) < 
        dateadd(day, -9, cast(GETDATE() as date))
and not exists( 
	       select * 
	       from Tab2 
	       where Tab1.id=Tab2.Tab1ID 
               and cast(Tab2.dt as date)=cast(GETDATE() as date)
              )
Текст ошибки
Цитата:
Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
Чего он хочет ?
Цитата:
Msg 512, уровень 16, состояние 1, строка 1
Вложенный запрос возвращается более 1 значения. Это не допускается, когда подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.
Если Tab1.dt возвращает более 1 значения и это можно , Почему для "вложенный запросов" это нельзя . тогда что делать ?

Последний раз редактировалось xxbesoxx; 26.10.2015 в 12:54.
xxbesoxx вне форума Ответить с цитированием
Старый 26.10.2015, 13:04   #5
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
Я так думаю что надо выбрать последние "дата начислены" из Tab2 и потом сравнит на "текущие дату"
зачем?
Что вам надо? чтобы каждого 10, 20, 30 начислялось по 10 или по другому?
come-on вне форума Ответить с цитированием
Старый 26.10.2015, 13:25   #6
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
come-on Что вам надо? чтобы каждого 10, 20, 30 начислялось по 10
Да , что бы каждого 10-ого дня начислялось
xxbesoxx вне форума Ответить с цитированием
Старый 26.10.2015, 13:31   #7
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

DATEPART(DAY, GETDATE()) вернет номер дня, разделите на 10, если делится нацело то надо 10%
или я опять не понял?
come-on вне форума Ответить с цитированием
Старый 26.10.2015, 13:43   #8
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
или я опять не понял?
Не знаю, может я не понял ваши мысли , На #1 есть структура таблиц, как я начисляю при оформление -при INSERT на Tab1 и после 9-ого дня как я начисляю эту процент , все начислены проценты хранится на Tab2
после 9 дня начисляется каждого дня только один раз...
Сейчас хочу что каждого 10-ого дня делать начисление и не каждого дня можете примерно показать что вы имеете в виду ?
DATEPART это просто функция который возвращает целое число и что он мне даст ?
Код:
SELECT DATEPART(DAY, GETDATE()) as Ден, DATEPART(MONTH, GETDATE()) as Месяц , DATEPART(YEAR, GETDATE()) as Год

Последний раз редактировалось xxbesoxx; 26.10.2015 в 13:55.
xxbesoxx вне форума Ответить с цитированием
Старый 26.10.2015, 13:55   #9
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Увы, не понимаю что вам надо.
come-on вне форума Ответить с цитированием
Старый 26.10.2015, 14:05   #10
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
Увы, не понимаю что вам надо.
Пожалуйста не отвлекайте .!!! Не знайте проходим мимо... На #5 спрашивали и ответил на #6

Последний раз редактировалось xxbesoxx; 26.10.2015 в 14:07.
xxbesoxx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бэкап БД после каждого изменения (INSERT, UPDАTE) regman SQL, базы данных 13 28.08.2015 23:49
Выполнять INSERT каждого дня только 1 раз xxbesoxx SQL, базы данных 9 22.07.2015 13:22
Написать процедуру подобно insert, которая после каждого вхождения символа C в строку S1 вставляет строку S2 azalia Паскаль, Turbo Pascal, PascalABC.NET 17 09.01.2014 12:39
Insert sql hunter03 Помощь студентам 0 15.12.2011 20:48
Первые 10 дней, каждого месяца buk Microsoft Office Access 2 10.10.2009 00:58