2017-05-09 36 views
2

我一直要求创建一个vb.net WinForms应用程序,它可以自动此电子表格的创建:用多个数据字段填充表单的正确方法是什么?

enter image description here

显然,手动创建电子表格是一个回破的任务。

我很乐于编写SQL来拉取每个单独的数据字段,但是我必须相信有更好的方法。这样的方法将需要144个查询!

我曾考虑过为每个字段或使用gridview创建一个带有单独标签的表单。最终用户都可以接受,但我真的不确定我会如何编写查询来生成看起来像最终产品的数据集。

我不是要求任何人为我写任何代码,我要求的是我应该如何攻击这个任务的概念。

这是我写的一个查询,它返回电子表格第一周业务单元#1的字段。我认为这不是很有帮助,但是我将其添加以表明我已经为此付出了一些努力。

DECLARE @WeekEnding AS DATE 
DECLARE @DIV AS INT 

SET @WeekEnding = '11/13/2015' 
SET @DIV = 20 

-- A/R downpayments OPCH 
SELECT 
SUM(OPCH.DocTotal - OPCH.VatSum - OPCH.TotalExpns) AS 'ARDownPaymentInvoice' 

FROM OPCH 
LEFT JOIN INV1 ON OPCH.DocEntry = INV1.DocEntry AND INV1.VisOrder = 0 
LEFT JOIN OITM ON INV1.ItemCode = OITM.ItemCode 
LEFT JOIN OITB ON OITM.ItmsGrpCod = OITB.ItmsGrpCod 
LEFT JOIN OACT AS CurrCode (NOLOCK) ON OITB.RevenuesAc = CurrCode.AcctCode 

WHERE DATEPART(WEEK, OPCH.DocDate) = DATEPART(WEEK, @WeekEnding) AND YEAR(OPCH.DocDate) = YEAR(@WeekEnding) 
AND CurrCode.Segment_4 = @DIV 


-- Credits ORIN 
SELECT 
SUM(ORIN.DocTotal - ORIN.VatSum - ORIN.TotalExpns) * -1 AS 'Credit' 

FROM ORIN 
LEFT JOIN INV1 ON ORIN.DocEntry = INV1.DocEntry AND INV1.VisOrder = 0 
LEFT JOIN OITM ON INV1.ItemCode = OITM.ItemCode 
LEFT JOIN OITB ON OITM.ItmsGrpCod = OITB.ItmsGrpCod 
LEFT JOIN OACT AS CurrCode (NOLOCK) ON OITB.RevenuesAc = CurrCode.AcctCode 

WHERE DATEPART(WEEK, ORIN.DocDate) = DATEPART(WEEK, @WeekEnding) AND YEAR(ORIN.DocDate) = YEAR(@WeekEnding) 
AND CurrCode.Segment_4 = @DIV 

--Invoices 
SELECT 
SUM(OINV.DocTotal - OINV.VatSum - OINV.TotalExpns) AS 'Invoice' 

FROM OINV 
LEFT JOIN INV1 ON OINV.DocEntry = INV1.DocEntry AND INV1.VisOrder = 0 
LEFT JOIN OITM ON INV1.ItemCode = OITM.ItemCode 
LEFT JOIN OITB ON OITM.ItmsGrpCod = OITB.ItmsGrpCod 
LEFT JOIN OACT AS CurrCode (NOLOCK) ON OITB.RevenuesAc = CurrCode.AcctCode 

WHERE DATEPART(WEEK, OINV.DocDate) = DATEPART(WEEK, @WeekEnding) AND YEAR(OINV.DocDate) = YEAR(@WeekEnding) 
AND CurrCode.Segment_4 = @DIV` 

感谢您的任何想法。实现这一

+0

一个想法是使用动态SQL实质上填充一个数据网格,并在gridview中显示该数据网格。您需要使用动态sql,因此每个列都是您自己需要的日期。这会每个月都会改变。这将是最少的用户输入。 – logixologist

+0

我看到这个问题已经下了投票。让我知道还有什么可以提供更好的问题,我会很乐意。 – user3511334

+0

如果我追求动态SQL想法,我可以创建一个包含12列的临时表。然后,我可以创建SQL来选择一行日期并将其插入临时表中,然后创建一行信用数字并将其插入临时表等等。结果将是可以绑定到网格的完整数据集。 – user3511334

回答

1

方式一:

CREATE TABLE #tmpData 
(column1 varchar(50), 
column2 varchar(50), 
column3 varchar(50), 
column4 varchar(50), 
column5 varchar(50), 
column6 varchar(50), 
column7 varchar(50), 
column8 varchar(50), 
column9 varchar(50), 
column10 varchar(50), 
column11 varchar(50), 
column12 varchar(50)) 

然后你可以将行显示每列

INSERT INTO #tmpData 
    --Write your select query here for filling in all the dates 

的日期,那么你会插入数据为行中的每个行项目。

INSERT INTO #tmpdata 
SELECT 'Business Unit 1', 
-- insert remaining column data here 
+0

谢谢你的帮助,现在我有一个计划。 – user3511334

2

我会做一个数据透视表而不是做多个查询。不过,我认为你应该问问你自己或最终用户:“你真的想按日期查看老化的报告吗?”如果是这样,我每次报告年龄增加时手动添加一个?这是一个自我提取的示例FYI。第一套只是在模拟用户,他们所属的部门以及他们上次访问时显示我的数据。然后我假装我想要一个老化的报告,看看有多少人总共访问系统,以及每个虚构的部门。在SQL中执行多个查询是昂贵的,并且通常可以通过一些知道枢轴,联合和SQL创造性地保存数据来缓解。

DECLARE @Example TABLE (PersonId INT IDENTITY, PersonName VARCHAR(128), DepartmentName VARCHAR(128), AccessedOn Date); 

INSERT INTO @Example (PersonName, DepartmentName, AccessedOn) VALUES ('Brett', 'Dev', '1-1-2017'), ('John', 'Dev', '1-6-2017'), ('Mark', 'Dev', '1-8-2017'), ('Shawn', 'Ops', '1-15-2017'), ('Ryan', 'Ops', '1-16-2017'), ('Kevin', 'Ops', '1-21-2017'); 

--Data as is 
SELECT * 
From @Example 

--I would use Date By row as it is far easier to maintain 
SELECT 
    DATEADD(WEEK, DATEDIFF(WEEK, 0, AccessedOn), 0) AS Grouping 
, COUNT(PersonId) AS PeopleAccessedAtTime 
, SUM(CASE WHEN DepartmentName = 'Dev' THEN 1 ELSE 0 END) AS DevCounts 
, SUM(CASE WHEN DepartmentName = 'Ops' THEN 1 ELSE 0 END) AS OpsCounts 
FROM @Example 
GROUP BY DATEADD(WEEK, DATEDIFF(WEEK, 0, AccessedOn), 0) 

--Aging Report you are asking for trouble as you need to manually pivot ELSE go down the road of doing dynamic sql to do a pivot which is No Bueno 
; WITH x AS 
    (
    SELECT 
    DATEADD(WEEK, DATEDIFF(WEEK, 0, AccessedOn), 0) AS Grouping 
    , COUNT(PersonId) AS PeopleAccessedAtTime 
    , SUM(CASE WHEN DepartmentName = 'Dev' THEN 1 ELSE 0 END) AS DevCounts 
    , SUM(CASE WHEN DepartmentName = 'Ops' THEN 1 ELSE 0 END) AS OpsCounts 
    FROM @Example 
    GROUP BY DATEADD(WEEK, DATEDIFF(WEEK, 0, AccessedOn), 0) 
) 
Select 
    'PeopleAccessed' AS Header 
, MAX([2017-01-02]) AS [2017-01-02] 
, Max([2017-01-09]) AS [2017-01-09] 
, Max([2017-01-16]) AS [2017-01-16] 
From x 
    PIVOT(MAX(PeopleAccessedAtTime) FOR Grouping IN ([2017-01-02], [2017-01-09], [2017-01-16])) AS pvt 
UNION 
Select 
    'DevDivisionAccessed' 
, MAX([2017-01-02]) AS [2017-01-02] 
, Max([2017-01-09]) AS [2017-01-09] 
, Max([2017-01-16]) AS [2017-01-16] 
From x 
    PIVOT(MAX(DevCounts) FOR Grouping IN ([2017-01-02], [2017-01-09], [2017-01-16])) AS pvt 
UNION 
Select 
    'OpsDivisionAccessed' 
, MAX([2017-01-02]) AS [2017-01-02] 
, Max([2017-01-09]) AS [2017-01-09] 
, Max([2017-01-16]) AS [2017-01-16] 
From x 
    PIVOT(MAX(OpsCounts) FOR Grouping IN ([2017-01-02], [2017-01-09], [2017-01-16])) AS pvt 
相关问题