Benutzer mit den meisten Antworten
Werte einer Woche zusammen rechnen und abspeichern

Frage
-
Hallo
ich stehe vor folgendem Problem:
Ich habe ein Tool das ich in VB.net schreibe/erstelle. Dort ist nun ein DataGridView enthalten worin ich 3 Werte als User eingebe, eine Spalte darunter heisst "Dauer". Wenn ich nun alle 3 Spalten ausfülle in der Reihe wo ich mich gerade befinde wird eine Speichern Prozedure aufgerufen die diese Werte an die jeweilige Tabelle in meine SQL Datenbank speichert.
Ich möchte nun die Dauer-Werte auf der Woche worin ich mich gerade im Programm befinde berrechnen und als HH:MM ausgeben.
Die zuordnung zu bei welchem benutzer dies angezeigt wird wollte ich in VB regeln.
Ich weiss jedoch nicht wie ich dies in SQL vollbringen kann. Habe schon einiges probiert und auch google hilft nicht weiter.
In meiner Haupttabelle befinden sich die folgenden Spalten:
ID, Benutzer, Tätigkeit, Datum, Dauer, Gesamt, Abteilung
Oder brauche ich eine eigene Tabelle namens Gesamt, worin ich dann die jeweilige zuordnung habe für Benutzer, Datum Dauer und Gesamt ?
Vielen Dank
Patrick
- Typ geändert Raul TalmaciuMicrosoft contingent staff Freitag, 30. Mai 2014 08:10 Warten auf Feedback
- Typ geändert LandsHeer Dienstag, 3. Juni 2014 12:34
Antworten
-
Hallo Patrick, ich könnte mir etwas in dieser Art vorstellen:
CREATE TABLE #Ausbildungsheft( [ID] [int] IDENTITY(1,1) NOT NULL, [Benutzer] [nchar](20) NULL, [Tätigkeit] [nchar](55) NULL, [Datum] [date] NULL, [Dauer] [int] NULL, [Gesamt] [int] NULL, [Abteilung] [nvarchar](50) NULL, CONSTRAINT [PK_Ausbildungsheft] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO INSERT INTO #Ausbildungsheft([Benutzer],[Tätigkeit],[Datum] ,[Dauer], [Abteilung]) VALUES ('TestUser','testen' , '20140602', 120, 'IT'); INSERT INTO #Ausbildungsheft([Benutzer],[Tätigkeit],[Datum] ,[Dauer], [Abteilung]) VALUES ('TestUser','testen2', '20140603', 45, 'IT'); INSERT INTO #Ausbildungsheft([Benutzer],[Tätigkeit],[Datum] ,[Dauer], [Abteilung]) VALUES ('TestUser','testen3', '20140611', 30, 'IT'); With Vorselektion as ( Select Benutzer, Sum(Dauer) as Minuten from #Ausbildungsheft -- where Datum between '20140602' and '20140608' -- where Datum = '20140611' where DATEPART(ISO_WEEK, Datum) = 23 group by Benutzer ) Select Benutzer, case when Minuten > 59 then Substring(convert( varchar(20), Dateadd(MINUTE, Minuten, '20000101'), 108), 1, 5) else cast(Minuten as varchar(20)) end as Dauer_String from Vorselektion;
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu- Als Antwort markiert Stefan FalzModerator Dienstag, 27. Januar 2015 17:16
Alle Antworten
-
Hallo Patrick,
poste bitte mal die Tabellenstruktur als CREATE TABLE Statement, einige Beispieldaten (wenn machbar als INSERT INTO Statement) und dann das gewünschte Ergebnis der Abfrage, basierend auf den Beispieldaten.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
USE [Ausbildungheft] GO /****** Object: Table [dbo].[Ausbildungsheft] Script Date: 02.06.2014 11:12:40 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Ausbildungsheft]( [ID] [int] IDENTITY(1,1) NOT NULL, [Benutzer] [nchar](20) NULL, [Tätigkeit] [nchar](55) NULL, [Datum] [date] NULL, [Dauer] [int] NULL, [Gesamt] [int] NULL, [Abteilung] [nvarchar](50) NULL, CONSTRAINT [PK_Ausbildungsheft] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
INSERT INTO [dbo].[Ausbildungsheft]([Benutzer],[Tätigkeit],[Datum] ,[Dauer], [Abteilung])
VALUES (TestUser,testen, 02.06.2014, 120, IT);INSERT INTO [dbo].[Ausbildungsheft]([Benutzer],[Tätigkeit],[Datum] ,[Dauer], [Abteilung])
VALUES (TestUser,testen2, 03.06.2014, 45, IT);INSERT INTO [dbo].[Ausbildungsheft]([Benutzer],[Tätigkeit],[Datum] ,[Dauer], [Abteilung])
VALUES (TestUser, testen3, 11.06.2014, 30, IT);In meiner VB Maske sollte dann in dem Feld Gesamt für die gerade selektierte Woche bzw den gerade selektierten Tag die Gesamtzeit stehen die aus der Dauer berechnet wird.
Dauer wird in Minuten berechnet aber soll dann in Stunden umgerechnet werden wenn es denn über einer Stunde ist, ansonsten in minuten anzeigen.
zb. für den 02.06.2014 Gesamt = 02:00 h (120 min)
zb. für die Woche 02.06 - 06.06 = 02:45 h (165 min)
Vielen Dank für die Hilfe. Ich hoffe ich konnte es einigermaßen zeigen was ich erreichen will :)
Grüße, Patrick
-
Hallo Patrick, ich könnte mir etwas in dieser Art vorstellen:
CREATE TABLE #Ausbildungsheft( [ID] [int] IDENTITY(1,1) NOT NULL, [Benutzer] [nchar](20) NULL, [Tätigkeit] [nchar](55) NULL, [Datum] [date] NULL, [Dauer] [int] NULL, [Gesamt] [int] NULL, [Abteilung] [nvarchar](50) NULL, CONSTRAINT [PK_Ausbildungsheft] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO INSERT INTO #Ausbildungsheft([Benutzer],[Tätigkeit],[Datum] ,[Dauer], [Abteilung]) VALUES ('TestUser','testen' , '20140602', 120, 'IT'); INSERT INTO #Ausbildungsheft([Benutzer],[Tätigkeit],[Datum] ,[Dauer], [Abteilung]) VALUES ('TestUser','testen2', '20140603', 45, 'IT'); INSERT INTO #Ausbildungsheft([Benutzer],[Tätigkeit],[Datum] ,[Dauer], [Abteilung]) VALUES ('TestUser','testen3', '20140611', 30, 'IT'); With Vorselektion as ( Select Benutzer, Sum(Dauer) as Minuten from #Ausbildungsheft -- where Datum between '20140602' and '20140608' -- where Datum = '20140611' where DATEPART(ISO_WEEK, Datum) = 23 group by Benutzer ) Select Benutzer, case when Minuten > 59 then Substring(convert( varchar(20), Dateadd(MINUTE, Minuten, '20000101'), 108), 1, 5) else cast(Minuten as varchar(20)) end as Dauer_String from Vorselektion;
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu- Als Antwort markiert Stefan FalzModerator Dienstag, 27. Januar 2015 17:16
-
Vielen Dank für die tolle Hilfe schonmal.
Allerdings weiss ich gerade nicht so recht wie oder wo dort der Wert den ich brauche gespeichert wird sodass ich diese Variable dann in VB.net auslesen und und in meinem Frontend anzeigen kann :S
Ich habe daraus eine Prozedur gemacht. Sodass ich diese bei jedem RowLeave event in meinem DatagridView aufrufen kann und der Gesamtwert gegebenfalls aktualisiert wird.
USE [Ausbildungheft]
GO
/****** Object: StoredProcedure [dbo].[PD_TBLAusbildungsheft_GesamtzeitRechner] Script Date: 03.06.2014 09:03:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- ================================================
--
-- Author: <Patrick,,Voelz>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[PD_TBLAusbildungsheft_GesamtzeitRechner]
-- Deklerationsteil für zu übergebende Werte
AS
BEGIN
-- Interne Variablen dekleration
-- Eigentlicher code
With Vorselektion as
(
Select Benutzer, Sum(Dauer) as Minuten
from Ausbildungsheft
-- where Datum between '20140602' and '20140608'
-- where Datum = '20140611'
where DATEPART(ISO_WEEK, Datum) = 23
group by Benutzer
)
Select Benutzer, case when Minuten > 59 then Substring(convert( varchar(20),
Dateadd(MINUTE, Minuten, '20000101'), 108), 1, 5) else cast(Minuten as
varchar(20)) end as Dauer_String
from Vorselektion
End
Vielen Dank
Patrick
- Bearbeitet LandsHeer Dienstag, 3. Juni 2014 08:06