Side-by-side-diff av kontroll.sql
- mellom 17. april 2001 (1.67) og 18. feb 2003 (1.74)

Diffen er generert vha verktøyene diff og rcsdiff (linux/unix) slik:
rcsdiff --side-by-side -W 200 -r1.67 kontroll.sql > kontroll.sql__1.67__vs__1.74
Rcsdiff er en del av versjonshåndteringssystemet RCS (som egentlig burde vært erstattet med CVS...når vi får tid).

Hvordan lese:


-- PL/SQL-kode, Kjetil.Skotheim@usit.uio.no -- PL/SQL-kode, Kjetil.Skotheim@usit.uio.no -- $Id: kontroll.sql,v 1.67 2001/04/17 11:16:46 so_opr Exp $ | -- $Id: kontroll.sql,v 1.74 2003/02/18 17:10:24 so_opr Exp so_opr $ -- Test: finn ut om dbms_utility.get_hash_value(str,base,max) mak brukes til noe, -- Test: finn ut om dbms_utility.get_hash_value(str,base,max) mak brukes til noe, -- f.eks. returen av get_hash_value kan være key til interne hasher som brukes -- f.eks. returen av get_hash_value kan være key til interne hasher som brukes -- istedenfor å select'e så mye... -- istedenfor å select'e så mye... -- -- -- S O - K O N T R O L L M O D U L E N -- S O - K O N T R O L L M O D U L E N -- -- -- -- -- OM PROGRAMMERINGSSPRÅKET PL/SQL OG PAKKEN/MODULEN NVB: -- OM PROGRAMMERINGSSPRÅKET PL/SQL OG PAKKEN/MODULEN NVB: -- -- -- Linjer som starter på -- er kommentarer. -- Linjer som starter på -- er kommentarer. -- En PL/SQL-pakke er en samling prosedyrer, funksjoner og pakkevariabler/pakkearrayer. -- En PL/SQL-pakke er en samling prosedyrer, funksjoner og pakkevariabler/pakkearrayer. -- Denne filen definerer pakken Nvb. -- Denne filen definerer pakken Nvb. -- De viktigste prosedyrene/funksjonene her er: -- De viktigste prosedyrene/funksjonene her er: -- -- -- * Kontroller(). Tar en vitnemålnøkkel og en kravkode som parametre. -- * Kontroller(). Tar en vitnemålnøkkel og en kravkode som parametre. -- Resultatet (SANN/USANN samt noen tall) legges i tabellen kontrollresultat. -- Resultatet (SANN/USANN samt noen tall) legges i tabellen kontrollresultat. -- Kontroller() er den eneste prosedyren som er synlig utad i pakken nvb, -- Kontroller() er den eneste prosedyren som er synlig utad i pakken nvb, -- alle andre er hjelpeprosedyrer for denne. -- alle andre er hjelpeprosedyrer for denne. -- -- -- * Kontroller_uttrykk() tar en vitnemålnøkkel og et kontrollradnr som parametre. -- * Kontroller_uttrykk() tar en vitnemålnøkkel og et kontrollradnr som parametre. -- Dette er den egentlig prosedyren som utfører kontrollen rekursivt. -- Dette er den egentlig prosedyren som utfører kontrollen rekursivt. -- -- -- * Regn_ut_operand() tar en vitnemålnøkkel og en kontrollradoperand som -- * Regn_ut_operand() tar en vitnemålnøkkel og en kontrollradoperand som -- parametre. -- parametre. -- -- -- Diverse oracle-funksjoner, hvordan de virker: -- Diverse oracle-funksjoner, hvordan de virker: -- -- -- nvl(x, y) -- nvl(x, y) -- Dersom x er null (dvs blank eller ingen verdi) returneres y, ellers x. -- Dersom x er null (dvs blank eller ingen verdi) returneres y, ellers x. -- -- -- decode(x, a1, a2, b1, b2, c1, c2, ..., y) virker slik: -- decode(x, a1, a2, b1, b2, c1, c2, ..., y) virker slik: -- Function decode(x, a1, a2, b1, b2, c1, c2, ..., y) -- Function decode(x, a1, a2, b1, b2, c1, c2, ..., y) -- begin -- begin -- case x of -- case x of -- a1: return a2; -- a1: return a2; -- b1: return b2; -- b1: return b2; -- c1: return c2; -- c1: return c2; -- . -- . -- . -- . -- . -- . -- else return y; -- else return y; -- end; -- end; -- end; -- end; -- -- -- || er konkatenering, dvs sammenlegging, av strenger -- || er konkatenering, dvs sammenlegging, av strenger -- -- -- rpad(s, x) -- rpad(s, x) -- Returnerer strengen s med så mange spacer bak som skal til for at -- Returnerer strengen s med så mange spacer bak som skal til for at -- strengen får lengden x. F.eks rpad('Test',6) gir 'Test ' -- strengen får lengden x. F.eks rpad('Test',6) gir 'Test ' -- -- -- ascii(c) -- ascii(c) -- Returnerer ascii-verdien til tegn c. ascii('A') gir 65, B gir 66 osv. -- Returnerer ascii-verdien til tegn c. ascii('A') gir 65, B gir 66 osv. -- Tilsvarer ord() i endel andre språk. -- Tilsvarer ord() i endel andre språk. -- -- -- chr(tall) -- chr(tall) -- Returnerer tegnet som tilsvarer tallet i ascii. chr(65) gir A, -- Returnerer tegnet som tilsvarer tallet i ascii. chr(65) gir A, -- chr(10) gir linjeskift. (Ihvertfall i unix) -- chr(10) gir linjeskift. (Ihvertfall i unix) -- -- -- replace(s, ss1, ss2) -- replace(s, ss1, ss2) -- Erstatter alle forekomster av substreng ss1 med ss2 i streng s og -- Erstatter alle forekomster av substreng ss1 med ss2 i streng s og -- returnerer dette. replace('AAXX10','XX','__') gir 'AA__10' -- returnerer dette. replace('AAXX10','XX','__') gir 'AA__10' -- -- -- like -- like -- Operator som sammenligner strenger mot "mønster". A like 'AA__10' gir true -- Operator som sammenligner strenger mot "mønster". A like 'AA__10' gir true -- dersom A er en sekstegns streng, som starter på AA, ender på 10 og har to -- dersom A er en sekstegns streng, som starter på AA, ender på 10 og har to -- vilkårlige tegn i midten. _ betyr altså et hvilket som helst tegn'. (% betyr -- vilkårlige tegn i midten. _ betyr altså et hvilket som helst tegn'. (% betyr -- null, en eller flere hvilke som helst tegn, men % er ikke brukt i dette -- null, en eller flere hvilke som helst tegn, men % er ikke brukt i dette -- programmet). -- programmet). -- KALLTRE SOM VISER ALLE PROSEDYRER/FUNKSJONER, OG HVORDAN DE KALLER HVERANDRE: -- KALLTRE SOM VISER ALLE PROSEDYRER/FUNKSJONER, OG HVORDAN DE KALLER HVERANDRE: -- -- -- Utenfra kalles: -- Utenfra kalles: -- -- -- * Enten kontroller() med en vitnemålnr + kravkode ( + evt noe mer) som parametre -- * Enten kontroller() med en vitnemålnr + kravkode ( + evt noe mer) som parametre -- -- -- * Eller kontroller20() som gjør det samme som kontroller(), men 20 ganger. Brukes -- * Eller kontroller20() som gjør det samme som kontroller(), men 20 ganger. Brukes -- til testing/tidtakning. -- til testing/tidtakning. -- -- -- * Eller kontroller_alle_vitnemaal(). -- * Eller kontroller_alle_vitnemaal(). -- -- -- Den siste tar selvfølgelig ikke inn vmnr som parameter. -- Den siste tar selvfølgelig ikke inn vmnr som parameter. -- -- -- I et kalltre representerer hver boks en subrutine (prosedyre eller funksjon eller -- I et kalltre representerer hver boks en subrutine (prosedyre eller funksjon eller -- hva det heter, språkavhengig). Pilene sier at en rutine kaller en annen, null, en -- hva det heter, språkavhengig). Pilene sier at en rutine kaller en annen, null, en -- eller flere ganger. Man ser rekursiviteten (eller "selvkallingen") ved at pilene -- eller flere ganger. Man ser rekursiviteten (eller "selvkallingen") ved at pilene -- går i sirkel for kontroller_uttrykk og regn_ut_operand. -- går i sirkel for kontroller_uttrykk og regn_ut_operand. -- -- -- ~ ~ ~ ~ ~ ~ ~ -- ~ ~ ~ ~ ~ ~ ~ -- ~ vmnr ~ -- ~ vmnr ~ -- ~ kravkode ~ -- ~ kravkode ~ -- ~ ~ -- ~ ~ -- ~ ~ ~ ~ ~ ~ ~ -- ~ ~ ~ ~ ~ ~ ~ -- . . . -- . . . -- . . . -- . . . -- . . . -- . . . -- V . V -- V . V -- ________________________ . _____________________________________ -- ________________________ . _____________________________________ -- | procedure kontroller20 | . | procedure kontroller_alle_vitnemaal | -- | procedure kontroller20 | . | procedure kontroller_alle_vitnemaal | -- `------------------------' . `-------------------------------------' -- `------------------------' . `-------------------------------------' -- | . | -- | . | -- | V | -- | V | -- | ______________________ | -- | ______________________ | -- `---> | procedure kontroller | <-------' -- `---> | procedure kontroller | <-------' -- `----------------------' -- `----------------------' -- | -- | -- | -- | -- | -- | -- V -- V -- _____________________________ _____________________________ -- _____________________________ _____________________________ -- ,-----> | function kontroller_uttrykk | ----> | procedure ikke_oppbrukt | -- ,-----> | function kontroller_uttrykk | ----> | procedure ikke_oppbrukt | -- | `-----------------------------' `-----------------------------' -- | `-----------------------------' `-----------------------------' -- | | | | | _____________________________ -- | | | | | _____________________________ -- | | | | `-----------> | procedure logg_sluttrapport | -- | | | | `-----------> | procedure logg_sluttrapport | -- | | | | `-----------------------------' -- | | | | `-----------------------------' -- | | | | _____________________________ -- | | | | _____________________________ -- | | | `---------------> | procedure logg_melding | -- | | | `---------------> | procedure logg_melding | -- | | | `-----------------------------' -- | | | `-----------------------------' -- | | | -- | | | -- | V | -- | V | -- ____________________________ | __________________________ -- ____________________________ | __________________________ -- | function regn_ut_operand | `-------> | function regn_ut_samme | -- | function regn_ut_operand | `-------> | function regn_ut_samme | -- `----------------------------' `--------------------------' -- `----------------------------' `--------------------------' -- | | -- | | -- | `----------------- -- | `----------------- -- | | -- | | -- V V -- V V -- ___________________________ _________________________ -- ___________________________ _________________________ -- | function get_vitnemaalfag | | procedure sett_oppbrukt | -- | function get_vitnemaalfag | | procedure sett_oppbrukt | -- `---------------------------' `-------------------------' -- `---------------------------' `-------------------------' -- -- -- -- -- -- -- Smårutiner som kan kalles fra hvor som helst: -- Smårutiner som kan kalles fra hvor som helst: -- -- -- ___________________________ -- ___________________________ -- | function divider | -- | function divider | -- `---------------------------' -- `---------------------------' -- -- -- ___________________________ -- ___________________________ -- | procedure logg | -- | procedure logg | -- `---------------------------' -- `---------------------------' -- -- -- ___________________________ -- ___________________________ -- | procedure error | -- | procedure error | -- `---------------------------' -- `---------------------------' -- -- -- ___________________________ -- ___________________________ -- | function karakter_tekst | -- | function karakter_tekst | -- `---------------------------' -- `---------------------------' -- -- -- HJELPETABELLER ------------------------------------------------------------------ -- HJELPETABELLER ------------------------------------------------------------------ -- Disse definert i ddl.sql -- Disse definert i ddl.sql -- -- TABELL OPPBRUKTE_FAG -- -- TABELL OPPBRUKTE_FAG -- create table v_oppbrukte_fag ( -- create table v_oppbrukte_fag ( -- kontrollid number(7), -- kontrollid number(7), -- fagkode varchar2(6), -- fagkode varchar2(6), -- nr number(4) not null, -- nr number(4) not null, -- constraint vi01_oppbrukte_fag primary key (kontrollid,fagkode) %lagring_index_stor -- constraint vi01_oppbrukte_fag primary key (kontrollid,fagkode) %lagring_index_stor -- ); -- ); -- create index vi02_oppbrukte_fag on v_oppbrukte_fag(kontrollid,nr); -- create index vi02_oppbrukte_fag on v_oppbrukte_fag(kontrollid,nr); -- -- -- -- -- -- TABELL NVB_LOGG -- -- TABELL NVB_LOGG -- create table v_nvb_logg ( -- create table v_nvb_logg ( -- kontrollid number(7), -- kontrollid number(7), -- linjenr number(6), -- linjenr number(6), -- txt varchar2(2000), -- txt varchar2(2000), -- constraint vi01_nvb_logg primary key (kontrollid,linjenr) &lagring_index_stor -- constraint vi01_nvb_logg primary key (kontrollid,linjenr) &lagring_index_stor -- ); -- ); -- PAKKEHODE (INTERFACE PUBLIC evt .h-filen) ------------------------------------------ -- PAKKEHODE (INTERFACE PUBLIC evt .h-filen) ------------------------------------------ create or replace package nvb as create or replace package nvb as -- Procedure kontroller får 2 eller 3 parametre, den tredje er altså valgfri: -- Procedure kontroller får 2 eller 3 parametre, den tredje er altså valgfri: -- -- -- * Den første er vitnemålsnr. -- * Den første er vitnemålsnr. -- * Den andre er kravkoden man skal kontrollere mot. Hvis f.eks. #A := B og C; -- * Den andre er kravkoden man skal kontrollere mot. Hvis f.eks. #A := B og C; -- er parset inn i basen, så er A, B og C lovlige kravkoder. Vanlige kravkoder -- er parset inn i basen, så er A, B og C lovlige kravkoder. Vanlige kravkoder -- er f.eks. KONTROLL_AF, KONTROLL_ØA eller GSK. Se tabell v_krav. -- er f.eks. KONTROLL_AF, KONTROLL_ØA eller GSK. Se tabell v_krav. -- -- -- * Tredje parameter er loggenivå. Default nivå er 4 dersom ikke angitt. -- * Tredje parameter er loggenivå. Default nivå er 4 dersom ikke angitt. -- Jo høyere loggenivåtall, jo mer logges. -- Jo høyere loggenivåtall, jo mer logges. -- 0 Ikke logg noe -- 0 Ikke logg noe -- 1 Logg bare systemfeil (ERROR) -- 1 Logg bare systemfeil (ERROR) -- 2 Logg USANN-meldinger. F.eks. #A [usann "...tekst..."] := B og C; -- 2 Logg USANN-meldinger. F.eks. #A [usann "...tekst..."] := B og C; -- Og vitnemålskille. -- Og vitnemålskille. -- 3 Logg SANN-meldinger. F.eks. #A[sann "...tekst..."] := B og C; -- 3 Logg SANN-meldinger. F.eks. #A[sann "...tekst..."] := B og C; -- Og overskrifter. F.eks. #A := B [over "Dette er en overskrift"] og C; -- Og overskrifter. F.eks. #A := B [over "Dette er en overskrift"] og C; -- 4 Logg hvilke fag som er "oppbrukt", FAGLOGG. -- 4 Logg hvilke fag som er "oppbrukt", FAGLOGG. -- 5 Sluttrapport -- 5 Sluttrapport -- 6 HELE-sluttrapport (ser ut som en sluttrapport) -- 6 HELE-sluttrapport (ser ut som en sluttrapport) -- 7 Logg kravuttrykkraden idet man starter kontroll av den -- 7 Logg kravuttrykkraden idet man starter kontroll av den -- 8 Logg operander med resultat som gir SANN, og kjøring av ikke_oppbrukt() -- 8 Logg operander med resultat som gir SANN, og kjøring av ikke_oppbrukt() -- 9 Logg operander med resultat uansett SANN, USANN eller tall. -- 9 Logg operander med resultat uansett SANN, USANN eller tall. -- 10 Viser hvilke uttrykk som skippes (trenger ikke regnes ut pga optimalisering) -- 10 Viser hvilke uttrykk som skippes (trenger ikke regnes ut pga optimalisering) -- 11 og høyere: udefinert -- 11 og høyere: udefinert procedure kontroller ( procedure kontroller ( p_vmnr in v_kontrollresultat.vmnr%type, p_vmnr in v_kontrollresultat.vmnr%type, p_kravkode in v_kontrollresultat.kravkode%type, | p_kravkode in v_kontrollresultat.kravkode%type, -- default null ? p_loggnivaa in number default 4, p_loggnivaa in number default 4, p_kontrollid in number default 0 p_kontrollid in number default 0 ); ); function kontroller ( function kontroller ( p_vmnr in v_kontrollresultat.vmnr%type, p_vmnr in v_kontrollresultat.vmnr%type, p_kravkode in v_kontrollresultat.kravkode%type, p_kravkode in v_kontrollresultat.kravkode%type, p_loggnivaa in number default 4, p_loggnivaa in number default 4, p_kontrollid in number default 0 p_kontrollid in number default 0 ) return number; ) return number; procedure kontroller10 ( procedure kontroller10 ( p_vmnr in v_kontrollresultat.vmnr%type, p_vmnr in v_kontrollresultat.vmnr%type, p_kravkode in v_kontrollresultat.kravkode%type, p_kravkode in v_kontrollresultat.kravkode%type, p_loggnivaa in number default 4, p_loggnivaa in number default 4, p_kontrollid in number default 0 p_kontrollid in number default 0 ); ); procedure kontroller20 ( procedure kontroller20 ( p_vmnr in v_kontrollresultat.vmnr%type, p_vmnr in v_kontrollresultat.vmnr%type, p_kravkode in v_kontrollresultat.kravkode%type, p_kravkode in v_kontrollresultat.kravkode%type, p_loggnivaa in number default 4, p_loggnivaa in number default 4, p_kontrollid in number default 0 p_kontrollid in number default 0 ); ); procedure kontroller_alle_vitnemaal ( procedure kontroller_alle_vitnemaal ( p_kravkode in v_kontrollresultat.kravkode%type default null, p_kravkode in v_kontrollresultat.kravkode%type default null, p_loggnivaa in number default 4 p_loggnivaa in number default 4 ); ); end nvb; end nvb; / / -- PAKKEKROPP (IMPLEMENTATION PRIVATE evt .c-filen) -------------------------------------------- -- PAKKEKROPP (IMPLEMENTATION PRIVATE evt .c-filen) -------------------------------------------- create or replace package body nvb as create or replace package body nvb as -- DEFINERER TYPER -- DEFINERER TYPER -- Returneres av kontroller_uttrykk og regn_ut_operand -- Returneres av kontroller_uttrykk og regn_ut_operand type resultattype is record ( type resultattype is record ( -- Som i kontrollresultat-tabellen: -- Som i kontrollresultat-tabellen: resultattypekode v_kontrollresultat.resultattypekode%type, resultattypekode v_kontrollresultat.resultattypekode%type, resultatkode v_kontrollresultat.resultatkode%type, resultatkode v_kontrollresultat.resultatkode%type, resultattall v_kontrollresultat.resultattall%type, resultattall v_kontrollresultat.resultattall%type, antall_fag v_kontrollresultat.antall_fag%type, antall_fag v_kontrollresultat.antall_fag%type, omfang v_kontrollresultat.omfang%type, omfang v_kontrollresultat.omfang%type, vekt v_kontrollresultat.vekt%type, vekt v_kontrollresultat.vekt%type, antall_tallkar v_kontrollresultat.antall_tallkar%type, antall_tallkar v_kontrollresultat.antall_tallkar%type, sum_tallkar number(5,1), --v_kontrollresultat.sum_tallkar%type, | sum_tallkar v_kontrollresultat.sum_tallkar%type, snitt_tallkar v_kontrollresultat.snitt_tallkar%type, snitt_tallkar v_kontrollresultat.snitt_tallkar%type, fordypninger_foert v_kontrollresultat.snitt_tallkar%type, fordypninger_foert v_kontrollresultat.snitt_tallkar%type, -- Fra sist oppbrukte fag på vitnemålet: -- Fra sist oppbrukte fag på vitnemålet: fagkode v_fag.fagkode%type, fagkode v_fag.fagkode%type, karakter_eksamen number(2), karakter_eksamen number(2), karakter_standpunkt number(2), karakter_standpunkt number(2), obligatorisk_eksamen boolean, obligatorisk_eksamen boolean, privatistkode v_vitnemaalfag.privatistkode%type | privatistkode v_vitnemaalfag.privatistkode%type, | eksamensaar v_vitnemaalfag.eksamensaar%type ); ); -- Globale variable innenfor pakke nvb (c_ = "current") -- Globale variable innenfor pakke nvb (c_ = "current") oppbrukte_fag_siste_nr number; oppbrukte_fag_siste_nr number; kravuttrykknr_current number; kravuttrykknr_current number; denne resultattype; denne resultattype; resultat_SANN resultattype; resultat_SANN resultattype; resultat_USANN resultattype; resultat_USANN resultattype; c_loggnivaa number; c_loggnivaa number; c_kontrollid number; c_kontrollid number; c_vmnr varchar2(17); c_vmnr varchar2(17); > c_avgangsaar number; > c_kurskode1 v_vitnemaal.kurskode1%type; > c_kurskode2 v_vitnemaal.kurskode2%type; > c_kurskode3 v_vitnemaal.kurskode3%type; linjenr_logg number; linjenr_logg number; type boolean_tabell is table of boolean index by binary_integer; type boolean_tabell is table of boolean index by binary_integer; type integer_tabell is table of integer index by binary_integer; type integer_tabell is table of integer index by binary_integer; type string_tabell is table of string(80) index by binary_integer; type string_tabell is table of string(80) index by binary_integer; type kravuttrykk_tabell is table of v_kravuttrykk%rowtype index by binary_integer; type kravuttrykk_tabell is table of v_kravuttrykk%rowtype index by binary_integer; har_melding boolean_tabell; har_melding boolean_tabell; loggnivaa integer_tabell; loggnivaa integer_tabell; kravkode string_tabell; kravkode string_tabell; skip_kravuttrykk boolean_tabell; skip_kravuttrykk boolean_tabell; ku_tabell kravuttrykk_tabell; ku_tabell kravuttrykk_tabell; fag_er_paa_vitnemaal boolean_tabell; fag_er_paa_vitnemaal boolean_tabell; tom_boolean_tabell boolean_tabell; tom_boolean_tabell boolean_tabell; tom_integer_tabell integer_tabell; tom_integer_tabell integer_tabell; tom_string_tabell string_tabell; tom_string_tabell string_tabell; tom_ku_tabell kravuttrykk_tabell; tom_ku_tabell kravuttrykk_tabell; -- Brukes til å logge diverse -- Brukes til å logge diverse procedure logg ( procedure logg ( p_txt varchar2, p_txt varchar2, p_loggnivaa number default 9 p_loggnivaa number default 9 ) is ) is kunr varchar2(10); kunr varchar2(10); begin begin if p_loggnivaa <= c_loggnivaa then if p_loggnivaa <= c_loggnivaa then if c_loggnivaa >= 7 then if c_loggnivaa >= 7 then kunr := rpad(nvl(kravuttrykknr_current,-1),6); kunr := rpad(nvl(kravuttrykknr_current,-1),6); end if; end if; linjenr_logg := nvl(linjenr_logg,0) + 1; linjenr_logg := nvl(linjenr_logg,0) + 1; insert into v_nvb_logg (kontrollid,linjenr,txt) insert into v_nvb_logg (kontrollid,linjenr,txt) values ( c_kontrollid, linjenr_logg, kunr || replace(p_txt,'£',chr(10)) ); values ( c_kontrollid, linjenr_logg, kunr || replace(p_txt,'£',chr(10)) ); -- chr(10) er linjeskift, £ er "spesialtegnet" i kravspråket/parseren som betyr linjeskift -- chr(10) er linjeskift, £ er "spesialtegnet" i kravspråket/parseren som betyr linjeskift end if; end if; end; end; -- Som logg(), men setter ERROR foran -- Som logg(), men setter ERROR foran procedure error (p_txt varchar2) is procedure error (p_txt varchar2) is begin begin logg('___ERROR___: '||p_txt, -1); logg('___ERROR___: '||p_txt, -1); end; end; -- Function karakter_tekst brukes foreløpig kun i logg_melding, -- Function karakter_tekst brukes foreløpig kun i logg_melding, -- for å skrive ut karakter 'D' istedenfor -68 (f.eks.) -- for å skrive ut karakter 'D' istedenfor -68 (f.eks.) function karakter_tekst (karakter_tall number) function karakter_tekst (karakter_tall number) return varchar2 is return varchar2 is begin begin if karakter_tall < 0 then if karakter_tall < 0 then return ''''||chr(-karakter_tall)||''''; return ''''||chr(-karakter_tall)||''''; else else return chr(karakter_tall+ascii('0')); return chr(karakter_tall+ascii('0')); end if; end if; end; end; -- Konverterer en fagkode (AA2040 f.eks.) til et heltall, brukes -- Konverterer en fagkode (AA2040 f.eks.) til et heltall, brukes -- til memorisering i binary_integer-tabeller -- til memorisering i binary_integer-tabeller function fagkode2heltall (fagkode varchar2) function fagkode2heltall (fagkode varchar2) > return number is > begin -- *X åpner plass for neste tegn, 26 når neste A-Z, 10 når tall, 216 når A-Å > return (((( (ascii(substr(fagkode,1,1))-65) *26 > + (ascii(substr(fagkode,2,1))-65) ) *10 > + (ascii(substr(fagkode,3,1))-48) ) *10 > + (ascii(substr(fagkode,4,1))-48) ) *10 > + (ascii(substr(fagkode,5,1))-48) ) *216 > + (ascii(substr(fagkode,6,1))-48); > end; > > function kurskode2tall (kurskode varchar2) return number is return number is begin begin return ((( (ascii(substr(fagkode,1,1))-65) *29 | return (ascii(substr(kurskode,1,1))-64)*1000 + (ascii(substr(fagkode,2,1))-65)) *50 | + to_number(substr(kurskode,2,3)) + (ascii(substr(fagkode,3,1))-48)) *50 | + (nvl(ascii(substr(kurskode,5,1)),64)-64)/100; + (ascii(substr(fagkode,4,1))-48)) *100 < + to_number(substr(fagkode,5,2)); < end; end; -- Et vanlig krav i kravspråket kan se f.eks. slik ut: -- Et vanlig krav i kravspråket kan se f.eks. slik ut: -- # A := B og C; -- # A := B og C; -- -- -- Et uttrykk kan ha en tilhørende meldingsdefinisjon, f.eks. slik: -- Et uttrykk kan ha en tilhørende meldingsdefinisjon, f.eks. slik: -- -- -- # A [...MELDINGSDEFINISJON...] := B og C [...MELDINGSDEFINISJON...]; -- # A [...MELDINGSDEFINISJON...] := B og C [...MELDINGSDEFINISJON...]; -- -- -- En meldingsdefinisjon er en liste av en eller flere meldinger. Hver melding er av -- En meldingsdefinisjon er en liste av en eller flere meldinger. Hver melding er av -- type SANN, USANN, FAGLOGG, LOGG eller OVERSKRIFT. Et krav kan da f.eks. se slik ut: -- type SANN, USANN, FAGLOGG, LOGG eller OVERSKRIFT. Et krav kan da f.eks. se slik ut: -- -- -- # A [sann "Krav A er ok" -- # A [sann "Krav A er ok" -- usann "Krav A ikke ok" -- usann "Krav A ikke ok" -- logg 5 -- logg 5 -- faglogg "gir fodypning" -- faglogg "gir fodypning" -- overskrift "Starter kontroll av krav A"] := B og C; -- overskrift "Starter kontroll av krav A"] := B og C; -- -- -- Parseren her vil opprette fem rader i tabellen kravmelding for krav A, en for -- Parseren her vil opprette fem rader i tabellen kravmelding for krav A, en for -- hver kravtype. Prosedyren logg_melding kalles fra kontroller_uttrykk, og den -- hver kravtype. Prosedyren logg_melding kalles fra kontroller_uttrykk, og den -- finner ut om gitt kravuttrykk har meldinger koblet til seg. Logg_melding kunne -- finner ut om gitt kravuttrykk har meldinger koblet til seg. Logg_melding kunne -- ha byttet navn til kanskje_logg_melding -- ha byttet navn til kanskje_logg_melding procedure logg_melding ( procedure logg_melding ( p_kravuttrykknr v_kravuttrykk.kravuttrykknr%type, p_kravuttrykknr v_kravuttrykk.kravuttrykknr%type, p_resultat resultattype, p_resultat resultattype, p_oppbrukte_fag_fom number default 9999, p_oppbrukte_fag_fom number default 9999, p_kravuttrykknr_forrige v_kravuttrykk.kravuttrykknr%type default -1 p_kravuttrykknr_forrige v_kravuttrykk.kravuttrykknr%type default -1 ) ) is is ln number; ln number; tekst v_kravmelding.meldingtekst%type; tekst v_kravmelding.meldingtekst%type; begin begin -- Siden logg_melding kalles en eller to ganger i hver kontroller_uttrykk -- Siden logg_melding kalles en eller to ganger i hver kontroller_uttrykk -- er det viktig at den går raskt. For de aller fleste kravuttrykkene finnes -- er det viktig at den går raskt. For de aller fleste kravuttrykkene finnes -- det ingen meldinger, går isåfall ut av logg_melding med en gang før man -- det ingen meldinger, går isåfall ut av logg_melding med en gang før man -- setter igang en dyr select. -- setter igang en dyr select. if c_loggnivaa < 2 if c_loggnivaa < 2 or not har_melding.exists(p_kravuttrykknr) or not har_melding.exists(p_kravuttrykknr) or p_kravuttrykknr = nvl(p_kravuttrykknr_forrige,-1) then or p_kravuttrykknr = nvl(p_kravuttrykknr_forrige,-1) then return; return; end if; end if; for melding in ( for melding in ( select kravuttrykknr,meldingtekst,kravmeldingtypekode from v_kravmelding select kravuttrykknr,meldingtekst,kravmeldingtypekode from v_kravmelding where kravuttrykknr=p_kravuttrykknr where kravuttrykknr=p_kravuttrykknr and ( and ( kravmeldingtypekode = p_resultat.resultatkode and p_resultat.resultattypekode = 'B' kravmeldingtypekode = p_resultat.resultatkode and p_resultat.resultattypekode = 'B' or kravmeldingtypekode = 'FAGLOGG' and p_resultat.resultattypekode = 'B' and p_resultat. or kravmeldingtypekode = 'FAGLOGG' and p_resultat.resultattypekode = 'B' and p_resultat. or kravmeldingtypekode = 'OVER' and p_oppbrukte_fag_fom = 9999 or kravmeldingtypekode = 'OVER' and p_oppbrukte_fag_fom = 9999 ) ) and nvl(meldingtekst,'.')<>'.' and nvl(meldingtekst,'.')<>'.' order by decode(kravmeldingtypekode, order by decode(kravmeldingtypekode, 'LOGG', 1, 'LOGG', 1, 'OVER', 2, 'OVER', 2, 'SANN', 3, 'SANN', 3, 'USANN', 4, 'USANN', 4, 'FAGLOGG',5, 9) 'FAGLOGG',5, 9) ) ) loop loop tekst := melding.meldingtekst; tekst := melding.meldingtekst; if instr(tekst,'$') > 0 then if instr(tekst,'$') > 0 then tekst := replace(tekst,'$TALL', denne.resultattall); tekst := replace(tekst,'$TALL', denne.resultattall); tekst := replace(tekst,'$OMFANG',denne.omfang); tekst := replace(tekst,'$OMFANG',denne.omfang); tekst := replace(tekst,'$VEKT', denne.vekt); tekst := replace(tekst,'$VEKT', denne.vekt); tekst := replace(tekst,'$ANTTK', denne.antall_tallkar); tekst := replace(tekst,'$ANTTK', denne.antall_tallkar); tekst := replace(tekst,'$SUMTK', denne.sum_tallkar); tekst := replace(tekst,'$SUMTK', denne.sum_tallkar); tekst := replace(tekst,'$SNTTK', to_char(denne.snitt_tallkar,'9.99')); tekst := replace(tekst,'$SNTTK', to_char(denne.snitt_tallkar,'9.99')); tekst := replace(tekst,'$SKAR', karakter_tekst(denne.karakter_standpunkt)); tekst := replace(tekst,'$SKAR', karakter_tekst(denne.karakter_standpunkt)); tekst := replace(tekst,'$EKAR', karakter_tekst(denne.karakter_eksamen)); tekst := replace(tekst,'$EKAR', karakter_tekst(denne.karakter_eksamen)); tekst := replace(tekst,'$ANTFF', denne.fordypninger_foert); tekst := replace(tekst,'$ANTFF', denne.fordypninger_foert); tekst := replace(tekst,'$FAGKODE', denne.fagkode); | tekst := replace(tekst,'$FAGKODE', denne.fagkode); > tekst := replace(tekst,'$AVGANGSÅR', c_avgangsaar); > tekst := replace(tekst,'$EKSAMENSÅR', denne.eksamensaar); > tekst := replace(tekst,'$KURSKODE1', c_kurskode1); > tekst := replace(tekst,'$KURSKODE2', c_kurskode2); > tekst := replace(tekst,'$KURSKODE3', c_kurskode3); if instr(tekst,'$')>0 then if instr(tekst,'$')>0 then error('Ukjent $-variabel i "'||tekst||'"'); error('Ukjent $-variabel i "'||tekst||'"'); end if; end if; end if; end if; if melding.kravmeldingtypekode = 'FAGLOGG' then if melding.kravmeldingtypekode = 'FAGLOGG' then tekst := substr(tekst,1,30)||':'; tekst := substr(tekst,1,30)||':'; for ofag in ( for ofag in ( select select --ofag.nr, --ofag.nr, ofag.fagkode, ofag.fagkode, decode(substr(f.fagkode,1,2),'VL',nvl(vf.valgfagtekst,f.fagnavn_bokmaal),f.fagnavn_b decode(substr(f.fagkode,1,2),'VL',nvl(vf.valgfagtekst,f.fagnavn_bokmaal),f.fagnavn_b --decode(f.omfang_overstyrbart,'J',nvl(vf.omfang,f.omfang),f.omfang) --decode(f.omfang_overstyrbart,'J',nvl(vf.omfang,f.omfang),f.omfang) from v_oppbrukte_fag ofag, v_fag f, v_vitnemaalfag vf from v_oppbrukte_fag ofag, v_fag f, v_vitnemaalfag vf where ofag.kontrollid = c_kontrollid where ofag.kontrollid = c_kontrollid and ofag.fagkode = f.fagkode and ofag.fagkode = f.fagkode and ofag.fagkode = vf.fagkode and ofag.fagkode = vf.fagkode and vf.vmnr = c_vmnr and vf.vmnr = c_vmnr and ofag.nr >= p_oppbrukte_fag_fom and ofag.nr >= p_oppbrukte_fag_fom order by ofag.nr order by ofag.nr ) ) loop loop logg( rpad(tekst,31) || rpad(ofag.fagkode,7) || rpad(substr(ofag.fagnavn,1,50),51), 4) logg( rpad(tekst,31) || rpad(ofag.fagkode,7) || rpad(substr(ofag.fagnavn,1,50),51), 4) tekst := ' '; tekst := ' '; end loop; end loop; elsif melding.kravmeldingtypekode = 'OVER' then elsif melding.kravmeldingtypekode = 'OVER' then logg('',3); logg('',3); logg(tekst,3); logg(tekst,3); elsif melding.kravmeldingtypekode in ('SANN','USANN') then elsif melding.kravmeldingtypekode in ('SANN','USANN') then if melding.kravmeldingtypekode = 'SANN' then ln := 3; else ln := 2; end if; if melding.kravmeldingtypekode = 'SANN' then ln := 3; else ln := 2; end if; logg( logg( -- 'MELDING FOR ' || -- 'MELDING FOR ' || -- melding.kravuttrykknr ||' '|| -- melding.kravuttrykknr ||' '|| -- p_resultat.resultatkode ||': '|| -- p_resultat.resultatkode ||': '|| -- c_vmnr ||': '|| -- c_vmnr ||': '|| tekst tekst ,ln ,ln ); ); end if; end if; end loop; end loop; end; end; procedure logg_sluttrapport ( procedure logg_sluttrapport ( p_vmnr v_vitnemaal.vmnr%type, p_vmnr v_vitnemaal.vmnr%type, p_resultat resultattype, p_resultat resultattype, p_kravkode v_krav.kravkode%type, p_kravkode v_krav.kravkode%type, p_loggnivaa number default 6 p_loggnivaa number default 6 ) ) is is skrevet_foer boolean := false; skrevet_foer boolean := false; vm v_vitnemaal%rowtype; vm v_vitnemaal%rowtype; begin begin if p_loggnivaa > c_loggnivaa then return; end if; --optm ihht logg() if p_loggnivaa > c_loggnivaa then return; end if; --optm ihht logg() > logg('',p_loggnivaa); logg('',p_loggnivaa); > for merk in (select * from v_vitnemaalmerknad where vmnr=c_vmnr order by sidekode desc,linje > loop logg('VM-MERKNAD: '||merk.kommentar,p_loggnivaa); end loop; logg('',p_loggnivaa); logg('',p_loggnivaa); logg('OMF FAGKODE FAGNAVN (bokmålsversjonen) SKAR EKAR FF',p_loggnivaa); logg('OMF FAGKODE FAGNAVN (bokmålsversjonen) SKAR EKAR FF',p_loggnivaa); logg('--- ------- ------------------------------ ---- ---- --',p_loggnivaa); logg('--- ------- ------------------------------ ---- ---- --',p_loggnivaa); -- Logger vitnemålet, først de som er oppbrukte -- Logger vitnemålet, først de som er oppbrukte for ofag in ( for ofag in ( select select ofag.fagkode ofagkode, ofag.fagkode ofagkode, f.fagkode, f.fagkode, decode(substr(f.fagkode,1,2),'VL',nvl(vf.valgfagtekst,f.fagnavn_bokmaal),f.fagnavn_bokma decode(substr(f.fagkode,1,2),'VL',nvl(vf.valgfagtekst,f.fagnavn_bokmaal),f.fagnavn_bokma decode(f.omfang_overstyrbart,'J',nvl(vf.omfang,f.omfang),f.omfang) omfang, decode(f.omfang_overstyrbart,'J',nvl(vf.omfang,f.omfang),f.omfang) omfang, nvl(vf.karakter_standpunkt,'-') karakter_standpunkt, nvl(vf.karakter_standpunkt,'-') karakter_standpunkt, nvl(vf.karakter_eksamen,'-') karakter_eksamen, nvl(vf.karakter_eksamen,'-') karakter_eksamen, decode(vf.fordypningsfag,'J','F',null) ff decode(vf.fordypningsfag,'J','F',null) ff from from v_fag f, v_fag f, v_vitnemaalfag vf, v_vitnemaalfag vf, v_oppbrukte_fag ofag v_oppbrukte_fag ofag where where c_kontrollid = ofag.kontrollid(+) and c_kontrollid = ofag.kontrollid(+) and f.fagkode = ofag.fagkode(+) and f.fagkode = ofag.fagkode(+) and f.fagkode = vf.fagkode and f.fagkode = vf.fagkode and vf.vmnr = p_vmnr vf.vmnr = p_vmnr order by order by decode(ofag.fagkode,null,p_loggnivaa,0), vf.linjenr, f.fagkode decode(ofag.fagkode,null,p_loggnivaa,0), vf.linjenr, f.fagkode ) ) loop loop if ofag.ofagkode is null and not skrevet_foer then if ofag.ofagkode is null and not skrevet_foer then logg('',p_loggnivaa); logg('',p_loggnivaa); logg('Fag som ikke ble brukt i kontrollen:',p_loggnivaa); logg('Fag som ikke ble brukt i kontrollen:',p_loggnivaa); skrevet_foer := true; skrevet_foer := true; end if; end if; logg(lpad(ofag.omfang||' ',4) || logg(lpad(ofag.omfang||' ',4) || rpad(ofag.fagkode,8) || rpad(ofag.fagkode,8) || rpad(ofag.fagnavn,30) || rpad(ofag.fagnavn,30) || lpad(ofag.karakter_standpunkt,5) || lpad(ofag.karakter_standpunkt,5) || lpad(ofag.karakter_eksamen,5) || lpad(ofag.karakter_eksamen,5) || lpad(ofag.ff,3) lpad(ofag.ff,3) ,p_loggnivaa ,p_loggnivaa ); ); end loop; end loop; select * into vm from v_vitnemaal select * into vm from v_vitnemaal where vmnr = p_vmnr; where vmnr = p_vmnr; -- Logger resultatet -- Logger resultatet logg('',p_loggnivaa); logg('',p_loggnivaa); logg('Vitnemål: '|| vm.vmnr||' '|| logg('Vitnemål: '|| vm.vmnr||' '|| to_char(vm.foedtdato,'DDMMYY')||vm.personnummer||' to_char(vm.foedtdato,'DDMMYY')||vm.personnummer||' -- vm.regnr||' '|| -- vm.regnr||' '|| vm.elevnavn, p_loggnivaa); vm.elevnavn, p_loggnivaa); logg('Krav: '||p_kravkode, p_loggnivaa); logg('Krav: '||p_kravkode, p_loggnivaa); logg('Antall fag krav: '||p_resultat.antall_fag, p_loggnivaa); logg('Antall fag krav: '||p_resultat.antall_fag, p_loggnivaa); logg('Vekt: '||p_resultat.vekt, p_loggnivaa); logg('Vekt: '||p_resultat.vekt, p_loggnivaa); logg('Beregnet: Tallkarakterer: '||p_resultat.antall_tallkar||' stk., '|| logg('Beregnet: Tallkarakterer: '||p_resultat.antall_tallkar||' stk., '|| 'sum '||p_resultat.sum_tallkar|| 'sum '||p_resultat.sum_tallkar|| ', snitt' ||to_char(p_resultat.snitt_tallkar,'0.00')|| ', snitt' ||to_char(p_resultat.snitt_tallkar,'0.00')|| ' Omfang: '||p_resultat.omfang ,p_loggnivaa); ' Omfang: '||p_resultat.omfang ,p_loggnivaa); logg('På vitnemålet: Tallkarakterer: '||vm.antall_tallkarakterer||' stk., '|| logg('På vitnemålet: Tallkarakterer: '||vm.antall_tallkarakterer||' stk., '|| 'sum '||vm.sum_tallkarakterer|| 'sum '||vm.sum_tallkarakterer|| ', snitt' ||to_char(vm.snitt_tallkarakterer,'0.00')|| ', snitt' ||to_char(vm.snitt_tallkarakterer,'0.00')|| ' Omfang: '||vm.omfang ,p_loggnivaa); ' Omfang: '||vm.omfang ,p_loggnivaa); logg('Fordypninger ført (FF): '||p_resultat.fordypninger_foert, p_loggnivaa); logg('Fordypninger ført (FF): '||p_resultat.fordypninger_foert, p_loggnivaa); end; end; -- Merker av et fag som oppbrukt. Legger fagkoden bakerst med -- Merker av et fag som oppbrukt. Legger fagkoden bakerst med -- høyest nr i tabell v_oppbrukte_fag -- høyest nr i tabell v_oppbrukte_fag procedure sett_oppbrukt (p_fagkode v_fag.fagkode%type) is procedure sett_oppbrukt (p_fagkode v_fag.fagkode%type) is begin begin oppbrukte_fag_siste_nr := nvl(oppbrukte_fag_siste_nr,0) + 1; oppbrukte_fag_siste_nr := nvl(oppbrukte_fag_siste_nr,0) + 1; insert into v_oppbrukte_fag (kontrollid,fagkode,nr) insert into v_oppbrukte_fag (kontrollid,fagkode,nr) values (c_kontrollid,p_fagkode, oppbrukte_fag_siste_nr); values (c_kontrollid,p_fagkode, oppbrukte_fag_siste_nr); -- insert into v_oppbrukte_fag2 values (c_kontrollid,p_fagkode, oppbrukte_fag_siste_n -- insert into v_oppbrukte_fag2 values (c_kontrollid,p_fagkode, oppbrukte_fag_siste_n if 8 <= c_loggnivaa then if 8 <= c_loggnivaa then logg('sett_oppbrukt '||p_fagkode||' (nr '||oppbrukte_fag_siste_nr||')', 8); logg('sett_oppbrukt '||p_fagkode||' (nr '||oppbrukte_fag_siste_nr||')', 8); end if; end if; end; end; -- Gjør fag uoppbrukte igjen. Gjelder fagkodene i tabell -- Gjør fag uoppbrukte igjen. Gjelder fagkodene i tabell -- oppbrukte_fag med nr fra og med fom_nr til og med tom_nr -- oppbrukte_fag med nr fra og med fom_nr til og med tom_nr procedure ikke_oppbrukt (fom_nr number, tom_nr number default 9999) is procedure ikke_oppbrukt (fom_nr number, tom_nr number default 9999) is fagliste varchar2(2000); fagliste varchar2(2000); begin begin --for fag in (select fagkode from v_oppbrukte_fag where nr between fom_nr and tom_nr) --for fag in (select fagkode from v_oppbrukte_fag where nr between fom_nr and tom_nr) -- loop fagliste := fagliste||' '||fag.fagkode; end loop; -- loop fagliste := fagliste||' '||fag.fagkode; end loop; if 8 <= c_loggnivaa then if 8 <= c_loggnivaa then logg('ikke_oppbrukt '||fom_nr||' '||tom_nr||fagliste, 8); logg('ikke_oppbrukt '||fom_nr||' '||tom_nr||fagliste, 8); end if; end if; delete from v_oppbrukte_fag delete from v_oppbrukte_fag where kontrollid=c_kontrollid where kontrollid=c_kontrollid and nr between fom_nr and tom_nr; and nr between fom_nr and tom_nr; -- delete from v_oppbrukte_fag2 -- delete from v_oppbrukte_fag2 -- where kontrollid=c_kontrollid -- where kontrollid=c_kontrollid -- and nr between fom_nr and tom_nr; -- and nr between fom_nr and tom_nr; end; end; -- Bruker egen funksjon for divisjoner for å gi feilmelding -- Bruker egen funksjon for divisjoner for å gi feilmelding -- ved divisjon på 0. -- ved divisjon på 0. function divider (p1 number, p2 number, gierror number default 0) function divider (p1 number, p2 number, gierror number default 0) return number is return number is begin begin if p2 = 0 or p2 is null then -- if nvl(p2,0)=0 then if p2 = 0 or p2 is null then -- if nvl(p2,0)=0 then if gierror > 0 then error('Divisjon på 0!'); end if; if gierror > 0 then error('Divisjon på 0!'); end if; return 0; return 0; else else return p1/p2; return p1/p2; end if; end if; end; end; -- Funksjonen get_vitnemaalfag kalles fra regn_ut_operand. Den -- Funksjonen get_vitnemaalfag kalles fra regn_ut_operand. Den -- returnerer en record av samme type som en rad i tabell vitnemaalfag -- returnerer en record av samme type som en rad i tabell vitnemaalfag -- dersom gitt fag p_fagkode finnes på gitt vitnemål p_vmnr, og det ikke -- dersom gitt fag p_fagkode finnes på gitt vitnemål p_vmnr, og det ikke -- allerede er oppbrukt. -- allerede er oppbrukt. -- -- -- Faget må også være tatt som E (elev) eller P (privatist) dersom dette -- Faget må også være tatt som E (elev) eller P (privatist) dersom dette -- kreves av p_attributtkode, som da vil være E eller P. -- kreves av p_attributtkode, som da vil være E eller P. -- -- -- Gitt fag p_fagkode kan også være en såkallt generell fagkode, f.eks. -- Gitt fag p_fagkode kan også være en såkallt generell fagkode, f.eks. -- AAXX20. Dersom f.eks. faget AA1020 da er på vitnemålet, og det ikke er -- AAXX20. Dersom f.eks. faget AA1020 da er på vitnemålet, og det ikke er -- oppbrukt osv, returneres AA1020-raden fra vitnemaalfag herfra. -- oppbrukt osv, returneres AA1020-raden fra vitnemaalfag herfra. -- XX betyr et tall fom 10 tom 19. AAYY33 betyr alle fag som starter -- XX betyr et tall fom 10 tom 19. AAYY33 betyr alle fag som starter -- på AA og slutter på 33 og de to midterste er fom 19 tom 95. -- på AA og slutter på 33 og de to midterste er fom 19 tom 95. -- Altså: XX er 10-18, YY er 19-95. -- Altså: XX er 10-18, YY er 19-95. -- -- -- Dersom flere fag på vitnemålet passer til AAXX10, returneres det -- Dersom flere fag på vitnemålet passer til AAXX10, returneres det -- første sortert alfanumerisk. -- første sortert alfanumerisk. -- -- -- Oracle-operatoren LIKE sjekker om en streng passer i et mønster -- Oracle-operatoren LIKE sjekker om en streng passer i et mønster -- der _ betyr et hvilket som helst tegn. -- der _ betyr et hvilket som helst tegn. function get_vitnemaalfag ( function get_vitnemaalfag ( p_vmnr v_vitnemaalfag.vmnr%type, p_vmnr v_vitnemaalfag.vmnr%type, p_operandtypekode v_vitnemaalfag.fagkode%type, p_operandtypekode v_vitnemaalfag.fagkode%type, p_fagkode v_vitnemaalfag.fagkode%type, p_fagkode v_vitnemaalfag.fagkode%type, p_attributtkode v_attributt.attributtkode%type -- E eller P p_attributtkode v_attributt.attributtkode%type -- E eller P ) ) return v_vitnemaalfag%rowtype return v_vitnemaalfag%rowtype is is vmfag v_vitnemaalfag%rowtype; vmfag v_vitnemaalfag%rowtype; to_midtre varchar2(2); to_midtre varchar2(2); fagkodemoenster varchar2(6); fagkodemoenster varchar2(6); begin begin if p_operandtypekode = 'F' then if p_operandtypekode = 'F' then begin begin if not fag_er_paa_vitnemaal.exists(fagkode2heltall(p_fagkode)) then if not fag_er_paa_vitnemaal.exists(fagkode2heltall(p_fagkode)) then return null; return null; end if; end if; select * into vmfag from v_vitnemaalfag select * into vmfag from v_vitnemaalfag where vmnr = p_vmnr where vmnr = p_vmnr and fagkode=p_fagkode and fagkode=p_fagkode and ( nvl(p_attributtkode,'x') not in ('E','P') or nvl(privatistkode,'E') = p_attributtk and ( nvl(p_attributtkode,'x') not in ('E','P') or nvl(privatistkode,'E') = p_attributtk and not exists (select null from v_oppbrukte_fag and not exists (select null from v_oppbrukte_fag where kontrollid = c_kontrollid where kontrollid = c_kontrollid and fagkode = p_fagkode); and fagkode = p_fagkode); exception exception when no_data_found then vmfag := null; when no_data_found then vmfag := null; end; end; elsif p_operandtypekode = 'G' then elsif p_operandtypekode = 'G' then if not fag_er_paa_vitnemaal.exists(fagkode2heltall(p_fagkode)) then if not fag_er_paa_vitnemaal.exists(fagkode2heltall(p_fagkode)) then return null; return null; end if; end if; to_midtre := substr(p_fagkode,3,2); to_midtre := substr(p_fagkode,3,2); fagkodemoenster := replace(replace(p_fagkode,'XX','__'),'YY','__'); fagkodemoenster := replace(replace(p_fagkode,'XX','__'),'YY','__'); for vmf in ( for vmf in ( select * select * from v_vitnemaalfag vf from v_vitnemaalfag vf where vmnr = p_vmnr where vmnr = p_vmnr and ( and ( fagkode=p_fagkode fagkode=p_fagkode or to_midtre='XX' and fagkode like fagkodemoenster and substr(fagkode,3,2) between or to_midtre='XX' and fagkode like fagkodemoenster and substr(fagkode,3,2) between or to_midtre='YY' and fagkode like fagkodemoenster and substr(fagkode,3,2) between or to_midtre='YY' and fagkode like fagkodemoenster and substr(fagkode,3,2) between ) ) and ( nvl(p_attributtkode,'x') not in ('E','P') or nvl(privatistkode,'E') = p_attributtk and ( nvl(p_attributtkode,'x') not in ('E','P') or nvl(privatistkode,'E') = p_attributtk and not exists (select null from v_oppbrukte_fag and not exists (select null from v_oppbrukte_fag where kontrollid = c_kontrollid where kontrollid = c_kontrollid and fagkode = vf.fagkode) and fagkode = vf.fagkode) order by fagkode order by fagkode ) ) loop loop -- vmfag blir det første funnede faget -- vmfag blir det første funnede faget if vmfag.fagkode is null then if vmfag.fagkode is null then vmfag := vmf; vmfag := vmf; end if; end if; end loop; end loop; elsif p_operandtypekode = 'X' then elsif p_operandtypekode = 'X' then begin begin fagkodemoenster := replace(p_fagkode,'XX','__'); | -- fagkodemoenster := replace(p_fagkode,'XX','__'); > fagkodemoenster := replace(substr(p_fagkode,1,2),'XX','__') || > replace(substr(p_fagkode,3,2),'XX','__') || > replace(substr(p_fagkode,5,2),'XX','__'); select * into vmfag from v_vitnemaalfag select * into vmfag from v_vitnemaalfag where vmnr = p_vmnr where vmnr = p_vmnr and fagkode = (select min(fagkode) from v_vitnemaalfag vf and fagkode = (select min(fagkode) from v_vitnemaalfag vf where vmnr = p_vmnr where vmnr = p_vmnr and fagkode like fagkodemoenster and fagkode like fagkodemoenster and not exists (select null from v_oppbrukte_fag and not exists (select null from v_oppbrukte_fag where kontrollid = c_kontrollid where kontrollid = c_kontrollid and fagkode = vf.fagkode)); and fagkode = vf.fagkode)); exception exception when no_data_found then vmfag := null; when no_data_found then vmfag := null; end; end; end if; end if; return vmfag; return vmfag; end; end; -- Forward-/forhåndsdeklarasjon av kontroller_uttrykk. PL/SQL krever -- Forward-/forhåndsdeklarasjon av kontroller_uttrykk. PL/SQL krever -- det siden kontroller_uttrykk og regn_ut_operand kaller hverandre. -- det siden kontroller_uttrykk og regn_ut_operand kaller hverandre. function kontroller_uttrykk ( function kontroller_uttrykk ( p_vmnr v_vitnemaal.vmnr%type, p_vmnr v_vitnemaal.vmnr%type, p_kravuttrykknr v_kravuttrykk.kravuttrykknr%type p_kravuttrykknr v_kravuttrykk.kravuttrykknr%type ) return resultattype; ) return resultattype; -- Funksjonen kalles fra kontroller_uttrykk med et gitt vitnemål, -- Funksjonen kalles fra kontroller_uttrykk med et gitt vitnemål, -- operandnr'et og settet av variabler som utgjør operand1 eller 2. -- operandnr'et og settet av variabler som utgjør operand1 eller 2. function regn_ut_operand ( function regn_ut_operand ( p_vmnr v_vitnemaal.vmnr%type, p_vmnr v_vitnemaal.vmnr%type, p_operandnr number, p_operandnr number, p_ku v_kravuttrykk%rowtype p_ku v_kravuttrykk%rowtype ) ) return resultattype return resultattype is is -- operandverdiene -- operandverdiene o_operandtypekode v_kravuttrykk.operandtypekode1%type; o_operandtypekode v_kravuttrykk.operandtypekode1%type; o_kravuttrykknr v_kravuttrykk.kravuttrykknr1%type; o_kravuttrykknr v_kravuttrykk.kravuttrykknr1%type; o_fagkode v_kravuttrykk.fagkode1%type; o_fagkode v_kravuttrykk.fagkode1%type; o_attributtkode v_kravuttrykk.attributtkode1%type; o_attributtkode v_kravuttrykk.attributtkode1%type; o_konstant v_kravuttrykk.konstant1%type; o_konstant v_kravuttrykk.konstant1%type; resultat resultattype; resultat resultattype; tmpresultat resultattype; tmpresultat resultattype; obltrekkfag v_fag.obltrekkfag%type; obltrekkfag v_fag.obltrekkfag%type; oosb v_fag.omfang_overstyrbart%type; oosb v_fag.omfang_overstyrbart%type; vmfag v_vitnemaalfag%rowtype; vmfag v_vitnemaalfag%rowtype; konstant number; konstant number; ln number; ln number; karakter_standpunkt number; karakter_standpunkt number; karakter_eksamen number; karakter_eksamen number; begin begin if p_operandnr = 1 then if p_operandnr = 1 then o_operandtypekode := p_ku.operandtypekode1; o_operandtypekode := p_ku.operandtypekode1; o_kravuttrykknr := p_ku.kravuttrykknr1; o_kravuttrykknr := p_ku.kravuttrykknr1; o_fagkode := p_ku.fagkode1; o_fagkode := p_ku.fagkode1; o_attributtkode := p_ku.attributtkode1; o_attributtkode := p_ku.attributtkode1; o_konstant := p_ku.konstant1; o_konstant := p_ku.konstant1; else -- p_operandnr = 2 else -- p_operandnr = 2 o_operandtypekode := p_ku.operandtypekode2; o_operandtypekode := p_ku.operandtypekode2; o_kravuttrykknr := p_ku.kravuttrykknr2; o_kravuttrykknr := p_ku.kravuttrykknr2; o_fagkode := p_ku.fagkode2; o_fagkode := p_ku.fagkode2; o_attributtkode := p_ku.attributtkode2; o_attributtkode := p_ku.attributtkode2; o_konstant := p_ku.konstant2; o_konstant := p_ku.konstant2; end if; end if; if o_operandtypekode = 'U' then if o_operandtypekode = 'U' then if skip_kravuttrykk.exists(o_kravuttrykknr) then -- alltid true if skip_kravuttrykk.exists(o_kravuttrykknr) then -- alltid true resultat := resultat_USANN; resultat := resultat_USANN; if 10 <= c_loggnivaa then if 10 <= c_loggnivaa then logg('Skipper '||o_kravuttrykknr, 10); logg('Skipper '||o_kravuttrykknr, 10); end if; end if; else else resultat := kontroller_uttrykk(p_vmnr, o_kravuttrykknr); resultat := kontroller_uttrykk(p_vmnr, o_kravuttrykknr); end if; end if; elsif o_operandtypekode in ('F','G','X') then elsif o_operandtypekode in ('F','G','X') then -- Se kommentar på get_vitnemaalfag lenger opp... -- Se kommentar på get_vitnemaalfag lenger opp... vmfag := get_vitnemaalfag(p_vmnr, o_operandtypekode, o_fagkode, o_attributtkode); vmfag := get_vitnemaalfag(p_vmnr, o_operandtypekode, o_fagkode, o_attributtkode); if vmfag.fagkode is not null then if vmfag.fagkode is not null then resultat := resultat_SANN; resultat := resultat_SANN; resultat.antall_fag := 1; resultat.antall_fag := 1; select nvl(omfang,0), omfang_overstyrbart select nvl(omfang,0), omfang_overstyrbart into resultat.omfang, oosb into resultat.omfang, oosb from v_fag where fagkode=vmfag.fagkode; from v_fag where fagkode=vmfag.fagkode; if oosb = 'J' and vmfag.omfang is not null then if oosb = 'J' and vmfag.omfang is not null then resultat.omfang := vmfag.omfang; resultat.omfang := vmfag.omfang; end if; end if; -- Skal regne på karakterene som er varchar2(1) i basen, derfor: -- Skal regne på karakterene som er varchar2(1) i basen, derfor: if vmfag.karakter_standpunkt between '0' and '6' then if vmfag.karakter_standpunkt between '0' and '6' then karakter_standpunkt := to_number(vmfag.karakter_standpunkt); karakter_standpunkt := to_number(vmfag.karakter_standpunkt); resultat.antall_tallkar := resultat.antall_tallkar + 1; resultat.antall_tallkar := resultat.antall_tallkar + 1; resultat.sum_tallkar := resultat.sum_tallkar + karakter_standpunkt; resultat.sum_tallkar := resultat.sum_tallkar + karakter_standpunkt; else else karakter_standpunkt := - ascii(vmfag.karakter_standpunkt); karakter_standpunkt := - ascii(vmfag.karakter_standpunkt); end if; end if; if vmfag.karakter_eksamen between '0' and '6' then if vmfag.karakter_eksamen between '0' and '6' then karakter_eksamen := to_number(vmfag.karakter_eksamen); karakter_eksamen := to_number(vmfag.karakter_eksamen); resultat.antall_tallkar := resultat.antall_tallkar + 1; resultat.antall_tallkar := resultat.antall_tallkar + 1; resultat.sum_tallkar := resultat.sum_tallkar + karakter_eksamen; resultat.sum_tallkar := resultat.sum_tallkar + karakter_eksamen; else else karakter_eksamen := - ascii(vmfag.karakter_eksamen); karakter_eksamen := - ascii(vmfag.karakter_eksamen); end if; end if; resultat.snitt_tallkar := divider(resultat.sum_tallkar, resultat.antall_tallka resultat.snitt_tallkar := divider(resultat.sum_tallkar, resultat.antall_tallka if vmfag.fordypningsfag = 'J' then if vmfag.fordypningsfag = 'J' then resultat.fordypninger_foert := 1; resultat.fordypninger_foert := 1; end if; end if; -- Fra sist oppbrukte fag på vitnemålet: -- Fra sist oppbrukte fag på vitnemålet: resultat.fagkode :=vmfag.fagkode; resultat.fagkode :=vmfag.fagkode; resultat.karakter_eksamen :=karakter_eksamen; resultat.karakter_eksamen :=karakter_eksamen; resultat.karakter_standpunkt :=karakter_standpunkt; resultat.karakter_standpunkt :=karakter_standpunkt; -- resultat.obligatorisk_eksamen boolean; senere -- resultat.obligatorisk_eksamen boolean; senere resultat.privatistkode :=vmfag.privatistkode; resultat.privatistkode :=vmfag.privatistkode; > resultat.eksamensaar :=nvl(vmfag.eksamensaar,c_avgangsaar); sett_oppbrukt(vmfag.fagkode); sett_oppbrukt(vmfag.fagkode); -- Else faget er ikke på vitnemålet eller det er allerede oppbrukt -- Else faget er ikke på vitnemålet eller det er allerede oppbrukt else else resultat := resultat_USANN; resultat := resultat_USANN; end if; end if; elsif o_operandtypekode = 'K' then elsif o_operandtypekode = 'K' then resultat := resultat_SANN; resultat := resultat_SANN; resultat.resultattypekode := 'T'; resultat.resultattypekode := 'T'; resultat.resultatkode := null; resultat.resultatkode := null; resultat.resultattall := o_konstant; resultat.resultattall := o_konstant; elsif o_operandtypekode = 'V' then elsif o_operandtypekode = 'V' then resultat := resultat_SANN; resultat := resultat_SANN; resultat.resultattypekode := 'T'; resultat.resultattypekode := 'T'; resultat.resultatkode := null; resultat.resultatkode := null; -- resultat.resultattall := se under -- resultat.resultattall := se under if o_attributtkode = 'ANTFAG' then if o_attributtkode = 'ANTFAG' then select count(*) select count(*) into resultat.resultattall into resultat.resultattall from v_vitnemaalfag from v_vitnemaalfag where vmnr = p_vmnr; where vmnr = p_vmnr; > elsif substr(o_attributtkode,1,4)='KURS' then > if o_attributtkode='KURS1' then resultat.resultattall := kurskode2tall(c_kurskode1); > elsif o_attributtkode='KURS2' then resultat.resultattall := kurskode2tall(c_kurskode2); > elsif o_attributtkode='KURS3' then resultat.resultattall := kurskode2tall(c_kurskode3); > end if; else else select nvl(decode(o_attributtkode, select nvl(decode(o_attributtkode, 'OMFANG', omfang, 'OMFANG', omfang, 'ANTTK', antall_tallkarakterer, 'ANTTK', antall_tallkarakterer, 'SUMTK', sum_tallkarakterer, 'SUMTK', sum_tallkarakterer, 'SNTTK', snitt_tallkarakterer, 'SNTTK', snitt_tallkarakterer, 'FORDP', fordypningspoeng1, 'FORDP', fordypningspoeng1, 'REALFP', fordypningspoeng2, 'REALFP', fordypningspoeng2, > 'AVGÅR', avgangsaar, 0), 0) 0), 0) into resultat.resultattall into resultat.resultattall from v_vitnemaal from v_vitnemaal where vmnr = p_vmnr; where vmnr = p_vmnr; end if; end if; elsif o_operandtypekode = 'D' then elsif o_operandtypekode = 'D' then resultat := denne; resultat := denne; else else error('o_operandtypekode="'||o_operandtypekode||'", verken U, F, G, K, V eller D'); error('o_operandtypekode="'||o_operandtypekode||'", verken U, F, G, K, V eller D'); end if; end if; if o_attributtkode is not null and o_operandtypekode <> 'V' then if o_attributtkode is not null and o_operandtypekode <> 'V' then if o_konstant is not null then if o_konstant is not null then if resultat.resultatkode = 'SANN' then if resultat.resultatkode = 'SANN' then if o_konstant <= -10000 then if o_konstant <= -10000 then if resultat.antall_fag > 0 then if resultat.antall_fag > 0 then denne := resultat; denne := resultat; end if; end if; tmpresultat := kontroller_uttrykk(p_vmnr, - o_konstant - 10000); tmpresultat := kontroller_uttrykk(p_vmnr, - o_konstant - 10000); if tmpresultat.resultattypekode = 'T' then if tmpresultat.resultattypekode = 'T' then konstant := tmpresultat.resultattall; konstant := tmpresultat.resultattall; else else error('Attributtilordningsverdiutregning ga ikke tall. Knr='||(-o_konstant-10000) error('Attributtilordningsverdiutregning ga ikke tall. Knr='||(-o_konstant-10000) end if; end if; else else konstant := o_konstant; konstant := o_konstant; end if; end if; if o_attributtkode='ANTFAG' then resultat.antall_fag := konstant; if o_attributtkode='ANTFAG' then resultat.antall_fag := konstant; elsif o_attributtkode='OMFANG' then resultat.omfang := konstant; elsif o_attributtkode='OMFANG' then resultat.omfang := konstant; elsif o_attributtkode='VEKT' then resultat.vekt := konstant; elsif o_attributtkode='VEKT' then resultat.vekt := konstant; elsif o_attributtkode='ANTTK' then resultat.antall_tallkar := konstant; elsif o_attributtkode='ANTTK' then resultat.antall_tallkar := konstant; elsif o_attributtkode='SUMTK' then resultat.sum_tallkar := konstant; elsif o_attributtkode='SUMTK' then resultat.sum_tallkar := konstant; elsif o_attributtkode='SNTTK' then resultat.snitt_tallkar := konstant; elsif o_attributtkode='SNTTK' then resultat.snitt_tallkar := konstant; elsif o_attributtkode='SKAR' then resultat.karakter_standpunkt := konstant; elsif o_attributtkode='SKAR' then resultat.karakter_standpunkt := konstant; elsif o_attributtkode='EKAR' then resultat.karakter_eksamen := konstant; elsif o_attributtkode='EKAR' then resultat.karakter_eksamen := konstant; elsif o_attributtkode='ANTFF' then resultat.fordypninger_foert := konstant; elsif o_attributtkode='ANTFF' then resultat.fordypninger_foert := konstant; > elsif o_attributtkode='EKSÅR' then resultat.eksamensaar := konstant; end if; end if; end if; end if; elsif o_attributtkode not in ('E','P') elsif o_attributtkode not in ('E','P') and not (resultat.resultattypekode = 'B' and resultat.resultatkode = 'USANN') then and not (resultat.resultattypekode = 'B' and resultat.resultatkode = 'USANN') then resultat.resultattypekode:='T'; resultat.resultattypekode:='T'; resultat.resultatkode:=null; resultat.resultatkode:=null; if o_attributtkode='ANTFAG' then resultat.resultattall := resultat.antall_fag; if o_attributtkode='ANTFAG' then resultat.resultattall := resultat.antall_fag; elsif o_attributtkode='OMFANG' then resultat.resultattall := resultat.omfang; elsif o_attributtkode='OMFANG' then resultat.resultattall := resultat.omfang; elsif o_attributtkode='VEKT' then resultat.resultattall := resultat.vekt; elsif o_attributtkode='VEKT' then resultat.resultattall := resultat.vekt; elsif o_attributtkode='ANTTK' then resultat.resultattall := resultat.antall_tallkar; elsif o_attributtkode='ANTTK' then resultat.resultattall := resultat.antall_tallkar; elsif o_attributtkode='SUMTK' then resultat.resultattall := resultat.sum_tallkar; elsif o_attributtkode='SUMTK' then resultat.resultattall := resultat.sum_tallkar; elsif o_attributtkode='SNTTK' then resultat.resultattall := resultat.snitt_tallkar; elsif o_attributtkode='SNTTK' then resultat.resultattall := resultat.snitt_tallkar; elsif o_attributtkode='SKAR' then resultat.resultattall := resultat.karakter_standpu elsif o_attributtkode='SKAR' then resultat.resultattall := resultat.karakter_standpu elsif o_attributtkode='EKAR' then resultat.resultattall := resultat.karakter_eksamen elsif o_attributtkode='EKAR' then resultat.resultattall := resultat.karakter_eksamen elsif o_attributtkode='ANTFF' then resultat.resultattall := resultat.fordypninger_foe elsif o_attributtkode='ANTFF' then resultat.resultattall := resultat.fordypninger_foe > elsif o_attributtkode='EKSÅR' then resultat.resultattall := nvl(resultat.eksamensaar, end if; end if; end if; end if; end if; end if; if resultat.antall_fag > 0 then if resultat.antall_fag > 0 then denne := resultat; denne := resultat; end if; end if; if o_operandtypekode = 'D' then if o_operandtypekode = 'D' then tmpresultat := resultat; tmpresultat := resultat; resultat := resultat_SANN; resultat := resultat_SANN; resultat.resultattypekode := tmpresultat.resultattypekode; resultat.resultattypekode := tmpresultat.resultattypekode; resultat.resultatkode := tmpresultat.resultatkode; resultat.resultatkode := tmpresultat.resultatkode; resultat.resultattall := tmpresultat.resultattall; resultat.resultattall := tmpresultat.resultattall; end if; end if; if resultat.resultattypekode = 'B' and resultat.resultatkode = 'SANN' if resultat.resultattypekode = 'B' and resultat.resultatkode = 'SANN' then ln := 8; else ln := 9; end if; then ln := 8; else ln := 9; end if; if ln <= c_loggnivaa then if ln <= c_loggnivaa then logg(' Resultat ' || logg(' Resultat ' || p_operandnr ||' = '|| p_operandnr ||' = '|| resultat.resultattypekode ||', '|| resultat.resultattypekode ||', '|| resultat.resultatkode ||', '|| resultat.resultatkode ||', '|| resultat.resultattall ||' ('|| resultat.resultattall ||' ('|| resultat.antall_fag ||','|| resultat.antall_fag ||','|| resultat.omfang ||','|| resultat.omfang ||','|| resultat.vekt ||','|| resultat.vekt ||','|| resultat.antall_tallkar ||','|| resultat.antall_tallkar ||','|| resultat.sum_tallkar ||','|| resultat.sum_tallkar ||','|| resultat.snitt_tallkar ||','|| resultat.snitt_tallkar ||','|| resultat.fordypninger_foert ||')' resultat.fordypninger_foert ||')' ,ln ,ln ); ); end if; end if; return resultat; return resultat; end regn_ut_operand; end regn_ut_operand; function regn_ut_samme ( function regn_ut_samme ( p_vmnr v_vitnemaal.vmnr%type, p_vmnr v_vitnemaal.vmnr%type, p_ku v_kravuttrykk%rowtype p_ku v_kravuttrykk%rowtype ) ) return resultattype return resultattype is is test_fagkode v_fag.fagkode%type; test_fagkode v_fag.fagkode%type; resultat resultattype; resultat resultattype; operand v_kravuttrykk%rowtype; operand v_kravuttrykk%rowtype; begin begin -- Løper gjennom oppbrukte fagkoder som passer den generelle fagkoden -- Løper gjennom oppbrukte fagkoder som passer den generelle fagkoden -- i operand 2 i kravuttrykket -- i operand 2 i kravuttrykket for par2 in ( for par2 in ( select fagkode from v_oppbrukte_fag select fagkode from v_oppbrukte_fag where kontrollid = c_kontrollid where kontrollid = c_kontrollid and fagkode like replace(replace(p_ku.fagkode2,'XX','__'),'YY','__') and fagkode like replace(replace(p_ku.fagkode2,'XX','__'),'YY','__') and( and( (substr(p_ku.fagkode2,3,2)='XX' and substr(fagkode,3,2) between '10' and '18') (substr(p_ku.fagkode2,3,2)='XX' and substr(fagkode,3,2) between '10' and '18') or (substr(p_ku.fagkode2,3,2)='YY' and substr(fagkode,3,2) between '19' and '95') or (substr(p_ku.fagkode2,3,2)='YY' and substr(fagkode,3,2) between '19' and '95') or (substr(p_ku.fagkode2,3,2) not in ('XX','YY')) or (substr(p_ku.fagkode2,3,2) not in ('XX','YY')) ) ) order by fagkode order by fagkode ) ) loop loop -- ...og finner den første sanne som passer til operand 1 i kravuttrykket -- ...og finner den første sanne som passer til operand 1 i kravuttrykket if nvl(resultat.resultatkode,'x')<>'SANN' then if nvl(resultat.resultatkode,'x')<>'SANN' then -- Setter test_fagkode lik p_kravuttrykk.fagkode1, men der XX eller YY byttes -- Setter test_fagkode lik p_kravuttrykk.fagkode1, men der XX eller YY byttes -- med tallet i tilsvarende posisjon som XX/YY i current oppbrukte fagkode -- med tallet i tilsvarende posisjon som XX/YY i current oppbrukte fagkode test_fagkode := p_ku.fagkode1; test_fagkode := p_ku.fagkode1; if substr(test_fagkode,3,2) in ('XX','YY') then if substr(test_fagkode,3,2) in ('XX','YY') then test_fagkode := substr(test_fagkode,1,2)||substr(par2.fagkode,3,2)||substr(test_fagkod test_fagkode := substr(test_fagkode,1,2)||substr(par2.fagkode,3,2)||substr(test_fagkod end if; end if; operand := p_ku; operand := p_ku; operand.operandtypekode1 := 'F'; operand.operandtypekode1 := 'F'; operand.fagkode1 := test_fagkode; operand.fagkode1 := test_fagkode; resultat := regn_ut_operand(p_vmnr, 1, operand); resultat := regn_ut_operand(p_vmnr, 1, operand); end if; end if; end loop; end loop; if resultat.resultattypekode is null then if resultat.resultattypekode is null then resultat := resultat_USANN; resultat := resultat_USANN; end if; end if; return resultat; return resultat; end regn_ut_samme; end regn_ut_samme; -- Funksjon kontroller_uttrykk virker på et vitnemål og en rad i kontroll-tabellen. -- Funksjon kontroller_uttrykk virker på et vitnemål og en rad i kontroll-tabellen. -- Den består av tre deler: -- Den består av tre deler: -- Del 1: Regn ut resultat av operand 1 -- Del 1: Regn ut resultat av operand 1 -- Del 2: Regn ut resultat av operand 2 -- Del 2: Regn ut resultat av operand 2 -- Del 3: Regn ut og returner resultatet av kontrollraden. -- Del 3: Regn ut og returner resultatet av kontrollraden. -- D.v.s. resultat1 OPERATOR resultat2. -- D.v.s. resultat1 OPERATOR resultat2. function kontroller_uttrykk ( function kontroller_uttrykk ( p_vmnr v_vitnemaal.vmnr%type, p_vmnr v_vitnemaal.vmnr%type, p_kravuttrykknr v_kravuttrykk.kravuttrykknr%type p_kravuttrykknr v_kravuttrykk.kravuttrykknr%type ) return resultattype ) return resultattype is is resultat1 resultattype; resultat1 resultattype; resultat2 resultattype; resultat2 resultattype; res_alle resultattype; res_alle resultattype; resultat resultattype; resultat resultattype; denne_tmp resultattype; denne_tmp resultattype; nr1 number := null; -- oppbrukte_fag_siste_nr før operand 1 nr1 number := null; -- oppbrukte_fag_siste_nr før operand 1 nr2 number := null; -- oppbrukte_fag_siste_nr før operand 2 (eller før nr2 number := null; -- oppbrukte_fag_siste_nr før operand 2 (eller før ku v_kravuttrykk%rowtype; -- en rad i kontrolltabellen ku v_kravuttrykk%rowtype; -- en rad i kontrolltabellen boo boolean; boo boolean; kravuttrykknr_forrige number; kravuttrykknr_forrige number; loggnivaa_forrige number; loggnivaa_forrige number; kk string(80); kk string(80); begin begin kravuttrykknr_forrige := kravuttrykknr_current; kravuttrykknr_forrige := kravuttrykknr_current; kravuttrykknr_current := p_kravuttrykknr; kravuttrykknr_current := p_kravuttrykknr; -- Kanskje overskriftmeldinger finnes? -- Kanskje overskriftmeldinger finnes? logg_melding(p_kravuttrykknr, resultat, 9999, kravuttrykknr_forrige); logg_melding(p_kravuttrykknr, resultat, 9999, kravuttrykknr_forrige); -- initierer record ku -- initierer record ku if ku_tabell.exists(p_kravuttrykknr) then if ku_tabell.exists(p_kravuttrykknr) then ku := ku_tabell(p_kravuttrykknr); ku := ku_tabell(p_kravuttrykknr); else else select * into ku from v_kravuttrykk select * into ku from v_kravuttrykk where kravuttrykknr = p_kravuttrykknr; where kravuttrykknr = p_kravuttrykknr; ku_tabell(p_kravuttrykknr) := ku; ku_tabell(p_kravuttrykknr) := ku; end if; end if; -- Finner evt kravdefinisjonbestemt loggenivå -- Finner evt kravdefinisjonbestemt loggenivå loggnivaa_forrige := c_loggnivaa; loggnivaa_forrige := c_loggnivaa; if loggnivaa.exists(p_kravuttrykknr) then if loggnivaa.exists(p_kravuttrykknr) then c_loggnivaa := loggnivaa(p_kravuttrykknr); c_loggnivaa := loggnivaa(p_kravuttrykknr); end if; end if; -- Logger kravuttrykk-raden -- Logger kravuttrykk-raden if kravkode.exists(p_kravuttrykknr) then if kravkode.exists(p_kravuttrykknr) then kk:=kravkode(p_kravuttrykknr); kk:=kravkode(p_kravuttrykknr); else else kk:=null; kk:=null; end if; end if; if 7 <= c_loggnivaa then if 7 <= c_loggnivaa then logg(rpad(ku.operatorkode ,7)|| logg(rpad(ku.operatorkode ,7)|| rpad(ku.operandtypekode1 ,2)|| rpad(ku.operandtypekode1 ,2)|| rpad(ku.kravuttrykknr1 ,5)|| rpad(ku.kravuttrykknr1 ,5)|| rpad(ku.fagkode1 ,7)|| rpad(ku.fagkode1 ,7)|| rpad(ku.attributtkode1 ,7)|| rpad(ku.attributtkode1 ,7)|| rpad(ku.konstant1 ,8)|| rpad(ku.konstant1 ,8)|| rpad(ku.operandtypekode2 ,2)|| rpad(ku.operandtypekode2 ,2)|| rpad(ku.kravuttrykknr2 ,5)|| rpad(ku.kravuttrykknr2 ,5)|| rpad(ku.fagkode2 ,7)|| rpad(ku.fagkode2 ,7)|| rpad(ku.attributtkode2 ,7)|| rpad(ku.attributtkode2 ,7)|| rpad(ku.konstant2 ,8)|| rpad(ku.konstant2 ,8)|| kk kk ,7 ,7 ); ); end if; end if; -- ---------- DEL 1, UTREGNING AV OPERAND 1 ---------- -- ---------- DEL 1, UTREGNING AV OPERAND 1 ---------- nr1 := nvl(oppbrukte_fag_siste_nr,0); nr1 := nvl(oppbrukte_fag_siste_nr,0); -- HELE ... SAMME ... -- HELE ... SAMME ... if ku.operatorkode = 'HELE' then if ku.operatorkode = 'HELE' then ikke_oppbrukt(0); ikke_oppbrukt(0); denne := resultat_USANN; denne := resultat_USANN; elsif ku.operatorkode = 'SAMME' then elsif ku.operatorkode = 'SAMME' then resultat := regn_ut_samme(p_vmnr, ku); resultat := regn_ut_samme(p_vmnr, ku); if resultat.antall_fag > 0 then if resultat.antall_fag > 0 then denne := resultat; denne := resultat; end if; end if; logg_melding(p_kravuttrykknr, resultat, nr1+1); logg_melding(p_kravuttrykknr, resultat, nr1+1); kravuttrykknr_current := kravuttrykknr_forrige; kravuttrykknr_current := kravuttrykknr_forrige; c_loggnivaa := loggnivaa_forrige; c_loggnivaa := loggnivaa_forrige; return resultat; return resultat; end if; end if; resultat1 := regn_ut_operand(p_vmnr, 1, ku); resultat1 := regn_ut_operand(p_vmnr, 1, ku); nr2 := nvl(oppbrukte_fag_siste_nr,0); nr2 := nvl(oppbrukte_fag_siste_nr,0); if ku.operatorkode = 'ALLE' and resultat1.resultatkode = 'SANN' if ku.operatorkode = 'ALLE' and resultat1.resultatkode = 'SANN' then then denne_tmp := denne; denne_tmp := denne; res_alle := kontroller_uttrykk(p_vmnr, p_kravuttrykknr); res_alle := kontroller_uttrykk(p_vmnr, p_kravuttrykknr); denne := denne_tmp; denne := denne_tmp; if 9 <= c_loggnivaa then if 9 <= c_loggnivaa then logg(' res_alle = '||res_alle.resultattypekode||', '|| logg(' res_alle = '||res_alle.resultattypekode||', '|| res_alle.resultatkode||', '|| res_alle.resultatkode||', '|| res_alle.resultattall||', '|| res_alle.resultattall||', '|| res_alle.vekt,9); res_alle.vekt,9); logg(resultat1.resultatkode||' '||ku.operatorkode,9); logg(resultat1.resultatkode||' '||ku.operatorkode,9); end if; end if; end if; end if; -- Kanskje operand 2 ikke behøver å regnes ut? -- Kanskje operand 2 ikke behøver å regnes ut? -- Returner resultatet av operand 1 isåfall. -- Returner resultatet av operand 1 isåfall. if resultat1.resultatkode = 'SANN' and ku.operatorkode = 'ELLER' if resultat1.resultatkode = 'SANN' and ku.operatorkode = 'ELLER' or resultat1.resultatkode = 'USANN' and ku.operatorkode in ('OG','ALLE','FØRSTE') or resultat1.resultatkode = 'USANN' and ku.operatorkode in ('OG','ALLE','FØRSTE') or ku.operatorkode in ('HELE','DUMMY') or ku.operatorkode in ('HELE','DUMMY') then then if resultat1.antall_fag > 0 then denne := resultat1; end if; if resultat1.antall_fag > 0 then denne := resultat1; end if; logg_melding(p_kravuttrykknr, resultat1, nr1+1, kravuttrykknr_forrige); logg_melding(p_kravuttrykknr, resultat1, nr1+1, kravuttrykknr_forrige); if ku.operatorkode = 'HELE' then if ku.operatorkode = 'HELE' then if kravkode.exists(p_kravuttrykknr) then kk := kravkode(p_kravuttrykknr); else kk := nul if kravkode.exists(p_kravuttrykknr) then kk := kravkode(p_kravuttrykknr); else kk := nul logg_sluttrapport(p_vmnr, resultat1, kk, 6); logg_sluttrapport(p_vmnr, resultat1, kk, 6); end if; end if; kravuttrykknr_current := kravuttrykknr_forrige; kravuttrykknr_current := kravuttrykknr_forrige; c_loggnivaa := loggnivaa_forrige; c_loggnivaa := loggnivaa_forrige; return resultat1; return resultat1; end if; end if; -- ---------- DEL 2, UTREGNING AV OPERAND 2 ---------- -- ---------- DEL 2, UTREGNING AV OPERAND 2 ---------- if ku.operatorkode in ('ALLE','FØRSTE') and ku.operandtypekode2 is null then if ku.operatorkode in ('ALLE','FØRSTE') and ku.operandtypekode2 is null then resultat2 := resultat_SANN; resultat2 := resultat_SANN; else else resultat2 := regn_ut_operand(p_vmnr, 2, ku); resultat2 := regn_ut_operand(p_vmnr, 2, ku); end if; end if; -- ---------- DEL 3, FINN RESULTAT V.H.A. OPERATOR OG RESULTAT AV OPERAND 1 OG 2 ---------- -- ---------- DEL 3, FINN RESULTAT V.H.A. OPERATOR OG RESULTAT AV OPERAND 1 OG 2 ---------- -- Hvis resultat1 og 2 er B (boolsk) ==> Lager boolsk resultat -- Hvis resultat1 og 2 er B (boolsk) ==> Lager boolsk resultat if resultat1.resultattypekode = 'B' if resultat1.resultattypekode = 'B' and resultat2.resultattypekode = 'B' then and resultat2.resultattypekode = 'B' then if ku.operatorkode in ('ELLER','ELLERF') and resultat1.resultatkode = 'USANN' then if ku.operatorkode in ('ELLER','ELLERF') and resultat1.resultatkode = 'USANN' then resultat := resultat2; resultat := resultat2; elsif ku.operatorkode = 'ELLERF' and resultat2.resultatkode = 'USANN' then elsif ku.operatorkode = 'ELLERF' and resultat2.resultatkode = 'USANN' then resultat := resultat1; resultat := resultat1; elsif ku.operatorkode = 'ALLE' and resultat2.resultatkode = 'USANN' then elsif ku.operatorkode = 'ALLE' and resultat2.resultatkode = 'USANN' then resultat := res_alle; resultat := res_alle; ikke_oppbrukt(nr1 + 1, nr2); ikke_oppbrukt(nr1 + 1, nr2); -- elsif ku.operatorkode = 'FØRSTE' and resultat2.resultatkode = 'SANN' then -- elsif ku.operatorkode = 'FØRSTE' and resultat2.resultatkode = 'SANN' then -- resultat := resultat1; -- resultat := resultat1; -- -- ikke_oppbrukt(nr2 + 1); -- -- ikke_oppbrukt(nr2 + 1); elsif ku.operatorkode = 'FØRSTE' and resultat2.resultatkode = 'USANN' then elsif ku.operatorkode = 'FØRSTE' and resultat2.resultatkode = 'USANN' then resultat := kontroller_uttrykk(p_vmnr, p_kravuttrykknr); resultat := kontroller_uttrykk(p_vmnr, p_kravuttrykknr); ikke_oppbrukt(nr1 + 1, nr2); ikke_oppbrukt(nr1 + 1, nr2); elsif ku.operatorkode = 'OG' and resultat2.resultatkode = 'USANN' then elsif ku.operatorkode = 'OG' and resultat2.resultatkode = 'USANN' then resultat := resultat2; resultat := resultat2; ikke_oppbrukt(nr1 + 1); ikke_oppbrukt(nr1 + 1); else else -- Situasjonen er nå to sanne operander og operator er OG, ELLERF, ALLE eller FØRSTE -- Situasjonen er nå to sanne operander og operator er OG, ELLERF, ALLE eller FØRSTE -- (Tester dette for sikkerhets skyld i første IF under) -- (Tester dette for sikkerhets skyld i første IF under) -- Summerer dermed resultat := resultat1 "+" resultat2 "+" evt res_alle, -- Summerer dermed resultat := resultat1 "+" resultat2 "+" evt res_alle, -- og returnerer resultat. -- og returnerer resultat. if ku.operatorkode not in ('OG','ELLERF','ALLE','FØRSTE') then if ku.operatorkode not in ('OG','ELLERF','ALLE','FØRSTE') then error('Skal aldri se dette! Operator='||ku.operatorkode); error('Skal aldri se dette! Operator='||ku.operatorkode); end if; end if; resultat := resultat2; resultat := resultat2; resultat.antall_fag := resultat1.antall_fag + resultat2.antall_fag; resultat.antall_fag := resultat1.antall_fag + resultat2.antall_fag; resultat.omfang := resultat1.omfang + resultat2.omfang; resultat.omfang := resultat1.omfang + resultat2.omfang; resultat.vekt := resultat1.vekt + resultat2.vekt; resultat.vekt := resultat1.vekt + resultat2.vekt; resultat.antall_tallkar := resultat1.antall_tallkar + resultat2.antall_tallkar; resultat.antall_tallkar := resultat1.antall_tallkar + resultat2.antall_tallkar; resultat.sum_tallkar := resultat1.sum_tallkar + resultat2.sum_tallkar; resultat.sum_tallkar := resultat1.sum_tallkar + resultat2.sum_tallkar; resultat.snitt_tallkar := divider(resultat.sum_tallkar, resultat.antall_tallkar); resultat.snitt_tallkar := divider(resultat.sum_tallkar, resultat.antall_tallkar); resultat.fordypninger_foert := resultat1.fordypninger_foert + resultat2.fordypninger_foe resultat.fordypninger_foert := resultat1.fordypninger_foert + resultat2.fordypninger_foe if resultat2.fagkode is not null then if resultat2.fagkode is not null then resultat.fagkode := resultat2.fagkode; resultat.fagkode := resultat2.fagkode; resultat.karakter_eksamen := resultat2.karakter_eksamen; resultat.karakter_eksamen := resultat2.karakter_eksamen; resultat.karakter_standpunkt := resultat2.karakter_standpunkt; resultat.karakter_standpunkt := resultat2.karakter_standpunkt; resultat.obligatorisk_eksamen := resultat2.obligatorisk_eksamen; resultat.obligatorisk_eksamen := resultat2.obligatorisk_eksamen; resultat.privatistkode := resultat2.privatistkode; resultat.privatistkode := resultat2.privatistkode; > resultat.eksamensaar := resultat2.eksamensaar; else else resultat.fagkode := resultat1.fagkode; resultat.fagkode := resultat1.fagkode; resultat.karakter_eksamen := resultat1.karakter_eksamen; resultat.karakter_eksamen := resultat1.karakter_eksamen; resultat.karakter_standpunkt := resultat1.karakter_standpunkt; resultat.karakter_standpunkt := resultat1.karakter_standpunkt; resultat.obligatorisk_eksamen := resultat1.obligatorisk_eksamen; resultat.obligatorisk_eksamen := resultat1.obligatorisk_eksamen; resultat.privatistkode := resultat1.privatistkode; resultat.privatistkode := resultat1.privatistkode; > resultat.eksamensaar := resultat1.eksamensaar; end if; end if; if ku.operatorkode = 'ALLE' then if ku.operatorkode = 'ALLE' then resultat.antall_fag := resultat.antall_fag + res_alle.antall_fag; resultat.antall_fag := resultat.antall_fag + res_alle.antall_fag; resultat.omfang := resultat.omfang + res_alle.omfang; resultat.omfang := resultat.omfang + res_alle.omfang; resultat.vekt := resultat.vekt + res_alle.vekt; resultat.vekt := resultat.vekt + res_alle.vekt; resultat.antall_tallkar := resultat.antall_tallkar + res_alle.antall_tallkar; resultat.antall_tallkar := resultat.antall_tallkar + res_alle.antall_tallkar; resultat.sum_tallkar := resultat.sum_tallkar + res_alle.sum_tallkar; resultat.sum_tallkar := resultat.sum_tallkar + res_alle.sum_tallkar; resultat.snitt_tallkar := divider(resultat.sum_tallkar, resultat.antall_tallkar); resultat.snitt_tallkar := divider(resultat.sum_tallkar, resultat.antall_tallkar); resultat.fordypninger_foert := resultat.fordypninger_foert + res_alle.fordypninger_foe resultat.fordypninger_foert := resultat.fordypninger_foert + res_alle.fordypninger_foe end if; end if; end if; end if; elsif resultat1.resultattypekode = 'T' elsif resultat1.resultattypekode = 'T' and resultat2.resultattypekode = 'T' then and resultat2.resultattypekode = 'T' then resultat := resultat2; resultat := resultat2; if ku.operatorkode='ADD' then resultat.resultattall := resultat1.resultattall + resulta if ku.operatorkode='ADD' then resultat.resultattall := resultat1.resultattall + resulta elsif ku.operatorkode='SUB' then resultat.resultattall := resultat1.resultattall - resulta elsif ku.operatorkode='SUB' then resultat.resultattall := resultat1.resultattall - resulta elsif ku.operatorkode='MUL' then resultat.resultattall := resultat1.resultattall * resulta elsif ku.operatorkode='MUL' then resultat.resultattall := resultat1.resultattall * resulta elsif ku.operatorkode='DVD' then resultat.resultattall := divider(resultat1.resultattall, elsif ku.operatorkode='DVD' then resultat.resultattall := divider(resultat1.resultattall, elsif ku.operatorkode='EQ' then boo := resultat1.resultattall = resultat2.resultattall; elsif ku.operatorkode='EQ' then boo := resultat1.resultattall = resultat2.resultattall; elsif ku.operatorkode='NE' then boo := resultat1.resultattall <> resultat2.resultattall; elsif ku.operatorkode='NE' then boo := resultat1.resultattall <> resultat2.resultattall; elsif ku.operatorkode='GT' then boo := resultat1.resultattall > resultat2.resultattall; elsif ku.operatorkode='GT' then boo := resultat1.resultattall > resultat2.resultattall; elsif ku.operatorkode='GE' then boo := resultat1.resultattall >= resultat2.resultattall; elsif ku.operatorkode='GE' then boo := resultat1.resultattall >= resultat2.resultattall; elsif ku.operatorkode='LT' then boo := resultat1.resultattall < resultat2.resultattall; elsif ku.operatorkode='LT' then boo := resultat1.resultattall < resultat2.resultattall; elsif ku.operatorkode='LE' then boo := resultat1.resultattall <= resultat2.resultattall; elsif ku.operatorkode='LE' then boo := resultat1.resultattall <= resultat2.resultattall; end if; end if; if ku.operatorkode in ('EQ','NE','GT','GE','LT','LE') then if ku.operatorkode in ('EQ','NE','GT','GE','LT','LE') then resultat.resultattypekode := 'B'; resultat.resultattypekode := 'B'; resultat.resultattall := null; resultat.resultattall := null; if boo then resultat.resultatkode := 'SANN'; if boo then resultat.resultatkode := 'SANN'; else resultat.resultatkode := 'USANN'; ikke_oppbrukt(nr1 + 1); end if; else resultat.resultatkode := 'USANN'; ikke_oppbrukt(nr1 + 1); end if; end if; end if; if resultat.resultatkode = 'SANN' or ku.operatorkode not in ('EQ','NE','GT','GE','LT','LE' if resultat.resultatkode = 'SANN' or ku.operatorkode not in ('EQ','NE','GT','GE','LT','LE' resultat.antall_fag := resultat1.antall_fag + resultat2.antall_fag; resultat.antall_fag := resultat1.antall_fag + resultat2.antall_fag; resultat.omfang := resultat1.omfang + resultat2.omfang; resultat.omfang := resultat1.omfang + resultat2.omfang; resultat.vekt := resultat1.vekt + resultat2.vekt; resultat.vekt := resultat1.vekt + resultat2.vekt; resultat.antall_tallkar := resultat1.antall_tallkar + resultat2.antall_tallkar; resultat.antall_tallkar := resultat1.antall_tallkar + resultat2.antall_tallkar; resultat.sum_tallkar := resultat1.sum_tallkar + resultat2.sum_tallkar; resultat.sum_tallkar := resultat1.sum_tallkar + resultat2.sum_tallkar; resultat.snitt_tallkar := divider(resultat.sum_tallkar, resultat.antall_tallkar); resultat.snitt_tallkar := divider(resultat.sum_tallkar, resultat.antall_tallkar); resultat.fordypninger_foert := resultat1.fordypninger_foert + resultat2.fordypninger_foe resultat.fordypninger_foert := resultat1.fordypninger_foert + resultat2.fordypninger_foe end if; end if; elsif elsif resultat1.resultattypekode = 'T' and resultat1.resultattypekode = 'T' and resultat2.resultattypekode = 'B' and resultat2.resultatkode = 'USANN' resultat2.resultattypekode = 'B' and resultat2.resultatkode = 'USANN' or or resultat1.resultattypekode = 'B' and resultat1.resultatkode = 'USANN' and resultat1.resultattypekode = 'B' and resultat1.resultatkode = 'USANN' and resultat2.resultattypekode = 'T' resultat2.resultattypekode = 'T' then then resultat.resultattypekode := 'B'; resultat.resultattypekode := 'B'; resultat.resultatkode := 'USANN'; resultat.resultatkode := 'USANN'; resultat.resultattall := null; resultat.resultattall := null; ikke_oppbrukt(nr1 + 1); ikke_oppbrukt(nr1 + 1); else else error('Mix av B(oolean)- og T(all)-operander, kunr='||p_kravuttrykknr|| error('Mix av B(oolean)- og T(all)-operander, kunr='||p_kravuttrykknr|| ', res1='||resultat1.resultattypekode|| ', res1='||resultat1.resultattypekode|| ', res2='||resultat2.resultattypekode); ', res2='||resultat2.resultattypekode); end if; end if; if resultat.antall_fag > 0 then denne := resultat; end if; if resultat.antall_fag > 0 then denne := resultat; end if; logg_melding(p_kravuttrykknr, resultat, nr1+1, kravuttrykknr_forrige); logg_melding(p_kravuttrykknr, resultat, nr1+1, kravuttrykknr_forrige); c_loggnivaa := loggnivaa_forrige; c_loggnivaa := loggnivaa_forrige; kravuttrykknr_current := kravuttrykknr_forrige; kravuttrykknr_current := kravuttrykknr_forrige; return resultat; return resultat; end kontroller_uttrykk; end kontroller_uttrykk; procedure kontroller ( procedure kontroller ( p_vmnr in v_kontrollresultat.vmnr%type, p_vmnr in v_kontrollresultat.vmnr%type, p_kravkode in v_kontrollresultat.kravkode%type, p_kravkode in v_kontrollresultat.kravkode%type, p_loggnivaa in number default 4, p_loggnivaa in number default 4, p_kontrollid in number default 0 p_kontrollid in number default 0 ) is ) is kravuttrykknr_start v_kravuttrykk.kravuttrykknr%type := null; kravuttrykknr_start v_kravuttrykk.kravuttrykknr%type := null; resultat resultattype; resultat resultattype; hode varchar2(600); hode varchar2(600); c_kravkode v_krav.kravkode%type := p_kravkode; c_kravkode v_krav.kravkode%type := p_kravkode; begin begin -- hvis default kravkode for vm -- hvis default kravkode for vm if c_kravkode is null then if c_kravkode is null then begin begin select kravkode into c_kravkode | select k.kravkode, v.avgangsaar, v.kurskode1, v.kurskode2, v.kurskode3 > into c_kravkode, c_avgangsaar, c_kurskode1, c_kurskode2, c_kurskode3 from v_vitnemaal v, v_kurskrav k from v_vitnemaal v, v_kurskrav k where v.vmnr=p_vmnr where v.vmnr=p_vmnr and v.kurskode1=k.kurskode1 and v.kurskode1=k.kurskode1 and v.kurskode2=k.kurskode2 and v.kurskode2=k.kurskode2 and v.kurskode3=k.kurskode3; and v.kurskode3=k.kurskode3; exception exception when no_data_found then c_kravkode := null; when no_data_found then c_kravkode := null; end; end; > else > select avgangsaar, kurskode1, kurskode2, kurskode3 > into c_avgangsaar,c_kurskode1,c_kurskode2,c_kurskode3 > from v_vitnemaal where vmnr=p_vmnr; end if; end if; -- Brukes i procedure logg -- Brukes i procedure logg linjenr_logg := 0; linjenr_logg := 0; c_vmnr := p_vmnr; c_vmnr := p_vmnr; c_loggnivaa := p_loggnivaa; c_loggnivaa := p_loggnivaa; if p_kontrollid = 0 then if p_kontrollid = 0 then select v_s_kontrollid.nextval into c_kontrollid from dual; select v_s_kontrollid.nextval into c_kontrollid from dual; else else c_kontrollid := p_kontrollid; c_kontrollid := p_kontrollid; end if; end if; -- Fjerner spor etter evt tidligere kjøringer med samme kontrollid -- Fjerner spor etter evt tidligere kjøringer med samme kontrollid delete from v_kontrollresultat where kontrollid=c_kontrollid; delete from v_kontrollresultat where kontrollid=c_kontrollid; delete from v_nvb_logg where kontrollid=c_kontrollid; delete from v_nvb_logg where kontrollid=c_kontrollid; delete from v_oppbrukte_fag where kontrollid=c_kontrollid; delete from v_oppbrukte_fag where kontrollid=c_kontrollid; -- delete from v_oppbrukte_fag2 where kontrollid=c_kontrollid; -- delete from v_oppbrukte_fag2 where kontrollid=c_kontrollid; oppbrukte_fag_siste_nr := null; oppbrukte_fag_siste_nr := null; -- Initierer nytt kontrollresultat -- Initierer nytt kontrollresultat insert into v_kontrollresultat insert into v_kontrollresultat (kontrollid, vmnr, kravkode, tidspunkt, resultattypekode) (kontrollid, vmnr, kravkode, tidspunkt, resultattypekode) values (c_kontrollid, p_vmnr, c_kravkode, sysdate, 'E'); values (c_kontrollid, p_vmnr, c_kravkode, sysdate, 'E'); fag_er_paa_vitnemaal := tom_boolean_tabell; fag_er_paa_vitnemaal := tom_boolean_tabell; for f in (select fagkode from v_vitnemaalfag where vmnr=c_vmnr) for f in (select fagkode from v_vitnemaalfag where vmnr=c_vmnr) loop loop fag_er_paa_vitnemaal(fagkode2heltall(f.fagkode)) := true; fag_er_paa_vitnemaal(fagkode2heltall(f.fagkode)) := true; if substr(f.fagkode,3,2) between '10' and '18' then if substr(f.fagkode,3,2) between '10' and '18' then fag_er_paa_vitnemaal(fagkode2heltall(substr(f.fagkode,1,2)||'XX'||substr(f.fagkode,5,2)) fag_er_paa_vitnemaal(fagkode2heltall(substr(f.fagkode,1,2)||'XX'||substr(f.fagkode,5,2)) end if; end if; if substr(f.fagkode,3,2) between '19' and '95' then if substr(f.fagkode,3,2) between '19' and '95' then fag_er_paa_vitnemaal(fagkode2heltall(substr(f.fagkode,1,2)||'YY'||substr(f.fagkode,5,2)) fag_er_paa_vitnemaal(fagkode2heltall(substr(f.fagkode,1,2)||'YY'||substr(f.fagkode,5,2)) end if; end if; end loop; end loop; -- Husker hvilke kravuttrykknr som har koblet en eller flere kravmeldinger til -- Husker hvilke kravuttrykknr som har koblet en eller flere kravmeldinger til -- seg. Dette for å gjøre procedure logg_melding mye raskere, siden den kalles -- seg. Dette for å gjøre procedure logg_melding mye raskere, siden den kalles -- så ofte. Husker også eksplisitt satt loggnivå ved de kravuttrykknr det gjelder. -- så ofte. Husker også eksplisitt satt loggnivå ved de kravuttrykknr det gjelder. har_melding := tom_boolean_tabell; -- eneste(?) måte å slette hashtabell på [sic] har_melding := tom_boolean_tabell; -- eneste(?) måte å slette hashtabell på [sic] loggnivaa := tom_integer_tabell; loggnivaa := tom_integer_tabell; for m in (select * from v_kravmelding where nvl(meldingtekst,'.')<>'.') for m in (select * from v_kravmelding where nvl(meldingtekst,'.')<>'.') loop loop if m.kravmeldingtypekode = 'LOGG' then if m.kravmeldingtypekode = 'LOGG' then loggnivaa(m.kravuttrykknr) := to_number(m.meldingtekst); loggnivaa(m.kravuttrykknr) := to_number(m.meldingtekst); else else har_melding(m.kravuttrykknr) := true; har_melding(m.kravuttrykknr) := true; end if; end if; end loop; end loop; -- Husker hvilken kravkode som er koblet til et kravuttrykknr -- Husker hvilken kravkode som er koblet til et kravuttrykknr -- og finner startnr'et. -- og finner startnr'et. kravkode := tom_string_tabell; kravkode := tom_string_tabell; for k in (select kravkode, kravuttrykknr from v_krav) for k in (select kravkode, kravuttrykknr from v_krav) loop loop kravkode(k.kravuttrykknr) := k.kravkode; kravkode(k.kravuttrykknr) := k.kravkode; if k.kravkode = nvl(c_kravkode,'(ukjent)') then if k.kravkode = nvl(c_kravkode,'(ukjent)') then kravuttrykknr_start := k.kravuttrykknr; kravuttrykknr_start := k.kravuttrykknr; end if; end if; end loop; end loop; -- Parseren har lagt inn flere kravuttrykk med "operator" av type OPT for fagliste -- Parseren har lagt inn flere kravuttrykk med "operator" av type OPT for fagliste -- på et kravuttrykknr der man kan hoppe over kravuttrykknr'et dersom ingen -- på et kravuttrykknr der man kan hoppe over kravuttrykknr'et dersom ingen -- av fagene finnes på vitnemålet (...mer...) -- av fagene finnes på vitnemålet (...mer...) skip_kravuttrykk := tom_boolean_tabell; skip_kravuttrykk := tom_boolean_tabell; for ku in ( for ku in ( select distinct kravuttrykknr1 from v_kravuttrykk select distinct kravuttrykknr1 from v_kravuttrykk where operatorkode='OPT' where operatorkode='OPT' minus minus select distinct k.kravuttrykknr1 from v_kravuttrykk k, v_vitnemaalfag vf select distinct k.kravuttrykknr1 from v_kravuttrykk k, v_vitnemaalfag vf where k.operatorkode='OPT' and k.fagkode1=vf.fagkode and vf.vmnr=p_vmnr where k.operatorkode='OPT' and k.fagkode1=vf.fagkode and vf.vmnr=p_vmnr union union select distinct k.kravuttrykknr1 from v_kravuttrykk k select distinct k.kravuttrykknr1 from v_kravuttrykk k where k.operatorkode='OPT-OG' and not exists where k.operatorkode='OPT-OG' and not exists (select null from v_vitnemaalfag (select null from v_vitnemaalfag where fagkode=k.fagkode1 and vmnr=p_vmnr) where fagkode=k.fagkode1 and vmnr=p_vmnr) ) ) loop loop skip_kravuttrykk(ku.kravuttrykknr1) := true; skip_kravuttrykk(ku.kravuttrykknr1) := true; --logg('Skip: '||ku.kravuttrykknr1,10); --logg('Skip: '||ku.kravuttrykknr1,10); end loop; end loop; ku_tabell := tom_ku_tabell; ku_tabell := tom_ku_tabell; -- Trenger disse -- Trenger disse resultat_SANN.resultattypekode := 'B'; resultat_SANN.resultattypekode := 'B'; resultat_SANN.resultatkode := 'SANN'; resultat_SANN.resultatkode := 'SANN'; resultat_SANN.resultattall := null; resultat_SANN.resultattall := null; resultat_SANN.antall_fag := 0; resultat_SANN.antall_fag := 0; resultat_SANN.omfang := 0; resultat_SANN.omfang := 0; resultat_SANN.vekt := 0; resultat_SANN.vekt := 0; resultat_SANN.antall_tallkar := 0; resultat_SANN.antall_tallkar := 0; resultat_SANN.sum_tallkar := 0; resultat_SANN.sum_tallkar := 0; resultat_SANN.snitt_tallkar := 0; resultat_SANN.snitt_tallkar := 0; resultat_SANN.fordypninger_foert := 0; resultat_SANN.fordypninger_foert := 0; resultat_USANN := resultat_SANN; resultat_USANN := resultat_SANN; resultat_USANN.resultatkode := 'USANN'; resultat_USANN.resultatkode := 'USANN'; -- Nullstiller -- Nullstiller denne := resultat_USANN; denne := resultat_USANN; select select '=================================================='|| '=================================================='|| ' Vitnemål '||vmnr||'/'||to_char(foedtdato,'DDMMYY')||personnummer||'/'||elevnavn||' '|| ' Vitnemål '||vmnr||'/'||to_char(foedtdato,'DDMMYY')||personnummer||'/'||elevnavn||' '|| '==================================================' '==================================================' into hode into hode from v_vitnemaal from v_vitnemaal where vmnr=p_vmnr; where vmnr=p_vmnr; logg('',2); logg('',2); logg('',2); logg('',2); logg('',2); logg('',2); logg('',2); logg('',2); logg(substr(hode,trunc(length(hode)/2)-38,76),2); logg(substr(hode,trunc(length(hode)/2)-38,76),2); -- Kanskje manglende c_kravkode -- Kanskje manglende c_kravkode if c_kravkode is null then if c_kravkode is null then select kurskode1||', '||kurskode2||', '||kurskode3||'>' select kurskode1||', '||kurskode2||', '||kurskode3||'>' into hode from v_vitnemaal where vmnr=p_vmnr; into hode from v_vitnemaal where vmnr=p_vmnr; logg('***FEIL: Manglende KRAVKODE for flg kurskoder på vitnemålet: '||hode,2); logg('***FEIL: Manglende KRAVKODE for flg kurskoder på vitnemålet: '||hode,2); return; return; end if; end if; -- Utfører kontrollen -- Utfører kontrollen resultat := kontroller_uttrykk(p_vmnr, kravuttrykknr_start); resultat := kontroller_uttrykk(p_vmnr, kravuttrykknr_start); -- Legger resultatet på plass i tabell kontrollresultat -- Legger resultatet på plass i tabell kontrollresultat update v_kontrollresultat set update v_kontrollresultat set resultattypekode = resultat.resultattypekode, resultattypekode = resultat.resultattypekode, resultatkode = resultat.resultatkode, resultatkode = resultat.resultatkode, resultattall = resultat.resultattall, resultattall = resultat.resultattall, antall_fag = resultat.antall_fag, antall_fag = resultat.antall_fag, omfang = resultat.omfang, omfang = resultat.omfang, vekt = resultat.vekt, vekt = resultat.vekt, antall_tallkar = resultat.antall_tallkar, antall_tallkar = resultat.antall_tallkar, sum_tallkar = resultat.sum_tallkar, sum_tallkar = resultat.sum_tallkar, snitt_tallkar = resultat.snitt_tallkar, snitt_tallkar = resultat.snitt_tallkar, fordypninger_foert = resultat.fordypninger_foert fordypninger_foert = resultat.fordypninger_foert where kontrollid = c_kontrollid; where kontrollid = c_kontrollid; -- Logger sluttrapport -- Logger sluttrapport logg_sluttrapport(p_vmnr, resultat, c_kravkode, 5); logg_sluttrapport(p_vmnr, resultat, c_kravkode, 5); -- commit; -- commit; end kontroller; end kontroller; function kontroller ( function kontroller ( p_vmnr in v_kontrollresultat.vmnr%type, p_vmnr in v_kontrollresultat.vmnr%type, p_kravkode in v_kontrollresultat.kravkode%type, p_kravkode in v_kontrollresultat.kravkode%type, p_loggnivaa in number default 4, p_loggnivaa in number default 4, p_kontrollid in number default 0 p_kontrollid in number default 0 ) return number ) return number is is kid number; kid number; begin begin if p_kontrollid > 0 then if p_kontrollid > 0 then kid := p_kontrollid; kid := p_kontrollid; else else select v_s_kontrollid.nextval into kid from dual; select v_s_kontrollid.nextval into kid from dual; end if; end if; kontroller(p_vmnr,p_kravkode,p_loggnivaa,p_kontrollid); | kontroller(p_vmnr,p_kravkode,p_loggnivaa,kid); return kid; return kid; end; end; -- bruker for testing/tidtaking -- bruker for testing/tidtaking procedure kontroller20 ( procedure kontroller20 ( p_vmnr in v_kontrollresultat.vmnr%type, p_vmnr in v_kontrollresultat.vmnr%type, p_kravkode in v_kontrollresultat.kravkode%type, p_kravkode in v_kontrollresultat.kravkode%type, p_loggnivaa in number default 4, p_loggnivaa in number default 4, p_kontrollid in number default 0 p_kontrollid in number default 0 ) is ) is starttid date; starttid date; antall number := 20; antall number := 20; begin begin DBMS_OUTPUT.ENABLE(500000); DBMS_OUTPUT.ENABLE(500000); starttid := sysdate; starttid := sysdate; for i in 1 .. antall for i in 1 .. antall loop loop kontroller(p_vmnr, p_kravkode, p_loggnivaa, p_kontrollid); kontroller(p_vmnr, p_kravkode, p_loggnivaa, p_kontrollid); commit; commit; end loop; end loop; dbms_output.put_line('Kjøretid: '||to_char((sysdate-starttid)*24*60*60/antall,'999.00')||' s dbms_output.put_line('Kjøretid: '||to_char((sysdate-starttid)*24*60*60/antall,'999.00')||' s end; end; procedure kontroller10 ( procedure kontroller10 ( p_vmnr in v_kontrollresultat.vmnr%type, p_vmnr in v_kontrollresultat.vmnr%type, p_kravkode in v_kontrollresultat.kravkode%type, p_kravkode in v_kontrollresultat.kravkode%type, p_loggnivaa in number default 4, p_loggnivaa in number default 4, p_kontrollid in number default 0 p_kontrollid in number default 0 ) is ) is starttid date; starttid date; antall number := 10; antall number := 10; begin begin DBMS_OUTPUT.ENABLE(500000); DBMS_OUTPUT.ENABLE(500000); starttid := sysdate; starttid := sysdate; for i in 1 .. antall for i in 1 .. antall loop loop kontroller(p_vmnr, p_kravkode, p_loggnivaa, p_kontrollid); kontroller(p_vmnr, p_kravkode, p_loggnivaa, p_kontrollid); commit; commit; end loop; end loop; dbms_output.put_line('Kjøretid: '||to_char((sysdate-starttid)*24*60*60/antall,'999.00')||' s dbms_output.put_line('Kjøretid: '||to_char((sysdate-starttid)*24*60*60/antall,'999.00')||' s end; end; procedure kontroller_alle_vitnemaal ( procedure kontroller_alle_vitnemaal ( p_kravkode in v_kontrollresultat.kravkode%type default null, p_kravkode in v_kontrollresultat.kravkode%type default null, p_loggnivaa in number default 4 p_loggnivaa in number default 4 ) is ) is begin begin for vm in (select vmnr from v_vitnemaal order by 1) for vm in (select vmnr from v_vitnemaal order by 1) loop loop kontroller(vm.vmnr, p_kravkode, p_loggnivaa,0); kontroller(vm.vmnr, p_kravkode, p_loggnivaa,0); commit; --hmm commit; --hmm end loop; end loop; end; end; end nvb; end nvb; / / -- Vis eventuelle kompileringsfeil -- Vis eventuelle kompileringsfeil sho err sho err > -- l 100 125 </xpm> <hr> </body> <!-- Mirrored from www.samordnaopptak.no/nvb/kontroll.sql__1.67__vs__1.74.html by HTTrack Website Copier/3.x [XR&CO'2014], Fri, 24 Feb 2017 08:10:41 GMT --> </html>