Vraag : Hoe te om de data van een geschiedenislijst die zonder hiaten wordt gericht te handhaven?

Hallo, moet

I een geschiedenislijst handhaven, waar gegeven een nieuwe ingang of een verslag wordt bijgewerkt, wordt de lijst ontspannen of anders gegroepeerd (slechts voor verslagen met zelfde identiteitskaart). Er zou geen hiaten tussen de verslagen moeten zijn. Elk verslag heeft een StartDate en een EndDate. Hieronder is het schema van de lijst:

CREATE- LIJST [dbo]. [Geschiedenis] (/> [HistoryID] bigint NIET ONGELDIGE IDENTITEIT
[identiteitskaart] int.,/> [StartDate] NIET ONGELDIG datetime [EndDate] ONGELDIG datetime [Status] tinyint,/> de PRIMAIRE GEGROEPEERDE SLEUTEL van de BEPERKING
BEPERKING
)
ON [PRIMAIRE]
GO

Here is een steekproefgegeven met de gerichte data:

The DateFormat is dd/mm/yyyy

HistoryID identiteitskaart StartDate EndDate Status
1 1 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. doet om het even welke rijen van de hand die volledig binnen de waaier van de nieuwe rij of updated.
example die zijn worden opgenomen:

INSERT eind
VALUES IN van de Geschiedenis (identiteitskaart, StartDate, EndDate, Status) (1, het „01/01/2010“, „17/01/2010“, 2 zou)

The ResultSet als volgt moeten zijn:

HistoryID identiteitskaart StartDate EndDate Status
6 1 01/01/2010 17/01/2010 2
3 1 die 18/01/2010 20/01/2010 3

Note dat het verslag met HistoryID=3 StartDate heeft met 1 wegens EndDate van het vorige verslag wordt verhoogd (6) is groter dan zou StartDate van het verslag hieronder (3), welk gamma vanaf 16/01/2010 aan zelfde gedrag was 20/01/2010.

The moeten van toepassing zijn als de gebruiker een update op om het even welk verslag op om het even welk gebied (StartDate, EndDate, Status) .

Following maakt vorige resultset, TUSSENVOEGSEL meer gegevens in table.

HistoryID identiteitskaart StartDate EndDate Status
6 1 01/01/2010 17/01/2010 2
3 1 18/01/2010 20/01/2010 3

INSERT IN laat Geschiedenis (identiteitskaart, StartDate, EndDate, Status)
VALUES (1, „05/01/2010“, „10/01/2010“, 1)

ResultSet na het tussenvoegsel:

HistoryID identiteitskaart StartDate EndDate Status
6 1 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 de gebruiker verandert het verslag met HistoryID=3, met de folowing UPDATE:
UPDATE
VASTGESTELDE StartDate='17/01/2010', EndDate='19/01/2010', Status=1
WHERE HistoryID=3

Resultset:

HistoryID identiteitskaart StartDate EndDate Status
6 1 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 TUSSENVOEGSEL/>
Another van 20/01/2010 3


INSERT IN Geschiedenis (identiteitskaart, StartDate, EndDate, Status)
VALUES (1, „01/01/2010“, „18/01/2010“, 1)

Resultset:

HistoryID identiteitskaart StartDate EndDate Status
10 1 01/01/2010 19/01/2010 1
9 1 20/01/2010 20/01/2010 3

Note dat verslagen 7.8.3 werden geschrapt. Het nieuwe toegevoegde die verslag neemt EndDate tot 19/01/2010 wegens EndDate van verslag nr 3 wordt gewijzigd had de zelfde status, die, dat er geen behoefte is betekent om het verslag nr 3 bij te houden of te wijzigen ook niet, enkel EndDate van het nemen en het zetten op onlangs opgenomen record.

I niet het weet hoe te om dit resultaat samen met het hier blootgestelde gedrag te bereiken. Ik weet of zijn beter niet om het te doen als trekker of een procedure te schrijven om verslagen op te nemen en al werk te doen in it.

That´s het. Als er om het even welke twijfel over de regels, tevreden is, laat me know.

Thanks!

Vriendelijke groeten,

Marco André

Antwoord : Hoe te om de data van een geschiedenislijst die zonder hiaten wordt gericht te handhaven?

hallo Marco,

Het reusachtige aantal verslagen kan prestatiesproblemen in beide scenario's introduceren. Het basisprobleem over prestaties is altijd het zelfde: Test alle scenario's en vergelijk de resultaten.

Vinden van uw correct geschiedenisverslag is eenvoudig:

SELECTEER BOVENKANT 1 * VAN [HistoryTable] WAAR [Datum] <>
U kunt een gebruiker gebruiken - bepaalde lijst-waarde functie om dit verslag te berekenen, maar ik kan niet over zijn prestaties veronderstellen. Misschien zijn er koel toetreedt, maar ik kan geen één op dit ogenblik veronderstellen;)

De veelvoudige gebruikersproblemen zijn het zelfde in beide oplossingen, is het het zelfde probleem over atomicity zoals in het bekende probleem van de bankrekeningsoverdracht. U hebt een expliciete transactiecontrole nodig die uw logica inkapselen en een isolatieniveau van gelezen begaat of beter.

mfG
--> Stefan <-->
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
SELECTEER  *
VAN    [E van EventTable]
        Het KRUIS IS van toepassing [dbo]. [FindHistory] (E. [identiteitskaart], E. [EventDate]) H;

-- met

CRE�ëR FUNCTIE [FindHistory]
    (
      @ID ALS INT.,
      @EVENTDATE ALS DATETIME
    )
DE LIJST VAN DE WINST
ZOALS
TERUGKEER
    (UITGEZOCHTE BOVENKANT 1
                H.*
      VAN      [H van HistoryTable]
      WAAR     H.ID = @ID
                EN H. [HistoryDate] = @EventDate
      ORDE DOOR  H. [HistoryDate] DESC
    )
Andere oplossingen  
 
programming4us programming4us