PDA

View Full Version : راهنمایی در مورد یک پروسیجر تودر تو



moferferi
دوشنبه 07 اسفند 1391, 14:50 عصر
سلام.
به طور مثال
دوتا جدول داریم که یکیش شامل
perseonid-personname-personfily
هست-
و یه جدول هم دارم که شامل فیلدهای
morkhasiId-Person_FK-tarikhmorkhasi-tedadroozmorkhasi
که جدول اولی اطلاعات افراد را نگه میداره و جدول دوم مرخصی های ثبت شده را برای هر کاربر نگه داری میکنه

خوب من یه پروسیجر نوشتم که یه مقدار Person_FK میگیره و تعداد مرخصیهایی که شخص رفته را محاسبه میکنه و یه عدد برمیگردونه.
حالا میخوام یه پروسیجری دیگه بنویسم که لیست کاربران را به اضافه مقدار مرخصی هاشون را نشون بده.(توی یه ستون مجازی)
در اصل میخوام به خروجی دستور زیر یه ستون دیگه اضافه بشه و مقدار پروسیجر را با ورودی person_id داخلش بریزم
select person_name,family,person_id from person

خروجی پروسیجر را هم اضافه کنم

با تشکر

mohsen.net
دوشنبه 07 اسفند 1391, 15:32 عصر
به جای اینکه بخوای دو تا Sp بسازی و تو یکی از اون یکی استفاده کنی (هر چند که نمی تونی این کار را هم بکنی)
SP را با Join کردن دو تا جدول بساز

محمد سلیم آبادی
سه شنبه 08 اسفند 1391, 16:05 عصر
برای گرفتن جواب دقیق لطفا چند نمونه داده (سطر و ستون) در قالب جدول ارسال کرده و خروجی مورد نظر را شرح بر اساس داده های نمونه شرح دهید.
به این مطلب جهت تولید script مراجعه کنید:
http://barnamenevis.org/showthread.php?176229-%DA%86%DA%AF%D9%88%D9%86%D9%87-%DA%A9%D8%AF-%D9%88-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%D8%AE%D9%88%D8%AF-%D8%B1%D8%A7-%D9%BE%D8%B3%D8%AA-%DA%A9%D9%86%DB%8C%D9%85-%D8%AA%D8%A7-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D8%AC%D9%88%D8%A7%D8%A8-%D8%B1%D8%A7-%D8%A8%DA%AF%DB%8C%D8%B1%DB%8C%D9%85

moferferi
چهارشنبه 09 اسفند 1391, 07:45 صبح
سلام.ممنون از راهنمایی تون
خوب دقیقا میگم که میخوام چی کار کنم.
ببنید من یه جدولی دارم که توش اطلاعات پرسنل (مانند نام،فامیل و ...)را نگه داری میکنم (اسم جدول person)
یه جدولی هم دارم که داخلش اطلاعاتی مرخصی های پرسنل(ازجمله مرخصی های ساعتی،استحقاقی،استعلاجی)ر داخلش ذخیره میکنم(اسم جدول morkhasi)
خوب حالا من یه پروسیجر دارم که مقدار id یک پرسنل را میگیره و یه سری محاسبه انجام میده(از قبیل جمع کل مرخصی های ساعتی،استحقاقی ،روزانه،مانده کل)
که یه همچین خروجی داره
100611
در ضمن توی جدول مرخصی ها ای دی پرسنل به عنوان کلید فرعی هست.
خوب حالا من میخوام به این گزارش ساده که لیست کل پرسنل را داره نشون میده
100612
حالا میخوام موقعی که این سلکت زده میشه به ازای هر سطر ،پرسنل ای دی را به عنوان ورودی پروسیجر پاس بدم و خروجی پروسیجر را که 12 تا فیلد هست به این 4 تا فیلد اضافه کنم.

و لیست کل پرسنل را با اطلاعات مرخصی هاشون توی یه گزارش داشته باشم
امیدوارم تونسته باشم منظورم را درست بیان کرده باشم
اگر هم نیازه بگین تا مشخصات دوتا جذول را هم بزارم
با تشکر

محمد سلیم آبادی
چهارشنبه 09 اسفند 1391, 09:08 صبح
بجای پروسیجر یک table valued function (تابعی که جدول بر میگرداند) ایجاد کنید. و توسط همچین query به نتیجه دلخواه برسید:
select person_id, person_code, person_name, family,
d.*
from person
cross apply function_name(person_id) as d;

moferferi
چهارشنبه 09 اسفند 1391, 12:39 عصر
برای ایجاد table valued function کار خاصی باید کرد؟
من همون توی قسمت table valued function یه فانکشن ایجاد کردم و همون پروسیجر را کپی کردم.ولی خطا میده(خط 2 به کلمه as).باید تغییر خاصی توی sp بدم؟شرمنده ولی تا با فانشکن ها زیاد بلد نیستم کار کنم
این پروسیجر من.اگه میشه بگین چه طوری به یه فانکشن تغییرش بدم
create procedure dbo.[GetReportAdmin](@pid int,@year nchar(10))
as
DECLARE @totalrooz int,@totalsaat int,@valrooz int,@valssat int,@manderoozghabl int,@mandesaatghabl int,@estelaji int,@personname nvarchar(50),@personfamily nvarchar(50),@personcode nvarchar(50);



SET @personcode=(select person_code from person where person_id=24 ) ;
SET @personname=(select person_name from person where person_id=24 ) ;
SET @personfamily=(select family from person where person_id=24 ) ;

SET @estelaji =(select SUM(Counter_roz)as estelaji from Vacations where PersonelId_FK=@pid and VocationType_FK=4 and [mod]=0 and DTy=@year);
if(@estelaji is null) set @estelaji=0
SET @totalrooz =(select SUM(Counter_roz)as totalrooz from Vacations where PersonelId_FK=@pid and [mod]=1 and DTy=@year);
if(@totalrooz is null) set @totalrooz=0
set @totalsaat=(select SUM(Counter_saat)as totalsaat from Vacations where PersonelId_FK=@pid and [mod]=1 and DTy=@year);
if(@totalsaat is null) set @totalsaat=0
set @valrooz=(select SUM(Counter_roz)as valrooz from Vacations where PersonelId_FK=@pid and [mod]=-1 and DTy=@year);
if(@valrooz is null) set @valrooz=0
set @valssat=(select SUM(Counter_saat)as valssat from Vacations where PersonelId_FK=@pid and [mod]=-1 and DTy=@year);
if(@valssat is null) set @valssat=0
set @manderoozghabl=(select SUM(Counter_roz)as manderoozghabl from Vacations where PersonelId_FK=@pid and [mod]=2 and DTy=@year);
if(@manderoozghabl is null) set @manderoozghabl=0
set @mandesaatghabl=(select SUM(Counter_saat)as mandesaatghabl from Vacations where PersonelId_FK=@pid and [mod]=2 and DTy=@year);
if(@mandesaatghabl is null) set @mandesaatghabl=0
SET NOCOUNT OFF;
--SELECT @totalrooz as addrooz,@totalsaat as addsaat,@valrooz as getday,@valssat as getsaat,@manderoozghabl as manderoozghabl,@mandesaatghabl as mandesaatghabl,@estelaji as estelaji
declare @mande_kole_rooz int,@mande_kole_saat int,@tt int;
set @mande_kole_rooz=@manderoozghabl+@totalrooz
set @mande_kole_saat=@mandesaatghabl+@totalsaat
if(@valssat>@mande_kole_saat)
begin

set @mande_kole_rooz=@mande_kole_rooz-@valrooz

if(@valssat%8=0)
begin
set @mande_kole_rooz=@mande_kole_rooz-(@valssat/8)
set @mande_kole_saat=@mande_kole_saat-(@valssat%8)
set @tt=1
end
else if((@mande_kole_saat+8)-@valssat < 8 and (@mande_kole_saat+8)-@valssat >=0 )
begin
set @mande_kole_rooz=@mande_kole_rooz-1
set @mande_kole_saat=@mande_kole_saat+8-@valssat
set @tt=2
end
else if((@mande_kole_saat+8)-@valssat < 0 )
begin
set @mande_kole_rooz=@mande_kole_rooz-(@valssat/8)-1
set @mande_kole_saat=8-(@valssat%8)
set @tt=33
end
end

else if(@valssat<@mande_kole_saat)
begin

set @mande_kole_rooz=@manderoozghabl+@totalrooz
set @mande_kole_saat=@mandesaatghabl+@totalsaat
set @mande_kole_rooz= @mande_kole_rooz-@valrooz
set @mande_kole_saat= @mande_kole_saat-@valssat
set @tt=3
end
else if(@valssat=@mande_kole_saat)
begin

set @mande_kole_rooz=@manderoozghabl+@totalrooz
set @mande_kole_saat=@mandesaatghabl+@totalsaat
set @mande_kole_rooz= @mande_kole_rooz-@valrooz
set @mande_kole_saat= @mande_kole_saat-@valssat
set @tt=4

end
-- payane mohasebe meghdare kol

--select @mande_kole_rooz as mande_kole_rooz,@mande_kole_saat as mande_kole_saat,@tt
declare @enteghali_rooz int,@enteghali_saat int,@temp int;
--mohasebe enteghali
if(@mande_kole_rooz<15)
begin
set @enteghali_rooz=@mande_kole_rooz
set @enteghali_saat=@mande_kole_saat
set @temp=1
end
else if(@mande_kole_rooz = 15)
begin
set @enteghali_rooz=@mande_kole_rooz
set @enteghali_saat=0
set @temp=2
end
else if(@mande_kole_rooz > 15 and @valrooz > @totalrooz)
begin
set @enteghali_rooz=@mande_kole_rooz
set @enteghali_saat=@mande_kole_saat
set @temp=3
end
--zzzz
else if(@mande_kole_rooz > 15 and @valrooz < @totalrooz and @valrooz<15)
begin
--set @enteghali_rooz=(@manderoozghabl+@totalrooz)-15
if(@valssat=8)
begin
set @enteghali_rooz=(@manderoozghabl+@totalrooz)-15
set @enteghali_saat=0
set @temp=333
end
else if(@valssat<8)
begin
set @enteghali_rooz=(@manderoozghabl+@totalrooz)-15
set @enteghali_saat=0
set @temp=444
end
else if(@valssat>8 and @valssat%8 =0 )
begin
set @enteghali_rooz=(@manderoozghabl+@totalrooz)-@valrooz-(@valssat/8)
set @enteghali_saat=@mande_kole_saat
set @temp=445
end
else if(@valssat>8 and @valssat%8 >0 )
begin
set @enteghali_rooz=(@manderoozghabl+@totalrooz)-@valrooz-(@valssat/8)-1
set @enteghali_saat=8-(@valssat%8)
set @temp=446
end
end
else if(@mande_kole_rooz > 15 and @valrooz < @totalrooz and @valrooz=15)
begin
set @enteghali_rooz=@mande_kole_rooz-(15-@valrooz)
set @enteghali_saat=@mande_kole_saat
set @temp=5
end
else if(@mande_kole_rooz > 15 and @valrooz < @totalrooz and @valrooz>15)
begin
set @enteghali_rooz=@mande_kole_rooz
set @enteghali_saat=@mande_kole_saat
set @temp=6
end
select @enteghali_rooz as enteghalerooz,@enteghali_saat as enteghalesaat,@temp as test,@totalrooz as addrooz,@totalsaat as addsaat,@valrooz as getday,@valssat as getsaat,@manderoozghabl as manderoozghabl,@mandesaatghabl as mandesaatghabl,@estelaji as estelaji,@mande_kole_rooz as mandekolerooz,@mande_kole_saat as mande_kole_saat,@personname as pname,@personfamily as pfamily,@personcode as pcode
البته ببخشین کدهام یکم در بر همه.

محمد سلیم آبادی
چهارشنبه 09 اسفند 1391, 14:07 عصر
برای مثال میتونید به کدی که در این صفحه وجود داره مراجعه کنید:
http://msdn.microsoft.com/en-us/library/ms191165%28v=sql.105%29.aspx

اینجا هم یک مقاله راجب موضوع هست:
http://www.codeproject.com/Articles/167399/Using-Table-Valued-Functions-in-SQL-Server

امیدوارم با کمک این دو لینک مشکلتون حل بشه.