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

سؤال كيف ارجع رقم السجل الذي يتم اضافته بستور بروسيجر

مغلقمُجاب
بدأه ورق خسرانه في 13 أبريل 2013 · 36 رد · 3,090 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#26

 اخي العزيز انا اقوم بعمل موقع للعمل التطوعي وفيه جدول اسمعه Volunteer_base  وفي هذه الجدول فيه بيانات المستخدم

طبعاُ هذه الموقع يشمل الدول العربية بالكامل ... وقد طلب مني ان اقوم بعمل رقم العضوية للمتطوع + رمز يميز كل دولة .. وانا قمت بجعل الرقم التطوعي يبداء 101+ رمز الدولة لكل دولة .. يعني لو دخل اول مستخدم من اليمن فسيكون اول رقم عضوية لليمن 101YM ولو دخل يمني اخر سيكون رقم العضوية له هو 102YM .. وعند دخول اول متطوع من بلد اخر ونفرض سوريا سيكون رقمة التطوعي الاول 101SR والرجل الثاني سيكون رقم عضويته 102SR وهكذا ستكون الالية بحيث ان الرقم لن يتكرر ابداُ وبنفس الوقت سيكون رقم العضوية هو المفتاح الاساسي للجدول .. وكنت اريد ان عندما يوم المتطوع بالتسجيل ان يتم ارجاع رقم العضوية لانه يوجد بيانات اخرى كثيرة متعلقة بالمتطوع في جداول اخرى والشي الذي يربط بين الجداول الاخر هو رقم العضوية لانه مفتاح غير اساسي في الجداول الاخر .. انا طبعاُ طبقة منضور Max  عندي برمجتي للواجهة التسجيل .. لكني لم اقتنع بهذا الطريقة لاني في مخيلتي توقعت انه سيكون في تعارض اذا سجل اكثر من شخص بنفس الوقت وضغطو زر التسجيل ..

وقلت من الافضل اسئلكم اخواني الاعزاء حتى استفيد من خبرتكم السابقة .

ان شاء الله اكون وضحة لكم بشكل افضل 

#27

اولا يفضل كتابت التكود بالعكس هذا اكثر منقية اي يكون YM102 بدل من 102YM

ثانيا يمكن ان تكون جملة الاخال كاتي

insert into member (id,Country,memberName,Tel)
select 
	@Country+CAST ((isnull((select max(cast(replace(id,@Country,'') as int)) from member where Country=@Country),100)+1) AS NVARCHAR(10)),
	@Country,
	@memberName,
	@Tel

مجرد فكرة

1
#28

مشكور اخي على الرد .. ولكن لم افهم المغزى من الكود ياليت تشرح لي الكود 

ثانياً : اخي العزيز هنا يتم طلب Max  واعتقد انه بيكون في تعارض اذا كان في طلبان بنفس الوقت ؟ 

#29
اقتباس

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

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

 

 

 

 

اقتباس

ثانياً : اخي العزيز هنا يتم طلب Max  واعتقد انه بيكون في تعارض اذا كان في طلبان بنفس الوقت ؟

حتى تمنع مثل هذا التعارض يجب ان تسخدم transaction مع قفل مناسب

 

في البروسيجر استخدم الكود التالي طبعا من تغيير رقم السجل بحيث يتوافق مع ما تريد

 

 

begin tran
declare @maxId varchar(100)
select top 1 @maxId =   max(id)  from
 table1  
with(holdlock, updlock);

--  
insert into table1 .... values(@maxId......
 
commit tran
2
#30
ورق خسرانه كتب:

 اخي العزيز انا اقوم بعمل موقع للعمل التطوعي وفيه جدول اسمعه Volunteer_base  وفي هذه الجدول فيه بيانات المستخدم

طبعاُ هذه الموقع يشمل الدول العربية بالكامل ... وقد طلب مني ان اقوم بعمل رقم العضوية للمتطوع + رمز يميز كل دولة .. وانا قمت بجعل الرقم التطوعي يبداء 101+ رمز الدولة لكل دولة .. يعني لو دخل اول مستخدم من اليمن فسيكون اول رقم عضوية لليمن 101YM ولو دخل يمني اخر سيكون رقم العضوية له هو 102YM .. وعند دخول اول متطوع من بلد اخر ونفرض سوريا سيكون رقمة التطوعي الاول 101SR والرجل الثاني سيكون رقم عضويته 102SR وهكذا ستكون الالية بحيث ان الرقم لن يتكرر ابداُ وبنفس الوقت سيكون رقم العضوية هو المفتاح الاساسي للجدول .. وكنت اريد ان عندما يوم المتطوع بالتسجيل ان يتم ارجاع رقم العضوية لانه يوجد بيانات اخرى كثيرة متعلقة بالمتطوع في جداول اخرى والشي الذي يربط بين الجداول الاخر هو رقم العضوية لانه مفتاح غير اساسي في الجداول الاخر .. انا طبعاُ طبقة منضور Max  عندي برمجتي للواجهة التسجيل .. لكني لم اقتنع بهذا الطريقة لاني في مخيلتي توقعت انه سيكون في تعارض اذا سجل اكثر من شخص بنفس الوقت وضغطو زر التسجيل ..

وقلت من الافضل اسئلكم اخواني الاعزاء حتى استفيد من خبرتكم السابقة .

ان شاء الله اكون وضحة لكم بشكل افضل 

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

وأبدل العمود الأول بدلا من رقم إلى نص وأدرج عدة أسطر بعدد الدول وضع فيها رمز الدولة كمعرف

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

وعليه سيكون التعديل كما يلي :

 

USE [xxxxx]
GO

/****** Object:  Table [dbo].[TblLastTime]    Script Date: 2013/04/15 03:18:52 م ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TblLastID](
	[ID] [NVARCHAR](2) NOT NULL,
	[LastID] [NVARCHAR](20) NULL,
) ON [PRIMARY]

GO

INSERT INTO [dbo].[TblLastID]
           ([ID],[LastID])
     VALUES ('SA',''),
			('YM',''),
			('OM',''),
			('SY',''),
			('JO',''),
			('KW',''),
			('QA','')
GO

 

وبالنسبة للفنكشن

 

USE [xxxxx]
GO

/****** Object:  UserDefinedFunction [dbo].[GetLastTime]    Script Date: 2013/04/15 03:29:37 م ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date, ,>
-- Description:	<Description, ,>
-- =============================================
CREATE FUNCTION [dbo].[GetLastID] 
(
	@CountryID AS NVARCHAR(2)
)
RETURNS [NVARCHAR](20)
AS
BEGIN
	RETURN 
	(
		SELECT TOP 1 LastID
		FROM TblLastID
		WHERE ID = @CountryID
	)
END


GO

 

ولحفظ آخر تسلسل بعد توليده في البروسيدجر أضف :

 

	UPDATE dbo.TblLastID	SET LastID = ?????	WHERE ID = ##

حيث ## تضع مكانها رمز الدولة حتى يحفظ الرقم الجديد في السطر المناسب ضمن الجدول الوسيط

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

1

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

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

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

#31
TareqVB كتب:

 

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

 

 

 

بارك الله بك أخي طارق

ومنكم نستفيد إن شاء الله

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

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

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

#32
TareqVB كتب:

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

 

 

 

 

حتى تمنع مثل هذا التعارض يجب ان تسخدم transaction مع قفل مناسب

 

في البروسيجر استخدم الكود التالي طبعا من تغيير رقم السجل بحيث يتوافق مع ما تريد

 

 

begin tran
declare @maxId varchar(100)
select top 1 @maxId =   max(id)  from
 table1  
with(holdlock, updlock);

--  
insert into table1 .... values(@maxId......
 
commit tran

 

with(holdlock, updlock);

 

commit tran

اولاُ اخي العزيز مشكور على الرد

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

#33 أفضل إجابة

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

الطريقة تتم كمايلي :

1-اول واحد وصولا يأخذ الرقم الاكبر

2-يتم منع الآخرين من اخذ ارقام جديدة والانتظار حتى ينتهي الاول اما بنجاح او فشل .

3-عند انتهاء الاول يسمح للتالي بأخذ رقم جديد وهكذا.

 ملاحظة : هذا الامر يتم في اجزاء بسيطة من الثانية بالرغم من ذلك لاينصح به في حالات وجود حركات كبيرة على الجدول .

 

 

 

 

للتأكد من الامر نفذ الاستعلام  التالي في اكثر من شاشة في SSMS  وستجد ان الاستعلام الثاني لاينفذ حتى ينتهي الاول

 

 

 

begin tran
declare @maxId varchar(100)
select top 1 @maxId =   max(id)  from
 table
with(holdlock, updlock);
print @maxId
--  
-- wait for 10 second
WAITFOR DELAY '00:00:10'
 
commit tran
1
#34

 اخي طارق مشكور على ردك . لدي استفسار  اخي الغالي

هل لابد من اضع هذه  الكود 

 

WAITFOR DELAY '00:00:10'

 ام يكفي ان اضع كودي بين هذين السطرين 

 


begin tran
 
with(holdlock, updlock);



WAITFOR DELAY '00:00:10'
 
commit tran
#36
TareqVB كتب:

السلام عليكم

 

الكود  WAITFOR DELAY هو لتأخير التنفيذ ولتتحقق من عدم وجود تعارض ويجب عدم استخدامه فعليا .

  ويجب عد استخدامة فعلياُ ؟ ماذا تقصد بهذه اخي ؟ هل استخدمة ام لا لم تتضح لي الفكرة 

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

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

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

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

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

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