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

ماهي طريقة حساب متوسط الوقت ؟

مغلقمُجابرائج
بدأه tec4serv في 3 فبراير 2013 · 67 رد · 6,397 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#26
أبو أحمد المبرمج كتب:

أخي الكريم

 

حصل لبس

فقد ذكرت مرة أن احتساب وقت الأكشن هو تاريخ التعميد مطروح منه تاريخ الأكشن الذي قبله

ثم ذكرة في مرة أخرى أن الوقت يحسب بوقت الاعتماد مطروح منه وقت تسجيل الطالب

وهما حالتان مختلفتان

لأنه في الحالة الثانية يجب أن نتجاهل كل السجلات التي تكون حالتها "طلب محول"

على اعتبار ما يهمنا تاريخ الاعتماد وتاريخ التسجيل فقط

 

أما في الحالة الأولى فيجب أخذها بعين الاعتبار إذا كنا نريد معرفة الوقت من لحظة وصول الطلب للمعتمد بحيث نكون منصفين ونحمله تأخير المحولين

 

فأيهما الصواب ؟

 

 

السلام عليكم ،، صباح الخير ابو احمد ....

اشكر لك مساعدتك وجزاك الله خير ...

 

سوف اضع مثال لان اتوقع جميع الحلات التي ذكرتها فيها لبس ...

 

مثلاً لدينا الطلب رقم 7777

قام الطالب بإدخال طلب .. له تاريخ ووقت ....

قام الموظف المسؤول عن استقبال الطلبات ( مثلاُ .. خالد ) بإستلام الطلب وتحويلة إلى مشرف الكلية ( مثلاً .. طلال )... له تاريخ ووقت ....

قام مشرف الكلية بتحويله إلى عميد الكلية ( مثلاً .. محمد ) ... له تاريخ ووقت ....

قام عميد الكلية بتعميد الطلب .... له تاريخ ووقت ....

انتهى .................

 

1 - كم الوقت المستغرق من إدخال الطالب للطلب إلى ان استلمه خالد وحولة إلى طلال .

2 - كم الوقت المستغرق من طلال إلى ان قام بتحويلة إلى محمد .

3 - كم الوقت المستغرق من محمد إلى ان قام بتحويلة إلى عميد الكلية .

4 - كم الوقت المستغرق من عميد الكلية إلى ان قام بتعميد الطلب .

 

 

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

 

ياااااااااااااااارب تكون وضحت ،، واذا فيه اي استفسار انا موجود معاك .....

#27

 شكرا لك على التوضيح

إذا ليس المطلوب فقط حالات الاعتماد وإنما حالات التحويل أيضا

لأنه كما أظن أن المطلوب هو حصر التأخير من قبل من ؟  أو بمعنى أدق من هو الذي يهدر الوقت بحيث يتم تحسين الوضع

وأما الطالب فلا يهمنا لأنه لا يوجد ما قبله وإنما نستفيد منه فقط تحديد وقت البداية للأكشن الأول

نعم زال اللبس

 

ولا داعي أن تشغل بالك بفتح الموضوع القديم فلنتابع هنا وأقصد طالما أنك كتبت الطلب لا داعي للاستجداء والإلحاح

فإن أحبوا حققوا الطلب وإن لم يحققوه فلن يعرقل سير الموضوع إن شاء الله

 

ودمت بخير

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 10 فبراير 2013 في 12:07

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#28
أبو أحمد المبرمج كتب:

 شكرا لك على التوضيح

إذا ليس المطلوب فقط حالات الاعتماد وإنما حالات التحويل أيضا

لأنه كما أظن أن المطلوب هو حصر التأخير من قبل من أو يمعنا أدق من هو الذي يهدر الوقت بحيث يتم تحسين الوضع

وأما الطالب فلا يهمنا لأنه لا يوجد ما قبله وإنما نستفيد منه فقط تحديد وقت البداية للأكشن الأول

نعم زال اللبس

 

ولا داعي أن تشغل بالك بفتح الموضوع القديم فلنتابع هنا وأقصد طالما أنك كتبت الطلب لا داعي للاستجداء والإلحاح

فإن أحبوا حققوا الطلب وإن لم يحققوه فلن يعؤقل سير الموضوع إن شاء الله

 

ودمت بخير

 

ماشاء الله عليك ،، بضبط كما ذكرت ... اختصرت ما كنت اود ان اشرحه ... الطالب لا يهمنا إلا بتحديد وقت بداية الاكشن الاول ومقارنتة بتاريخ عمل الاكشن من مسؤول الطلبات وهكذا ..........

 

بيض الله وجهك ،،،

بخصوص الموضوع كنت اود فقط ان احصر جميع الاستفسارات والطلبات في موضوع واحد لكي يستفيد منها غيري مستقبلاً .....

 

بنتظارك وجزاك الله عنا كل خير

#29

أخي هذا السكربت الذي توصلت إلى عمله

 

أرجو تجربته وإخباري هل النتائج صحيحة

 

طبعا بإمكانك تجاهل أسماء الطلاب في الجدول النهائي

لاني لم أشأ أن أدخل في شروط فحص خاصة أني استخدمتهم حتى النهاية لاحتساب الوقت البدائي

 

USE [RequestSystem]
GO

	-- جدول لحفظ أرقام الطلبات فقط
	DECLARE @Tmp1 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[Req_ID] [int] NOT NULL
	)

	INSERT @Tmp1
	( 
		[Req_ID]
	)
	SELECT [Req_ID]
	FROM  dbo.RequestsHistory
	GROUP BY Req_ID
	ORDER BY Req_ID

	--SELECT * FROM @TmpReqID

	-- جدول لجلب بيانات كل طلب
	DECLARE @Tmp2 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[Req_ID] [int] NOT NULL,
		[ActionDate] [datetime] NOT NULL,
		[OrderStatus] [nvarchar](5) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL
	)

	-- جدول لسحب المستخدم والوقت فقط
	DECLARE @Tmp3 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [int] NOT NULL
	)
	
	DECLARE @ID INT

	DECLARE @j int = 1 
	DECLARE @i int = 0
	-- الحلقة الخارجية للمرور على أرقام الطلبات
	WHILE @i < (SELECT COUNT(*) FROM @Tmp1) BEGIN
		SET @i = @i + 1

		SET @ID = (SELECT TOP 1 [Req_ID] FROM @Tmp1 WHERE ID = @i)


		INSERT @Tmp2
	    ( 
			[Req_ID] ,
	        [ActionDate] ,
	        [OrderStatus] ,
	        [ActionBy]
	    )
		SELECT [Req_ID],CAST([ActionDate] + ' ' + [ActionTime] AS DATETIME) ,[OrderStatus],[ActionBy] 
		FROM  dbo.RequestsHistory
		WHERE Req_ID = @ID
		ORDER BY [ActionDate]

		--SELECT * FROM @Tmp2
		--ORDER BY [ActionDate]


		DECLARE @ActionBy AS NVARCHAR(50), @LastTime DATETIME,@CurrentTime DATETIME

		-- حلقة داخلية لاحتساب الوقت بين كل طلب والذي قبله
		WHILE @j < (SELECT COUNT(*) FROM @Tmp2) BEGIN
			SET @j = @j + 1
			SET @LastTime = (SELECT TOP 1 [ActionDate] FROM @Tmp2 WHERE ID = @j-1)
			SET @CurrentTime = (SELECT TOP 1 [ActionDate] FROM @Tmp2 WHERE ID = @j)
			SET @ActionBy = (SELECT TOP 1 [ActionBy] FROM @Tmp2 WHERE ID = @j)

			INSERT INTO @Tmp3 ([ActionBy], [ActionDate]) 
			VALUES(@ActionBy,DATEDIFF(MINUTE,@LastTime,@CurrentTime) )

		END
		--SELECT * FROM @Tmp3
		SET @j = @j + 1
	END

	--SELECT * FROM @Tmp3

	-- جدول لحساب معدلات الفروقات بالدقيقة
	DECLARE @Tmp4 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [int] NOT NULL
	)
	INSERT @Tmp4 
	(
		[ActionBy],
		[ActionDate] 
	)
	SELECT [ActionBy],((SUM([ActionDate])/COUNT([ActionDate])))
	FROM  @Tmp3
	GROUP BY [ActionBy]

	--SELECT * FROM @Tmp4

	-- جدول لوضع النتائج النهائية
	DECLARE @Tmp5 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [nvarchar](200) NOT NULL
	)

	DECLARE @ActionDate INT,@ActionDateF NVARCHAR(200),
	@Days INT,@Hours INT,@Minutes INT

	DECLARE @k int = 0
	WHILE @k < (SELECT COUNT(*) FROM @Tmp4) BEGIN
		SET @k = @k + 1

		SET @ActionBy = (SELECT TOP 1 [ActionBy] FROM @Tmp4 WHERE ID = @k)
		SET @ActionDate = (SELECT TOP 1 [ActionDate] FROM @Tmp4 WHERE ID = @k)

		SET @Days = @ActionDate/1440
		SET @Hours = (@ActionDate - @Days*1440)/60
		SET @Minutes = @ActionDate - @Days*1440 - @Hours*60
		SET @ActionDateF =  CAST(@Days AS NVARCHAR(200)) + ', ' + FORMAT(@Hours ,'00') + ':' + FORMAT(@Minutes ,'00') 

		INSERT INTO @Tmp5 ([ActionBy], [ActionDate]) 
		VALUES(@ActionBy,@ActionDateF )
	END


	SELECT * FROM @Tmp5

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#30

جزاك الله عنا كل خير

 

مجهود كبير تشكر عليه لا عدمناك .....

 

عند تنفيذ الكود يظهر لي هذا الخطأ ...

 

Msg 195, Level 15, State 10, Line 123
'FORMAT' is not a recognized built-in function name.
#31

أنا أستخدم الاصدار 2012 ربما هذه الدالة غير معرفة لدى الاصدار الذي تعمل عليه

 

أنا استخدمته من أجل تنسيق النص

 

على كل حال استبدل السطر الذي يحويها بالسطر التالي

 

SET @ActionDateF =  CAST(@Days AS NVARCHAR(5)) + ', ' + CAST(@Hours AS NVARCHAR(2)) + ':' + CAST(@Minutes AS NVARCHAR(2))

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 12 فبراير 2013 في 12:06

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#32

جزاك الله خير

 

الكود يعمل ولكن يظهر الاخطاء التاليه مع انه يعمل ...

 

(5139 row(s) affected)
Msg 515, Level 16, State 2, Line 49
Cannot insert the value NULL into column 'ActionDate', table '@Tmp2'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Msg 515, Level 16, State 2, Line 49
Cannot insert the value NULL into column 'ActionDate', table '@Tmp2'; column does not allow nulls. INSERT fails.

طبعاً الخطأ يظهر بشكل مكرر حوالي 3000 مره ولكن لكي لا تكون البيانات في هذه الصفحة كبيره لم انسخ إلا اول الاسطر .....

 

ايضاً الاستعلام يأخذ حوالي 30 ثانيه حتى يتم تنفيذه ،، هل هذا طبيعي ؟

 

ايضاً ارغب بستثناء ارقام الطلاب وارغب فقط بإظهاء اسماء المسؤولين وهي تظهر لدي في اخر الجدول ..

 

بنتظارك يا ابو احمد

#33

أخي أنا عندما كنت أجرب كنت أجرب على جدول ملأته من خلال برنامج Data Generator

و هو يملأ بطريقة عشوائية

 

حتى تنضبط الأمور بدقة كان ينبغي أن أجرب على بيانات حقيقية بحيث تكون تكون منضبطة بمنطق معين

مثلا أن لا يكون هناك سجل بدون اسم مستخدم

أن لا يكون هناك عشوائية بالتاريخ كأن يكون تاريخ التسجيل بعد تاريخ الاعتماد وهكذا

 

لذا إذا كان بإمكانك أن ترسل لي ولو أول 100 سجل لأطبق عليه

 

طبعا بسبب وجود أخطاء يكون هناك تأخير بينما لو كان يسير السكربت بشكل طبيعي أكيد أسرع

 

بالنسبة لاستثناء الطلاب بإمكاني الاعتماد على حقل حالة الطلب إن كانت تسجيل فسأقصيها من النتائج

فما هي القيمة التي تعبر عن حالة التسجيل ؟

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 12 فبراير 2013 في 15:26

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#34
أبو أحمد المبرمج كتب:

أخي أنا عندما كنت أجرب كنت أجرب على جدول ملأته من خلال برنامج Data Generator

و هو يملأ بطريقة عشوائية

 

حتى تنضبط الأمور بدقة كان ينبغي أن أجرب على بيانات حقيقية بحيث تكون تكون منضبطة بمنطق معين

مثلا أن لا يكون هناك سجل بدون اسم مستخدم

أن لا يكون هناك عشوائية بالتاريخ كأن يكون تاريخ التسجيل بعد تاريخ الاعتماد وهكذا

 

لذا إذا كان بإمكانك أن ترسل لي ولو أول 100 سجل لأطبق عليه

 

طبعا بسبب وجود أخطاء يكون هناك تأخير بينما لو كان يسير السكربت بشكل طبيعي أكيد أسرع

 

بالنسبة لاستثناء الطلاب بإمكاني الاعتماد على حقل حالة الطلب إن كانت تسجيل فسأقصيها من النتائج

فما هي القيمة التي تعبر عن حالة التسجيل ؟

 

 

فهمت عليك ابو احمد

 

ولكن الاخطاء مكرره ونفس الخطأ ..

 

(5139 row(s) affected)

Msg 515, Level 16, State 2, Line 49

Cannot insert the value NULL into column 'ActionDate', table '@Tmp2'; column does not allow nulls. INSERT fails.

The statement has been terminated.

Msg 515, Level 16, State 2, Line 49

Cannot insert the value NULL into column 'ActionDate', table '@Tmp2'; column does not allow nulls. INSERT fails.

 

ماهي المشكلة في عدم تمكنه من اضافه 'ActionDate' في Tmp2

 

يوجد حقل اسمه ActionType

 

اذا كان قيمته

01

07

يعني الاكشن من طالب

 

واذا كان

02

08

11

يعني الاكشن من مسؤول

تم تعديل هذه المشاركة بواسطة tec4serv في 12 فبراير 2013 في 16:21

#35

أخي الخلل كان في اختلاف صيغة التاريخ المحدد في جهازك

 

عدلت السكربت

 

حيث أضفت التعليمة التالية

SET DATEFORMAT dmy

لتوافق نمط التاريخ المخزن في القاعدة لديك

وإذا استمر الخلل فغيرها إلى mdy

 

 

 

USE [RequestSystem]
GO

SET DATEFORMAT dmy
	-- جدول لحفظ أرقام الطلبات فقط
	DECLARE @Tmp1 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[Req_ID] [int] NOT NULL
	)

	INSERT @Tmp1
	( 
		[Req_ID]
	)
	SELECT [Req_ID]
	FROM  dbo.RequestsHistory
	GROUP BY Req_ID
	ORDER BY Req_ID

	--SELECT * FROM @Tmp1

	-- جدول لجلب بيانات كل طلب
	DECLARE @Tmp2 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[Req_ID] [int] NOT NULL,
		[ActionDate] DATETIME2 NOT NULL,
		[OrderStatus] [nvarchar](5) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL
	)

	-- جدول لسحب المستخدم والوقت فقط
	DECLARE @Tmp3 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[OrderStatus] [nvarchar](5) NOT NULL,
		[ActionDate] [int] NOT NULL
	)
	
	DECLARE @ID INT

	DECLARE @j int = 1 
	DECLARE @i int = 0
	-- الحلقة الخارجية للمرور على أرقام الطلبات
	WHILE @i < (SELECT COUNT(*) FROM @Tmp1) BEGIN
		SET @i = @i + 1

		SET @ID = (SELECT TOP 1 [Req_ID] FROM @Tmp1 WHERE ID = @i)

		INSERT @Tmp2
	    ( 
			[Req_ID] ,
	        [ActionDate] ,
	        [OrderStatus] ,
	        [ActionBy]
	    )
		SELECT [Req_ID],CAST(([ActionDate]+ ' ' +[ActionTime])  AS DATETIME) ,[OrderStatus],[ActionBy] 
		FROM  dbo.RequestsHistory
		WHERE Req_ID = @ID
		ORDER BY [ActionDate]

		--SELECT * FROM @Tmp2
		--ORDER BY [ActionDate]


		DECLARE @ActionBy AS NVARCHAR(50), @LastTime DATETIME,@CurrentTime DATETIME,@OrderStatus AS NVARCHAR(5)

		-- حلقة داخلية لاحتساب الوقت بين كل طلب والذي قبله
		WHILE @j < (SELECT COUNT(*) FROM @Tmp2) BEGIN
			SET @j = @j + 1
			SET @LastTime = (SELECT TOP 1 [ActionDate] FROM @Tmp2 WHERE ID = @j-1)
			SET @CurrentTime = (SELECT TOP 1 [ActionDate] FROM @Tmp2 WHERE ID = @j)
			SET @ActionBy = (SELECT TOP 1 [ActionBy] FROM @Tmp2 WHERE ID = @j)
			SET @OrderStatus = (SELECT TOP 1 [OrderStatus] FROM @Tmp2 WHERE ID = @j)

			IF @OrderStatus IN ('02','08','11')
			BEGIN
				INSERT INTO @Tmp3 ([ActionBy], [ActionDate], [OrderStatus]) 
				VALUES(@ActionBy,DATEDIFF(MINUTE,@LastTime,@CurrentTime),@OrderStatus)
			END

		END
		--SELECT * FROM @Tmp3
		SET @j = @j + 1
	END

	--SELECT * FROM @Tmp3

	-- جدول لحساب معدلات الفروقات بالدقيقة
	DECLARE @Tmp4 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [int] NOT NULL
	)
	INSERT @Tmp4 
	(
		[ActionBy],
		[ActionDate] 
	)
	SELECT [ActionBy],((SUM([ActionDate])/COUNT([ActionDate])))
	FROM  @Tmp3
	GROUP BY [ActionBy]

	--SELECT * FROM @Tmp4

	-- جدول لوضع النتائج النهائية
	DECLARE @Tmp5 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [nvarchar](200) NOT NULL
	)

	DECLARE @ActionDate INT,@ActionDateF NVARCHAR(200),
	@Days INT,@Hours INT,@Minutes INT

	DECLARE @k int = 0
	WHILE @k < (SELECT COUNT(*) FROM @Tmp4) BEGIN
		SET @k = @k + 1

		SET @ActionBy = (SELECT TOP 1 [ActionBy] FROM @Tmp4 WHERE ID = @k)
		SET @ActionDate = (SELECT TOP 1 [ActionDate] FROM @Tmp4 WHERE ID = @k)

		SET @Days = @ActionDate/1440
		SET @Hours = (@ActionDate - @Days*1440)/60
		SET @Minutes = @ActionDate - @Days*1440 - @Hours*60
		SET @ActionDateF =  CAST(@Days AS NVARCHAR(5)) + ', ' + CAST(@Hours AS NVARCHAR(2)) + ':' + CAST(@Minutes AS NVARCHAR(2)) 

		INSERT INTO @Tmp5 ([ActionBy], [ActionDate]) 
		VALUES(@ActionBy,@ActionDateF )
	END


	SELECT * FROM @Tmp5

 

كما وضعت شرط إقصاء طلبات الطلاب

 

			IF @OrderStatus IN ('02','08','11')

 

فيما يخص الوقت فلا شك عند كبر عدد السجلات يحتاج مزيد من الوقت لأنه يعتمد على حلقات وليس استفسارات مجملة

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#36

السلام عليكم

 

قمت بتعديل ،، ولا تزال المشكلة موجوده ظهور الخطأ

 

Cannot insert the value NULL into column 'ActionDate', table '@Tmp2'; column does not allow nulls. INSERT fails.

 

وايضاً اصبح يظهر لدي الخطأ التالي اذا وضعت mdy

 

The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.

 

ويختفي اذا وضعت dmy

 

 

ايضاً بعد تطبيق التعديل بعد وضع الشرط IF @OrderStatus IN ('02','08','11')

 

اصبح لا تظهر نتائج إطلاقاً

تم تعديل هذه المشاركة بواسطة tec4serv في 13 فبراير 2013 في 10:09

#37

أخي الكريم هل يوجد خانات في حقل التاريخ أو الوقت بدون قيمة ؟

لأن وجود قيم فارغة قد تسبب مشكلة ويجب وضع شروط لتجنبها.

 

بالنسبة للخطأ الثاني اعتمد الذي يلغي خطأ تحويل التاريخ

 

بالنسبة للثالث هل القيم التي تعبر عن حالة الطلب هي أرقام فقط أم هناك قبلها أحرف أو بعدها أحرف أو فراغات ؟

 

سبق وطلبت بيانات حقيقية ولو عدة أسطر 5 أو 10 لأتعرف على أنواع وصيغ القيم

لأنه أنا أجرب على البيانات التي ملئتها وتظهر صحيحة

 

post-261046-0-69574600-1360742318_thumb.

 

طبعا الرقم الأول عدد الأيام يليه بعد الفاصلة الساعات والدقائق

طبعا تجاهل الثواني لعد تأثيرها على الهدف الرئيسي للعملية

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 13 فبراير 2013 في 11:00

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#38
أبو أحمد المبرمج كتب:

أخي الكريم هل يوجد خانات في حقل التاريخ أو الوقت بدون قيمة ؟

لأن وجود قيم فارغة قد تسبب مشكلة ويجب وضع شروط لتجنبها.

 

بالنسبة للخطأ الثاني اعتمد الذي يلغي خطأ تحويل التاريخ

 

بالنسبة للثالث هل القيم التي تعبر عن حالة الطلب هي أرقام فقط أم هناك قبلها أحرف أو بعدها أحرف أو فراغات ؟

 

سبق وطلبت بيانات حقيقية ولو عدة أسطر 5 أو 10 لأتعرف على أنواع وصيغ القيم

لأنه أنا أجرب على البيانات التي ملئتها وتظهر صحيحة

 

attachicon.gifSnapshot02.jpg

 

طبعا الرقم الأول عدد الأيام يليه بعد الفاصلة الساعات والدقائق

طبعا تجاهل الثواني لعد تأثيرها على الهدف الرئيسي للعملية

 

 

اهااااا .. احسنت ابو احمد

 

بخصوص حقل الوقت ،، يوجد حقول فارغه كثيره وهذه تعتمد على التعديل اللذي اجريناه يكون كـ التالي ....

 

الفصل الدراسي الاول لا يوجد حقل وقت null

الفصل الدراسي الثاني يوجد جميعه حقل وقت

 

كيف نعرف ؟

 

يوجد جدول اخر بأسم Requested يوجد به حقل تاخذ قيمتين .. الاولى smc01 والثانيه smc02

 

نحن نحتاج فقط الفصل الثاني smc02

 

اسم الحقل SMC

#39

اعتذر منك اخي واستاذي ابو احمد

 

بخصوص الحقل اللذي يميز مدخل الطلب هل هو الطالب او المسول ليس OrderStatus  إنما ActionType

 

وله الحالات المذكوره في الاعلى  T02 OR T08 Or T11

#40

السلام عليكم

 

الحمد لله عدلت ع الكود ياليت تلقي عليه نظره لتاكد اخي واستاذي ابو احمد

 

USE [RequestSystem]
GO

--	SET DATEFORMAT mdy

	-- جدول لحفظ أرقام الطلبات فقط
	DECLARE @Tmp1 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[Req_ID] [int] NOT NULL
	)

	INSERT @Tmp1
	( 
		[Req_ID]
	)
	SELECT [Req_ID]
	FROM  dbo.RequestsHistory
	GROUP BY Req_ID
	ORDER BY Req_ID

	-- جدول لجلب بيانات كل طلب
	DECLARE @Tmp2 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[Req_ID] [int] NOT NULL,
		[ActionDate] DATETIME2 NOT NULL,
		[OrderStatus] [nvarchar](5) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionType] [nvarchar](50) NOT NULL
	)

	-- جدول لسحب المستخدم والوقت فقط
	DECLARE @Tmp3 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[OrderStatus] [nvarchar](5) NOT NULL,
		[ActionDate] [int] NOT NULL,
		[ActionType] [nvarchar](5) NOT NULL
	)
	
	DECLARE @ID INT

	DECLARE @j int = 1 
	DECLARE @i int = 0
	-- الحلقة الخارجية للمرور على أرقام الطلبات
	WHILE @i < (SELECT COUNT(*) FROM @Tmp1) BEGIN
		SET @i = @i + 1

		SET @ID = (SELECT TOP 1 [Req_ID] FROM @Tmp1 WHERE ID = @i)

		INSERT @Tmp2
	    ( 
			[Req_ID] ,
	        [ActionDate] ,
	        [OrderStatus] ,
	        [ActionBy],
	        [ActionType]
	    )
		SELECT [Req_ID],CAST(([ActionDate]+ ' ' +[ActionTime])  AS DATETIME) ,[OrderStatus],[ActionBy],[ActionType]
		FROM  dbo.RequestsHistory
		WHERE Req_ID = @ID AND (ActionTime IS NOT NULL )
		ORDER BY [ActionDate]


		DECLARE @ActionBy AS NVARCHAR(50),
		@LastTime DATETIME,
		@CurrentTime DATETIME,
		@OrderStatus AS NVARCHAR(5),
		@ActionType AS NVARCHAR(5)

		-- حلقة داخلية لاحتساب الوقت بين كل طلب والذي قبله
		WHILE @j < (SELECT COUNT(*) FROM @Tmp2) BEGIN
			SET @j = @j + 1
			SET @LastTime = (SELECT TOP 1 [ActionDate] FROM @Tmp2 WHERE ID = @j-1)
			SET @CurrentTime = (SELECT TOP 1 [ActionDate] FROM @Tmp2 WHERE ID = @j)
			SET @ActionBy = (SELECT TOP 1 [ActionBy] FROM @Tmp2 WHERE ID = @j)
			SET @OrderStatus = (SELECT TOP 1 [OrderStatus] FROM @Tmp2 WHERE ID = @j)
			SET @ActionType = ( SELECT TOP 1 [ActionType] FROM @Tmp2 WHERE ID = @j)
			IF @ActionType IN ('T02','T08','T11') 
			BEGIN
				INSERT INTO @Tmp3 ([ActionBy], [ActionDate], [OrderStatus], [ActionType]) 
				VALUES(@ActionBy,DATEDIFF(MINUTE,@LastTime,@CurrentTime),@OrderStatus,@ActionType)
			END

		END

		SET @j = @j + 1
	END



	-- جدول لحساب معدلات الفروقات بالدقيقة
	DECLARE @Tmp4 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [int] NOT NULL
	)
	INSERT @Tmp4 
	(
		[ActionBy],
		[ActionDate] 
	)
	SELECT [ActionBy],((SUM([ActionDate])/COUNT([ActionDate])))
	FROM  @Tmp3
	GROUP BY [ActionBy]



	-- جدول لوضع النتائج النهائية
	DECLARE @Tmp5 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [nvarchar](200) NOT NULL
	)

	DECLARE @ActionDate INT,
	@ActionDateF NVARCHAR(200),
	@Days INT,
	@Hours INT,
	@Minutes INT

	DECLARE @k int = 0
	WHILE @k < (SELECT COUNT(*) FROM @Tmp4) BEGIN
		SET @k = @k + 1

		SET @ActionBy = (SELECT TOP 1 [ActionBy] FROM @Tmp4 WHERE ID = @k)
		SET @ActionDate = (SELECT TOP 1 [ActionDate] FROM @Tmp4 WHERE ID = @k)

		SET @Days = @ActionDate/1440
		SET @Hours = (@ActionDate - @Days*1440)/60
		SET @Minutes = @ActionDate - @Days*1440 - @Hours*60
		SET @ActionDateF =  CAST(@Days AS NVARCHAR(5)) + ' Days , ' + CAST(@Hours AS NVARCHAR(2)) + ' Hours , ' + CAST(@Minutes AS NVARCHAR(2)) + ' Minutes '

		INSERT INTO @Tmp5 ([ActionBy], [ActionDate]) 
		VALUES(@ActionBy,@ActionDateF )
	END


	SELECT * FROM @Tmp5

الان الكود يعمل ان شاء الله بدون اخطاء ،، ولكن فقط البطئ هو الشي المزعج ..

 

ايضاً كيف اربطه بجدول Requested لكي احدد الفصل والسنه

 

الجدول : Requested

السنه : RYEAR

الفصل : SMC

 

مثال :::

السنه : 1433/1434

الفصل : SMC01 او SMC02 او SMC03

تم تعديل هذه المشاركة بواسطة tec4serv في 13 فبراير 2013 في 14:42

#41

الحمد لله أن الأمور بدأت تتحلحل

فيما يخص البطء بعد أن نتأكد أن الخوارزمية تعمل بشكل جيد وتعطي نتائج صحيحة من الممكن أن نعمل على تسريعها

 

فيما يخص الربط ما هو الحقل من كل جدول الذي يربطهما مع بعض ؟

هل بالإمكان وضع سكربت إنشاء الجدول Requested

وحبذا لو تضع لقطة من كيف تظهر نتائج هذا الحقل لعدة أسطر

مثل الصورة التي وضعتها أنت في المشاركة

/index.php/topic/275121-%D9%85%D8%A7%D9%87%D9%8A-%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%AD%D8%B3%D8%A7%D8%A8-%D9%85%D8%AA%D9%88%D8%B3%D8%B7-%D8%A7%D9%84%D9%88%D9%82%D8%AA-%D8%9F/#entry1327350

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#42

لتجنب أخطاء الخانات الفارغة يمكن استخدام التابع

ISNULL([ActionTime],'')

بدلا من الخانة مباشرة

والتي تعيد قيمة فراغ في حال كانت NULL

و ذلك لأن بعض العمليات ترجع القيم NULL  في حال كان أي من حدودها NULL

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#43

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

USE [RequestSystem]
GO

--SET DATEFORMAT dmy

	--SELECT TOP 30 * FROM dbo.RequestsHistory

	-- جدول لجلب بيانات كل طلب
	DECLARE @Tmp2 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[Req_ID] [int] NOT NULL,
		[ActionDate] DATETIME2 NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionType] [nvarchar](5) NOT NULL
	)

	-- جدول لسحب المستخدم والوقت فقط
	DECLARE @Tmp3 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [int] NOT NULL,
		[ActionType] [nvarchar](5) NOT NULL
	)
	
	DECLARE @ID INT


	INSERT @Tmp2
	( 
		[Req_ID] ,
	    [ActionDate] ,
	    [ActionBy],
	    [ActionType]
	)
	SELECT [Req_ID],CAST(([ActionDate] + ' ' + ISNULL([ActionTime],''))  AS DATETIME) ,[ActionBy],[ActionType]
	FROM  dbo.RequestsHistory
	ORDER BY [Req_ID],[ActionDate]

	--SELECT * FROM @Tmp2
	--ORDER BY [ActionDate]


	DECLARE @ActionBy AS NVARCHAR(50), @LastTime DATETIME,@CurrentTime DATETIME,@OrderStatus AS NVARCHAR(5),@ActionType AS NVARCHAR(5)

	DECLARE @j int = 1 
	-- حلقة داخلية لاحتساب الوقت بين كل طلب والذي قبله
	WHILE @j < (SELECT COUNT(*) FROM @Tmp2) BEGIN
		SET @j = @j + 1
		SET @LastTime = (SELECT TOP 1 [ActionDate] FROM @Tmp2 WHERE ID = @j-1)
		SET @CurrentTime = (SELECT TOP 1 [ActionDate] FROM @Tmp2 WHERE ID = @j)
		SET @ActionBy = (SELECT TOP 1 [ActionBy] FROM @Tmp2 WHERE ID = @j)
		SET @ActionType = (SELECT TOP 1 [ActionType] FROM @Tmp2 WHERE ID = @j)

		IF @ActionType IN ('T02','T08','T11')
		BEGIN
			INSERT INTO @Tmp3 ([ActionBy], [ActionDate], [ActionType]) 
			VALUES(@ActionBy,ABS(DATEDIFF(MINUTE,@LastTime,@CurrentTime)),@ActionType)
		END
		SET @j = @j + 1

	END


	--SELECT * FROM @Tmp3

	-- جدول لحساب معدلات الفروقات بالدقيقة
	DECLARE @Tmp4 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [int] NOT NULL
	)
	INSERT @Tmp4 
	(
		[ActionBy],
		[ActionDate] 
	)
	SELECT [ActionBy],((SUM([ActionDate])/COUNT([ActionDate])))
	FROM  @Tmp3
	GROUP BY [ActionBy]

	--SELECT * FROM @Tmp4

	-- جدول لوضع النتائج النهائية
	DECLARE @Tmp5 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [nvarchar](200) NOT NULL
	)

	DECLARE @ActionDate INT,@ActionDateF NVARCHAR(200),
	@Days INT,@Hours INT,@Minutes INT

	DECLARE @k int = 0
	WHILE @k < (SELECT COUNT(*) FROM @Tmp4) BEGIN
		SET @k = @k + 1

		SET @ActionBy = (SELECT TOP 1 [ActionBy] FROM @Tmp4 WHERE ID = @k)
		SET @ActionDate = (SELECT TOP 1 [ActionDate] FROM @Tmp4 WHERE ID = @k)

		SET @Days = @ActionDate/1440
		SET @Hours = (@ActionDate - @Days*1440)/60
		SET @Minutes = @ActionDate - @Days*1440 - @Hours*60
		SET @ActionDateF =  CAST(@Days AS NVARCHAR(5)) + ', ' + CAST(@Hours AS NVARCHAR(2)) + ':' + CAST(@Minutes AS NVARCHAR(2)) 

		INSERT INTO @Tmp5 ([ActionBy], [ActionDate]) 
		VALUES(@ActionBy,@ActionDateF )
	END


	SELECT * FROM @Tmp5

 

كما أظن أنه بالإمكان استخدام cursor fetch بدلا من الحلقة التقليدية وربما تكون أسرع

 

ولكن لننتهي من الوصول للكود الذي يعطي نتائج صحيحة ثم نحسن السكربت أكثر من ذلك

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 13 فبراير 2013 في 19:46

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#44
أبو أحمد المبرمج كتب:

الحمد لله أن الأمور بدأت تتحلحل

فيما يخص البطء بعد أن نتأكد أن الخوارزمية تعمل بشكل جيد وتعطي نتائج صحيحة من الممكن أن نعمل على تسريعها

 

فيما يخص الربط ما هو الحقل من كل جدول الذي يربطهما مع بعض ؟

هل بالإمكان وضع سكربت إنشاء الجدول Requested

وحبذا لو تضع لقطة من كيف تظهر نتائج هذا الحقل لعدة أسطر

مثل الصورة التي وضعتها أنت في المشاركة

/index.php/topic/275121-%D9%85%D8%A7%D9%87%D9%8A-%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%AD%D8%B3%D8%A7%D8%A8-%D9%85%D8%AA%D9%88%D8%B3%D8%B7-%D8%A7%D9%84%D9%88%D9%82%D8%AA-%D8%9F/#entry1327350

 

 

السلام عليكم

 

هذا هو السكريبت

 

CREATE TABLE [dbo].[Requested](
	[Req_ID] [int] IDENTITY(1,1) NOT NULL,
	[RequestsID] [nvarchar](15) NULL,
	[StudentName] [nvarchar](200) NULL,
	[StudentID] [nvarchar](15) NULL,
	[RegSemster] [nvarchar](15) NULL,
	[RegYear] [nvarchar](15) NULL,
	[OrderStatus] [nvarchar](5) NULL,
	[OrderDate] [nchar](10) NULL,
)

حيث ان الرابط بين الجدولين هو Riq_ID  والحقلين المسؤوله عن تحديد الفصل هما RegSemster و RegYear

حيث ان الحقل RegSemster تاخذ اما SMC01 او SMC02 او SMC03

والحقل year ياخذ الصيغة التاليه 1434/1433 او 1435/ 1434 وهكذا .......................

أبو أحمد المبرمج كتب:

خطر لي بما أننا سنتجاهل سجلات الطلاب وعلى اعتبار أن أول سدل في كل جدول يتبع طلب معين هو لطالب حصرا

على اعتبار أنه منطقيا لا يمكن أن يسبق تسجيل الطالب لطلب جديد أي أكشن من أي مسؤول

أن نتعامل مع الجدول ككتلة واحدة بدلا من تقسيمه إلى جداول بحيث كل جدول ننسخه باستخدام شرط قيمة رقم الطلب

وبهذا سنستغني عن الحلقة الخارجية ونوفر عملية نسخ مؤقت

 

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

حتى أظن أنه لا داعي للقراءة من الجدول الثاني للفصول

 

USE [RequestSystem]
GO

--SET DATEFORMAT dmy

	--SELECT TOP 30 * FROM dbo.RequestsHistory

	-- جدول لجلب بيانات كل طلب
	DECLARE @Tmp2 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[Req_ID] [int] NOT NULL,
		[ActionDate] DATETIME2 NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionType] [nvarchar](5) NOT NULL
	)

	-- جدول لسحب المستخدم والوقت فقط
	DECLARE @Tmp3 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [int] NOT NULL,
		[ActionType] [nvarchar](5) NOT NULL
	)
	
	DECLARE @ID INT


	INSERT @Tmp2
	( 
		[Req_ID] ,
	    [ActionDate] ,
	    [ActionBy],
	    [ActionType]
	)
	SELECT [Req_ID],CAST(([ActionDate] + ' ' + ISNULL([ActionTime],''))  AS DATETIME) ,[ActionBy],[ActionType]
	FROM  dbo.RequestsHistory
	ORDER BY [Req_ID],[ActionDate]

	--SELECT * FROM @Tmp2
	--ORDER BY [ActionDate]


	DECLARE @ActionBy AS NVARCHAR(50), @LastTime DATETIME,@CurrentTime DATETIME,@OrderStatus AS NVARCHAR(5),@ActionType AS NVARCHAR(5)

	DECLARE @j int = 1 
	-- حلقة داخلية لاحتساب الوقت بين كل طلب والذي قبله
	WHILE @j < (SELECT COUNT(*) FROM @Tmp2) BEGIN
		SET @j = @j + 1
		SET @LastTime = (SELECT TOP 1 [ActionDate] FROM @Tmp2 WHERE ID = @j-1)
		SET @CurrentTime = (SELECT TOP 1 [ActionDate] FROM @Tmp2 WHERE ID = @j)
		SET @ActionBy = (SELECT TOP 1 [ActionBy] FROM @Tmp2 WHERE ID = @j)
		SET @ActionType = (SELECT TOP 1 [ActionType] FROM @Tmp2 WHERE ID = @j)

		IF @ActionType IN ('T02','T08','T11')
		BEGIN
			INSERT INTO @Tmp3 ([ActionBy], [ActionDate], [ActionType]) 
			VALUES(@ActionBy,ABS(DATEDIFF(MINUTE,@LastTime,@CurrentTime)),@ActionType)
		END
		SET @j = @j + 1

	END


	--SELECT * FROM @Tmp3

	-- جدول لحساب معدلات الفروقات بالدقيقة
	DECLARE @Tmp4 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [int] NOT NULL
	)
	INSERT @Tmp4 
	(
		[ActionBy],
		[ActionDate] 
	)
	SELECT [ActionBy],((SUM([ActionDate])/COUNT([ActionDate])))
	FROM  @Tmp3
	GROUP BY [ActionBy]

	--SELECT * FROM @Tmp4

	-- جدول لوضع النتائج النهائية
	DECLARE @Tmp5 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [nvarchar](200) NOT NULL
	)

	DECLARE @ActionDate INT,@ActionDateF NVARCHAR(200),
	@Days INT,@Hours INT,@Minutes INT

	DECLARE @k int = 0
	WHILE @k < (SELECT COUNT(*) FROM @Tmp4) BEGIN
		SET @k = @k + 1

		SET @ActionBy = (SELECT TOP 1 [ActionBy] FROM @Tmp4 WHERE ID = @k)
		SET @ActionDate = (SELECT TOP 1 [ActionDate] FROM @Tmp4 WHERE ID = @k)

		SET @Days = @ActionDate/1440
		SET @Hours = (@ActionDate - @Days*1440)/60
		SET @Minutes = @ActionDate - @Days*1440 - @Hours*60
		SET @ActionDateF =  CAST(@Days AS NVARCHAR(5)) + ', ' + CAST(@Hours AS NVARCHAR(2)) + ':' + CAST(@Minutes AS NVARCHAR(2)) 

		INSERT INTO @Tmp5 ([ActionBy], [ActionDate]) 
		VALUES(@ActionBy,@ActionDateF )
	END


	SELECT * FROM @Tmp5

 

كما أظن أنه بالإمكان استخدام cursor fetch بدلا من الحلقة التقليدية وربما تكون أسرع

 

ولكن لننتهي من الوصول للكود الذي يعطي نتائج صحيحة ثم نحسن السكربت أكثر من ذلك

 

 

السلام عليكم .......

 

استاذي المهندس ابو احمد

تنفيذ الكود اخذ نفس المده للكود السابق حوالي 17 ثانيه ....

 

طبعا ظهر فيه اختلاف بنتائج بين الكود الجديد والسابق .... قد يكون اختلاف بسيط بحكم null

 

تتوقع هل الكود الجديد هو الاقرب لصواب ؟

#45

أخي الكريم أعتذر إليك فلست متجاهل الأمر

ولكن لدي تسليم برنامج ومشغول جدا ربما غدا أو بعد غد أتابع معك إن شاء الله

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#46
أبو أحمد المبرمج كتب:

أخي الكريم أعتذر إليك فلست متجاهل الأمر

ولكن لدي تسليم برنامج ومشغول جدا ربما غدا أو بعد غد أتابع معك إن شاء الله

 

 

لم يخطر في بالي انك متجاهل لا عدمنااااك

 

كان الله في عونك وأسال الله القدير ان ييسر لك كل عسير

#47

لا أخي أنا لم أقل أنه خطر ببالك
ولكن قدمت عذري حتى لا يخطر ببالك :)

أخي الكريم
الحمد لله استطعت أن اتخلص من الحلقات نهائيا
وقمت بتجربة السكربت على 100،000 سجل فتم بحدود 6 ثواني

بينما 5000 ظهرت النتائج مباشرة أي بدون وقت

ثم عملت مقارنة على 40،000 فكانت النتيجة للسكربت السابق 120 ثانية بينما الجديد 1 ثانية واحدة

فعلمت أنه لديك يجب أن تظهر النتائج بأسرع من السابق بكثير

طبعا لم استخدم التحسينات النهائية بعد وكذلك لم نفلتر على أساس الفصل
مما سيقلل العدد المعالج

ولكن لدي استفسارات
- أولا كم عدد السجلات التي تجرب عليها أنت وكانت النتيجة 17 ثانية ؟
- سبق وذكرت أنك تريد الفصل الثاني ولكن ذكت فيما بعد أن الجدول يحوي ثلاث فصول
فهل تريد الفصل الثاني من الثلاث فصول ؟
- ما هو دور السنة في الموضوع
هل تريد إظهار النتائج كل سنة بسنتها أم معدل الوقت لجميع السجلات بغض النظر عن السنة ؟

ريثما تجيب أكون قد حسنت السكربت النهائي و يبقى وضع اشتراطات الجدول الأول

 

على أية حال جرب السكربت الجديد

 

USE [RequestSystem]
GO

--SET DATEFORMAT dmy

	--SELECT TOP 30 * FROM dbo.RequestsHistory

	-- جدول لجلب بيانات كل طلب
	DECLARE @Tmp2 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[Req_ID] [int] NOT NULL,
		[ActionDate] DATETIME2 NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionType] [nvarchar](5) NOT NULL
	)

	-- جدول لجلب بيانات كل طلب
	DECLARE @Tmp2b TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[Req_ID] [int] NOT NULL,
		[ActionDate] DATETIME2 NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionType] [nvarchar](5) NOT NULL
	)

	-- جدول لجلب بيانات كل طلب
	DECLARE @Tmp2c TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[Req_ID] [int] NOT NULL,
		[ActionDate] DATETIME2 NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionType] [nvarchar](5) NOT NULL
	)

	-- جدول لجلب بيانات كل طلب
	DECLARE @Tmp2d TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[Req_ID] [int] NOT NULL,
		[ActionDate] DATETIME2 NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionType] [nvarchar](5) NOT NULL,
		[PActionDate] DATETIME2 NOT NULL
	)


	-- جدول لسحب المستخدم والوقت فقط
	DECLARE @Tmp3 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [int] NOT NULL,
		[ActionType] [nvarchar](5) NOT NULL
	)
	
	DECLARE @ID INT


	INSERT @Tmp2
	( 
		[Req_ID] ,
	    [ActionDate] ,
	    [ActionBy],
	    [ActionType]
	)
	SELECT [Req_ID],CAST(([ActionDate] + ' ' + ISNULL([ActionTime],''))  AS DATETIME) ,[ActionBy],[ActionType]
	FROM  dbo.RequestsHistory AS ttt
	ORDER BY ttt.[Req_ID],ttt.[ActionDate]

	--SELECT [Req_ID],CAST(([ActionDate] + ' ' + ISNULL([ActionTime],''))  AS DATETIME) ,[ActionBy],[ActionType]
	--FROM  dbo.RequestsHistory AS ttt2
	--ORDER BY ttt2.[Req_ID],ttt2.[ActionDate]

	--SELECT  * FROM @Tmp2


	--DECLARE @C INT
	--SET @C = ((SELECT COUNT(*) FROM @Tmp2) - 1)


	INSERT @Tmp2b
	( 
		[Req_ID] ,
	    [ActionDate] ,
	    [ActionBy],
	    [ActionType]
	)
	SELECT TOP ((SELECT COUNT(*) FROM @Tmp2) - 1) [Req_ID],[ActionDate],[ActionBy],[ActionType]
	FROM  @Tmp2
	ORDER BY [ID] DESC



	--SELECT * FROM @Tmp2b
	--ORDER BY [Req_ID],[ActionDate]

	INSERT @Tmp2c
	( 
		[Req_ID] ,
	    [ActionDate] ,
	    [ActionBy],
	    [ActionType]
	)
	SELECT [Req_ID],[ActionDate],[ActionBy],[ActionType]
	FROM  @Tmp2b
	ORDER BY [ID] DESC


	--SELECT * FROM @Tmp2c




	INSERT @Tmp2d
	( 
		[Req_ID] ,
	    [ActionDate] ,
	    [ActionBy],
	    [ActionType],
	    [PActionDate] 
	)
	SELECT [@Tmp2c].[Req_ID],[@Tmp2c].[ActionDate],[@Tmp2c].[ActionBy],[@Tmp2c].[ActionType],[@Tmp2].ActionDate
	FROM  @Tmp2c
	INNER JOIN @Tmp2 
	ON [@Tmp2c].ID = [@Tmp2].ID
	


	--SELECT * FROM @Tmp2d


	INSERT @Tmp3
	( 
	    [ActionDate] ,
	    [ActionBy],
	    [ActionType]
	)
	SELECT ABS(DATEDIFF(MINUTE,[ActionDate],PActionDate)),[ActionBy],[ActionType]
	FROM  @Tmp2d
	WHERE [ActionType] IN ('T02','T08','T11')


	--SELECT * FROM @Tmp3

	--SELECT * FROM @Tmp3

	-- جدول لحساب معدلات الفروقات بالدقيقة
	DECLARE @Tmp4 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [int] NOT NULL
	)
	INSERT @Tmp4 
	(
		[ActionBy],
		[ActionDate] 
	)
	SELECT [ActionBy],((SUM([ActionDate])/COUNT([ActionDate])))
	FROM  @Tmp3
	GROUP BY [ActionBy]

	--SELECT * FROM @Tmp4


	-- جدول لوضع النتائج النهائية
	DECLARE @Tmp4b TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[Days] [int] NOT NULL,
		[Hours] [int] NOT NULL,
		[Minutes] [int] NOT NULL
	)


	INSERT @Tmp4b 
	(
		[ActionBy],
		[Days],
		[Hours],
		[Minutes]
	)
	SELECT [ActionBy],(ActionDate/1440) ,((ActionDate-(ActionDate/1440)*1440)/60) , (ActionDate - (ActionDate/1440)*1440 - ((ActionDate-(ActionDate/1440)*1440)/60)*60) 
	FROM  @Tmp4

	SELECT * FROM @Tmp4b


	-- جدول لوضع النتائج النهائية
	DECLARE @Tmp5 TABLE 
	(
		[ID] [int] IDENTITY(1,1) NOT NULL,
		[ActionBy] [nvarchar](50) NOT NULL,
		[ActionDate] [nvarchar](200) NOT NULL
	)


	INSERT @Tmp5
	(
		[ActionBy],
		[ActionDate]
	)
	SELECT [ActionBy], CAST([Days] AS NVARCHAR(5)) + ', ' + CAST([Hours] AS NVARCHAR(2)) + ':' + CAST([Minutes] AS NVARCHAR(2)) 
	FROM  @Tmp4b

	SELECT * FROM @Tmp5

 



دمت بخير

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 19 فبراير 2013 في 20:54

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#48

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

 

بارك لله فيك والله يعطيك العافيه ،، مجهود تشكر عليه استاذي ابو احمد .....

 

- أولا كم عدد السجلات التي تجرب عليها أنت وكانت النتيجة 17 ثانية ؟

حوالي 14 الف سجل ....
- سبق وذكرت أنك تريد الفصل الثاني ولكن ذكت فيما بعد أن الجدول يحوي ثلاث فصول
فهل تريد الفصل الثاني من الثلاث فصول ؟

مستقبلاً وبعد الإنتهاء من الكود سأقوم بتمرير براميتر يحتوي على الفصل والسنه ،، يوجد لدينا في كل سنه ثلاث فصول وهي SMC01 و SMC02 و  SMC03 .... سأقوم بتمرير  براميتر يحتوي احد هذه الرموز بناءً على طلب المستخدم ... قمت بتعديل على الكود السابق حيث اني وضعت هذه ... ولا اعلم هل هو صحيح او لا ...

 

	SELECT     RequestsHistory.Req_ID, CAST(RequestsHistory.ActionDate + ' ' + ISNULL(RequestsHistory.ActionTime, '') AS DATETIME) AS Expr1, RequestsHistory.ActionBy, 
                      RequestsHistory.ActionType, Requested.RegSemster, Requested.RegYear
	FROM         RequestsHistory INNER JOIN
                      Requested ON RequestsHistory.Req_ID = Requested.Req_ID
	WHERE     (Requested.RegSemster = N'SMC02') AND (Requested.RegYear = N'1434/1433')
	ORDER BY RequestsHistory.Req_ID, RequestsHistory.ActionDate


 

 

- ما هو دور السنة في الموضوع

السنه هو لتحديد الفصل ،، مثال ...

 

 

 


الفصل الاول 1433/1434
الفصل الثاني 1433/1434
الفصل الصيفي 1433/1434

 

الفصل الاول 1434/1435
الفصل الثاني 1434/1435
الفصل الصيفي 1434/1435

 

الفصل الاول 1435/1436
الفصل الثاني 1434/1436
الفصل الصيفي 1435/1436

 

 

هل تريد إظهار النتائج كل سنة بسنتها أم معدل الوقت لجميع السجلات بغض النظر عن السنة ؟
ارغب بإظهار النتائج بحسب الفصول لجميع السنوات ،، يعني فقط نضع هذه الجمله لتحديد الفصل والسنه

WHERE     (Requested.RegSemster = N'SMC02') AND (Requested.RegYear = N'1434/1433')

تم تعديل هذه المشاركة بواسطة tec4serv في 20 فبراير 2013 في 11:10

#49

حسنا لعل الأمور أصبحت أوضح

 

ولكن لم تذكر لي هل جربت السكربت (ماذا بخصوص الزمن ؟) هل وجدت فرق ؟

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#50
أبو أحمد المبرمج كتب:

حسنا لعل الأمور أصبحت أوضح

 

ولكن لم تذكر لي هل جربت السكربت (ماذا بخصوص الزمن ؟) هل وجدت فرق ؟

 

الفرق جداً جداً واااااضح ،، الان الاستعلام اصبح سريع جداً ... ولكن طبعاً يوجد اختلافات في المتوسطات ،، الان اصبح لدينا 3 محاولات في 3 سكريبتات ــ جميعها يوجد فرق بين المتوسطات بينها ،، ولكن هذا الامر غير مقلق لدي ....

 

الان اواجه معضله كبيره جداً ....

 

ارغب في ان اقوم بستعراض النتائج في القريد فيو ولم استطيع يطلب مني ادخال براميتر للجداول المؤقته ،، حاولت استخدام البروسيجر ولم افلح :(

هذا الموضوع مغلق.

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