الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف يمكننى الحصول على إجمالى عدد الأيام المطلوبة من الموظف حسب عدد أيام اى شهر ؟

بدأه red_scorpion1 في 2 أكتوبر 2013 · 8 رد · 1,019 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

 

لدى قاعدة بيانات sql وبها جدول الموظفين وهو يشتمل على الكود - الاسم - السبت - الاحد - الاثنين - الثلاثاء - الاربعاء - الخميس ( مرفق صورة )

 

فكيف استطيع ان اعرف عدد الأيام المطلوب من الموظف حضورها خلال الشهر بناء على عدد أيام الشهر ( وذلك لجعل تلك القيمة بعد الحصول عليها كتارجت شهرى )

 

حيث ان المشكلة تكمن فى انه هناك موظفين يعملون ( يومين بالاسبوع فقط ) واخرين يعملون ( 3 ايام ) و اخرين يعملون ( 6 ايام )

 

انا استطيع ان احصل على اجمالى عدد الايام المطلوبة من الموظف خلال الاسبوع ولكن كيف اعرفها خلال الشهر لأنه هناك أشهر 30 يوم وأشهر 31 يوم وهكذا ؟؟؟

 

Untitled.jpg

تم تعديل هذه المشاركة بواسطة red_scorpion1 في 2 أكتوبر 2013 في 20:32

#2

السلام عليكم ورحمة الله وبركاته

ستقوم بإنشاء إجراء مخزن SP أو وظيفة User Function تقوم بعملية الحساب بحيث ينشئ حلقة تكرارية على أيام الشهر المراد معرفة تفاصيله وفى كل حلقة تكرارية يستخرج اسم اليوم فإذا كان أحد الأيام التى يذهب فيها الموظف يضيف واحد على متغير رقمى ثم يزيد التارخ وهكذا حتى ينتهى

فأتوقع أن يكون الإجراء يستقبل عدداً من الباراميترز تعبر عن الأيام الستة وكذلك باراميتز لرقم الشهر

لاستخراج اسم اليوم من التاريخ استخدم الوظيفة DateName

 

أرجو أن يفيد هذا

أدعو الله أن يجعل أعمالنا خالصة لوجهه الكريم --- وأن ينفعنا بما علمنا

Dr Sayed Tohamy

Programming Instructor

مدرب برمجة

---------------

EmaSoft2000

-------------------

#3

رغم ان هذا الجدول لا يعجبني اسلوبة ولكن الحل بسيط عمل جدول به السنة والشهر وكود عام ثم وضع الكود هذا الجدول في كحقل في الجدول الخاص بك مع مراعات بداية كل شهر في صف جديد في الجدول الخاص مثل النتيجة

#4

حسنا.. ذلك لم يكن سهلا

 

انا مع راي KARIMSOFT من حيث تركيبة الجدول. لقد تلقيت نصيحة من خبراء ال SQL في الماضي وهي normalize your data and don't make it look like excel sheet

 

جرب ما يلي :

 

1- اخلق Scalar Valued Function

CREATE FUNCTION [dbo].[Count_WDN_InMonth]
(
	-- Add the parameters for the function here
	@qp_year int, @qp_month int, @qp_dayname nchar(9)
)
RETURNS int 
AS
BEGIN
	declare @result int
	-- Declare the return variable here
	--DECLARE @Year AS INT, 
        --@Month INT,
        Declare @FirstDateOfYear DATETIME, 
        @LastDateOfYear DATETIME


	-- Add the T-SQL statements to compute the return value here

--SELECT @year = @qp_year, @Month=@qp_month
SELECT @FirstDateOfYear = DATEADD(yyyy, @qp_year - 1900, 0)
SELECT @LastDateOfYear = DATEADD(yyyy, @qp_year - 1900 + 1, 0)

;with cte as(
	SELECT 1								AS DayID,
		   @FirstDateOfYear					AS FromDate,
		   DATENAME(dw, @FirstDateOfYear)	AS Dayname
	UNION ALL
	SELECT	cte.DayID + 1 AS DayID,
			DATEADD(d, 1 ,cte.FromDate),
			DATENAME(dw, DATEADD(d, 1 ,cte.FromDate)) AS Dayname
	FROM	cte
	WHERE	DATEADD(d,1,cte.FromDate) < @LastDateOfYear
)
select @result = COUNT(*)
FROM CTE
WHERE DayName LIKE rtrim(@qp_dayname)
AND Month(FromDate) = @qp_month
GROUP BY DATENAME(month,FromDate)
option (MaxRecursion 370)

return @result

END

GO

2- نفذ هذا الاستعلام

declare @my_year int
SET @my_year = 2013
DECLARE @my_month int
SET @my_month = 10


SELECT id,SUM(day_count) as work_day_count FROM (
SELECT id,'Saturday'  as day_name ,sat as work_,@my_year as year_,@my_month as month_ , dbo.Count_WDN_InMonth (@my_year,@my_month,'Saturday')  as day_count from att_week UNION ALL 
SELECT id,'Sunday'    as day_name ,sun as work_,@my_year as year_,@my_month as month_ , dbo.Count_WDN_InMonth (@my_year,@my_month,'Sunday')    as day_count from att_week UNION ALL
SELECT id,'Monday'    as day_name ,mon as work_,@my_year as year_,@my_month as month_ , dbo.Count_WDN_InMonth (@my_year,@my_month,'Monday')    as day_count from att_week UNION ALL
SELECT id,'Tuesday'   as day_name ,tue as work_,@my_year as year_,@my_month as month_ , dbo.Count_WDN_InMonth (@my_year,@my_month,'Tuesday')   as day_count from att_week UNION ALL
SELECT id,'Wednesday' as day_name ,wed as work_,@my_year as year_,@my_month as month_ , dbo.Count_WDN_InMonth (@my_year,@my_month,'Wednesday') as day_count from att_week UNION ALL
SELECT id,'Thursday'  as day_name ,thu as work_,@my_year as year_,@my_month as month_ , dbo.Count_WDN_InMonth (@my_year,@my_month,'Thursday') as day_count from att_week) tbl1
WHERE tbl1.work_ = 1 GROUP BY tbl1.id

rename the table ATT_WEEK to your table name

 

هذه نتيجة الاستعلام

id  work_day_count    
1	  13
2	  27
3	  27
4	  27
5	  9
6	  13
7	  22
9	  13
10	27
11	27
12	27

تم تعديل هذه المشاركة بواسطة samir ibrahim في 9 أكتوبر 2013 في 12:16

Samir Ibrahim

VFP Blog

VB.NET Blog

#5

شكرا لاخي samir ibrahim وشكر خاص للخبير الذي قال ذلك القول ممكن استعيره في توقيعي رغم اني لم اخبر الكود ولكن استفت منه شكرا لك

#6
KARIMSOFT كتب:

وشكر خاص للخبير الذي قال ذلك القول ممكن استعيره في توقيعي

 

فعلا, هناك نصائح قليلة جدا انا اطبقها واصبحت جزءا من طريقتي في العمل وهذه واحدة منها.

Samir Ibrahim

VFP Blog

VB.NET Blog

#7

طيب ماهو الاسلوب الافضل حتى لاتصبح القاعده نفس اكسل؟

حيث انه الاسلوب الوحيد هو هذ بالنسبه الي؟ ممكن توضيح بمثال يااساتذتي الكرام وجزاكم الله خيرا

#8

انارمبتدء ممكن تجاوبوني لو سمحتم

#9

عليك بقرائة كتب في قواعد البيانات قد يفيد هذا

/index.php/topic/282345-%D8%A8%D8%AF%D8%A7%D9%8A%D8%AA%D9%89-%D9%85%D8%B9-sql/

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…