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

Откуда:
Сообщений: 356
Здравствуйте
ситуация: идёт расчёт ЗП, две базы, в одной расчёт идёт правильно, в другой пытаюсь дописать так что бы было правильно, но выдаёт ошибку
Вопрос что эта ошибка означает и как её исправить?

вот код
USE [ELPROM]
--GO
--/****** Object:  StoredProcedure [dbo].[Lex_z_raschet_tabel]    Script Date: 04/16/2014 10:04:09 ******/
--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO
--
--
--CREATE     procedure [dbo].[Lex_z_raschet_tabel] @pcode int AS
--begin
declare @pcode int
select @pcode=42610
declare @vcode int, @i int, @matcode int, @ChDay int
declare @bdate datetime,@NEY int
declare @sum_15 float, @sum float, @sum_adm float, @sum_bol float, @sum_gos float, @sum_kom float, @sum_prog float, @sum_otg float
declare @sum_noch float, @sum_otp float, @sum_rod float, @sum_sur float, @sum_sur2 float, @sum_uch float, @sum_vech float
declare @sum_praz float, @sum_vyh float, @smen float, @sum_leg float, @sum_donor float,  @sum_kvalif float
declare @field varchar(50), @sql varchar(255), @value varchar(20), @result float
declare @RDATE1 datetime

select @bdate = datename(year,rdate) + datename(month,rdate)+'01' from LexTabel_Pdoc where vcode = @pcode

create table #v (value varchar(20) null)
insert #v select null

select @pcode = @pcode


declare pm cursor for 
	select m.vcode, m.matcode, convert(int,g.ChDay) 
	from LexTabel_Pdoc p inner join LexTabel_PdocMat m on p.VCode = m.PCode,  
                    LexZ_graphic g, LexKadry K
	where m.pcode = @pcode and m.matcode = K.VCode
 		and p.date1 = g.godmes
	    	and IsNull(K.graphic,1) = g.Nomer
open pm
fetch next from pm into @vcode, @matcode, @ChDay ,@RDATE1
while @@fetch_status = 0
begin
	select @sum_15 = 0, @sum = 0, @sum_adm = 0, @sum_bol = 0, @sum_gos = 0, @sum_kom = 0, @sum_prog = 0, 
	          @sum_otg = 0, @sum_noch = 0, @sum_otp = 0, @sum_rod = 0, @sum_sur = 0, @sum_sur2 = 0, @sum_uch = 0, 
	          @sum_vech = 0, @sum_praz = 0, @sum_vyh = 0, @sum_leg = 0, @smen = 0, @sum_donor = 0, @sum_kvalif = 0
, @NEY=0
         	select @i = 1
	while @i <= 31
	begin
		select @field = 'd' + rtrim(convert(varchar(2),@i))
		select @sql = 'update #v set value='+@field+' from LexTabel_pdocmat where vcode='+str(@vcode)
		execute (@sql)
		select @value = value from #v
		select @result = 0
-- Расчет дней
		if ltrim(rtrim(@value))='Б' select @sum_bol=@sum_bol+1   --больничные
		if ltrim(rtrim(@value))='О' select @sum_otp=@sum_otp+1   --отпуск
		if ltrim(rtrim(@value))='А' select @sum_adm=@sum_adm+1   --административный отпуск
		if ltrim(rtrim(@value))='К' select @sum_kom=@sum_kom+1   --командировки
		if ltrim(rtrim(@value))='Р' select @sum_rod=@sum_rod+1   --родовой отпуск
		if ltrim(rtrim(@value))='У' select @sum_uch=@sum_uch+1   --учен отпуск
		if ltrim(rtrim(@value))='Л' select @sum_prog=@sum_prog+1   --прогул
		if ltrim(rtrim(@value))='Н' select @sum_leg=@sum_leg+1   --неявки по невыясн причинам
		if ltrim(rtrim(@value))='И' select @sum_praz=@sum_praz+1   --льготные дни родителей
		if ltrim(rtrim(@value))='Г' select @sum_gos=@sum_gos+1   --гос
		if ltrim(rtrim(@value))='Д' select @sum_donor=@sum_donor+1   --донор
		if ltrim(rtrim(@value))='Ф' select @sum_kvalif=@sum_kvalif+1   --квалиф
		if ltrim(rtrim(@value))  in ('НС') select @NEY=@NEY+1   --неявки по НС

/*		execute LexIs_alpha 'Б', @value, @result output
		select @sum_bol=@sum_bol+@result

		execute LexIs_alpha 'О', @value, @result output
		select @sum_otp=@sum_otp+@result

		execute LexIs_alpha 'А', @value, @result output
		select @sum_adm=@sum_adm+@result

		execute LexIs_alpha 'К', @value, @result output
		select @sum_kom=@sum_kom+@result

		execute LexIs_alpha 'Р', @value, @result output
		select @sum_rod=@sum_rod+@result

		execute LexIs_alpha 'У', @value, @result output
		select @sum_uch=@sum_uch+@result

*/
-- Расчет часов
--		execute LexIs_alpha 'К', @value, @result output
--		select @sum_kom=@sum_kom+@result

		execute LexIs_alpha 'В', @value, @result output
		select @sum_vyh=@sum_vyh+@result

		execute LexIs_alpha 'П', @value, @result output
		select @sum_praz=@sum_praz+@result

--		execute LexIs_alpha 'Г', @value, @result output
--		select @sum_gos=@sum_gos+@result
	
--		execute LexIs_alpha 'М', @value, @result output --прогулы
--		select @sum_prog=@sum_prog+@result 

--              execute LexIs_alpha 'Л', @value, @result output  --легкий труд
--              select @sum_leg=@sum_leg+@result
               	
		execute LexIs_alpha 'М', @value, @result output
		select @sum_otg=@sum_otg+@result  --простои целосменные
		
		execute LexIs_alpha 'Ч', @value, @result output
		select @sum_noch=@sum_noch+@result   --ночные
		
	 	execute LexIs_alpha 'С', @value, @result output --сверхурочные
	             select @sum_sur=@sum_sur+@result
		
		execute LexIs_alpha 'Т', @value, @result output
		select @sum_sur2=@sum_sur2+@result
		
--		execute LexIs_alpha 'Ч', @value, @result output
--		select @sum_vech=@sum_vech+@result

		execute LexIs_number @value, @result output
		select @sum = @sum + @result
                          
		select @smen = round((@sum / @ChDay)/isnull(dbo.Zarpl_STAVKA(@RDATE1, @matcode),1), 0) --@smen + @result --

		if @i <= 15
		  select @sum_15 = @sum_15 + @result
			select @result result
		select @i = @i + 1
	end		
select @sum 
select @smen
--	update LexTabel_pdocmat set otr_ch = @sum_15 where vcode = @vcode
--	update LexTabel_pdocmat set otr_chas = @sum where vcode = @vcode
--------------------------------
--	update LexTabel_pdocmat set otr_smen = @smen where vcode = @vcode
--------------------------------
--	update LexTabel_pdocmat set adm = @sum_adm where vcode = @vcode
--	update LexTabel_pdocmat set bol = @sum_bol where vcode = @vcode
--	update LexTabel_pdocmat set gos = @sum_gos where vcode = @vcode
--	update LexTabel_pdocmat set kom= @sum_kom where vcode = @vcode
--	update LexTabel_pdocmat set prog = @sum_prog where vcode = @vcode
--	update LexTabel_pdocmat set otg = @sum_otg where vcode = @vcode
--	update LexTabel_pdocmat set leg = @sum_leg where vcode = @vcode
--	update LexTabel_pdocmat set noch = @sum_noch where vcode = @vcode
--	update LexTabel_pdocmat set otp = @sum_otp where vcode = @vcode
--	update LexTabel_pdocmat set rod = @sum_rod where vcode = @vcode
----	update LexTabel_pdocmat set sur= @sum_sur2 where vcode = @vcode
--	update LexTabel_pdocmat set sur2 = @sum_sur where vcode = @vcode
--	update LexTabel_pdocmat set uch= @sum_uch where vcode = @vcode
----	update LexTabel_pdocmat set vech = @sum_vech where vcode = @vcode
--	update LexTabel_pdocmat set praz= @sum_praz where vcode = @vcode
--	update LexTabel_pdocmat set vyh = @sum_vyh where vcode = @vcode
--	update LexTabel_pdocmat set donor = @sum_donor where vcode = @vcode
--	update LexTabel_pdocmat set kvalif = @sum_kvalif where vcode = @vcode
--	update LexTabel_pdocmat set Neyavki = @NEY where vcode = @vcode
--	fetch next from pm into @vcode, @matcode, @ChDay
end
--close pm
--deallocate pm
--drop table #v
--end
--lexdt #v


Вот тут
fetch next from pm into @vcode, @matcode, @ChDay ,@RDATE1

Выдаёт мне ошибку
Msg 16924, Level 16, State 1, Line 38
Cursorfetch: The number of variables declared in the INTO list must match that of selected columns.


как её исправить, помогите пожалуйста
16 апр 14, 09:09    [15888610]     Ответить | Цитировать Сообщить модератору
 Re: Число переменных, объявленных в В список, должно соответствовать числу отобранных колонок  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31985
R-Magistr
как её исправить, помогите пожалуйста
Вы в курсоре определили 3 поля, и хотите засунуть их в 4 переменных. Как это?

declare pm cursor for 
select m.vcode, m.matcode, convert(int,g.ChDay) 
...
fetch next from pm into @vcode, @matcode, @ChDay ,@RDATE1
16 апр 14, 09:14    [15888629]     Ответить | Цитировать Сообщить модератору
 Re: Число переменных, объявленных в В список, должно соответствовать числу отобранных колонок  [new]
aleks2
Guest
Вот, что она означает:
insert aTable(a, b) values(A)
-- или
insert aTable(a) values(A, B
)
16 апр 14, 09:14    [15888631]     Ответить | Цитировать Сообщить модератору
 Re: Число переменных, объявленных в В список, должно соответствовать числу отобранных колонок  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
R-Magistr,

нашёл ошибку, там в курсоре меньше параметров объявляется, чем используется, но возникла другая проблема, возникает исключение при выполнении этого кода :(
16 апр 14, 09:17    [15888642]     Ответить | Цитировать Сообщить модератору
 Re: Число переменных, объявленных в В список, должно соответствовать числу отобранных колонок  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
aleks2
Вот, что она означает:
insert aTable(a, b) values(A)
-- или
insert aTable(a) values(A, B
)


Где вы у меня такой код нашли?
16 апр 14, 09:18    [15888651]     Ответить | Цитировать Сообщить модератору
 Re: Число переменных, объявленных в В список, должно соответствовать числу отобранных колонок  [new]
aleks2
Guest
R-Magistr
aleks2
Вот, что она означает:
insert aTable(a, b) values(A)
-- или
insert aTable(a) values(A, B
)


Где вы у меня такой код нашли?


Глупенький, а FETCH по твоему, работает силой святаго духа?
16 апр 14, 09:20    [15888658]     Ответить | Цитировать Сообщить модератору
 Re: Число переменных, объявленных в В список, должно соответствовать числу отобранных колонок  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
но возникла другая проблема, возникает исключение при выполнении этого кода :(

И вы прочитали текст сообщения об ошибке ?
16 апр 14, 09:21    [15888668]     Ответить | Цитировать Сообщить модератору
 Re: Число переменных, объявленных в В список, должно соответствовать числу отобранных колонок  [new]
aleks2
Guest
Glory
R-Magistr
но возникла другая проблема, возникает исключение при выполнении этого кода :(

И вы прочитали текст сообщения об ошибке ?

Смысла нет. Такие шедевры
select @field = 'd' + rtrim(convert(varchar(2),@i))
select @sql = 'update #v set value='+@field+' from LexTabel_pdocmat where vcode='+str(@vcode)
execute (@sql)
select @value = value from #v

свидетельствуют о полной профнепригодности.
16 апр 14, 09:26    [15888694]     Ответить | Цитировать Сообщить модератору
 Re: Число переменных, объявленных в В список, должно соответствовать числу отобранных колонок  [new]
Glory
Member

Откуда:
Сообщений: 104751
aleks2
Смысла нет. Такие шедевры

"Рассчет ЗП" он такой ... непредсказуемый :)
16 апр 14, 09:29    [15888707]     Ответить | Цитировать Сообщить модератору
 Re: Число переменных, объявленных в В список, должно соответствовать числу отобранных колонок  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
aleks2
Glory
пропущено...

И вы прочитали текст сообщения об ошибке ?

Смысла нет. Такие шедевры
select @field = 'd' + rtrim(convert(varchar(2),@i))
select @sql = 'update #v set value='+@field+' from LexTabel_pdocmat where vcode='+str(@vcode)
execute (@sql)
select @value = value from #v

свидетельствуют о полной профнепригодности.


Да это не мой код, досталась мне в наследство БД, вот сижу разгребаю и сам маерюсь, а ошибку я нашёл, просто кипишнул зазря ))))) Там не до объявлял переменную, всем спасибо
16 апр 14, 10:09    [15888905]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить