2017-05-09 2 views
2

Ich bin gebeten worden, eine vb.net WinForms-Anwendung zu erstellen, die die Erstellung dieser Tabelle automatisiert:Was ist der richtige Weg, um ein Formular mit mehreren Datenfeldern zu füllen?

enter image description here

Offensichtlich ist, dass die Tabelle manuell erstellen eine Rück Aufgabe zu brechen.

Ich bin sehr komfortabel schreiben SQL, um jedes einzelne Datenfeld zu ziehen, aber ich muss glauben, dass es einen besseren Weg gibt. Solch eine Methode würde 144 Abfragen erfordern !!

Ich habe überlegt, ein Formular mit individuellen Beschriftungen für jedes Feld zu erstellen oder eine Gridview zu verwenden. Entweder wäre das für den Endbenutzer akzeptabel, aber ich bin mir nicht sicher, wie ich eine Abfrage schreiben würde, um ein Dataset zu erzeugen, das sowieso wie das Endprodukt aussieht.

Ich fordere niemanden auf, irgendeinen Code für mich zu schreiben, mit dem ich um Hilfe breche ist das Konzept, wie ich diese Aufgabe angehen sollte.

Hier ist eine Abfrage, die ich schrieb, die die Felder für Business Unit # 1 für die erste Woche in der Tabelle zurückgibt. Ich denke nicht, dass es viel hilft, aber ich füge es hinzu, um zu zeigen, dass ich mich etwas anstrengen muss.

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` 

Danke für irgendwelche Ideen.

+0

Ein Gedanke ist, dynamisches SQL zu verwenden, um ein Datagrid im Wesentlichen zu füllen und dieses Datagrid in der Gridview anzuzeigen. Sie müssten dynamic sql verwenden, damit jede Spalte ihr eigenes Datum hat, das Sie benötigen. Dies würde sich jeden Monat ändern. Dies wäre die geringste Benutzereingabe. – logixologist

+0

Ich sehe die Frage wurde abgelehnt. Lassen Sie mich wissen, was ich sonst noch zur Verfügung stellen kann, um die Frage besser zu machen, und ich werde gerne dazu beitragen. – user3511334

+0

Wenn ich die dynamische SQL-Idee verfolgen, könnte ich eine temporäre Tabelle mit 12 Spalten erstellen. Dann könnte ich SQL erstellen, um eine Reihe von Daten auszuwählen und diese in die temporäre Tabelle einzufügen, dann eine Reihe von Kreditnummern erstellen und diese in die temporäre Tabelle usw. einfügen. Das Ergebnis wäre eine vollständige Datenmenge, die an ein Gitter gebunden werden könnte . – user3511334

Antwort

1

Eine Möglichkeit, dies zu erreichen:

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)) 

Dann könnten Sie eine Zeile einfügen Daten jeder Spalte angezeigt wird

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

Dann würden Sie die Daten für jede Position in den Zeilen einfügen.

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

Vielen Dank für Ihre Hilfe, jetzt habe ich einen Plan. – user3511334

2

Ich würde eine Pivot statt mehrere Abfragen tun. Aber ich denke, Sie sollten sich selbst oder den Endbenutzer fragen: "Möchten Sie wirklich einen alternden Bericht nach Datum als Spalten sehen?" Wenn ja, füge ich jedes Mal, wenn der Bericht ein anderes Inkrement erstellt, manuell eine hinzu. Hier ist ein selbstextrahierendes Beispiel FYI. Der erste Satz zeigt meine Daten nur dort an, wo ich einen Benutzer, eine Abteilung, zu der er gehört, und seinen letzten Zugriff mockte. Dann tue ich so, als ob ich einen Bericht über das Altern haben möchte, um zu sehen, wie viele Menschen insgesamt und von jeder fiktiven Abteilung auf das System zugreifen. Das Ausführen mehrerer Abfragen in SQL ist teuer und kann oft durch ein wenig Know-how von Pivots, Unionen und das kreative Halten Ihrer Daten mit SQL gemildert werden.

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 
Verwandte Themen