Avatar billede 49jensen Nybegynder
25. juli 2009 - 17:49 Der er 17 kommentarer og
1 løsning

Angive en serie numre med første og sidste nummer.

Jeg ønsker at skrive en serie numre med første og sidste nummer, f.eks. 45,46,47,48 som 45-48, numrene kommer til at ligge i en tabel, hvor der senere skal søges i. Hvis jeg f.eks. senere søger på 47 skal posten hvor 45-48 er blive markeret. Er det muligt og hvordan gøres det.
Avatar billede jpvj Nybegynder
25. juli 2009 - 21:25 #1
Hej,

Lad os starte med databasen. Du ønsker at gemme forskellige datatyper (heltal og "interval"). Dette kan ikke lade sig gøre, med mindre du laver din datatype som en streng og så bliver dine søgninger ikke særligt lette.

Hvis du skal udnytte DBMS muligheder for sørninger bliver du nødt til at udnytte de datatyper (f.eks. heltal) som er supporteret.

For at lave design og kodning enkel, foreslår jeg et meget enkelt design, der er let at forstå. Kort sagt skal du tænke på alle dine værdier som intervaller fra "A" til "B". Hvis du kun har 1 tal (eks. 42) er intervallet 42-42 og I selve databasen bliver der dog kun gemt en værdi for "A" da "B" jo har samme værdi og derfor unødvendig at gemme.

Din database skal så indeholde 2 kolonner til hhv. startværdi (A) og slutværdi (B). Jeg tilføjer også en id kolonne, som du kan bruge, hvis du skal referere til en værdi eller et interval fra en anden tabel.

CREATE TABLE tablename (
  id COUNTER NOT NULL PRIMARY KEY,
  A INTEGER NOT NULL,
  B INTEGER
)

Lad os indsætte nogle tal: 41,43,45-49,60

INSERT INTO tablename (A) VALUES (41)
INSERT INTO tablename (A) VALUES (43)
INSERT INTO tablename (A,B) VALUES (45,49)
INSERT INTO tablename (A) VALUES (60)

Tabellen ser nu således ud:

id | A  | B 
1  | 41 | null
2  | 43 | null
3  | 45 | 49
4  | 60 | null

Hvis du vil søge efter et tal gøres det således:

Find 43:
SELECT * FROM tablename WHERE (A = 43) OR (A <= 43 AND 43 <= B)
Hvilket returnerer:
id | A  | B 
3  | 43 | NULL

Da B er NULL ved du at du blot har fundet et tal og ikke et interval og du skal udskrive værdien A.

Find 47:
SELECT * FROM tablename WHERE (A = 47) OR (A <= 47 AND 47 <= B)
Hvilket returnerer:
id | A  | B 
3  | 45 | 49

Da B ikke er NULL (den har værdien 49) ved du at det er et interval og du kan så formattere dit output som A-B.

Håber det kan bruges som inspiration.
Avatar billede 49jensen Nybegynder
25. juli 2009 - 21:55 #2
Jeg kan ikke bruge heltal da mine "numre" er alfanummeriske, det glemte jeg at anskueliggøre. Et nummer kan f.eks. se således ud "172S80455" og det kan jeg ikke ændre på.
Avatar billede 49jensen Nybegynder
25. juli 2009 - 22:12 #3
En serie numre kan være 172S80455,172S80456, 172S80457.
Avatar billede Slettet bruger
25. juli 2009 - 22:15 #4
hvordan udvælger du dem?

har du tænkt dig at skrive det i et felt eller hvordan?~)
Avatar billede Slettet bruger
25. juli 2009 - 22:21 #5
du kunne jo f.eks. bare have et FraFelt og et TilFelt, som du kan bruge til dit kriterie og så lave en tilføjelsesforespørgsel, som tilføjede FraFelt & "-" & TilFelt i dit serienr felt!~)
Avatar billede 49jensen Nybegynder
25. juli 2009 - 22:35 #6
Numrene skal skal skrives i et felt(notat) i en record. Det som jeg gjort indtil nu, er at skrive alle numrene i en serie, men da det drejer sig om mange tusinde numre, ville det jo være meget letere hvis man kunne bruge det første og det sidste i hver serie.
Avatar billede 49jensen Nybegynder
25. juli 2009 - 22:42 #7
Jeg må lige indskyde at det samme nummer kan forekomme i mere end en record. Når jeg sorterer vil alle records der indeholder nummeret der søges på fremkomme.
Avatar billede Slettet bruger
25. juli 2009 - 22:54 #8
vil det sige at man skal kunne søge udfra det nye serienr?~)
Avatar billede 49jensen Nybegynder
25. juli 2009 - 23:36 #9
Ja det vil sige at hvis jeg i record 1 har nummeret 48A, i record 2 har nummerene 48A og 49A og i record 3 har nummerene 49A og 50A og ligger nummeret 49A ind som søgekriterie sorteres til record 2 og 3.
Avatar billede Slettet bruger
25. juli 2009 - 23:57 #10
så ville serienr. for record 1 være 48A-48A, record 2 være 48A-49A og record 3 49A-50A

Du kunne lave et FraFelt og et TilFelt i din tabel og så bruge kriterierne:
>=forms!DinFormular!DitSøgekriterie til FraFeltet og <=forms!DinFormular!DitSøgekriterie til TilFeltet
Avatar billede 49jensen Nybegynder
26. juli 2009 - 23:31 #11
Så er jeg tilbage, har lige rundet Goteborg i bil.
Men så vil der vel blive flere records. Det er muligt at jeg ikke forklarer korrekt. Jeg prøver igen.
Feltet kan indeholde flere serier med nummre samt enkeltstående numre således - 41A, 42A-47A, 49A, 50A-67A, 69A, 72B-99B, osv.
Et felt i hver record beskriver hvad der er specielt for de numre som er lagt ind i feltet med samme record nummer.

  Beskrivelse  Numre
1  xxxx        41A,42A-47A,50A-67A                   
2  yyyy        42A-45A,67A,90B-97B 

    O.s.v.
Avatar billede Slettet bruger
27. juli 2009 - 00:05 #12
Det var straks værre!~)

...jeg vil foreslå at du laver en tabel med recordid og serienr (en-til-mange relation), så du kan søge i alle de enkelte serienumre og så med en distinct sætning få dine records uden dubletter...

Problemet med din nuværende situation er, at du er nød til at splitte dit "Numre" felt op i de forskellige intervaller for at kunne søge og dertil er du nød til at lave en meget kringlet funktion!~)
Avatar billede 49jensen Nybegynder
27. juli 2009 - 00:38 #13
Ja jeg tror at jeg er løbet ind i et kæmpe problem, dette problem er at jeg i denne ene hjælpetabel, og der vil måske blive 50-100 lignende tabeller, skal indtaste omkring 15000-20000 serienumre, det er uoverskueligt. Nu begynder jeg at forstå hvorfor en sådan db ikke er lavet før!!
Så dit første forslag er out. Og hvis du mener at det sidste også vil give problemer, så må jeg arbejde på en anden løsning.
Jeg vil slutte for nu, det har været en lang dag, vender tilbage når jeg har sovet på det.
Avatar billede Slettet bruger
27. juli 2009 - 00:50 #14
ja, du er vist et stykke fra land, men man ved jo aldrig!~)

...du er velkommen til at sende din db, så jeg bedre kan forstå dit problem... og sov godt!~)
Avatar billede 49jensen Nybegynder
27. juli 2009 - 19:58 #15
Jeg tror at løsningen bliver at nedfælde alle eksisterende numre i en eller flere tabeller, ved hjælp af autonummering, og derefter kopiere alle  berørte numre ind i feltet, det er meget arbejde men en engangsforeteelse. Der vil kun være opdateringer på 10-15 records om året (vedligeholdelse).
Men jeg vil godt have at du lige kigger på tabellen, den indeholder omkring 30 records nu, så er det måske lettere at danne sig et indtryk af hvad det er jeg mener.

Hvis du kan give mig din mail adresse så vil jeg sende en kopi af tabellen med tilhørende indput formular.
Avatar billede Slettet bruger
27. juli 2009 - 22:36 #16
spg.eksperten@gmail.com
Avatar billede 49jensen Nybegynder
30. juli 2009 - 12:40 #17
Hej spg
Jeg har sendt tabel og formular, men jeg er kommet frem til at lægge numrene ind i word og så kopierer jeg  derfra, det er lige så hurtigt som at skrive dem. Med mindre du imellemtiden har fundet på noget mere smart, så synes jeg at vi skal lukke spørgsmålet, så læg lige et svar, du har trods alt forsøgt at løse problemet.
Avatar billede Slettet bruger
30. juli 2009 - 21:22 #18
Hej det ligger allerede et svar og jeg har ikke modtaget din mail, så...

Godt du fandt en løsning!~)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester