Forår 08 Solution Makers Kompetence System Construction Udarbejdet af Dan Buhr, Nicolaj Roos, Nick Niebling, Casper Cederberg og Jacob Hostrup Henriksen NORD, 2. semester Datamatiker, klasse tr07dat2, 26. maj 2008
Indholdsfortegnelse Arbejdsprocessen...4 Præ Inception Kravspecifikation...5 Produktet... 12 Brugsvejledning... 13 Refleksion over brug af Tortoise SVN... 24 Den fjerde iteration... 25 4: Find flaskehalse... 25 Principskema Find flaskehalse... 27 Tests... 28 Blackbox tests... 28 Sammendrag af brugertest... 28 Brugertest... 30 Opret projekt... 30 TESTCASE 1 : BEMAND PROJEKT... 31 TESTCASE 2 : REDIGER BEMANDING... 37 TESTCASE 3 : REDIGER PROJEKT... 43 White box test... 46 setkompetencebehov(kompetence, int, Integer)... 46 addmedarbejdertilknytning(medarbejder, Kompetence, int)... 47 removemedarbejdertilknytning(medarbejdertilknytning)... 48 removekompetencebehov(kompetencebehov)... 48 getkompetencebehov(ifkompetence)... 49 addkompetencebehov(kompetencebehov)... 50 getkompetencebehovliste(boolean)... 51 hasifkompetencebehov(ifkompetence)... 52 Screendump fra test... 52 Java koden... 53 GUIFrame... 53 FacadeDomain... 90 KontrolProjekt... 96 KontrolKunde... 101 KontrolKompetence... 102 KontrolMedarbejder... 103 IFProjekt... 106 Projekt... 108 IFKompetenceBehov... 118 KompetenceBehov... 119 IFKompetence... 121 Kompetence... 122 IFMedarbejder... 124 Medarbejder... 125 IFMedarbejderTilknytning... 131 MedarbejderTilknytning... 132 IFMedarbejderKompetence... 136 MedarbejderKompetence... 137 IFKunde... 140 Kunde... 141 PostnrBy... 144 FacadeDatasource... 144 KontrolDatasource... 147
mapperprojekt... 156 mapperkompetencebehov... 159 mappermedarbejdertilknytning... 163 mapperkompetence... 168 mappermedarbejder... 175 mappermedarbejderkompetence... 181 mapperkunde... 184 MapperPostnrBy... 186 Databasen... 189 Relationer, feltnavne og constraints... 189 Relation: PostnrBy... 189 Relation: Kunde... 190 Relation: Medarbejder... 191 Relation: Projekt... 192 Relation: Kompetence... 192 Relation: MedarbejderKompetencer... 194 Relation: ProjektKompetencer... 195 Relation: ProjektMedarbejdere... 196 Opret tabeller Script... 197 Indsæt data Script... 199 3/201
Arbejdsprocessen Beslutninger, overvejelser og arbejdsfordeling 4/201
Præ Inception Kravspecifikation KA2 Kravspecifikation Tirsdag d. 26. februar 2008 tr07dat2 2. semester Jacob Henriksen, Dan Buhr Larsen, Nick Niebling, Nicolaj Roos og Casper Cederberg 5/201
Indledning: Kendte fejl og mangler: Vi ved der mangler elementer på vores udarbejdede slides, heriblandt har vi brugt ordet 'ressource' ofte, i stedet for 'kompetence'. Dette ønskes udbedret i det videre forløb. Elementer der mangler i modellerne er bl.a. selve opgaven som er implicit, tilbagemelding til kunden om mulig udførelse af opgaven, udarbejdelse af kontrakt m.m. Antagelser: Vi antager at kompetencer kan måles med point, 1 5 pr kompetence. Definition af kundestørrelse kontra opgavestørrelse. Formål: Udnytte medarbejder resourcer optimalt. Optimere læring/udvikling/kompetencer. Prioritering af kunder. Mål: Brug af systemet skal sikre at en gennemsnitlig medarbejder arbejder som assistent 30 % af hvert år. Brug af systemet skal fastholde en minimumsvækst årligt på 20 %. Brug af systemet skal sikre en fordeling af kundesegmenterne på 10% små kunder, 45% mellemstore kunder og 45% store kunder. Krav: Systemet skal kunne registrere og opdaterer kompetence og udviklingsprofiler for alle konsulenter. Systemet skal kunne levere oplysninger om knappe kompetencer (potentielle flaskehalse). Systemet skal kunne generere statistikker om anvendelse af kompentecer. Systemet skal foreslå en liste af relevante projektledere. Systemet skal kunne foreslå medarbejdere til en given opgave ud fra kompetencer. Systemet skal kunne tilgodese storkunder, på baggrund af sælgerens vurdering af hvem der er potentielle storkunder. (hører sammen med næste krav) Systemet skal kunne hjælpe til styrring af forholdet mellem assistenter og konsulenter i et givent projekt, i forhold til de tre kundesegmenter. Systemet skal kunne beregne om man har ledige mandetimer i ordrebogen og kompentecer til at tage et givent projekt ind. 6/201
Formål mål krav Use Case Formål: Mål: Krav: Use cases('as-is'): Udnytte medarbejderresourcer optimalt. Optimere læring/udvikling/kom petencer Prioritering af kunder. Assistent 30% pa. Vækst 20% 10%/45%/45% Kompetence- & udviklingsprofiler Informerer om flaskehalse Statistik om anvendelse af kompetencer foreslå relevante projektledere foreslå medarbejdere ud for kompetencer Kunde stiller opgave Sælger vurderer kunde Udpegelse af projektleder Udvælgelse af projektmedarbejder Udførelse af opgaven Evaluering af projektgruppen tilgodeseelse af storkunder/forhold mellem assistenter og konsulenter Kåring af årets medarbejder Beregne om der er tid til at tage opgave ind 7/201
Solution Makers A/S Business Use Case 'as-is' stil opgave Kunde Sælger vurder kunde Vælg projektleder Projektchef vælg projektmedarbejder(e) Projektleder udfør opgave Projektmedarbejder evaluer projektgruppe Kår årets medarbejder 8/201
Solution Makers A/S Business Use Case To Be Stil opgave vurder kunde Kunde System opret kunde Sælger Nyt projekt Opret projekt Udpegelse af projektleder Projektchef Udvælg resourcer Alloker resourcer Proejktleder Evaluering af projektgruppe Projektmedarbejder Kåring af årets medarbejder 9/201
Solution Makers A/S Swimlane diagrammer Ordremodtagelse Kunde Sælger System Projektchef Projktleder Stil opgave Opgav Vurdér kunde Verificér kunde Opgav Opret opgave Verificér ressource Foreslå projektleder Vælg projektleder Modtag opgave 10/201
Projektforløb Projektleder Projektmedarbejder System Vælg ressource Allokér ressource Modtag opgave Udfør opgave Afslut opgave Status Evaluér projekt Registrér evaluering Aflevering 11/201
Produktet Solution Makers A/S, Kompetencesystem 12/201
Brugsvejledning Oversigt over afsnit: System og software krav Brugerkrav Hurtig start Installation af programmet Brug af programmet Beskrivelse af fanebladet Opret/rediger projekt Beskrivelse af fanebladet Bemand projekt Opret projekt System og software krav Windows XP/Vista, Mac OS X, Linux, Solaris eller HP UX. Internet forbindelse jdeveloper version 11g med opdateret JDBC Oracle driver version 6 Brugerkrav Grundlæggende kendskab til navigering under windows, derunder kopiering og overførsel af filer. Grundlæggende kendskab til java. Tegnforklaring: I denne installations og brugsvejledning, bruges < vinkelparentes start og > vinkelparentes slut, til at angive et tastaturtryk, eksempelvis <CTRL>, eller handling. Da forskellige maskiner i dag har forskellige drevbogstaver, angives denne variabel som type og/eller drev, eksempelvis C:\. 13/201
Hurtig start På den vedlagte DVD vælges mappen <Dvd-drev>:\Program\. I mappen forefindes filen SolutionMakersStandAlone.jar. Ved dobbeltklik på denne, afvikles programmet, og gøres klar til brug. Obs! Indlæsningstiden kan variere, og ved brug af ældre maskiner, anbefales det at kopiere SolutionMakersStandAlone.jar over på den lokale harddisk. Efter endt indlæsning er programmet klar til brug. Installation af programmet Obs! Denne installation kræver jdeveloper 11g, installeret og opdateret med Oracle JDBC driver version 6. Ved brug af ældre versioner af jdeveloper, kan der forekomme tab af funktionalitet. Da kildekoden ligger på en DVD, vil der blive vist en advarsel under indlæsning af koden. Dette da jdeveloper ikke kan gemme ændringer i koden. Ønskes et nærmere kik på programmet og dets kode, kan man vælge følgende fremgangsmåde: På den vedlagte DVD vælges mappen <Dvd-drev>:\Kildekode\. I mappen forefindes filen SolutionMakers.jpr. Ved dobbeltklik på denne, åbnes programmet jdeveloper 11g, samt en oversigt over de filer der indgår i kildekoden. Ved flere versioner af jdeveloper på den maskine der bruges, kan det forekomme at filen som udgangspunkt er sat til at blive åbnet med en ældre version. I det tilfælde er fremgangs måden som følger: 14/201
1. Åbn den version af jdeveloper som ønskes brugt til at åbne kildekoden med. 2. Vælg File Open, fra menuen i øverste venstre hjørne. 3. I vinduet der vises, navigeres til mappen <Dvd-drev>:\Kildekode\. 4. I denne mappe vælges enten SolutionMakers.jpr eller SolutionMakersApplikation.jws, og den valgte fil åbnes. Koden indlæses og kan gennemgås i nærmere detaljer. Som under Hurtig start kan programmet afvikles, dog ved at højreklikke på klassen GUIApp.java, og vælge <Run> fra menuen. Som tillæg til kildekoden, findes en oversigt over programmets struktur, ved at vælge mappen <Dvd-drev>:\JavaDoc\. I denne mappe dobbeltklikkes på filen Index.html. Herved åbnes den lokale browser, og en oversigt over kildekoden vises. Brug af programmet Før programmet tages i brug, er det væsentligt at gøre sig bekendt med følgende: Mandeår et helt arbejdsår opdeles i 1/8 (ottende dele). Dvs at en medarbejder kan deltage i udførelsen af et projekt med op til 8/8, altså et helt år. Ud for hver medarbejder der er relevant for et givent projekt (Se afsnittet Bemand projekt, punkt 2), er der angivet den pågældende medarbejders ledige tid. Når der skal tilknyttes en medarbejder til et projekt, angives den tid medarbejderen bidrager med i ottende dele, i feltet Tid (Se afsnittet Bemand projekt, punkt 5). Niveau for en medarbejders kompetence, altså dennes evner for eks. Java programmering, angives som point ud af 10 mulige. Eksempelvis vil en medarbejders kompetence for java, være repræsenteret af 5/10. En medarbejder opnår konsulentstatus, når denne har minimum 7/10, og vil derefter blive regnet som konsulent, når medarbejderen tilknyttes et projekt, med java programmering. For at tydelig gøre dette under bemanding af et projekt, vil der ved tilknytning og herunder kompetencevalg, vises niveau samt status (a), hvis den pågældende medarbejder tilknyttes som assistent. Designet af brugerfladen er IKKE endeligt og der kan derfor være placeringer af bl.a. knapper som ikke er intuitive. Vær opmærksom på knapperne <Tilknyt medarbejder>, <Fjern medarbejder> og <Gem projekt>, under fanen Bemand projekt. 15/201
Under fanebladet Opret/rediger projekt findes følgende funktionalitet: 1. Faneblade 2. Filter 3. Oversigtsvindue 4. Stamdata 5. Kompetencebehov 6. Valg af projektleder 7. Note og nulstil/gem Er du i tvivl om nogen af felterne i den højre halvdel af vinduet (4,5,6), kan du lade musemarkøren bevæge sig hen over teksten ud for feltet. Du vil herefter få en forklarende tekst vist i bunden af vinduet. 1 2 3 5 4 7 6 1. Programmet består af to faneblade med forskellige funktioner. Disse er placeret i øverste venstre hjørne. 16/201
2. Filter: Dette filter lader brugeren sortere projekter, sådan at kun de der opfylder de valgte betingelser, vises. 3. Oversigtsvindue: I dette vindue vises ved opstart af programmet, alle eksisterende projekter. 4. Stamdata: I det første felt angives et projektnavn. I de næste tre menuer, vælges henholdsvis projektstatus, årstal og kunde. De næste 2 felter er valgfri, men hvis brugeren ønsker det, kan der evt. anføres en kontaktperson og dennes tlfnr. 5. Kompetencebehov: I den næste menu, vælges en given kompetence, et behov anføres i ottende dele mandeår, i feltet nedenunder, og der kan derefter trykkes på knappen <Tilføj kompetence>, for at tilføje den valgte kompetence til projektets kompetencebehov. Ligeledes kan man vælge en af de, i listen præsenterede kompetencebehov, og fjerne denne, ved tryk på <Fjern kompetence>. 17/201
6. Vælg projektleder: Af de medarbejdere der er kvalificerede til at være projektledere, kan man i denne menu vælge hvem der skal være projektleder for netop det projekt der i øjeblikket oprettes/redigeres. 7. ProjektNote samt knapperne <Nulstil felter> og <Gem projekt>: ProjektNote giver brugeren mulighed for at skrive en kort tekst, eksempelvis uddybende supplement til de øvrige stamdata. Ved brug af <Nulstil felter>, ryddes alle felter og menuvalg nulstilles. Ved brug af <Gem projekt>, gemmes det projekt man har oprettet/redigeret. Under fanebladet Bemand projekt findes følgende funktionalitet: 1. Vælg projektet 18/201
2. Mulige medarbejdere 3. Tilføj/fjern 4. Tilknyttede medarbejdere 5. Kompetencevalg 6. Gem projekt 7. Medarbejderdækning 1 2 3 4 5 7 6 3. Vælg projekt: Her vælges det projekt brugeren ønsker at behandle. Som under fanen Opret/rediger projekt, kan her vælges en filtrering af projekter. 4. Mulige medarbejdere: I dette felt vises de medarbejdere der modsvarer det kompetencebehov et givent projekt har. 19/201
5. Knapperne <Fjern> og <Tilknyt>: Ved brug af disse knapper, kan medarbejdere fjernes og tilknyttes et projekt. 6. Tilknyttede medarbejdere: I dette felt vises de medarbejdere der allerede er tilknyttet et valgt projekt. 7. Kompetencevalg: Under dette punkt, kan brugeren vælge hvilken af en valgt medarbejders modsvarende kompetencer, der ønskes brugt, og i hvilken udstrækning. Hvis en medarebjders niveau, med en bestemt kompetence er under 7/10, vises (a), for at indikere at medarbejderen vil blive tilknyttet som assistent. Hvor meget en medarbejder skal bidrage projektet med, angives i heltal og fortolkes som ottende dele mandeår, i feltet Tid. 8. Knappen <Gem projekt>: Ved brug af denne knap, gemmes projektet med den nuværende bemanding. 20/201
9. Medarbejderdækning: I denne oversigt, kan ses hvordan behovet er dækket, hvor mange medarbejdere der deltager, samt hvilken fordeling af konsulenter og assistenter der bemander projektet. Opret projekt Ønskes et projekt oprettet og bemandet, gøres følgende (evt. med ovenstående gennemgang som støtte): 1. Start under fanen Opret/rediger projekt. 2. Kontrollér at alle felter er tomme og klar til nye værdier. 3. Er du i tvivl, trykkes på knappen <Nulstil felter>. 4. Herefter angives og vælges de stamdata der ønskes. Programmet giver tilbagemelding 21/201
hvis ikke alle krav til et projekt er angivet. 5. Vælg nu de kompetencer der skal til for at udføre projektet, altså projektets kompetencebehov. Hvis du fortryder kan værdierne fjernes eller overskrives. Overskrivelse af et behov, sker ved at vælge samme behov med en ny værdi, og vælge <Tilføj kompetence>. 6. Efterfølgende angives hvem du ønsker som projektleder. 7. Hvis du har behov for en beskrivelse eller note til projektet, udfyldes denne nu, og derefter trykkes på <gem projekt>. 8. Vælg nu fanen Bemand projekt. 9. Først vælger du dit projekt ved hjælp af menuen øverst til højre. 10. Herefter viser programmet hvilke medarbejdere der er relevante for projektet, samt hvilke der tilknyttet (ikke nogen endnu). 11. Vælg nu en medarbejder. 12. Når en medarbejder er markeret, vises hans navn i feltet nedenfor listen med mulige medarbejdere. 13. Du kan nu vælge hvilken kompetence han skal deltage med, og i hvor stor udstrækning. 14. Tryk på knappen <Tilknyt medarbejder>. Hvis du er i tvivl, kan du lade musemarkøren bevæge sig hen over de to knapper imellem medarbejderlisterne. En forklarende tekst vil blive vist. 15. Fortryder du en tilknytning af en medarbejder, kan denne fjernes ved at markere medarbejderen i listen af tilknyttede medarbejdere, og trykke på <Fjern medarbejder>. 22/201
16. Når projektet er som du ønsker det, trykkes på <Gem projekt>. God fornøjelse. Mvh Udviklerholdet. 23/201
Refleksion over brug af Tortoise SVN I starten af forløbet delte vi vores java kode via en Googlegruppe, hvor hvert enkelt gruppemedlem hentede koden, rettede i den og derefter uploadede den igen. Dette gav en del problemer, da det flere gange skete, at to gruppemedlemmer rettede i den samme kode samtidig. Da vi fra nogle elever på 4. semester hørte om SubVersion, vidste vi straks, at det var dét vi havde brug for. Det lykkedes os at få arrangeret en undervisningstime efter normal undervisningstid, hvor en elev fra 4. semester gav en introduktion til SubVersion til dem som måtte være interesserede. Det viste sig, at der var stor tilslutning til dette arrangement, da andre grupper havde siddet med de samme problemer som os. Subversion fungerer som et fælles lager, hvor man kan deponere sit projekt. Alle kan herefter hente projektet og arbejde i de forskellige filer m.m. Subversion hjælper med at tilføje rettelser fra hver enkelt bruger, til en 'fælles' udgave. Efter at have fået en introduktion til emnet fik vi oprettet et repository på en af skolens servere, og derefter gled vores arbejde meget lettere. Udover java koden flyttede vi også alle andre filer til vores repository, så hver enkelt gruppemedlem altid havde adgang til de seneste udgaver af alle dokumenter. Naturligvis skulle vi lige vænne os til at bruge det, men vi fik hurtigt indarbejdet nogle gode arbejdsrutiner med løbende at update og committe hver gang, vi havde skrevet noget. Brugen af SubVersion har hjulpet os meget, og vi har derfor foreslået vores uddannelsesleder, at fremtidige elever på 2. semester får en introduktion til dette, inden projektarbejdet starter. Ingen dans på roser, uden torne i fødderne, og vi har da også haft problemer med at skulle bruge et, for mange af os, nyt versionsstyringssystem. Vi oplevede en konflikt med java koden, hvor vi forsøgte flere (delvist uovervejede) forsøg på at få comittet en hel dags arbejde. Den tragiske afslutning på den historie, var at vi tabte en dags arbejde, p.g.a. fejlagtig brug. Derfra og frem, er der konsekvent blevet brugt en fremgangsmåde hvor man altid opdaterer før man comitter. Ved konflikter er det muligt at løse problemet. Subversion tilbyder brugeren mulighed for at vælge om konflikten skal løses med den lokale fil, eller den fælles på serveren ('mine' el. 'theirs'). Derudover kan man vælge at sammenflette to forskellige versioner, men denne mulighed har vi ikke haft udpræget behov for. Alt i alt har det været en stor succes at bruge Subversion, frem for at lægge en redigeret fil op, med nyt versionsnr i enden af filnavnet. Vi havde på et tidspunkt en pakket fil med vores kode i, som på lidt over en uge, endte med versionsnr 21. Med subversion er tallet større, men tingene tilføjes, fra brugerens synspunkt, en fællles fil, og derved ligger der ikke forskellige rettelser i flere forskellige filer. 24/201
Den fjerde iteration Vi var meget langt med den 4. Iteration, Use Casen Find flaskehalse, før vi valgte ikke at gennemfører den. Valget skyldes flere forhold. Dels skred tidsplanen for de første 3 iterationer og det kunne blive en kamp med tiden, at gennemføre denne sidste iteration samtidig med at vi skulle nå at samle dokumentationen til rapporten. Dels fandt vi ikke at denne funktionalitet, havde nogen relevans i forhold til de 3 øvrige funktioner der er implementeret i applikationen. Vi har valgt at medtage følgende overvejelser i bilaget, for at vise hvor langt vi reelt er nåede, uden dog at implementere. Reelt var vi nået frem til den konklusion, at langt den største del af implementeringen, lå i at udarbejde en forespørgsel til databasen, der udførte arbejdet for os og derefter præsentere resultatet i GUI. 4: Find flaskehalse Ordforklaring : 'Flaskehals' Kundernes efterspørgsel af en specifik kompetence, imødekommes ikke af medarbejdernes antal/kompetenceniveau. (Eksempel: Kundernes efterspørgsel på Java i 2007: 15 udviklere (x1) Firmaets antal af medarbejdere med Java kompetence i 2007: 20 udviklere (y1) Kundernes efterspørgsel på Java i 2008: 30 udviklere (x2) Firmaets antal af medarbejdere med Java kompetence i 2008: 25 udviklere (y2) 2007: x1/y1 = 15/20 = 0,75 = dækninsgrad 75% 2008: x2/y2 = 30/25 = 1,2 = dækningsgrad 120%) Virkefelt Solution Makers Kompetence System Niveau Brugerniveau Primær aktør Projektchef. Interessenter Firmaet: Ønsker at imødekomme fremtidige kompetencebehov. Projektchef: Ønsker estimat til vurdering af fremtidige ansættelser i virksomheden. Prækonditioner Der eksisterer projekter i systemet. Postkonditioner Der eksisterer et estimat på kommende behov for kompetencer. 25/201
Main Success Scenario: 8. Projektchef ankommer til terminal. 9. Projektchef vælger Estimér behov. 10. Systemet indlæser kompetencebehov for projekter. 11. Systemet indlæser det samlede antal kompetenceressourcer, for hver enkelt kompetencebehov indlæst under pkt. 3. 12. Systemet beregner estimat der identificerer flaskehalse på baggrund af stigende efterspørgsel på kompetencer set i forhold til nuværende kompetencer i virksomheden. 13. Systemet præsenterer estimat. Extensions: 10. Systemet kan ikke indlæse projekter (dette punkt gælder også pkt. 4). a. Estimat kan ikke udføres, og brugeren modtager en fejlmelding. 26/201
Principskema Find flaskehalse 27/201
Tests Blackbox tests Sammendrag af brugertest I dette afsnit gives et udsnit af det feedback der blev givet fra brugerne, ved brug af applikationen. Obs! Enkelte kommentarer er modtaget efter koden er 'frosset'. Brugerfladen er jo den del af programmet som vores testpersoner oplever på tæt hold. Derfor er en stor del af de kommentarer der er indsamlet, baseret på oplevelsen af at skulle udføre opgaver ved hjælp af vores brugerflade. Til hver test er der udarbejdet en opgave, indeholdende flere mindre del opgaver, som testpersonen skal forsøge at udføre, uden hjælp. Disse opgaver er udformet, sådan at det svarer til at gennemgå en Use case. For en mere detaljeret gennemgang, se testcase 1, testcase 2 og testcase 3 senere i dette afsnit, samt Use cases I produktrapporten, Fully dressed system use cases på side 27. Intuitiv brug af programmet: Det er ikke logisk at navngivningen ikke er den samme som i opgaveformulering. En af vores opgaver lyder som følger: Kompetencebehovet Java programmering tilføjes med ny værdi 6/8. Brugeren oplever at der i opgaven står ordet kompetencebehov, men at på brugerfladen bruges ordet kompetence. Den forskelligartede formulering skaber tvivl om hvordan opgaven udføres. Er projektet gemt nu?. I vores program, er der ingen tilbagemelding/verificering af hvorvidt et projekt er blevet gemt, efter der trykkes på <Gem projekt>. Der gives en fejlmeddelelse hvis projektet IKKE gemmes, men den manglende tilbagemelding skaber forvirring. Brugeren udtrykker tvivl om hvorvidt projektet rent faktisk er gemt. Bliver medarbejderen tilknyttet som assistent?. Under bemanding af et projekt, vises tilknytningen af en medarbejder, som assistent eller konsulent, ved at den kompetence der vælges at tilknytte med, indeholder et (a) for enden af kompetencenavnet ( (a) for assistent). Det kræver en bedre instruktion af brugeren og kan gøres tydeligere hvilken rolle medarebjderen får på projektet. 28/201
Inddelingen af områder er ikke logisk. Under test gør brugeren opmærksom på at det ikke virker logisk at der under fanen 'Bemand projekt' skal vælges kompetencer nederst. Flere testpersoner har intuitivt trykket på knappen <Gem projekt>, da denne ligger lige under det område hvor kompetencen vælges. I stedet skal trykkes på <Tilknyt medarbejder>, som ligger øverst i midten, imellem to lister over medarbejdere. Da koden er frosset, må vi blot konstatere at en ændring af placeringen af komponenter, ville afhjælpe problemet. Fint med de to vinduer, hvor man ser de mulige medarbejdere og de tilknyttede medarbejdere. Det giver overblik at kunne se to lister, side om side, med alle medarbejdere som enten er tilknyttet projektet eller kan blive det. 29/201
Brugertest Opret projekt Denne opgave skal bringe brugeren igennem forløbet, beskrevet i Use Casen Opret projekt. Testen har 2 formål. Dels at teste funktionaliteten i applikationen, dvs. at projektet oprettes i databasen. Det er også vigtigt at få en tilbagemelding fra brugeren på anvendelsen af applikationen. Altså om brugerfladen er intuitiv i forhold til løsningen af opgaven. Opgave: En kunde har henvendt sig for at få løst en opgave, og der skal derfor oprettes et nyt projekt. Det er din opgave at oprette projektet. Om projektet kan oplyses følgende: Navn på projektet: Kunde: Kontaktperson: <<dit navn>> projekt Michaels Spøg og skæmt Hans Jensen Tlf. til kontaktperson: 43 21 56 78 Krævede kompetencer: Java (22/8 mandeår), C++ (16/8 mandeår) Projektleder: Jacob Henriksen Testpersonens feedback: Brugerfladen er nem at forstå og opgaven var nem at løse. Undervejs opstod der en fejl, da der ikke var opgivet et projekt år og en status.. Der var ikke yderligere kommentarer. Det skal bemærkes at fejlmeldingen ved manglende angivelse af år og status er en fejl i brugerfladen og den er senere rettet. Udskrift fra DB efter test: 30/201
TESTCASE 1 : BEMAND PROJEKT Det forventes at opgaven, testskemaet samt screendumps nedenfor sammenholdes til en helhed. Prekonditioner: Programmet er opstartet og projektet " Kompetencesystem SolutionMakers" er oprettet. Opgave: Projektlederen ønsker at bemande projektet Kompetencesystem SolutionMakers, med følgende medarbejdere: Casper Cederberg tilknyttes med UML diagrammering (2/8 mandeår) Nicolaj Roos tilknyttes med UML diagrammering (2/8 mandeår) Projektet gemmes. Case Forventet Resultat 8. Projektlederen angiver at han ønsker at bemande et projekt (se fig.1 2) 9. Projektlederen angiver det ønskede projekt, Kompetencesystem SolutionMakers. (se fig.3 4). 10. Projektlederen vælger "Casper Cederberg", med kompetencen "UML diagrammering" og angiver tid: 2 (/8 mandeår) (se fig.5 8). Herefter vælges ">>" (tilknyt). 11. Punkt 3 gentages med "Nicolaj Roos". Fanebladet bemand projekt vises og der vises en oversigt med projekter, deriblandt Kompetencesystem SolutionMakers. Projektets data, samt relevante medarbejdere vises. Medarbejderen tilknyttes projektet med de valgte data. Medarbejderen tilknyttes projektet med de valgte data. OK dog vises projekter ikke i en oversigt, men i en dropdownmenu. OK OK men det vises først ved valg af kompetence, hvorvidt medarbejderens tilknytning er som konsulent eller assistent (a). OK men det vises først ved valg af kompetence, hvorvidt medarbejderens tilknytning er som konsulent eller assistent (a). 12. Projektlederen Projektet er gemt. OK ved kontrol af databasen, 31/201
gemmer projektet(se fig.9). dog gives ingen tilbagemelding til brugeren. Fig. 1 Fig. 2 32/201
Fig. 3 33/201
Fig. 4 34/201
Fig. 5 Fig. 6 35/201
Fig. 7 Fig. 8 36/201
Fig. 9 TESTCASE 2 : REDIGER BEMANDING Det forventes at opgaven, testskemaet samt screendumps nedenfor sammenholdes til en helhed. Prekonditioner: Programmet er opstartet og projektet " Kompetencesystem SolutionMakers" er oprettet og valgt, under fanen "Bemand projekt" (se fig. 1). Opgave: Projektlederen ønsker at ændre bemandingen af et projekt: Dan Buhr tages af projektet Nicolaj Roos tilknyttes med Java programmering (3/8 mandeår) Jacob Henriksen tilknyttes med Java programmering (1/8 mandeår) Projektet gemmes. Case Forventet Resultat 37/201
5. Projektlederen vælger den tilknyttede medarbejder "Dan Buhr", og vælger "<<" (fjern medarbejder) (se fig. 2) 6. Projektlederen vælger "Nicolaj Roos", med kompetencen "Java programmerin g" og angiver tid: 3 (/8 mandeår). Herefter vælges ">>" (tilknyt) (se fig. 3). 7. Punkt 2 gentages med "Jacob Henriksen", "Java programmerin g", og en tidsangivelse på 1 (/8 mandeår) (se fig. 3). 8. Projektlederen gemmer projektet. Den valgte medarbejder bliver fjernet fra projektet. Medarbejderen tilknyttes projektet med de valgte data. Medarbejderen tilknyttes projektet med de valgte data. Projektet er gemt. OK OK men det vises først ved valg af kompetence, hvorvidt medarbejderens tilknytning er som konsulent eller assistent (a). OK men det vises først ved valg af kompetence, hvorvidt medarbejderens tilknytning er som konsulent eller assistent (a). OK ved kontrol af databasen (se fig. 4 5), dog gives ingen tilbagemelding til brugeren. 38/201
Fig. 1 39/201
Fig. 2 40/201
Fig. 3 41/201
Fig. 4 Fig. 5 42/201
TESTCASE 3 : REDIGER PROJEKT Det forventes at opgaven, testskemaet samt screendumps nedenfor sammenholdes til en helhed. Prekonditioner: Programmet er opstartet og projektet " Kompetencesystem SolutionMakers" er oprettet og valgt, under fanen "Opret/rediger projekt". Opgave: Projektlederen ønsker at redigere projektet Kompetencesystem SolutionMakers, med følgende ændringer: Projektnavnet ændres til Kompetencesystem SolutionMakers 2. Kontakperson ændres til Klaus Petersen. Kontakpersonen's tlfnr. Ændres til +45 12 34 56 73. Kompetencebehovet Java programmering tilføjes med ny værdi 6/8. Kompetencebehovet C++ programmering tilføjes med værdi 2/8. Projektleder Nick Niebling vælges som projektleder. Projektet gemmes. Case Forventet Resultat 9. Projektlederen angiver at han ønsker at redigere et projekt, ved at vælge fanen Opret/rediger. 10. Projektlederen angiver det ønskede projekt. 11. Projektlederen angiver nye data (se opgaveliste ovenfor), og vælger Gem projekt. Fanebladet opret/rediger projekt vises og der vises en oversigt med projekter, deriblandt Kompetencesystem SolutionMakers. Projektets data vises. Projektet gemmes med de valgte data. OK dog kan området hvor der angives kompetencebehov virke tvetydigt, da der bruges en tekst kompetencer i stedet for eksempelvis kompetencebehov. OK OK dog mangler en tydelig tilbagemelding om at projektet rent faktisk er blevet gemt. Brugertesten viser at brugerfladen ikke er intuitiv. Der mangler f.eks en tekst der viser hvad der er en oversigt, og hvad der er en menu, ved tilføjelse af et kompetencebehov. 43/201
Databasen før ændringer er gennemført: Ændringer der gennemføres: Ændringer i databasen efter projektet gemmes: 44/201
45/201
White box test Formålet med en white box test, er at undersøge en metode ud i alle de mulige kombinationer. Som et eksempel på en whitebox test, har vi valgt at vise en test af projekt klassen. Projekt klassen er et af de bærende objekter i applikationen, da den er databærende for alle informationer. For ikke at lave testen for omfattende, har vi fravalgt at teste alle ordinære set og get metoder, der ikke indeholder betingelser der er med til at bestemme output. Illustrationerne viser hvor mange alternativer der er og hvilke yderpunkter der er gennem forløbet. Igennem testen, vil vi vise at metoden kan følge vejen til et forventet resultat. Sidst i dette afsnit er der et screendump fra en testkørsel. setkompetencebehov(kompetence, int, Integer) Metode: setkompetencebehov(kompetence, int, Integer) Antal muligheder: 4 Navn på test Testet med værdi Sti Forventet resultat BehovUaendretFraDB Status = 0 True Status = 0 BehovKendtKompetence Status = 2 Behov =eksist. behov BehovStatus2 Status = 2 ikke eksisterende behov BehovStatus3 Status = 3 ikke eksisterende behov False true Status = 1 False false Status = 3 False false Status = 3 46/201
addmedarbejdertilknytning(medarbejder, Kompetence, int) Metode: addmedarbejdertilknytning(medarbejder, Kompetence, int) Antal muligheder: 4 Navn på test Testet med værdi Sti Forventet resultat NyMedarbTilknytning Ukendt kompetence False Status = 3 OpdateringFejlTid Kendt kompetence Kendt medarbejder samlet tid > 8 True true Null OpdateringStatus0 OpdateringStatus3 Kendt kompetence Kendt medarbejder Status = 0 Kendt kompetence Kendt medarbejder Status = 3 True false true Status = 1 True false false Status = 3 47/201
removemedarbejdertilknytning(medarbejdertilknytning) Metode: removemedarbejdertilknytning(medarbejdertilknytning) Antal muligheder: 2 Navn på test Testet med værdi Sti Forventet resultat MedarbTilknStatus3 Status = 3 true Objekt fjernet fra liste MedarbTilknStatus0 Status = 0 False Status = 2 removekompetencebehov(kompetencebehov) Metode: removekompetencebehov(kompetencebehov) Antal muligheder: 2 Navn på test Testet med værdi Sti Forventet resultat KompBehov3 Status = 3 true Objekt fjernet fra liste KompBehov0 Status = 0 False Status = 2 48/201
getkompetencebehov(ifkompetence) Metode: getkompetencebehov(ifkompetence) Antal muligheder: 2 Navn på test Testet med værdi Sti Forventet resultat KompBehovFound Eksisterende kompetence true Returnerer kompetencebehov KompBehovNotFound Ikke eksisterende kompetence False Null 49/201
addkompetencebehov(kompetencebehov) Metode: addkompetencebehov(kompetencebehov) Antal muligheder: 3 Navn på test Testet med værdi Sti Forventet resultat ExistKompBehovStatus3 Status = 3 eksisterende kompetence nyt behov NonExistKompBehovStatus3 Status = 3 Ikke eksisterende kompetence True true True false Opdateret behov KompetenceBehov tilføjet KompBehovStatus1 Status = 1 False KompetenceBehov tilføjet 50/201
getkompetencebehovliste(boolean) Metode: getkompetencebehovliste(boolean) Antal muligheder: 2 Navn på test Testet med værdi Sti Forventet resultat KompBehovListeAlle KompBehovListeSome Parameter = true 2 kompbehov med status 1 og 2 Parameter = false 2 kompbehov med status 1 og 2 True Listens længde = 2 False Listens længde = 1 51/201
hasifkompetencebehov(ifkompetence) Metode: hasifkompetencebehov(ifkompetence) Antal muligheder: 3 Navn på test Testet med værdi Sti Forventet resultat haskompbehov Eksisterende kompetence status 1 True True haskompbehovslettet Eksisterende kompetence status 2 False False hasnotkompbehov Ikke eksisterende kompetence False False Screendump fra test 52/201
Java koden GUIFrame package solutionmakers; import java.awt.color; import java.awt.dimension; import java.awt.font; import java.awt.rectangle; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.util.arraylist; import javax.swing.; import javax.swing.jbutton; import javax.swing.jcombobox; import javax.swing.jformattedtextfield; import javax.swing.jlabel; import javax.swing.jlist; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jseparator; import javax.swing.jtextarea; import javax.swing.jtextfield; import javax.swing.event.; import solutionmakers.facadedomain.; public class GUIFrame extends JFrame //---------------------------------------------------------------- private FacadeDomain facade = FacadeDomain.getInstance(); private String fejlstreng; private JFrame popup; private IFProjekt loadedprojekt; private JTabbedPane jtabbedpane1 = new JTabbedPane(); //private ArrayList<IFKompetence> midlertidigekompetencer = //new ArrayList<IFKompetence>(); private ArrayList<IFKompetenceBehov> listeifkompetencebehov = new ArrayList<IFKompetenceBehov>(); //JPANELS START -- JPANELS START -- JPANELS START -- JPANELS START -- JPANELS START -- JPANELS START private JPanel ProjektFane = new JPanel(); 53/201
private JPanel TilknytMedarbFane = new JPanel(); //JPANELS SLUT -- JPANELS SLUT -- JPANELS SLUT -- JPANELS SLUT -- JPANELS SLUT -- JPANELS SLUT // // //ERKL?RINGER - ERKL?RINGER - ERKL?RINGER - ERKL?RINGER - ERKL?RINGER - ERKL?RINGER // // FANE 1 - OPRET/REDIGER PROJEKT FANE 1 -OPRET/REDIGER PROJEKT FANE 1 -OPRET/REDIGER PROJEKT // // //JLABELS START (FANE 1) -- JLABELS START (FANE 1) -- JLABELS START (FANE 1)-- JLABELS START (FANE 1)-- JLABELS START (FANE 1) private JLabel jlabelopretredigerindlaesprojektvaelgfilter = new JLabel(); private JLabel jlabelopretredigerprojektnavn = new JLabel(); private JLabel jlabelopretredigerkunde = new JLabel(); private JLabel jlabelopretredigerprojektleder = new JLabel(); private JLabel jlabelopretredigerkompetencer = new JLabel(); private JLabel jlabelopretredigerkontaktperson = new JLabel(); private JLabel jlabelopretredigerprojektnote = new JLabel(); private JLabel jlabelopretredigerprojektstatus = new JLabel(); private JLabel jlabelopretredigerbehov = new JLabel(); private JLabel jlabelopretredigerkontaktpersontlf = new JLabel(); private JLabel jlabelopretredigerottendedele = new JLabel(); //JLABELS SLUT (FANE 1)-- JLABELS SLUT (FANE 1)-- JLABELS SLUT (FANE 1)-- JLABELS SLUT (FANE 1)-- JLABELS SLUT (FANE 1)-- JLABELS SLUT (FANE 1) //JBUTTONS START (FANE 1)-- JBUTTONS START (FANE 1)-- JBUTTONS START (FANE 1)-- JBUTTONS START (FANE 1)-- JBUTTONS START (FANE 1)-- JBUTTONS START (FANE 1) private JButton jbuttonopretredigergemprojekt = new JButton(); private JButton jbuttonopretredigernulstilfelter = new JButton(); private JButton jbuttonopretredigertilfoejkompetence = new JButton(); //JBUTTONS SLUT (FANE 1)-- JBUTTONS SLUT (FANE 1)-- JBUTTONS SLUT (FANE 1)-- JBUTTONS SLUT (FANE 1)-- JBUTTONS SLUT (FANE 1)-- JBUTTONS SLUT (FANE 1) //JTEXTFIELDS START (FANE 1)-- JTEXTFIELDS START (FANE 1)-- JTEXTFIELDS START (FANE 1)-- JTEXTFIELDS START (FANE 1)-- JTEXTFIELDS START (FANE 1) private JTextField jtextfieldopretredigerangivprojektnavn = new JTextField(); private JTextField jtextfieldopretredigerkontaktperson = new JTextField(); private JTextField jtextfieldopretredigertlftilkontakt = new JTextField(); private JTextField jtextfieldopretredigerbehov = new JTextField(); 54/201
//JTEXTFIELDS SLUT (FANE 1)-- JTEXTFIELDS SLUT (FANE 1)-- JTEXTFIELDS SLUT (FANE 1)-- JTEXTFIELDS SLUT (FANE 1)-- JTEXTFIELDS SLUT (FANE 1) //JTEXTAREA START (FANE 1) -- JTEXTAREA START (FANE 1) -- JTEXTAREA START (FANE 1) -- JTEXTAREA START (FANE 1) -- JTEXTAREA START (FANE 1) private JTextArea jtextareaopretredigernote = new JTextArea(); //JTEXTAREA SLUT (FANE 1) -- JTEXTAREA SLUT (FANE 1) -- JTEXTAREA SLUT (FANE 1) -- JTEXTAREA SLUT (FANE 1) -- JTEXTAREA SLUT (FANE 1) -- JTEXTAREA SLUT (FANE 1) //JLIST START (FANE 1) -- JLIST START (FANE 1) -- JLIST START (FANE 1) -- JLIST START (FANE 1) -- JLIST START (FANE 1) private JList jlistopretredigerprojektoversigt = new JList(); private JList jlistopretredigerkompetencebehov = new JList(); //JLIST SLUT (FANE 1) -- JLIST SLUT (FANE 1) -- JLIST SLUT (FANE 1) -- JLIST SLUT (FANE 1) -- JLIST SLUT (FANE 1) //JCOMBOBOX START (FANE 1) -- JCOMBOBOX START (FANE 1) -- JCOMBOBOX START (FANE 1) -- JCOMBOBOX START (FANE 1) -- JCOMBOBOX START (FANE 1) -- JCOMBOBOX START (FANE 1) private JComboBox jcomboopretredigervaelgkunde = new JComboBox(); private JComboBox jcomboopretredigervaelgprojektleder = new JComboBox(); private JComboBox jcomboopretredigerfilterprojektstatus = new JComboBox(); private JComboBox jcomboopretredigerfilteraarstal = new JComboBox(); private JComboBox jcomboopretredigervaelgaarstal = new JComboBox(); private JComboBox jcomboopretredigervaelgkompetence = new JComboBox(); private JComboBox jcomboopretredigervaelgprojektstatus = new JComboBox(); //JCOMBOBOX SLUT (FANE 1) -- JCOMBOBOX SLUT (FANE 1) -- JCOMBOBOX SLUT (FANE 1) -- JCOMBOBOX SLUT (FANE 1) -- JCOMBOBOX SLUT (FANE 1) -- JCOMBOBOX SLUT (FANE 1) //JSCROLLPANE START (FANE 1) -- JSCROLLPANE START (FANE 1) -- JSCROLLPANE START (FANE 1) -- JSCROLLPANE START (FANE 1) -- JSCROLLPANE START (FANE 1) private JScrollPane jscrollpane1 = new JScrollPane(); private JScrollPane jscrollpane3 = new JScrollPane(); private JScrollPane jscrollpane4 = new JScrollPane(); //JSCROLLPANE SLUT (FANE 1) -- JSCROLLPANE SLUT (FANE 1) -- JSCROLLPANE SLUT (FANE 1) -- JSCROLLPANE SLUT (FANE 1) -- JSCROLLPANE SLUT (FANE 1) // // //ERKL?RINGER - ERKL?RINGER - ERKL?RINGER - ERKL?RINGER - ERKL?RINGER - ERKL?RINGER // // FANE 2 - BEMAND PROJEKT FANE 2 - BEMAND PROJEKT FANE 2 - BEMAND PROJEKT FANE 2 - BEMAND PROJEKT // // 55/201
//JLABELS START (FANE 2) -- JLABELS START (FANE 2) -- JLABELS START (FANE 2) -- JLABELS START (FANE 2) -- JLABELS START (FANE 2) private JLabel jlabelbemandprojektmedarbejder1 = new JLabel(); private JLabel jlabelbemandprojektmedarbejder2 = new JLabel(); private JLabel jlabelbemandprojektkompetence = new JLabel(); private JLabel jlabelbemandprojekttid = new JLabel(); private JLabel jlabelbemandprojektbemandprojekt = new JLabel(); private JLabel jlabelbemandprojektvaelgprojekt = new JLabel(); private JLabel jlabelbemandprojektmuligemedarbejdere = new JLabel(); private JLabel jlabelbemandprojekttilknyttedemedarbejdere = new JLabel(); private JLabel jlabelopretredigerprojektaar = new JLabel(); private JLabel jlabelbemandprojektmedarbejderdaekning = new JLabel(); private JLabel jlabelbemandprojektmedarbejderdaekning = new JLabel(); //JLABELS SLUT (FANE 2) -- JLABELS SLUT (FANE 2) -- JLABELS SLUT (FANE 2) -- JLABELS SLUT (FANE 2) -- JLABELS SLUT (FANE 2) -- JLABELS SLUT (FANE 2) //JBUTTONS START (FANE 2) -- JBUTTONS START (FANE 2) -- JBUTTONS START (FANE 2) -- JBUTTONS START (FANE 2) -- JBUTTONS START (FANE 2) -- JBUTTONS START (FANE 2) private JButton jbuttonbemandprojekttilknytmedarbejder = new JButton(); private JButton jbuttonbemandprojektfjerntilknyttetmedarbejder = new JButton(); private JButton jbuttonbemandprojektgemprojekt = new JButton(); //JBUTTONS SLUT (FANE 2) -- JBUTTONS SLUT (FANE 2) -- JBUTTONS SLUT (FANE 2) -- JBUTTONS SLUT (FANE 2) -- JBUTTONS SLUT (FANE 2) -- JBUTTONS SLUT (FANE 2) //JTEXTFIELDS START (FANE 2)-- JTEXTFIELDS START (FANE 2)-- JTEXTFIELDS START (FANE 2)-- JTEXTFIELDS START (FANE 2)-- JTEXTFIELDS START (FANE 2) private JTextField jtextfieldbemandprojektmedarbejdernavn = new JTextField(); private JTextField jtextfieldbemandprojektangivtid = new JTextField(); //JTEXTFIELDS SLUT (FANE 2)-- JTEXTFIELDS SLUT (FANE 2)-- JTEXTFIELDS SLUT (FANE 2)-- JTEXTFIELDS SLUT (FANE 2)-- JTEXTFIELDS SLUT (FANE 2) //JTEXTAREA START (FANE 2) -- JTEXTAREA START (FANE 2) -- JTEXTAREA START (FANE 2) -- JTEXTAREA START (FANE 2) -- JTEXTAREA START (FANE 2) private JTextArea jtextareabemandprojektmedarbejderdaekning = new JTextArea(); //JTEXTAREA SLUT (FANE 2) -- JTEXTAREA SLUT (FANE 2) -- JTEXTAREA SLUT (FANE 2) -- JTEXTAREA SLUT (FANE 2) -- JTEXTAREA SLUT (FANE 2) -- JTEXTAREA SLUT (FANE 2) //JLIST START (FANE 2) -- JLIST START (FANE 2) -- JLIST START (FANE 2) -- JLIST START (FANE 2) -- JLIST START (FANE 2) private JList jlistbemandprojektmuligemedarbejdere = new JList(); private JList jlistbemandprojekttilknyttedemedarbejdere = new JList(); //JLIST SLUT (FANE 2) -- JLIST SLUT (FANE 2) -- JLIST SLUT (FANE 2) -- JLIST SLUT (FANE 2) -- JLIST SLUT (FANE 2) //JCOMBOBOX START (FANE 2) -- JCOMBOBOX START (FANE 2) -- JCOMBOBOX START (FANE 2) -- JCOMBOBOX START (FANE 2) -- JCOMBOBOX START (FANE 2) -- JCOMBOBOX START (FANE 2) private JComboBox jcombobemandprojektfilteraarstal = new JComboBox(); private JComboBox jcombobemandprojektfilterprojektstatus = new JComboBox(); private JComboBox jcombobemandprojektvaelgprojekt = new JComboBox(); private JComboBox jcombobemandprojektvaelgkompetence = new JComboBox(); 56/201
//JCOMBOBOX SLUT (FANE 2) -- JCOMBOBOX SLUT (FANE 2) -- JCOMBOBOX SLUT (FANE 2) -- JCOMBOBOX SLUT (FANE 2) -- JCOMBOBOX SLUT (FANE 2) -- JCOMBOBOX SLUT (FANE 2) //JSCROLLPANE START (FANE 2) -- JSCROLLPANE START (FANE 2) -- JSCROLLPANE START (FANE 2) -- JSCROLLPANE START (FANE 2) -- JSCROLLPANE START (FANE 2) private JScrollPane jscrollpane5 = new JScrollPane(); private JScrollPane jscrollpane6 = new JScrollPane(); private JScrollPane jscrollpane7 = new JScrollPane(); //JSCROLLPANE SLUT (FANE 2) -- JSCROLLPANE SLUT (FANE 2) -- JSCROLLPANE SLUT (FANE 2) -- JSCROLLPANE SLUT (FANE 2) -- JSCROLLPANE SLUT (FANE 2) private JListListener jl; //private JSeparator jseparator1 = new JSeparator(); private JLabel jlabelstatusbar = new JLabel(); private JPanel jpanelstatusbar = new JPanel(); private JButton jbuttonopretredigerfjernkompetence = new JButton(); private JLabel jlabel3 = new JLabel(); private JLabel jlabelkonsulent = new JLabel(); private JLabel jlabelkonsulentvalue = new JLabel(); private JLabel jlabelkonsulenttid = new JLabel(); private JLabel jlabelkonsulentmedarbejder = new JLabel(); private JLabel jlabelkonsulentmedarbejdervalue = new JLabel(); private JLabel jlabelassistent = new JLabel(); private JLabel jlabelassistentvalue = new JLabel(); private JLabel jlabelassistenttid = new JLabel(); private JLabel jlabelkonsulenttidvalue = new JLabel(); private JLabel jlabelassistenttidvalue = new JLabel(); private JLabel jlabelassistentmedarbejder = new JLabel(); private JLabel jlabelassistentmedarbejdervalue = new JLabel(); private JLabel jlabelassistentmax = new JLabel(); private JLabel jlabelassistentmaxvalue = new JLabel(); private JLabel jlabeldaekningtidtotal = new JLabel(); //---------------------------------------------------------------- public GUIFrame() try jbinit(); catch (Exception e) e.printstacktrace(); //---------------------------------------------------------------- private void jbinit() throws Exception 57/201
// // //INITIALISERINGER - INITIALISERINGER - INITIALISERINGER - INITIALISERINGER - INITIALISERINGER // // FANE 1 - OPRET/REDIGER PROJEKT FANE 1 -OPRET/REDIGER PROJEKT FANE 1 -OPRET/REDIGER PROJEKT // // //JLABELS START (FANE 1) -- JLABELS START (FANE 1) -- JLABELS START (FANE 1)-- JLABELS START (FANE 1)-- JLABELS START (FANE 1) jlabelopretredigerprojektnavn.settext("projektnavn"); jlabelopretredigerprojektnavn.setbounds(new Rectangle(500, 70, 120, 20)); jlabelopretredigerkunde.settext("kunder"); jlabelopretredigerkunde.settext("kunde"); jlabelopretredigerkunde.setbounds(new Rectangle(500, 180, 120, 20)); jlabelopretredigerkontaktperson.settext("kontaktperson"); jlabelopretredigerkontaktperson.setbounds(new Rectangle(500, 210, 120, 20)); jlabelopretredigerkontaktpersontlf.settext("tlf. til kontakt"); jlabelopretredigerkontaktpersontlf.setbounds(new Rectangle(500, 250, 120, 20)); jlabelopretredigerprojektnote.settext("projektnote"); jlabelopretredigerprojektnote.setbounds(new Rectangle(500, 510, 120, 20)); jlabelopretredigerprojektleder.settext("projektleder:"); jlabelopretredigerprojektleder.setbounds(new Rectangle(10, 370, 190, 20)); jlabelopretredigerbehov.settext("behov:"); jlabelopretredigerbehov.setbounds(new Rectangle(230, 220, 90, 20)); jlabelopretredigerindlaesprojektvaelgfilter.settext("indl\u00e6s projekt - v\u00e6lg filter:"); jlabelopretredigerindlaesprojektvaelgfilter.setbounds(new Rectangle(430, 10, 195, 20)); jlabelopretredigerprojektleder.settext("projektleder:"); jlabelopretredigerprojektleder.setbounds(new Rectangle(500, 480, 190, 20)); jlabelopretredigerbehov.settext("behov:"); jlabelopretredigerbehov.setbounds(new Rectangle(710, 320, 90, 20)); jlabelopretredigerindlaesprojektvaelgfilter.settext("indlæs projekt"); jlabelopretredigerindlaesprojektvaelgfilter.setbounds(new Rectangle(20, 10, 195, 20)); 58/201
jlabelopretredigerkompetencer.settext("kompetencer"); jlabelopretredigerkompetencer.setbounds(new Rectangle(500, 290, 140, 20)); jlabelopretredigerottendedele.settext("/8"); jlabelopretredigerottendedele.setbounds(new Rectangle(890, 320, 20, 20)); jlabelopretredigerprojektaar.settext("projekt\u00e5r"); jlabelopretredigerprojektaar.setbounds(new Rectangle(500, 150, 120, 20)); jlabelopretredigerprojektaar.setsize(new Dimension(120, 20)); jlabelopretredigerprojektnavn.addmouselistener(new MouseAdapter() public void mouseentered(mouseevent e) Statusbar_mouseEntered(e, "Indtast projektets navn."); public void mouseexited(mouseevent e) Statusbar_mouseExited(e); ); jlabelopretredigerprojektaar.addmouselistener(new MouseAdapter() public void mouseentered(mouseevent e) Statusbar_mouseEntered(e, "V\u00E6lg \u00e5rstal for projektet."); public void mouseexited(mouseevent e) Statusbar_mouseExited(e); ); jlabelopretredigerkunde.addmouselistener(new MouseAdapter() public void mouseentered(mouseevent e) Statusbar_mouseEntered(e, "V\u00E6lg en kunde der skal tilknyttes projektet."); public void mouseexited(mouseevent e) Statusbar_mouseExited(e); ); jlabelopretredigerkontaktperson.addmouselistener(new MouseAdapter() public void mouseentered(mouseevent e) Statusbar_mouseEntered(e, "Indtast projektets kontaktperson."); 59/201
public void mouseexited(mouseevent e) Statusbar_mouseExited(e); ); jlabelopretredigerkontaktpersontlf.addmouselistener(new MouseAdapter() public void mouseentered(mouseevent e) Statusbar_mouseEntered(e, "Indtast kontaktpersonens telefonnummer."); public void mouseexited(mouseevent e) Statusbar_mouseExited(e); ); jlabelopretredigerkompetencer.addmouselistener(new MouseAdapter() public void mouseentered(mouseevent e) Statusbar_mouseEntered(e, "Tilf\u00D8j kompetencer."); public void mouseexited(mouseevent e) Statusbar_mouseExited(e); ); jlabelopretredigerkompetencer.addmouselistener(new MouseAdapter() public void mouseentered(mouseevent e) Statusbar_mouseEntered(e, "F\u00F8rst udv\u00e6lges en kompetence, derefter v\u00e6lges behovets st\u00f8rrelse i 1/8 \u00e5r."); public void mouseexited(mouseevent e) Statusbar_mouseExited(e); ); jlabelopretredigerprojektleder.addmouselistener(new MouseAdapter() public void mouseentered(mouseevent e) Statusbar_mouseEntered(e, "V\u00E6lg en projektleder."); public void mouseexited(mouseevent e) 60/201
); Statusbar_mouseExited(e); jlabelopretredigerprojektnote.addmouselistener(new MouseAdapter() public void mouseentered(mouseevent e) Statusbar_mouseEntered(e, "Skriv evt. en note der skal tilknyttes projektet."); public void mouseexited(mouseevent e) Statusbar_mouseExited(e); ); jlabelopretredigerprojektstatus.settext("projektstatus"); jlabelopretredigerprojektstatus.setbounds(new Rectangle(500, 120, 120, 20)); jlabelopretredigerprojektstatus.setsize(new Dimension(120, 20)); jlabelopretredigerprojektstatus.addmouselistener(new MouseAdapter() public void mouseentered(mouseevent e) Statusbar_mouseEntered(e, "V\u00E6lg projektets status."); public void mouseexited(mouseevent e) Statusbar_mouseExited(e); ); //JLABELS SLUT (FANE 1)-- JLABELS SLUT (FANE 1)-- JLABELS SLUT (FANE 1)- - JLABELS SLUT (FANE 1)-- JLABELS SLUT (FANE 1)-- JLABELS SLUT (FANE 1) //JBUTTONS START (FANE 1)-- JBUTTONS START (FANE 1)-- JBUTTONS START (FANE 1)-- JBUTTONS START (FANE 1)-- JBUTTONS START (FANE 1)-- JBUTTONS START (FANE 1) jbuttonopretredigernulstilfelter.settext("nulstil felter"); jbuttonopretredigernulstilfelter.setbounds(new Rectangle(500, 630, 190, 20)); jbuttonopretredigergemprojekt.settext("gem projekt"); jbuttonopretredigergemprojekt.setbounds(new Rectangle(220, 520, 190, 20)); jbuttonopretredigertilfoejkompetence.settext("tilf\u00d8j kompetence"); jbuttonopretredigertilfoejkompetence.setbounds(new Rectangle(220, 250, 190, 20)); jbuttonopretredigernulstilfelter.addactionlistener(new ActionListener() public void actionperformed(actionevent e) jbuttonnulstilfelter_actionperformed(e); ); 61/201
jbuttonopretredigergemprojekt.settext("gem projekt"); jbuttonopretredigergemprojekt.setbounds(new Rectangle(710, 630, 190, 20)); jbuttonopretredigergemprojekt.addactionlistener(new ActionListener() public void actionperformed(actionevent e) jbuttonopretredigergemprojekt_actionperformed(e); ); jbuttonopretredigertilfoejkompetence.settext("tilf\u00f8j Kompetence"); jbuttonopretredigertilfoejkompetence.setbounds(new Rectangle(710, 350, 190, 20)); jbuttonopretredigertilfoejkompetence.addactionlistener(new ActionListener() public void actionperformed(actionevent e) tilfoejkompetencebutton_actionperformed(e); ); //JBUTTONS SLUT (FANE 1)-- JBUTTONS SLUT (FANE 1)-- JBUTTONS SLUT (FANE 1)-- JBUTTONS SLUT (FANE 1)-- JBUTTONS SLUT (FANE 1)-- JBUTTONS SLUT (FANE 1) //JTEXTFIELDS START (FANE 1)-- JTEXTFIELDS START (FANE 1)-- JTEXTFIELDS START (FANE 1)-- JTEXTFIELDS START (FANE 1)-- JTEXTFIELDS START (FANE 1) jtextfieldopretredigertlftilkontakt.setbounds(new Rectangle(220, 160, 190, 20)); jtextfieldopretredigerangivprojektnavn.setbounds(new Rectangle(710, 70, 190, 20)); jtextfieldopretredigerkontaktperson.setbounds(new Rectangle(710, 210, 190, 20)); jtextfieldopretredigertlftilkontakt.setbounds(new Rectangle(710, 250, 190, 20)); jtextfieldopretredigerbehov.setbounds(new Rectangle(350, 220, 45, 20)); jtextfieldopretredigerbehov.settext("1"); jtextfieldopretredigerbehov.sethorizontalalignment(jtextfield.right); jtextfieldopretredigerbehov.setbounds(new Rectangle(840, 320, 45, 20)); //JTEXTFIELDS SLUT (FANE 1)-- JTEXTFIELDS SLUT (FANE 1)-- JTEXTFIELDS SLUT (FANE 1)-- JTEXTFIELDS SLUT (FANE 1)-- JTEXTFIELDS SLUT (FANE 1) //JTEXTAREA START (FANE 1) -- JTEXTAREA START (FANE 1) -- JTEXTAREA START (FANE 1) -- JTEXTAREA START (FANE 1) -- JTEXTAREA START (FANE 1) jtextareaopretredigernote.setlinewrap(true); //JTEXTAREA SLUT (FANE 1) -- JTEXTAREA SLUT (FANE 1) -- JTEXTAREA SLUT (FANE 1) -- JTEXTAREA SLUT (FANE 1) -- JTEXTAREA SLUT (FANE 1) //JLIST START (FANE 1) -- JLIST START (FANE 1) -- JLIST START (FANE 1) - - JLIST START (FANE 1) -- JLIST START (FANE 1) jlistopretredigerprojektoversigt.setsize(new Dimension(396, 366)); 62/201
//JLIST SLUT (FANE 1) -- JLIST SLUT (FANE 1) -- JLIST SLUT (FANE 1) -- JLIST SLUT (FANE 1) -- JLIST SLUT (FANE 1) //JCOMBOBOX START (FANE 1) -- JCOMBOBOX START (FANE 1) -- JCOMBOBOX START (FANE 1) -- JCOMBOBOX START (FANE 1) -- JCOMBOBOX START (FANE 1) -- JCOMBOBOX START (FANE 1) jcomboopretredigervaelgprojektleder.setbounds(new Rectangle(220, 370, 190, 20)); jcomboopretredigervaelgkunde.setbounds(new Rectangle(710, 180, 190, 20)); jcomboopretredigervaelgaarstal.setbounds(new Rectangle(220, 70, 190, 20)); jcomboopretredigervaelgprojektleder.setbounds(new Rectangle(710, 480, 190, 20)); jcomboopretredigervaelgkompetence.setbounds(new Rectangle(220, 190, 190, 20)); jcomboopretredigerfilterprojektstatus.setbounds(new Rectangle(430, 40, 190, 20)); jcomboopretredigerfilteraarstal.setbounds(new Rectangle(45, 105, 190, 20)); jcomboopretredigervaelgkompetence.setbounds(new Rectangle(710, 290, 190, 20)); jcomboopretredigerfilterprojektstatus.setbounds(new Rectangle(45, 75, 190, 20)); jcomboopretredigerfilterprojektstatus.addactionlistener(new ActionListener() public void actionperformed(actionevent e) jcomboopretredigerfilterprojektstatus_actionperformed(e); ); jcomboopretredigerfilteraarstal.addactionlistener(new ActionListener() public void actionperformed(actionevent e) jcomboopretredigerfilteraarstal_actionperformed(e); ); jcomboopretredigervaelgaarstal.setbounds(new Rectangle(710, 150, 190, 20)); jcomboopretredigervaelgprojektstatus.setbounds(new Rectangle(710, 120, 190, 20)); jcomboopretredigervaelgprojektstatus.setsize(new Dimension(190, 20)); jcomboopretredigervaelgprojektstatus.addactionlistener(new ActionListener() public void actionperformed(actionevent e) jbuttonjcomboopretredigervaelgprojektstatus_actionperformed(e); ); 63/201
//JCOMBOBOX SLUT (FANE 1) -- JCOMBOBOX SLUT (FANE 1) -- JCOMBOBOX SLUT (FANE 1) -- JCOMBOBOX SLUT (FANE 1) -- JCOMBOBOX SLUT (FANE 1) -- JCOMBOBOX SLUT (FANE 1) //JSCROLLPANE START (FANE 1) -- JSCROLLPANE START (FANE 1) -- JSCROLLPANE START (FANE 1) -- JSCROLLPANE START (FANE 1) -- JSCROLLPANE START (FANE 1) jscrollpane4.setbounds(new Rectangle(50, 150, 380, 500)); jscrollpane1.setbounds(new Rectangle(500, 380, 400, 80)); jscrollpane3.setbounds(new Rectangle(500, 530, 400, 90)); //JSCROLLPANE SLUT (FANE 1) -- JSCROLLPANE SLUT (FANE 1) -- JSCROLLPANE SLUT (FANE 1) -- JSCROLLPANE SLUT (FANE 1) -- JSCROLLPANE SLUT (FANE 1) //ProjektFane.add(jSeparator1, null); ProjektFane.add(jLabel3, null); ProjektFane.add(jButtonOpretRedigerFjernKompetence, null); ProjektFane.add(jLabelOpretRedigerProjektStatus, null); ProjektFane.add(jLabelOpretRedigerKompetencer, null); ProjektFane.add(jLabelOpretRedigerProjektAar, null); ProjektFane.add(jComboOpretRedigerVaelgProjektStatus, null); jscrollpane1.getviewport().add(jlistopretredigerkompetencebehov, null); ProjektFane.add(jScrollPane1, null); jscrollpane3.getviewport().add(jtextareaopretredigernote, null); ProjektFane.add(jScrollPane3, null); ProjektFane.add(jLabelOpretRedigerOttendedele, null); jscrollpane4.getviewport().add(jlistopretredigerprojektoversigt, null); ProjektFane.add(jScrollPane4, null); ProjektFane.add(jTextFieldOpretRedigerBehov, null); ProjektFane.add(jLabelOpretRedigerBehov, null); ProjektFane.add(jLabelOpretRedigerProjektleder, null); ProjektFane.add(jButtonOpretRedigerTilFoejKompetence, null); ProjektFane.add(jComboOpretRedigerVaelgKompetence, null); ProjektFane.add(jLabelOpretRedigerIndlaesProjektVaelgFilter, null); ProjektFane.add(jComboOpretRedigerFilterAarstal, null); ProjektFane.add(jComboOpretRedigerVaelgAarstal, null); ProjektFane.add(jComboOpretRedigerFilterProjektstatus, null); ProjektFane.add(jButtonOpretRedigerGemProjekt, null); ProjektFane.add(jButtonOpretRedigerNulstilFelter, null); ProjektFane.add(jComboOpretRedigerVaelgProjektleder, null); ProjektFane.add(jTextFieldOpretRedigerTlfTilKontakt, null); // // //INITIALISERINGER - INITIALISERINGER - INITIALISERINGER - INITIALISERINGER - INITIALISERINGER // // FANE 2 - BEMAND PROJEKT FANE 2 - BEMAND PROJEKT FANE 2 - BEMAND PROJEKT FANE 2 - BEMAND PROJEKT // // 64/201
//JLABELS START (FANE 2) -- JLABELS START (FANE 2) -- JLABELS START (FANE 2) -- JLABELS START (FANE 2) -- JLABELS START (FANE 2) ProjektFane.add(jTextFieldOpretRedigerKontaktperson, null); ProjektFane.add(jLabelOpretRedigerProjektNote, null); ProjektFane.add(jLabelOpretRedigerKontaktpersonTlf, null); ProjektFane.add(jLabelOpretRedigerKontaktperson, null); ProjektFane.add(jLabelOpretRedigerKunde, null); ProjektFane.add(jLabelOpretRedigerProjektnavn, null); ProjektFane.add(jComboOpretRedigerVaelgKunde, null); ProjektFane.add(jTextFieldOpretRedigerAngivProjektnavn, null); jpanelstatusbar.add(jlabelstatusbar, null); ProjektFane.add(jPanelStatusbar, null); jlabelbemandprojektbemandprojekt.settext("bemand projekt"); jlabelbemandprojektbemandprojekt.setbounds(new Rectangle(15, 5, 835, 30)); jlabelbemandprojektvaelgprojekt.settext("v\u00e6lg Projekt"); jlabelbemandprojektvaelgprojekt.setbounds(new Rectangle(15, 45, 135, 25)); jlabelbemandprojektmuligemedarbejdere.settext("mulige medarbejdere"); jlabelbemandprojektmuligemedarbejdere.setbounds(new Rectangle(15, 85, 225, 25)); jlabelbemandprojektmedarbejder1.settext("medarbejder"); jlabelbemandprojektmedarbejder1.setbounds(new Rectangle(15, 380, 120, 20)); jlabelbemandprojektmedarbejderdaekning.settext("medarbejderd\u00e6kning"); jlabelbemandprojektmedarbejderdaekning.setbounds(new Rectangle(470, 380, 185, 20)); jlabelbemandprojektmedarbejder2.settext("medarbejder"); jlabelbemandprojektmedarbejder2.setbounds(new Rectangle(15, 410, 145, 25)); jlabelbemandprojektkompetence.settext("kompetence"); jlabelbemandprojektkompetence.setbounds(new Rectangle(15, 445, 155, 25)); jlabelbemandprojekttid.settext("tid"); jlabelbemandprojekttid.setbounds(new Rectangle(15, 480, 130, 25)); jlabelbemandprojektbemandprojekt.settext("bemand projekt"); jlabelbemandprojektbemandprojekt.setbounds(new Rectangle(15, 5, 835, 30)); jlabelbemandprojektvaelgprojekt.settext("v\u00e6lg Projekt"); jlabelbemandprojektvaelgprojekt.setbounds(new Rectangle(15, 45, 135, 25)); jlabelbemandprojektmuligemedarbejdere.settext("mulige medarbejdere"); jlabelbemandprojektmuligemedarbejdere.setbounds(new Rectangle(15, 85, 225, 25)); jlabelbemandprojektmedarbejder1.settext("medarbejder"); jlabelbemandprojektmedarbejder1.setbounds(new Rectangle(15, 380, 120, 20)); jlabelbemandprojektmedarbejderdaekning.settext("medarbejderd\u00e6kning"); jlabelbemandprojektmedarbejderdaekning.setbounds(new Rectangle(470, 380, 185, 65/201
20)); jlabelbemandprojektmedarbejder2.settext("medarbejder"); jlabelbemandprojektmedarbejder2.setbounds(new Rectangle(15, 410, 145, 25)); jlabelbemandprojektkompetence.settext("kompetence"); jlabelbemandprojektkompetence.setbounds(new Rectangle(15, 445, 155, 25)); jlabelbemandprojekttid.settext("tid"); jlabelbemandprojekttid.setbounds(new Rectangle(15, 480, 130, 25)); jlabelbemandprojekttilknyttedemedarbejdere.settext("tilknyttede medarbejdere"); jlabelbemandprojekttilknyttedemedarbejdere.setbounds(new Rectangle(470, 85, 325, 25)); //JLABELS SLUT (FANE 2) -- JLABELS SLUT (FANE 2) -- JLABELS SLUT (FANE 2) -- JLABELS SLUT (FANE 2) -- JLABELS SLUT (FANE 2) -- JLABELS SLUT (FANE 2) //JBUTTONS START (FANE 2) -- JBUTTONS START (FANE 2) -- JBUTTONS START (FANE 2) -- JBUTTONS START (FANE 2) -- JBUTTONS START (FANE 2) -- JBUTTONS START (FANE 2) jbuttonbemandprojektgemprojekt.settext("gem projekt"); jbuttonbemandprojektgemprojekt.setbounds(new Rectangle(200, 515, 185, 25)); jbuttonbemandprojekttilknytmedarbejder.settext(">>"); jbuttonbemandprojekttilknytmedarbejder.setbounds(new Rectangle(390, 120, 70, 30)); jbuttonbemandprojekttilknytmedarbejder.setfont(new Font("Dialog", 0, 20)); jbuttonbemandprojekttilknytmedarbejder.settooltiptext("tilknyt medarbejder"); jbuttonbemandprojektfjerntilknyttetmedarbejder.settext("<<"); jbuttonbemandprojektfjerntilknyttetmedarbejder.setfont(new Font("Dialog", 0, 20)); jbuttonbemandprojekttilknytmedarbejder.addactionlistener(new ActionListener() public void actionperformed(actionevent e) jbuttonbemandprojekttilknytmedarbejder_actionperformed(e); ); jbuttonbemandprojektfjerntilknyttetmedarbejder.setbounds(new Rectangle(390, 160, 70, 30)); 66/201
jbuttonbemandprojektfjerntilknyttetmedarbejder.settooltiptext("fjern medarbejder"); jbuttonbemandprojektfjerntilknyttetmedarbejder.addactionlistener(new ActionListener() public void actionperformed(actionevent e) jbuttonbemandprojektfjerntilknyttetmedarbejder_actionperformed(e); ); jbuttonbemandprojektgemprojekt.addactionlistener(new ActionListener() public void actionperformed(actionevent e) jbuttonbemandprojektgemprojekt_actionperformed(e); ); //JBUTTONS SLUT (FANE 2) -- JBUTTONS SLUT (FANE 2) -- JBUTTONS SLUT (FANE 2) -- JBUTTONS SLUT (FANE 2) -- JBUTTONS SLUT (FANE 2) -- JBUTTONS SLUT (FANE 2) //JTEXTFIELDS START (FANE 2)-- JTEXTFIELDS START (FANE 2)-- JTEXTFIELDS START (FANE 2)-- JTEXTFIELDS START (FANE 2)-- JTEXTFIELDS START (FANE 2) jtextfieldbemandprojektmedarbejdernavn.setbounds(new Rectangle(200, 410, 185, 25)); jtextfieldbemandprojektmedarbejdernavn.seteditable(false); jtextfieldbemandprojektangivtid.setbounds(new Rectangle(200, 480, 185, 25)); //JTEXTFIELDS SLUT (FANE 2)-- JTEXTFIELDS SLUT (FANE 2)-- JTEXTFIELDS SLUT (FANE 2)-- JTEXTFIELDS SLUT (FANE 2)-- JTEXTFIELDS SLUT (FANE 2) //JTEXTAREA START (FANE 2) -- JTEXTAREA START (FANE 2) -- JTEXTAREA START (FANE 2) -- JTEXTAREA START (FANE 2) -- JTEXTAREA START (FANE 2) //JTEXTAREA SLUT (FANE 2) -- JTEXTAREA SLUT (FANE 2) -- JTEXTAREA SLUT (FANE 2) -- JTEXTAREA SLUT (FANE 2) -- JTEXTAREA SLUT (FANE 2) -- JTEXTAREA SLUT (FANE 2) //JLIST START (FANE 2) -- JLIST START (FANE 2) -- JLIST START (FANE 2) - - JLIST START (FANE 2) -- JLIST START (FANE 2) //JLIST SLUT (FANE 2) -- JLIST SLUT (FANE 2) -- JLIST SLUT (FANE 2) -- JLIST SLUT (FANE 2) -- JLIST SLUT (FANE 2) //JCOMBOBOX START (FANE 2) -- JCOMBOBOX START (FANE 2) -- JCOMBOBOX START (FANE 2) -- JCOMBOBOX START (FANE 2) -- JCOMBOBOX START (FANE 2) -- JCOMBOBOX START (FANE 2) jcombobemandprojektfilterprojektstatus.setbounds(new Rectangle(200, 45, 185, 25)); jcombobemandprojektvaelgprojekt.setbounds(new Rectangle(470, 45, 370, 25)); jcombobemandprojektfilteraarstal.setbounds(new Rectangle(395, 45, 65, 25)); jcombobemandprojektvaelgkompetence.setbounds(new Rectangle(200, 445, 185, 25)); jcombobemandprojektfilteraarstal.addactionlistener(new ActionListener() 67/201
public void actionperformed(actionevent e) jcombobemandprojektfilteraarstal_actionperformed(e); ); jcombobemandprojektfilterprojektstatus.addactionlistener(new ActionListener() public void actionperformed(actionevent e) jcombobemandprojektfilterprojektstatus_actionperformed(e); ); jcombobemandprojektvaelgprojekt.addactionlistener(new ActionListener() public void actionperformed(actionevent e) jcombobemandprojektvaelgprojekt_actionperformed(e); ); //JCOMBOBOX SLUT (FANE 2) -- JCOMBOBOX SLUT (FANE 2) -- JCOMBOBOX SLUT (FANE 2) -- JCOMBOBOX SLUT (FANE 2) -- JCOMBOBOX SLUT (FANE 2) -- JCOMBOBOX SLUT (FANE 2) //JSCROLLPANE START (FANE 2) -- JSCROLLPANE START (FANE 2) -- JSCROLLPANE START (FANE 2) -- JSCROLLPANE START (FANE 2) -- JSCROLLPANE START (FANE 2) jscrollpane5.setbounds(new Rectangle(470, 410, 370, 95)); jscrollpane6.setbounds(new Rectangle(15, 115, 370, 250)); jscrollpane7.setbounds(new Rectangle(470, 115, 370, 250)); //JSCROLLPANE SLUT (FANE 2) -- JSCROLLPANE SLUT (FANE 2) -- JSCROLLPANE SLUT (FANE 2) -- JSCROLLPANE SLUT (FANE 2) -- JSCROLLPANE SLUT (FANE 2) TilknytMedarbFane.add(jLabelDaekningTidTotal, null); TilknytMedarbFane.add(jLabelAssistentMaxValue, null); TilknytMedarbFane.add(jLabelAssistentMax, null); TilknytMedarbFane.add(jLabelAssistentMedarbejderValue, null); TilknytMedarbFane.add(jLabelAssistentMedarbejder, null); TilknytMedarbFane.add(jLabelAssistentTidValue, null); TilknytMedarbFane.add(jLabelKonsulentTidValue, null); TilknytMedarbFane.add(jLabelAssistentTid, null); TilknytMedarbFane.add(jLabelAssistentValue, null); TilknytMedarbFane.add(jLabelAssistent, null); TilknytMedarbFane.add(jLabelKonsulentMedarbejderValue, null); TilknytMedarbFane.add(jLabelKonsulentMedarbejder, null); TilknytMedarbFane.add(jLabelKonsulentTid, null); TilknytMedarbFane.add(jLabelKonsulentValue, null); TilknytMedarbFane.add(jLabelKonsulent, null); TilknytMedarbFane.add(jButtonBemandProjektGemProjekt, null); TilknytMedarbFane.add(jComboBemandProjektVaelgKompetence, null); jscrollpane7.getviewport().add(jlistbemandprojekttilknyttedemedarbejdere, null); TilknytMedarbFane.add(jScrollPane7, null); 68/201
jscrollpane6.getviewport().add(jlistbemandprojektmuligemedarbejdere, null); TilknytMedarbFane.add(jScrollPane6, null); TilknytMedarbFane.add(jLabelBemandProjektTilknyttedeMedarbejdere, null); jscrollpane5.getviewport().add(jtextareabemandprojektmedarbejderdaekning, null); TilknytMedarbFane.add(jScrollPane5, null); TilknytMedarbFane.add(jTextFieldBemandProjektAngivTid, null); TilknytMedarbFane.add(jTextFieldBemandProjektMedarbejderNavn, null); TilknytMedarbFane.add(jButtonBemandProjektFjernTilknyttetMedarbejder, null); TilknytMedarbFane.add(jButtonBemandProjektTilknytMedarbejder, null); TilknytMedarbFane.add(jComboBemandProjektVaelgProjekt, null); TilknytMedarbFane.add(jComboBemandProjektFilterProjektstatus, null); TilknytMedarbFane.add(jComboBemandProjektFilterAarstal, null); TilknytMedarbFane.add(jLabelBemandProjektTid, null); TilknytMedarbFane.add(jLabelBemandProjektKompetence, null); TilknytMedarbFane.add(jLabelBemandProjektMedarbejder2, null); TilknytMedarbFane.add(jLabelBemandProjektMedarbejderDaekning, null); TilknytMedarbFane.add(jLabelBemandProjektMedarbejder1, null); TilknytMedarbFane.add(jLabelBemandProjektMuligeMedarbejdere, null); TilknytMedarbFane.add(jLabelBemandProjektVaelgProjekt, null); // // // INITIALISERINGER FANE 1+2 --- INITIALISERINGER FANE 1+2 --- INITIALISERINGER FANE 1+2 // // TilknytMedarbFane.add(jLabelBemandProjektBemandProjekt, null); this.getcontentpane().setlayout(null); this.setsize(new Dimension(1024, 675)); this.setbounds(new Rectangle(10, 10, 1024, 768)); this.settitle("gem projekt"); fejlstreng = ""; jtabbedpane1.setbounds(new Rectangle(0, 0, 1024, 768)); ProjektFane.setLayout(null); ProjektFane.setBounds(new Rectangle(2, 24, 1024, 768)); TilknytMedarbFane.setLayout(null); this.getcontentpane().add(jtabbedpane1, null); jtabbedpane1.addtab("opret/rediger projekt", ProjektFane); jtabbedpane1.addtab("bemand projekt", TilknytMedarbFane); jl = new JListListener(); jlabelstatusbar.setbounds(new Rectangle(10, 550, 810, 15)); jlabelstatusbar.setforeground(color.blue); 69/201
jpanelstatusbar.setbounds(new Rectangle(20, 680, 840, 20)); // // // INDLAESNING I COMBOBOXE - FANE 1+2 ------- INDLAESNING I COMBOBOXE - FANE 1+2 // // jbuttonopretredigerfjernkompetence.settext("fjern kompetence"); jbuttonopretredigerfjernkompetence.setbounds(new Rectangle(500, 350, 190, 20)); jbuttonopretredigerfjernkompetence.addactionlistener(new ActionListener() public void actionperformed(actionevent e) jbuttonopretredigerfjernkompetence_actionperformed(e); ); jlabel3.settext("filter:"); jlabel3.setbounds(new Rectangle(45, 50, 38, 14)); jlabelkonsulent.settext("konsulentdækning"); jlabelkonsulent.setbounds(new Rectangle(470, 505, 95, 20)); jlabelkonsulenttidvalue.setbounds(new Rectangle(660, 540, 20, 20)); jlabelkonsulentvalue.settext("0%"); jlabelkonsulentvalue.setbounds(new Rectangle(565, 505, 30, 20)); jlabelkonsulenttid.settext("tid:"); jlabelkonsulenttid.setbounds(new Rectangle(775, 505, 20, 20)); jlabelkonsulentmedarbejder.settext("medarbejdere:"); jlabelkonsulentmedarbejder.setbounds(new Rectangle(660, 505, 75, 20)); jlabelkonsulentmedarbejdervalue.settext("0"); jlabelkonsulentmedarbejdervalue.setbounds(new Rectangle(745, 505, 25, 20)); jlabelassistent.settext("assistentdækning"); jlabelassistent.setbounds(new Rectangle(470, 525, 95, 20)); jlabelassistentvalue.settext("0%"); jlabelassistentvalue.setbounds(new Rectangle(565, 525, 30, 20)); jlabelassistenttid.settext("tid:"); jlabelassistenttid.setbounds(new Rectangle(775, 525, 20, 20)); jlabelkonsulenttidvalue.setbounds(new Rectangle(800, 505, 20, 20)); jlabelassistenttidvalue.setbounds(new Rectangle(660, 540, 20, 20)); jlabelassistenttidvalue.setbounds(new Rectangle(800, 525, 20, 20)); jlabelassistentmedarbejder.settext("medarbejdere:"); jlabelassistentmedarbejder.setbounds(new Rectangle(660, 525, 75, 20)); jlabelassistentmedarbejdervalue.settext("0"); jlabelassistentmedarbejdervalue.setbounds(new Rectangle(745, 525, 25, 20)); jlabelassistentmax.settext("ønsket Assistentdækning:"); jlabelassistentmax.setbounds(new Rectangle(470, 545, 140, 20)); jlabelassistentmaxvalue.settext("0%"); 70/201
jlabelassistentmaxvalue.setbounds(new Rectangle(610, 545, 30, 20)); jlabeldaekningtidtotal.settext("0 af 0 tidsenheder er dækket"); jlabeldaekningtidtotal.setbounds(new Rectangle(660, 545, 180, 20)); jcomboopretredigerfilteraarstal.additem("alle \u00c5r"); jcombobemandprojektfilteraarstal.additem("\u00c5rstal"); for (int i = 2010; i >= 2002; i--) jcombobemandprojektfilteraarstal.additem(i); jcomboopretredigerfilteraarstal.additem(i); jcombobemandprojektfilterprojektstatus.additem("projektstatus"); jcombobemandprojektfilterprojektstatus.additem("ikke p\u00e5begyndt"); jcombobemandprojektfilterprojektstatus.additem("igangv\u00e6rende"); jcombobemandprojektfilterprojektstatus.additem("afsluttet"); jcomboopretredigervaelgkompetence.additem("v\u00e6lg kompetence.."); for (IFKompetence kompetence: facade.getifkompetenceliste()) jcomboopretredigervaelgkompetence.additem(kompetence); //INDLAESER PROJEKTLEDERE I COMBOBOX - "Projekter" jcomboopretredigervaelgprojektleder.additem("v\u00e6lg projektleder.."); ArrayList<IFKompetence> IFProjektleder = new ArrayList<IFKompetence>(); IFKompetence ifkompetence = facade.getifkompetence("projektledelse"); if (ifkompetence!= null) IFProjektleder.add(ifKompetence); for (IFMedarbejder p: facade.getifmedarbejderliste(ifprojektleder)) jcomboopretredigervaelgprojektleder.additem(p); //INDLAESER KUNDER I COMBOBOX - "Projekter" jcomboopretredigervaelgkunde.additem("v\u00e6lg kunde.."); for (IFKunde k: facade.getkundeliste()) jcomboopretredigervaelgkunde.additem(k); jcomboopretredigervaelgaarstal.additem("v\u00e6lg \u00e5rstal..."); for (Integer i = 2008; i <= 2010; i++) jcomboopretredigervaelgaarstal.additem(i); //Indlaeser data i projektstatuscombobox (indlês projekt) jcomboopretredigerfilterprojektstatus.additem("alle projekter"); jcomboopretredigerfilterprojektstatus.additem("ikke p\u00e5begyndt"); jcomboopretredigerfilterprojektstatus.additem("igangv\u00e6rende"); jcomboopretredigerfilterprojektstatus.additem("afsluttet"); //Indlaeser data i projektstatuscombobox (indlês projekt) jcomboopretredigervaelgprojektstatus.additem("v\u00e6lg projektstatus..."); jcomboopretredigervaelgprojektstatus.additem("ikke p\u00e5begyndt"); jcomboopretredigervaelgprojektstatus.additem("igangv\u00e6rende"); jcomboopretredigervaelgprojektstatus.additem("afsluttet"); loadprojektertilmt(); 71/201
//INDLAES DATA I COMBOBOXE SLUT -- INDLAES DATA I COMBOBOXE SLUT -- INDLAES DATA I COMBOBOXE SLUT //ACTIONLISTENERS START -- ACTIONLISTENERS START -- ACTIONLISTENERS START -- ACTIONLISTENERS START //---------------------------------------------------------------- / Tilfoejer et kompetencebehov til et projekt. @param e private void tilfoejkompetencebutton_actionperformed(actionevent e) //TILFOEJER KOMPETENCER //Check om brugeren har angivet korrekte vaerdier if (!checkcombo(jcomboopretredigervaelgkompetence, "Du mangler at angive en kompetence") &&!checkfieldvalue(jtextfieldopretredigerbehov.gettext(), "Behov")) //Indhent kompetence og behov IFKompetence ifkompetence = (IFKompetence) jcomboopretredigervaelgkompetence.getselecteditem(); int behov = Integer.parseInt(jTextFieldOpretRedigerBehov.getText()); DB //Hvis der er valgt et projekt som har fået tildelt ID fra DB if (loadedprojekt!= null) //Hvis projektet allerede har kompetencebehov med samme kompetence if (loadedprojekt.hasifkompetencebehov(ifkompetence)) //Spoerg brugeren om denne oensker at overskrive popup = new JFrame(); if (JOptionPane.showConfirmDialog(popup, "Vil du overskrive?", "Advarsel", JOptionPane.OK_CANCEL_OPTION) == 0) //Opret det nye kompetencebehov facade.opretkompetencebehov(loadedprojekt, ifkompetence, behov); //Forlad metoden else return; else //Opretter kompetencebehov til et projekt som endnu ikke er gemt i facade.opretkompetencebehov(loadedprojekt, ifkompetence, behov); else boolean found = false; //Check om det valgte kompetencebehov allerede er i projektet 72/201
== projekt for (int i = 0; i < listeifkompetencebehov.size(); i++) IFKompetenceBehov ifkb = listeifkompetencebehov.get(i); //Er kompetencen fundet? if (!found && ifkb.getkompetence() == ifkompetence) //Hvis kompetencen findes, spoerges brugeren om valg popup = new JFrame(); if (JOptionPane.showConfirmDialog(popup, "Vil du overskrive?", "Advarsel", JOptionPane.OK_CANCEL_OPTION) 0) //Hvis brugeren oensker at overskrive, saettes 'found' found = true; //Kompetencebehovet oprettes dog uden tilknytning til et ifkb = facade.opretkompetencebehov(null, ifkompetence, behov); //Det tidligere oprettede kompetencebehov overskrives listeifkompetencebehov.set(i, ifkb); //Forlad metoden else return; //Hvis kompetencebehovet ikke findes, tilfoejes det if (!found) listeifkompetencebehov.add(facade.opretkompetencebehov(null, ifkompetence, //Opdater listen med kompetencebehov loadkompetencebehov(); //Udskriv fejl til bruger fejlpopup(); behov)); //---------------------------------------------------------------- / Opretter/gemmer et projekt. @param e private void jbuttonopretredigergemprojekt_actionperformed(actionevent e) //GEM PROJEKT IFKunde kunde = null; IFMedarbejder projektleder = null; String projektstatus = null; Integer aarstal = null; 73/201
String projektnavn = jtextfieldopretredigerangivprojektnavn.gettext(); String kontaktperson = jtextfieldopretredigerkontaktperson.gettext(); String tlftilkontakt = jtextfieldopretredigertlftilkontakt.gettext(); String note = jtextareaopretredigernote.gettext(); / Nedenfor bruges en raekke checks til at se om alle data er til stede, for at kunne oprette/gemme et projekt checkfield(projektnavn, "Projektnavn"); if (jcomboopretredigervaelgprojektstatus.getselectedindex()!= 0) projektstatus = (String) jcomboopretredigervaelgprojektstatus.getselecteditem(); else projektstatus = ""; if (jcomboopretredigervaelgaarstal.getselectedindex()!= 0) aarstal = (Integer) jcomboopretredigervaelgaarstal.getselecteditem(); else aarstal = 0; if (!checkcombo(jcomboopretredigervaelgkunde, "Du mangler at v\u00e6lge en kunde")) kunde = (IFKunde) jcomboopretredigervaelgkunde.getselecteditem(); if (listeifkompetencebehov.size() < 1) fejlstreng += "Du mangler at tilf\u00f8je en kompetence\n"; if (jcomboopretredigervaelgprojektleder.getselectedindex()!= 0) projektleder = (IFMedarbejder) jcomboopretredigervaelgprojektleder.getselecteditem(); //Hvis der opstaar fejl, udskrives de til brugeren if (!fejlstreng.equals("")) //Udskriv fejl til bruger fejlpopup(); else //Hvis projektet er nyt, forsoeges det oprettet if (loadedprojekt == null) loadedprojekt = facade.opretprojekt(projektnavn, kunde, kontaktperson, tlftilkontakt, projektleder, listeifkompetencebehov, aarstal, projektstatus, note); jcomboopretredigervaelgkunde.setenabled(false); //Hvis projektet er et allerede eksisterende, forsoeges det gemt else if (!facade.saveprojekt(loadedprojekt, projektnavn, kontaktperson, tlftilkontakt, projektleder, listeifkompetencebehov, aarstal, projektstatus, note)) 74/201
fejlstreng = "Der er nyere data i systemet\ngenstart programmet for at genindlæse data"; fejlpopup(); fejlstreng = ""; //Indlaes (opdater) projekter loadprojektliste(); //---------------------------------------------------------------- / Checker om der er valgt en vaerdi i en combobox @param combo @param fejlmeddelelse @return private boolean checkcombo(jcombobox combo, String fejlmeddelelse) boolean fejl = false; //Hvis comboboxens valg staar paa den foerste plads if (combo.getselectedindex() == 0) //Saet fejlstreng fejlstreng += fejlmeddelelse + "\n"; fejl = true; //Fejlvaerdi returneres return fejl; //---------------------------------------------------------------- / Viser en fejlmeddelelse til brugeren. private void fejlpopup() if (!fejlstreng.equals("")) popup = new JFrame(); JOptionPane.showMessageDialog(popup, fejlstreng, "Fejl i input", JOptionPane.ERROR_MESSAGE); fejlstreng = ""; //---------------------------------------------------------------- / Nulstiller alle felter og comboboxe ved hjaelp af metoden resetprojekt(). @param e 75/201
private void jbuttonnulstilfelter_actionperformed(actionevent e) if (jlistopretredigerprojektoversigt.getselectedindex() >= -0) jlistopretredigerprojektoversigt.clearselection(); resetprojekt(); //---------------------------------------------------------------- / Checker om et felt indeholder udelukkende blanke tegn eller apostrof. @param field @param navn @return Sandhedsvaerdi private boolean checkfield(string field, String navn) //Saettes true hvis der er fejl boolean fejl = false; //Hvis field kun indeholder den tomme streng eller udelukkende blanke if (field.equals("") field.trim().equals("")) //Fejlstreng genereres med den medsendte streng fejlstreng += navn + " mangler\n"; fejl = true; //Hvis field indeholder apostrof if (field.contains("\'")) fejlstreng += navn + " m\u00e5 ikke indeholde apostrof (')\n"; fejl = true; //Returner sandhedsvaerdien 'fejl' return fejl; //---------------------------------------------------------------- / Gendindlæser projekter i projektlisten med bestemt status @param e private void jcombobemandprojektfilterprojektstatus_actionperformed(actionevent e) // STATUS ACTION loadprojektertilmt(); //---------------------------------------------------------------- / Gendindlæser projekter i projektlisten med bestemt aarstal @param e 76/201
private void jcombobemandprojektfilteraarstal_actionperformed(actionevent e) //AARSTAL ACTION loadprojektertilmt(); //---------------------------------------------------------------- / Opdaterer fanen 'bemand projekt' paa baggrund af valgt projekt @param e private void jcombobemandprojektvaelgprojekt_actionperformed(actionevent e) //V?LG PROJEKT //Opdaterer brugerfladen i fanen 'Bemand projekt' opdatermedarbejdertilknytningfane(); //---------------------------------------------------------------- / Tillknytter en medarbejder @param e private void jbuttonbemandprojekttilknytmedarbejder_actionperformed(actionevent e) //GEM MEDARBEJDERTILKNYTNING //Hent den valgte medarbejder fra listen af mulige medarbejdere IFMedarbejder ifmedarbejder = (IFMedarbejder) jlistbemandprojektmuligemedarbejdere.getselectedvalue(); //Hent den indtastede tid medarebjderen skal bidrage med String tidsangivelse = jtextfieldbemandprojektangivtid.gettext(); //Hent det valgte projekt IFProjekt ifprojekt = (IFProjekt) jcombobemandprojektvaelgprojekt.getselecteditem(); //Er der valgt en medarbejder if (ifmedarbejder!= null) //Er der valgt en kompetence if (checkcombo(jcombobemandprojektvaelgkompetence, "Fejl - Kompetence ikke valgt!")) fejlpopup(); return; //Henter valgt kompetence IFKompetence ifkompetence = ((IFMedarbejderKompetence) jcombobemandprojektvaelgkompetence.getselecteditem()).getifkompetence(); //Er der indtastet en korrekt tid, fra 1 til? if (checkfieldvalue(tidsangivelse, "Tidsangivelse")) 77/201
fejlpopup(); return; //Hent medarbejdertilknytninger fra det valgte projekt ArrayList<IFMedarbejderTilknytning> ifmedarbejdertilknytningliste = facade.getifmedarbejdertilknytningtilprojekt(ifprojekt); //Check medarbejdertilknytningerne for den medarbejder der skal tilknyttes for (IFMedarbejderTilknytning ifmt: ifmedarbejdertilknytningliste) / Hvis medarbejderen allerede er tilknyttet med samme kompetence, og den eksisterende tilknytning ikke staar som slettet (OStatus = 2), kan den nye tilknytning ikke oprettes. if (ifmt.getmedarbejder().equals(ifmedarbejder) && ifmt.getkompetence().equals(ifkompetence) && ifmt.getostatus()!= 2) fejlstreng = "Fejl - Medarbejder allerede tilknyttet med den kompetence\n"; fejlpopup(); fejlstreng = ""; return; //Tid angivet af brugeren int tid = Integer.parseInt(tidsangivelse); //Medarbejderens ledige tid int mtid = ifmedarbejder.getledigtid(); //Hvis brugerens input overskrider det tilgaengelige udskrives en fejl if (tid > mtid) fejlstreng = "Fejl - Medarbejders ledige tid overskrides"; fejlpopup(); fejlstreng = ""; return; else / Hvis alt er ok, saettes medarbejderens ledige tid til en ny tid, som er fratrukket det der bidrages med, og medarbejdertilknytningen oprettes. facade.setledigtidformedarbejder(ifmedarbejder, (mtid - tid)); facade.addifmedarbejdertilknytning(ifprojekt, ifmedarbejder, ifkompetence, tid); //Hvis ingen medarbejder er valgt else fejlstreng = "Fejl - ingen medarbejder valgt!"; fejlpopup(); fejlstreng = ""; return; //Opdater fanen 78/201
opdatermedarbejdertilknytningfane(); //---------------------------------------------------------------- / Fjerner en tilknyttet medarbejder. @param e private void jbuttonbemandprojektfjerntilknyttetmedarbejder_actionperformed(actionevent e) //FJERN MEDARBEJDERTILKNYTNING //Hent medarbejdertilknytning fra listen med tilknyttede medarbejdere IFMedarbejderTilknytning ifmedarbejdertilknytning = (IFMedarbejderTilknytning) jlistbemandprojekttilknyttedemedarbejdere.getselectedvalue(); //Hvis medarbejder er valgt if (ifmedarbejdertilknytning!= null) //Fjern den valgte medarbejder facade.removeifmedarbejdertilknytning((ifprojekt) jcombobemandprojektvaelgprojekt.getselecteditem(), ifmedarbejdertilknytning); //Opdater fanen opdatermedarbejdertilknytningfane(); //---------------------------------------------------------------- / Gendindlæser projekter i projektlisten med bestemt status @param e private void jcomboopretredigerfilterprojektstatus_actionperformed(actionevent e) //STATUS ACTION - Projekt loadprojektliste(); //---------------------------------------------------------------- / Gendindlæser projekter i projektlisten med bestemt status @param e private void jcomboopretredigerfilteraarstal_actionperformed(actionevent e) loadprojektliste(); //---------------------------------------------------------------- / Fjerner et kompetencebehov fra et projekt 79/201
@param e private void jbuttonopretredigerfjernkompetence_actionperformed(actionevent e) //Hvis der ikke er valgt et kompetencebehov if (jlistopretredigerkompetencebehov.getselectedindex() < 0) fejlstreng = "Fejl - Intet kompetencebehov valgt"; fejlpopup(); fejlstreng = ""; return; //Hvis der er valgt et kompetencebehov else //Hent kompetencebehov fra liste IFKompetenceBehov ifkbehov = (IFKompetenceBehov) jlistopretredigerkompetencebehov.getselectedvalue(); boolean removed = false; //Hvis der er valgt et projekt som har fået tildelt ID fra DB if (loadedprojekt!= null) //Kompetencebehovet fjernes fra projektet via facaden removed = facade.removekompetencebehov(loadedprojekt, ifkbehov); else //Kompetencebehovet fjernes lokalt removed = listeifkompetencebehov.remove(ifkbehov); //Hvis kompetencebehovet er fjernet if (removed) //Felter og combobox nulstilles og kompetencer genindlaeses jtextfieldopretredigerbehov.settext("1"); jcomboopretredigervaelgkompetence.setselectedindex(0); loadkompetencebehov(); //---------------------------------------------------------------- / Gemmer et projekt @param e private void jbuttonbemandprojektgemprojekt_actionperformed(actionevent e) //Hvis et projekt er valgt if (jcombobemandprojektvaelgprojekt.getselectedindex() > 0) / Metoden der bruges til at gemme et projekt, bruger stamdata, af hensyn til også at kunne gemme nyoprettede projekter. Derfor hentes stamdata ud af et allerede eksisterende projekt, 80/201
for at kunne genbruge denne metode. IFProjekt ifprojekt = (IFProjekt) jcombobemandprojektvaelgprojekt.getselecteditem(); String navn = ifprojekt.getnavn(); String kontaktperson = ifprojekt.getkontaktperson(); String kontakttlf = ifprojekt.getkontaktpersontlf(); IFMedarbejder ifprojektleder = ifprojekt.getifprojektleder(); ArrayList<IFKompetenceBehov> ifkompetencebehovliste = ifprojekt.getifkompetencebehovliste(); int aarstal = ifprojekt.getaarstal(); String status = ifprojekt.getstatus(); String note = ifprojekt.getnote(); // Gemmer projektet if (!facade.saveprojekt(ifprojekt, navn, kontaktperson, kontakttlf, ifprojektleder, ifkompetencebehovliste, aarstal, status, note)) //Hvis der opstår versionskonflikt må programmet genstartes i sin nuværende udgave fejlstreng = "Der er nyere data i systemet\ngenstart programmet for at genindlæse data"; fejlpopup(); fejlstreng = ""; opdatermedarbejdertilknytningfane(); //ACTIONLISTENERS SLUT -- ACTIONLISTENERS SLUT -- ACTIONLISTENERS SLUT -- ACTIONLISTENERS SLUT //MOUSELISTENERS START -- MOUSELISTENERS START -- MOUSELISTENERS START -- MOUSELISTENERS START private void Statusbar_mouseEntered(MouseEvent e, String tip) jlabelstatusbar.settext(tip); //---------------------------------------------------------------- private void Statusbar_mouseExited(MouseEvent e) jlabelstatusbar.settext(""); //---------------------------------------------------------------- private void Projektnavn_mouseEntered(MouseEvent e) //---------------------------------------------------------------- private void Statusbar_mouseEntered(MouseEvent e) 81/201
//MOUSELISTENERS SLUT -- MOUSELISTENERS SLUT -- MOUSELISTENERS SLUT -- MOUSELISTENERS SLUT //JLISTLISTENER START -- JLISTLISTENER START -- JLISTLISTENER START -- JLISTLISTENER START / Privat klasse der håndtere <tt>jlist</tt> handlinger fra alle <tt>jlist</tt> objekter i <tt>guiframe</tt> private class JListListener implements ListSelectionListener / Metoden kaldes ved ændring i tilmeldte <tt>jlist</tt> objekters valgte værdi. @param l Bruges til at identificere hvilken <tt>jlist</tt> der har ændret sig public void valuechanged(listselectionevent l) // Bemand projekt: Ved ændring i valgte objekt i JList med mulige // medarbejdere placeret til venstre: // Forbered ny bemanding if (l.getsource() == jlistbemandprojektmuligemedarbejdere) IFMedarbejder ifmedarbejder = (IFMedarbejder) jlistbemandprojektmuligemedarbejdere.getselectedvalue(); jtextfieldbemandprojektmedarbejdernavn.settext(ifmedarbejder.getnavn()); ArrayList<IFKompetenceBehov> ifkompetencebehov = facade.getifkompetencebehovliste((ifprojekt) jcombobemandprojektvaelgprojekt.getselecteditem()); ArrayList<IFMedarbejderKompetence> ifmedarbejderkompetencer = facade.getkompetenceliste(ifmedarbejder, ifkompetencebehov); jcombobemandprojektvaelgkompetence.removeallitems(); jcombobemandprojektvaelgkompetence.additem("v\u00e6lg kompetence"); for (IFMedarbejderKompetence ifmk: ifmedarbejderkompetencer) jcombobemandprojektvaelgkompetence.additem(ifmk); // Opret/Rediger projekt: Ved ændring i valgte objekt i projektlisten: // Indlæs projekt og alle dets objekter og forbered redigering else if (l.getsource() == jlistopretredigerprojektoversigt) if (jlistopretredigerprojektoversigt.getselectedindex() >= 0) IFProjekt ifprojekt = (IFProjekt) jlistopretredigerprojektoversigt.getselectedvalue(); resetprojekt(); loadedprojekt = ifprojekt; System.out.println("GUI"); 82/201
if (facade.getifprojekt(ifprojekt)) jtextfieldopretredigerangivprojektnavn.settext(ifprojekt.getnavn()); jcomboopretredigervaelgkunde.setselecteditem(ifprojekt.getifkunde()); jcomboopretredigervaelgkunde.setenabled(false); jcomboopretredigervaelgprojektleder.setselecteditem(loadedprojekt.getifproje ktleder()); jtextfieldopretredigerkontaktperson.settext(ifprojekt.getkontaktperson()); jtextfieldopretredigertlftilkontakt.settext(ifprojekt.getkontaktpersontlf()) ; loadkompetencebehov(); jcomboopretredigervaelgprojektleder.setselecteditem(ifprojekt.getifprojektle der()); if (ifprojekt.getstatus() == null ifprojekt.getstatus().equals("")) jcomboopretredigervaelgprojektstatus.setselectedindex(0); else jcomboopretredigervaelgprojektstatus.setselecteditem(ifprojekt.getstatus()); jcomboopretredigervaelgaarstal.setselecteditem(ifprojekt.getaarstal()); jcomboopretredigervaelgkunde.setselecteditem(ifprojekt.getifkunde()); jtextareaopretredigernote.settext(ifprojekt.getnote()); // Opret/Rediger projekt: Ved ændring i valgte objekt i JList listen // med Kompetence Behov: // Forbered ændring af valgte Kompetence Behov else if (l.getsource() == jlistopretredigerkompetencebehov) IFKompetenceBehov ifkbehov = (IFKompetenceBehov) jlistopretredigerkompetencebehov.getselectedvalue(); jtextfieldopretredigerbehov.settext("" + ifkbehov.getbehov()); jcomboopretredigervaelgkompetence.setselecteditem(ifkbehov.getkompetence()); //JLISTLISTENER SLUT -- JLISTLISTENER SLUT -- JLISTLISTENER SLUT -- JLISTLISTENER SLUT / Kontrollere at en tekststreng (<tt>field</tt>) indeholder et positivt heltal større end 0. Der tilføjes evt. løbende fejl til <tt>fejlstreng</tt> som benyttes til senere udskrift af fejl. @param field Tekststreng med en antaget værdi positiv heltalsværdi større end 0. 83/201
@param navn Benyttes i forbindelse med tilføjelse til <tt>fejlstreng</tt> for at sikre let genkendelighed ved senere udskrift af fejl @return Sandhedsværdi, sand hvis <tt>field</tt> indeholder et positivt heltal større end 0 private boolean checkfieldvalue(string field, String navn) boolean fejl = false; int value = 0; try //Er det indtastede rent faktisk et tal value = Integer.parseInt(field); catch (Exception e) //Hvis det ikke var et tal, fejlmeldes til brugeren fejlstreng += "Kun tal fra 1 og opefter m\u00e5 anvendes\n\n"; fejl = true; //Hvis vaerdien af tallet er 0 eller derunder if (value < 1) //Forrige fejlstreng + denne her fejlstreng += navn + " er ikke angivet korrekt!\n"; fejl = true; //Returner sandhedsvaerdi return fejl; //---------------------------------------------------------------- / Nulstiller fanen 'Opret/rediger projekt' private void resetprojekt() loadedprojekt = null; listeifkompetencebehov = new ArrayList<IFKompetenceBehov>(); jtextfieldopretredigerangivprojektnavn.settext(""); jcomboopretredigervaelgkunde.setenabled(true); jcomboopretredigervaelgkunde.setselectedindex(0); jtextfieldopretredigerkontaktperson.settext(""); jtextfieldopretredigertlftilkontakt.settext(""); jtextfieldopretredigerbehov.settext("1"); jcomboopretredigervaelgkompetence.setselectedindex(0); jcomboopretredigervaelgprojektstatus.setselectedindex(0); jcomboopretredigervaelgprojektleder.setselectedindex(0); jcomboopretredigervaelgaarstal.setselectedindex(0); jtextareaopretredigernote.settext(""); jlistopretredigerkompetencebehov = new JList(); jscrollpane1.getviewport().add(jlistopretredigerkompetencebehov, null); 84/201
//---------------------------------------------------------------- / Checker om der er valgt et filter, og nulstiller og opdaterer listen med projekter, som matcher de valgte vaerdier. private void loadprojektertilmt() String status = null; Integer aarstal = null; if (jcombobemandprojektfilterprojektstatus.getselectedindex() > 0) status = (String) jcombobemandprojektfilterprojektstatus.getselecteditem(); if (jcombobemandprojektfilteraarstal.getselectedindex() > 0) aarstal = (Integer) jcombobemandprojektfilteraarstal.getselecteditem(); jcombobemandprojektvaelgprojekt.removeallitems(); ArrayList<IFProjekt> ifprojekter = facade.getprojektliste(status, aarstal); jcombobemandprojektvaelgprojekt.additem("v\u00e6lg projekt"); for (IFProjekt p: ifprojekter) jcombobemandprojektvaelgprojekt.additem(p); //opdatermedarbejdertilknytningfane(); //---------------------------------------------------------------- / Opdaterer 'Bemand projekt'-fanen i forhold til valg. private void opdatermedarbejdertilknytningfane() jtextfieldbemandprojektmedarbejdernavn.settext(""); jcombobemandprojektvaelgkompetence.removeallitems(); jtextfieldbemandprojektangivtid.settext("1"); jtextareabemandprojektmedarbejderdaekning.settext(""); if (jcombobemandprojektvaelgprojekt.getselectedindex() > 0) //Indlaeser det valgte projekt fra combobox IFProjekt ifprojekt = (IFProjekt) jcombobemandprojektvaelgprojekt.getselecteditem(); //Aendrer teksten pâ JLabel i oeverste venstre hjoerne jlabelbemandprojektbemandprojekt.settext("bemand " + ifprojekt.getnavn()); //Henter projektet facade.getifprojekt(ifprojekt); //Liste med projektets kompetencebehov ArrayList<IFKompetenceBehov> ifkompetencebehov = facade.getifkompetencebehovliste(ifprojekt); //Henter medarbejdere som modsvarer kompetencebehovet ArrayList<IFMedarbejder> ifmedarbejdere = 85/201
facade.getifmedarbejderlistefrakompetencebehov(ifkompetencebehov); //Henter de medarbejdertilknytninger som allerede er tilknyttet projektet, dog uden dem der er sat til delete ArrayList<IFMedarbejderTilknytning> ifmedarbejdertilknytningliste = new ArrayList<IFMedarbejderTilknytning>(); for (IFMedarbejderTilknytning ifmt: facade.getifmedarbejdertilknytningtilprojekt(ifprojekt)) if (ifmt.getostatus()!= 2 &&!ifmedarbejdertilknytningliste.contains(ifmt)) ifmedarbejdertilknytningliste.add(ifmt); //Byg en streng som viser daekning af kompetencebehov String medarbejderdaekning = "Kompetence\t\tBehov\tD\u00E6kning\n\n"; //Variabler til optaelling (typen grundet senere udregning) double konsulenttid = 0, assistenttid = 0, antalkonsulenter = 0, antalassistenter = 0, samletbehov = 0; //Gennemloeber hvert kompetencebehov int antalgennemloeb = 0; for (IFKompetenceBehov ifkb: ifkompetencebehov) //Tilfoejer kompetencenavn og behov til strengen medarbejderdaekning += ifkb.getkompetence().getnavn() + "\t" + ifkb.getbehov() + "\t"; // lægger behov til total samletbehov += ifkb.getbehov(); //daekning er som udgangspunkt 0 int daekning = 0; //Alle medarbejdertilknytninger gennemloebes, og der laegges sammen for (IFMedarbejderTilknytning ifmt: ifmedarbejdertilknytningliste) //Hvis kompetencebehovet passer, samles tid til at vise dækning if (ifkb.getkompetence().equals(ifmt.getkompetence())) daekning += ifmt.gettid(); //En medarbejders kompetencer gennemloebes for (IFMedarbejderKompetence ifmk: ifmt.getmedarbejder().getmedarbejderkompetenceliste()) //Matcher kompetencen medarbejdertilknytningens kompetence if (ifmk.getifkompetence().equals(ifmt.getkompetence())) //Er niveau under 7, regnes medarbejderen som assistent if (ifmk.getniveau() < 7) //Saml brugt assistent-tid assistenttid += ifmt.gettid(); //Saml antal assistenter antalassistenter++; 86/201
else //Ellers regnes medarbejderen som konsulent konsulenttid += ifmt.gettid(); antalkonsulenter++; //Tilfoej daekning til strengen og skift til ny linie medarbejderdaekning += daekning + "\n"; antalgennemloeb++; / tiden divideres med antalgennemloeb, for at finde det rette tal idet tiden øges for hvert gennemløb i løkken konsulenttid = konsulenttid / antalgennemloeb; assistenttid = assistenttid / antalgennemloeb; antalkonsulenter = antalkonsulenter / antalgennemloeb; antalassistenter = antalassistenter / antalgennemloeb; //Den samlede tid: double samlettid = assistenttid + konsulenttid; //Tilfoej samlet beregning af tider til strengen jlabelkonsulentvalue.settext(((int) (konsulenttid / samlettid 100)) + "%"); jlabelkonsulenttidvalue.settext((int) konsulenttid + ""); jlabelkonsulentmedarbejdervalue.settext("" + ((int) antalkonsulenter)); jlabelassistentvalue.settext(((int) (assistenttid / samlettid 100)) + "%"); jlabelassistenttidvalue.settext(((int) assistenttid) + ""); jlabelassistentmedarbejdervalue.settext(((int) antalassistenter) + ""); if (ifprojekt.getifkunde().gettype().equals("ny mindre kunde")) jlabelassistentmaxvalue.settext("60%"); else if (ifprojekt.getifkunde().gettype().equals("gammel stor kunde")) jlabelassistentmaxvalue.settext("40%"); else if (ifprojekt.getifkunde().gettype().equals("ny stor kunde")) jlabelassistentmaxvalue.settext("20%"); jlabeldaekningtidtotal.settext(((int) samlettid) + " af " + ((int) samletbehov) + " tidsenheder er dækket"); jtextareabemandprojektmedarbejderdaekning.settext(medarbejderdaekning); //Fjerner de medarbejdere som allerede er tilknyttet projektet fra listen af medarbejdere som modsvarer kompetencebehovet for (int i = 0; i < ifmedarbejdere.size(); i++) if (ifmedarbejdere.get(i).getledigtid() == 0) ifmedarbejdere.remove(i); if (ifmedarbejdere.size() > 0) i--; else i = 0; 87/201
//Opretter 2 JLists som indsaettes jlistbemandprojektmuligemedarbejdere = new JList(ifMedarbejdere.toArray(new IFMedarbejder[0])); jlistbemandprojektmuligemedarbejdere.addlistselectionlistener(jl); jlistbemandprojektmuligemedarbejdere.setselectionmode(listselectionmodel.sin GLE_SELECTION); jlistbemandprojektmuligemedarbejdere.setactionmap(new ActionMap()); jlistbemandprojektmuligemedarbejdere.setselectionmodel(new DefaultListSelectionModel()); jscrollpane6.getviewport().add(jlistbemandprojektmuligemedarbejdere, null); jlistbemandprojekttilknyttedemedarbejdere = new JList(ifMedarbejderTilknytningListe.toArray(new IFMedarbejderTilknytning[0])); jlistbemandprojekttilknyttedemedarbejdere.addlistselectionlistener(jl); jlistbemandprojekttilknyttedemedarbejdere.setselectionmode(listselectionmode l.single_selection); jlistbemandprojekttilknyttedemedarbejdere.setactionmap(new ActionMap()); jlistbemandprojekttilknyttedemedarbejdere.setselectionmodel(new DefaultListSelectionModel()); jscrollpane7.getviewport().add(jlistbemandprojekttilknyttedemedarbejdere, null); else jlistbemandprojektmuligemedarbejdere = new JList(); jscrollpane6.getviewport().add(jlistbemandprojektmuligemedarbejdere, null); jlistbemandprojekttilknyttedemedarbejdere = new JList(); jscrollpane7.getviewport().add(jlistbemandprojekttilknyttedemedarbejdere, null); //---------------------------------------------------------------- private void loadprojektliste() //PROJEKTLISTE LOAD - Projekt String status = null; Integer aarstal = null; if (jcomboopretredigerfilterprojektstatus.getselectedindex()!= 0) status = (String) jcomboopretredigerfilterprojektstatus.getselecteditem(); if (jcomboopretredigerfilteraarstal.getselectedindex()!= 0) aarstal = (Integer) jcomboopretredigerfilteraarstal.getselecteditem(); 88/201
ArrayList<IFProjekt> ifprojekter = facade.getprojektliste(status, aarstal); jlistopretredigerprojektoversigt = new JList(ifProjekter.toArray(new IFProjekt[0])); jlistopretredigerprojektoversigt.addlistselectionlistener(jl); jlistopretredigerprojektoversigt.setselectionmode(listselectionmodel.single_ SELECTION); jlistopretredigerprojektoversigt.setactionmap(new ActionMap()); jlistopretredigerprojektoversigt.setselectionmodel(new DefaultListSelectionModel()); jscrollpane4.getviewport().add(jlistopretredigerprojektoversigt, null); //---------------------------------------------------------------- private void loadkompetencebehov() //Hvis der er valgt et projekt som har fået tildelt ID fra DB if (loadedprojekt!= null) listeifkompetencebehov.clear(); listeifkompetencebehov = FacadeDomain.getInstance().getIfKompetenceBehovListe(loadedProjekt); jlistopretredigerkompetencebehov = new JList(listeIFKompetenceBehov.toArray(new IFKompetenceBehov[0])); jlistopretredigerkompetencebehov.addlistselectionlistener(jl); jlistopretredigerkompetencebehov.setselectionmode(listselectionmodel.single_ SELECTION); jlistopretredigerkompetencebehov.setactionmap(new ActionMap()); jlistopretredigerkompetencebehov.setselectionmodel(new DefaultListSelectionModel()); jscrollpane1.getviewport().add(jlistopretredigerkompetencebehov, null); private void jbutton7_actionperformed(actionevent e) //TILFÿJ MEDARBEJDER //---------------------------------------------------------------- private void jbutton2_actionperformed(actionevent e) //---------------------------------------------------------------- private void jbuttonjcomboopretredigervaelgprojektstatus_actionperformed(actionevent e) //---------------------------------------------------------------- 89/201
//---------------------------------------------------------------- FacadeDomain package solutionmakers; import java.util.arraylist; // Singleton postkontor mellem praesentationslaget og domaenelaget public class FacadeDomain private static FacadeDomain instance; private KontrolKompetence kontrolkompetence; private KontrolProjekt kontrolprojekt; private KontrolKunde kontrolkunde; private KontrolMedarbejder kontrolmedarbejder; //Sikring af at alle klasser henvender sig til samme FacadeDomain / Sikring af at der kun eksisterer én instans af klassen @return instance Returnerer en instans af klassen public static FacadeDomain getinstance() //Hvis en instans af klassen ikke er oprettet if (instance == null) //Opret en instans instance = new FacadeDomain(); //Returner instans return instance; / Singleton postkontor mellem praesentationslaget og domaenelaget. Fungererer ved at videresende metodekald til de relevante klasser. private FacadeDomain() kontrolkompetence = new KontrolKompetence(); kontrolprojekt = new KontrolProjekt(); kontrolkunde = new KontrolKunde(); kontrolmedarbejder = new KontrolMedarbejder(); // Projekter / Opretter et nyt projekt. @param navn @param kunde @param kontaktperson 90/201
@param kontaktpersontlf @param projektleder @param listeifkompetencebehov @param aarstal @param projektstatus @param note @return IFProjekt -Et projekt public IFProjekt opretprojekt(string navn, IFKunde kunde, String kontaktperson, String kontaktpersontlf, IFMedarbejder projektleder, ArrayList<IFKompetenceBehov> listeifkompetencebehov, int aarstal, String projektstatus, String note) return kontrolprojekt.opretprojekt(navn, kunde, kontaktperson, kontaktpersontlf, projektleder, listeifkompetencebehov, aarstal, projektstatus, note); / Gemmer et projekt inkl. alle tilknyttede objekter @param projekt @param navn @param kontaktperson @param kontaktpersontlf @param projektleder @param listeifkompetencebehov @param aarstal @param projektstatus @param note @return IFProjekt -Et projekt public boolean saveprojekt(ifprojekt projekt, String navn, String kontaktperson, String kontaktpersontlf, IFMedarbejder projektleder, ArrayList<IFKompetenceBehov> listeifkompetencebehov, int aarstal, String projektstatus, String note) return kontrolprojekt.saveprojekt(projekt, navn, kontaktperson, kontaktpersontlf, projektleder, listeifkompetencebehov, aarstal, projektstatus, note); / Henter en liste med projekter, paa baggrund af status og aarstal. @param status @param aarstal @return ArrayList -En liste med projekter, der opfylder status og aar public ArrayList<IFProjekt> getprojektliste(string status, 91/201
Integer aarstal) return kontrolprojekt.getprojektliste(status, aarstal); / Henter et projekt inkl. alle tilknyttede objekter. Sandhedsvaerdien der returneres, afgoer om alle objekter er tilknyttet @param ifprojekt @return Sandhedsvaerdi public boolean getifprojekt(ifprojekt ifprojekt) return kontrolprojekt.getifprojekt(ifprojekt); // Kunder / Henter en liste med kunder. @return ArrayList -En liste med kunder public ArrayList<IFKunde> getkundeliste() return kontrolkunde.getkundeliste(); // Medarbejder / Henter en liste med alle medarbejdere. @return ArrayList -En liste med medarbejdere public ArrayList<IFMedarbejder> getmedarbejderliste() return kontrolmedarbejder.getmedarbejderliste(); / Henter en liste med medarbejdere paa baggrund af en liste med kompetencer. @param ifkompetenceliste @return ArrayList -En liste med medarbejdere public ArrayList<IFMedarbejder> getifmedarbejderliste(arraylist<ifkompetence> ifkompetenceliste) return kontrolmedarbejder.getifmedarbejderliste(ifkompetenceliste); / Henter en liste med medarbejdere paa baggrund af en liste med kompetencebehov. @param ifkompetencebehov @return ArrayList -En liste med medarbejdere 92/201
public ArrayList<IFMedarbejder> getifmedarbejderlistefrakompetencebehov(arraylist<ifkompetencebehov> ifkompetencebehov) return kontrolmedarbejder.getifmedarbejderlistefrakompetencebehov(ifkompetencebehov ); / Henter en liste med medarbejdertilknytninger til et projekt. @param projekt @return ArrayList -En liste med medarbejdertilknytninger public ArrayList<IFMedarbejderTilknytning> getifmedarbejdertilknytningtilprojekt(ifprojekt projekt) return kontrolprojekt.getmedarbejdertilknytningtilprojekt(projekt); / Tilfoejer en medarbejdertilknytning til et projekt @param ifprojekt @param ifmedarb @param ifkomp @param tid @return IFMedarbejderTilknytning -En medarbejdertilknytning public IFMedarbejderTilknytning addifmedarbejdertilknytning(ifprojekt ifprojekt, IFMedarbejder ifmedarb, IFKompetence ifkomp, int tid) return kontrolprojekt.addifmedarbejdertilknytning(ifprojekt, ifmedarb, ifkomp, tid); / Fjerner en medarbejdertilknytning fra et projekt. Sandhedsvaerdien der returneres, afgoer om medarebjdertilknytningen er fjernet. @param ifprojekt @param ifmedarbejdertilknytning @return Sandhedsvaerdi public boolean removeifmedarbejdertilknytning(ifprojekt ifprojekt, IFMedarbejderTilknytning ifmedarbejdertilknytning) //Hent medarbejder fra tilknytning IFMedarbejder ifmedarbejder = ifmedarbejdertilknytning.getmedarbejder(); int tid = ifmedarbejder.getledigtid() + ifmedarbejdertilknytning.gettid(); 93/201
kontrolmedarbejder.setledigtidformedarbejder(ifmedarbejder, tid); return kontrolprojekt.removeifmedarbejdertilknytning(ifprojekt, ifmedarbejdertilknytning); / Saetter den tid en medarbejder har til raadighed. @param ifmedarbejder @param tid public void setledigtidformedarbejder(ifmedarbejder ifmedarbejder, int tid) kontrolmedarbejder.setledigtidformedarbejder(ifmedarbejder, tid); // Kompetence / Henter en liste med alle kompetencer. @return ArrayList -En liste med kompetencer public ArrayList<IFKompetence> getifkompetenceliste() return kontrolkompetence.getifkompetenceliste(); / Opretter et kompetencebehov til et projekt. @param ifprojekt @param ifkompetence @param behov @return IFKompetenceBehov -Et kompetencebehov public IFKompetenceBehov opretkompetencebehov(ifprojekt ifprojekt, IFKompetence ifkompetence, int behov) return kontrolprojekt.opretkompetencebehov(ifprojekt, ifkompetence, behov); / Henter en kompetence fra en medarbejderkompetence. @param ifmedarbejderkompetence @return IFKompetence -En kompetence public IFKompetence getkompetence(ifmedarbejderkompetence ifmedarbejderkompetence) return kontrolmedarbejder.getkompetence(ifmedarbejderkompetence); / Henter en liste med kompetencebehov fra et projekt. 94/201
@param projekt @return ArrayList -En liste med kompetencebehov public ArrayList<IFKompetenceBehov> getifkompetencebehovliste(ifprojekt projekt) return kontrolprojekt.getkompetencebehovliste(projekt); / Henter en liste med medarbejderkompetence(r) fra en medarbejder. @param ifmedarbejder @param ifkompetencebehov @return ArrayList -En liste med medarbejderkompetencer public ArrayList<IFMedarbejderKompetence> getkompetenceliste(ifmedarbejder ifmedarbejder, ArrayList<IFKompetenceBehov> ifkompetencebehov) return kontrolmedarbejder.getkompetenceliste(ifmedarbejder, ifkompetencebehov); / Henter en kompetence paa baggrund af en tekststreng. @param kompetencenavn @return IFKompetence -En kompetence/null hvis den ikke findes public IFKompetence getifkompetence(string kompetencenavn) return kontrolkompetence.getifkompetence(kompetencenavn); / Saetter behovet for en kompetence. @param ifkompetencebehov @param behov public void setbehovtilifkompetencebehov(ifkompetencebehov ifkompetencebehov, int behov) kontrolprojekt.setbehovtilifkompetencebehov(ifkompetencebehov, behov); / Fjerner et kompetencebehov. Sandhedsvaerdien der returneres, afgoer om kompetencebehovet er fjernet. @param ifprojekt @param ifkompetencebehov @return Sandhedsvaerdi public boolean removekompetencebehov(ifprojekt ifprojekt, IFKompetenceBehov ifkompetencebehov) 95/201
return kontrolprojekt.removekompetencebehov(ifprojekt, ifkompetencebehov); KontrolProjekt package solutionmakers; import java.util.arraylist; public class KontrolProjekt /Fungerer som knudepunkt/postkontor, og distribuerer metodekald ned til FacadeDatasource private KontrolKunde kontrolkunde; public KontrolProjekt() kontrolkunde = new KontrolKunde(); / Opretter et projekt. @param navn @param ifkunde @param kontaktperson @param kontaktpersontlf @param ifprojektleder @param listeifkompetencebehov @param aarstal @param projektstatus @param note @return IFProjekt public IFProjekt opretprojekt(string navn, IFKunde ifkunde, String kontaktperson, String kontaktpersontlf, IFMedarbejder ifprojektleder, ArrayList<IFKompetenceBehov> listeifkompetencebehov, int aarstal, String projektstatus, String note) //Alle parametre konverteres fra interface til objekt med typecasting Kunde kunde = (Kunde) ifkunde; ArrayList<KompetenceBehov> listekompetencebehov = new ArrayList<KompetenceBehov>(); for (IFKompetenceBehov ifkb: listeifkompetencebehov) listekompetencebehov.add((kompetencebehov) ifkb); Medarbejder projektleder = (Medarbejder) ifprojektleder; //Et projekt oprettes med de typecastede objekter 96/201
Projekt projekt = new Projekt(navn, kunde, kontaktperson, kontaktpersontlf, projektleder, listekompetencebehov, aarstal, projektstatus, note); //Projektet sendes til FacadeDataSource.saveprojekt FacadeDatasource.getInstance().saveProjekt(projekt); //Det nye projekt typecastes og sendes retur IFProjekt ifprojekt = projekt; return ifprojekt; / Gemmer et projekt @param ifprojekt @param navn @param kontaktperson @param kontaktpersontlf @param ifprojektleder @param listeifkompetencebehov @param aarstal @param projektstatus @param note @return Sanhedsvaerdi public boolean saveprojekt(ifprojekt ifprojekt, String navn, String kontaktperson, String kontaktpersontlf, IFMedarbejder ifprojektleder, ArrayList<IFKompetenceBehov> listeifkompetencebehov, int aarstal, String projektstatus, String note) boolean res = false; KompetenceBehov kb; //Alle parametre konverteres fra interface til objekt med typecasting Projekt projekt = (Projekt) ifprojekt; // Knytter nye kompetencebehov til projektet for (IFKompetenceBehov ifkb: listeifkompetencebehov) kb = (KompetenceBehov) ifkb; if (!projekt.getkompetencebehovliste().contains(kb)) projekt.addkompetencebehov(kb); Medarbejder projektleder = (Medarbejder) ifprojektleder; //Ved hjaelp af parametrene, saettes et projekts attributter projekt.setnavn(navn); projekt.setkontaktperson(kontaktperson); projekt.setprojektleder(projektleder); projekt.setaarstal(aarstal); projekt.setstatus(projektstatus); projekt.setnote(note); projekt.setkontaktpersontlf(kontaktpersontlf); // Gemmer de nye data res = FacadeDatasource.getInstance().saveProjekt(projekt); return res; 97/201
/ Returnerer alle projekter, med mulighed for at angive årstal og/eller status for projektet. Hvis man ønsker at fravælge et søgekriterium, angives null istedet for det almindelige parameter. @return ArrayList<IFProjekt> @param status @param aarstal public ArrayList<IFProjekt> getprojektliste(string status, Integer aarstal) //Hent alle projekter der opfylder status og aarstal ArrayList<Projekt> projekter = FacadeDatasource.getInstance().getProjektListe(status, aarstal); ArrayList<IFProjekt> res = new ArrayList<IFProjekt>(); //Hvis der er hentet projekter? if (projekter!= null) for (Projekt p: projekter) res.add(p); return res; / Opretter et kompetencebehov. @param ifprojekt @param ifkompetence @param behov @return IFKompetenceBehov public IFKompetenceBehov opretkompetencebehov(ifprojekt ifprojekt, IFKompetence ifkompetence, int behov) Kompetence kompetence = (Kompetence) ifkompetence; KompetenceBehov kompetencebehov = null; //Hvis projektet er oprettet bliver det sat i projektet if (ifprojekt!= null) Projekt projekt = (Projekt) ifprojekt; kompetencebehov = projekt.setkompetencebehov(kompetence, behov, null); //Ellers oprettes et nyt kompetencebehov's-objekt else kompetencebehov = new KompetenceBehov(kompetence, behov, 3); //Returner kompetencebehovet return kompetencebehov; / Returnerer et medsendt Projekts Kompetence Behov (som Interface) @return ArrayList<IFKompetencebehov> 98/201
@param ifprojekt public ArrayList<IFKompetenceBehov> getkompetencebehovliste(ifprojekt ifprojekt) Projekt projekt = (Projekt) ifprojekt; ArrayList<IFKompetenceBehov> ifkompetencebehov = new ArrayList<IFKompetenceBehov>(); ArrayList<KompetenceBehov> kompetencebehov = projekt.getkompetencebehovliste(); for (KompetenceBehov kb: kompetencebehov) ifkompetencebehov.add(kb); return ifkompetencebehov; / Returnerer et medsendt Projekts Medarbejder Tilknytninger (som Interface) @return ArrayList<IFMedarbejderTilknytning> @param ifprojekt public ArrayList<IFMedarbejderTilknytning> getmedarbejdertilknytningtilprojekt(ifprojekt ifprojekt) return getifmedarbejdertilknytningtilprojekt(ifprojekt); / Tilføjer eller opdaterer en Medarbejder Tilknytning som et medsendt Projekt har eller skal have. @return IFMedarbejderTilknytning @param ifprojekt @param ifmedarb @param ifkomp @param tid public IFMedarbejderTilknytning addifmedarbejdertilknytning(ifprojekt ifprojekt, IFMedarbejder ifmedarb, IFKompetence ifkomp, int tid) Projekt projekt = (Projekt) ifprojekt; // Algoritmen for at opdatere eller tilføje ligger i Projekt-klassen. MedarbejderTilknytning medarbtilknytning = projekt.addmedarbejdertilknytning((medarbejder) ifmedarb, (Kompetence) ifkomp, tid); // FacadeDatasource.getInstance().nyMedarbejderTilknytning(medarbTilknytning); IFMedarbejderTilknytning ifmedarbejdertilknytning = medarbtilknytning; 99/201
return ifmedarbejdertilknytning; / Fjerner en Medarbejder Tilknytning i et medsendt Projekt. @return boolean @param ifprojekt @param ifmedarbejdertilknytning public boolean removeifmedarbejdertilknytning(ifprojekt ifprojekt, IFMedarbejderTilknytning ifmedarbejdertilknytning) boolean res; Projekt projekt = (Projekt) ifprojekt; MedarbejderTilknytning medarbejdertilknytning = (MedarbejderTilknytning) ifmedarbejdertilknytning; res = projekt.removemedarbejdertilknytning(medarbejdertilknytning); return res; / Henter et projekt ved hjaelp af FacadeDataSource. @param ifprojekt @return Sandhedsvaerdi public boolean getifprojekt(ifprojekt ifprojekt) Projekt projekt = (Projekt) ifprojekt; return FacadeDatasource.getInstance().getProjekt(projekt); / Henter en liste med kompetencebehov fra et projekt. @param ifprojekt @return ArrayList -En liste med kompetencebehov public ArrayList<IFKompetenceBehov> getifkompetencebehovliste(ifprojekt ifprojekt) ArrayList<IFKompetenceBehov> res = new ArrayList<IFKompetenceBehov>(); Projekt projekt = (Projekt) ifprojekt; for (KompetenceBehov kb: projekt.getkompetencebehovliste()) res.add(kb); return res; 100/201
/ Henter en liste med medarbejdertilknytninger. @param ifprojekt @return ArrayList -En liste med medarbejdertilknytninger public ArrayList<IFMedarbejderTilknytning> getifmedarbejdertilknytningtilprojekt(ifprojekt ifprojekt) ArrayList<IFMedarbejderTilknytning> res = new ArrayList<IFMedarbejderTilknytning>(); Projekt projekt = (Projekt) ifprojekt; for (MedarbejderTilknytning mt: projekt.getmedarbejdertilknytningliste()) res.add(mt); return res; / Saetter stoerrelsen paa et kompetencebehov. @param ifkompetencebehov @param behov public void setbehovtilifkompetencebehov(ifkompetencebehov ifkompetencebehov, int behov) KompetenceBehov kb = (KompetenceBehov) ifkompetencebehov; kb.setbehov(behov); / Fjerner et kompetencebehov fra et projekt. @param ifprojekt @param ifkompetencebehov @return Sandhedsvaerdi public boolean removekompetencebehov(ifprojekt ifprojekt, IFKompetenceBehov ifkompetencebehov) Projekt projekt = (Projekt) ifprojekt; KompetenceBehov kompetencebehov = (KompetenceBehov) ifkompetencebehov; return projekt.removekompetencebehov(kompetencebehov); KontrolKunde package solutionmakers; import java.util.arraylist; /Fungerer som knudepunkt/postkontor, og distribuerer metodekald ned til FacadeDatasource 101/201
public class KontrolKunde public KontrolKunde() / Alle Kunder hentes, gennemloebes, omdannes til Interface og returneres @return ArrayList<IFKunde> public ArrayList<IFKunde> getkundeliste() ArrayList<Kunde> kunder = FacadeDatasource.getInstance().getKundeListe(); ArrayList<IFKunde> ifkunder = new ArrayList<IFKunde>(); for (IFKunde k: kunder) ifkunder.add(k); return ifkunder; KontrolKompetence package solutionmakers; import java.util.arraylist; /Fungerer som knudepunkt/postkontor, og distribuerer metodekald ned til FacadeDatasource public class KontrolKompetence public KontrolKompetence() / Alle Kompetencer gennemløbes, omdannes til Interface og returneres, såfremt det ikke er Kompetencen "Projektledelse". @return ArrayList<IFKompetence> // Alle Kompetencer gennemløbes og omdannes til Interface, og dem af dem hvis navn ikke er 'Projektledelse' returneres. public ArrayList<IFKompetence> getifkompetenceliste() ArrayList<Kompetence> kompetencer = FacadeDatasource.getInstance().getKompetenceListe(); ArrayList<IFKompetence> ifkompetencer = new ArrayList<IFKompetence>(); for (Kompetence k : kompetencer) if (!k.getnavn().equals("projektledelse")) 102/201
ifkompetencer.add(k); return ifkompetencer; //Forespørgslen på en Kompetence sendes videre til FacadeDataSource. public IFKompetence getifkompetence(string kompetencenavn) IFKompetence ifk = FacadeDatasource.getInstance().getKompetence(kompetenceNavn); return ifk; KontrolMedarbejder package solutionmakers; import java.util.arraylist; /Fungerer som knudepunkt/postkontor, og distribuerer metodekald ned til FacadeDatasource public class KontrolMedarbejder public KontrolMedarbejder() / Alle medarbejdere gennemløbes, omdannes til Interface og returneres @return ArrayList<IFMedarbejder> public ArrayList<IFMedarbejder> getmedarbejderliste() ArrayList<Medarbejder> medarbejdere = FacadeDatasource.getInstance().getMedarbejderListe(); ArrayList<IFMedarbejder> ifmedarbejdere = new ArrayList<IFMedarbejder>(); for (Medarbejder m: medarbejdere) ifmedarbejdere.add(m); return ifmedarbejdere; / Henter en liste af medarbejdere, paa baggrund af en liste af kompetencebehov. @param ifkompetencebehov 103/201
@return ArrayList -En liste af medarbejdere public ArrayList<IFMedarbejder> getifmedarbejderlistefrakompetencebehov(arraylist<ifkompetencebehov> ifkompetencebehov) ArrayList<Medarbejder> medarbejdere = FacadeDatasource.getInstance().getMedarbejderListe(); ArrayList<IFMedarbejder> ifmedarbejdere = new ArrayList<IFMedarbejder>(); boolean found = false; // Alle Medarbejdere gennemløbes for (Medarbejder m: medarbejdere) // Den aktuelle medarbejderes kompetencer gennemløbes for (MedarbejderKompetence mk: m.getmedarbejderkompetenceliste()) // Den medsendte kompetence-behovs liste gennemløbes, og // det kontrolleres om medarbejderens aktuelle kompetence // (i gennemløbet) er lig med en af de medsendte. for (IFKompetenceBehov ifkb: ifkompetencebehov) if (mk.getkompetence() == ifkb.getifkompetence()) ifmedarbejdere.add(m); found = true; break; // Hvis medarbejderen har et match, er det ressourcespild // at gennemløbe flere af medarbejderens kompetencer. if (found) found = false; break; return ifmedarbejdere; / Henter en liste af medarbejdere ud fra en liste af kompetencer @param ifkompetenceliste @return ArrayList -En liste af medarbejdere public ArrayList<IFMedarbejder> getifmedarbejderliste(arraylist<ifkompetence> ifkompetenceliste) // Alle medarbejdere hentes fra DataSource. ArrayList<Kompetence> kompetenceliste = new ArrayList<Kompetence>(); for (IFKompetence ifkompetence: ifkompetenceliste) Kompetence k = (Kompetence) ifkompetence; 104/201
kompetenceliste.add(k); //Henter en liste med alle medarbejdere v.h.a. FacadeDataSource ArrayList<Medarbejder> medarbejdere = FacadeDatasource.getInstance().getMedarbejderListe(); ArrayList<IFMedarbejder> ifmedarbejderresultatliste = new ArrayList<IFMedarbejder>(); int i = 0; //Saa laenge der er medarbejdere i listen while (medarbejdere.size() > i) for (Kompetence k: kompetenceliste) //Hvis medarbejderen matcher en kompetence k if (medarbejdere.get(i).checkkompetence(k)) //Medarbejderen tilfoejes til resultatlisten IFMedarbejder m = medarbejdere.get(i); ifmedarbejderresultatliste.add(m); //Spring til naeste medarbejder i listen i++; //Returner resultatlisten return ifmedarbejderresultatliste; / Henter en liste med kompetencer som matcher en liste med kompetencebehov, fra en medarbejder. @param ifmedarbejder @param ifkompetencebehov @return ArrayList -En liste af medarbejderkompetencer public ArrayList<IFMedarbejderKompetence> getkompetenceliste(ifmedarbejder ifmedarbejder, ArrayList<IFKompetenceBehov> ifkompetencebehov) Medarbejder medarbejder = (Medarbejder) ifmedarbejder; ArrayList<KompetenceBehov> kompetencebehov = new ArrayList<KompetenceBehov>(); // Omdannelse fra Interface til Kompetencebehov for (IFKompetenceBehov kb: ifkompetencebehov) kompetencebehov.add((kompetencebehov) kb); // Alle medarbejderens kompetencer der indgår i kompetencebehovet // hentes som MedarbejderKompetencer ArrayList<MedarbejderKompetence> medarbejderkompetencer = medarbejder.getmedarbejderkompetenceliste(kompetencebehov); ArrayList<IFMedarbejderKompetence> ifmedarbejderkompetencer = 105/201
new ArrayList<IFMedarbejderKompetence>(); // Omdannelse til Interface for (IFMedarbejderKompetence k: medarbejderkompetencer) ifmedarbejderkompetencer.add(k); return ifmedarbejderkompetencer; // Kompetencen i et MedarbejderKompetence objekt, returneres som Interface / Henter en en kompetence fra en medarbejderkompetence. @param ifmedarbejderkompetence @return IFKompetence public IFKompetence getkompetence(ifmedarbejderkompetence ifmedarbejderkompetence) MedarbejderKompetence medarbejderkompetence = (MedarbejderKompetence) ifmedarbejderkompetence; IFKompetence ifkompetence = medarbejderkompetence.getkompetence(); return ifkompetence; / Saetter en medarbejders ledige tid. @param ifmedarbejder @param tid public void setledigtidformedarbejder(ifmedarbejder ifmedarbejder, int tid) Medarbejder medarbejder = (Medarbejder) ifmedarbejder; medarbejder.setledigtid(tid); //Saetter medarebjderens objektstatus til 1, aendret medarbejder.setostatus(1); IFProjekt package solutionmakers; import java.util.arraylist; / Interface for Projekt. Benyttes i præsentationslaget for at opnå lavere binding. public interface IFProjekt / 106/201
Henter <tt>projekt</tt> objektets <tt>id</tt>. @return <tt>id</tt> - <tt>id</tt> = 0 ved nyt <tt>projekt</tt> objekt eller id > 0 ved gammelt <tt>projekt</tt> objekt. public int getid(); / Henter <tt>projekt</tt> objektets <tt>navn</tt>. @return <tt>navn</tt> som tekststreng. public String getnavn(); / Henter <tt>projekt</tt> objektets tilknyttede <tt>kunde</tt> objekt svarende til kunden projektet udføres for. @return <tt>kunde</tt> som interfaced <tt>ifkunde</tt>. public IFKunde getifkunde(); / Henter <tt>projekt</tt> objektets <tt>kontaktperson</tt>. @return <tt>kontaktperson</tt> som tekststreng. public String getkontaktperson(); / Henter <tt>projekt</tt> objektets <tt>kontaktpersontlf</tt>. @return <tt>kontaktpersontlf</tt> som tekststreng. public String getkontaktpersontlf(); / Henter <tt>projekt</tt> objektets <tt>kompetencebehov</tt> objekter som en liste. Af hensyn til lagdelingen, returneres <tt>kompetencebehov</tt> obejkterne som <tt>ifkompetencebehov</tt>. @return <tt>arraylist</tt> indeholdende <tt>ifkompetencebehov</tt> objekter. public ArrayList<IFKompetenceBehov> getifkompetencebehovliste(); / Kontrollerer om <tt>projekt</tt> objektet har et <tt>kompetencebehov</tt> for det medsendte <tt>kompetence</tt> objekt som interfacet <tt>ifkompetence</tt>. @return sandhedsværdi, hvor <tt>true</tt> svarer til at projektet har et kompetencebehov for den medsendte kompetence. public boolean hasifkompetencebehov(ifkompetence ifkompetence); 107/201
/ Henter <tt>projekt</tt> objektets <tt>medarbejder</tt> objekt svarende til projektets projektleder. @return <tt>medarbejder</tt> som interfaced <tt>ifkunde</tt>. public IFMedarbejder getifprojektleder(); / Henter <tt>projekt</tt> objektets <tt>aarstal</tt>. @return <tt>aarstal</tt>. public int getaarstal(); / Henter <tt>projekt</tt> objektets <tt>note</tt>. @return <tt>note</tt> som tekststreng. public String getnote(); / Henter <tt>projekt</tt> objektets <tt>status</tt>. Benyttes til transaktionsstyrring, da heltalsværdien har en betydning:<p> <tt>status</tt> = 0: Et uændret objekt siden indlæsning<br /> <tt>status</tt> = 1: Et ændret objekt<br /> <tt>status</tt> = 2: Objekt til sletning<br /> <tt>status</tt> = 3: Et nyt objekt<br /> @return <tt>status</tt> public String getstatus(); Projekt package solutionmakers; import java.util.arraylist; / Projekt klasse som implementerer et Interface som benyttes i præsentationslaget. public class Projekt implements IFProjekt private int id; private String navn; private String status; private Kunde kunde; 108/201
private String kontaktperson; private String kontaktpersontlf; private Medarbejder projektleder; private int aarstal; private int version; private String note; private ArrayList<KompetenceBehov> kompetencebehovliste; private ArrayList<MedarbejderTilknytning> medarbejdertilknytningliste; / Bruges af KontrolDomain til oprettelse af nye projekt objekter. Derfor er id ikke med som parameter, da id først tilføjes senere @param navn @param kunde @param kontaktperson @param kontaktpersontlf @param projektleder @param kompetencebehov @param aarstal @param status @param note public Projekt(String navn, Kunde kunde, String kontaktperson, String kontaktpersontlf, Medarbejder projektleder, ArrayList<KompetenceBehov> kompetencebehov, int aarstal, String status, String note) this.id = 0; this.navn = navn; this.status = status; this.kunde = kunde; this.kontaktperson = kontaktperson; this.kontaktpersontlf = kontaktpersontlf; this.projektleder = projektleder; this.aarstal = aarstal; this.kompetencebehovliste = kompetencebehov; this.note = note; medarbejdertilknytningliste = new ArrayList<MedarbejderTilknytning>(); / Bruges af DataMapperProjekt til oprettelse af projekt objekter @param @return public Projekt(int id, String navn, String status, Kunde kunde, String kontaktperson, String kontaktpersontlf, Medarbejder projektleder, int version, int aarstal, String note) this.id = id; this.navn = navn; 109/201
this.status = status; this.kunde = kunde; this.kontaktperson = kontaktperson; this.kontaktpersontlf = kontaktpersontlf; this.projektleder = projektleder; this.aarstal = aarstal; this.version = version; this.note = note; kompetencebehovliste = new ArrayList<KompetenceBehov>(); medarbejdertilknytningliste = new ArrayList<MedarbejderTilknytning>(); / Tilknytter et medarbejder objekt til projektet som projektleder @param @return public boolean setprojektleder(medarbejder projektleder) this.projektleder = projektleder; return true; / Tilføjer eller ændre Projektets KompetenceBehov. Metoden er designet til brug i mapperkompetencebehov. @param kompetence @param behov @param status @return public KompetenceBehov setkompetencebehov(kompetence kompetence, int behov, Integer status) // såfremt status er engivet til nul if (status!= null && status == 0) // oprettes der et nyt objekt som tilføjes listen KompetenceBehov kb = new KompetenceBehov(kompetence, behov, 0); kompetencebehovliste.add(kb); return kb; // Hvis den medsendte Kompetence allerede er en del af // KompetenceBehovet ændret Kompetencens behov til det medsendte. boolean found = false; for (KompetenceBehov kb: kompetencebehovliste) if (kb.getkompetence() == kompetence) found = true; 110/201
kb.setbehov(behov); if (kb.getstatus() == 0 kb.getstatus() == 2) kb.setostatus(1); return kb; // Ellers oprettes et nyt KompetenceBehov som tilføjes. if (!found) // Vigtigt : Objektets status sættes til 'ny' (3) KompetenceBehov kb = new KompetenceBehov(kompetence, behov, 3); kompetencebehovliste.add(kb); return kb; return null; / Tilføjer eller ændre Projektets Medarbejder Tilknytninger. @param @return public MedarbejderTilknytning addmedarbejdertilknytning(medarbejder medarbejder, Kompetence kompetence, int tid) // Hvis den medsendte Medarbejder Tilknytning (medarbejder og // kompetence) allerede er en del af Projektets Medarbejder // Tilknytning, ændres tiden. boolean found = false; for (MedarbejderTilknytning mt: medarbejdertilknytningliste) // Er medarbejder og kompetence fundet i en eksisterende tilknytning if (mt.getmedarbejder() == medarbejder && mt.getkompetence() == kompetence) found = true; // registreres det her // Forskellen i Medarbejderens brug af tid på projektet kan // have effekt på hvorvidt denne opdatering er gyldigt. Hvis // medarbejderen ikke har tilstrækkelig ledig tid, vil han ikke // kunne blive tilknyttet og der breakes ud før opdateringen. int forskel = tid - mt.gettid(); int mtid = mt.getmedarbejder().getledigtid(); if (forskel > 0 && forskel - mtid > 0) break; // Medarbejdertilknytningen opdateres. mt.settid(tid); int mtostatus = mt.getostatus(); 111/201
if (mtostatus <= 2) // Vigtigt : Objektets status sættes til 'ændret' mt.setostatus(1); return mt; if (found) break; // Hvis Medarbejder Tilknytningen endnu ikke findes, vil den blive // oprettet og tilføjet. if (!found) // Vigtigt : Objektets status sættes til 'ny' (3) MedarbejderTilknytning mt = new MedarbejderTilknytning(medarbejder, kompetence, tid, 3); medarbejdertilknytningliste.add(mt); return mt; // Ved tilfælde af fejl returneres null return null; / Tilføjer en MedarbejderTilknytning til Projektet uden at se på eksisterende medarbejdertilknytninger @param @return public void addmedarbejdertilknytning(medarbejdertilknytning mt) medarbejdertilknytningliste.add(mt); / Fjerner en medarbejder fra et projekt @param mt @return public boolean removemedarbejdertilknytning(medarbejdertilknytning mt) //Hvis objektet er nyoprettet og endnu ikke ligger i DB if (mt.getostatus() == 3) //MedarbejderTilknytning slettes med det samme, da den endnu ikke er lagt i DB return medarbejdertilknytningliste.remove(mt); else //Vigtigt : Objektets status sættes til 'slettet' mt.settid(0); 112/201
mt.setostatus(2); return true; / Sletter et kompetence behov for projektet @param kb @return public boolean removekompetencebehov(kompetencebehov kb) if (kb.getstatus()!= 3) // er det ikke et helt nyt kompetencebehov kb.setostatus(2); // sættes til sletning return true; else return kompetencebehovliste.remove(kb); // ellers bare slet / Returnerer projekts id (projekt nummer) @return public int getid() return id; / Returnerer en tekst med id og navn. Bruges fx. på projektlisterne i GUI @return public String tostring() return id + ": " + navn; / Returnerer det planlagte projektaar @return public int getaarstal() return aarstal; / Returnerer projektstatus @return public String getstatus() return status; 113/201
/ Returnerer det kompetencebehov der er repræsenteret af det medsendte kompetence interface @param ifkompetence @return public KompetenceBehov getkompetencebehov(ifkompetence ifkompetence) // KompetenceBehovListen løbes igennem for (KompetenceBehov kb: kompetencebehovliste) // og når kompetencerne stemmer overens if (kb.getkompetence() == ifkompetence) return kb; // returneres kompetencebehovet return null; // ellers returneres null / Saet projektets navn @param navn public void setnavn(string navn) this.navn = navn; / Returnerer projektets navn @return public String getnavn() return navn; / Returnerer objektet Kunde @return public Kunde getkunde() return kunde; / Returnerer Kunde interfacet @return public IFKunde getifkunde() return kunde; / Returnerer kontaktperson @return public String getkontaktperson() 114/201
return kontaktperson; / Returnerer kontaktperson telefonnummer @return public String getkontaktpersontlf() return kontaktpersontlf; / Returnerer projektleder som medarbejder objekt @return public Medarbejder getprojektleder() return projektleder; / Returnerer projektleder som medarbejder interface @return public IFMedarbejder getifprojektleder() return projektleder; / Saetter tekststrengen kontaktperson @param kontaktperson public void setkontaktperson(string kontaktperson) this.kontaktperson = kontaktperson; / Saetter tekststrengen kontaktperson telefonnummer @param kontaktpersontlf public void setkontaktpersontlf(string kontaktpersontlf) this.kontaktpersontlf = kontaktpersontlf; / Saetter integeren version, der anvendes til versionsstyring i db @param version public void setversion(int version) this.version = version; 115/201
/ Saetter integeren aarstal der angiver hvornår projektet er planlagt til at blive udarbejdet @param aarstal public void setaarstal(int aarstal) this.aarstal = aarstal; / Saetter tekststrengen status @param status public void setstatus(string status) this.status = status; / Returnerer versionsnummeret som anvendes til versionstyring ved skrivning til databasen @return public int getversion() return version; / Saetter tekststrengen note @param note public void setnote(string note) this.note = note; / Returnerer tekststrengen note @return public String getnote() return note; / Saetter projekt id. Anvendes af mapperprojekt ved oprettelsen af et nyt projekt @param id public void setid(int id) this.id = id; 116/201
/ Tilføjer et kompetencebehov til projektet, men tjekker først om kompetencen er tildelt til projektet @param kb public void addkompetencebehov(kompetencebehov kb) // Er det et nyt kompetencebrhov (status = 3) if (kb.getstatus() == 3) for (KompetenceBehov kb2: kompetencebehovliste) // alle kompetencebehov tjekkes og hvis kompetencen findes if(kb2.getkompetence() == kb.getkompetence()) // ændres behovet i den eksisterende kb2.setbehov(kb.getbehov()); kb = kb2; // uanset hvad tilføjes det ændrede / nye til projektet kompetencebehovliste.add(kb); / Tilfoej et kundeobjekt til projektet @param kunde public void setkunde(kunde kunde) this.kunde = kunde; / Returnerer kompetencebehovlisten uden de kompetencebehov der står til sletning @return public ArrayList<IFKompetenceBehov> getifkompetencebehovliste() ArrayList<IFKompetenceBehov> res = new ArrayList<IFKompetenceBehov>(); ArrayList<KompetenceBehov> KompetenceBehovListe = getkompetencebehovliste(false); for (KompetenceBehov kb : KompetenceBehovListe) res.add(kb); return res; / Returnerer kompetencebehovlisten uden de kompetencebehov der står til sletning @return public ArrayList<KompetenceBehov> getkompetencebehovliste() return getkompetencebehovliste(false); 117/201
/ Returnerer kompetencebehovlisten og giver mulighed for at vælge alle (true) eller kun dem der ikke står til sletning (false) @param alle @return public ArrayList<KompetenceBehov> getkompetencebehovliste(boolean alle) // hvis alle er lig true if (alle) return kompetencebehovliste; // returneres hele listen // Ellers sorteres de slettede fra ArrayList<KompetenceBehov> res = new ArrayList<KompetenceBehov>(); for (KompetenceBehov kb: kompetencebehovliste) if (kb.getstatus()!= 2)// hvis status ej 2 (slettet) res.add(kb);// tilføjes til listen return res; / Returnerer listen af medarbejdertilknytninger @return public ArrayList<MedarbejderTilknytning> getmedarbejdertilknytningliste() return medarbejdertilknytningliste; / Returnerer en boolean alt efter om det medsendte kompetence interface referere til et kompetencebehov i projektet @param ifkompetence @return public boolean hasifkompetencebehov(ifkompetence ifkompetence) // Listen søges igennem for (KompetenceBehov kb: kompetencebehovliste) // Kompetence og status tjekkes if (kb.getkompetence() == ifkompetence && kb.getstatus()!= 2) return true; // er kompetence og status er ok returneres true return false; // ellers false IFKompetenceBehov package solutionmakers; / Interface for <tt>kompetencebehov</tt>. Benyttes i præsentationslaget for at opnå lavere binding. 118/201
public interface IFKompetenceBehov / Henter <tt>kompetencebehov</tt> objektets <tt>kompetence</tt> objekt. @return <tt>kompetence</tt>. public Kompetence getkompetence(); / Henter <tt>kompetencebehov</tt> objektets <tt>behov</tt>. @return <tt>behov</tt> svarende til ottendedele af et år public int getbehov(); / Henter <tt>kompetencebehov</tt> objektets <tt>status</tt>. Benyttes til transaktionsstyrring, da heltalsværdien har en betydning:<p> <tt>status</tt> = 0: Et uændret objekt siden indlæsning<br /> <tt>status</tt> = 1: Et ændret objekt<br /> <tt>status</tt> = 2: Objekt til sletning<br /> <tt>status</tt> = 3: Et nyt objekt<br /> @return <tt>status</tt> public int getstatus(); KompetenceBehov package solutionmakers; / <tt>kompetencebehov</tt> klasse som implementerer et Interface som benyttes i praesentationslaget. public class KompetenceBehov implements IFKompetenceBehov private Kompetence kompetence; private int behov; private int ostatus; // 0 = uændret, 1 = ændret, 2 = slettet, 3 = ny public KompetenceBehov(Kompetence kompetence, int behov, int ostatus) this.kompetence = kompetence; this.behov = behov; this.ostatus = ostatus; 119/201
/ Henter <tt>kompetencebehov</tt> objektets <tt>kompetence</tt> objekt. @return <tt>kompetence</tt>. public Kompetence getkompetence() return kompetence; / Henter <tt>kompetencebehov</tt> objektets <tt>kompetence</tt> objekt. @return <tt>ifkompetence</tt>. public Kompetence getifkompetence() return kompetence; / Aendrer <tt>kompetencebehov</tt> objektets <tt>behov</tt>. @param behov Heltal svarende til ottendedele af et aar public void setbehov(int behov) this.behov = behov; opdater(); / Henter <tt>kompetencebehov</tt> objektets <tt>behov</tt>. @return <tt>behov</tt> svarende til ottendedele af et aar public int getbehov() return behov; / Naar objektet aendres kaldes metoden private void opdater() if (ostatus!= 3) // kan ikke ændre nye objekter ostatus = 1; / Henter <tt>kompetencebehov</tt> objektets <tt>status</tt>. Benyttes til transaktionsstyrring, da heltalsvaerdien har en betydning:<p> <tt>status</tt> = 0: Et uaendret objekt siden indlaesning<br /> <tt>status</tt> = 1: Et aendret objekt<br /> 120/201
<tt>status</tt> = 2: Objekt til sletning<br /> <tt>status</tt> = 3: Et nyt objekt<br /> @return <tt>status</tt> public int getstatus() return ostatus; / Aendrer <tt>kompetencebehov</tt> objektets <tt>status</tt>. Benyttes til transaktionsstyrring, da heltalsvaerdien har en betydning:<p> <tt>status</tt> = 0: Et uaendret objekt siden indlaesning<br /> <tt>status</tt> = 1: Et aendret objekt<br /> <tt>status</tt> = 2: Objekt til sletning<br /> <tt>status</tt> = 3: Et nyt objekt<br /> @return <tt>status</tt> public void setostatus(int ostatus) this.ostatus = ostatus; / Aendrer <tt>kompetencebehov</tt> objektets <tt>kompetence</tt> objekt @param kompetence <tt>kompetence</tt> objekt public void setkompetence(kompetence kompetence) this.kompetence = kompetence; / Den normale <tt>tostring</tt> metode er omskrevet og tilpasset så den returnerer en tekststreng der identificerer <tt>kompetence</tt> objektet og <tt>behov</tt>. @return Tekststreng indeholdende <tt>kompetence</tt> objektets <tt>navn</tt> samt <tt>behov</tt>. public String tostring() return "" + getkompetence().getnavn() + " - Behov: " + getbehov() + "/8"; IFKompetence package solutionmakers; 121/201
/ Interface for <tt>kompetence</tt>. Benyttes i præsentationslaget for at opnå lavere binding. public interface IFKompetence / Henter <tt>kompetence</tt> objektets <tt>id</tt>. @return <tt>id</tt> - <tt>id</tt> = 0 ved nyt <tt>kompetence</tt> objekt eller id > 0 ved gammelt <tt>kompetence</tt> objekt. public int getid(); / Henter <tt>kompetence</tt> objektets <tt>navn</tt>. @return <tt>navn</tt> som tekststreng. public String getnavn(); / Henter <tt>kompetence</tt> objektets. @return <tt>beskrivelse</tt> som tekststreng. public String getbeskrivelse(); Kompetence package solutionmakers; / <tt>kompetence</tt> klasse som implementerer et Interface som benyttes i praesentationslaget. public class Kompetence implements IFKompetence private int id; private String navn; private String beskrivelse; private int ostatus; // 0 = uændret, 1 = ændret, 2 = slettet, 3 = ny public Kompetence(int id, String navn, String beskrivelse, int ostatus) this.id = id; this.navn = navn; this.beskrivelse = beskrivelse; this.ostatus = ostatus; 122/201
/ Henter <tt>kompetence</tt> objektets <tt>id</tt>. @return <tt>id</tt> - <tt>id</tt> = 0 ved nyt <tt>kompetence</tt> objekt eller id > 0 ved gammelt <tt>kompetence</tt> objekt. public int getid() return id; / Henter <tt>kompetence</tt> objektets <tt>navn</tt>. @return <tt>navn</tt> som tekststreng. public String getnavn() return navn; / Henter <tt>kompetence</tt> objektets <tt>beskrivelse</tt>. @return <tt>beskrivelse</tt> som tekststreng. public String getbeskrivelse() return "Navn : " + navn + " Beskrivelse " + beskrivelse; / Aendrer <tt>kompetence</tt> objektets <tt>ostatus</tt>. Benyttes til transaktionsstyrring, da heltalsværdien har en betydning:<p> <tt>status</tt> = 0: Et uændret objekt siden indlæsning<br /> <tt>status</tt> = 1: Et ændret objekt<br /> <tt>status</tt> = 2: Objekt til sletning<br /> <tt>status</tt> = 3: Et nyt objekt<br /> @param ostatus Den nye ostatus. public void setostatus(int ostatus) this.ostatus = ostatus; / Henter <tt>kompetence</tt> objektets <tt>ostatus</tt>. Benyttes til transaktionsstyrring, da heltalsværdien har en betydning:<p> 123/201
<tt>ostatus</tt> = 0: Et uændret objekt siden indlæsning<br /> <tt>ostatus</tt> = 1: Et ændret objekt<br /> <tt>ostatus</tt> = 2: Objekt til sletning<br /> <tt>ostatus</tt> = 3: Et nyt objekt<br /> @return <tt>ostatus</tt> public int getostatus() return ostatus; / Når objektet slettes kaldes metoden public void remove() ostatus = 2; / Den normale <tt>tostring</tt> metode er omskrevet og tilpasset så den returnerer en tekststreng der identificerer <tt>kompetence</tt> objektet. @return Tekststreng indeholdende <tt>id</tt> og <tt>navn</tt>. public String tostring() return id + ": " + navn; IFMedarbejder package solutionmakers; import java.util.arraylist; / Interface for <tt>medarbejder</tt>. Benyttes i præsentationslaget for at opnå lavere binding. public interface IFMedarbejder / Henter <tt>medarbejder</tt> objektets <tt>id</tt>. @return <tt>id</tt> - <tt>id</tt> = 0 ved nyt <tt>kunde</tt> objekt eller id > 0 ved gammelt <tt>kunde</tt> objekt. public int getid(); / Henter <tt>medarbejder</tt> objektets tilknyttede <tt>medarbejderkompetence</tt> objekter. 124/201
@return <tt>arraylist</tt> indeholdende <tt>medarbejderkompetence</tt> objekter. public ArrayList<MedarbejderKompetence> getmedarbejderkompetenceliste(); / Henter <tt>medarbejder</tt> objektets <tt>navn</tt>. @return <tt>navn</tt> public String getnavn(); / Henter <tt>kompetencebehov</tt> objektets <tt>ledigtid</tt> variabel, som svarer til medarbejderens resterende ledige tid i næste års ordrebog. @return <tt>ledigtid</tt> svarende til ottendedele af et år public int getledigtid(); Medarbejder package solutionmakers; import java.util.arraylist; / Medarbejder klasse som implementerer et Interface som benyttes i præsentationslaget. public class Medarbejder implements IFMedarbejder private int id; private String navn; private String telefonnummer; private String status; private int ledigtid; private ArrayList<MedarbejderKompetence> medarbejderkompetenceliste; private int ostatus; // 0 = uændret, 1 = ændret, 2 = slettet, 3 = ny public Medarbejder(int id, String navn, String telefonnummer, String status, int ledigtid, int ostatus) this.id = id; this.navn = navn; this.telefonnummer = telefonnummer; this.status = status; this.ledigtid = ledigtid; medarbejderkompetenceliste = new ArrayList<MedarbejderKompetence>(); this.ostatus = ostatus; 125/201
/ Kontruktør benyttes til at oprette en Medarbejder der kun indeholder id som er klar til at få indlæst data når de skal bruges. @param id public Medarbejder(int id) this.id = id; / Aendre alle Medarbejderens data. Benyttes i praksis kun på Medarbejdere der har benyttet den simple konstruktør der kun opretter med id. @param navn @param telefonnummer @param status @param ledigtid @return this public Medarbejder adddata(string navn, String telefonnummer, String status, int ledigtid) this.navn = navn; this.telefonnummer = telefonnummer; this.status = status; this.ledigtid = ledigtid; return this; / Tilføjer listen af Medarbejderkompetencer. Anvendes kun i test @param medarbejderkompetenceliste public void setkompetencer(arraylist<medarbejderkompetence> medarbejderkompetenceliste) this.medarbejderkompetenceliste = medarbejderkompetenceliste; / Anvendes til at hente medarbejder id @return id som integer public int getid() return id; / Saetter navn til den angivne tekst 126/201
@param navn som streng public void setnavn(string navn) this.navn = navn; / Anvendes til at hente medarbejder navn @return navn som String public String getnavn() return navn; / Saetter medarbejderens telefonnummer som tekststreng @param telefonnummer som tekststreng public void settelefonnummer(string telefonnummer) this.telefonnummer = telefonnummer; / Anvendes til at hente medarbejder telefonnummer @return telefonnummer som String public String gettelefonnummer() return telefonnummer; / Vores system kan kun håndtere netop 3 Status: "Ansat", "Projektleder" og "Opsagt". Hvis der bliver forsøgt indtastet andet, vil statis ikke blive ændret og metoden returnerer false. @param status som tekststreng @return boolean public boolean setstatus(string status) if (status.equals("ansat") status.equals("projektleder") status.equals("opsagt")) this.status = status; return true; return false; / Saetter den periode hvor medarbejderen stadig ikke er optaget @param ledigtid public void setledigtid(int ledigtid) 127/201
this.ledigtid = ledigtid; / Henter den vaerdien for den tid en medarbejder er ledig @return ledigtid som integer public int getledigtid() return ledigtid; / Gennemløber alle medarbejderens kompetencer og returnerer true hvis den medsendte kompetence findes. @param kompetence @return public boolean checkkompetence(kompetence kompetence) // For hver enkelt kompetence for (MedarbejderKompetence mk: medarbejderkompetenceliste) // Returner SAND hvis de er ens if (mk.getkompetence() == kompetence) return true; // ellers returner FALSK return false; / Tilføjer eller ændre Medarbejder Kompetence @param mkompetence public void addkompetence(medarbejderkompetence mkompetence) // Alle medarbejdernes kompetencer gennemløbes og hvis int i; // Søgning på hvilket id objektet befinder sig på. Hvis objektet ikke // findes, vil der blive kastet en exception som bliver håndteret ved // at sætte i til -1. try i = medarbejderkompetenceliste.indexof(mkompetence.getkompetence()); catch (Exception ex) i = -1; //ex.printstacktrace(); 128/201
// Enten er der fundet et gyldigt index (positivt inklusiv 0) eller // også tilføjes den nye kompetence. if (i >= 0) medarbejderkompetenceliste.get(i).setniveau(mkompetence.getniveau()); medarbejderkompetenceliste.get(i).setprioritering(mkompetence.getprioriterin g()); else medarbejderkompetenceliste.add(mkompetence); / Returnerer listen af MedarbejderKompetencer @return ArrayList%ltMedarbejderKompetence%gt public ArrayList<MedarbejderKompetence> getmedarbejderkompetenceliste() return medarbejderkompetenceliste; / Returnerer alle Medarbejderens MedarbejderKompetencer som matcher Kompetencebehovet. @param kompetencebehov @return public ArrayList<MedarbejderKompetence> getmedarbejderkompetenceliste(arraylist<kompetencebehov> kompetencebehov) ArrayList<MedarbejderKompetence> res = new ArrayList<MedarbejderKompetence>(); // Alle Medarbejderens MedarbejderKompetencer gennemløbes. for (MedarbejderKompetence mk: medarbejderkompetenceliste) // Alle KompetenceBehov løbes igennem for den aktuelle // MedarbejderKompetence. Hvis der findes et match mellem // Kompetencen i KompetenceBehovet og Kompetencen i // MedarbejderKompetende, så tilføjes MedarbejderKompetence til // resultatet. // For at optimerer algoritmen bryder går vi videre til næste // MedarbejderKompetence med det samme vi har fundet et match. for (KompetenceBehov kb: kompetencebehov) if (kb.getkompetence().getid() == mk.getkompetence().getid()) res.add(mk); break; return res; 129/201
/ Saet ostatus. Benyttes især af MapperMedarbejder til at sætte status til nul Vaerdien kan være 0 = uaendret, 1 = aendret, 2 = slettet og 3 = ny. I den afleverede applikation er det kun vaerdierne 0 og 1 der er aktuelle. @param ostatus public void setostatus(int ostatus) this.ostatus = ostatus; / Returnere ostatus Vaerdien kan være 0 = uaendret, 1 = aendret, 2 = slettet og 3 = ny. I den afleverede applikation er det kun værdierne 0 og 1 der er aktuelle @return public int getostatus() return ostatus; / Når objektet ændres kaldes metoden @param @return () private void opdater() if (ostatus!= 3) // kan ikke ændre nye objekter ostatus = 1; / Når objektet slettes kaldes metoden @param @return () public void remove() ostatus = 2; / Tilføjer en medarbejderkompetence til medarbejderen @param mkompetence public void addmedarbejderkompetence(medarbejderkompetence mkompetence) medarbejderkompetenceliste.add(mkompetence); 130/201
/ Returnerer en tekststreng. Anvendes i GUI til præsentation af medarbejderen på fanen Bemand projekt. @return String public String tostring() return id +": "+ navn + " : "+ledigtid + "/8" ; IFMedarbejderTilknytning package solutionmakers; / Interface for MedarbejderTilknytning. Benyttes i præsentationslaget for at opnå lavere binding. public interface IFMedarbejderTilknytning / Henter <tt>medarbejdertilknytning</tt> objektets tilknyttede <tt>medarbejder</tt> som interfacet <tt>ifmedarbejder</tt>. @return <tt>ifmedarbejder</tt> public IFMedarbejder getmedarbejder(); / Henter <tt>medarbejdertilknytning</tt> objektets tilknyttede <tt>kompetence</tt> som interfacet <tt>ifkompetence</tt>. @return <tt>ifmedarbejder</tt> public IFKompetence getkompetence(); / Henter <tt>medarbejdertilknytning</tt> objektets <tt>tid</tt> variabel, som svarer til medarbejderens forventede tidsforbrug for det <tt>projekt</tt> objekt som indeholder <tt>medarbejdertilknytning</tt> objektet. @return <tt>tid</tt> svarende til ottendedele af et år public int gettid(); / Henter <tt>medarbejdertilknytning</tt> objektets <tt>status</tt>. Benyttes til transaktionsstyrring, da heltalsværdien har en betydning:<p> 131/201
<tt>status</tt> = 0: Et uændret objekt siden indlæsning<br /> <tt>status</tt> = 1: Et ændret objekt<br /> <tt>status</tt> = 2: Objekt til sletning<br /> <tt>status</tt> = 3: Et nyt objekt<br /> @return <tt>status</tt> public int getostatus(); MedarbejderTilknytning package solutionmakers; import java.sql.connection; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.util.arraylist; import java.util.hashmap; / Objekt relationel mapper klasse public class MapperMedarbejderTilknytning HashMap<String, MedarbejderTilknytning> medarbejdertilknytningliste; public MapperMedarbejderTilknytning() medarbejdertilknytningliste = new HashMap<String, MedarbejderTilknytning>(); / Metoden tilføjer MedarbejderTilknytninger til et <tt>projekt</tt> @param projekt Et <tt>projekt</tt> @param medarbejdere En liste med <tt>medarbejder</tt>-objekter. @param kompetencer En liste med <tt>kompetence</tt>-objekter. @return projekt.getmedarbejdertilknytningliste(); Returnerer en <tt>arraylist</tt> med de <tt>medarbejdertilknytning</tt>-objekter som hører til projektet. public ArrayList<MedarbejderTilknytning> getmedarbejdertilknytningliste(projekt projekt, ArrayList<Medarbejder> medarbejdere, ArrayList<Kompetence> kompetencer) // Selection set med medarbejdertilknytninger som hører til det modtagede projekt. 132/201
String SQLString1 = "SELECT ProjektID, MedarbejderID, KompetenceID, Tid " + "FROM ProjektMedarbejdere WHERE ProjektID = " + projekt.getid(); Medarbejder medarb = null; Kompetence komp = null; Connection conn = null; ResultSet rs = null; try conn = DB.getConnection(); Statement stmt = conn.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_UPDATABLE); rs = stmt.executequery(sqlstring1); int i = 0; //ResultSet løbes igennem while (rs.next()) // Den modtagede ArrayList af medarbejdere løbes igennem while (medarb == null) int medarbejderid = rs.getint(2); // Hvis en medarbejder fra ArrayListen svarer til den aktuelle medarbejder fra ResultSet sættes 'medarb' lig med denne. if (medarbejderid == medarbejdere.get(i).getid()) medarb = medarbejdere.get(i); i++; i = 0; // Den modtagede ArrayList af kompetencer løbes igennem while (komp == null) int kompetenceid = rs.getint(3); // Hvis en kompetence fra ArrayListen svarer til den aktuelle kompetence fra ResultSet sættes 'komp' lig med denne. if (kompetenceid == kompetencer.get(i).getid()) komp = kompetencer.get(i); i++; i = 0; int tid = rs.getint(4); // Hver gang en medarbejder og en kompetence er fundet, tilføjes en MedarbejderTilknytning til det modtagede projekt. projekt.addmedarbejdertilknytning(medarb, komp, tid); medarb = null; komp = null; catch (Exception e) 133/201
// Hvis noget går galt udskrives en fejlmeddelelse. System.out.println("Fejl i MapperMedarbejderTilknytning.getMedarbejderTilknytningListe " + e); finally DB.releaseConnection(conn); // Projektets liste af MedarbejderTilknytninger returneres. return projekt.getmedarbejdertilknytningliste(); /Metoden gemmer ændringer i <tt>medarbejdertilknytning</tt>-objekter til et <tt>projekt</tt> @param projekt Et Projekt @param conn En forbindelse til DB @return void public void gemaendringer(projekt projekt, Connection conn) throws Exception ResultSet rs = null; int projektid = projekt.getid(); ArrayList<MedarbejderTilknytning> mtliste = projekt.getmedarbejdertilknytningliste(); // til tjek af om et projekt er opdateret i mellemtiden String sqlstring = "SELECT ProjektID, Version FROM Projekt WHERE ProjektID = " + projektid; Statement stmt = conn.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_UPDATABLE); rs = stmt.executequery(sqlstring); if (rs.next()) // tjekker om det er samme version if (rs.getint(2) == projekt.getversion()) // medarbejderlisten i projektet køres igennem for at finde // aendringer for (int i = 0; i < mtliste.size(); i++) MedarbejderTilknytning mt = mtliste.get(i); switch (mt.getostatus()) // Status 1 = opdater case 1: stmt.execute("update Projektmedarbejdere SET Tid = " + mt.gettid() + " WHERE ProjektID = " + projektid + " AND MedarbejderID = " + 134/201
mt.getmedarbejder().getid() + " AND KompetenceID = " + mt.getkompetence().getid()); mt.setostatus(0); break; // Status 2 = slet case 2: stmt.execute("delete ProjektMedarbejdere " + " WHERE ProjektID = " + projektid + " AND MedarbejderID = " + mt.getmedarbejder().getid() + " AND KompetenceID = " + mt.getkompetence().getid()); mtliste.remove(i); i--; break; // Status 3 = ny case 3: int medarbejderid = mt.getmedarbejder().getid(); int kompetenceid = mt.getkompetence().getid(); stmt.execute("insert INTO ProjektMedarbejdere VALUES ( " + projektid + ", " + medarbejderid + ", " + kompetenceid + ", " + mt.gettid() + ")"); mt.setostatus(0); if (!medarbejdertilknytningliste.containsvalue(mt)) medarbejdertilknytningliste.put(projektid + "." + medarbejderid + "." + kompetenceid,mt); //noeglen er sammensat af: 1)ProjektID, 2).(punktum), 3) MedarbejderID, 4).(punktum), 5) KompetenceID break; /Metoden tilknytter <tt>medarbejdertilknytning</tt>-objekter til et <tt>projekt</tt> @param p Et Projekt @param conn En forbindelse til DB @return boolean Returnerer en sandhedsvaerdi som fortaeller om operationen er lykkedes. public boolean getmedarbejdertilknytningtilprojekt(projekt p, Connection conn) PreparedStatement statement = null; ResultSet rs = null; MedarbejderTilknytning mt = null; String sqlstring = "SELECT MedarbejderID, KompetenceID, Tid FROM ProjektMedarbejdere WHERE ProjektID = " + p.getid(); try 135/201
statement = conn.preparestatement(sqlstring); rs = statement.executequery(sqlstring); while (rs.next()) //noeglen er sammensat af: 1)ProjektID, 2).(punktum), 3) MedarbejderID, 4).(punktum), 5) KompetenceID String key = p.getid() + "." + rs.getint(1) + "." + rs.getint(2); mt = medarbejdertilknytningliste.get(key); if (mt == null) //Ny MedarbejderTilknytning skabes af en "dummy"-medarbejder, en "dummy"-kompetence og tid(rs.getint(3) samt ObjektStatus(0) Medarbejder dummymedarbejder = new Medarbejder(rs.getInt(1)); Kompetence dummykompetence = new Kompetence(rs.getInt(2), "", "", 0); int tid = rs.getint(3); mt = new MedarbejderTilknytning(dummyMedarbejder, dummykompetence, tid, 0); //Den nye MedarbejderTilknytning tilføjes til den lokale HashMap medarbejdertilknytningliste.put(key, mt); //Hvis projektet ikke i forevejen indeholder MedarbejderTilknytningen, tilfoejes den if (!p.getmedarbejdertilknytningliste().contains(mt)) p.addmedarbejdertilknytning(mt); catch (SQLException e) //Hvis noget gaar galt skrives en fejlmeddelelse, og der returneres null System.out.println("Fejl i MapperMedarbejderTilknytning.getMedarbejderTilknytningTilProjekt " + e); return false; //Projektet med den tilknyttede liste af MedarbejderTilknytninger returneres return true; IFMedarbejderKompetence package solutionmakers; / Interface for MedarbejderKompetence. 136/201
Benyttes i præsentationslaget for at opnå lavere binding. public interface IFMedarbejderKompetence / Henter <tt>medarbejderkompetence</tt> objektets tilknyttede <tt>kompetence</tt> som interfacet <tt>ifkompetence</tt>. @return <tt>ifkompetence</tt> public IFKompetence getifkompetence(); / Henter <tt>medarbejderkompetence</tt> objektets <tt>niveau</tt>. Benyttes til at identificere i hvor høj grad en medarbejder besidder en kompetence:<p> <tt>niveau</tt> >= 7: Konsulent<br /> <tt>niveau</tt> < 7: Assistent<br /> @return <tt>niveau</tt> public int getniveau(); MedarbejderKompetence package solutionmakers; / MedarbejderKompetence klasse som implementerer et Interface som benyttes i præsentationslaget. public class MedarbejderKompetence implements IFMedarbejderKompetence private Kompetence kompetence; private int prioritering; private int niveau; private int ostatus; // 0 = uændret, 1 = ændret, 2 = slettet, 3 = ny public MedarbejderKompetence(Kompetence kompetence, int prioritering, int niveau, int ostatus) this.kompetence = kompetence; this.prioritering = prioritering; this.niveau = niveau; this.ostatus = ostatus; / 137/201
Returnerer kompetence objektet @return Kompetence public Kompetence getkompetence() return kompetence; / Returnerer et interface til kompetencen @return public IFKompetence getifkompetence() return kompetence; / Det er muligt at ændre en medarbejders prioritering af kompetencen med denne metode. @param prioritering public void setprioritering(int prioritering) this.prioritering = prioritering; / Returnerer prioriteringen @return public int getprioritering() return prioritering; / Niveauet er afgørende for om en medarbejder betegnes som assistent, med denne kompetence, eller som konsulent. Er niveau 7, eller derover, er medarbejderen konsulent. @param niveau public void setniveau(int niveau) this.niveau = niveau; / Returnere niveau. Er det 7 eller derover, er man konsulent. @return public int getniveau() return niveau; / 138/201
Returnere en tekststreng med informationer om kompetencen. Metoden anvendes til visningen på kompetencelisten på fanen Bemand projekt @return public String tostring() String res = ""; res += kompetence.getnavn() + " - " + niveau + "/10"; // Hvis niveau er mindre end 7, tilføjes et (a). // Dette viser at medarbejderen er på assistent niveau if (niveau < 7) res += " (a)"; return res; / Saetter ostatus til den oenskede vaerdi. ostatus er variablen der angiver hvad der skal ske med objektet i datasource Vaerdien kan vaere 0 = uaendret, 1 = aendret, 2 = deleted og 3 = ny. @param ostatus public void setostatus(int ostatus) this.ostatus = ostatus; / Henter ostatus vaerdien ostatus er variablen der angiver hvad der skal ske med objektet i datasource Vaerdien kan vaere 0 = uaendret, 1 = aendret, 2 = deleted og 3 = ny. @return public int getostatus() return ostatus; / Når objektet ændres kaldes metoden og ostatus saettes til 1, medmindre det er et nyt objekt @return () private void opdater() if (ostatus!= 3) // kan ikke ændre nye objekter ostatus = 1; / Når objektet slettes kaldes metoden og ostatus saettes til 1, medmindre det er et nyt objekt @return () 139/201
public void remove() ostatus = 2; / Anvendes til at tilføje en kompetence til objektet @param kompetence public void setkompetence(kompetence kompetence) this.kompetence = kompetence; IFKunde package solutionmakers; / Interface for <tt>kunde</tt>. Benyttes i præsentationslaget for at opnå lavere binding. public interface IFKunde / Henter <tt>kunde</tt> objektets <tt>id</tt>. @return <tt>id</tt> - <tt>id</tt> = 0 ved nyt <tt>kunde</tt> objekt eller id > 0 ved gammelt <tt>kunde</tt> objekt. public int getid(); / Henter <tt>kunde</tt> objektets <tt>navn</tt>. @return <tt>navn</tt> public String getnavn(); / Henter <tt>kunde</tt> objektets <tt>type</tt>. Benyttes til at identificere hvor stor kunden er og dermed i hvor høj grad af assistenter der må benyttes på kundes projekter.<p> Der er tre kundetyper:<p> <tt>type</tt> = "Ny stor kunde": max 20% assistenter<br /> <tt>type</tt> = "Gammel stor kunde": max 40% assistenter<br /> <tt>type</tt> = "Ny lille kunde": max 60% assistenter<br /> @return <tt>type</tt> som tekststreng public String gettype(); 140/201
Kunde package solutionmakers; / Kunde klasse som implementerer et Interface som benyttes i praesentationslaget. public class Kunde implements IFKunde private int id; private String navn; private String adresse; private PostnrBy postnrby; private String telefonnummer; private String email; private String type; private String note; private int ostatus; // 0 = uændret, 1 = ændret, 2 = slettet, 3 = ny / Konstruktoer for klassen Kunde. @param id @param navn @param adresse @param postnrby @param telefonnummer @param email @param type @param note @param ostatus public Kunde(int id, String navn, String adresse, PostnrBy postnrby, String telefonnummer, String email, String type, String note, int ostatus) this.id = id; this.navn = navn; this.adresse = adresse; this.postnrby = postnrby; this.telefonnummer = telefonnummer; this.email = email; this.type = type; this.note = note; this.ostatus = ostatus; public void setid(int id) this.id = id; 141/201
public int getid() return id; public void setnavn(string navn) this.navn = navn; public String getnavn() return navn; public void setadresse(string adresse) this.adresse = adresse; public String getadresse() return adresse; public void settelefonnummer(string telefonnummer) this.telefonnummer = telefonnummer; public String gettelefonnummer() return telefonnummer; public void setemail(string email) this.email = email; public String getemail() return email; public void settype(string type) this.type = type; public String gettype() return type; 142/201
public void setnote(string note) this.note = note; public String getnote() return note; public String tostring() return "" + navn; public void setpostnrby(postnrby postnrby) this.postnrby = postnrby; public PostnrBy getpostnrby() return postnrby; public void setostatus(int ostatus) this.ostatus = ostatus; public int getostatus() return ostatus; / Når objektet ændres kaldes metoden @param @return () private void opdater() if (ostatus!= 3) // kan ikke ændre nye objekter ostatus = 1; / Når objektet slettes kaldes metoden @param @return () public void remove() ostatus = 2; 143/201
PostnrBy package solutionmakers; / PostnrBy klasse som implementerer et Interface som benyttes i præsentationslaget. public class PostnrBy private int Postnr; private String By; public PostnrBy(int Postnr, String By) this.postnr = Postnr; this.by = By; / Returnere postnr @return public int getpostnr() return Postnr; / Returnere by @return public String getby() return By; FacadeDatasource package solutionmakers; import java.sql.; import java.sql.preparedstatement; import java.util.arraylist; / Singleton postkontor mellem domaenelaget og datakildelaget. public class FacadeDatasource 144/201
private static FacadeDatasource instance; private KontrolDatasource kontroldatasource; //Sikring af at alle klasser henvender sig til samme FacadeDataSource / Sikring af at der kun eksisterer netop én instans af klassen. En del af singleton patternet. @return Returnerer instansen af <tt>facadedatasource</tt> public static FacadeDatasource getinstance() //Hvis en instans af klassen ikke er oprettet if (instance == null) //Opret en instans instance = new FacadeDatasource(); //Returner instans return instance; / Singleton postkontor mellem domaenelaget og datakildelaget. En del af singleton patternet (privat konstruktør). Fungererer ved at videresende metodekald til de relevante kontrol klasser. (I vores afgrænsede løsning kun 1 kontrol klasse) private FacadeDatasource() kontroldatasource = new KontrolDatasource(); // Projekter / Henter en liste af <tt>projekt</tt> objekter paa baggrund af <tt>status</tt> og <tt>aarstal</tt>. @param status En bestemt <tt>status</tt> eller <tt>null</tt> hvis alle @param aarstal Et bestemt <tt>aarstal</tt> eller <tt>null</tt> hvis alle @return <tt>arraylist</tt> indeholdende en liste med <tt>projekt</tt> public ArrayList<Projekt> getprojektliste(string status, Integer aarstal) return kontroldatasource.getprojektliste(status, aarstal); / Henter et <tt>projekt</tt> objekt inkl. alle tilknyttede objekter. @param p Et <tt>projekt</tt> objekt @return sandhedsværdi, som afgoer om alle objekter er tilknyttet public boolean getprojekt(projekt p) return kontroldatasource.getprojekt(p); 145/201
/ Gemmer et <tt>projekt</tt> inkl. alle tilknyttede objekter. @param p Et <tt>projekt</tt> objekt @return sandhedsvaerdi, som afgoer om alle objekter er blevet gemt public boolean saveprojekt(projekt p) return kontroldatasource.saveprojekt(p); // Kunder / Henter en liste med alle <tt>kunde</tt> objekter. @return <tt>arraylist</tt> indeholdende alle <tt>kunde</tt> objekter public ArrayList<Kunde> getkundeliste() return kontroldatasource.getkundeliste(); // Medarbejder / Henter en liste med alle <tt>medarbejder</tt> objekter. @return <tt>arraylist</tt> indeholdende alle <tt>medarbejder</tt> objekter public ArrayList<Medarbejder> getmedarbejderliste() return kontroldatasource.getmedarbejderliste(); / Henter en liste med <tt>medarbejder</tt> objekter, som besidder en <tt>kompetence</tt> (<tt>k</tt>) på et hvilket som helst niveau. @param k Et <tt>kompetence</tt> objekt @return <tt>arraylist</tt> indeholdende medarbejdere public ArrayList<Medarbejder> getmedarbejderliste(kompetence k) return kontroldatasource.getmedarbejderliste(k); // Kompetence / Henter en liste med alle <tt>kompetence</tt> objekter. @return <tt>arraylist</tt> indeholdende alle <tt>kompetence</tt> objekter public ArrayList<Kompetence> getkompetenceliste() return kontroldatasource.getkompetenceliste(); 146/201
/ Henter et <tt>kompetence</tt> objekt paa baggrund af et kompetence navn (<tt>kompetencenavn</tt>). Benyttes i praksis til at hente <tt>kompetence</tt> objektet med kompetence navnet "Projektledelse". @param kompetencenavn En tekststreng (<tt>string</tt>) svarende til navnet på det <tt>kompetence</tt> objekt man ønsker at få fat i @return <tt>kompetence</tt> objekt public Kompetence getkompetence(string kompetencenavn) try return kontroldatasource.getkompetence(kompetencenavn); catch (SQLException e) return null; KontrolDatasource package solutionmakers; import java.sql.connection; import java.sql.drivermanager; import java.sql.sqlexception; import java.util.arraylist; / Styrer hele DataSource laget ved at uddele opgaver til de forskellige mappere og samle de rette oplysninger inden de bliver returneret. public class KontrolDatasource private MapperProjekt mprojekt; private MapperMedarbejder mmedarbejder; private MapperKompetence mkompetence; private MapperKunde mkunde; private MapperPostnrBy mpostnrby; private MapperMedarbejderTilknytning mmedarbejdertilknytning; private MapperMedarbejderKompetence mmedarbejderkompetence; private MapperKompetenceBehov mkompetencebehov; / Konstruktoer public KontrolDatasource() 147/201
mprojekt = new MapperProjekt(); mmedarbejder = new MapperMedarbejder(); mkompetence = new MapperKompetence(); mkunde = new MapperKunde(); mpostnrby = new MapperPostnrBy(); mmedarbejdertilknytning = new MapperMedarbejderTilknytning(); mmedarbejderkompetence = new MapperMedarbejderKompetence(); mkompetencebehov = new MapperKompetenceBehov(); / Hent kunde liste. Alle kunder faar PostnrBy tilknyttet. @return ArrayList indeholdende Kunder public ArrayList<Kunde> getkundeliste() ArrayList<PostnrBy> postnrby = new ArrayList<PostnrBy>(); ArrayList<Kunde> res = null; Connection conn = null; try //Aaben en forbindelse til DB conn = getconnection(); //Hent kundelisten res = mkunde.getkundeliste(conn); //Hent postnrby fra hver kunde(postnrby er dummy-objekter) for (Kunde k: res) postnrby.add(k.getpostnrby()); //Erstatter dummy-objekter med objekter postnrby = mpostnrby.getpostnrbyliste(postnrby); int length = res.size(); //Hvis antaller af kunder passer med antallet af postnrby-objekter if (length == postnrby.size()) //Tilknyt hvert kunde-objekt med et postnrby-objekt for (int i = 0; i < length; i++) res.get(i).setpostnrby(postnrby.get(i)); else //Returner en nyoprettet og tom liste res = new ArrayList<Kunde>(); catch (Exception e) System.out.println("Fejl i KontrolDataSource.getKundeListe " + e); finally //Luk forbindelsen til DB 148/201
DB.releaseConnection(conn); //Returner resultatet return res; / Henter kompetence liste. @return ArrayList indeholdende Kompetencer public ArrayList<Kompetence> getkompetenceliste() ArrayList<Kompetence> res = null; Connection conn = null; try //Opret forbindelse til DB conn = getconnection(); res = mkompetence.getkompetenceliste(conn); catch (Exception e) System.out.println("Fejl i KontrolDataSource.getKompetenceListe " + e); finally //Luk forbindelsen til DB DB.releaseConnection(conn); return res; / Hent medarbejder liste. Alle medarbejdere faar MedarbejderKompetencer tilknyttet.<p> Returnerer alle medarbejdere der besidder den medsendte kompetence eller alle medarbejdere saafremt der ikke bliver medsendt en kompetence @param kompetence Det er valgfrit at medsende en kompetence @return ArrayList indeholdende Medarbejdere public ArrayList<Medarbejder> getmedarbejderliste(kompetence kompetence) ArrayList<Medarbejder> res = null; Connection conn = null; //boolean til verificering af udfoert mapning boolean mapninggennemfoert = false; try //Opret forbindelse til DB conn = getconnection(); //Sandhedvaerdi : saettes til resultatet af mapning mapninggennemfoert = mmedarbejder.getmedarbejderliste(kompetence, conn); 149/201
//Hvis mapning er gennemfoert if (mapninggennemfoert) //Sandhedvaerdi : saettes til resultatet af mapning mapninggennemfoert = mmedarbejderkompetence.getmedarbejderkompetencetilmedarbejderliste(res, conn); catch (Exception e) System.out.println("Fejl i KontrolDataSource.getMedarbejderListe " + e); finally //Luk forbindelsen til DB releaseconnection(conn); //Returner resultat return res; / Metoden henter alle medarbejdere. Til hver medarbejder hentes dennes <tt>medarbejderkompetence</tt>-objekter. Til hver <tt>medarbejderkompetence</tt> tilknyttes én <tt>kompetence</tt>. @param @return ArrayList<Medarbejder> Returnerer alle medarbejderobjekter i en <tt>arraylist</tt>, med tilknyttede <tt>medarbejderkompetence </tt>-objekter, og deres tilknyttede <tt>kompetence</tt>-objekter. public ArrayList<Medarbejder> getmedarbejderliste() ArrayList<Medarbejder> res = null; Connection conn = null; try //Opret forbindelse til DB conn = getconnection(); //Hent medarbejdere fra MapperMedarbejder res = mmedarbejder.getmedarbejderliste(conn); //boolean til verificering af udfoert mapning boolean mapninggennemfoert = false; //Sandhedsvaerdi til afgoerelse af om alle er indlaest boolean alleindlaest = true; //Kontainere til tidligere indlaeste- og ikke indlaeste medarb. 150/201
ArrayList<Medarbejder> alleredeindlaest = new ArrayList<Medarbejder>(); ArrayList<Medarbejder> ikkeindlaest = new ArrayList<Medarbejder>(); / Check om der findes medarbejdere i den foreloebige liste, som endnu ikke har faaet tilknyttet sine MedarbejderKompetence- objekter. for (Medarbejder m: res) / Hvis medarbejderen indholder en eller flere MedarbejderKompetencer, med rigtige (ikke 'dummy's) kompetencer antages at medarbejderen er tidligere indlaest. Ellers tilfoejes medarbejderen til den midlertidige liste, 'ikkeindlaest'. if (m.getmedarbejderkompetenceliste().size() > 0 &&!m.getmedarbejderkompetenceliste().get(0).getkompetence().getnavn().equals(" ")) alleredeindlaest.add(m); alleindlaest = alleindlaest && true; else ikkeindlaest.add(m); alleindlaest = alleindlaest && false; //Hvis ikke alle medarbejdere er indlaest, goeres det nu. if (!alleindlaest) //Hent MedarbejderKompetencer til ikke tidligere indlaeste medarbejdere mapninggennemfoert = mmedarbejderkompetence.getmedarbejderkompetencetilmedarbejderliste(ikkeindla est, conn); / Sammensaet de to lister, 'res'(nu koblet med medarbejderkompetencer) og 'alleredeindlaest'. for (Medarbejder m: alleredeindlaest) res.add(m); //Til slut tilknyttes Kompetencer til MedarbejderKompetencer if (mapninggennemfoert) mapninggennemfoert = mkompetence.getkompetencetilmedarbejderkompetenceliste(res, conn); catch (Exception e) System.out.println("Fejl i KontrolDataSource.getMedarbejderListe " + e); finally 151/201
//Luk forbindelsen til DB releaseconnection(conn); return res; / Henter liste med projekter paa baggrund af status og aarstal. @return ArrayList indeholdende Projekter public ArrayList<Projekt> getprojektliste(string status, Integer aarstal) ArrayList<Projekt> res = null; Connection conn = null; try //Opret forbindelse til DB conn = getconnection(); //Hent projekter som modsvarer status og aarstal res = mprojekt.getprojektliste(status, aarstal, conn); catch (Exception e) System.out.println("Fejl i KontrolDataSource.getProjektListe" + e); finally //Luk forbindelsen til DB releaseconnection(conn); return res; / Hent alle informationer til projekt @param p Projekt som skal <i>fyldes med information</i> @return Projekt public boolean getprojekt(projekt p) boolean mapninggennemfoert = false; //Opret forbindelse til DB Connection conn = getconnection(); ArrayList<Medarbejder> medarbejdere = new ArrayList<Medarbejder>(); try //Kompetencebehov tilknyttes projekt mapninggennemfoert = mkompetencebehov.getkompetencebehovtilprojekt(p, conn); //Kunde tilknyttes projekt if (mapninggennemfoert) mapninggennemfoert = mkunde.getkundetilprojekt(p, conn); //Projektleder tilknyttes projekt if (mapninggennemfoert) 152/201
conn); mapninggennemfoert = mmedarbejder.getprojektledertilprojekt(p, conn); //Kompetencer tilknyttes KompetenceBehov if (mapninggennemfoert) mapninggennemfoert = mkompetence.getkompetencetilkompetencebehov(p, conn); //Medarbejdertilknytninger tilknyttes projekt if (mapninggennemfoert) mapninggennemfoert = mmedarbejdertilknytning.getmedarbejdertilknytningtilprojekt(p, //Medarbejdere tilknyttes Medarbejdertilknytninger if (mapninggennemfoert) mapninggennemfoert = mmedarbejder.getmedarbejdertilmedarbejdertilknytning(p, conn); //Medarbejderkompetencer tilknyttes Medarbejdere if (mapninggennemfoert) for (MedarbejderTilknytning mt: p.getmedarbejdertilknytningliste()) medarbejdere.add(mt.getmedarbejder()); mapninggennemfoert = mmedarbejderkompetence.getmedarbejderkompetencetilmedarbejderliste(medarbejd ere, conn); //Kompetencer tilknyttes medarbejdere if (mapninggennemfoert) mapninggennemfoert = mkompetence.getkompetencetilmedarbejderkompetenceliste(medarbejdere, conn); //Kompetencer tilknyttes medarbejdertilknytninger if (mapninggennemfoert) mapninggennemfoert = mkompetence.getkompetencetilmedarbejdertilknytning(p, conn); catch (Exception e) System.out.println("Fejl i KontrolDataSource.getProjekt() " + e); mapninggennemfoert = false; finally //Luk forbindelsen til DB releaseconnection(conn); 153/201
//Sandhedvaerdi for hvorvidt alle mapninger gik godt, returneres return mapninggennemfoert; / Gemmer projekt. Hvis nyt oprettes det i database ellers opdateres databasen. @param p Projektet der skal gemmes @return Det nyoprettede Projekt public boolean saveprojekt(projekt p) boolean res = false; Connection conn = null; try //Opret forbindelse til DB conn = getconnection(); //Autocommit slaas fra, for at samle mapninger til en transaktion conn.setautocommit(false); // Gem stamdata res = mprojekt.saveprojekt(p, conn); // Gem kompetencebehov if (res) mkompetencebehov.gemaendringer(p, conn); // Gem MedarbejderTilknytninger if (res) mmedarbejdertilknytning.gemaendringer(p, conn); // Gem medarbejdere if (res) mmedarbejder.gemaendringer(p, conn); //Hvis alle mapninger er en succes, comittes i DB conn.commit(); catch (Exception e) try //I tilfaelde af fejl i mapningen, fortrydes mapningens handlinger conn.rollback(); catch (SQLException f) System.out.println("KontrolDataSource.saveProjekt - Rollback mislykkedes : " + f); System.out.println("Fejl i KontrolDataSource.saveProjekt " + e); finally //Luk forbindelsen til DB releaseconnection(conn); //Returner sandhedsvaerdi 154/201
return res; / Opretter en forbindelse til DB, med brug af driver og login @param conn private Connection getconnection() Connection conn = null; try Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection("jdbc:oracle:thin:@delfi.lyngbyes.dk:1521:LUC", "gr1tr07d2", "gr1tr07d2"); catch (Exception e) System.out.println("fejl i DB.prepare() " + e); return conn; / Lukker en forbindelse til DB @param conn private void releaseconnection(connection conn) try conn.close(); catch (Exception e) System.err.println(e); / Henter en kompetence paa baggrund af en tekststreng. @param kompetencenavn @return Kompetence @throws SQLException public Kompetence getkompetence(string kompetencenavn) throws SQLException Connection conn = getconnection(); Kompetence k = mkompetence.getkompetence(conn, kompetencenavn); releaseconnection(conn); return k; / Henter kompetencebehov til et et projekt. 155/201
@param p @return Projekt public Projekt getkompetencebehovtilprojekt(projekt p) Connection conn = getconnection(); mkompetencebehov.getkompetencebehovtilprojekt(p, conn); releaseconnection(conn); return p; mapperprojekt package solutionmakers; import java.sql.connection; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.statement; import java.util.arraylist; import java.util.hashmap; / Objekt relationel mapper klasse public class MapperProjekt HashMap<Integer, Projekt> projektliste; public MapperProjekt() projektliste = new HashMap<Integer, Projekt>(); / Metoden gemprojekt tilføjer nye projekter og gemmer ændringer i stamdata @param projekt @param conn @return res @throws Exception public boolean saveprojekt(projekt projekt, Connection conn) throws Exception boolean res = false; ResultSet rs = null; String sql; // Henter informationer til senere brug int projektid = projekt.getid(); String projektnavn = projekt.getnavn(); String projektstatus = projekt.getstatus(); String projektkontaktperson = projekt.getkontaktperson(); 156/201
String projektkontaktpersontlf = projekt.getkontaktpersontlf(); String projektnote = projekt.getnote(); int projektaarstal = projekt.getaarstal(); int projektkundeid = projekt.getkunde().getid(); String projektleder = null; int projektversion = projekt.getversion(); // også hvis der er en projektleder if (projekt.getprojektleder()!= null) if (projekt.getprojektleder().getid()!= 0) projektleder = "" + projekt.getprojektleder().getid(); // Nyt projekt eller ej, der skal foretages en ændring i db if (projektid == 0) // Hvis et projekt ikke er i db sql = "INSERT INTO Projekt VALUES (" + "projektseq.nextval, '" + projektnavn + "', '" + projektstatus + "', '" + projektkontaktperson + "', '" + projektkontaktpersontlf + "', '" + projektnote + "', " + projektaarstal + ", " + projektkundeid + ", " + projektleder + ", 0)"; else // Hvis et projekt er i db sql = "UPDATE Projekt SET Projektnavn = '" + projektnavn + "', ProjektStatus = '" + projektstatus + "', ProjektKontakt = '" + projektkontaktperson + "', ProjektKontaktTlf = '" + projektkontaktpersontlf + "', Note = '" + projektnote + "', Aarstal = " + projektaarstal + ", ProjektlederID = " + projektleder + ", Version = " + (projektversion + 1) + " WHERE ProjektID = " + projektid; til + // Ved oprettelse af et projekt // Når der indsættes et nyt projekt i db, skal vi have id returneret // objektet. Gøres med følgende forespørgsel String select4insert = "SELECT ProjektID, Projektnavn, Version FROM Projekt WHERE " + "Projektnavn like('" + projektnavn + "') ORDER BY ProjektID DESC"; // Ved ændring i et projekt // Før der opdateres, skal versionsnumeret verificeres // Det gøres med følgende forespørgsel String select4update = "SELECT ProjektID, Version FROM Projekt WHERE " + "ProjektID = " projektid; Statement stmt = conn.createstatement(resultset.type_scroll_insensitive, 157/201
ResultSet.CONCUR_UPDATABLE); hashmap er korrekt versionsnr if (!(projektid > 0)) // Indsætter nyt projekt og tilføjer til Identity map stmt.execute(sql); rs = stmt.executequery(select4insert); // Henter idnr. if (rs.next()) projekt.setid(rs.getint(1)); // sætter idnr. projekt.setversion(0); // version sættes til nul projektliste.put(projektid, projekt); // putter i res = true; else // Opdaterer informationerne for projektet hvis versionsnr rs = stmt.executequery(select4update); // Kører versionstjek if (rs.next() && projektversion == rs.getint(2)) stmt.execute(sql); // Skriver til db projekt.setversion(projektversion + 1); // opdaterer res = true; return res; / Metoden henter listen af projekter, mapper dem til objekter og gemmer dem i en arrayliste. @param status @param aarstal @param conn @return projekter @throws Exception public ArrayList<Projekt> getprojektliste(string status, Integer aarstal, Connection conn) throws Exception ArrayList<Projekt> projekter = new ArrayList<Projekt>(); Projekt projekt = null; Kunde kunde; Medarbejder projleder; + KundeID " + // Opretter forespørgsel String SQLString1 = "SELECT ProjektID, Projektnavn, ProjektStatus, ProjektKontakt, " "ProjektKontaktTlf, Note, Aarstal, ProjektlederID, Version, "FROM Projekt "; // Evt. søgekriterium tilføjes if(status!=null&&aarstal!=null) SQLString1 += "WHERE ProjektStatus = '"+status+"' AND Aarstal = "+aarstal+" "; 158/201
else if(status!=null) SQLString1 += "WHERE ProjektStatus = '"+status+"' "; else if(aarstal!=null) SQLString1 += "WHERE Aarstal = "+aarstal+" "; // Fortsat oprettelse af forespørgsel SQLString1 += "ORDER BY Projektnavn"; // Selection set med projekter PreparedStatement statement = null; statement = conn.preparestatement(sqlstring1); ResultSet rs = statement.executequery(); // For hver tupel hntet i db while (rs.next()) // er projektet ikke indlæst til objekt projekt = projektliste.get(rs.getint(1)); if (projekt == null) // opret objekt hvis det ikke er indlæst projleder = new Medarbejder(rs.getInt(8)); // opretter 'dummy' kunde kunde = new Kunde(rs.getInt(10), "", "", null, "", "", "", "", 0); // opretter projekt projekt = new Projekt(rs.getInt(1), rs.getstring(2), rs.getstring(3), kunde, rs.getstring(4), rs.getstring(5), projleder, rs.getint(9), rs.getint(7), rs.getstring(6)); // og putter i hashmap projektliste.put(rs.getint(1), projekt); // Tilføjer projekt til liste projekter.add(projekt); // returnerer liste return projekter; mapperkompetencebehov package solutionmakers; import java.sql.connection; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.util.arraylist; 159/201
import java.util.hashmap; / Objekt relationel mapper klasse public class MapperKompetenceBehov HashMap<String, KompetenceBehov> kompetencebehovliste; public MapperKompetenceBehov() kompetencebehovliste = new HashMap<String, KompetenceBehov>(); / Metoden henter listen af projektkompetencer og mapper dem til et array. //Denne metode er ikke opdateret til Identity map endnu public ArrayList<KompetenceBehov> getkompetencebehovliste(projekt projekt, ArrayList<Kompetence> kompetence, Connection conn) throws Exception String SQLString1 = "SELECT ProjektID, KompetenceID, Behov " + "FROM ProjektKompetencer WHERE ProjektID = " + projekt.getid(); // Forberede forespoergsel til selection set med projekter // Initialiserer noedvendige variable Kompetence komp = null; ResultSet rs = null; // Statement forberedt til 'scroll' i result Statement stmt = conn.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_UPDATABLE); rs = stmt.executequery(sqlstring1); // oprette result int i; while (rs.next()) // Koerer for hver tupel i = 0; while (komp == null) // Hvis kompetence id'erne er ens kobles kompetence til variabel if (rs.getint(2) == kompetence.get(i).getid()) komp = kompetence.get(i); i++; // Kompetence tilfoejes projekt projekt.setkompetencebehov(komp, rs.getint(3), 0); komp = null; // til sidst returneres listen 160/201
return projekt.getkompetencebehovliste(); / Gemmer aendringerne for kompetence behovet i et projekt @param projekt @param conn @throws Exception public void gemaendringer(projekt projekt, Connection conn) throws Exception // Initialisering af variable ResultSet rs = null; int projektid = projekt.getid(); // Forespoergsel til senere tjek af om et projekt er opdateret siden // indlaesning til applikationen String sqlstring = "SELECT ProjektID, Version FROM Projekt WHERE ProjektID = " + projektid; // Statement forberedt til 'scroll' i resultat saet Statement stmt = conn.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_UPDATABLE); rs = stmt.executequery(sqlstring); // Er der et forespoergsels resultat if (rs.next()) // Tjekkes om det er samme version if (rs.getint(2) == projekt.getversion()) // Er det samme version... KompetenceBehov kb; ArrayList<KompetenceBehov> projektkompetencebehov = projekt.getkompetencebehovliste(true); // Kompetencelisten i projektet koeres igennem for at finde // aendringer og tilfoejelser for (int i = 0; i < projektkompetencebehov.size(); i++) kb = projektkompetencebehov.get(i); switch (kb.getstatus()) case 1: // Opdaterede kompetence behov stmt.execute("update ProjektKompetencer SET Behov = " + kb.getbehov() + " WHERE ProjektID = " + projektid + " AND KompetenceID = " + kb.getkompetence().getid()); kb.setostatus(0); // ostatus nulstilles break; case 2: // Slettede kompetence behov stmt.execute("delete ProjektKompetencer WHERE " + "ProjektID = " + projektid + 161/201
" AND KompetenceID = " + kb.getkompetence().getid()); projektkompetencebehov.remove(kb); i--; break; case 3: // Nye kompetence behov stmt.execute("insert INTO ProjektKompetencer VALUES ( " + projektid + ", " + kb.getkompetence().getid() + ", " + kb.getbehov() + ")"); projektkompetencebehov.add(kb); kb.setostatus(0); // ostatus nulstilles break; / Metoden modtager et <tt>projekt</tt> og en <tt>connection</tt>, og tilknytter et eller flere <tt>kompetencebehov</tt>. @param p Et i forevejen valgt projekt @param conn En forbindelse til databasen @return Projekt Returnerer et Projekt med tilknyttede <tt>kompetencebehov</tt> public boolean getkompetencebehovtilprojekt(projekt p, Connection conn) // Initialisere variable PreparedStatement statement = null; ResultSet rs = null; KompetenceBehov kb = null; int projektid = p.getid(); " + // Forbereder SQL forespoergsel String sqlstring = "SELECT KompetenceID, Behov FROM ProjektKompetencer WHERE ProjektID = projektid; try // Spoerg i databasen statement = conn.preparestatement(sqlstring); rs = statement.executequery(sqlstring); // For hvert soegeresultat while (rs.next()) //noeglen er sammensat af: 1)ProjektID, 2).(punktum), 3) KompetenceID String key = projektid + "." + rs.getint(1); kb = kompetencebehovliste.get(key); if (kb == null) 162/201
//Nyt KompetenceBehov skabes af en "dummy"-kompetence og behov(rs.getint(3) samt ObjektStatus(0) kb = new KompetenceBehov(new Kompetence(rs.getInt(1), "", "", 0), rs.getint(2), 0); //Det nye KompetenceBehov tilfoejes til den lokale HashMap kompetencebehovliste.put(key, kb); //Hvis projektet ikke i forevejen indeholder kompetencebehovet, tilfoejes det if (!p.getkompetencebehovliste().contains(kb)) p.addkompetencebehov(kb); catch (SQLException e) //Hvis noget gaar galt skrives en fejlmeddelelse, og der returneres null System.out.println("Fejl i MapperKompetenceBehov.getKompetenceBehovTilProjekt " + e); return false; //Projektet med den tilknyttede liste af kompetencebehov returneres return true; mappermedarbejdertilknytning package solutionmakers; import java.sql.connection; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.util.arraylist; import java.util.hashmap; / Objekt relationel mapper klasse public class MapperMedarbejderTilknytning HashMap<String, MedarbejderTilknytning> medarbejdertilknytningliste; public MapperMedarbejderTilknytning() medarbejdertilknytningliste = 163/201
new HashMap<String, MedarbejderTilknytning>(); / Metoden tilføjer MedarbejderTilknytninger til et <tt>projekt</tt> @param projekt Et <tt>projekt</tt> @param medarbejdere En liste med <tt>medarbejder</tt>-objekter. @param kompetencer En liste med <tt>kompetence</tt>-objekter. @return projekt.getmedarbejdertilknytningliste(); Returnerer en <tt>arraylist</tt> med de <tt>medarbejdertilknytning</tt>-objekter som hører til projektet. public ArrayList<MedarbejderTilknytning> getmedarbejdertilknytningliste(projekt projekt, ArrayList<Medarbejder> medarbejdere, ArrayList<Kompetence> kompetencer) // Selection set med medarbejdertilknytninger som hører til det modtagede projekt. String SQLString1 = "SELECT ProjektID, MedarbejderID, KompetenceID, Tid " + "FROM ProjektMedarbejdere WHERE ProjektID = " + projekt.getid(); Medarbejder medarb = null; Kompetence komp = null; Connection conn = null; ResultSet rs = null; try conn = DB.getConnection(); Statement stmt = conn.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_UPDATABLE); rs = stmt.executequery(sqlstring1); int i = 0; //ResultSet løbes igennem while (rs.next()) // Den modtagede ArrayList af medarbejdere løbes igennem while (medarb == null) int medarbejderid = rs.getint(2); // Hvis en medarbejder fra ArrayListen svarer til den aktuelle medarbejder fra ResultSet sættes 'medarb' lig med denne. if (medarbejderid == medarbejdere.get(i).getid()) medarb = medarbejdere.get(i); i++; i = 0; 164/201
// Den modtagede ArrayList af kompetencer løbes igennem while (komp == null) int kompetenceid = rs.getint(3); // Hvis en kompetence fra ArrayListen svarer til den aktuelle kompetence fra ResultSet sættes 'komp' lig med denne. if (kompetenceid == kompetencer.get(i).getid()) komp = kompetencer.get(i); i++; i = 0; int tid = rs.getint(4); // Hver gang en medarbejder og en kompetence er fundet, tilføjes en MedarbejderTilknytning til det modtagede projekt. projekt.addmedarbejdertilknytning(medarb, komp, tid); medarb = null; komp = null; catch (Exception e) // Hvis noget går galt udskrives en fejlmeddelelse. System.out.println("Fejl i MapperMedarbejderTilknytning.getMedarbejderTilknytningListe " + e); finally DB.releaseConnection(conn); // Projektets liste af MedarbejderTilknytninger returneres. return projekt.getmedarbejdertilknytningliste(); /Metoden gemmer ændringer i <tt>medarbejdertilknytning</tt>-objekter til et <tt>projekt</tt> @param projekt Et Projekt @param conn En forbindelse til DB @return void public void gemaendringer(projekt projekt, Connection conn) throws Exception ResultSet rs = null; int projektid = projekt.getid(); ArrayList<MedarbejderTilknytning> mtliste = projekt.getmedarbejdertilknytningliste(); // til tjek af om et projekt er opdateret i mellemtiden String sqlstring = "SELECT ProjektID, Version FROM Projekt WHERE ProjektID = " + 165/201
projektid; Statement stmt = conn.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_UPDATABLE); rs = stmt.executequery(sqlstring); if (rs.next()) // tjekker om det er samme version if (rs.getint(2) == projekt.getversion()) // medarbejderlisten i projektet køres igennem for at finde // aendringer for (int i = 0; i < mtliste.size(); i++) MedarbejderTilknytning mt = mtliste.get(i); switch (mt.getostatus()) // Status 1 = opdater case 1: stmt.execute("update Projektmedarbejdere SET Tid = " + mt.gettid() + " WHERE ProjektID = " + projektid + " AND MedarbejderID = " + mt.getmedarbejder().getid() + " AND KompetenceID = " + mt.getkompetence().getid()); mt.setostatus(0); break; // Status 2 = slet case 2: stmt.execute("delete ProjektMedarbejdere " + " WHERE ProjektID = " + projektid + " AND MedarbejderID = " + mt.getmedarbejder().getid() + " AND KompetenceID = " + mt.getkompetence().getid()); mtliste.remove(i); i--; break; // Status 3 = ny case 3: int medarbejderid = mt.getmedarbejder().getid(); int kompetenceid = mt.getkompetence().getid(); stmt.execute("insert INTO ProjektMedarbejdere VALUES ( " + projektid + ", " + medarbejderid + ", " + kompetenceid + ", " + mt.gettid() + ")"); mt.setostatus(0); if (!medarbejdertilknytningliste.containsvalue(mt)) medarbejdertilknytningliste.put(projektid + "." + medarbejderid + "." + kompetenceid,mt); //noeglen er sammensat af: 1)ProjektID, 2).(punktum), 3) MedarbejderID, 4).(punktum), 5) KompetenceID break; 166/201
/Metoden tilknytter <tt>medarbejdertilknytning</tt>-objekter til et <tt>projekt</tt> @param p Et Projekt @param conn En forbindelse til DB @return boolean Returnerer en sandhedsvaerdi som fortaeller om operationen er lykkedes. public boolean getmedarbejdertilknytningtilprojekt(projekt p, Connection conn) PreparedStatement statement = null; ResultSet rs = null; MedarbejderTilknytning mt = null; String sqlstring = "SELECT MedarbejderID, KompetenceID, Tid FROM ProjektMedarbejdere WHERE ProjektID = " + p.getid(); try statement = conn.preparestatement(sqlstring); rs = statement.executequery(sqlstring); while (rs.next()) //noeglen er sammensat af: 1)ProjektID, 2).(punktum), 3) MedarbejderID, 4).(punktum), 5) KompetenceID String key = p.getid() + "." + rs.getint(1) + "." + rs.getint(2); mt = medarbejdertilknytningliste.get(key); if (mt == null) //Ny MedarbejderTilknytning skabes af en "dummy"-medarbejder, en "dummy"-kompetence og tid(rs.getint(3) samt ObjektStatus(0) Medarbejder dummymedarbejder = new Medarbejder(rs.getInt(1)); Kompetence dummykompetence = new Kompetence(rs.getInt(2), "", "", 0); int tid = rs.getint(3); mt = new MedarbejderTilknytning(dummyMedarbejder, dummykompetence, tid, 0); //Den nye MedarbejderTilknytning tilføjes til den lokale HashMap medarbejdertilknytningliste.put(key, mt); //Hvis projektet ikke i forevejen indeholder MedarbejderTilknytningen, tilfoejes den if (!p.getmedarbejdertilknytningliste().contains(mt)) p.addmedarbejdertilknytning(mt); 167/201
catch (SQLException e) //Hvis noget gaar galt skrives en fejlmeddelelse, og der returneres null System.out.println("Fejl i MapperMedarbejderTilknytning.getMedarbejderTilknytningTilProjekt " + e); return false; //Projektet med den tilknyttede liste af MedarbejderTilknytninger returneres return true; mapperkompetence package solutionmakers; import java.sql.connection; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import java.util.arraylist; import java.util.hashmap; / Objekt relationel mapper klasse public class MapperKompetence private HashMap<Integer, Kompetence> kompetenceliste = new HashMap<Integer, Kompetence>(); public MapperKompetence() /Metoden henter listen af kompetencer, mapper dem til objekter og gemmer dem i en <tt>arraylist</tt> som returneres. @param conn En forbindelse til databasen @return res @throws Exception public ArrayList<Kompetence> getkompetenceliste(connection conn) throws Exception 168/201
ArrayList<Kompetence> res = new ArrayList<Kompetence>(); Kompetence k = null; String SQLString = "SELECT KompetenceID, Kompetencenavn, Beskrivelse " + "FROM Kompetence"; // Selection set med kompetencer PreparedStatement statement = null; statement = conn.preparestatement(sqlstring); ResultSet rs = statement.executequery(); //ResultSet løbes igennem while (rs.next()) int kompetenceid = rs.getint(1); k = kompetenceliste.get(kompetenceid); //Hvis kompetencen ikke findes i den lokale HashMap if (k == null) String kompetencenavn = rs.getstring(2); String beskrivelse = rs.getstring(3); int objektstatus = 0; //Vigtigt: Objektets status sættes til 'uændret' //Et kompetenceobjekt skabes med værdierne fra ResultSet k = new Kompetence(kompetenceId, kompetencenavn, beskrivelse, objektstatus); //Kompetencen tilføjes til den lokale HashMap kompetenceliste.put(kompetenceid, k); //Kompetencen tilføjes til den ArrayList som skal returneres res.add(k); return res; /Metoden henter listen af kompetencer, mapper dem til objekter og, hvis muligt, returnerer et <tt>kompetence</tt>-objekt hvis navn indeholder parameteren 'kompetencenavn' @param conn En forbindelse til databasen @param kompetencenavn Navnet på den <tt>kompetence</tt> der skal findes @return k1 Et <tt>kompetence</tt>-objekt (hvis muligt - ellers returneres 'null'). @throws SQLException public Kompetence getkompetence(connection conn, String kompetencenavn) throws SQLException Kompetence k = null; 169/201
String SQLString = "SELECT KompetenceID, Kompetencenavn, Beskrivelse " + "FROM Kompetence where Kompetencenavn like '%" + kompetencenavn + "%'"; // Selection set med kompetence PreparedStatement statement = null; statement = conn.preparestatement(sqlstring); ResultSet rs = statement.executequery(); //ResultSet løbes igennem. while (rs.next()) int kompetenceid = rs.getint(1); k = kompetenceliste.get(kompetenceid); //Hvis kompetencen ikke findes i den lokale HashMap if (k == null) String kompetencenavn = rs.getstring(2); String beskrivelse = rs.getstring(3); int objektstatus = 0; //Vigtigt: Objektets status sættes til 'uændret' //Et kompetenceobjekt skabes med værdierne fra ResultSet k = new Kompetence(kompetenceId, kompetencenavn, beskrivelse, objektstatus); //Kompetencen tilføjes til den lokale HashMap kompetenceliste.put(kompetenceid, k); //Den lokale HashMap løbes igennem for (Kompetence k1: kompetenceliste.values()) //Den første kompetence hvis navn indeholder 'kompetencenavn' returneres if (k1.getnavn().contains(kompetencenavn)) return k1; //Hvis den lokale HashMap ikke indeholder en kompetence hvis navn indeholder 'kompetencenavn', returneres null return null; / Metoden tilknytter <tt>kompetence</tt>-objekter til en liste af <tt>medarbejderkompetence</tt>-objekter. @param medarbejderliste En liste med medarbejdere @param conn En forbindelse til DB @return boolean Mapning gennemfoert true/false 170/201
public boolean getkompetencetilmedarbejderkompetenceliste(arraylist<medarbejder> medarbejderliste, Connection conn) Kompetence k = null; boolean mapninggennemfoert = false; // Selection saetning til tabellen Kompetence String SQLString = "SELECT KompetenceID, Kompetencenavn, Beskrivelse " + "FROM Kompetence where kompetenceid =?"; PreparedStatement statement = null; / Til hver Medarbejder hoerer MedarbejderKompetencer, og til hver af disse hoerer én kompetence. Derfor koeres en loekke med medarbejdere, og en indre loekke med hver medarbejders MedarbejderKompetence(r). Derfor de 2 taellere nedenfor. int i = 0, j = 0; / En liste forberedes med henblik paa at indeholde MedarbejderKompetence(r) for hver medarbejder der skal have tilknyttet kompetencer til medarbejderkompetencer. ArrayList<MedarbejderKompetence> medarbejderkompetenceliste = new ArrayList<MedarbejderKompetence>(); try statement = conn.preparestatement(sqlstring); / Den ydre loekke startes og gennemloeber medarbejderlisten saa laenge der er flere. while (medarbejderliste.size() > i) //MedarbejderKompetence(r) hentes fra Medarbejder medarbejderkompetenceliste = medarbejderliste.get(i).getmedarbejderkompetenceliste(); //Fortsaet saafremt der er flere MedarbejderKompetencer while (medarbejderkompetenceliste.size() > j) //Hent id fra MedarbejderKompetence int ID = medarbejderkompetenceliste.get(j).getkompetence().getid(); //Tilfoej id til selection saetning statement.setint(1, ID); //Hent Kompetence ved hjaelp af MedarbejderKompetenceID k = kompetenceliste.get(id); //Hvis Kompetencen ikke er i HashMap, saa opret den fra rs. if (k == null) //Hent rs fra DB ResultSet rs = statement.executequery(); 171/201
//Hop til den foerste raekke i rs rs.next(); //Opret kompetence med vaerdier fra rs k = new Kompetence(rs.getInt(1), rs.getstring(2), rs.getstring(3), 0); //Tilfoej Kompetence til HashMap kompetenceliste.put(id, k); //Erstat 'dummy'-kompetencen i MedarbejderKompetencen medarbejderkompetenceliste.get(j).setkompetence(k); //Hop til naeste MedarbejderKompetence j++; //Hvis kompetencen ER i HashMap else //Erstat 'dummy'-kompetencen i MedarbejderKompetencen medarbejderkompetenceliste.get(j).setkompetence(k); //Hop til naeste MedarbejderKompetence j++; //Hop til naeste medarbejder i++; //Begynd forfra med den naeste medarbejders MedarbejderKompetence(r) j = 0; mapninggennemfoert = true; catch (SQLException e) System.out.println("Fejl i MapperKompetence.getKompetenceTilMedarbejderKompetenceListe " + e); mapninggennemfoert = false; return mapninggennemfoert; / Metoden kobler <tt>kompetence</tt> og <tt>kompetencebehov</tt> for et <tt>projekt</tt> @param p Et <tt>projekt</tt> med tilhoerende <tt>kompetencebehov</tt> @param conn @return boolean Mapning gennemfoert true/false 172/201
public boolean getkompetencetilkompetencebehov(projekt p, Connection conn) PreparedStatement statement = null; ResultSet rs = null; Kompetence k = null; ArrayList<KompetenceBehov> kompetencebehovliste = p.getkompetencebehovliste(); String sqlstring = "SELECT KompetenceNavn, Beskrivelse FROM Kompetence WHERE KompetenceID =?"; try int index = 0; while (index < kompetencebehovliste.size()) int id = kompetencebehovliste.get(index).getkompetence().getid(); k = kompetenceliste.get(id); //Hvis kompetencen ikke allerede er findes i HashMap oprettes den og laegges i HashMap samt kobler den paa kompetencebehovet if (k == null) statement.setint(1, id); statement = conn.preparestatement(sqlstring); rs = statement.executequery(sqlstring); //Hopper ind paa foerste row i resultsettet rs.next(); 'uændret' String kompetencenavn = rs.getstring(1); String beskrivelse = rs.getstring(2); int objektstatus = 0; //Vigtigt: Objektets status sættes til //Ny kompetence oprettes med vaerdier fra resultset k = new Kompetence(id, kompetencenavn, beskrivelse, objektstatus); //Den nye Kompetence tilføjes til den lokale HashMap kompetenceliste.put(id, k); //Den nye Kompetence erstatter "dummyen" i KompetenceBehov kompetencebehovliste.get(index).setkompetence(k); //Hvis kompetencen allerede findes i den lokale HashMap else //Den allerede eksisterence Kompetence erstatter "dummyen" i KompetenceBehov kompetencebehovliste.get(index).setkompetence(k); //Der hoppes videre til den naeste Kompetence index++; 173/201
catch (SQLException e) //Hvis noget gaar galt skrives en fejlmeddelelse, og der returneres null System.out.println("Fejl i MapperKompetence.getKompetenceTilKompetenceBehov " + e); return false; return true; / Metoden mapper en <tt>medarbejdertilknytning</tt> til et <tt>projekt</tt> @param p Et <tt>projekt</tt> @param conn @return boolean Mapning gennemfoert true/false public boolean getkompetencetilmedarbejdertilknytning(projekt p, Connection conn) PreparedStatement statement = null; ResultSet rs = null; Kompetence k = null; ArrayList<MedarbejderTilknytning> medarbejdertilknytningliste = p.getmedarbejdertilknytningliste(); String sqlstring = "SELECT KompetenceNavn, Beskrivelse FROM Kompetence WHERE KompetenceID =?"; try int index = 0; while (index < medarbejdertilknytningliste.size()) int id = medarbejdertilknytningliste.get(index).getkompetence().getid(); k = kompetenceliste.get(id); //Hvis Kompetencen ikke allerede findes i den lokale HashMap, oprettes den og laegges i HashMap samt kobles paa MedarbejderTilknytningen if (k == null) statement.setint(1, id); statement = conn.preparestatement(sqlstring); rs = statement.executequery(sqlstring); 'uændret' //Hopper ind paa foerste row i resultsettet rs.next(); String kompetencenavn = rs.getstring(1); String beskrivelse = rs.getstring(2); int objektstatus = 0; //Vigtigt: Objektets status sættes til 174/201
//Ny Kompetence oprettes med vaerdierne fra resultset k = new Kompetence(id, kompetencenavn, beskrivelse, objektstatus); //Den nye Kompetence tilføjes til den lokale HashMap kompetenceliste.put(id, k); //Den nye Kompetence erstatter "dummyen" i MedarbejderTilknytning medarbejdertilknytningliste.get(index).setkompetence(k); //Hvis Kompetencen allerede findes i HashMap else //Den allerede eksisterence medarbejder erstatter "dummyen" i MedarbejderTilknytning medarbejdertilknytningliste.get(index).setkompetence(k); //Der hoppes videre til den naeste Kompetence index++; catch (SQLException e) //Hvis noget gaar galt skrives en fejlmeddelelse, og der returneres false System.out.println("Fejl i MapperKompetence.getKompetenceTilMedarbejderTilknytning " + e); return false; //Projektet har faaet tilknyttet de relevante kompetencer til MedarbejderTilknytningerne, og der returneres true return true; mappermedarbejder package solutionmakers; import java.sql.connection; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.util.arraylist; import java.util.hashmap; / Objekt relationel mapper klasse public class MapperMedarbejder 175/201
private HashMap<Integer, Medarbejder> medarbejderliste = new HashMap<Integer, Medarbejder>(); public MapperMedarbejder() /Metoden henter listen af medarbejdere, mapper dem til objekter og gemmer dem i en arrayliste. @param k @param conn @return @throws Exception public boolean getmedarbejderliste(kompetence k, Connection conn) throws Exception // Initialisere variable ArrayList<Medarbejder> res = new ArrayList<Medarbejder>(); Medarbejder medarbejder = null; " + + // Selection set med medarbejdere String SQLString = "SELECT m.medarbejderid, m.medarbejdernavn, m.telefonnummer, m.mobil, "m.medarbejderstatus, m.ledighedsgrad, m.note, m.lokation, m.version " "FROM Medarbejder m"; // Er der en kompetence og er objektet tildelt et navn // tilfoejes følgende til SQL forespoergslen if (k!= null &&!k.getnavn().equals("")) SQLString += ", MedarbejderKompetencer mk, Kompetence k WHERE mk.medarbejderid = m.medarbejderid AND mk.kompetenceid = k.kompetenceid AND k.kompetencenavn = '" + k.getnavn() + "'"; // Uanset hvad tilfoejes foelgende SQLString += " ORDER BY MedarbejderId"; PreparedStatement statement = null; statement = conn.preparestatement(sqlstring); ResultSet rs = statement.executequery(); // For hver tupel i resultat saettet oprettes en medarbejder while (rs.next()) medarbejder = medarbejderliste.get(rs.getint(1)); if (medarbejder == null) medarbejder = new Medarbejder(rs.getInt(1), rs.getstring(2), rs.getstring(3), 176/201
rs.getstring(5), rs.getint(6), 0); medarbejderliste.put(rs.getint(1), medarbejder); res.add(medarbejder); // Returvaerdien er afgjort af stoerrelsen paa res listen if (res.size() > 0) return true; else return false; / Metoden henter alle <tt>medarbejder</tt>-objekter @param conn En forbindelse til DB @return res Returnerer alle medarbejder-objekter i en <tt>arraylist</tt> public ArrayList<Medarbejder> getmedarbejderliste(connection conn) throws Exception // Initialiser variable ArrayList<Medarbejder> res = new ArrayList<Medarbejder>(); Medarbejder medarbejder = null; " + + // Selection saetning til medarbejdertabellen i DB String SQLString = "SELECT m.medarbejderid, m.medarbejdernavn, m.telefonnummer, m.mobil, "m.medarbejderstatus, m.ledighedsgrad, m.note, m.lokation, m.version " "FROM Medarbejder m ORDER BY MedarbejderId"; PreparedStatement statement = null; statement = conn.preparestatement(sqlstring); // Resultset indlaeses ResultSet rs = statement.executequery(); // Gennemgang af resultset(rs) med sammenligning af lokal HashMap while (rs.next()) // Hent id fra rs og den tilhoerende medarbejder i HashMap medarbejder = medarbejderliste.get(rs.getint(1)); //Hvis medarbejderen ikke er i HashMap, saa dan medarbejder fra rs if (medarbejder == null) medarbejder = new Medarbejder(rs.getInt(1), rs.getstring(2), rs.getstring(3), rs.getstring(5), rs.getint(6), 0); //Tilfoej medarbejder til HashMap medarbejderliste.put(rs.getint(1), medarbejder); //Tilfoej medarbejder fra enten HashMap el. rs til resultat 177/201
res.add(medarbejder); //Returnér de samlede medarbejdere return res; / Metoden tilknytter <tt>medarbejder</tt>-objekter til <tt>medarbejdertilknytning</tt>-objekter @param p Et Projekt @param conn En forbindelse til DB @return boolean Returnerer en sandhedsvaerdi som fortaeller om operationen er lykkedes. public boolean getmedarbejdertilmedarbejdertilknytning(projekt p, Connection conn) // Initialiser variable PreparedStatement statement = null; ResultSet rs = null; Medarbejder m = null; ArrayList<MedarbejderTilknytning> medarbejdertilknytningliste = p.getmedarbejdertilknytningliste(); // Forbereder SQL forespoergsel String sqlstring = "SELECT MedarbejderNavn, Telefonnummer, Mobil, MedarbejderStatus, Ledighedsgrad, Note, Lokation FROM Medarbejder WHERE MedarbejderID =?"; try int index = 0; // For alle medarbejdere i projektet while (index < medarbejdertilknytningliste.size()) int id = medarbejdertilknytningliste.get(index).getmedarbejder().getid(); m = medarbejderliste.get(id); //Hvis Medarbejderen ikke allerede er findes i HashMap oprettes den og laegges i HashMap samt kobler den paa MedarbejderTilknytningen if (m == null) statement.setint(1, id); statement = conn.preparestatement(sqlstring); rs = statement.executequery(sqlstring); //Hopper ind paa foerste row i resultsettet rs.next(); //Ny Medarbejder oprettes med vaerdier fra resultset m = new Medarbejder(id, rs.getstring(1), rs.getstring(2), rs.getstring(3), rs.getint(4), 0); 178/201
//Den nye Medarbejder tilføjes til den lokale HashMap medarbejderliste.put(id, m); //Den nye Medarbejder erstatter "dummyen" i MedarbejderTilknytning medarbejdertilknytningliste.get(index).setmedarbejder(m); //Hvis Medarbejderen allerede findes i HashMap else //Den allerede eksisterence medarbejder erstatter "dummyen" i MedarbejderTilknytning medarbejdertilknytningliste.get(index).setmedarbejder(m); //Der hoppes videre til den naeste Medarbejder index++; catch (SQLException e) //Hvis noget gaar galt skrives en fejlmeddelelse, og der returneres null System.out.println("Fejl i MapperMedarbejder.getMedarbejderTilMedarbejderTilknytning " + e); return false; //Projektet med de tilknyttede MedarbejderTilknytninger og Medarbejdere, returneres return true; / Metoden tilknytter <tt>medarbejder</tt>-objektet(projektleder) til <tt>projekt</tt>-objekter @param p Et Projekt @param conn En forbindelse til DB @return boolean Returnerer en sandhedsvaerdi som fortaeller om operationen er lykkedes. public boolean getprojektledertilprojekt(projekt p, Connection conn) // Intialiser variable PreparedStatement statement = null; ResultSet rs = null; Medarbejder m = p.getprojektleder(); // Medmindre der er ikke er en projektleder if (m!= null) // forberedes en forespørgsel String sqlstring = "SELECT MedarbejderNavn, Telefonnummer, Mobil, MedarbejderStatus, Ledighedsgrad, Note, Lokation FROM Medarbejder WHERE MedarbejderID = " + m.getid(); 179/201
try // Henter fra hashmap m = medarbejderliste.get(m.getid()); //Hvis Medarbejderen ikke allerede er findes i HashMap oprettes den og laegges i HashMap samt kobler den paa projektet if (m == null) statement = conn.preparestatement(sqlstring); rs = statement.executequery(sqlstring); //Hopper ind paa foerste row i resultsettet if (rs.next()) //Ny Medarbejder oprettes med vaerdier fra resultset m = new Medarbejder(p.getProjektleder().getId(), rs.getstring(1), rs.getstring(2), rs.getstring(3), rs.getint(4), 0); //Den nye Medarbejder tilføjes til den lokale HashMap medarbejderliste.put(m.getid(), m); //Den nye Medarbejder erstatter "dummyen" i projektet p.setprojektleder(m); //Hvis Medarbejderen allerede findes i HashMap else //Den allerede eksisterence medarbejder erstatter "dummyen" i Projektet p.setprojektleder(m); catch (SQLException e) //Hvis noget gaar galt skrives en fejlmeddelelse, og der returneres null System.out.println("Fejl i MapperMedarbejder.getProjektlederTilProjekt " + e); return false; //Projektet med den nye projektleder, returneres return true; /Metoden gemmer ændringer i <tt>medarbejder</tt>-objekter til et <tt>projekt</tt> @param projekt Et Projekt @param conn En forbindelse til DB 180/201
@return void public void gemaendringer(projekt projekt, Connection conn) throws Exception // Initialiser variable ResultSet rs = null; int projektid = projekt.getid(); //Liste til medarbejdere ArrayList<Medarbejder> mliste = new ArrayList<Medarbejder>(); //Hent de medarbejdere, som indeholder ændrede data : ostatus = 1 for (int i = 0; i < medarbejderliste.size(); i++) Medarbejder m = medarbejderliste.get(i); // Hvis ostatus = 1 tilføjes til mliste if (m!= null && m.getostatus() == 1) mliste.add(m); // til tjek af om et projekt er opdateret i mellemtiden String sqlstring = "SELECT ProjektID, Version FROM Projekt WHERE ProjektID = " + projektid; Statement stmt = conn.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_UPDATABLE); rs = stmt.executequery(sqlstring); if (rs.next()) // tjekker om det er samme version if (rs.getint(2) == projekt.getversion()) // medarbejderlisten køres igennem for (int i = 0; i < mliste.size(); i++) //Hver medarbejder i listen hentes Medarbejder m = mliste.get(i); // en forespørgsel løbes igennem stmt.execute("update medarbejder SET Ledighedsgrad = " + m.getledigtid() + " WHERE MedarbejderID = " + m.getid()); // og status nulstilles m.setostatus(0); mappermedarbejderkompetence package solutionmakers; import java.sql.connection; 181/201
import java.sql.preparedstatement; import java.sql.resultset; import java.util.arraylist; import java.util.hashmap; / Objekt relationel mapper klasse public class MapperMedarbejderKompetence = private HashMap<String, MedarbejderKompetence> medarbejderkompetenceliste new HashMap<String, MedarbejderKompetence>(); public MapperMedarbejderKompetence() / Metoden tilknytter <tt>medarbejderkompetence</tt>-objekter til en liste af <tt>medarbejder</tt>-objekter. @param ArrayList<Medarbejder> En liste med medarbejdere @param Connection En forbindelse til DB @return ArrayList<Medarbejder> Returnerer alle medarbejderobjekter i en <tt>arraylist</tt>, med tilknyttede <tt>medarbejderkompetence </tt>-objekter. public boolean getmedarbejderkompetencetilmedarbejderliste(arraylist<medarbejder> medarbejderliste, Connection conn) MedarbejderKompetence medarbejderkompetence = null; // Selection saetning til tabellen MedarbejderKompetencer String SQLString = "SELECT KompetenceID, Prioritet, Niveau FROM MedarbejderKompetencer WHERE MedarbejderID =?"; PreparedStatement statement = null; try statement = conn.preparestatement(sqlstring); ResultSet rs = null; / En loekke startes med henblik paa at gennemloebe hver medarbejder og koble denne med medarbejderkompetencer enten fra den lokale HashMap el. fra DB. for (int i = 0; i < medarbejderliste.size(); i++) 182/201
//Medarbejders id kobles på saetningen til DB statement.setint(1, medarbejderliste.get(i).getid()); / Der dannes et resultset(rs) med det nuvaerende medarbejderobjekts MedarbejderKompetencer. rs = statement.executequery(); / rs gennemloebes og hvis MedarbejderKompetencen ikke er i den lokale HashMap, dannes denne fra rs. while (rs.next()) //Hent MedarbejderKompetence ved hjaelp af MedarbejderID medarbejderkompetence = medarbejderkompetenceliste.get(medarbejderliste.get(i).getid() + "." + rs.getint(1)); / Hvis MedarbejderKompetencen ikke er i HashMap, saa opret den fra rs. Bemaerk : Der oprettes en 'dummy' med kompetenceid! if (medarbejderkompetence == null) //Ny MedarbejderKompetence skabes af en "dummy"-kompetence, en prioritering, et niveau samt ObjektStatus(0) Kompetence dummykompetence = new Kompetence(rs.getInt(1), "", "", 0); int prioritering = rs.getint(2); int niveau = rs.getint(3); medarbejderkompetence = new MedarbejderKompetence(dummyKompetence, prioritering, niveau, 0); //Tilfoej MedarbejderKompetence til HashMap medarbejderkompetenceliste.put(medarbejderliste.get(i).getid() + "." + rs.getint(1), medarbejderkompetence); //Tilfoej MedarbejderKompetence til Medarbejder medarbejderliste.get(i).addmedarbejderkompetence(medarbejderkompetence); catch (Exception e) // I tilfaelde af fejl returneres følgende System.out.println("Fejl i MapperMedarbejderKompetence.getMedarbejderKompetenceTilMedarbejderListe " + e); return false; //Returnér medarbejderlisten med de tilknyttede medarbejderkompetencer return true; 183/201
mapperkunde package solutionmakers; import java.sql.connection; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import java.util.arraylist; import java.util.hashmap; / Objekt relationel mapper klasse public class MapperKunde private HashMap<Integer, Kunde> kundeliste = new HashMap<Integer, Kunde>(); public MapperKunde() / Metoden henter listen af kunder, mapper dem til objekter og gemmer dem i <tt>arraylist</tt> af <tt>kunde</tt>-objekter. @param conn En forbindelse til DB @return getkundeliste Returnerer alle <tt>kunde</tt>-objekter i en <tt>arraylist</tt>. public ArrayList<Kunde> getkundeliste(connection conn) throws Exception ArrayList<Kunde> res = new ArrayList<Kunde>(); Kunde kunde = null; //Selection set med kunder og bynavne String SQLString1 = "SELECT KundeID, Virksomhedsnavn, Adresse, k.postnr, Bynavn, " + "Telefonnummer, Email, Kundesegment, Note, Version " + "FROM Kunde k, PostnrBy p where k.postnr = p.postnr ORDER BY KundeID"; PreparedStatement statement = null; conn = DB.getConnection(); statement = conn.preparestatement(sqlstring1); ResultSet rs = statement.executequery(); while (rs.next()) kunde = kundeliste.get(rs.getint(1)); //Hvis kunden ikke findes i den lokale HashMap, oprettes den og laegges i HashMap. if (kunde == null) //Værdierne fra resultset: 184/201
'uændret' int kundeid = rs.getint(1); String virksomhedsnavn = rs.getstring(2); String adresse = rs.getstring(3); int postnr = rs.getint(4); String bynavn = rs.getstring(5); PostnrBy postnrby = new PostnrBy(postnr, bynavn); String telefonnummer = rs.getstring(6); String email = rs.getstring(7); String kundesegment = rs.getstring(8); String note = rs.getstring(9); int objektstatus = 0; //Vigtigt: Objektets status sættes til //Et kunde-objekt oprettes med værdierne fra resultset kunde = new Kunde(kundeId, virksomhedsnavn, adresse, postnrby, telefonnummer, email, kundesegment, note, objektstatus); //Kundeobjektet gemmes i den lokale HashMap kundeliste.put(rs.getint(1), kunde); //Kunden tilføjes den ArrayList som skal returneres res.add(kunde); return res; / Metoden tilknytter et <tt>kunde</tt>-objekt til et <tt>projekt</tt>objekt. @param p Et Projekt @param conn En forbindelse til DB @return boolean Returnerer en sandhedsvaerdi som fortaeller om operationen er lykkedes. public boolean getkundetilprojekt(projekt p, Connection conn) throws SQLException PreparedStatement statement = null; ResultSet rs = null; Kunde k = null; String sqlstring = "SELECT Virksomhedsnavn, Adresse, Postnr, Telefonnummer, Email, Kundesegment, Note FROM Kunde WHERE KundeID =?"; try int id = p.getkunde().getid(); k = kundeliste.get(id); //Hvis Kunden ikke allerede findes i HashMap, oprettes den og laegges i HashMap samt kobler den paa ProjektetMedarbejderTilknytningen if (k == null) 185/201
statement.setint(1, id); statement = conn.preparestatement(sqlstring); rs = statement.executequery(sqlstring); //Hopper ind paa foerste row i resultsettet rs.next(); 'uændret' //Værdierne fra resultset: String virksomhedsnavn = rs.getstring(1); String adresse = rs.getstring(2); int postnr = rs.getint(3); PostnrBy dummypostnrby = new PostnrBy(postnr, ""); String telefonnummer = rs.getstring(4); String email = rs.getstring(5); String kundesegment = rs.getstring(6); String note = rs.getstring(7); int objektstatus = 0; //Vigtigt: Objektets status sættes til //Ny Kunde oprettes med vaerdier fra resultset k = new Kunde(id, virksomhedsnavn, adresse, dummypostnrby, telefonnummer, email, kundesegment, note, objektstatus); //Den nye Kunde tilføjes til den lokale HashMap kundeliste.put(id, k); //Den nye Kunde erstatter "dummyen" i Projektet p.setkunde(k); //Hvis Kunden allerede findes i HashMap else //Den allerede eksisterence Kunde erstatter "dummyen" i Projektet p.setkunde(k); catch (SQLException e) //Hvis noget gaar galt skrives en fejlmeddelelse, og der returneres false System.out.println("Fejl i MapperKunde.getKundeTilProjekt " + e); return false; //Projektet har faaet tilknyttet den relevante Kunde, og der returneres true return true; MapperPostnrBy package solutionmakers; import java.sql.connection; 186/201
import java.sql.preparedstatement; import java.sql.resultset; import java.util.arraylist; import java.util.hashmap; import java.util.list; / Objekt relationel mapper klasse public class MapperPostnrBy private HashMap<Integer, PostnrBy> postnrbyliste = new HashMap<Integer, PostnrBy>(); public MapperPostnrBy() / Metoden henter listen af postnumrer, mapper dem til objekter og gemmer dem i en arrayliste. @param postnrby @return ArrayList<PostnrBy> Returnerer alle PostnrBy-objekter i en <tt>arraylist</tt>. public ArrayList<PostnrBy> getpostnrbyliste(list<postnrby> postnrby) // Initialiser variable ArrayList<PostnrBy> res = new ArrayList<PostnrBy>(); PostnrBy post = null; // Forbereder forespørgsel String SQLString = "SELECT Postnr, Bynavn FROM PostnrBy WHERE Postnr =? ORDER BY Postnr"; // Selection set med postnumrer // Initialiser forbindelse Connection conn = null; PreparedStatement statement = null; try conn = DB.getConnection(); statement = conn.preparestatement(sqlstring); ResultSet rs = null; // Kører hele listen af postnumrer igennem for (int i = 0; i < postnrby.size(); i++) post = postnrbyliste.get(postnrby.get(i).getpostnr()); if (post == null) // Henter alle informationer statement.setint(1, postnrby.get(i).getpostnr()); rs = statement.executequery(); 187/201
if (rs.next()) // Indlæser til et nyt objekt post = new PostnrBy(rs.getInt(1), rs.getstring(2)); // og putter i hashmap postnrbyliste.put(rs.getint(1), post); // og putter i arraylist res.add(post); catch (Exception e) // Ved fejl System.out.println("Fejl i MapperPostnrBy.getProjekter " + e); finally DB.releaseConnection(conn); // Returnerer listen return res; 188/201
Databasen Relationer, feltnavne og constraints Det har været et krav fra projektets start, at data skulle gemmes i en Oracle database. Som det er vist på diagrammerne i Construction rapporten, er vi nået frem til løsning med 8 relationer. Behovet for 8 relationer udgøres dels af de 4 primære entiteter; Kunde, Projekt, Kompetence og Medarbejder. Derudover har det været nødvendigt at løse mange til mange relationerne, især den tertiære mellem Projekt, Medarbejder og Kompetence, ved at tilføje 3 relationer; ProjektKompetencer, MedarbejderKompetencer og ProjektMedarbejdere. Den sidste relation er medtaget for at undgå redundans i angivelsen af postdistrikter. Det drejer sig om relationen PostnrBy. Redundans vil forekomme da bynavne er transitivt afhængige af kundens id, via postnummeret (3. normalform). Af tabellerne herunder fremgår det hvilke beslutningerne der er taget i forhold til erklæringen af de enkelte relationer og hvilke data der gemmes. I kommentar feltet er der uddybende kommentarer til det enkelte felt i databasen. Her står der enten hvad det er for en information der gemmes, hvor der refereres til i forbindelse med fremmednøgler, eller om værdien for et ID generes af den sequence der refereres til på anden række af tabellerne. Relationerne nævnes i den rækkefølge, som de oprettes jf. scriptet i filen create.sql. Filen finder du på vedlagte cd/dvd, men der er også en udskrift af indholdet af filen, herunder. Relation: PostnrBy Sequence: Ingen Felt Datatype Constraints Constraint Kommentar Navn Postnr NUMBER(4) Primær nøgle pk_postnrby_postnr Bynavn VARCHAR(25) Not null nn_postnrby_bynavn Relationen PostnrBy, består af felterne Postnr og by. Relationen er simpel og holder udelukkende postnumrene sammen med de enkelte områder. Formålet med relationen er at undgå redundans i angivelsen af postdistrikter, i Kunde relationen. 189/201
Relation: Kunde Sequence: kundeseq (Starter med 1) Felt Datatype Constraints Constraint Kommentar KundeID NUMBER(6) Primær nøgle Navn pk_kunde_id Autonummereret Virksomhedsnavn VARCHAR2(30) Not null nn_kunde_navn Adresse VARCHAR2(50) Postnr NUMBER(4) Fremmed nøgle fk_kunde_postnr Ref. til PostnrBy relationen Telefonnummer Email VARCHAR2(20) VARCHAR2(40) Kundesegment VARCHAR2(20) Angivelse som ligger til grund for prioriteringen af assistenter/konsulenter på projekter for den pågældende kunde. Note VARCHAR2(4000) Version NUMBER(6) Anvendes af systemet som sikkerhed mod samtidighedskonflikter Alle stamdata for Solution Makers A/S kunder, gemmes i relationen Kunde. En af de vigtige informationen i relationen, gemmes i feltet Kundesegment. Det er den værdi der afgør hvordan sammensætningen af en projektgruppe kan se ud og dermed fortæller hvor stor en medarbejderudvikling der kan stiles imod. 190/201
Relation: Medarbejder Sequence: medarbejderseq (Starter med 1) Felt Datatype Constraints Constraint Kommentar MedarbejderID NUMBER(4) Primær nøgle navn pk_medarbejder_ ID Autonummereret Medarbejdernavn VARCHAR2(40) Not null nn_medarbejder_ navn Telefonnummer Mobil VARCHAR2(20) VARCHAR2(20) MedarbejderStatus VARCHAR2(20) Ledighedsgrad NUMBER(1) Not null nn_medarbejder_ ledighedsgrad Angiver om medarbejderen stadig er ansat Angiver hvor stor en del af indeværende år, medarbejderen er ledig. Angivelsen er i x/8 dele. Note VARCHAR2(4000) Lokation VARCHAR2(20) Hvor i virksomheden medarbejderen er ansat Version NUMBER(6) Anvendes af systemet som sikkerhed mod samtidighedskonflikter Relationen Medarbejder indeholder stamdata for alle de medarbejdere der kan rådes over, når der skal sammensættes en projektgruppe. Feltet Ledighedsgrad fortæller hvor meget ledig tid en medarbejder har. Tiden angives som x/8 dele. Af hensyn til historik, slettes en medarbejder ikke, når han/hun ikke længere er i virksomheden. Man ændrer blot medarbejderens status. Det er denne status der gemmes i feltet MedarbejderStatus. 191/201
Relation: Projekt Sequence: projektseq (Starter med 1) Felt Datatype Constraint s ProjektID NUMBER(4) Primær nøgle Constraint Navn pk_projekt_id Kommentar Autonummereret Projektnavn VARCHAR2(50) Not null nn_projekt_navn Titlen på projektet ProjektStatus VARCHAR2(50) Angiver om projektet er Planlagt, Igangværende, Afvist eller Afsluttet ProjektKontakt VARCHAR2(50) Navn på kundens kontakt ProjektKontaktTl f Note VARCHAR2(20) VARCHAR2(4000 ) Aarstal NUMBER(4) Hvilket år projektet er planlagt til at blve gennemført i KundeID NUMBER(6) Fremmed nøgle, Not null ProjektlederID NUMBER(4) Fremmed nøgle fk_projekt_kunde nn_projekt_kunde fk_projekt_projektlede r Ref. til Kunde Ref. til Medarbejder Alle stamdata for et projekt gemmes i relationen Projekt. Deriblandt er der reference til kunden og til den af medarbejderne, der er projektleder. Projektets status gemmes også i denne relation. Relation: Kompetence Sequence: kompetenceseq (Starter med 1) 192/201
Felt Datatype Constraints Constraint Kommentar KompetenceID NUMBER(4) Primær nøgle Navn pk_kompetence_id Autonummereret Kompetencenavn VARCHAR2(30) Not null nn_kompetence_navn Titlen på kompetencen Beskrivelse VARCHAR2(255) Beskrivelse af kompetencen Alle de kompetencer, der er oprettet i systemet, gemmes i relationen Kompetence. Der er også mulighed for at tilknytte en beskrivelse til den enkelte kompetence. 193/201
Relation: MedarbejderKompetencer Sequence: Ingen Felt Datatype Constraints Constraint Kommentar Navn MedarbejderID NUMBER(4) Primær nøgle, fremmed nøgle pk_medarbkomp fk_medarbkomp_ Medarbejder Ref. til Medarbejder KompetenceID NUMBER(4) Primær nøgle, fremmed nøgle pk_medarbkomp fk_medarbkomp_ Kompetence Ref. til Kompetence Prioritet NUMBER(2) Angiver hvor højt medarbejderen ønsker kompetencen prioriteret Niveau NUMBER(2) Angiver på hvilket niveau medarbejderen bestrider kompetencen. 7 og derover, er medarbejderen konsulent. I relationen MedarbejderKompetencer gemmes referencerne mellem medarbejderne og de kompetencer de besidder. For hver kompetence kan man angive medarbejderens prioritering af den enkelte kompetence og hvor kompetent medarbejderen er, dvs. hvilket niveau medarbejderen er på. 194/201
Relation: ProjektKompetencer Sequence: Ingen Felt Datatype Constraints Constraint Kommentar ProjektID NUMBER(6) Primær nøgle, fremmed nøgle Navn pk_projkomp fk_projkomp_ Projekt Ref. til Projekt KompetenceID NUMBER(4) Primær nøgle, fremmed nøgle pk_projkomp fk_projkomp_ Kompetence Ref. til Kompetence Behov NUMBER(3) Not null nn_projkomp_behov Angiver hvor stort behovet for en kompetence vurderes til at være. I relationen ProjektKompetencer finder man de kompetencer og det tidsbehov, der er for den enkelte kompetence, på det enkelte projekt. Tidsbehovet angives som x/8 dele. 195/201
Relation: ProjektMedarbejdere Sequence: Ingen Felt Datatype Constraints Constraint Kommentar ProjektID NUMBER(6) Primær nøgle, fremmed nøgle MedarbejderID NUMBER(4) Primær nøgle, fremmed nøgle KompetenceID NUMBER(4) Primær nøgle, fremmed nøgle Navn pk_projmedarbejder fk_projmedarbejder_ Projekt pk_projmedarbejder fk_projmedarbejder_ Medarbejder pk_projmedarbejder fk_projmedarbejder_ Kompetence Ref. til Projekt Ref. til Medarbejder Ref. til Kompetence Tid NUMBER(1) Not null nn_projmedarbejder_ tid Angiver hvor meget tid den enkelte medarbejder har sat af til projektet. Angivelsen er i x/8 dele Relationen ProjektMedarbejdere indeholder data for hvilke medarbejdere der er tilknyttet de enkelte projekter, men også med hvilken kompetence de gør det med og hvor meget tid, der sat af for medarbejderen. Der er simpelthen en tertiær relation mellem Projekt, Medarbejder og Kompetence relationerne. 196/201
Opret tabeller Script --------------------------------------------------------------- -- Solution Makers A/S; Create Tables Script -- Elaboration -- by Gruppe 1 TR07DAT2 -- Login: GR1TR07D2 KODE: GR1TR07D2 --------------------------------------------------------------- drop table PostnrBy cascade constraints; CREATE TABLE PostnrBy ( Postnr NUMBER(4), Bynavn VARCHAR(25) CONSTRAINT nn_postnrby_bynavn NOT NULL, CONSTRAINT pk_postnrby_postnr PRIMARY KEY (Postnr) ); drop sequence kundeseq; create sequence kundeseq start with 1; drop table Kunde cascade constraints; CREATE TABLE Kunde ( KundeID NUMBER(6), Virksomhedsnavn VARCHAR2(30) CONSTRAINT nn_kunde_navn NOT NULL, Adresse VARCHAR2(50), Postnr NUMBER(4), Telefonnummer VARCHAR2(20), Email VARCHAR2(40), Kundesegment VARCHAR2(20), Note VARCHAR2(4000), Version NUMBER(6), CONSTRAINT pk_kunde_id PRIMARY KEY (KundeID), CONSTRAINT fk_kunde_postnr FOREIGN KEY (Postnr) REFERENCES PostnrBy (Postnr) ); drop sequence medarbejderseq; create sequence medarbejderseq start with 1; drop table Medarbejder cascade constraints; CREATE TABLE Medarbejder ( MedarbejderID NUMBER(4), MedarbejderNavn VARCHAR2(40) CONSTRAINT nn_medarbejder_navn NOT NULL, Telefonnummer VARCHAR2(20), Mobil VARCHAR2(20), MedarbejderStatus VARCHAR2(20), Ledighedsgrad NUMBER(1) CONSTRAINT nn_medarbejder_ledighedsgrad NOT NULL, Note VARCHAR2(4000), Lokation VARCHAR2(20), Version NUMBER(6), CONSTRAINT pk_medarbejder_id PRIMARY KEY (MedarbejderID) ); drop sequence projektseq; 197/201
create sequence projektseq start with 1; drop table Projekt cascade constraints; CREATE TABLE Projekt ( ProjektID NUMBER(6), Projektnavn VARCHAR2(50) CONSTRAINT nn_projekt_navn NOT NULL, ProjektStatus VARCHAR2(50), ProjektKontakt VARCHAR2(50), ProjektKontaktTlf VARCHAR2(20), Note VARCHAR2(4000), Aarstal Number(4), KundeID NUMBER(6) CONSTRAINT nn_projekt_kunde NOT NULL, ProjektlederID NUMBER(4), Version NUMBER(6), CONSTRAINT pk_projekt_id PRIMARY KEY (ProjektID), CONSTRAINT fk_projekt_kunde FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID), CONSTRAINT fk_projekt_projektleder FOREIGN KEY (ProjektlederID) REFERENCES Medarbejder (MedarbejderID) ); drop sequence kompetenceseq; create sequence kompetenceseq start with 1; drop table Kompetence cascade constraints; CREATE TABLE Kompetence ( KompetenceID NUMBER(4), Kompetencenavn VARCHAR2(30) CONSTRAINT nn_kompetence_navn NOT NULL, Beskrivelse VARCHAR2(255), CONSTRAINT pk_kompetence_id PRIMARY KEY (KompetenceID) ); drop table MedarbejderKompetencer cascade constraints; CREATE TABLE MedarbejderKompetencer ( MedarbejderID NUMBER(4), KompetenceID Number(4), Prioritet Number(2), Niveau Number(2), CONSTRAINT pk_medarbkomp PRIMARY KEY (MedarbejderID,KompetenceID), CONSTRAINT fk_medarbkomp_medarbejder FOREIGN KEY (MedarbejderID) REFERENCES Medarbejder (MedarbejderID), CONSTRAINT fk_medarbkomp_kompetence FOREIGN KEY (KompetenceID) REFERENCES Kompetence (KompetenceID) ); drop table ProjektKompetencer cascade constraints; CREATE TABLE ProjektKompetencer ( ProjektID NUMBER(6), KompetenceID Number(4), Behov Number(3) CONSTRAINT nn_projkomp_behov NOT NULL, CONSTRAINT pk_projkomp PRIMARY KEY (ProjektID,KompetenceID), CONSTRAINT fk_projkomp_projekt FOREIGN KEY (ProjektID) REFERENCES Projekt (ProjektID), 198/201
CONSTRAINT fk_projkomp_kompetence FOREIGN KEY (KompetenceID) REFERENCES Kompetence (KompetenceID) ); drop table ProjektMedarbejdere cascade constraints; CREATE TABLE ProjektMedarbejdere ( ProjektID NUMBER(6), MedarbejderID NUMBER(4), KompetenceID Number(4), Tid Number(1) CONSTRAINT nn_projmedarbejder_tid NOT NULL, CONSTRAINT pk_projmedarbejder PRIMARY KEY (ProjektID,MedarbejderID,KompetenceID), CONSTRAINT fk_projmedarbejder_projekjt FOREIGN KEY (ProjektID) REFERENCES Projekt (ProjektID), CONSTRAINT fk_projmedarbejder_medarbejder FOREIGN KEY (MedarbejderID) REFERENCES Medarbejder (MedarbejderID), CONSTRAINT fk_projmedarbejder_kompetence FOREIGN KEY (KompetenceID) REFERENCES Kompetence (KompetenceID) ); commit; Indsæt data Script --------------------------------------------------------------- -- Solution Makers A/S; Insert data Script -- Elaboration -- by Gruppe 1 TR07DAT2 -- Login: GR1TR07D2 KODE: GR1TR07D2 --------------------------------------------------------------- INSERT INTO PostnrBy VALUES (2500,'Valby'); INSERT INTO PostnrBy VALUES (2450,'København SV.'); INSERT INTO PostnrBy VALUES (2600,'Glostrup'); INSERT INTO PostnrBy VALUES (2620,'Albertslund'); INSERT INTO Kunde VALUES (kundeseq.nextval, 'Palles Vinhandel', 'Valby Langgade 123', 2500, '+45 12 34 56 78', 'palle@vinhandel.dk', 'Ny mindre kunde','lukket hver mandag',0); INSERT INTO Kunde VALUES (kundeseq.nextval, 'Henriks stoffer', 'Kanalens kvarter 213', 2620, '+45 22 34 56 78', 'Henrik@stoffer.dk', 'Ny mindre kunde','ikke narko',0); INSERT INTO Kunde VALUES (kundeseq.nextval, 'Michaels Spøg og skæmt', 'Borgbjergvej 4', 2450, '+45 32 34 56 78', 'Michael@forsjov.dk', 'Ny stor kunde','et godt sted at få et billigt grin',0); INSERT INTO Kunde VALUES (kundeseq.nextval, 'DyneLars', 'Hovedgaden 12', 2600, '+45 42 34 56 78', 'Lars@bedworld.dk', 'Gammel stor kunde','træffes bedst før 08.00',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Jacob Henriksen', '+45 12 34 56 78', '+45 20635205', 'Ansat', 1, 'Overvejer fyring','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Dan Buhr', '+45 22 34 56 78', '+45 21435204', 'Ansat', 4, 'Overvejer forfremmelse','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Nick Niebling', '+45 22 34 66 78', '+45 21635203', 'Ansat', 6, 'Overvejer fyring','',0); 199/201
INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Casper Cederberg', '+45 26 34 66 78', '+45 21635202', 'Ansat', 5, '','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Nicolaj Roos', '+45 36 34 56 78', '+45 21635201', 'Ansat', 8, 'Ny mand i virksomheden','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Lars Larsen', '+45 12 34 56 78', '+45 20635205', 'Ansat', 1, 'Overvejer fyring','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Kent Kor', '+45 22 34 56 78', '+45 21435204', 'Ansat', 4, 'Overvejer forfremmelse','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Clement Klamborg', '+45 22 34 66 78', '+45 21635203', 'Ansat', 6, 'Overvejer fyring','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Crede Crudklasse', '+45 26 34 66 78', '+45 21635202', 'Ansat', 5, '','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Naser Khader', '+45 36 34 56 78', '+45 21635201', 'Ansat', 8, 'Ny mand i virksomheden','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Kenned Optur', '+45 12 34 56 78', '+45 20635205', 'Ansat', 1, 'Overvejer fyring','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Bæhni Bomstærk', '+45 22 34 56 78', '+45 21435204', 'Ansat', 4, 'Overvejer forfremmelse','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Karl Kylling', '+45 22 34 66 78', '+45 21635203', 'Ansat', 6, 'Overvejer fyring','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Jens Java', '+45 26 34 66 78', '+45 21635202', 'Ansat', 5, '','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Per Personlig', '+45 36 34 56 78', '+45 21635201', 'Ansat', 8, 'Ny mand i virksomheden','',0); INSERT INTO Projekt VALUES (projektseq.nextval, 'Kompetencesystem - Solution Makers', 'Igangværende', 'Palle', '+45 12 34 56 78', '', 2008, 1, 1,0); INSERT INTO Projekt VALUES (projektseq.nextval, 'Tidsregistrering - DyneLars', 'Ikke påbegyndt', 'Lars', '+45 12 33 56 78', '', 2009, 4, 4,0); INSERT INTO Projekt VALUES (projektseq.nextval, 'Draftdesign - Henriks stoffer', 'Igangværende', 'Henrik Hauge', '+45 12 44 56 78', '', 2009, 2, 4,0); INSERT INTO Kompetence VALUES (kompetenceseq.nextval, 'Projektledelse', 'Anvendes når en person er istand til at lede og gennemføre et projekt'); INSERT INTO Kompetence VALUES (kompetenceseq.nextval, 'Java programmering', ''); INSERT INTO Kompetence VALUES (kompetenceseq.nextval, 'C++ programmering', ''); INSERT INTO Kompetence VALUES (kompetenceseq.nextval, 'UML Diagrammering', 'Business og program analyse. Anvendelse af UP og UML'); INSERT INTO MedarbejderKompetencer VALUES (1, 1, 1, 8); INSERT INTO MedarbejderKompetencer VALUES (1, 2, 2, 6); INSERT INTO MedarbejderKompetencer VALUES (1, 3, 3, 0); INSERT INTO MedarbejderKompetencer VALUES (1, 4, 4, 6); INSERT INTO MedarbejderKompetencer VALUES (2, 2, 1, 9); INSERT INTO MedarbejderKompetencer VALUES (3, 1, 1, 8); INSERT INTO MedarbejderKompetencer VALUES (4, 3, 2, 8); INSERT INTO MedarbejderKompetencer VALUES (4, 4, 1, 4); INSERT INTO MedarbejderKompetencer VALUES (5, 1, 4, 6); INSERT INTO MedarbejderKompetencer VALUES (5, 2, 3, 7); INSERT INTO MedarbejderKompetencer VALUES (5, 3, 2, 8); INSERT INTO MedarbejderKompetencer VALUES (5, 4, 1, 5); INSERT INTO MedarbejderKompetencer VALUES (6, 1, 1, 8); INSERT INTO MedarbejderKompetencer VALUES (6, 2, 2, 6); 200/201
INSERT INTO MedarbejderKompetencer VALUES (6, 3, 3, 0); INSERT INTO MedarbejderKompetencer VALUES (6, 4, 4, 6); INSERT INTO MedarbejderKompetencer VALUES (7, 2, 1, 9); INSERT INTO MedarbejderKompetencer VALUES (8, 1, 1, 8); INSERT INTO MedarbejderKompetencer VALUES (9, 3, 2, 8); INSERT INTO MedarbejderKompetencer VALUES (9, 4, 1, 4); INSERT INTO MedarbejderKompetencer VALUES (10, 1, 4, 6); INSERT INTO MedarbejderKompetencer VALUES (10, 2, 3, 7); INSERT INTO MedarbejderKompetencer VALUES (10, 3, 2, 8); INSERT INTO MedarbejderKompetencer VALUES (10, 4, 1, 5); INSERT INTO MedarbejderKompetencer VALUES (11, 1, 1, 8); INSERT INTO MedarbejderKompetencer VALUES (11, 2, 2, 6); INSERT INTO MedarbejderKompetencer VALUES (11, 3, 3, 0); INSERT INTO MedarbejderKompetencer VALUES (11, 4, 4, 6); INSERT INTO MedarbejderKompetencer VALUES (12, 2, 1, 9); INSERT INTO MedarbejderKompetencer VALUES (13, 1, 1, 8); INSERT INTO MedarbejderKompetencer VALUES (14, 3, 2, 8); INSERT INTO MedarbejderKompetencer VALUES (14, 4, 1, 4); INSERT INTO MedarbejderKompetencer VALUES (15, 1, 4, 6); INSERT INTO MedarbejderKompetencer VALUES (15, 2, 3, 7); INSERT INTO MedarbejderKompetencer VALUES (15, 3, 2, 8); INSERT INTO MedarbejderKompetencer VALUES (15, 4, 1, 5); INSERT INTO ProjektKompetencer VALUES (1, 2, 4); INSERT INTO ProjektKompetencer VALUES (1, 4, 4); INSERT INTO ProjektMedarbejdere VALUES (1, 2, 2, 4); COMMIT; 201/201