Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Нумерация с логикой  [new]
Diminator
Member

Откуда:
Сообщений: 42
Подскажите, как сделать нумерацию таким образом чтобы она начиналась с 001 каждый новый месяц и включала в себя номер месяца и две последних цифры года? чтобы получилось -год-месяц-счетчик- (1309054). Но при наступлении нового месяца чтобы счетчик обнулился и стартовал заново -1310001-. И через что делать? Через триггер на таблицу?
2 сен 13, 22:58    [14787019]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Diminator,

по уму нарисовать таблицу каледарь с доп полями нумерации которые хотите, или сте
3 сен 13, 10:23    [14787955]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
softmaker
Member

Откуда: оттуда
Сообщений: 1088
Делать умный insert на клиенте и не нагружать сервер "умностями".
3 сен 13, 10:35    [14788020]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Diminator
Member

Откуда:
Сообщений: 42
Maxx
по уму нарисовать таблицу каледарь с доп полями нумерации которые хотите, или сте


softmaker
Делать умный insert на клиенте и не нагружать сервер "умностями".


Не затруднит пару примеров? не могу мысль уловить. Да и знаний не хватает.
3 сен 13, 11:28    [14788364]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
softmaker
Делать умный insert на клиенте
Было бы интересно взглянуть на пример.
3 сен 13, 11:34    [14788413]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
select CAST(GETDATE() as date) , 
  case 
	  when MONTH(GETDATE()) < 10
	    then '0'+ CAST(MONTH(GETDATE()) as nvarchar(2))
      else CAST(MONTH(GETDATE()) as nvarchar(2))
	end 
 +RIGHT(CAST(YEAR(GETDATE()) as nvarchar(4)),2) +  '0'+
    case 
	  when DAY(GETDATE()) < 10
	    then '0'+ CAST(DAY(GETDATE()) as nvarchar(2))
      else CAST(DAY(GETDATE()) as nvarchar(2))
	end 


если я правильно понял ,что таки вам надо
3 сен 13, 11:41    [14788459]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
softmaker
Member

Откуда: оттуда
Сообщений: 1088
invm
softmaker
Делать умный insert на клиенте
Было бы интересно взглянуть на пример.

На каком ЯП?
3 сен 13, 11:56    [14788559]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Гость333
Member

Откуда:
Сообщений: 3683
softmaker
invm
пропущено...
Было бы интересно взглянуть на пример.

На каком ЯП?

Мне тоже интересно!
На любом ЯП, хоть на псевдокоде.
3 сен 13, 12:04    [14788614]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
я тут посмотрел на стартовы йт опик.. мой код в последнем кейсе не правильный :)) НО что будет делать ТС,если номеров за месяц будет больше 999 ?
3 сен 13, 12:09    [14788639]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
softmaker
Member

Откуда: оттуда
Сообщений: 1088
Не пойму что тут интересного, ну ладно, в псевдокоде:

select max(id) (пусть будет 1309054)
GetSystemDate(d, m, y)
StrToInt(mid$(Fields[0].AsString, 2, 2)) < d ? newid=0 : newid=StrToInt(mid$(Fields[0].AsString, 4, 3))+1;
query.SQL.Text := Format('insert into MyTable(id, data) values(%d, %чтонадо)', [newid, нужности]);
query.ExecSQL;
3 сен 13, 12:12    [14788647]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Exproment
Member

Откуда:
Сообщений: 416
Коллеги, а в чем собственно проблема ? В алгоритмизации ? Или в его реализации на уровне базы ? Так если уж надо именно в базе, то чем CLR не устраивает ?
3 сен 13, 12:16    [14788667]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
softmaker
Member

Откуда: оттуда
Сообщений: 1088
Мммм...
*newid=0
меняется на
newid := (y mod 100) * 100 + m

*< d
на
< m
3 сен 13, 12:16    [14788673]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Гость333
Member

Откуда:
Сообщений: 3683
softmaker
Не пойму что тут интересного, ну ладно, в псевдокоде:

select max(id) (пусть будет 1309054)
GetSystemDate(d, m, y)
StrToInt(mid$(Fields[0].AsString, 2, 2)) < d ? newid=0 : newid=StrToInt(mid$(Fields[0].AsString, 4, 3))+1;
query.SQL.Text := Format('insert into MyTable(id, data) values(%d, %чтонадо)', [newid, нужности]);
query.ExecSQL;

Какое-то управление транзакциями здесь предполагается?
3 сен 13, 12:36    [14788798]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
softmaker
Не пойму что тут интересного, ну ладно, в псевдокоде:

select max(id) (пусть будет 1309054)
GetSystemDate(d, m, y)
StrToInt(mid$(Fields[0].AsString, 2, 2)) < d ? newid=0 : newid=StrToInt(mid$(Fields[0].AsString, 4, 3))+1;
query.SQL.Text := Format('insert into MyTable(id, data) values(%d, %чтонадо)', [newid, нужности]);
query.ExecSQL;
Вполне ожидаемый говнокод. Рекомендую поразмышлять как все это будет работать в многопользовательском окружении.
Хотя, что-то мне подсказывает, что все размышления закончатся на "а обернем-ка мы все это хозяйство в транзакцию"...
3 сен 13, 12:41    [14788829]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
softmaker
Member

Откуда: оттуда
Сообщений: 1088
invm
softmaker
Не пойму что тут интересного, ну ладно, в псевдокоде:

select max(id) (пусть будет 1309054)
GetSystemDate(d, m, y)
StrToInt(mid$(Fields[0].AsString, 2, 2)) < d ? newid=0 : newid=StrToInt(mid$(Fields[0].AsString, 4, 3))+1;
query.SQL.Text := Format('insert into MyTable(id, data) values(%d, %чтонадо)', [newid, нужности]);
query.ExecSQL;
Вполне ожидаемый говнокод. Рекомендую поразмышлять как все это будет работать в многопользовательском окружении.
Хотя, что-то мне подсказывает, что все размышления закончатся на "а обернем-ка мы все это хозяйство в транзакцию"...


Рекомендую внимательнее читать ТЗ. Покажите мне про "многопользователей" у ТС в первом посте. Транзакция само-собой разумеющееся. А вы, неуважаемый, мало того что глуп, ещё и хам.
3 сен 13, 12:54    [14788931]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
любые фиговины такого рода - должны быть в БД ,вообще можно и вычисляему колонку прилепить и не заморачиваться
3 сен 13, 13:27    [14789120]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Maxx
любые фиговины такого рода - должны быть в БД ,вообще можно и вычисляему колонку прилепить и не заморачиваться
Она будет неправильно выдавать номер после удаления какой-нибудь записи.
Должно именно храниться. IMHO
3 сен 13, 13:29    [14789140]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
Должно именно храниться. IMHO

Тут без сомнений, я предложил вариант простой реализации
Просто тогда сразу вопросы:
Для чего конкретно нужна данная нумерации вообще ?
Нужно ли заморачиваться с "дырками в ней" ?
А если ето самописный генератор ключей - так решение 50 раз обсуждалось уже вроде
3 сен 13, 13:37    [14789195]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Гость333
Member

Откуда:
Сообщений: 3683
softmaker
Рекомендую внимательнее читать ТЗ. Покажите мне про "многопользователей" у ТС в первом посте.

Тут форум по SQL Server, который по умолчанию предполагает работу в многопользовательском режиме. Для этого он и проектировался, и это всегда надо иметь в виду при написании кода.
Предполагать работу в однопользовательском режиме — это всё равно, что предполагать наличие ровно одной строки в таблице inserted в триггере (очень частая "фишка" у начинающих посетителей этого форума).
Решения, опирающиеся на предположения подобного рода, безграмотны.
3 сен 13, 13:45    [14789246]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Alibek B.
Member

Откуда:
Сообщений: 3955
Завести таблицу "Номера" с полями "Номер" и "Статус".
По регламенту (вручную или по расписанию) инициализировать ее, создавая набор номеров за нужный период и назначая статус "Новый". При использовании менять статус на "Использован".
3 сен 13, 14:13    [14789408]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
softmaker
Рекомендую внимательнее читать ТЗ. Покажите мне про "многопользователей" у ТС в первом посте.
В ТЗ разве указано наличие монопольного режима? Нет. Значит предполагается многопользовательское окружение.
В любом случае, даже если имеет место однопользовательский доступ, нужно писать как для многопользовательского. Ибо когда настанет пора работать в многопользовательском, вашу систему придется полностью переписывать.
softmaker
Транзакция само-собой разумеющееся.
Думать желания нет. Правильно - не барское это дело.
Даже завернув ваш код в транзакцию вы не исключите получения одинаковых значений на разных клиентах.
softmaker
А вы, неуважаемый, мало того что глуп, ещё и хам.
Типичный ответ. Когда аргументов и знаний нет - переход на личность.

Имхо, учитывая ваши ответы тут и в https://www.sql.ru/forum/1044372/voznikaut-li-izbytochnye-blokirovki-pri-chtenii, а также необоснованное хамство, вы весьма смахиваете на банального безграмотного девелопера с завышенным ЧСВ, коих сейчас как грязи.
3 сен 13, 14:30    [14789519]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Diminator,

А вам:
+ Пример
use tempdb;
go

create table dbo.StorageOfSequences
(
 s_Year smallint,
 s_Month tinyint,
 s_Value int,
 primary key (s_Year, s_Month)
);
go

create procedure dbo.uspSEQ_GetValue
 @Value int output,
 @Amount int = 1
as
begin
 set nocount on;

 declare @t table (Value int);

 with s as
 (
  select year(getdate()) as s_Year, month(getdate()) as s_Month
 )
 merge into dbo.StorageOfSequences t
 using s on s.s_Year = t.s_Year and s.s_Month = t.s_Month
 when not matched then
  insert (s_Year, s_Month, s_Value) values (s.s_Year, s.s_Month, @Amount)
 when matched then
  update
   set
    s_Value += @Amount
 output
  inserted.s_Value into @t;
 
 select @Value = Value from @t;

 return 0;
end;
go

create table dbo.TestTable
(
 i int identity not null primary key,
 Num varchar(30) not null
);
go

create trigger trTestTable_InsteadOfInsert
on dbo.TestTable
instead of insert
as
begin
 set nocount on;

 declare @r int, @v int;

 select @r = count(*) from inserted;
 if @r = 0
  return;

 exec dbo.uspSEQ_GetValue @v output, @r;

 insert into dbo.TestTable
  (Num)
  select
   cast(year(getdate()) as varchar(4)) + right('00' + cast(month(getdate()) as varchar(10)), 2) + right('000000000' + cast(@v - @r + row_number() over (order by i.i) as varchar(10)), 9)
  from
   inserted i;
end;
go

insert into dbo.TestTable
 (Num)
values
 (null), (null), (null);

select * from dbo.TestTable;
go

drop procedure dbo.uspSEQ_GetValue;
drop table dbo.StorageOfSequences, dbo.TestTable;
go
3 сен 13, 15:16    [14789804]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Diminator
Member

Откуда:
Сообщений: 42
invm,

Круто! Словно мысль прочли. Интуитивно я догадывался что нумерацию на уровне клиента делать нельзя особенно в многопользовательском режиме.

Профессионально и прямо в точку.

Спасибо!
4 сен 13, 01:35    [14792077]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Как-то так, например...
4 сен 13, 01:51    [14792090]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация с логикой  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
"при наступлении нового месяца"

на сервере или на клиенте? - ответ на этот вопрос и есть решение
4 сен 13, 09:07    [14792428]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить