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

Есть код, для обновления объекта. У каждого объекта есть поле rcv - счетчик сохранения. При выполнении апдейта, счетчик увеличивается на 1. Т.о. мы избегаем одновременное обновления объекта разными пользователями.
Но код:
if (
	       @rcv is not null
	       and not exists(
	               select *
	               from   meta.st_obj_form_selector sofs
	               where  sofs.id_obj_form_selector = @p_id_obj_form_selector
	                      and rcv = @rcv
	           )
	   )
	   or ( @rcv is null )
	begin
	    raiserror(@err10 ,16 ,1);
	    return 10;
	end

Приходится вставлять практически в каждой процедуре.

1. Можно ли это автоматизировать?
2. Что еще в данном коде режет глаз или можно оптимизировать?

if object_id('meta.pf_obj_updformselectorvalue') is not null
	drop procedure meta.pf_obj_updformselectorvalue
go
create procedure meta.pf_obj_updformselectorvalue
	@p_id_obj_form_selector int,
	@p_rcv int,
	@p_order_no int,
	@p_ty_executor varchar(128),
	@p_id_form varchar(128),
	@p_table_name varchar(128),
	@p_f1 varchar(128),
	@p_v1 varchar(128),
	@p_f2 varchar(128) = null,
	@p_v2 varchar(128) = null,
	@p_f3 varchar(128) = null,
	@p_v3 varchar(128) = null,
	@p_f4 varchar(128) = null,
	@p_v4 varchar(128) = null,
	@p_f5 varchar(128) = null,
	@p_v5 varchar(128) = null
as
begin
	set nocount on
	
	declare 
		@msgarea varchar(50) = '[MO][pf_obj_updformselectorvalue]Не удалось обновить условие селектора форм.',
		@rcv int
	declare
		@err10 varchar(1000) = @msgarea + ' Запись была удалена либо модифицирована.',
		@err20 varchar(1000) = @msgarea + ' Ошибка обновления записи.',
		@err30 varchar(1000) = @msgarea + ' Тип условия "%s" не опознан.',
		@err40 varchar(1000) = @msgarea + ' Форма "%s" не зарегистрирована.'
	
	if @p_rcv is null 
		set @rcv = (select rcv from meta.st_obj_form_selector sofs where sofs.id_obj_form_selector = @p_id_obj_form_selector)
	else
		set @rcv = @p_rcv
		
	if (
	       @rcv is not null
	       and not exists(
	               select *
	               from   meta.st_obj_form_selector sofs
	               where  sofs.id_obj_form_selector = @p_id_obj_form_selector
	                      and rcv = @rcv
	           )
	   )
	   or ( @rcv is null )
	begin
	    raiserror(@err10 ,16 ,1);
	    return 10;
	end
	
	if meta.ff_obj_existsenumvalue('zsys.enum.obj.formselector.ty_executor', @p_ty_executor) = 0
	begin		
		raiserror(@err30, 16, 1, @p_ty_executor);
		return 30;
	end
	
	if meta.ff_obj_existsform(@p_id_form) = 'N'
	begin
		raiserror(@err40, 16, 1, @p_id_form)
		return 40;
	end;
			
	begin try
		update meta.st_obj_form_selector
		set order_no = @p_order_no,
			ty_executor = @p_ty_executor,
			id_form = @p_id_form,
			table_name = @p_table_name,
			f1 = @p_f1,
			f2 = @p_f2,
			f3 = @p_f3,
			f4 = @p_f4,
			f5 = @p_f5,
			v1 = @p_v1,
			v2 = @p_v2,
			v3 = @p_v3,
			v4 = @p_v4,
			v5 = @p_v5,
			au_upd_by = common.ff_currentlogin(),
			au_upd_date = common.ff_getdate(),
			rcv = isnull(rcv, 0) + 1
		where 
			id_obj_form_selector = @p_id_obj_form_selector
			and rcv = @rcv
			
	END TRY
	begin catch
		raiserror (@err20, 16, 1)
		return 10;
	END catch
end;
go
	
	
10 май 12, 14:20    [12530104]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте код  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
На вскидку
coderequest
if @p_rcv is null 
		set @rcv = (select rcv from meta.st_obj_form_selector sofs where sofs.id_obj_form_selector = @p_id_obj_form_selector)
	else
		set @rcv = @p_rcv

set @rcv = Coalesce( (select rcv from meta.st_obj_form_selector sofs where sofs.id_obj_form_selector = @p_id_obj_form_selector),@p_rcv)

автор
Но код:
 if (
	       @rcv is not null
	       and not exists(
	               select *
	               from   meta.st_obj_form_selector sofs
	               where  sofs.id_obj_form_selector = @p_id_obj_form_selector
	                      and rcv = @rcv
	           )
	   )
	   or ( @rcv is null )
Приходится вставлять практически в каждой процедуре.

может как функцию оформить?С глаз долой..
10 май 12, 14:55    [12530468]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить