25. juli 2009 - 17:49Der 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.
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.
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å.
En serie numre kan være 172S80455,172S80456, 172S80457.
Synes godt om
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?~)
Synes godt om
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!~)
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.
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.
Synes godt om
Slettet bruger
25. juli 2009 - 22:54#8
vil det sige at man skal kunne søge udfra det nye serienr?~)
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.
Synes godt om
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
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.
...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!~)
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.
Synes godt om
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!~)
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.
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.
Synes godt om
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!~)
Synes godt om
Ny brugerNybegynder
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.