2017-05-09 5 views
2

私は、このスプレッドシートの作成を自動化するvb.netのWinFormsのアプリケーションを作成するよう求めてきた:明らかにフォームに複数のデータフィールドを入力する適切な方法は何ですか?

enter image description here

、スプレッドシートを手動でタスクを壊すバックであることを作成します。

私は非常にデータの個々のフィールドを引き出すためにSQLを書くのが楽ですが、もっと良い方法があると信じています。そのような方法は144の質問を必要とするでしょう!

フィールドごとに個別のラベルを持つフォームを作成するか、またはグリッドビューを使用すると考えました。どちらもエンドユーザーにとって受け入れられるだろうが、とにかく最終製品のように見えるデータセットを作成するためにどのようにクエリを書くかは分からない。

私は誰にもコードを書く必要はありません。私が助けを求めているのは、このタスクをどのように攻撃すべきかという概念です。

ここでは、スプレッドシートの最初の週のビジネスユニット#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列の一時テーブルを作成することができます。次に、日付の行を選択してtempテーブルに挿入し、クレジット番号の行を作成してtempテーブルなどに挿入する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 
関連する問題