سوال درخصوص ایجاد دستور sql

m1pfard

Member
سلام. فرض کنیم یه جدول داریم که دو 3 تا فیلد داره (ID, Name, SortOrder).
ID که AutoNumber هست.
Name هم که معلومه. SortOrder هم یه Int هست که ترتیب فیلد رو مشخص می کنه.
کاربر هنگام وارد کردن نام، این فیلد خود به خود بیشترین مقدار رو بر می داره. (در لیست در آخرین محل قرار میگیره).
حالا کاربر با کلیک بر روی کلیدهای Up و Down (که ما تو برنامه تعریف کردیم) می تونه ترتیب رو عوض کنه.
روشی که به نظر خودم رسید این بود که مقدار فیلد های رکورد N و N+1 رو با هم عوض کنه. حالا برای اینکار چه دستور SQL ی باید نوشت.
یه نکته دیگه، اگه رکورد شماره x حذف شد، چطور فیلد رکوردهای پس از اونو رو یه جا تغییر بدیم؟
ممنون میشم از کمکتون.
 

m1pfard

Member
خسته نباشی!!!!
قربان منظور من این بود که Update کن (یعنی Change) کن مقدار فیلدSortOrder از رکورد N رو با رکورد N+1
و همچنین تو یه تابع دیگه Update کن تمام فیلدهای پس از رکورد N ام.
اونم تو یه StoredProc وگرنه خودم هم می دونستم باید Update بشه!!!!!!!
من یه همچین چیزی پیدا کردم ولی خوب ازش سر در نیاوردم:
کد:
/****** Object:  Stored Procedure dbo.dq_MoveDownSortOrder    Script Date: 11/13/2004 5:20:58 PM ******/
CREATE PROCEDURE dq_MoveDownSortOrder
(
	@DynamicQuestionID		int
)
 AS

DECLARE @SortOrder int, @CustomerTypeID int

-- Get the SortOrder and CustomerTypeID of the guy to "move up"
SELECT @SortOrder = SortOrder, @CustomerTypeID = CustomerTypeID
FROM dq_DynamicQuestions 
WHERE DynamicQuestionID = @DynamicQuestionID

-- See if there exists a guy above him
IF EXISTS(SELECT 1 FROM dq_DynamicQuestions WHERE SortOrder > @SortOrder AND CustomerTypeID = @CustomerTypeID)
BEGIN
	-- Update the current item's SortOrder
	UPDATE dq_DynamicQuestions SET 
		SortOrder = (SELECT MIN(SortOrder)
				FROM dq_DynamicQuestions WHERE SortOrder > @SortOrder AND CustomerTypeID = @CustomerTypeID) 
	WHERE DynamicQuestionID = @DynamicQuestionID

	-- Update the guy whose being swapped
	UPDATE dq_DynamicQuestions SET 
		SortOrder = @SortOrder 
	WHERE SortOrder = (SELECT MIN(SortOrder) 
				FROM dq_DynamicQuestions WHERE SortOrder > @SortOrder AND CustomerTypeID = @CustomerTypeID) 
			AND DynamicQuestionID <> @DynamicQuestionID AND CustomerTypeID = @CustomerTypeID
END
GO
 

tarhebartar

Member
خسته نباشی!!!!
قربان منظور من این بود که update کن (یعنی change) کن مقدار فیلدsortorder از رکورد n رو با رکورد n+1
و همچنین تو یه تابع دیگه update کن تمام فیلدهای پس از رکورد n ام.
اونم تو یه storedproc وگرنه خودم هم می دونستم باید update بشه!!!!!!!
من یه همچین چیزی پیدا کردم ولی خوب ازش سر در نیاوردم:

سلامت باشی سرگین جان !

اصلا به شما ذلیل ها خوبی نیومده
 

MDP

Well-Known Member
کاربر tarhebartar به مدت 1 ماه بن شدند!:snap:

مهدی جان اگه می خوای سرت بشه من یه جا خوندم که از یه فیلد جدا باید استفاده بشه!

من هنوزم کاری که می خوای بکنی رو متوجه نشدم!یه ذره بیشتر توضیح می دی؟:cry:
 

m1pfard

Member
ممنون از لطفت.
ببین من یه امکان می خوام به کاربر بدم تا خودش اخبار و یا محصولاتی رو که می خواد در صفحه اول نمایش داده بشه رو انتخاب و مرتب کنه. که البته این مشخص کردن ترتیب براشون خیلی مهمه. من برا این کار یه table درست کردم به اسم HomePagePro که 3 سه تا فیلد داره. ID, ProductID, SortOrder که با انتخاب هر محصول و ترتیب اون این مقادیر در این جدول ذخیره میشن (ProductID مربوط به جدول Produc هستش).
نظر من این بود که محصولات تو یه لیست باکس نمایش داده بشه با دو تا کلید.
یکی UP و یکی دیگه Down که کاربر با کلیک رو هر کدوم بتونه ترتیب محصولات رو عوض کنه.
-----------------------------------------
تا اینجا صورت مسئله بود

حالا اگه لطف کنین و راهنمایی کنین چجوری پیاده سازی بشه؟
من خودم فکر می کردم مثلا یه StoredProc بسازم تا با کلیک بر روی UP مقدار فیلد SortOrder فیلد انتخابی با فیلد بالا رو عوض کنه. و با Down هم همینطور.
ولی نمی دونم تو یه دستور چطور میشه مقادیر فیلدهای دو رکورد پشت سر هم رو عوض کرد.
مشکل دیگم هم وقتیه که مثلا رکورد 3 رو از این جدول حذف کردیم. چطور میشه مقدار رکورد 4 به بعد رو تغییر داد؟ (چون ترتیب فرق کرده!)
با تشکر
 

MDP

Well-Known Member

Got It!!!

ببین مهدی جان شما اگه بخوای کدت بهینه باشه نباید از این روش استفاده کنی!اصلا اگه تو سایتت 10 نا یوزر داشته باشه با این 3 تا فیلد نمی تونی کاری از پیش ببری!فیلد 4 روم که UserID باشه هم بازم داری که البته اون مهم نیست!خودت ماشالا استاد منی!:rose:


اگه بخوای از لیست باکس استفاده کنی باید اسم محصولات رو توی خاصیت Text بدی و SortOrder رو توی Value این جوری وقتی کلیک بشه می تونی SortOrder رو با هم عوض کنی!البته قبلش باید حتما لیستت رو بر اساس SortOrder مرتب کنی که که کاری نداره:

PHP:
...orderby SortOrder DESC

پیشنهاد می کنم از Ajax استفاده کنی!یه WebService تعریف کن که دو تا مقدار میگیره:

1 - شماره محصول اول
2 - شماره محصول دوم

این دوتا وقتی مقدار دهی بشن میتونی با یه SP مثل اینی که پایینه مقدار SortOrder رو عوض کنی!

اینم از نمونه:

PHP:
CREATE PROCEDURE Change
	(
	@ProductID1  int,
	@ProductID2 int
	)
AS
Declare @SO1,@SO2  int
GO
Select @SO1 = SortOrder From HomePro Where ProductID = @ProductID1
Select @SO2 = SortOrder From HomePro Where ProductID = @ProductID2

Update HomePro set SortOrder = @SO2 where ProductID=@ProductID1
Update HomePro set SortOrder = @SO1 where ProductID=@ProductID2

این SP میاد SortOrder محصولی که اول وارد میشه رو با ورودی دوم عوض میکنه!

امید وارم این دفعه درست فهمیده باشم!:neutral:
 

m1pfard

Member
:oops:
ممنون از لطفتون. و دستتون درد نکنه. این قسمت Select @SO1 =همه چی رو حل میکنه. خوب بیسوادی این چیزا رو هم داره دیگه مارو با خودتون مقایسه نفرمایین استاد.
 
  • Like
Reactions: MDP

جدیدترین ارسال ها

بالا