* 代理店の備考が変更できない [#v806d98b]

- ページ: [[BT1]]
- 投稿者: [[小澤]!]
- 投稿者: [[小澤!]]
- 優先順位: 低
- 状態: 完了
- カテゴリー: 1次
- 投稿日: 2010-05-25 (火) 14:28:50
- バージョン: 

** メッセージ [#s62a59a8]
00148474 ビーワン東日本 大谷 敦洋様
--------
- 代理店情報の追加・修正時に親代理店との親子関係チェックを行っていますが、チェックに時間がかかり過ぎてしまう場合があるようです。 -- [[山下]] &new{2010-05-25 (火) 16:31:40};
----
-時間がかかっているチェックの内容
--現在および将来で、親代理店が対象の代理店傘下に存在しないかチェックする
-チェック方法
--修正前
---対象の代理店から子を辿っていって、その中に親代理店に指定されている代理店が含まれないかチェックする
---現在および将来
 WITH CTE(代理店ID, 代理店名1, 親代理店ID, 階層ID,LEVEL,SORT) 
 AS (
     SELECT  
         代理店ID
        ,代理店名1
        ,親代理店ID
        ,階層ID
        ,1 AS LEVEL
        ,RTRIM(SPACE(258)) + 親代理店ID AS SORT 
     FROM  
         M代理店子 
     WHERE 
         代理店ID = @代理店ID 
         AND M代理店子.有効開始日 <= @有効開始日 
         AND M代理店子.有効終了日 >= @有効開始日
     UNION ALL 
     SELECT 
         M代理店子.代理店ID 
        ,M代理店子.代理店名1 
        ,M代理店子.親代理店ID 
        ,M代理店子.階層ID 
        ,CTE.LEVEL + 1 
        ,CONVERT(varchar(268),RTRIM(CTE.SORT) +M代理店子.階層ID + M代理店子.代理店ID) 
     FROM 
	M理店子 WITH(INDEX(IX_親代理店)) 
        INNER JOIN CTE ON M代理店子.親代理店ID= CTE.代理店ID 
     WHERE 
        (M代理店子.有効開始日 <= @有効開始日 
         AND M代理店子.有効終了日 >= @有効開始日) 
        OR M代理店子.有効開始日 >= @有効開始日  --将来子になる代理店も含む 
 ) 
 SELECT * FROM CTE 
 WHERE 代理店ID = @親代理店ID 
--修正後
---親代理店に指定されている代理店から親を辿っていって、その中に対象の代理店が含まれていないかをチェックする
---現在および将来
 WITH CTE(代理店ID, 代理店名1, 親代理店ID, 階層ID, LEVEL,SORT, 有効開始日, 有効終了日) /* 期間で絞り込むために有効開始日と有効終了日を追加 */
 AS(
    SELECT 
        代理店ID
       ,代理店名1
       ,親代理店ID
       ,階層ID
       ,1 AS LEVEL
       ,RTRIM(SPACE(258)) + 親代理店ID AS SORT
       ,有効開始日
       ,有効終了日
    FROM 
        M代理店子
    WHERE
        代理店ID = @親代理店ID /* 親代理店に変更 */
        AND (
            (M代理店子.有効開始日 <= @有効開始日
             AND M代理店子.有効終了日 >= @有効開始日)
            OR M代理店子.有効開始日 >= @有効開始日) --未来も対象に含む 
    UNION ALL
        SELECT
            M代理店子.代理店ID
           ,M代理店子.代理店名1
           ,M代理店子.親代理店ID
           ,M代理店子.階層ID
           ,CTE.LEVEL + 1
           ,CONVERT(varchar(268),RTRIM(CTE.SORT) +M代理店子.階層ID + M代理店子.代理店ID)
           ,CASE WHEN M代理店子.有効開始日 > CTE.有効開始日 THEN M代理店子.有効開始日 ELSE CTE.有効開始日 END AS 有効開始日
           ,CASE WHEN M代理店子.有効終了日 < CTE.有効終了日 THEN M代理店子.有効終了日 ELSE CTE.有効終了日 END AS 有効終了日
        FROM
            M代理店子 WITH(INDEX(IX_親代理店))
            INNER JOIN CTE ON M代理店子.代理店ID = CTE.親代理店ID /* 親を辿るように変更 */
        WHERE
            M代理店子.代理店ID <> @無効代理店ID
            AND M代理店子.代理店ID <> @本社代理店ID
            AND NOT (
                M代理店子.有効終了日 < CTE.有効開始日
                OR M代理店子.有効開始日 > CTE.有効終了日) /* 期間内に有効であるための条件 */
 )
 SELECT * FROM CTE
 WHERE 代理店ID = @代理店ID /* 対象代理店に変更 */
&ref(チェック方法変更.png);
----
- 本サイト更新確認しました。[完了]とします。 -- [[西川]] &new{2010-05-27 (木) 09:56:34};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS