我在使用包含动态列的动态DataGridView设计表单时遇到问题。
想法是让DataGridView列和行以相同的行和列顺序显示公司的所有部门,以显示它们彼此发送的消息数量(从D1行到D2列),如果这很容易我修复了数据库表列。
但问题是,如果公司添加新部门,如何使用动态数据库表列和报告页面列来实现这个想法?
在这种情况下,我需要在数据库表和报告页面中添加一个新列
答案 0 :(得分:0)
实际上,您可以通过不同的方式存储数据,但只有区别在于您如何呈现数据。
在您的情况下,您希望以行方式列显示数据,您也可以在代码端设计。
重点是如何存储数据。
为此,您可以通过为部门及其相关消息创建“Department”和“DepartmentMessageDetails”的不同表格,以标准化形式存储数据。
或者您也可以将其以非规范化形式存储在单个表格中。
报告时。您可以使用动态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
在这个示例中,我使用了硬编码列名,但是如果我们编写动态查询也可以处理,我稍后会跳过它。