[.NET] Hoe mogelijke combinaties bekomen (Jaren vergelijken)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Sven_Vdb
  • Registratie: Januari 2006
  • Laatst online: 19-09 20:48
Ik ben met een applicatie waar ik moet controleren of een item al in een bepaalde periode valt.
Dus in de database kunnen zich records volgens dit principe bevinden.

IdNaamYearFromYearTo
1S00120102010
2S00220152020


Nu mogen er dus geen records inkomen die een gelijke datum hebben of een datum die tussen een bepaald periode liggen.

Mogelijke inserts kunnen dus zijn. Deze zijn allemaal ongeldig omdat ze ofwel een zelfde jaar bevatten of ze vallen in een periode die al in de database zitten. Dus niets mag in overlapping liggen.

NaamYearFromYearTo
S00320102010
S00420092010
S00520092011
S00620162019
S00620162021


Ik haal dus eerst de records op uit de database en steek die in een lijst.
En loop dan over de lijst. Zoals je kan zien line.YearFrom en line.YearTo komt uit de DB.
De YearFrom en YearTo is het item dat ik wil ingeven. Dus een waarde zoals uit de tabel hierboven.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 For Each line In OpgehaaldlijnenDB
             If yearFrom = line.YearFrom Or yearFrom = line.YearUntil Then
                        Return InvalidResponse(Translations.ErrorValidateStandardBaremaExistsAlready)
             End If

             If yearTo = line.YearFrom Or yearTo = line.YearUntil Then
                        Return InvalidResponse(Translations.ErrorValidateStandardBaremaExistsAlready)
             End If

             If line.YearFrom < yearFrom AndAlso line.YearUntil > yearFrom Then
                        Return InvalidResponse(Translations.ErrorValidateStandardBaremaExistsAlready)
             End If

             If line.YearUntil < yearTo AndAlso line.YearUntil > yearTo Then
                        Return InvalidResponse(Translations.ErrorValidateStandardBaremaExistsAlready)
             End If

             If line.YearFrom < yearFrom AndAlso line.YearFrom > yearTo Then
                        Return InvalidResponse(Translations.ErrorValidateStandardBaremaExistsAlready)
             End If

             If line.YearUntil > yearFrom AndAlso line.YearUntil > yearTo Then
                        Return InvalidResponse(Translations.ErrorValidateStandardBaremaExistsAlready)
             End If
 Next


Maar ik heb het gevoel dat ik in mijn eerste tabel nog mogelijke waardes vergeet. Hoe kan je zoiets best aanpakken. Om alle mogelijke combinaties te bekomen?
En deze dan perfect om te bouwen naar code.

Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Teken het eens uit met lijntjes, dan zul je al snel zien welke vergelijkingen je moet maken (hint: je hebt er maar 2 nodig).

Daarnaast is het waarschijnlijk verstandig om de vergelijking in je databasequery te doen ipv in je code.

Acties:
  • 0 Henk 'm!

Verwijderd

Zijn de periodes die in al in gebruik zijn opeenvolgend? Als dat zo is dan heb je bijvoorbeeld: 200>2010 en 2010>2015. Dan kan je een waarde aanmaken die de overkoepelende periode is die al in de database staat.

Acties:
  • 0 Henk 'm!

  • Sven_Vdb
  • Registratie: Januari 2006
  • Laatst online: 19-09 20:48
Verwijderd schreef op zondag 19 december 2010 @ 17:33:
Zijn de periodes die in al in gebruik zijn opeenvolgend? Als dat zo is dan heb je bijvoorbeeld: 200>2010 en 2010>2015. Dan kan je een waarde aanmaken die de overkoepelende periode is die al in de database staat.
Neen deze zijn niet altijd opeenvolgend. Je kan er nu al eentje aanmaken voor 2020 - 2020.
En later pas 2019-2019.

Acties:
  • 0 Henk 'm!

  • Big4SMK
  • Registratie: September 2001
  • Laatst online: 18-09 13:33
Volgens mij zou je dit leuk op kunnen lossen met interval trees (Wikipedia: Interval tree)

Acties:
  • 0 Henk 'm!

Verwijderd

_js_ schreef op zondag 19 december 2010 @ 16:15:
Teken het eens uit met lijntjes, dan zul je al snel zien welke vergelijkingen je moet maken (hint: je hebt er maar 2 nodig).

Daarnaast is het waarschijnlijk verstandig om de vergelijking in je databasequery te doen ipv in je code.
Vooral het onderstaande. Hetgeen je nu als voorbeeld hier hebt staan kan prima in de SQL query en volgens mij kun je hem inderdaad nog versimpelen.
Pagina: 1