使用多个数据字段填充表单的正确方法是什么?

时间:2017-05-09 15:05:26

标签: vb.net winforms tsql

我被要求创建一个自动创建此电子表格的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`

感谢任何想法。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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