Fråga : Hur man underhåller daterar av en historia bordlägger arrangera i rak linje med inga mellanrum?

Hi

I måste att underhålla en historia bordlägger, var givet ett nytt tillträde, eller ett rekord uppdateras, bordlägga skapas på nytt eller omgrupperas (endast för rekord med den samma LEGITIMATIONEN). Det bör finnas inte några mellanrum mellan rekorden. Varje rekord har en StartDate och en EndDate. Nedanför är schemaen av bordlägga:

CREATE BORDLÄGGER [dboen]. [Historia] (bigintIDENTITET för
[HistoryID] (1, 1) som INTE ÄR OGILTIG, INTE OGILTIG
[LEGITIMATIONEN] int, INTE OGILTIG datetime för
[StartDate], datetime OGILTIGT för
[EndDate], OGILTIG tinyint för
[status], SAMLA I EN KLUNGA NYCKEL- för TVÅNG för
PRIMÄRT [History_pk] ([HistoryID]), TVÅNGET för
[History_uq] som UNIK ([LEGITIMATIONEN], [StartDate])
GO

Here för
ON för
) PRIMÄR] [är ta provdata med, daterar arrangera i rak linje:

The DateFormat är LEGITIMATIONEN StartDate EndDate Status
1 1 för dd/mm/yyyy

HistoryID 01/01/2010 10/01/2010 1
2 1 11/01/2010 15/01/2010 2
3 1 16/01/2010 20/01/2010 3

Rules:
1.Get rid av några ror som är inom spänna av det nytt ror helt att sättas in eller updated.
example:

INSERT IN I

The för
VALUES (1, ”01/01/2010”, ”17/01/2010”, 2) för historia (LEGITIMATIONEN, StartDate, EndDate, status) avslutar ResultSet bör vara som följer: LEGITIMATIONEN StartDate EndDate Status
6 1 för
HistoryID för
01/01/2010 17/01/2010 2
3 1 18/01/2010 20/01/2010 3

Note, att rekordet med HistoryID=3 har StartDaten ökande av 1 på grund av EndDaten av det föregående rekordet (6) är mer stor, än StartDaten av det rekord- nedanfört (3), som spänner, var från 16/01/2010 till 20/01/2010.

The som samma uppförande bör applicera, om användaren gör en uppdatering på något rekord på några att sätta in (StartDate, EndDate, status) .

Following den föregående resultseten, låter MELLANLÄGGET mer data in i LEGITIMATIONEN StartDate EndDate Status
6 1 för table.

HistoryID 01/01/2010 17/01/2010 2
3 1 18/01/2010 20/01/2010 3

INSERT IN I

ResultSet för
VALUES (1, ”05/01/2010”, ”10/01/2010”, 1) för historia (LEGITIMATION, StartDate, EndDate, status) efter mellanlägget: LEGITIMATIONEN StartDate EndDate Status
6 1 för

HistoryID 01/01/2010 04/01/2010 2
7 1 05/01/2010 10/01/2010 1
8 1 11/01/2010 17/01/2010 2
3 1 18/01/2010 20/01/2010 3

Now användaren ändrar rekordet med HistoryID=3, med den folowing UPPDATERINGEN: UPPSÄTTNING StartDate='17/01/2010', EndDate='19/01/2010', Status=1
WHERE HistoryID=3

Resultset för
för
UPDATE: LEGITIMATION StartDate EndDate Status
6 1 för

HistoryID 01/01/2010 04/01/2010 2
7 1 05/01/2010 10/01/2010 1
8 1 11/01/2010 16/01/2010 2
3 1 17/01/2010 19/01/2010 1
9 1 20/01/2010 20/01/2010 MELLANLÄGG för 3


Another:

INSERT IN I

Resultset för
VALUES (1, ”01/01/2010”, ”18/01/2010”, 1) för historia (LEGITIMATIONEN, StartDate, EndDate, status): LEGITIMATION StartDate EndDate Status
10 1 för

HistoryID 01/01/2010 19/01/2010 1
9 1 20/01/2010 20/01/2010 3

Note att rekorden 7.8.3 togs bort. Det nya ökade rekordet tar EndDaten som ändras till 19/01/2010 på grund av EndDaten av rekordet nr. 3, hade den samma statusen som är den hjälpmedel, att det inte finns någon behovsuppehälle eller ändrar rekordet nr. 3 either, precis tar EndDaten av det och satte den på den nyligen insatta record.
I vet inte hur man uppnår detta resultat samman med det utsatta uppförandet här. Jag vet inte om dess bättre som gör det som en starta eller som skriver ett tillvägagångssätt för att sätta in rekord och som gör alla jobb i it.

That´s det. Om det finns, något tvivel om härskar, behar, l5At mig know.

Thanks!

Best hälsningar,

Marco André
" klar "

Svar : Hur man underhåller daterar av en historia bordlägger arrangera i rak linje med inga mellanrum?

hi Marco,

Det enormt numrerar av rekord kan introducera kapacitetsproblem i båda scenarion. Det grundläggande problemet om kapacitet är alltid samma: Testa alla scenarion och jämför resultaten.

Att finna ditt korrekta historierekord är enkelt:

VÄLJ BÄSTA 1 * FRÅN [HistoryTable] VAR [datera], <>
Du kan använda ett användbardefinierat bordlägga-värderar fungerar för att beräkna detta rekord, men jag kan inte gissa om dess kapacitet. Kanske det finns en kyla sammanfogar, men jag kan inte föreställa en rätt nu;),

Multipelanvändaren som problem är samma i båda lösningar, det, är det samma problemet om atomvärde som i det välkända bankkontoöverföringsproblemet. Du behöver en explicit transaktion kontrollerar encapsulating av din logik, och en isolering som är jämn av läst, begår eller förbättrar.

mfG
--> stefan <-->
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
VÄLJ  *
FRÅN    [EventTable] E
        ARGT APPLICERA [dboen]. [FindHistory] (E. [LEGITIMATION], E. [EventDate]) H;

-- med

SKAPA FUNGERAR [FindHistory]
    (
      @ID SOM INT,
      @EVENTDATE SOM DATETIME
    )
RETUR BORDLÄGGER
SOM
RETUR
    (VÄLJ BÄSTA 1,
                H.*
      FRÅN      [HistoryTable] H
      VAR     H.ID = @ID
                OCH H. [HistoryDate] = @EventDate
      BESTÄLLA VID  H. [HistoryDate] DESC
    )
Andra lösningar  
 
programming4us programming4us