Welcome to Sign in | Help
in Search

Calcul zile concediu consumate lunar

Last post 09-26-2007, 1:41 PM by B_gd_n[ ]Sahlean. 1 replies.
Sort Posts: Previous Next
  •  09-25-2007, 4:59 PM 2769

    Calcul zile concediu consumate lunar

    Urmatoarea problema mi-a fost adresata de un membru al forumului:

    cum se poate calcula si afisa nr de zile consumate LUNAR din concediu (rezultatul trebuie sa fie sub format unui set de inregistrari sub format Luna - NrZileConsumateInLunaRespectiva) plecand de la data de start a perioadei de concediu si de la nr. zilelor de concediu ?

     

    Exemplu: 15 zile concediu incepand cu data de '2007-01-21'

    Rezultat asteptat:

    2007-01   8

    2007-02   7 

     
    O posibila solutie (brută):

    --se adauga doar acele zile nelucratoare care nu sunt in weekend ( != S/D )
    CREATE TABLE ZileNelucratoare (DataCalendaristica DATETIME PRIMARY KEY)
    INSERT INTO ZileNelucratoare VALUES ( '2007-01-01' )
    INSERT INTO ZileNelucratoare VALUES ( '2007-01-02' )
    INSERT INTO ZileNelucratoare VALUES ( '2007-02-08' ) --cu titlu de exemplu

    -- 0=zi lucratoare / 1=zi nelucratoare
    CREATE FUNCTION EsteZiNelucratoare( @dt DATETIME )
    RETURNS TINYINT
    BEGIN
        DECLARE @rezultat TINYINT
        IF ( DATEPART( dw , @dt ) = 7 /*sambata*/ OR DATEPART( dw , @dt ) = 1 /*duminica*/ )  --vezi http://sqlserver.ro/forums/thread/2744.aspx
            SET @rezultat =  1
        ELSE IF EXISTS(SELECT DataCalendaristica
                        FROM ZileNelucratoare
                        WHERE DataCalendaristica = @dt)
                SET @rezultat =  1
            ELSE
                SET @rezultat = 0
       
        RETURN @rezultat
    END

    CREATE FUNCTION ZileConcediu( @dt_start DATETIME , @nr_zile INT)
    RETURNS @rez TABLE ( LunaZi DATETIME , NrZileConcediuConsumate INT)
    AS
    BEGIN
        DECLARE @luna_curenta INT, @i INT, @zile_lunare_concediu_consumate INT
        SET @luna_curenta = MONTH(@dt_start)
        SET @i = -1
        SET @zile_lunare_concediu_consumate = 0

        WHILE ( @nr_zile > 0 )
        BEGIN
            SET @i = @i + 1
            DECLARE @dt_curenta DATETIME
            SET @dt_curenta = DATEADD( dd , @i , @dt_start )
            IF ( @luna_curenta != MONTH(@dt_curenta) )
            BEGIN
                INSERT INTO @rez VALUES (@dt_curenta,@zile_lunare_concediu_consumate)               
                SET @luna_curenta = MONTH(@dt_curenta)
                SET @zile_lunare_concediu_consumate = 0
            END

            IF ( dbo.EsteZiNelucratoare(@dt_curenta) = 0 )
                BEGIN
                    --PRINT CAST( @dt_curenta AS NVARCHAR(25) ) + ' / ' + CAST(@nr_zile AS NVARCHAR(25))
                    SET @zile_lunare_concediu_consumate = @zile_lunare_concediu_consumate + 1
                    SET @nr_zile = @nr_zile - 1           
                END
        END
        INSERT INTO @rez VALUES (@dt_curenta,@zile_lunare_concediu_consumate)
        RETURN
    END


    SELECT * FROM dbo.ZileConcediu( '2007-01-21' , 45 )

  •  09-26-2007, 1:41 PM 2789 in reply to 2769

    Re: Calcul zile concediu consumate lunar

    O posibila solutie MS Access Tongue Tied

    Query sql_1: 

    CREATE TABLE ZileNelucratoare (DataCalendaristica DATETIME PRIMARY KEY) 

    Query sql_2:

    INSERT INTO ZileNelucratoare VALUES ('2007-01-01');

    Query sql_3:

    INSERT INTO ZileNelucratoare VALUES ('2007-01-02');

    Query sql_4:

    INSERT INTO ZileNelucratoare VALUES ('2007-02-08'); 

    Query sql_5:

    CREATE TABLE ZileConcediuConsumate  ( LunaZi DATETIME PRIMARY KEY , NrZileConcediuConsumate INT NOT NULL) 

     

    '0=zi lucratoare / 1=zi nelucratoare
    Public Function EsteZiNelucratoare(dt As Date) As Byte 'VB Byte = Int8
        If DatePart("w", dt, vbSunday, vbFirstJan1) = 7 Or DatePart("w", dt, vbSunday, vbFirstJan1) = 1 Then
            EsteZiNelucratoare = 1
        ElseIf IsNull(DLookup("DataCalendaristica", "ZileNelucratoare", "DataCalendaristica = #" & Format(dt, "yyyy-MM-dd") & "# ")) = False Then
            EsteZiNelucratoare = 1
        Else
            EsteZiNelucratoare = 0
        End If
    End Function

     

    Public Sub ZileConcediu(dt_start As Date, nr_zile As Long)   'insereaza inregistrari in tabela
        CurrentDb.Execute "DELETE FROM ZileConcediuConsumate"
       
        Dim luna_curenta As Long, i As Long, zile_lunare_concediu_consumate As Long
        luna_curenta = Month(dt_start)
        i = -1
        zile_lunare_concediu_consumate = 0
       
        While nr_zile > 0
            i = i + 1
            Dim dt_curenta As Date, sql As String
            dt_curenta = DateAdd("d", i, dt_start)
            If (luna_curenta <> Month(dt_curenta)) Then
                sql = "INSERT INTO ZileConcediuConsumate VALUES( #" & Format(dt_curenta, "yyyy-MM-dd") & "#" & "," & zile_lunare_concediu_consumate & " )"
                CurrentDb.Execute sql
                luna_curenta = Month(dt_curenta)
                zile_lunare_concediu_consumate = 0
            End If
           
            If EsteZiNelucratoare(dt_curenta) = 0 Then
                'Debug.Print dt_curenta, zile_lunare_concediu_consumate
                zile_lunare_concediu_consumate = zile_lunare_concediu_consumate + 1
                nr_zile = nr_zile - 1
            End If
        Wend
        sql = "INSERT INTO ZileConcediuConsumate VALUES( #" & Format(dt_curenta, "yyyy-MM-dd") & "#" & "," & zile_lunare_concediu_consumate & " )"
        CurrentDb.Execute sql
    End Sub

     

    Exemplu utilizare:

    [1] din VBA se apeleaza procedura cu parametrii doriti:

    Call ZileConcediu ("2007-01-21" , 38 ) 'procedura insereaza in ZileConcediuConsumate inregistrarile dorite

    [2] din SQL se interogheaza tabela  ZileConcediuConsumate

    SELECT *

    FROM ZileConcediuConsumate 

     

View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems