0

メニュー内のアイテムの順序を次または前のアイテムに置き換えることで、そのアイテムの順序を変更 (場所または順序を変更) したいとします。これを行うには、次のようなコードを使用します。

    DECLARE @SO tinyint --, @MenuID uniqueidentifier
    --SET @MenuID = (Select top 1 MenuID from MenuItems where MenuItemID = @ID)
    SET @SO = (Select top 1 SO from MenuItems where MenuItemID = @ID and MenuID = @MenuID)

    if @SO > 1
    begin
        UPDATE  dbo.MenuItems SET SO = @SO WHERE MenuItemID = (select top 1 MenuItemID from MenuItems WHERE SO = @SO - 1 and MenuID = @MenuID)
        UPDATE  dbo.MenuItems SET SO = @SO - 1 WHERE MenuItemID = @ID
    END

このコードは、毎回 1 回上下に移動するだけで問題なく動作します。2 つの質問があります。

  1. これを行うためのより良い解決策はありますか?
  2. 次のように、いくつかのアイテムを同時にいくつかのステップの上または下に移動したい場合はどうすればよいですか?

から:

> 1
> 2
    > 1
    > 2
    > 3
> 3
> 4
    > a
    > b
> 5

に:

> 1
> 2
    > 1
    > 2
    ? a
    ? 5
    > 3
> 3
> 4
    > b

ありがとう、カルド

4

1 に答える 1

1

次のような単一のクエリを使用して、任意の 2 つのエントリの順序を入れ替えることができます。

update dbo.MenuItems
  set SO = case
    when MenuItemId = @FirstId then ( select SO from dbo.MenuItems where MenuItemId = @SecondId )
    else ( select SO from dbo.MenuItems where MenuItemId = @FirstId ) end
  where MenuItemId in ( @Firstid, @SecondId )

ID のルックアップは、クエリの前に実行することも、クエリに埋め込むこともできます。

質問にテーブル スキーマが含まれていないため、クエリを少し調整する必要がある場合があります。それMenuItemIdはユニークだと思いましたが、あなたの投稿からは明らかではありません。

于 2013-04-14T23:13:27.160 に答える