Ik ben bezig met een query die een jaar in bepaalde periodes moet opkappen.
De periodes zijn afhankelijk van
1) tewerkstellingslocatie (bepaalde rechten voor de eindperiode hangen af van de plaats van tewerkstelling)
2) werkformule (part time of full time krijgen andere berekeningen)
3) statutaire groep (verschillende groepen hebben verschillende rechten)
ik heb in ORACLE bijvoorbeeld dit:
Die haalt me eerst de 'werkformules' op voor dat jaar.
Adhv de periodes van de werkformules wordt gelinkt met de carière om de statutaire groep te bepalen in de periode. Daar haal ik dan de verschillende periodes uit.
Dat werkt goed... de periodes zijn duidelijk onderscheiden.
Ik zou ook direct daarna hetzelfde principe kunnen toepassen voor de tewerkstellingslocaties die ook opgeslagen zitten in de DB.
MAAR!!!
je kan dan opeenvolgende periodes krijgen met
1) hetzelfde type werkformule
2) dezelfde statutengroep (omdat het statuut zelf gewijzigd is, maar de groep niet).
en later zelfs
3) dezelfde tewerkstellingslocatie omdat de persoon van JOB verandert is maar nog steeds een job in (bijvb) Brussel heeft.
Dus heb ik meer periodes met dezelfde eigenschappen en berekeningswijze.
Op zich geen probleem.
maar de rechten (verlof) worden pro rata berekend op die periode.
jaarlijks verlof geeft voor sommige situaties recht op:
2 dagen voor een volledige maand
2 dagen voor een begonnen maand
terwijl voor andere recht types/situaties
2 dagen voor een volledige maand
1 dag voor alles minder dan een halve maand
1.5 dag voor alles méér dan een halve maand (maar geen volledige).
Dus als de periodes opgekapt zijn zouden de rechten verkeerd berekend worden.
vb:
dus de eerste 2 hebben dezelfde situatie (maar het contract van die persoon is vernieuwd of zijn statuut is gewijzigd binnen dezelfde groep of ... (nog enkele andere opties).
Voor Maart (maand 3) zou hij dan 2*2 dagen verlof krijgen terwijl het er maar 2 mogen zijn (het geheel moet gezien worden als één periode).
Ik kan geen group by met min(date_from) en max(date_from) doen aangezien ik dan een periode voor het hele jaar ga hebben (situatie 1 en situatie 4 zijn dezelfde => 01/01 - 31/12).
Ik heb reeds geprobeerd om een 'helper package' te creëren die de linkgroup of locationgroep bijhoudt en bij de WHERE een reset van de inhoud van die package deed.
MAAR, die WHERE wordt niet op het einde uitgevoerd maar afhankelijk van het explain plan (en dus van DB statistics).
Maar dan voegde ik aan elke rij dit toe:
HELPER_PACKAGE.is_same_as_previous(linkgroup)
die me een number teruggeeft dat oploopt. Maar het loopt enkel op als previous NOT NULL is en niet gelijk aan de gegeven parameter.
Maar op het einde van de SQL moet ik de bijgehouden variabelen van die package resetten en dat lukt al niet door het EXPLAIN PLAN.
Ik vrees dat het onmogelijk is, maar wou toch een laatste gok wagen en zet mijn joker in voor de (ORACLE) SQL goeroes hier.
Misschien even ook vermelden dat dit allemaal in een PL/SQL package plaatsvind aangezien die rechtenberekening teveel data manipuleert/creeert/wijzigt om vanuit JAVA te doen.
De periodes zijn afhankelijk van
1) tewerkstellingslocatie (bepaalde rechten voor de eindperiode hangen af van de plaats van tewerkstelling)
2) werkformule (part time of full time krijgen andere berekeningen)
3) statutaire groep (verschillende groepen hebben verschillende rechten)
ik heb in ORACLE bijvoorbeeld dit:
SQL:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| WITH twps AS (--first collect the possible workpattern periods. SELECT twp.per_id , twp.twp_id , GREATEST(twp.work_pattern_date_from, :p_date_from) date_from , LEAST(NVL(twp.work_pattern_date_to, :p_date_to) , :p_date_to) date_To , twp.twt_id , twp.flexitime_flag , twt.tar_week_hours_duration_pct , twt.ttc_cnt, twt.ttc_oth_id_unit_type FROM work_patterns twp INNER JOIN work_pattern_Types twt on twt.twt_id = twp.twt_id WHERE twp.per_id = :p_per_id AND twp.date_to IS NULL -- go and see the final situation!! ) -- AND then get the intersects of the workpattern periods with the carreer. -- statutory link changes can have impact on the calculation SELECT twp.per_id , twp.twp_id , GREATEST(twp.date_from, slk.slk_beg_date) intersect_from , LEAST(twp.date_to , LEAST(NVL(slk.slk_end_date, :p_date_to), :p_date_to) ) intersect_to , twp.twt_id , twp.flexitime_flag , twp.tar_week_hours_duration_pct , twp.ttc_cnt, twp.ttc_oth_id_unit_type , slk.slk_cd, skg.skg_id FROM twps twp INNER JOIN career_statutory_links slk ON slk.per_id = twp.per_id AND NVL(slk.slk_end_date, :p_date_to) >= twp.date_from AND slk.slk_beg_date <= twp.date_to AND slk.cet_seq_nbr_to IS NULL--has to be the latest version... INNER JOIN REF_SLK_GROUP_ITEMS skgi ON skgi.slk_cd = slk.slk_cd INNER JOIN SP2_REF_STATUTORY_LINK_GROUPS skg ON skg.skg_id = skgi.skg_id AND skg.time_flag = 'Y' |
Die haalt me eerst de 'werkformules' op voor dat jaar.
Adhv de periodes van de werkformules wordt gelinkt met de carière om de statutaire groep te bepalen in de periode. Daar haal ik dan de verschillende periodes uit.
Dat werkt goed... de periodes zijn duidelijk onderscheiden.
Ik zou ook direct daarna hetzelfde principe kunnen toepassen voor de tewerkstellingslocaties die ook opgeslagen zitten in de DB.
MAAR!!!
je kan dan opeenvolgende periodes krijgen met
1) hetzelfde type werkformule
2) dezelfde statutengroep (omdat het statuut zelf gewijzigd is, maar de groep niet).
en later zelfs
3) dezelfde tewerkstellingslocatie omdat de persoon van JOB verandert is maar nog steeds een job in (bijvb) Brussel heeft.
Dus heb ik meer periodes met dezelfde eigenschappen en berekeningswijze.
Op zich geen probleem.
maar de rechten (verlof) worden pro rata berekend op die periode.
jaarlijks verlof geeft voor sommige situaties recht op:
2 dagen voor een volledige maand
2 dagen voor een begonnen maand
terwijl voor andere recht types/situaties
2 dagen voor een volledige maand
1 dag voor alles minder dan een halve maand
1.5 dag voor alles méér dan een halve maand (maar geen volledige).
Dus als de periodes opgekapt zijn zouden de rechten verkeerd berekend worden.
vb:
code:
1
2
3
4
5
6
| DATE_FROM DATE_TO WORK_PATTERN_TYPE STATUTE_GROUP LOCATION_GROUP ----------------------------------------------------------------------------------------------------------------------------------------------- 01/01/2006 21/03/2006 1 (full time) 5 1 (EU) 22/03/2006 11/06/2006 1 (full time) 5 1 (EU) 12/06/2006 11/11/2006 1 (full time) 5 2 (non-EU) 12/11/2006 31/12/2006 1 (full time) 5 1 (EU) |
dus de eerste 2 hebben dezelfde situatie (maar het contract van die persoon is vernieuwd of zijn statuut is gewijzigd binnen dezelfde groep of ... (nog enkele andere opties).
Voor Maart (maand 3) zou hij dan 2*2 dagen verlof krijgen terwijl het er maar 2 mogen zijn (het geheel moet gezien worden als één periode).
Ik kan geen group by met min(date_from) en max(date_from) doen aangezien ik dan een periode voor het hele jaar ga hebben (situatie 1 en situatie 4 zijn dezelfde => 01/01 - 31/12).
Ik heb reeds geprobeerd om een 'helper package' te creëren die de linkgroup of locationgroep bijhoudt en bij de WHERE een reset van de inhoud van die package deed.
MAAR, die WHERE wordt niet op het einde uitgevoerd maar afhankelijk van het explain plan (en dus van DB statistics).
Maar dan voegde ik aan elke rij dit toe:
HELPER_PACKAGE.is_same_as_previous(linkgroup)
die me een number teruggeeft dat oploopt. Maar het loopt enkel op als previous NOT NULL is en niet gelijk aan de gegeven parameter.
Maar op het einde van de SQL moet ik de bijgehouden variabelen van die package resetten en dat lukt al niet door het EXPLAIN PLAN.
Ik vrees dat het onmogelijk is, maar wou toch een laatste gok wagen en zet mijn joker in voor de (ORACLE) SQL goeroes hier.
Misschien even ook vermelden dat dit allemaal in een PL/SQL package plaatsvind aangezien die rechtenberekening teveel data manipuleert/creeert/wijzigt om vanuit JAVA te doen.