Solution Makers Kompetence System

Størrelse: px
Starte visningen fra side:

Download "Solution Makers Kompetence System"

Transkript

1 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

2 Indholdsfortegnelse Arbejdsprocessen...4 Præ Inception Kravspecifikation...5 Produktet Brugsvejledning Refleksion over brug af Tortoise SVN Den fjerde iteration : Find flaskehalse Principskema Find flaskehalse Tests Blackbox tests Sammendrag af brugertest Brugertest Opret projekt TESTCASE 1 : BEMAND PROJEKT TESTCASE 2 : REDIGER BEMANDING TESTCASE 3 : REDIGER PROJEKT White box test setkompetencebehov(kompetence, int, Integer) addmedarbejdertilknytning(medarbejder, Kompetence, int) removemedarbejdertilknytning(medarbejdertilknytning) removekompetencebehov(kompetencebehov) getkompetencebehov(ifkompetence) addkompetencebehov(kompetencebehov) getkompetencebehovliste(boolean) hasifkompetencebehov(ifkompetence) Screendump fra test Java koden GUIFrame FacadeDomain KontrolProjekt KontrolKunde KontrolKompetence KontrolMedarbejder IFProjekt Projekt IFKompetenceBehov KompetenceBehov IFKompetence Kompetence IFMedarbejder Medarbejder IFMedarbejderTilknytning MedarbejderTilknytning IFMedarbejderKompetence MedarbejderKompetence IFKunde Kunde PostnrBy FacadeDatasource KontrolDatasource

3 mapperprojekt mapperkompetencebehov mappermedarbejdertilknytning mapperkompetence mappermedarbejder mappermedarbejderkompetence mapperkunde MapperPostnrBy Databasen Relationer, feltnavne og constraints Relation: PostnrBy Relation: Kunde Relation: Medarbejder Relation: Projekt Relation: Kompetence Relation: MedarbejderKompetencer Relation: ProjektKompetencer Relation: ProjektMedarbejdere Opret tabeller Script Indsæt data Script /201

4 Arbejdsprocessen Beslutninger, overvejelser og arbejdsfordeling 4/201

5 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

6 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

7 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

8 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

9 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

10 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

11 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

12 Produktet Solution Makers A/S, Kompetencesystem 12/201

13 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

14 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

15 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

16 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 Programmet består af to faneblade med forskellige funktioner. Disse er placeret i øverste venstre hjørne. 16/201

17 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

18 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

19 2. Mulige medarbejdere 3. Tilføj/fjern 4. Tilknyttede medarbejdere 5. Kompetencevalg 6. Gem projekt 7. Medarbejderdækning 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

20 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

21 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

22 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

23 16. Når projektet er som du ønsker det, trykkes på <Gem projekt>. God fornøjelse. Mvh Udviklerholdet. 23/201

24 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

25 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

26 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 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

27 Principskema Find flaskehalse 27/201

28 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

29 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

30 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: 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

31 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

32 gemmer projektet(se fig.9). dog gives ingen tilbagemelding til brugeren. Fig. 1 Fig. 2 32/201

33 Fig. 3 33/201

34 Fig. 4 34/201

35 Fig. 5 Fig. 6 35/201

36 Fig. 7 Fig. 8 36/201

37 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

38 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

39 Fig. 1 39/201

40 Fig. 2 40/201

41 Fig. 3 41/201

42 Fig. 4 Fig. 5 42/201

43 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 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

44 Databasen før ændringer er gennemført: Ændringer der gennemføres: Ændringer i databasen efter projektet gemmes: 44/201

45 45/201

46 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

47 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

48 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

49 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

50 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

51 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

52 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

53 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

54 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

55 //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

56 //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

57 //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

58 // // //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

59 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

60 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

61 ); 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

62 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

63 //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

64 //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

65 //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

66 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

67 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

68 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

69 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 INITIALISERINGER FANE 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

70 jpanelstatusbar.setbounds(new Rectangle(20, 680, 840, 20)); // // // INDLAESNING I COMBOBOXE - FANE 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

71 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

72 //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 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

73 == 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 e private void jbuttonopretredigergemprojekt_actionperformed(actionevent e) //GEM PROJEKT IFKunde kunde = null; IFMedarbejder projektleder = null; String projektstatus = null; Integer aarstal = null; 73/201

74 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

75 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 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 e 75/201

76 private void jbuttonnulstilfelter_actionperformed(actionevent e) if (jlistopretredigerprojektoversigt.getselectedindex() >= -0) jlistopretredigerprojektoversigt.clearselection(); resetprojekt(); // / Checker om et felt indeholder udelukkende blanke tegn eller 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 e private void jcombobemandprojektfilterprojektstatus_actionperformed(actionevent e) // STATUS ACTION loadprojektertilmt(); // / Gendindlæser projekter i projektlisten med bestemt e 76/201

77 private void jcombobemandprojektfilteraarstal_actionperformed(actionevent e) //AARSTAL ACTION loadprojektertilmt(); // / Opdaterer fanen 'bemand projekt' paa baggrund af valgt e private void jcombobemandprojektvaelgprojekt_actionperformed(actionevent e) //V?LG PROJEKT //Opdaterer brugerfladen i fanen 'Bemand projekt' opdatermedarbejdertilknytningfane(); // / Tillknytter en 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

78 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

79 opdatermedarbejdertilknytningfane(); // / Fjerner en tilknyttet 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 e private void jcomboopretredigerfilterprojektstatus_actionperformed(actionevent e) //STATUS ACTION - Projekt loadprojektliste(); // / Gendindlæser projekter i projektlisten med bestemt e private void jcomboopretredigerfilteraarstal_actionperformed(actionevent e) loadprojektliste(); // / Fjerner et kompetencebehov fra et projekt 79/201

80 @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 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

81 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

82 //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 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

83 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 field Tekststreng med en antaget værdi positiv heltalsværdi større end 0. 83/201

84 @param navn Benyttes i forbindelse med tilføjelse til <tt>fejlstreng</tt> for at sikre let genkendelighed ved senere udskrift af 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

85 // / 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

86 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

87 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

88 //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

89 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) // /201

90 // 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 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 kontaktperson 90/201

91 @param 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 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 ArrayList -En liste med projekter, der opfylder status og aar public ArrayList<IFProjekt> getprojektliste(string status, 91/201

92 Integer aarstal) return kontrolprojekt.getprojektliste(status, aarstal); / Henter et projekt inkl. alle tilknyttede objekter. Sandhedsvaerdien der returneres, afgoer om alle objekter er Sandhedsvaerdi public boolean getifprojekt(ifprojekt ifprojekt) return kontrolprojekt.getifprojekt(ifprojekt); // Kunder / Henter en liste med ArrayList -En liste med kunder public ArrayList<IFKunde> getkundeliste() return kontrolkunde.getkundeliste(); // Medarbejder / Henter en liste med alle ArrayList -En liste med medarbejdere public ArrayList<IFMedarbejder> getmedarbejderliste() return kontrolmedarbejder.getmedarbejderliste(); / Henter en liste med medarbejdere paa baggrund af en liste med 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 ArrayList -En liste med medarbejdere 92/201

93 public ArrayList<IFMedarbejder> getifmedarbejderlistefrakompetencebehov(arraylist<ifkompetencebehov> ifkompetencebehov) return kontrolmedarbejder.getifmedarbejderlistefrakompetencebehov(ifkompetencebehov ); / Henter en liste med medarbejdertilknytninger til et ArrayList -En liste med medarbejdertilknytninger public ArrayList<IFMedarbejderTilknytning> getifmedarbejdertilknytningtilprojekt(ifprojekt projekt) return kontrolprojekt.getmedarbejdertilknytningtilprojekt(projekt); / Tilfoejer en medarbejdertilknytning til et 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 Sandhedsvaerdi public boolean removeifmedarbejdertilknytning(ifprojekt ifprojekt, IFMedarbejderTilknytning ifmedarbejdertilknytning) //Hent medarbejder fra tilknytning IFMedarbejder ifmedarbejder = ifmedarbejdertilknytning.getmedarbejder(); int tid = ifmedarbejder.getledigtid() + ifmedarbejdertilknytning.gettid(); 93/201

94 kontrolmedarbejder.setledigtidformedarbejder(ifmedarbejder, tid); return kontrolprojekt.removeifmedarbejdertilknytning(ifprojekt, ifmedarbejdertilknytning); / Saetter den tid en medarbejder har til tid public void setledigtidformedarbejder(ifmedarbejder ifmedarbejder, int tid) kontrolmedarbejder.setledigtidformedarbejder(ifmedarbejder, tid); // Kompetence / Henter en liste med alle ArrayList -En liste med kompetencer public ArrayList<IFKompetence> getifkompetenceliste() return kontrolkompetence.getifkompetenceliste(); / Opretter et kompetencebehov til et IFKompetenceBehov -Et kompetencebehov public IFKompetenceBehov opretkompetencebehov(ifprojekt ifprojekt, IFKompetence ifkompetence, int behov) return kontrolprojekt.opretkompetencebehov(ifprojekt, ifkompetence, behov); / Henter en kompetence fra en IFKompetence -En kompetence public IFKompetence getkompetence(ifmedarbejderkompetence ifmedarbejderkompetence) return kontrolmedarbejder.getkompetence(ifmedarbejderkompetence); / Henter en liste med kompetencebehov fra et projekt. 94/201

95 @param ArrayList -En liste med kompetencebehov public ArrayList<IFKompetenceBehov> getifkompetencebehovliste(ifprojekt projekt) return kontrolprojekt.getkompetencebehovliste(projekt); / Henter en liste med medarbejderkompetence(r) fra en 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 IFKompetence -En kompetence/null hvis den ikke findes public IFKompetence getifkompetence(string kompetencenavn) return kontrolkompetence.getifkompetence(kompetencenavn); / Saetter behovet for en behov public void setbehovtilifkompetencebehov(ifkompetencebehov ifkompetencebehov, int behov) kontrolprojekt.setbehovtilifkompetencebehov(ifkompetencebehov, behov); / Fjerner et kompetencebehov. Sandhedsvaerdien der returneres, afgoer om kompetencebehovet er Sandhedsvaerdi public boolean removekompetencebehov(ifprojekt ifprojekt, IFKompetenceBehov ifkompetencebehov) 95/201

96 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 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

97 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 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

98 / 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 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 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 ArrayList<IFKompetencebehov> 98/201

99 @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 ifprojekt public ArrayList<IFMedarbejderTilknytning> getmedarbejdertilknytningtilprojekt(ifprojekt ifprojekt) return getifmedarbejdertilknytningtilprojekt(ifprojekt); / Tilføjer eller opdaterer en Medarbejder Tilknytning som et medsendt Projekt har eller skal 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

100 return ifmedarbejdertilknytning; / Fjerner en Medarbejder Tilknytning i et medsendt 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 Sandhedsvaerdi public boolean getifprojekt(ifprojekt ifprojekt) Projekt projekt = (Projekt) ifprojekt; return FacadeDatasource.getInstance().getProjekt(projekt); / Henter en liste med kompetencebehov fra et 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

101 / Henter en liste med 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 behov public void setbehovtilifkompetencebehov(ifkompetencebehov ifkompetencebehov, int behov) KompetenceBehov kb = (KompetenceBehov) ifkompetencebehov; kb.setbehov(behov); / Fjerner et kompetencebehov fra et 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

102 public class KontrolKunde public KontrolKunde() / Alle Kunder hentes, gennemloebes, omdannes til Interface og 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 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

103 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 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 ifkompetencebehov 103/201

104 @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 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

105 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 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

106 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 IFKompetence public IFKompetence getkompetence(ifmedarbejderkompetence ifmedarbejderkompetence) MedarbejderKompetence medarbejderkompetence = (MedarbejderKompetence) ifmedarbejderkompetence; IFKompetence ifkompetence = medarbejderkompetence.getkompetence(); return ifkompetence; / Saetter en medarbejders ledige 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

107 Henter <tt>projekt</tt> objektets <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> som tekststreng. public String getnavn(); / Henter <tt>projekt</tt> objektets tilknyttede <tt>kunde</tt> objekt svarende til kunden projektet udføres <tt>kunde</tt> som interfaced <tt>ifkunde</tt>. public IFKunde getifkunde(); / Henter <tt>projekt</tt> objektets <tt>kontaktperson</tt> som tekststreng. public String getkontaktperson(); / Henter <tt>projekt</tt> objektets <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>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 sandhedsværdi, hvor <tt>true</tt> svarer til at projektet har et kompetencebehov for den medsendte kompetence. public boolean hasifkompetencebehov(ifkompetence ifkompetence); 107/201

108 / Henter <tt>projekt</tt> objektets <tt>medarbejder</tt> objekt svarende til projektets <tt>medarbejder</tt> som interfaced <tt>ifkunde</tt>. public IFMedarbejder getifprojektleder(); / Henter <tt>projekt</tt> objektets <tt>aarstal</tt>. public int getaarstal(); / Henter <tt>projekt</tt> objektets <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 <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

109 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 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 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

110 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 public boolean setprojektleder(medarbejder projektleder) this.projektleder = projektleder; return true; / Tilføjer eller ændre Projektets KompetenceBehov. Metoden er designet til brug i 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

111 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 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

112 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å public void addmedarbejdertilknytning(medarbejdertilknytning mt) medarbejdertilknytningliste.add(mt); / Fjerner en medarbejder fra et 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

113 mt.setostatus(2); return true; / Sletter et kompetence behov for 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 public int getid() return id; / Returnerer en tekst med id og navn. Bruges fx. på projektlisterne i public String tostring() return id + ": " + navn; / Returnerer det planlagte public int getaarstal() return aarstal; / Returnerer public String getstatus() return status; 113/201

114 / Returnerer det kompetencebehov der er repræsenteret af det medsendte kompetence 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 public void setnavn(string navn) this.navn = navn; / Returnerer projektets public String getnavn() return navn; / Returnerer objektet public Kunde getkunde() return kunde; / Returnerer Kunde public IFKunde getifkunde() return kunde; / Returnerer public String getkontaktperson() 114/201

115 return kontaktperson; / Returnerer kontaktperson public String getkontaktpersontlf() return kontaktpersontlf; / Returnerer projektleder som medarbejder public Medarbejder getprojektleder() return projektleder; / Returnerer projektleder som medarbejder public IFMedarbejder getifprojektleder() return projektleder; / Saetter tekststrengen kontaktperson public void setkontaktperson(string kontaktperson) this.kontaktperson = kontaktperson; / Saetter tekststrengen kontaktperson kontaktpersontlf public void setkontaktpersontlf(string kontaktpersontlf) this.kontaktpersontlf = kontaktpersontlf; / Saetter integeren version, der anvendes til versionsstyring i version public void setversion(int version) this.version = version; 115/201

116 / Saetter integeren aarstal der angiver hvornår projektet er planlagt til at blive aarstal public void setaarstal(int aarstal) this.aarstal = aarstal; / Saetter tekststrengen status public void setstatus(string status) this.status = status; / Returnerer versionsnummeret som anvendes til versionstyring ved skrivning til public int getversion() return version; / Saetter tekststrengen note public void setnote(string note) this.note = note; / Returnerer tekststrengen public String getnote() return note; / Saetter projekt id. Anvendes af mapperprojekt ved oprettelsen af et nyt id public void setid(int id) this.id = id; 116/201

117 / Tilføjer et kompetencebehov til projektet, men tjekker først om kompetencen er tildelt til 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 kunde public void setkunde(kunde kunde) this.kunde = kunde; / Returnerer kompetencebehovlisten uden de kompetencebehov der står til 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 public ArrayList<KompetenceBehov> getkompetencebehovliste() return getkompetencebehovliste(false); 117/201

118 / Returnerer kompetencebehovlisten og giver mulighed for at vælge alle (true) eller kun dem der ikke står til sletning 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 public ArrayList<MedarbejderTilknytning> getmedarbejdertilknytningliste() return medarbejdertilknytningliste; / Returnerer en boolean alt efter om det medsendte kompetence interface referere til et kompetencebehov i 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

119 public interface IFKompetenceBehov / Henter <tt>kompetencebehov</tt> objektets <tt>kompetence</tt> <tt>kompetence</tt>. public Kompetence getkompetence(); / Henter <tt>kompetencebehov</tt> objektets <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 <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

120 / Henter <tt>kompetencebehov</tt> objektets <tt>kompetence</tt> <tt>kompetence</tt>. public Kompetence getkompetence() return kompetence; / Henter <tt>kompetencebehov</tt> objektets <tt>kompetence</tt> <tt>ifkompetence</tt>. public Kompetence getifkompetence() return kompetence; / Aendrer <tt>kompetencebehov</tt> objektets 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> 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

121 <tt>status</tt> = 2: Objekt til sletning<br /> <tt>status</tt> = 3: Et nyt objekt<br <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 <tt>status</tt> public void setostatus(int ostatus) this.ostatus = ostatus; / Aendrer <tt>kompetencebehov</tt> objektets <tt>kompetence</tt> 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 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

122 / 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> - <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> som tekststreng. public String getnavn(); / Henter <tt>kompetence</tt> <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

123 / Henter <tt>kompetence</tt> objektets <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> som tekststreng. public String getnavn() return navn; / Henter <tt>kompetence</tt> objektets <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 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

124 <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 <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> 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> - <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

125 @return <tt>arraylist</tt> indeholdende <tt>medarbejderkompetence</tt> objekter. public ArrayList<MedarbejderKompetence> getmedarbejderkompetenceliste(); / Henter <tt>medarbejder</tt> objektets <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 <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

126 / 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 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 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 medarbejderkompetenceliste public void setkompetencer(arraylist<medarbejderkompetence> medarbejderkompetenceliste) this.medarbejderkompetenceliste = medarbejderkompetenceliste; / Anvendes til at hente medarbejder id som integer public int getid() return id; / Saetter navn til den angivne tekst 126/201

127 @param navn som streng public void setnavn(string navn) this.navn = navn; / Anvendes til at hente medarbejder navn som String public String getnavn() return navn; / Saetter medarbejderens telefonnummer som telefonnummer som tekststreng public void settelefonnummer(string telefonnummer) this.telefonnummer = telefonnummer; / Anvendes til at hente medarbejder 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 status som 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 ledigtid public void setledigtid(int ledigtid) 127/201

128 this.ledigtid = ledigtid; / Henter den vaerdien for den tid en medarbejder er ledigtid som integer public int getledigtid() return ledigtid; / Gennemløber alle medarbejderens kompetencer og returnerer true hvis den medsendte kompetence 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 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

129 // 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 ArrayList%ltMedarbejderKompetence%gt public ArrayList<MedarbejderKompetence> getmedarbejderkompetenceliste() return medarbejderkompetenceliste; / Returnerer alle Medarbejderens MedarbejderKompetencer som matcher 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

130 / 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 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 public int getostatus() return ostatus; / Når objektet ændres () private void opdater() if (ostatus!= 3) // kan ikke ændre nye objekter ostatus = 1; / Når objektet slettes () public void remove() ostatus = 2; / Tilføjer en medarbejderkompetence til mkompetence public void addmedarbejderkompetence(medarbejderkompetence mkompetence) medarbejderkompetenceliste.add(mkompetence); 130/201

131 / Returnerer en tekststreng. Anvendes i GUI til præsentation af medarbejderen på fanen Bemand 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> public IFMedarbejder getmedarbejder(); / Henter <tt>medarbejdertilknytning</tt> objektets tilknyttede <tt>kompetence</tt> som interfacet <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> <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

132 <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 <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 projekt Et medarbejdere En liste med kompetencer En liste med 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

133 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

134 // 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 projekt Et conn En forbindelse til 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

135 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 p Et conn En forbindelse til 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

136 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

137 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> 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 <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

138 Returnerer kompetence Kompetence public Kompetence getkompetence() return kompetence; / Returnerer et interface til public IFKompetence getifkompetence() return kompetence; / Det er muligt at ændre en medarbejders prioritering af kompetencen med denne prioritering public void setprioritering(int prioritering) this.prioritering = prioritering; / Returnerer 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 niveau public void setniveau(int niveau) this.niveau = niveau; / Returnere niveau. Er det 7 eller derover, er man public int getniveau() return niveau; / 138/201

139 Returnere en tekststreng med informationer om kompetencen. Metoden anvendes til visningen på kompetencelisten på fanen Bemand 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 = 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 = public int getostatus() return ostatus; / Når objektet ændres kaldes metoden og ostatus saettes til 1, medmindre det er et nyt () 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 () 139/201

140 public void remove() ostatus = 2; / Anvendes til at tilføje en kompetence til 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> - <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> 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 <tt>type</tt> som tekststreng public String gettype(); 140/201

141 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 ; private String type; private String note; private int ostatus; // 0 = uændret, 1 = ændret, 2 = slettet, 3 = ny / Konstruktoer for klassen ostatus public Kunde(int id, String navn, String adresse, PostnrBy postnrby, String telefonnummer, String , String type, String note, int ostatus) this.id = id; this.navn = navn; this.adresse = adresse; this.postnrby = postnrby; this.telefonnummer = telefonnummer; this. = ; this.type = type; this.note = note; this.ostatus = ostatus; public void setid(int id) this.id = id; 141/201

142 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 set (string ) this. = ; public String get () return ; public void settype(string type) this.type = type; public String gettype() return type; 142/201

143 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 () private void opdater() if (ostatus!= 3) // kan ikke ændre nye objekter ostatus = 1; / Når objektet slettes () public void remove() ostatus = 2; 143/201

144 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 public int getpostnr() return Postnr; / Returnere 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

145 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 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 status En bestemt <tt>status</tt> eller <tt>null</tt> hvis aarstal Et bestemt <tt>aarstal</tt> eller <tt>null</tt> hvis <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 p Et <tt>projekt</tt> sandhedsværdi, som afgoer om alle objekter er tilknyttet public boolean getprojekt(projekt p) return kontroldatasource.getprojekt(p); 145/201

146 / Gemmer et <tt>projekt</tt> inkl. alle tilknyttede p Et <tt>projekt</tt> 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> <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> <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 k Et <tt>kompetence</tt> <tt>arraylist</tt> indeholdende medarbejdere public ArrayList<Medarbejder> getmedarbejderliste(kompetence k) return kontroldatasource.getmedarbejderliste(k); // Kompetence / Henter en liste med alle <tt>kompetence</tt> <tt>arraylist</tt> indeholdende alle <tt>kompetence</tt> objekter public ArrayList<Kompetence> getkompetenceliste() return kontroldatasource.getkompetenceliste(); 146/201

147 / 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 kompetencenavn En tekststreng (<tt>string</tt>) svarende til navnet på det <tt>kompetence</tt> objekt man ønsker at få fat <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

148 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 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

149 DB.releaseConnection(conn); //Returner resultatet return res; / Henter kompetence 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 Det er valgfrit at medsende en 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

150 //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 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

151 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

152 //Luk forbindelsen til DB releaseconnection(conn); return res; / Henter liste med projekter paa baggrund af status og 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 p Projekt som skal <i>fyldes med 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

153 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

154 //Sandhedvaerdi for hvorvidt alle mapninger gik godt, returneres return mapninggennemfoert; / Gemmer projekt. Hvis nyt oprettes det i database ellers opdateres p Projektet der skal 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

155 return res; / Opretter en forbindelse til DB, med brug af driver og 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 conn private void releaseconnection(connection conn) try conn.close(); catch (Exception e) System.err.println(e); / Henter en kompetence paa baggrund af en 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

156 @param 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 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

157 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

158 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 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

159 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

160 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

161 return projekt.getkompetencebehovliste(); / Gemmer aendringerne for kompetence behovet i et 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

162 " 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 p Et i forevejen valgt conn En forbindelse til 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

163 //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

164 new HashMap<String, MedarbejderTilknytning>(); / Metoden tilføjer MedarbejderTilknytninger til et projekt Et medarbejdere En liste med kompetencer En liste med 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

165 // 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 projekt Et conn En forbindelse til 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

166 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

167 /Metoden tilknytter <tt>medarbejdertilknytning</tt>-objekter til et p Et conn En forbindelse til 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

168 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 conn En forbindelse til Exception public ArrayList<Kompetence> getkompetenceliste(connection conn) throws Exception 168/201

169 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 conn En forbindelse til kompetencenavn Navnet på den <tt>kompetence</tt> der skal k1 Et <tt>kompetence</tt>-objekt (hvis muligt - ellers returneres SQLException public Kompetence getkompetence(connection conn, String kompetencenavn) throws SQLException Kompetence k = null; 169/201

170 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 medarbejderliste En liste med conn En forbindelse til boolean Mapning gennemfoert true/false 170/201

171 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

172 //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 p Et <tt>projekt</tt> med tilhoerende boolean Mapning gennemfoert true/false 172/201

173 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

174 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 p Et 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

175 //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

176 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 @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

177 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 conn En forbindelse til 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

178 res.add(medarbejder); //Returnér de samlede medarbejdere return res; / Metoden tilknytter <tt>medarbejder</tt>-objekter til p Et conn En forbindelse til 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

179 //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 p Et conn En forbindelse til 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

180 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 projekt Et conn En forbindelse til DB 180/201

181 @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

182 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 ArrayList<Medarbejder> En liste med Connection En forbindelse til 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

183 //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

184 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 conn En forbindelse til 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, , 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

185 '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 = 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, , 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 p Et conn En forbindelse til 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, , 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

186 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 = 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, , 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

187 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 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

188 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

189 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

190 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 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

191 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

192 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

193 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

194 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

195 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

196 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

197 Opret tabeller Script Solution Makers A/S; Create Tables Script -- Elaboration -- by Gruppe 1 TR07DAT2 -- Login: GR1TR07D2 KODE: GR1TR07D 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), 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

198 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

199 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: GR1TR07D 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, ' ', '[email protected]', 'Ny mindre kunde','lukket hver mandag',0); INSERT INTO Kunde VALUES (kundeseq.nextval, 'Henriks stoffer', 'Kanalens kvarter 213', 2620, ' ', '[email protected]', 'Ny mindre kunde','ikke narko',0); INSERT INTO Kunde VALUES (kundeseq.nextval, 'Michaels Spøg og skæmt', 'Borgbjergvej 4', 2450, ' ', '[email protected]', 'Ny stor kunde','et godt sted at få et billigt grin',0); INSERT INTO Kunde VALUES (kundeseq.nextval, 'DyneLars', 'Hovedgaden 12', 2600, ' ', '[email protected]', 'Gammel stor kunde','træffes bedst før 08.00',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Jacob Henriksen', ' ', ' ', 'Ansat', 1, 'Overvejer fyring','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Dan Buhr', ' ', ' ', 'Ansat', 4, 'Overvejer forfremmelse','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Nick Niebling', ' ', ' ', 'Ansat', 6, 'Overvejer fyring','',0); 199/201

200 INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Casper Cederberg', ' ', ' ', 'Ansat', 5, '','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Nicolaj Roos', ' ', ' ', 'Ansat', 8, 'Ny mand i virksomheden','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Lars Larsen', ' ', ' ', 'Ansat', 1, 'Overvejer fyring','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Kent Kor', ' ', ' ', 'Ansat', 4, 'Overvejer forfremmelse','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Clement Klamborg', ' ', ' ', 'Ansat', 6, 'Overvejer fyring','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Crede Crudklasse', ' ', ' ', 'Ansat', 5, '','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Naser Khader', ' ', ' ', 'Ansat', 8, 'Ny mand i virksomheden','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Kenned Optur', ' ', ' ', 'Ansat', 1, 'Overvejer fyring','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Bæhni Bomstærk', ' ', ' ', 'Ansat', 4, 'Overvejer forfremmelse','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Karl Kylling', ' ', ' ', 'Ansat', 6, 'Overvejer fyring','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Jens Java', ' ', ' ', 'Ansat', 5, '','',0); INSERT INTO Medarbejder VALUES (medarbejderseq.nextval, 'Per Personlig', ' ', ' ', 'Ansat', 8, 'Ny mand i virksomheden','',0); INSERT INTO Projekt VALUES (projektseq.nextval, 'Kompetencesystem - Solution Makers', 'Igangværende', 'Palle', ' ', '', 2008, 1, 1,0); INSERT INTO Projekt VALUES (projektseq.nextval, 'Tidsregistrering - DyneLars', 'Ikke påbegyndt', 'Lars', ' ', '', 2009, 4, 4,0); INSERT INTO Projekt VALUES (projektseq.nextval, 'Draftdesign - Henriks stoffer', 'Igangværende', 'Henrik Hauge', ' ', '', 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

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

dpix til Word Indholdsfortegnelse

dpix til Word Indholdsfortegnelse dpix til Word Indholdsfortegnelse dpix til Word...1 Installation af Java...1 Klargøring af Word...1 Installation (opdatering) af dpix...2 Første start af Word med dpix...2 Udarbejdelse af et opgavesæt...4

Læs mere

I denne manual kan du finde en hurtig introduktion til hvordan du:

I denne manual kan du finde en hurtig introduktion til hvordan du: VORES NORDSJÆLLAND HURTIGT I GANG MANUAL 01: Bruger HVAD INDEHOLDER DENNE MANUAL? I denne manual kan du finde en hurtig introduktion til hvordan du: 1. Finder Vores Nordsjælland hjemmesiden 2. Opretter

Læs mere

Delphi og Databaser for begyndere

Delphi og Databaser for begyndere Denne guide er oprindeligt udgivet på Eksperten.dk Delphi og Databaser for begyndere Denne artikel handler om hvordan man udnytter noget af det bedste i Delphi: Dets gode muligheder for integrering med

Læs mere

Sådan redigerer du en hjemmeside i Umbraco

Sådan redigerer du en hjemmeside i Umbraco Brugermanual til din boligafdelings hjemmeside Sådan redigerer du en hjemmeside i Umbraco Indhold Introduktion... 2 Log på Umbraco og redigér din hjemmeside... 3 Opret ny side... 7 Gem side uden at udgive/publicere

Læs mere

Vejledning. Vejledning til Trio Forvaltningsmodul

Vejledning. Vejledning til Trio Forvaltningsmodul Vejledning til Trio Forvaltningsmodul Indholdsfortegnelse Om Trio Forvaltning... 3 Download Trio... 3 Opstart af Trio Forvaltning... 3 Hvis du har Trio installeret i forvejen... 4 Hvis du IKKE har Trio

Læs mere

Manual Version 2. til oprettelse af hjemmesider for landsbyer i Rebild kommune

Manual Version 2. til oprettelse af hjemmesider for landsbyer i Rebild kommune Manual Version 2 til oprettelse af hjemmesider for landsbyer i Rebild kommune Oversigt: Login Hjemmeside...... side 3 Login Administrationsmodul... side 5 Kategorier.. side 6 Opret/rediger første side...

Læs mere

Version 8 Outlookintegration

Version 8 Outlookintegration Version 8 Outlookintegration - Synkroniser din C&B Kalender med Outlook Med C&B Outlook-integration kan du få synkroniseret dine aftaler, så din C&B Kalender matcher din Outlook-kalender og omvendt. Integrationen

Læs mere

Indhold. Evalueringsvejledning. En undersøgelse fra start til slut involverer 4 programmer: - SurveyXact - Excel - E-learn - SiteCore

Indhold. Evalueringsvejledning. En undersøgelse fra start til slut involverer 4 programmer: - SurveyXact - Excel - E-learn - SiteCore Evalueringsvejledning En undersøgelse fra start til slut involverer 4 programmer: - SurveyXact - Excel - E-learn - SiteCore Indhold 1 - Respondentgruppe hentes... 2 2 Undersøgelsen oprettes i SX... 4 3.

Læs mere

Dual boot. af Windows 7 og Linux Mint. Af Thomas Bødtcher-Hansen

Dual boot. af Windows 7 og Linux Mint. Af Thomas Bødtcher-Hansen Dual boot af Windows 7 og Linux Mint Af Thomas Bødtcher-Hansen Dual boot af Windows 7 og Linux Mint "Dual boot af Windows 7 og Linux Mint" er en udvidelse af min IT guide "Linux Mint med fokus på privatliv

Læs mere

Daglig brug af Jit-klient

Daglig brug af Jit-klient Daglig brug af Jit-klient Indholdsfortegnelse Opret person...3 Alternativ oprettelse...3 Søgning af personer...4 Send besked...5 Vælg besked...6 Opret mappe...6 Opret skabelon...6 Slet mapper og skabeloner...6

Læs mere

09/03 2009 Version 1.4 Side 1 af 37

09/03 2009 Version 1.4 Side 1 af 37 Login til DJAS Gå ind på adressen http://www.djas.dk I feltet Brugernavn skrives den e-mail adresse som brugeren er registeret med i systemet. I feltet Password skrives brugerens adgangskode. Ved at sætte

Læs mere

Sikkerhedskopiering. Sikkerhedskopiering til harddisk.

Sikkerhedskopiering. Sikkerhedskopiering til harddisk. . Generelt I det følgende beskrives det, hvordan du sikkerhedskopierer dine kortdata. Sikkerhedskopifunktionen kopierer alle data i kortmodulet for alle høstår for den aktuelle database. Sikkerhedskopien

Læs mere

Udlæsning af stregkodefil til scanneren 1. Opret mappen pdt på C-drevet (c:\pdt).

Udlæsning af stregkodefil til scanneren 1. Opret mappen pdt på C-drevet (c:\pdt). Indholdsfortegnelse Introduktion... 2 Udlæsning af stregkodefil til scanneren... 3 Installation af scanneren... 5 Indlæsning af datafil i scanneren... 7 Brug af scanneren... 8 Sådan scanner du... 8 Sådan

Læs mere

Videregående programmering i Java

Videregående programmering i Java Videregående programmering i Java Dag 6 Komponenter (og lidt Swing og MVC) Læsning: VP 4, evt. VP 6 Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html Grafiske komponenter

Læs mere

1.TILBUD NYT TILBUD 1.1 TRIN FORUDSÆTNINGER

1.TILBUD NYT TILBUD 1.1 TRIN FORUDSÆTNINGER 1.TILBUD Fanen Tilbud giver en oversigt over alle de tilbud, der ligger i din database. Det er også herfra, at du har mulighed for at oprette, kopiere eller redigere et eksisterende tilbud. Det følgende

Læs mere

Test af It-komponent

Test af It-komponent Test af It-komponent I programmeringssproget Java Programmet Login service Elev: Mads Funch Klasse 2.4 Mat, It, Programmering Skole: Roskilde Tekniske Gymnasium HTX Underviser: Karl Dato: 31-08-2016 Side

Læs mere

Guide til opdatering af Navision Stat med ny funktionalitet - nye objekter, datakonvertering, automatisk indlæsning af datafiler.

Guide til opdatering af Navision Stat med ny funktionalitet - nye objekter, datakonvertering, automatisk indlæsning af datafiler. Side 1 af 20 Navision Stat 7.0 ØSY/JACPM 15-05-2015 Vejledning til Lokal Versionsstyring (VMS) Overblik Guide til opdatering af Navision Stat med ny funktionalitet - nye objekter, datakonvertering, automatisk

Læs mere

Huskesedler. Design og automatisering af regneark. Microsoft Excel 2013

Huskesedler. Design og automatisering af regneark. Microsoft Excel 2013 Huskesedler Design og automatisering af regneark Microsoft Excel 2013 Januar 2017 Knord Side 2 Indholdsfortegnelse Ark... 4 Beskyttelse... 6 Diagram... 7 Eksport af data... 8 Fejlretning i formler... 9

Læs mere

dpix til Writer Indholdsfortegnelse

dpix til Writer Indholdsfortegnelse dpix til Writer Indholdsfortegnelse dpix til Writer...1 Installation af dpix...2 Første start af Writer med dpix...2 Udarbejdelse af et opgavesæt...3 Bilag...5 Kontrol af brugte opgaver...6 Fejlrapportering...6

Læs mere

KMD Brugeradministration til Navision og LDV

KMD Brugeradministration til Navision og LDV KMD Brugeradministration til Navision og LDV Vejledning for Statens Administration og ØSC institutioner. Opdateret 09-09-2015 Indholdsfortegnelse 1 Kom godt i gang... 2 1.1 Login til KMD Brugeradministration...

Læs mere

Dynamic Order Kom godt i gang

Dynamic Order Kom godt i gang Dynamic Order Kom godt i gang Projektstyring Ressourcestyring Kompetencestyring - Timeregistrering Side 1 af 17 Indholdsfortegnelse Dynamic Order Kom godt i gang... 1 Indholdsfortegnelse... 2 Introduktion...

Læs mere

Manual til Kundekartotek

Manual til Kundekartotek 2016 Manual til Kundekartotek ShopPlanner Customers Med forklaring og eksempler på hvordan man håndterer kundeoplysninger www.obels.dk 1 Introduktion... 3 1.1 Formål... 3 1.2 Anvendelse... 3 2 Referencer...

Læs mere

INSTALLATIONSGUIDE. Installationsguide. for Dynamics AX 4.0. til. dansk udgave. Frederiksberg, maj Docversion: 1.01.

INSTALLATIONSGUIDE. Installationsguide. for Dynamics AX 4.0. til. dansk udgave. Frederiksberg, maj Docversion: 1.01. INSTALLATIONSGUIDE Frederiksberg, maj 2007 Installationsguide til for Dynamics AX 4.0 dansk udgave h Indhold 1 Indledning...3 1.1 Systemkrav...3 1.2 Kritik modtages gerne...3 1.3 Yderligere oplysninger...3

Læs mere

Vejledning i brug af dli dokumenthåndteringssystemet til virksomheder

Vejledning i brug af dli dokumenthåndteringssystemet til virksomheder Vejledning i brug af dli dokumenthåndteringssystemet til virksomheder Indhold Generelt... 1 Windows tidligere versioner... 1 Windows 10... 2 Apple Mac... 2 Log på... 2 Rediger dokumentet... 2 Tilføj et

Læs mere

ViKoSys. Virksomheds Kontakt System

ViKoSys. Virksomheds Kontakt System ViKoSys Virksomheds Kontakt System 1 Hvad er det? Virksomheds Kontakt System er udviklet som et hjælpeværkstøj til iværksættere og andre virksomheder som gerne vil have et værktøj hvor de kan finde og

Læs mere

Udlæsning af opslagsfil til scanneren 1. Opret mappen pdt på C-drevet (c:\pdt).

Udlæsning af opslagsfil til scanneren 1. Opret mappen pdt på C-drevet (c:\pdt). Indholdsfortegnelse Introduktion... 2 Udlæsning af opslagsfil til scanneren... 3 Installation af scanneren... 4 Indlæsning af datafil i scanneren... 6 Brug af scanneren... 7 Sådan scanner du... 7 Tømning

Læs mere

Installationsvejledning Alphacam 2017 R1

Installationsvejledning Alphacam 2017 R1 Installationsvejledning Alphacam 2017 R1 Indholds Fortegnelse Indledning - Generelt...3 Windows skal være 64 bit...3 Installation, HUSK at stille brugerrettigheder på din Computer...3 Installation, Skærmkort

Læs mere

Tutorial 2: Indlæsning af nye rapporter

Tutorial 2: Indlæsning af nye rapporter Tutorial 2: Indlæsning af nye rapporter Indledning Myndigheder og rådgivere som arbejder med den nationale grundvandskortlægning kan blive oprettet som bruger (redaktør) af rapportdatabasen. Herved får

Læs mere

Vejledning til Teknisk opsætning

Vejledning til Teknisk opsætning Vejledning til Teknisk opsætning v. 1.0 Adm4you, 2010. Indhold Kort om denne vejledning... 3 Generelt om easyourtime... 3 Installation af databasen... 3 Sikkerhed og rettigheder... 4 SQL Login... 4 Rettigheder

Læs mere

Navision Stat 7.0. Kvikguide om tilpasning af rollecenteret. Overblik. Side 1 af 29. ØSY/STO 18. maj 2015

Navision Stat 7.0. Kvikguide om tilpasning af rollecenteret. Overblik. Side 1 af 29. ØSY/STO 18. maj 2015 Side 1 af 29 Navision Stat 7.0 ØSY/STO 18. maj 2015 Kvikguide om tilpasning af rollecenteret Overblik Formål Denne kvikguide omhandler de tilpasninger som du kan foretage i Handlingsbåndet, Navigationsmenuen

Læs mere

Installationsvejledning Alphacam 2018 R1

Installationsvejledning Alphacam 2018 R1 Installationsvejledning Alphacam 2018 R1 Indholds Fortegnelse Indledning - Generelt...3 Understøttede Windows Versioner...3 Understøttede låstyper i fremtidige versioner...3 Netværks Drivere skal opdateres

Læs mere

Easy Guide i GallupPC

Easy Guide i GallupPC Easy Guide i GallupPC Version. 6.00.00 Gallup A/S Masnedøgade 22-26 DK 2100 København Ø Telefon 39 27 27 27 Fax 39 27 50 80 Indhold SÅDAN KOMMER DU I GANG MED AT ANVENDE GALLUPPC... 2 TILFØJELSE AF UNDERSØGELSER

Læs mere

idata Side 1/6 Indholdsfortegnelse

idata Side 1/6 Indholdsfortegnelse idata Side 1/6 Indholdsfortegnelse Brugerflade side 2 Indlæsning af tappekort side 2 Transaktioner side 3 Udtræk side 4 Kortspærring side 5 Setup side 6 Hassellunden 4A, 2765 Smørum 44 91 34 51 44 91 34

Læs mere

Annemette Søgaard Hansen/www.dinwebvejleder.dk

Annemette Søgaard Hansen/www.dinwebvejleder.dk Google Docs Dokumenter Indholdsfortegnelse Værktøjer... Side 3 Menuer... Side 5 Opgave... Side 8 Få adgang til filerne fra din computer... Side 16 Vejledende løsning... Side 17 GoogleDocs Dokumenter 2

Læs mere

Sektornet VPN Installationsvejledning Windows Vista/7

Sektornet VPN Installationsvejledning Windows Vista/7 Sektornet VPN Installationsvejledning Windows Vista/7 Version 5.0 Af Jesper Skou Jensen og Mads Udengaard Sørensen 1 Start installationen 1 1 Indledning Denne vejledning gennemgår opsætning af Sektornet

Læs mere

Arkiv i SIMU World. Arkivet ligger i SIMU World, og gør det muligt at arkivere jeres sager direkte i SIMU World.

Arkiv i SIMU World. Arkivet ligger i SIMU World, og gør det muligt at arkivere jeres sager direkte i SIMU World. Indhold Hvad er Arkivet?... 2 Arkiv er elektronisk, og ligger nederst i hver menu... 3 Arkivgrupper... 3 Oprette hovedmapper under de enkelte faner... 5 Oprette sagsmapper under hovedmapper... 6 Arkivering

Læs mere

Kom godt i gang med DLBR Mark Online

Kom godt i gang med DLBR Mark Online Kom godt i gang med DLBR Mark Online DLBR Mark Online indeholder Markplan og Dyrkningsjournal. Markplan bruger du til at du oprette og redigere i bedriftens markplan, mens du bruger dyrkningsjournalen

Læs mere

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen. Indledning...2 Variabler...13 Eksempel: 1...13 Eksempel 2:...13 Eksempel 3:...15 Eksempel 4:...16 Metoder...17 Metode (intet ind og intet ud)...17 Metode (tekst ind)...18 Metode (tekst ind og tekst ud)...19

Læs mere

I tolkeportalen har alle brugere en rolle. Rollen bestemmer hvad man som bruger har adgang til.

I tolkeportalen har alle brugere en rolle. Rollen bestemmer hvad man som bruger har adgang til. Tolkeportalen Brugervejledning til brug af tolkeportalens administrationssider Brugerroller I tolkeportalen har alle brugere en rolle. Rollen bestemmer hvad man som bruger har adgang til. Der findes i

Læs mere

Vejledning til brugeradministrator EDI systemet for FP attester og journaloplysninger

Vejledning til brugeradministrator EDI systemet for FP attester og journaloplysninger Vejledning til brugeradministrator EDI systemet for FP attester og journaloplysninger 18. maj 2018 Vejledning til brugeradministrator oprettelse af afdelinger og brugere til EDI FP attester Denne vejledning

Læs mere

Smart-ebizz Manual til Bookinsystem Indholdsfortegnelse Kom hurtigt i gang med dit booking system:... 3 Overblikket over dit bookingsystem... 4 Hovedside... 4 Kunder... 4 Opret ny Kunde... 4 Vagtplaner...

Læs mere

Tabulex TEA-Privat Venteliste

Tabulex TEA-Privat Venteliste Tabulex TEA-Privat Venteliste Introduktion På ventelisten har du et overblik over potentielle, kommende elever. Med få tast er eleven på ventelisten til det ønskede skoleår med egne oplysninger samt forældreoplysninger.

Læs mere

Elaboration fase 2. semester projekt 2008-04-11. Gruppe 4

Elaboration fase 2. semester projekt 2008-04-11. Gruppe 4 Indholdsfortegnelse Analysemodeller... 4 Domænemodel... 4 ER-model... 5 Designmodeller... 7 Designklassediagram... 7 Sekvensdiagram... 9 Relationel model... 10 Diskussion af datastrukturer, algoritmer

Læs mere

Indholdsfortegnelse. Indholdsfortegnelse.. side 2. Adgang til webgraf 3. Opslag adresse... 4. Styring af layout.. 5. Zoom funktioner..

Indholdsfortegnelse. Indholdsfortegnelse.. side 2. Adgang til webgraf 3. Opslag adresse... 4. Styring af layout.. 5. Zoom funktioner.. Indholdsfortegnelse Indholdsfortegnelse.. side 2 Adgang til webgraf 3 Opslag adresse... 4 Styring af layout.. 5 Zoom funktioner.. 6 Panorere på skærmen. 7 Information om grafikken.... 8-10 Print et udsnit.....

Læs mere

Download, installation og ibrugtagning af CQ

Download, installation og ibrugtagning af CQ Download, installation og ibrugtagning af CQ 1. Download og installation 2. Grundlæggende opsætning af CQ 3. Opdatering af CQ herunder registrering af CQ og licenser (3.12) 4. Opsætning af CQ til netværk.

Læs mere

Daglig brug af JitBesked 2.0

Daglig brug af JitBesked 2.0 Daglig brug af JitBesked 2.0 Indholdsfortegnelse Oprettelse af personer (modtagere)...3 Afsendelse af besked...4 Valg af flere modtagere...5 Valg af flere personer der ligger i rækkefølge...5 Valg af flere

Læs mere

Hvordan opretter jeg MultiUser med en access-database?

Hvordan opretter jeg MultiUser med en access-database? Hvordan opretter jeg MultiUser med en access-database? Hvis du vil starte MultiUser med en access-database, skal du som det første downloade en access-database og placere den på et fælles drev. Du kan

Læs mere

Installationsguide. Integration af erhvervsdata fra NN Markedsdata til Microsoft Dynamics NAV 2015

Installationsguide. Integration af erhvervsdata fra NN Markedsdata til Microsoft Dynamics NAV 2015 Installationsguide Integration af erhvervsdata fra NN Markedsdata til Microsoft Dynamics NAV 2015 Indledning Dette dokument indeholder vejledning til installation af modulet NN Markedsdata i Dynamics NAV

Læs mere

Kom i gang med DANBRO

Kom i gang med DANBRO 1 Indhold... 1 Generelt...2 DANBRO...2 Forkundskaber for at anvende DANBRO...2 Krav til pc...2 Starte DANBRO...2 Installation...3 DANBRO-Manualer...4 Manualer...4 DANBROs Brugergrænseflade...5 Valg af

Læs mere

Grundlæggende Programmering ITU, Efterår 1999. Skriftlig eksamen i Grundlæggende Programmering

Grundlæggende Programmering ITU, Efterår 1999. Skriftlig eksamen i Grundlæggende Programmering Skriftlig eksamen i Grundlæggende Programmering ITU, 20. januar 2000 Alle hjælpemidler tilladt, dog ikke datamat. Eksamen er skriftlig, fire timer, og bedømmes efter 13-skalaen. Opgavesættet består af

Læs mere

DOKUMENTATION OG VEJLEDNING

DOKUMENTATION OG VEJLEDNING DOKUMENTATION OG VEJLEDNING VERSION 2 Registrering af oplysninger på personalet Denne vejledning beskriver, hvordan der registreres oplysninger om personalet. Vejledningen er delt op i 2 dele. - Opdatering

Læs mere

MailMax / Web v4.1. Brugsvejledning til webmail. Copyright 2003 Gullestrup.net

MailMax / Web v4.1. Brugsvejledning til webmail. Copyright 2003 Gullestrup.net MailMax / Web v4.1 Copyright 2003 Gullestrup.net Log ind på webmailen Start med at gå ind på http://webmail.gullestrup.net i din browser. Indtast din Email-adresse samt Adgangskode, som hører til din konto.

Læs mere

18/11 2010 Version 2.0 Side 1 af 36

18/11 2010 Version 2.0 Side 1 af 36 Login til DJAS Gå ind på adressen http://www.djas.dk I feltet Brugernavn skrives den e-mail adresse som brugeren er registeret med i systemet. I feltet Password skrives brugerens adgangskode. Ved at sætte

Læs mere

02101 Indledende Programmering Introduktion til Eclipse

02101 Indledende Programmering Introduktion til Eclipse 02101 Indledende Programmering Introduktion til Eclipse Version 2018 1 Introduktion I dette kursus lægger vi op til at man bruger det integrerede udviklingsmiljø Eclipse. Basalt set er et integreret udviklingsmiljø

Læs mere

Vejledning. Indlæsning af studerende til gruppedannelse i STADS. Indhold. Studie-IT Tlf.:

Vejledning. Indlæsning af studerende til gruppedannelse i STADS. Indhold. Studie-IT Tlf.: Studie-IT Tlf.: 9940 9720 Vejledning Indlæsning af studerende til gruppedannelse i STADS Indhold Indledning.... 2 Udvælgelse af data. i istads... 2 Generering af data... 5 Generering af data fra et excel-ark...

Læs mere

Brug af Discoverer. 1. Start Discoverer ved at klikke på knappen Discoverer på

Brug af Discoverer. 1. Start Discoverer ved at klikke på knappen Discoverer på Oprette projektark med simpel tabel Brug af Discoverer 1. Start Discoverer ved at klikke på knappen Discoverer på www.kirkeportal.dk 2. Angiv kontonummer, brugernavn og password. Det er det samme som anvendes

Læs mere

Annemette Søgaard Hansen/www.dinwebvejleder.dk

Annemette Søgaard Hansen/www.dinwebvejleder.dk Google Docs Regneark Indholdsfortegnelse Værktøjer... Side 3 Menuer... Side 6 Opgave... Side 13 Få adgang til filerne fra din computer... Side 19 Vejledende løsning... Side 20 GoogleDocs Regneark 2 Google

Læs mere

5. OPSÆTNING DOKUMENTSKABELONER 5.1 TRIN

5. OPSÆTNING DOKUMENTSKABELONER 5.1 TRIN 5. OPSÆTNING DOKUMENTSKABELONER Under fanen Dok. skabeloner kan du arbejde med de skabeloner som du har i systemet, eller du kan oprette nye. I denne vejledning kigger vi på hvordan du kan tilrette selve

Læs mere

Opdatering af ISOWARE til version 6.1.0

Opdatering af ISOWARE til version 6.1.0 Opdatering af ISOWARE til version 6.1.0 September 2015 Indhold Kontaktoplysninger... 1 VIGTIGT... 2 Opdatering af trejdepartssoftware... 2 Opdatering til version 6.1.0.... 2 1. Backup af databasen... 3

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 13. marts, 2018 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

MANUAL. Præsentation af Temperaturloggerdata. Version 2.0

MANUAL. Præsentation af Temperaturloggerdata. Version 2.0 MANUAL Præsentation af Temperaturloggerdata Version 2.0 Indholdsfortegnelse FORORD...3 INTRODUKTION...3 KRAV OG FORUDSÆTNINGER...3 INSTALLATION...4 OPSÆTNING...8 PROGRAMOVERBLIK...10 PROGRAMKØRSEL...11

Læs mere

Udarbejdelse af fælles opsætninger

Udarbejdelse af fælles opsætninger VIGTIGT Denne vejledning er KUN aktuel for den bruger, som er ansvarlig superbruger på Næsgaard Markkort ADVICER. Vejledningen omhandler funktionerne til anvendelse af fælles opsætninger for alle brugere

Læs mere

RaaSikkerV3 BRUGERMANUAL

RaaSikkerV3 BRUGERMANUAL RaaSikkerV3 BRUGERMANUAL I GIS 2008 RaaSikker BRUGERMANUAL Udarbejdet for: Titel: Dokumenttype: I GIS ApS RaaSikkerV3 Brugermanual Software manual Udgave: 3.1 Dato: 23-06-08 Udarbejdet af: ASW/NPJ I GIS

Læs mere

KMD Brugeradministration til Navision og LDV

KMD Brugeradministration til Navision og LDV KMD Brugeradministration til Navision og LDV Vejledning for selvejere. Opdateret 09-09-2015 Indholdsfortegnelse 1 Overordnet liste af funktoner... 2 2 Vejledning... 3 2.1 Login til KMD Brugeradministration...

Læs mere

Statistikmodul i WinPLC

Statistikmodul i WinPLC Juni 2018 Statistikmodul i WinPLC Indlæs patientfortegnelse fra sundhed.dk Inden du benytter statistikmodulet i WinPLC, er det en god ide at indlæse en opdateret patientfortegnelse fra sundhed.dk. Denne

Læs mere

Brugermanual til MOBI:DO Make på Android

Brugermanual til MOBI:DO Make på Android Brugermanual til MOBI:DO Make på Android Introduktion Med MOBI:DO Make kan du oprette guides, som kan ses i MOBI:DO. En guide virker som en guide der fører brugeren hele vejen igennem en arbejdsopgave.

Læs mere

TILLÆG TIL MANUAL Excel-indlæsning i Vvskatalogets administrationssystem

TILLÆG TIL MANUAL Excel-indlæsning i Vvskatalogets administrationssystem 3456.78 123456 TILLÆG TIL MANUAL Excel-indlæsning i Vvskatalogets administrationssystem 30. juli 2015 Indhold Indledning Side 3 Sådan kommer du i gang Side 4 Oprette nye varer Side 5 Ændre eksisterende

Læs mere

BRUGER KURSUS RAMBØLL HJEMMESIDE

BRUGER KURSUS RAMBØLL HJEMMESIDE Til Forsyningsvirksomheder i Danmark Dokumenttype Brugervejledning Rambøll Hjemmeside Full Responsive Dato Oktober 2017 BRUGER KURSUS RAMBØLL HJEMMESIDE BRUGER KURSUS RAMBØLL HJEMMESIDE Revision 01 Dato

Læs mere

OrCAD Capture TCL IDE med Eclipse

OrCAD Capture TCL IDE med Eclipse OrCAD Capture TCL IDE med Eclipse OrCAD Capture TCL er et script sprog til at lave applikationer til OrCAD Capture. Eclipse er et gratis udviklingsmiljø med debug muligheder. Denne guide hjælper med at

Læs mere

Vejledning. Opsætning af Trio Web Vers 2.0 feb. 2010

Vejledning. Opsætning af Trio Web Vers 2.0 feb. 2010 Opsætning af Trio Web Vers 2.0 feb. 2010 Indholdsfortegnelse Opsætning af Trio Web... 3 Generel opsætning af Trio Web... 3 Databaseopsætning... 3 DB... 3 Aar... 4 Login... 4 Internet... 4 Port... 4 Registreringsnøgle...

Læs mere

IT Support Guide. Installation af netværksprinter (direkte IP print)

IT Support Guide. Installation af netværksprinter (direkte IP print) IT Support Guide Denne guide er hentet på www.spelling.dk Program: Microsoft Windows Vista Program sprog version: ENG (US) Guide emne: Installation af netværksprinter (direkte IP print) Publikationsnr.:

Læs mere

Mobile Arbejdssedler. Mobile TID. Mobile Observationer

Mobile Arbejdssedler. Mobile TID. Mobile Observationer Næsgaard MOBILE Generelt Flere vejledninger Næsgaard MOBILE kan anvendes til markregistrering og/eller til tidsregistrering. Har du adgang till både Mark og TID i PC program kan du som administrator bestemme

Læs mere

Opret CFU-kursusevaluering i Survey Xact

Opret CFU-kursusevaluering i Survey Xact Printvenlig side for Forsidetekst Opret CFU-kursusevaluering i Survey Xact www.survey-xact.dk Oprettelsen af en kursusevaluering består af flg. trin: 1. Oprettelse af spørgeskema ud fra en skabelon 2.

Læs mere

Brugermanual. - For intern entreprenør

Brugermanual. - For intern entreprenør Brugermanual - For intern entreprenør Version 1.0 2014 Brugermanual - For Intern Entreprenør Velkommen som bruger på Smartbyg.com. Denne manual vil tage dig igennem de funktioner der er tilgængelig for

Læs mere

KL S EFFEKTMÅLINGS- REDSKAB TIL KONTROLOMRÅDET

KL S EFFEKTMÅLINGS- REDSKAB TIL KONTROLOMRÅDET KL FEBRUAR 2019 TEKNISK VEJLEDNING KL S EFFEKTMÅLINGS- REDSKAB TIL KONTROLOMRÅDET OFFICE VERSION 2010 OG 2013 2 INDHOLD INDHOLD INDLEDNING A. TEKNISKE KRAV SIDE 3 SIDE 4 B. HVORDAN GØRES ALLE VÆRKTØJETS

Læs mere

VA-banken. Vejledning til Brugere og Rettighedsgrupper. Implementeret med VA-banken version Sidst redigeret 14/6-2019

VA-banken. Vejledning til Brugere og Rettighedsgrupper. Implementeret med VA-banken version Sidst redigeret 14/6-2019 VA-banken Implementeret med VA-banken version 2019.1 Sidst redigeret 14/6-2019 Side 1 af 25 Indhold Introduktion... 4 Funktioner i formularen Brugere og Rettighedsgrupper... 5 Formularen Brugere... 6 Opret

Læs mere

Vejledning til de bydende

Vejledning til de bydende Vejledning til de bydende Juni 2013/JET Indledning Indledning ibinder er et web-baseret program, til håndtering af byggeprojekter og ejendomsdrift på en hidtil uset brugervenlig og økonomisk måde. ibinder

Læs mere

UMS SharePoint Portal Opgaveafleveringsmodul

UMS SharePoint Portal Opgaveafleveringsmodul UMS SharePoint Portal Opgaveafleveringsmodul Version 1.0 Indhold UMS SharePoint Portal... 1 Ny opgave... 2 Rediger opgave... 4 Office dokumenter... 5 Kursisters besvarelser... 6 Sådan ser kursister opgaven...

Læs mere

Velkommen til Electro Energy s Prisprogram

Velkommen til Electro Energy s Prisprogram Velkommen til Electro Energy s Prisprogram Denne guide hjælper dig igennem installationen fra download via vores hjemmeside til du kan køre programmet og søge i vores varenumre. Programmet er designet

Læs mere

API-import af kundedata fra e-conomic

API-import af kundedata fra e-conomic API-import af kundedata fra e-conomic Herunder følger en beskrivelse af hvordan du opretter en forbindelse mellem e-conomic og, der tillader at kunder kan blive synkroniseret mellem de to systemer. Opsætning

Læs mere

Kom godt igang med Inventar registrering

Kom godt igang med Inventar registrering Kom godt igang med Inventar registrering (InventoryDB) (Med stregkodesupport) programmet fra PetriSoft Introduktion... 1 Inventar registrering... 2 Værktøjsudleje... 3 Service database til reperationer

Læs mere

Stifinder er et program til navigere rundt med i dine mapper (biblioteker) på din computers Harddisk.

Stifinder er et program til navigere rundt med i dine mapper (biblioteker) på din computers Harddisk. Stifinder Stifinder er et program til navigere rundt med i dine mapper (biblioteker) på din computers Harddisk. Den bruges også til at Oprette, Slette, Flytte og Omdøbe, samt sortere i dem. Den traditionelle

Læs mere

Filer og Mapper. Filer. Mapper

Filer og Mapper. Filer. Mapper Indhold Filer og Mapper... 3 Filer... 3 Mapper... 3 Stifinder... 4 Eksempler på stifinder... 5 Markering af drev, filer og mapper... 5 Vælg vilkårlige mapper/filer... 7 Selandias drev... 8 Opret ny mappe...

Læs mere

e-konto manual 01.08.2011 e-konto manual Side 1

e-konto manual 01.08.2011 e-konto manual Side 1 e-konto manual 01.08.2011 e-konto manual Side 1 Indhold 1. Overordnet beskrivelse... 3 2. Login... 3 3. Se og ret kundeoplysninger... 4 4. Rediger kontaktoplysninger... 6 5. Skift adgangskode... 7 6. BroBizz-oversigt...

Læs mere

AgroSoft A/S AgroSync

AgroSoft A/S AgroSync AgroSoft A/S AgroSync AgroSync er et AgroSoft A/S værktøj, der bliver brugt til filudveksling imellem WinSvin og PocketPigs. Fordele ved at bruge AgroSync: Brugeren bestemmer overførsels tidspunktet for

Læs mere

LEJERBO.DK INDSÆT BILLEDER, GALLERI OG VIDEO

LEJERBO.DK INDSÆT BILLEDER, GALLERI OG VIDEO 1 Indsætte et billede på en side 1. LOG PÅ Log på Mit Lejerbo og gå ind på den lokale side, du skal redigere og klik derefter på Rediger øverst til højre. 2. FIND SIDEN DIT BILLEDE SKAL IND PÅ Klik dig

Læs mere

Indhold. 1. Adgang og afslutning

Indhold. 1. Adgang og afslutning 1 Indhold 1. Adgang og afslutning 2. Menupunkter 3. Tekst 4. Billeder 5. Video 6. Lyd 7. Bannere 8. Bokse 9. Dokumenter 10. Links 11. Iframe 12. Markedspladsen 13. Nyheder 14. Job 15. Kalender 16. Selvbetjeningsbjælken

Læs mere