2017-01-20 7 views
-1

動的な列を含む動的なDataGridViewでフォームを設計する際に問題があります。SQL Serverデータベースに動的列を作成してVB.NETをレポートする方法は?

アイデアは、DataGridViewの列と行が、行と列の同じ順序で会社のすべての部門を表示して、(D1行からD2列に)互いに送信したメッセージの数を示しています。これは簡単でした私はデータベーステーブルの列を修正した場合。

しかし、問題は、新しい部門を追加した場合、動的データベーステーブルの列とページの列を再配置することでどうすればいいですか?私はdatabseテーブルに新しい列を追加する必要があり、その場合には

とレポートページ

image image of tables i made

答えて

0

実は、そこにデータを保存することができ、さまざまな方法がありますが、唯一の違いは、あなたがそれを提示する方法です。

あなたの場合は、コード側でも設計できる行別の列にデータを表示する必要があります。

重要な点はデータの保存方法です。

このため、部門とその関連メッセージの異なるテーブルを "Department"と "DepartmentMessageDetails"とすることで、正規化された形式でデータを格納できます。

また、非正規化形式で1つのテーブルに格納することもできます。

レポート作成中。動的SQLスクリプトを使用して、ストアド・プロシージャを作成し、そこでテーブルを設計することができます。

サンプル:私はハードコーディングされたカラム名を使用していたが、我々は、私は後でスキップした動的なクエリを書く場合はこれも処理することができ、このサンプルで

DECLARE @Department TABLE 
(
    DNAM NVARCHAR(100), 
    DNO INT 
) 
INSERT INTO @Department 
     (DNAM, DNO) 
VALUES (N'D1', 1), 
     (N'D2', 2), 
     (N'D3', 3) 

DECLARE @Message TABLE 
(
    DNO INT, 
    [D1] NVARCHAR(100), 
    [D2] NVARCHAR(100), 
    [D3] NVARCHAR(100) 
) 
INSERT INTO @Message 
     (DNO, D1, D2, D3) 
VALUES (1, N'T1_D1', N'T1_D2', N'T1_D3')--, (1, N'Test3 D2') 
     ,(1, N'', N'Test1 D1', N'') 
     ,(1, N'T1_D1', N'', N'') 
     ,(1, N'', N'T1_D2', N'') 
     ,(1, N'', N'', N'T1_D3') 
     ,(1, N'', N'', N'T1_D3') 

     ,(2, N'T2_D1', N'T2_D2', N'T2_D3')--, (2, N'Test3 D2') 
     ,(2, N'T2_D1', N'', N'') 
     ,(2, N'', N'T2_D2', N'') 
     ,(2, N'', N'', N'T2_D3') 
     ,(2, N'', N'', N'T2_D3') 
     ,(2, N'', N'', N'T2_D3') 

     ,(3, N'T3_D1', N'T3_D2', N'T3_D3')--, (3, N'Test3 D3') 
     ,(3, N'T3_D1', N'', N'') 
     ,(3, N'', N'T3_D2', N'') 
     ,(3, N'', N'', N'T3_D3') 

SELECT * FROM @Department 
SELECT * FROM @Message 

;WITH T AS 
(
    SELECT DISTINCT 
     (CASE WHEN DNO = 1 THEN 'D1' 
      WHEN DNO = 2 THEN 'D2' 
      WHEN DNO = 3 THEN 'D3' 
     END) AS Names 
     , DNO 
    FROM 
     @Message  
) 
SELECT 
    T1.Names , 
    (CASE 
     WHEN T1.Names = 'D1' THEN -1 
     WHEN T1.Names = 'D2' THEN (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 1) AND (ISNULL(M.D2, '') <> '')) 
     ELSE (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 1) AND (ISNULL(M.D3, '') <> '')) 
    END) AS D1 , 
    (CASE WHEN T1.Names = 'D2' THEN -1 
     WHEN T1.Names = 'D1' THEN (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 2) AND (ISNULL(M.D1, '') <> '')) 
     ELSE (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 2) AND (ISNULL(M.D3, '') <> '')) 
    END) AS D2 , 
    (CASE WHEN T1.Names = 'D3' THEN -1 
     WHEN T1.Names = 'D2' THEN (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 3) AND (ISNULL(M.D2, '') <> '')) 
     ELSE (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 3) AND (ISNULL(M.D1, '') <> '')) 
    END) AS D3 
FROM T T1 

+0

あなたの助けを借りていますが、SQLスクリプト – afreeman

+0

について説明することができます。実際には、あなたの説明された条件に関して私の答えを更新し、サンプルを追加しました。 SQLスクリプトを報告するために、より良いオプションがあります。私は、単純なSQLスクリプトを使用するだけで、動的SQLを使用せずに同様のレポートを作成しました。これがあなたを助けることを願っています。 –

関連する問題