• No results found

Digitalt arkiv

N/A
N/A
Protected

Academic year: 2021

Share "Digitalt arkiv"

Copied!
63
0
0

Loading.... (view fulltext now)

Full text

(1)

1

Digitalt arkiv

av

Emil Abrahamsson

Institutionen för matematik, natur- och datavetenskap

Högskolan i Gävle

S-801 76 Gävle, Sweden

E-post:

emil@gavle.to

Abstrakt

Grunden för detta arbete har varit att förenkla hantering och sökning bland ritningar

och förteckningar i ett ritningsarkiv. Lösningen har blivit ett webbaserat datasystem

som bygger på en databas där all information lagras och är sökbar. Resultatet har

blivit ett system som man oavsett var man befinner sig inom företagets nätverk ha

tillgång till alla ritningar och förteckningar på ett snabbt och effektivt sätt.

(2)

2

Innehåll

1

Introduktion ... 3

1.1

Bakgrund... 3

1.1.1

Företaget Roundo ... 3

1.2

Syfte... 3

1.3

Mål... 3

1.4

Frågeställningar ... 3

2

Teori ... 4

2.1

PHP: Hypertext Preprocessor ... 4

2.2

MySQL ... 4

2.3

CSS – Cascading Style Sheets... 4

2.4

XHTML ... 4

3

Förutsättningar och krav ... 5

3.1

Kravspecifikation... 5

4

Beskrivning av konstruktionslösning... 5

4.1

Databasen... 6

4.2

Systemet... 6

5

Implementering och test ... 6

5.1

Planeringsfasen ... 6

5.2

Implementation av databasen ... 7

5.3

Implementation av systemet ... 7

5.3.1

Huvudsidan ... 7

5.3.2

Sök pdf... 8

5.3.3

Sök ritning... 9

5.3.4

Skapa ritning... 10

5.3.5

Lägg till ritning ... 10

5.3.6

Ny ritningsförteckning ... 10

5.3.7

Maskin/ritningsförteckningar ... 11

5.3.8

Ritningsändringar ... 15

5.3.9

Lista ändringar ... 15

5.3.10

Hantera användare ... 16

5.3.11

CSS-filen ... 16

6

Resultat ... 17

6.1

Databasen... 17

6.2

Systemet... 17

6.3

Svar på frågeställningar ... 17

7

Diskussion ... 17

7.1

PHP ... 17

7.2

MySQL ... 17

7.3

Systemet... 18

7.4

Framtida utveckling ... 18

8

Slutsatser... 18

Referenser ... 19

Webbreferenser ... 19

Bilaga B: Källkod ... 24

(3)

3

1

Introduktion

1.1 Bakgrund

Jag har fått i uppdrag av företaget Roundo, i Hässleholm, att programmera ett

webbsystem som ska ligga på deras Intranät. I dagens läge har de ett ritningsarkiv med

massa lådor och pärmar som de får leta i för att hitta den ritning eller maskin som de

är ute efter. Eftersom en maskin kan bestå av upp till ett par hundra ritningar så blir

det för dem väldigt tidskrävande att leta i alla pärmar och lådor. För att underlätta

detta så vill de ha ett ”digitalt ritningsarkiv” som lagrar den information som de har i

alla pärmar och sedan kan ta fram de ritningar som eftersöks som pdf-filer.

1.1.1 Företaget Roundo

Roundo är ett företag i Hässleholm som utvecklar, konstruerar och säljer maskiner

som används för att forma stålprofiler och plåtar. Det grundades 1964 och har sedan

dess fått mer än 10 000 nöjda kunder runt om i hela världen och på så sett blivit ett

världsledande företag inom sin bransch.

1.2 Syfte

Syftet med detta arbete är att för företaget underlätta och effektivisera deras arbete på

bästa möjliga sätt. Genom att skapa detta ritningsarkiv kommer företaget kunna spara

mycket tid genom bland annat kunna få fram alla de ritningar som en maskin består av

som pdf-filer som de sedan kan skriva ut. Genom att de även ska kunna föra in

information om eventuella förändringar som bör genomföras på olika maskiner eller

ritningar så kommer även detta minska misstag och fördröjningar på grund av missar.

1.3 Mål

Målet är att skapa ett effektiv och användarvänligt system så att Roundo i

fortsättningen inte skall vara beroende av alla de pärmar som idag innehåller

information om alla ritningar. De ska även från systemet generera nya ritningsnummer

och revisioner av ritningar.

Målet är även att bygga systemet med moduler för att enkelt kunna lägga till och

ta bort olika funktioner efter förutsättningar och krav.

1.4 Frågeställningar

• Går det att på ett smidigt sätt leta efter ritningar och skriva ut dessa?

• Kan ritningsändringar fångas upp av systemet och går det att lägga in åtgärd

för dessa?

(4)

4

2

Teori

2.1 PHP: Hypertext Preprocessor

PHP är ett skriptspråk som i första hand köra på webbservrar för att driva dynamiska

webbsidor som genereras från en databas eller användarformulär.

PHP utvecklades från en samling av Perl-skript av Rasmus Lerdorf. Detta

vidareutvecklades senare av Andi Gutmans och Zeev Suraski som år 1998 lanserade

den färdiga versionen av PHP 3.0.

Version 5 släpptes den 13 juli 2004 med förbättrat stöd för objekt. Senaste

uppdateringen är 5.2.6 kom 6 maj 2008. [1]

2.2 MySQL

MySQL är en fri databashanterare som är licensierad under GNU General Public

License. Det är en av de populäraste databashanterarna inom Linux-världen, men finns

för de flesta stora operativsystemen också.

Programmet har utvecklats av företaget MySQL AB i Uppsala, som också säljer

support, servicekontrakt och kommersiella licensierade kopior. Programmets

huvudsaklige utvecklare är Michael Widenius och David Axmark. [2]

2.3 CSS – Cascading Style Sheets

CSS är ett språk som används för att beskriva presentationsstilen för ett strukturerat

dokument.

Språket utvecklades av Håkon Wium Lie och Berc Bos 1994 och används främst

för att presentera informationen i ett XML- eller XHTML-dokument eftersom de

endast innehåller strukturerad text utan stilinformation. Det kan även användas för att

anpassa presentationen efter fler olika medier som till exempel hur det skrivs ut på ett

papper, en webbsida eller på en mobiltelefon.

Användandet av dessa mallar kan spara mycket tid och arbete eftersom man bara

behöver ändra på ett enda ställe för att förändra utseendet på flera filer. [3]

2.4 XHTML

Extensible Hypertext Markup Language (XHTML) är ett standard format för

webbsidor som har specificerats av W3C (se Ordlista). Märkspråket XHTML är en

vidareutveckling av HTML (se Ordlista). Skillnaden mellan de båda är att XHTML är

baserat på XML istället för SGML vilket gör språket mer strikt. XHTML började

utvecklas som en omformulering av HTML i XML och anses av många vara den nya

versionen av HTML, men XHTML är ett separat märkspråk.

XHTML 1.0 som alltså är en omformulering av HTML 4.01 som XML och

definieras på samma sätt som HTML 4.01 av tre olika dokumentmallar, XHTML 1.0

Strict, XHTML 1.0 Transitional och XHTML 1.0 Frameset (se Ordlista). Skillnaderna

mellan dessa är att i Strict så tillåts inte vissa utgångna element som exempelvis ”font”

eller ”center” (se Ordlista) medan de är tillåtna i Transitional. Frameset liknar HTML

4.01 Frameset fast med XML syntax. Den vanligaste dokumentmallen som används är

Transitional.

År 2000 blev XHTML 1.0 en W3C-rekommendation och år 2001 kom version

1.1 som en ny rekommendation. [4]

(5)

5

3

Förutsättningar och krav

Förutsättningarna för detta arbete har varit goda. Jag har av kunden helt själv fått välja

programmeringsspråk och databashanterare som jag ville använda.

Att företaget ligger i Hässleholm och jag inte har haft möjlighet att vara där nere

hela tiden har varit lite problematiskt. Lösningen blev att jag har jobbat mot en sida på

internet där jag kunnat ladda upp och testa alla sidor och sedan vid de tillfällen som

jag åkt ner till Hässleholm kunnat lägga över de funktioner som varit klara allt

eftersom.

Kraven från kunden har varit att skapa ett system som de kan ha på sitt intranät.

Systemets huvudsakliga uppgift ska vara att hantera alla företagets ritningar på lång

sikt. Man ska i systemet kunna söka fritt bland alla ritningar som är inlagda, man ska

även kunna söka på en specifik maskin och då kunna få upp alla ritningar som denna

maskin är byggd av. Användarna av systemet skall även kunna lägga in förslag på

önskade ritningsändringar. Dessa ritningsändringsförslag ska sedan de som jobbar på

konstruktionsavdelningen kunna ta fram och lägga in vilken åtgärd som har gjorts.

Systemet skall även kunna skriva ut alla ritningar som är nödvändiga för en

maskin och de ska skickas till rätt skrivare i förhållande till formatet på ritningen. Det

ska även gå att själv välja antalet av respektive ritning.

3.1 Kravspecifikation

Från Roundo fick jag följande krav och önskemål om funktioner:

Kunna lagra all nödvändig information om ritningar.

• Kunna koppla samman ritningar till maskiner och delar av maskiner.

• Kunna söka bland ritningarna/maskinerna med avseende på följande

parametrar:

o Maskinnummer

o Serie

o Benämning

o Maskintyp

o Ritningsnummer

o Revision

o Datum

o Anmärkning

o Om ritningen ersätter en annan ritning

o Om ritningen är ersatt av en annan ritning

• Kunna lägga in information om det finns saker på ritningar som behöver

ändras.

• Att konstruktörerna ska kunna få fram denna information innan de skapar en

maskin eller serie och då också kunna lägga in att de har åtgärdat problemet.

• Önskemål om att direkt från systemet direkt kunna skriva ut alla ritningar i de

antal som önskas för ett visst ändamål.

4

Beskrivning av konstruktionslösning

Jag kommer bygga hela systemet till väldigt stor del på en databas. Detta för att göra

det enkelt att kontrollera och uppdatera systemet. Alla ritningar kommer finnas

sparade som PDF filer på en server och i databasen kommer sökvägen till dessa

finnas. Språken jag kommer använda mig av är PHP och HTML, databasen kommer

jag bygga i MySQL.

(6)

6

4.1 Databasen

Databasen består av 10 olika tabeller som lagrar olika delar av informationen som

behövs för alla ritningar, maskiner och orders. Det finns även en tabell som lagrar

användarinformation och en för att hantera alla menyelement. Jag har valt att ha ett

prefix för alla tabeller för att underlätta om man ska anpassa databasen för något annat

företag. Detta prefix är roundo_. Alla tabeller och kolumner har engelska namn för att

slippa ersätta å ä och ö men a och o. Detta för att minimera risken för missförstånd och

feltolkningar. För att se fullständig information om databasen se bilaga A.

4.2 Systemet

Systemet skapar jag med PHP som huvudsakligt språk, men även en del XHTML

kommer användas. För att sköta utseendet på alla sidor så används en CSS fil.

Grunden av systemet är en startsida som i sin tur anropar andra PHP-filer,

beroende på vad för sida som ska visas för stunden, utifrån olika variabler. Denna

konstruktion gör hela systemet mer överskådligt och gör även det möjligt att välja att

vissa funktioner bara ska vara tillgänglig för vissa användargrupper. Det underlättar

även om det är så att man vill lägga till eller ta bort olika funktioner.

5

Implementering och test

5.1 Planeringsfasen

Det första jag gjorde var att sätta mig och fundera på en struktur av systemet med

lämpliga huvudsidor och undersidor och hur de olika funktionerna som efterfrågades

skulle kopplas till varandra.

Figur 1: Första skiss av systemstruktur

När detta var gjort började planeringen av databasen. För att göra detta så samlade jag

in exempel av ritningsförteckningar, maskinförteckningar och orders som skulle in i

systemet. Med dessa papper som grund började jag skissa på vilka tabeller som

behövdes, lämpliga primärnycklar och främmande nycklar. Första utkastet till

databasen blev 6 olika tabeller.

(7)

7

5.2 Implementation av databasen

Databasen har jag skapat med MySQL som databashanterare. Som verktyg har jag

använt det grafiska gränssnittet phpMyAdmin som är väldigt populärt bland olika

webbhotell. I detta skapade jag alla de tabeller som jag trodde var nödvändiga. Men

dessa har under implementeringen av systemet fått modifieras. Vissa tabeller och fält

har jag upptäck varit onödiga och andra har jag saknat och således fått lägga till. Den

slutgiltiga databasstrukturen kan du se i bilaga A. Databasen är normaliserad i tredje

normalform, så när som tabellen roundo_users där kolumnen name innehåller både för

och efternamn.

5.3 Implementation av systemet

Jag har haft som mål att hela systemet skall vara validerat av W3C [5] för både

XHTML, enligt XHTML Transitional, och CSS.

5.3.1 Huvudsidan

Huvudsida, index.php, är väldigt enkel. Den är skriven i huvudsak XHTML med vissa

stycken av PHP-kod för att läsa in de olika sidor som ska visas.

I början av filen har jag ett PHP-stycke som inkluderar en PHP-fil som heter

dbfunc.php och även startar en session för att lagra användarinformation [6].

I övrigt har jag byggt upp sidan med fem <div>-taggar. Jag har en som definierar

hela sidan, detta för att ha möjlighet att centrera sidan i webbläsarfönstret. Sen består

den i sin tur av fyra delar: header, left, content och footer. Left är den del där menyn

läses in och content är den del där alla olika sidor laddas.

Vilken sida som ska laddas styrs av en if-sats i PHP:

<?php

if($_SESSION['online'] || isset($_REQUEST['page'])){

if(isset($_REQUEST['page']))

require_once('pages/'.$_REQUEST['page'].'.php');

else

require_once('pages/inside.php');

}else

require_once('pages/start.php');

?>

Detta kodstycke kollar helt enkelt om någon är inloggad och vad variabeln

$_REQUEST[’page’] är satt till. Om $_REQUEST[’page’] är satt så laddas helt enkelt

den sidan in. Om den inte är satt men någon är inloggad så laddas filen inside.php.

Och om inte någon är inloggad så laddar start.php som innehåller

inloggningsformuläret.

5.3.1.1 dbfunc.php

Denna fil innehåller tre funktioner, en för att starta en databaskoppling,

startDBConnection, en för att stänga en databaskoppling, stopDBConnection, och en

funktion som returnerar en sträng innehållande XHTML-koden för menyn,

generateMenu. Den läser även in en fil som heter settings.php som innehåller

definitioner av följande konstanter:

• DB_USER – användarnamnet på databasen

• DB_PASSWORD – lösenordet för databasen

• DB_HOST – servernamnet för databasen

• DB_NAME – namnet på databasen

• TABLE_PREFIX – prefixet för alla tabeller

(8)

8

Anledningen till att jag lagt dessa konstanter i en egen fil är för att det ska vara enkelt

att anpassa allt detta till andra system eller servrar, om så önskas, utan att behöva gå in

på allt för många ställen i koden och modifiera.

5.3.1.2 Menyn

Menyn, som laddas in på huvudsidan, skapas av funktionen generateMenu i filen

dbfunc. Det denna funktion gör är att den hämtar alla rader i tabellen roundo_menu

som har en aktiv status och har den behöringhetsnivån som den inloggade användaren.

Detta sorterar den sedan på kolumnen order för att få menyn sorterad på det sätt som

önskas. Utifrån den information som databasen returnerar så skapar den sedan den

XHTML-kod som behövs för att visa menyn med länkarna.

5.3.1.3 Inloggningsfunktion

Inloggningsfunktionen är väldigt simpel, den tar helt enkelt det användarnamn som

skrivs in i formuläret och kontrollerar om det är ett av de användarnamn som finns

lagrade i databasen. Om så är fallet så sätts sessionsvariabler för att man är inloggad,

namn på användaren och vilket behörighet personen har. Lösenord har valts att inte

användas då Roundo inte ansåg detta vara nödvändigt eftersom systemet bara ligger på

deras intranät.

5.3.2 Sök pdf

Detta blev en extra funktion som efterfrågades under arbetets gång. Denna funktion

gör det möjligt för användaren att söka bland alla pdf-filer som finns utan att det ska

finnas inlagd information i databasen. Detta för att de redan nu skulle kunna få nytta

av systemet trots att inte all information lagrats.

Det som sker här är att det visas ett sökformulär där användaren skriver in ett helt

eller en del av ett ritningsnummer. Utifrån det så kollas alla filer i ritningsmappen

igenom och ser om det matchar sökkriteriet. För att hämta alla filer i mappen använder

jag följande funktion:

function getFiles($dir) {

$files = array();

if (is_dir($dir)) {

if ($dh = opendir($dir)) {

while (($file = readdir($dh)) !== false) {

if(filetype("$dir/$file")!="dir")

$files[] = $file;

}

closedir($dh);

}

}

return $files;

}

Denna funktion returnerar en array med alla filer som finns i sökvägen som kommer

som parametrar. Denna array matchas sedan mot sökkriteriet.

(9)

9

5.3.3 Sök ritning

Denna funktion skiljer sig från sök pdf på så sätt att den utgår från informationen i

databasen istället för vilka filer som finns i mappen för ritningarna.

Detta är uppbyggt av två filer, en som genererar själva sökformuläret,

search_drawing.php, och en som presenterar resultatet, search_result.php.

Figur 2: Sökformuläret för sök ritningsfunktionen

I formuläret, se figur 2, behöver man bara fylla i så mycket man vet, eller inget alls,

och då hämtas informationen för alla ritningar som passar in på kriterierna. Detta

genom att fråga efter all information i tabellen roundo_drawings där det som står i

formuläret ska vara en del av den information som är inlagd i respektive formulär.

Frågan för detta ser ut som följer:

'SELECT * FROM '.TABLE_PREFIX.'drawings WHERE

drawingID LIKE "%'.$_REQUEST['drawingID'].'%" AND

review LIKE "%'.$_REQUEST['review'].'%" AND

machinetype LIKE "%'.$_REQUEST['machinetype'].'%" AND

designation LIKE "%'.$_REQUEST['designation'].'%" AND

designation2 LIKE "%'.$_REQUEST['designation2'].'%" AND

observation LIKE "%'.$_REQUEST['observation'].'%" AND

drawed_by LIKE "%'.$_REQUEST['drawed_by'].'%"

ORDER BY drawingID, review'

TABLE_PREFIX är en av de definierade konstanterna, de olika

$_REQUEST-variablerna är den information som kommer från formuläret. Svaret sorterar jag på

både ritningsnumret, drawingID, och revisionen, review.

Resultatet presenteras sedan i en tabell, se figur 3, där det även finns en länk till

pdf-filen för respektive ritning, under förutsättning att det finns en pdf för ritningen.

(10)

10

5.3.4 Skapa ritning

Detta är en funktion för att skapa en ny ritning. Först kommer man till ett formulär, se

figur 4, som ligger i filen create_drawing.php, där användaren väljer vilken typ och

storlek det ska vara på ritningen. Detta bestämmer första siffran och/eller bokstaven i

ritningsnumret.

När man tryckt på nästa kommer man till ett formulär där man får fylla i övrig

information om ritningen. Ritningsnumret är för ifyllt med numret efter det högsta

som ligger lagrat i databasen för respektive ritningstyp/storlek.

Figur 4: Formulär för att skapa ritning

När användaren fyllt i all information och trycker på skapa så läggs informationen in i

databastabellen roundo_drawings.

5.3.5 Lägg till ritning

Detta är en funktion för att lägga till information om äldre ritningar, som skapats innan

systemet kommer i funktion, och att lägga till nya revisioner av ritningar. Formuläret

är i stort sett identiskt med formuläret för att skapa ritning förutom att det även finns

en knapp för att skapa ny revision. Huvudformuläret ligger i filen add_drawing.php,

och om man väljer ny revision så krävs att man har fyllt i ett ritningsnummer, om det

är ifyllt och det finns sedan tidigare i databasen kommer man till ett likadant formulär

där den information som ligger lagrad i databasen kommer för ifylld. Ett extra fält

finns för att skriva in vilka förändringar som gjorts från de tidigare revisionerna. Ny

revision sköts av filen new_review.php.

5.3.6 Ny ritningsförteckning

Detta är funktionen för att skapa de ritningslistor som finns för respektive maskintyp.

Här kommer man först till ett stort formulär, se figur 5, där användaren börjar fylla i

information om maskintyp, information, vilka ritningar som ska vara med och så

vidare. Detta finns i filen new_drawinglist.php. När detta är ifyllt och man trycker på

nästa laddas ett större formulär där informationen om de ritningar som ska vara med

hämtas från databasen, om ritningen är inlagd det vill säga.

(11)

11

Figur 5: Exempel på hur det kan se ut i steg 2 på skapa ritningsförteckning

Detta genereras av filen drawinglist_info, i detta stadie så kan användaren fylla i mer

information och uppdatera fälten på nytt. Man kan även välja att skapa en ny sida om

det behövs fler fält i ritningslistan. Om man trycker på ny sida så sparas alla rader i

detta formulär ner i databastabellen roundo_tempdrwlistrows. När användaren sedan

är nöjd trycker han på Klar och då lagras all information i databasen.

Huvudinformationen lagras i tabellen roundo_drawinglist och informationen för

respektive rad, även då de som lagrats temporärt, sorteras på ritningsnumret och lagras

i tabellen roundo_drawinglist_row.

5.3.7 Maskin/ritningsförteckningar

Detta är egentligen flera funktioner som kopplas samman i en händelsekedja. Det

första man kan göra är att söka efter ritningsförteckningar utifrån maskintyp, men sen

så kan man även gå in och ändra i ritningsförteckningar och skapa serier och

maskiner.

(12)

12

5.3.7.1 Söka ritningsförteckningar

Det första man möts av är ett enkelt formulär där användaren får fylla i maskintypen

man söker efter. När användaren gjort detta visas en lista över alla

ritningsförteckningar för denna maskin, se figur 6.

Figur 6: Exempel på hur sökresultatet kan se ut för sökning av ritningsförteckningar

Här ser användaren också om det finns eventuella ritningsändringar som rör

maskintypen eller en specifik ritning, detta flaggas med en liten varningstriangel.

Användaren har här möjlighet att gå in och se hela ritningsförteckningen, se figur 7,

genom att trycka på ett sidnummer. Om det är så att det är en specifik ritning som har

en ritningsförändring registrerad så ser användaren då vilken det är. Allt detta

genereras av filen machine_drawinglist.php.

Figur 7: Exempel på hur en ritningsförteckning kan se ut

5.3.7.2 Ändra ritningsförteckningar

Denna funktion kommer användaren åt genom att trycka på Ändra inne i en

ritningsförteckning, se figur 8. Om man trycker där så kommer man till sidan för att

skapa ritningsförteckningar, men man har bara möjlighet att ändra informationen och

lägga till ytterligare sidor.

(13)

13

5.3.7.3 Skapa serier och maskiner

Denna funktion kommer man till genom att trycka på Skapa serie efter det att man

sökt efter ritningsförteckningar. Man skickas då till en sida där man kan välja vilka

ritningsförteckningar som ska vara med i serien, se figur 8. Detta hanteras av filen

new_serie.php.

Figur 8: Formulär för att välja vilka ritningslistor som ska ingå i serien

Efter det så får man upp en sida där man fyller i serienummer och antal maskiner som

ska finnas i serien, se figur 9. Man får även upp en lista över alla ritningar som ingår i

ritningsförteckningarna så att man har möjlighet att välja bort vissa om de inte ska

ingå i just denna serie.

Figur 9: Formuläret där man kan välja vilka ritningar som ska ingå i en serie

När man sedan trycker på nästa så skapas serien och man får fylla i maskinnummer på

de maskiner man redan nu vill skapa, se figur 10.

(14)

14

Figur 10: Formulär för att fylla i maskinnummer i serien

När detta är gjort visas en till lista över alla ritningar som ingår i maskinen, då är

självklart inte de ritningar man eventuellt valde bort med, se figur 11.

Figur 11: Sista tabellen man ser efter att man skapat en maskin

Här har man möjlighet att trycka fram pdf-filen för respektive ritning och skriva ut i

det antal som anges.

(15)

15

5.3.8 Ritningsändringar

Detta är en funktion för att användaren ska kunna lägga in önskemål om eventuella

förändringar som behöver göras på ritningar eller maskiner. Det fungerar på så sätt att

användaren får ett formulär, se figur 12, att fylla i ritningsnummer och/eller

maskintyp, meddelande om vad som behöver ändras och vilken prioritet det har.

Figur 12: Formuläret för ritningsändringar

När användaren fyllt i informationen och tryck på registrera så läggs informationen in

i databastabellen roundo_drawingchanges. Detta sköts av filen reg_change.php.

5.3.9 Lista ändringar

Denna funktion gör det möjligt för användaren att söka efter ritningsändringar, lista de

10 som har högst prioritet eller lista alla registrerade ändringar, se figur 13. Detta sköts

av filen drawingchange.php. Det första användaren möts av är ett formulär för

sökning. När sökningen är gjord presenteras resultatet under formuläret.

Figur 13: Formulär och sökresultat för ändringar

Om användaren önskar så kan han trycka på antingen ritningsnumret eller

maskintypen för att få fram mer information om ändringen. I det läget har även man

möjlighet att behandla ändringarna och sätta eventuell åtgärd, se figur 14. Dessa

funktioner sköts av filen edit_drawingchange.php.

(16)

16

Figur 14: Exempel på hur det kan se ut när en ritningsändring är åtgärdad.

5.3.10 Hantera användare

Denna funktion är till för att skapa, ändra och ta bort användare. Den hanteras av filen

handle_users.php tillsammans med add_user.php, delete_user.php och edit_user.php.

Användaren möts av ett enkelt formulär, se figur 15, där denne väljer vad han vill göra

och vilken användarnamn det gäller. Beroende på vilken uppgift som ska utföras

anropas de olika filerna. Självklart uppdateras informationen i databastabellen

roundo_drawing.

Figur 15: Formulären för hantering av användare

5.3.11 CSS-filen

Denna fil, roundo.css, är den som styr över i stort sett allt utseende på sidan. Allt ifrån

typsnitt, var de olika fälten ska placeras, hur de olika formulären och tabellerna ska se

ut.

(17)

17

6

Resultat

6.1 Databasen

Databasens struktur och funktioner har blivit ungefär som jag hade tänkt mig från

början, dock har vissa förändringar fått tillkomma under tidens gång allt eftersom man

fått förståelse för hur Roundo hanterar orders och ritningar.

Det som man här eventuellt skulle kunna förbättra är att skapa vissa indexeringar

på vissa kolumner och tabeller för att effektivisera frågorna.

6.2 Systemet

Systemet fungerar bra, dock har jag inte fått med alla de funktioner som från början

önskades, så som att kunna söka på maskinförteckningar och att kunna skriva ut hela

maskiner med rätt antal kopior. Men det är enkelt att från sidan göra dessa utskrifter

genom att ta upp pdf-filen. Systemet har under hela arbetets gång testats av både mig

och kunden. Detta har gjorts möjligt genom att det hela tiden legat på internet.

Strukturen för systemet har inte blivit lika modulbaserad som jag tänkt från

början, men fortfarande är det ganska enkelt att lägga till och ta bort funktioner efter

behov.

6.3 Svar på frågeställningar

• Ja, man kan på ett smidigt sätt leta efter ritningar och skriva ut dessa.

• Ja, ritningsändrignar kan fångas upp av systemet och åtgärd kan läggas in.

7

Diskussion

7.1 PHP

Valet av PHP som programmeringsspråk beror på att jag tidigare jobbat en hel del

med det och känner mig hemma med dess syntax och semantik. En ytterligare

anledning är att det är ett språk som är lätt att använda och har många färdiga

komponenter och funktioner som dessutom hela tiden utvecklas. En annan väldigt stor

fördel är att det finns en väldigt bra dokumentation på internet över alla funktioner.

Nackdelar som jag upptäckte under arbetets gång var bland annat att det är svårt

att installera PHP på en server med Windows Server 2003, detta ledde till att jag fick

ägna mer tid än planerat åt att få allt att fungera på Roundos server.

Jag hade även problem (ett känt problem enligt många forum) att få

serversökvägar att fungera som planerat. Detta medförde att Roundo var tvungna att

flytta på mappen för alla ritningar så att den blev ”fysiskt” placerad på samma

hårddisk som själva hemsidan.

7.2 MySQL

Även MySQL valde jag för att jag arbetat med det tidigare och är ett enkelt och

smidigt att komma igång med. Det är även den vanligaste databashanteraren som

används för öppna projekt på internet.

Jag har egentligen inte upptäckt några direkta problem med MySQL i detta

projekt, utan det flöt på utan några direkta komplikationer. Mycket tack vare att det

finns ett enkelt webbgränssnitt, phpMyAdmin, för att skapa och modifiera databaser

och tabeller.

(18)

18

7.3 Systemet

Utvecklingen av systemet har fungerat bra, jag har under arbetets gång haft bra

kontakt med företaget där jag fått mycket och bra respons.

Eftersom jag inte kunnat befinna mig på företaget under hela utvecklingen har

jag istället utvecklat systemet mot en hemsida. Tack vare detta har jag haft möjlighet

att jobba oavsett var jag har befunnit mig, så länge jag haft tillgång till internet. Detta

har också medfört att min kontaktperson på företaget kunnat testa funktionerna allt

eftersom de blivit klara och då komma med feedback.

Självklart har man under utvecklingens gång stött på vissa problem, ett av

problemen var att få PHP att fungera i Windows Server 2003. Men efter en del

efterforskningar på internet hittade jag hjälp för att få allt att fungera [7].

En av de största utmaningarna i utvecklingen har varit att sätta sig in i hur

Roundo hanterar sina ritningar, förteckningar och orders. Det har varit mycket

bollande fram och tillbaka för att få all data representerad och lagrad på rätt sätt.

När det gäller systemets struktur så känner jag att det skulle finnas mer att önska.

Nu i efterhand har jag upptäckt att det hade funnits snyggare och förmodligen

effektivare sätt att bygga upp systemet. En önskan hade varit att det skulle varit mer

modulbyggt och på så sätt lättare att implementera fler funktioner i efterhand.

7.4 Framtida utveckling

Under utvecklingens gång har jag upptäckt flera saker som man skulle kunna utveckla

vidare för att få ett ännu mer komplett system:

• Lägga in funktioner för att hantera alla typer av orders.

• Koppla orders till maskinnummer och även kunna skriva ut dessa på önskat

sett.

• Få möjligheten att skriva ut hela maskiner, serier eller orders direkt i de

antal som önskas att fungera.

• Söka bland standardkomponenter, så som muttrar, skruvar och lager, som

Roundo inte själva tillverkar utan beställer.

• Möjlighet att skicka iväg ritningsfiler som epost till kunder och tillverkare

direkt i systemet.

• Möjlighet att skicka e-post till ansvarig konstruktör om man behöver en pdf

på en ritning eller någon ritningsändring.

• Möjlighet att lägga in lagersaldon och koppla ihop systemet med Pyramid

ekonomisystem.

8

Slutsatser

Detta examensarbete har resulterat i ett system som jag anser kan förenkla väldigt

mycket för kunden. Tack vare detta kan de spara mycket tid och arbete genom att de

inte behöver leta i pärmar och lådor efter ritningar och förteckningar. Även att skapa

ritningsförteckningar förenklas tack vare att information kan hämtas från andra

tabeller och således bara behöver skrivas en gång. Systemet uppfyller

kravspecifikationen och kunden har ett system som är redo att användas.

Dessvärre lyckades jag inte att lösa problemet med utskrifter direkt från systemet

utan att man ska behöva öppna pdf filerna. Men detta är något som jag tänker fortsätta

forska i för att förhoppningsvis komma på en bra lösning som kan implementeras i

efterhand.

För att sammanfatta examensarbetet så känner jag att det blivit ett bra resultat,

men att det finns mycket mer man hade kunnat göra, för att förenkla ännu mer för

kunden, om bara tid hade funnits.

(19)

19

Referenser

[6] PHP 5 och MySql Handboken, Jörgen Overgaard, Pagina Förlags AB, 2004,

ISBN: 91-636-0801-4

Webbreferenser

[1]

http://sv.wikipedia.org/wiki/PHP

, 2008-05-30

[2]

http://sv.wikipedia.org/wiki/MySQL

, 2008-05-30

[3]

http://sv.wikipedia.org/wiki/Cascading_Style_Sheets

, 2008-05-30

[4]

http://sv.wikipedia.org/wiki/XHTML

, 2008-05-30

[5]

http://www.w3.org/

, 2008-05-30

[7]

http://www.peterguy.com/php/install_IIS6.html

, 2008-05-30

(20)

20

Bilaga A: Databasen

Figur A1: Databasens tabeller och relationer

Tabell A1: roundo_drawings

Namn

Datatyp

Beskrivning

drawingID

varchar(10) Ritningsnummer, t.ex. 45911A

CPK

review

char(1)

Revision, t.ex. A

machinetype

varchar(15) Maskintyp, t.ex. R-16-S

designation

varchar(127) Benämning av vad ritningen är, t.ex.

Standardkomponenter

designation2

varchar(127) Benämning 2

observation

varchar(127) Anmärkning

drawed_by

char(3)

Vem som ritat ritningen

date

date

Datum när ritningen är ritad

changes

varchar(127) Eventuella ändringar från tidigare revisioner

replaces

varchar(10) Eventuellt ritningsnummer på ritning som

denna ritning ersätter

replaced_by

varchar(10) Eventuellt ritningsnummer som denna ritning

är ersatt av

assy

char(1)

T om det är en sammansättning av flera

ritningar, annars F

Huvudtabell för att lagra information om ritningarna.

Tabell A2: roundo_drawinglist

Namn

Datatyp

Beskrivning

PK drawinglistID

int(10)

Ett unikt nummer som skapas för respektive

ritningslista

review

char(1)

Revision

page

int(11)

Sidnummer

machinetype

varchar(15) Maskintyp

info

varchar(127) Information om vilken del av en maskin som

ritningslistan beskriver

date

date

Datum då ritningslistan skapades

Tabell innehållande huvudinformationen om en ritningslista.

Tabell A3: roundo_drawinglist_row

(21)

21

PK drawinglist_rowID int(11)

Ett unikt nummer som skapas för respektive

ritningslistrad

FK drawingID

varchar(10) Ritningsnummer, koppas till tabellen

roundo_drawings

pos

varchar(5)

Position på ritningen

FK drawinglistID

int(11)

Ritningslistid, kopplas till tabellen

roundo_drawinglist

stm

char(3)

Antal eller längd

observation

varchar(127) Anmärkning

Tabell som representerar varje rad som en ritningslista innehåller.

Tabell A4: roundo_temp_drwlistrows

Namn

Datatyp

Beskrivning

PK id

int(11)

Unikt nummer som skapas för varje rad

drwID

varchar(10) Ritningsnummer

pos

varchar(5)

Position

stm

char(3)

Antal eller längd

observation

varchar(127) Anmärkning

Tabell som temporärt lagrar bara temporärt innan informationen lagras i

roundo_drawinglist_row.

Tabell A5: roundo_series

Namn

Datatyp

Beskrivning

series

varchar(4)

Serienummer

quantity

int(2)

Antal maskiner som kan ingå i serien

CPK

number

int(2)

Löpnummer

Tabell som lagrar alla serier, skapas en rad för varje löpnummer.

Tabell A6: roundo_machine

Namn

Datatyp

Beskrivning

PK machineID

varchar(6)

Unikt maskinnummer som identifierar en

specifik maskin

FK series

varchar(4)

Serienummer, kopplas till tabellen

roundo_series

FK quantity

int(2)

Antal maskiner som finns i ovannämnda serie,

kopplas till tabellen roundo_series

FK number

int(2)

Löpnummer, kopplas till tabellen roundo_series

Tabell som lagrar maskinnummer och vilken serie maskinen hör till.

(22)

22

Tabell A7: roundo_machinelist

Namn

Datatyp

Beskrivning

drawinglist_rowID int(10)

Ritningslistradsnummer, både primärnyckel

och främmande nyckel, kopplas till tabellen

roundo_drawinglist_row

series

varchar(4)

Serienummer, både primärnyckel och

främmande nyckel, kopplas till tabellen

roundo_series

CPK,

FK

number

int(2)

Löpnummer, både primärnyckel och

främmande nyckel, kopplas till tabellen

roundo_series

Tabell som lagrar information om vilka ritningar som ingår i en viss maskin eller serie.

Tabell A8: roundo_drawingchanges

Namn

Typ

Beskrivning

PK drawingchangesID int(10)

Unikt nummer som skapas för varje

ritningsändring

FK drawingID

varchar(15)

Ritningsnummer, kopplas till tabellen

roundo_drawings

FK machinetype

varchar(15)

Maskintyp, kopplas till tabellen

roundo_drawinglist

message

varchar(255) Meddelande från personen som lagt till

ritningsändringen

prio

char(1)

Vilken prioritet ändringen har, 1 högst

sender

varchar(50)

Avsändare

messagedate

date

Datum när ändringen skapades

measure

varchar(255) Åtgärd

attended_by

varchar(50)

Vem som åtgärdat

attended_date

date

Datum för åtgärd

measured

char(1)

T om det är åtgärdad, annars F

Tabell med all nödvändig information om de ritningsändringar som ska göras eller har gjorts.

Tabell A9: roundo_users

Namn

Datatyp

Beskrivning

PK userID

int(10)

Unikt nummer för alla användare

username

varchar(15) Användarnamn

name

varchar(50) För och efternamn

auth

char(1)

Vilken behörighet användaren har

(23)

23

Tabell A10: roundo_menus

Namn

Datatyp

Beskrivning

PK menu_ID

mediumint(9) Unikt nummer som skapas för varje

menyelement

menu_title

varchar(100) Titel, den text som ska synas som länk

menu_description text

Beskrivning, den text som syns när man håller

över länken

menu_status

char(1)

Status, anger om menyelementet skall vara

aktivt eller inte

menu_URL

varchar(255) URL, sökväg, adress dit länken ska leda

menu_order

mediumint(9) Ordning, anger i vilken ordning

menyelementen skall visas

menu_auth

char(1)

Behörighet, anger vilken behörighet som krävs

av användaren för att menyelementet skall

vara synligt

(24)

24

Bilaga B: Källkod

Källkoden kan fås digitalt på begäran via e-post. All PHP-kod är har röd text och alla

kommentarer har grön text.

index.php

<?php

/**

* index.php *

* Generates the mainpage for the system *

* @author Emil Abrahamsson <emil@gavle.to> */ /* Starts buffering */ ob_start(); /* Starts session */ session_start(); /* Includes dbfunc.php */ include('dbfunc/dbfunc.php'); /* Starts databaseconnection */ $dbh=startDBConnection(); ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<link href="css/roundo.css" rel="stylesheet" type="text/css" /> <title>ROUNDO</title> </head> <body> <div class="container"> <div class="header"> <table width="100%"> <tr> <td><a href="http://intranet/">INTRANÄT</a></td> <td><a href="http://www.roundo.com/">INTERNET</a></td> <td><a href="index.php">RITNINGSARKIV</a></td> </tr> </table> </div> <div class="left"> <?php echo(generateMenu($dbh)); ?> </div> <div class="content"> <?php if($_SESSION['online'] || isset($_REQUEST['page'])){ if(isset($_REQUEST['page'])) require_once('pages/'.$_REQUEST['page'].'.php'); else require_once('pages/inside.php'); }else require_once('pages/start.php'); ?> </div> <div class="footer"> <table width="100%"> <tr>

<td>Sidan är skapad av: Emil Abrahamsson</td> </tr> </table> </div> </div> </body> </html>

(25)

25

dbfunc.php

<?php /** * dbfunc.php *

* Contains some function comunication with the database *

* @author Emil Abrahamsson <emil@gavle.to> */

/* Includes the settings */

include("settings.php");

/**

* startDBConnection() *

* Connects to the database with the settings gotten from settings.php *

* @return pointer to the database */

function startDBConnection() {

$dbh = @mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);

@mysql_select_db(DB_NAME, $dbh) or die("Could not connect to database"); return $dbh;

}

/**

* stopDBConnection($dbh) *

* Stops the databaseconnection that comes as parameter *

* @param $dbh pointer to the database */ function stopDBConnection($dbh) { @mysql_close($dbh); } /** * generateMenu($dbh) *

* Genterates the HTML code needed to show the menu. * All information is retrieved from the database. *

* @param $dbh pointer to the database

* @return String the HTML code needed to show the menu */

function generateMenu($dbh){ $buffer='';

if(!isset($_SESSION['online'])){

$sql='SELECT * FROM '.TABLE_PREFIX.'menus WHERE menu_status="A" AND menu_auth>=4 ORDER BY menu_order'; $result=@mysql_query($sql,$dbh); if($result){ while($row=@mysql_fetch_array($result, MYSQL_ASSOC)){ $buffer.=' <div class="menu">

<a href="'.$row["menu_URL"].' "title="'.$row['menu_description'].'" class="menu">'.$row["menu_title"].'</a>

</div> '; } }else{

$buffer.='<div class="menu"><b>Query failed</b></div>'; }

}else{

$sql='SELECT * FROM '.TABLE_PREFIX.'menus WHERE menu_status="A" AND menu_auth>='.$_SESSION['auth'].' ORDER BY menu_order';

$result=@mysql_query($sql,$dbh); if($result){ while($row=@mysql_fetch_array($result, MYSQL_ASSOC)){

(26)

26

$buffer.=' <div class="menu"><a href="'.$row["menu_URL"].'"title="'.$row['menu_description'].'"class="menu">'.$row["menu_title "].'</a></div> '; } }else{

$buffer.='<div class="menu"><b>Query failed</b></div>'; } } return $buffer; } ?>

settings.php

<?php /** * settings.php *

* Contains some settings for the system *

* @author Emil Abrahamsson <emil@gavle.to> */ /* Database username */ define("DB_USER", "root"); /* Database password */ define("DB_PASSWORD", "Emil"); /* Database host */ define("DB_HOST", "localhost"); /* Database name */ define("DB_NAME", "ritningsarkiv");

/* Prefix for all tables in database */

define("TABLE_PREFIX", "roundo_");

/* Path to all drawings */

define("DRW_PATH","/draings/pdf/"); ?>

roundo.css

@charset "utf-8"; A:link{ color: #b22e1e; font-weight: bold; text-decoration: none; } A:active{ color: #b22e1e; font-weight: bold; text-decoration: none; } A:visited { color: #b22e1e; font-weight: bold; text-decoration: none; } A:hover { color: #999999; font-weight: bold; text-decoration: none; }

(27)

27

div.container{ background-image: url(/images/background.jpg); background-repeat:no-repeat; margin:0px auto; width:920px; height:670px; line-height:150%; } div.header{ font-family:Verdana, sans-serif; font-size:18px; text-align:left; line-height:35px; position:absolute; float:left; width:680px; height:50px; margin-left:10px; padding:1em; } div.left{ position:absolute; text-align:center; width:88px; height:265px; margin-left:10px; margin-top:156px; padding:1em; } div.content{ position:absolute; margin-left:150px; margin-top:156px; width:710px; height:425px; padding:1em; float:left; overflow:scroll; } div.footer{

font-family:Verdana, Arial, Helvetica, sans-serif; font-size:9px; color:#666666; position:absolute; margin-top:615px; margin-left:10px; width:900px; top: 34px; float:left; } .menu{

font-family: Verdana, sans-serif; font-size: 10px; text-align:center; color: #000000; line-height: 12px; padding-bottom:0.5em; padding-top:0.5em; } label{ margin-right: 0.5em; display: block; }

input, select, textarea{ color: #781351;

background: #fee3ad; border: 1px solid #781351;

font-family: Verdana, sans-serif; font-size:10px; } fieldset{ border: 1px solid #781351; width:480px; }

(28)

28

fieldset.signin{ border: 1px solid #783151; width: 260px; height:80px; } legend{ color: #b22e1e; font-weight:700; background: #fec337; border: 1px solid #781351; padding: 2px 6px; } .text{

font-family: Verdana, sans-serif; font-size: 10px; text-align:justify; color: #000000; line-height: 20px; } .error{

font-family: Verdana, sans-serif; font-size: 12px; font-weight:800; text-align:justify; color:#FF0000; line-height: 20px; } table.result{ font-family:Verdana, sans-serif; font-size:10px; text-align:center; color:#000000; line-height:15px; width:710px; table-layout:auto; border-collapse:collapse; } table.drwlist{ font-family:Verdana, sans-serif; font-size:10px; text-align:center; color:#000000; line-height:15px; table-layout:auto; border-collapse:collapse; } table.drawingchange{ font-family:Verdana, sans-serif; font-size:10px; text-align:left; color:#000000; background-color:#FFFFFF; line-height:18px; table-layout:auto; border-collapse:collapse; text-indent:3px; } .machinetype{ font-family:Verdana, sans-serif; font-size:16px; font-weight:bold; color:#000000; line-height:20px; } .info{ font-family:Verdana, sans-serif; font-size:14px; color:#000000; line-height:20px; }

(29)

29

add_drawing.php

<?php /** * add_drawing.php *

* Generates a form where the user can fill in information about a drawing. * When the user presses "Lägg till" the drawinginformation will be inserted * into the databasetable drawings.

*

* @author Emil Abrahamsson <emil@gavle.to> */ $drawingID=ereg_replace("[^A-Za-z0-9]", "", $_REQUEST['drawingID']); if($_REQUEST['new_review']){ if($drawingID!=''){ require_once('pages/new_review.php'); return; }else{

echo('<div class="error">Du har inte angivit något ritningsnummer!</div><br />'); }

}

if($_REQUEST['save']){

if($_REQUEST['drawingID']!='' && $_REQUEST['review']!=''){

$sql = 'INSERT INTO '.TABLE_PREFIX.'drawings (drawingID, review, machinetype,

designation, designation2, observation, drawed_by, date, replaces, replaced_by, assy) VALUES ("'.$drawingID.'", "'.$_REQUEST['review'].'", "'.$_REQUEST['machinetype'].'",

"'.$_REQUEST['designation'].'", "'.$_REQUEST['designation2'].'",

"'.$_REQUEST['observation'].'", "'.$_REQUEST['drawed_by'].'", "'.$_REQUEST['date'].'", "'.$_REQUEST['replaces'].'", "'.$_REQUEST['replaced_by'].'", "'.$_REQUEST['assy'].'")'; $result=@mysql_query($sql,$dbh);

if($result){

echo('<div class="text">Ins&auml;ttningen lyckades!</div>'); return;

}else{

echo('<div class="error">Ins&auml;ttningen misslyckades!</div><br />');

} }else{

echo('<div class="error">Du har inte angivit både ritningsnummer och revision!</div>');

} } ?>

<div class="text">

<form id="add_drawing" name="add_drawing" action="index.php" method="post"> <input type="hidden" name="page" id="page" value="add_drawing" />

<fieldset style="height:210px;width:510px;"> <legend>L&auml;gg till ritning</legend> <table width="470">

<tr>

<td><label for="drawingID">Ritningsnummer:</label></td>

<td width="91"><input type="text" name="drawingID" id="drawingID" size="10" value="<?php echo($drawingID); ?>" /></td>

<td width="67" align="right"><label for="review">Revision:</label></td>

<td width="98"><input type="text" name="review" id="review" size="2" value="<?php if($_REQUEST['review']) echo($_REQUEST['review']); else echo('A'); ?>" /></td>

<td width="90" align="right"><label for="machinetype">Maskintyp:</label></td> <td width="122" align="right"><input type="text" name="machinetype" id="machinetype" size="15" value="<?php echo($_REQUEST['machinetype']); ?>" /></td>

</tr> <tr>

<td width="109"><label for="designation">Ben&auml;mning:</label></td>

<td colspan="5"><input type="text" name="designation" id="designation" size="60" value="<?php echo($_REQUEST['designation']); ?>" /></td>

</tr> <tr>

<td width="109"><label for="designation2">Ben&auml;mning 2:</label></td>

<td colspan="5"><input type="text" name="designation2" id="designation2" size="60" value="<?php echo($_REQUEST['designation2']); ?>" /></td>

</tr> <tr>

(30)

30

<td colspan="5"><input type="text" name="observation" id="observation" size="60" value="<?php echo($_REQUEST['observation']); ?>" /></td>

</tr> <tr>

<td width="109"><label for="drawed_by">Ritad av:</label></td>

<td><input type="text" name="drawed_by" id="drawed_by" size="3" value="<?php echo($_REQUEST['drawed_by']); ?>" /></td>

<td align="right"><label for="date">Datum:</label></td>

<td><input type="text" name="date" id="date" size="12" value="<?php if($_REQUEST['date']) echo($_REQUEST['date']); else echo(date('Y-m-d')); ?>" /></td>

<td align="right"><label for="replaces">Ers&auml;tter:</label></td>

<td><input type="text" name="replaces" id="replaces" size="15" value="<?php echo($_REQUEST['replaces']); ?>" /></td>

</tr> <tr>

<td><label for="assy">Sammanst&auml;llning:</label></td> <td>

<select name="assy" id="assy">

<option value="T">Ja</option> <option value="F" selected="selected">Nej</option> </select>

</td>

<td>&nbsp;</td> <td>&nbsp;</td>

<td align="right"><label for="replaced_by">Ersatt av:</label></td>

<td><input type="text" name="replaced_by" id="replaced_by" size="15" value="<?php echo($_REQUEST['replaced_by']); ?>" /></td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td>

<td><input type="submit" name="new_review" id="new_review" value="Ny revision" /></td> <td>&nbsp;</td>

<td align="right"><input type="submit" name="save" id="save" value="L&auml;gg till" /></td> </tr> </table> </fieldset> </form> </div>

add_user.php

<?php /** * add_user.php *

* Generates a form where the administrator can fill in information about a new user. * When "Spara" is pressed, the information will be inserted into the databasetable users. *

* @author Emil Abrahamsson <emil@gavle.to> */

if($_REQUEST['save']){ $ok=1;

$sql='SELECT username FROM '.TABLE_PREFIX.'users'; $result=@mysql_query($sql,$dbh); if($result){ while($row=@mysql_fetch_array($result,MYSQL_ASSOC)){ if($row['username']==$_REQUEST['username']) $ok=0; } } if($ok){

$sql='INSERT INTO roundo_users (username,name,auth) VALUES

("'.$_REQUEST['username'].'","'.$_REQUEST['name'].'",'.$_REQUEST['auth'].')';

$result=@mysql_query($sql,$dbh); if($result){

echo('<div class="text">Ins&auml;ttningen lyckades</div>'); return;

}else{

echo('<div class="text">Ins&auml;ttningen misslyckades</div>'); return;

(31)

31

}else

echo('<div class="text">Anv&auml;ndarnamnet anv&auml;nds redan!</div><br />');

} ?>

<div class="text">

<form id="add_user" name="add_user" action="index.php" method="post"> <input type="hidden" name="page" id="page" value="add_user" />

<fieldset style="height:60px; width:640px;"> <legend>Fyll i informationen</legend> <table width="350">

<tr>

<td><label for="username">Anv&auml;ndarnamn:</label></td>

<td><input type="text" name="username" id="username" size="15" value="<?php echo($_REQUEST['username']) ?>" /></td>

<td><label for="name">Namn:</label></td>

<td><input type="text" name="name" id="name" size="50" /></td> <td>

<select name="auth" id="auth">

<option value="1">Admin</option> <option value="2">Kostr</option> <option value="3" selected="selected">&Ouml;vriga</option> </select>

</td>

<td><input type="submit" name="save" id="save" value="Spara" /></td> </tr> </table> </fieldset> </form> </div>

create_drawing.php

<?php /** * create_drawing.php *

* Genereates the form where the user selects what size/type of drawing * to create. When "Nästa" is pressed the file new_drawing will be launched. *

* @author Emil Abrahamsson <emil@gavle.to> */

?>

<div class="text">

<form name="create_drawing" id="create_drawing" action="index.php" method="post"> <input type="hidden" name="page" id="page" value="new_drawing" />

<fieldset style="width:200px">

<legend>V&auml;lj typ storlek:</legend> <table>

<tr>

<td><input type="radio" name="type" id="type" value="1" /></td> <td><label for="1">1</label></td>

<td><input type="radio" name="type" id="type" value="2" /></td> <td><label for="2">2</label></td>

<td><input type="radio" name="type" id="type" value="3" /></td> <td><label for="3">3</label></td>

<td><input type="radio" name="type" id="type" value="4" /></td> <td><label for="4">4</label></td>

</tr> <tr>

<td><input type="radio" name="type" id="type" value="I1" /></td> <td><label for="I1">I-1</label></td>

<td><input type="radio" name="type" id="type" value="I2" /></td> <td><label for="I2">I-2</label></td>

<td><input type="radio" name="type" id="type" value="I3" /></td> <td><label for="I3">I-3</label></td>

<td><input type="radio" name="type" id="type" value="I4" /></td> <td><label for="I4">I-4</label></td>

</tr> <tr>

<td><input type="radio" name="type" id="type" value="SK" /></td> <td><label for="SK">SK</label></td>

</tr>

Figure

Figur 1: Första skiss av systemstruktur
Figur 2: Sökformuläret för sök ritningsfunktionen
Figur 4: Formulär för att skapa ritning
Figur 5: Exempel på hur det kan se ut i steg 2 på skapa ritningsförteckning  Detta genereras av filen drawinglist_info, i detta stadie så kan användaren fylla i mer  information och uppdatera fälten på nytt
+7

References

Related documents

Om du/ditt barn tidigare infekterats med hepatit A eller B virus (även om du/ditt barn inte känner dig/sig dålig ännu) innan du/ditt barn får båda doserna med Ambirix, kanske

Amlodipin och valsartan som finns i Amlodipin/Valsartan Krka kan också vara godkända för att behandla andra sjukdomar som inte nämns i denna produktinformation.. Fråga läkare,

Exforge rekommenderas inte vid amning och din läkare kan välja en annan behandling till dig om du vill amma ditt barn, särskilt om ditt barn är nyfött eller föddes för

Tala om för läkaren om du drabbas av ovanligt snabba eller bankande hjärtslag, om du har hjärtrytmproblem, eller om du använder läkemedel som man vet kan orsaka

 om du eller någon nära släkting har eller har haft trombos (i benet, lungorna eller någon annanstans i kroppen), hjärtattack eller stroke i ung ålder; eller om du eller

 Tala om för läkare eller apotekspersonal om du tar eller nyligen har tagit eller kan tänkas ta andra läkemedel..  Om du använder andra läkemedel kan din läkare behöva

Om några biverkningar blir värre eller om du märker några biverkningar som inte nämns i denna information, kontakta omedelbart läkare eller dialysmottagning. Hur Physioneal 35

För att undvika eventuell hudirritation i hårbotten bör du se till att all Roquinna tvättats bort från hår och hårbotten innan denna typ av kemikalier används.. Du bör också tala