30. april 2005 - 12:30Der er
15 kommentarer og 1 løsning
Opdeling af DB
Jeg ønsker at lave en kundeDB inkl. beskrivelse af kundernes anlæg (ialt ca. 150stk). Jeg har allerede en kundeDB med ID (autonum), Firmanavn, adresse, postby, tlf, kontaktpers, lokalnr, email, samt en del ja/nej felter. I første omgang ønsker jeg at opdele DB'en i følgende 4 tabeller: Tabel 1 (Firma): ID, Firmanavn Tabel 2 (Afdeling): AfdID, Afdeling, adresse, postby, tlf, + andre ting der vedrører afdelingen Tabel 3 (Kontakt): Kontaktpers, lokalnr, email, stilling, osv. Tabel 4: Postnr, Bynavn
Vil dette være praktisk? Og hvordan gøres det evt.?
Det skal lige bemærkes at det er en eksisterende db, med ca. 150 poster.
Jeg ville umiddelbart anbefale dig, at sætte dig ind i normalisering af databaser. Den bør som udgangspunkt være på den såkaldte 3. NormalForm.
Som udgangspunkt bør du samle de felter, som du er helt sikre på _skal_ udfyldes. Dem er der ingen grund til at splitte op. Derudover skal du sørge for, at der ikke er redundans (at samme data står i tabellen flere gange). Dette kan du (som du helt rigtigt har gjort), fikse ved fx at dele postnummer og bynavn ud i en separat tabel. Dermed kan du bruge postnummeret som FOREIGN-key i de andre tabeller.
Du er ved at lave 1-1 relationer mellem information som hører til samme enhed. Hvis der til alle (eller næsten alle) dine firmaer er information om afdeling,afdelingsadrese,postby osv er der ingen grund til at opdele det i flere tabeller. De tilfælde hvor det er hensigtsmæssigt at lave 1-1 relationer kan f.eks. være hvis dine kunder falder i nogle store kategorier, hvor du registrer noget bestemt information om alle firmaerne (f.eks. navn, adresse, telefon osv.), og så har noget information, som kun hører til bestemte grupper. Så kan du, for ikke at få for mange tomme felter i firmatabellen, nøjes ved at gemme fællesinformationen her og lave en tabel til resten af informationen. Det ser dog ikke ud til at være tilfældet for dig, hvor du bør holde det i samme tabel. Hvis du derimod skal til at registrere ordrer, samtale, ansatte i firmaerne eller lignende skal det selvfølgelig i andre tabeller.
Grunden til at jeg ville dele den op i flere tabeller var, at jeg har flere firmaer, som har flere afdelinger (men samme "hovednavn"). F.eks. en bank. I hver afdeling kan der så være 1 eller flere kontaktpersoner.
Databasen skal senere (når dette er på plads) udbygges med dokumentation over firmaernes telefonanlæg. Hvordan dette skal bygges op, har jeg ikke helt på plads endnu, men det vil være specifikt for hver afdeling. Derfor opdelingen allerede nu.
Webcreator> jeg vil prøve at kigge på normalisering. Jeg har kun erfaring i at lave små simple databaser som f.eks. medlemskartoteker og adressedatabaser.
Som udgangspunkt skal du bare sørge for disse to ting : 1) Hvis felter ikke SKAL udfyldes, så placeres de i egne tabeller 2) Der må ikke opstå redundant data
Hvis du følger disse regler, så er du godt rustet :)
Ok! Men så tilbage til spørgsmålet: Hvordan opdeler jeg så den eksisterende DB i de tabeller jeg skal bruge?
Jeg mener der findes noget der hedder en "tabeloprettelsesforespørgsel" (Pyh det var et langt ord). Men jeg ved ikke helt hvordan den fungerer? Kan nogen hjælpe?
Du får brug for et par linktabeller tblfirmafd m. flg. felter ID,afdID (en en-til mange relation fra firma til afdeling) og evt en anden linktabel tblafdkontakt d.v.d. du får behov for et kontaktid. Personligt ville jeg foretrække at dele databasen op i en kopi af databasen og når jeg har fået det til at fungere arbejde videre med kopien
Jeg ka' sq ikke hitte ud af det, så jeg starter lige forfra: Har en DB med 1 tabel (Kundedatabase) med følgende felter: Id (Autonum) (Primær Nøgle) Navn (Tekst) Adresse (Tekst) PostBy (Tekst) Kontaktperson (Tekst) Hovednummer (Tal) Lokalnr (Tal) mail (Tekst) samt en del ja/nej afkrydsningsfelter. Nu vil jeg gerne have det delt så Kundedatabase indeholder: Id og Navn. Og så en ny tabel (Afdeling), der indeholder resten. Til at gøre dette har jeg lavet en tabeloprettelsesforespørgsel (Forespørgsler, Ny, Designvisning, valgt tabellen Kundedatabase, valgt tabeloprettelsesforespørgsel, flyttet de felter jeg vil have overført, ned i "gitteret", og så kørt forespørgslen. Det gik fint, og jeg har fået oprettet tabellen Afdeling, med de data i, jeg ønsker. Derefter oprettede jeg et felt i Afdeling, AfdId som autonummerering og primær nøgle, samt et felt Id (Tal), hvor jeg har lavet en en-til-mange relation fra Kundedatabase Id til Afdeling Id. Går jeg ind i tabellen Afdeling (i dataarkvisning) står alle data der lige så fint. Dog med undtagelse af feltet Id, som er tomt(!). Men går jeg ind i Kundedatabase i dataarkvisning, står alle mine "gamle" data der, med et + ud for hver post. Klikker jeg på + åbner det en post fra Afdeling, som er tom(!) hele vejen hen i alle felter. Hvorfor? Hvad er det jeg gør galt? Jeg synes jeg gør det hele efter bogen. Men det gør jeg selvfølgelig ikke, for så havde det jo virket ;-( Håber ikke det var for lang en smøre, men hellere en forklaring for meget, end en for lidt, ikk'?
Ok, lad mig se om jeg har forstået det rigtigt. Som jeg har forstået det er der nu lige mange poster i begge tabeller "kundedatabase" og "afdelinger"? Hvis ikke vil nedenstående formentlig ikke virke ellers måske .. -- (tag en backup af databasen først :-) Du har rigtig nok oprettet feltet id i afdelingstabellen, hvorfra du har lavet en relation til hovedtabellen, kundedatabase. Den relation kan godt oprettes selv om felterne er tomme og at de er tomme er også årsagen til at intet kommer frem når du klikker på krydset i tabellen "kundedatabase".
Det du mangler er at alle ID'er fra posterne i tabellen "kundedatabase" skal overføres til tabellen "afdelinger". Du kan faktisk gøres det ved at kopiere hele kolonnen fra kundedatabase og sætte den ind i afdelinger. Hvis du åbner kundedatabase OG noterer dig sorteringsrækkefølgen (den skal være den samme i "afdelinger" om et øjeblik). Så markerer du hele kolonnen "id" som indeholder de unikke id'er i kundedatabase. Gå så ind i "afdelinger" OG SØRG FOR AT SIKRE DIG at "afdelinger" er sorteret på samme måde (det er den formentlig da du lavede den med en forespørgsel). Marker dit id-felt i "afdelinger" som udgør relationsfeltet til "kundedatabase" og som er tomt i øjeblikket, højreklik og sæt ind. Så skulle du kunne kopiere en hel kolonne fra kundedatabase til afdelinger. Som jeg har forstået problemet skulle dette løse det og relationen skulle være der og noget skal vise sig når du trykker på krydset i "kundedatabase".
jesperfjoelner > Det var jo lige det der skulle til ;-D
Jeg opdagede, at jeg havde glemt at tage Id feltet med over, og først oprettet det bagefter - og så sker der selvfølgelig ikke noget.
Lige et lille spørgsmål (og så er der points): Mine ja/nej felter, der før var Afkrydsningsfelter, er nu lavet om til felter med 0 og -1. Kan man nemt lave det tilbage til afkrydsningsfelter, eller skal jeg lave nye i mine formularer??
Det skulle kunne konverteres frem og tilbage uden problemer. Hvis du f.eks. har en række 0 og -1 i en tabelkolonne og konverterer den tilbage til et ja/nej-felt volder det ingen problemer. True/False eller Ja/Nej-værdier håndteres internt af Access som 0 og -1. Du kan også lade tabellen være som den er med 0/-1 og så lave afkrydsningsfelter på din formular. Hvis du krydser af i et afkrydsningsfelt på en formular vil der stå -1 i tabellen, da -1 er lig med True/Ja i Access. Afkrydsningsfelter (ja/nej-felter) i tabellerne er mest for syns skyld. I virkeligheden lagres 0 og -1. Hvis du i tabeldesign går ind på dit ja/nej felt og nederst i egenskaberne går ind på fanen "opslag/lookup" kan du selv vælge om feltet skal vises som et afkrydsningsfelt eller et tekstfelt (med 0 og -1). Håber det virker.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.