none
Werte einer Woche zusammen rechnen und abspeichern RRS feed

  • 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

    Mittwoch, 28. Mai 2014 09:13

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

    Montag, 2. Juni 2014 10:07
    Beantworter

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

    Mittwoch, 28. Mai 2014 10:23
    Moderator
  • 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

    Montag, 2. Juni 2014 09:28
  • 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

    Montag, 2. Juni 2014 10:07
    Beantworter
  • 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
    Dienstag, 3. Juni 2014 08:05