Co powiesz na to?
CREATE TABLE [dbo].[WorkTypes](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Hours] [int] NOT NULL,
CONSTRAINT [PK_WorkTypes] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
CREATE TABLE [dbo].[WorkDays](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Date] [datetime] NOT NULL,
[DayHours] [int] NULL,
[NightHours] [int] NULL,
[HolidayTypeID] [int] NULL,
[HolidayHours] [int] NULL,
[EmployeeID] [int] NOT NULL,
CONSTRAINT [PK_WorkDays] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
CREATE TABLE [dbo].[Teams](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nchar](1) NOT NULL,
CONSTRAINT [PK_Teams] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
CREATE TABLE [dbo].[HolidayTypes](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Type] [nchar](10) NOT NULL,
CONSTRAINT [PK_HolidayTypes] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
CREATE TABLE [dbo].[Employees](
[ID] [int] IDENTITY(1,1) NOT NULL,
[TeamID] [int] NOT NULL,
[AreaID] [int] NOT NULL,
[WorkTypeID] [int] NOT NULL,
[EmployeeNo] [int] NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[LastName] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
CREATE TABLE [dbo].[Areas](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nchar](3) NOT NULL,
CONSTRAINT [PK_Areas] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
Zapytanie wybierajace dane pracownikow:
select
t.name,
a.name,
wt.hours,
employeeno,
lastname,
firstname
from employees e
inner join teams t on t.id = teamid
inner join areas a on a.id = areaid
inner join worktypes wt on wt.id = worktypeid
Zapytanie pobierajace jeden wiersz z godzinami dla danego miesiaca i pracownika
select
date,
cast (dayhours as varchar) + case when nighthours is null then '' else '+' + cast (nighthours as varchar) end hours,
case when holidaytypeid is null then '' else ht.type + case when holidayhours is null then '' else '-' + cast (holidayhours as varchar) end end as holidayhours
from workdays
left join holidaytypes ht on ht.id = holidaytypeid
where
employeeid = 15
and year(date) = 2008
and month(date) = 5
order by
day(date)
Oczywiscie obydwa zapytania mozna polaczyc. Czyli pobierac dane pracownikow jednym zapytaniem, drugim pobierac caly miesiac dla wszystkich i laczyc po stronie aplikacji w jedna tabele po id pracownika - tak jak jest teraz w excelu.
Oczywiscie tabele powinny byc polaczone kluczami obcymi, ktorych tu nie zamieszczalem, zeby nie zaciemniac obrazu. Dane godzinowe mozna pobierac rozlacznie, czyli kazda kolumne osobno i laczyc po stronie aplikacji (np. godziny_dzienne+godziny_nocne). Daje to wieksza mozliwosc manipulacji warstwa prezentacji danych - w przypadku zmiany sposobu wyswietlania danych.
Jak widac w ten sposob inserty sa banalne - wystarczy dodac odpowiedni wpis w tabeli workhours i juz. Sam sposob dodawania mozna w wiekszosci zrealizowac przez comboboxy, wybierajac wartosci np. urlopu z odpowiednich tabel. W razie przybycia innych rodzajow wystarczy uzupelnic tabele slownikowe.
Oczywiscie to propozycja na podstawie tego co napisales (wynik wizualny ma byc ten sam). Daj znac czy taka struktura zalatwia Twoje problemy.
PS. Z tym makro nie zalapalem, oofice chyba mi nic nie pokazal.
PS2. Moge na maila przeslac baze z wygenerowanymi 400 tys. rekordow do testow.