14. maj 2004 - 21:11Der er
30 kommentarer og 2 løsninger
Radom på flere tabeller?
Kan man gøre noget lignende som dette :
SUB RandomVare set rs=server.CreateObject("adodb.recordset") strSQL = "SELECT * FROM VHS, DVD, CD, Baand" RS.Open strSQL, con, 3, 1 'Find antal records recCount = rs.RecordCount 'Find random nummer randomize rec = int(rnd * recCount) 'Flyt til den valgte record rs.Move rec 'Tilføj som variabel varetype = "Her skal den så vælge det ud fra tabel navnet i databasen" varenr = rs("varenr") End SUB
Hvordan gør man dette, så den kan ud fra flere tabeller i samme database fidne alle vare og tage en tilfældig hvor den så selv finder ud af tabel navnet, da det kun er tabellen der oplyser dette dette er ikke samtidig en felt i tabellen...
evt med tillæg til random tilføjelserne: SELECT VHS.id as VHSID,DVD.id as DVDID,CD.id as Baand FROM VHS, DVD, CD, Baand hvor id selvfølgelig er et felt i tabellen. Så kan du spørge hvilket id er der er data i
Der der sker i det ovenstående script, er at den finder ALLE vare i ALLE tabeller, samler dem i en stor tabel i hukommelsen, og så tager den herfra et tilfældigt varenr blandt alle varenr. Hvordan skal jeg så kunne fidne ud af om den tilfældige varenr om den tilhører DVD eller VHS bare som eksempel?
hvis du istedet for SELECT * bruger: SELECT VHS.id as VHSID,DVD.id as DVDID,CD.id as CDID, Baand.id as BaandID FROM VHS, DVD, CD, Baand kan du bruge if len(rs("VHSID"))>0 then ' så har du fundet en VHS end if if len(rs("DVDID"))>0 then ' så har du fundet en DVD end if
SUB RandomVare set rs=server.CreateObject("adodb.recordset") strSQL = "SELECT VHS.varenr AS VHSnr, DVD.varenr AS DVDnr, Diverse.varenr AS Diversenr FROM VHS, DVD, Diverse" RS.Open strSQL, con, 3, 1 'Find antal records recCount = rs.RecordCount 'Find random nummer randomize rec = int(rnd * recCount) 'Flyt til den valgte record rs.Move rec 'Tilføj som variabel if (rs("VHSnr")<>" ") then varetype = "VHS" varenr = rs("VHSnr") end if if (rs("DVDnr")<>" ") then varetype = "DVD" varenr = rs("DVDnr") end if if (rs("Diversenr")<>" ") then varetype = "Diverse" varenr = rs("Diversenr") end if End SUB
Sådan ser den ud nu, og de gange den fejler er det ved linien : RS.Open strSQL, con, 3, 1 Med beskeden : Error Type: Der opstod en Microsoft VBScript-kørselsfejl (0x800A01FB) Der er opstået en undtagelse: 'rs.Open'
Jeg vil forslå du laver et ekstra felt i basen som indikerer hvilken type ting det er. Samtidig kan du derefter smide alle data i den samme tabel, det gør mange ting lettere, og er også en langt pænere normalisering af basen!
Det er det ja, men jeg vil lige i dette tilfælde foretrække, at det blev lavet på denne måde, da der er mange steder der skal rettes i koden ellers, da den så ved tilføjelese og sletning og ændringer, skal ind og rette i denne tabel også...
som alternativ løsning kan du lave et felt (varetype) der for hver tabel type har en default værdi for video f.eks 1 og dvd 2, og så bruge denne sql: SELECT * FROM DVD UNION SELECT * FROM VHS UNION SELECT * FROM Diverse; Så kan du spørge hvilket varetype det er!
varenr = rs("varenr") if (rs("varetype")="1") then varetype = "VHS" ' gør et eller andet VHS relevant end if if (rs("varetype")="2") then varetype = "DVD" ' gør et eller andet DVD relevant end if
Dette virker ikke, da rs("varetype") ikke findes nogen stader, da det jo er tabel navnet der skal hentes for den tabel hvor varenummeret egentlig eksister i?
du skal som jeg har skrevet tilføje et ekstra felt "varetype", der for hver tabel type har en default værdi for video f.eks 1 og dvd 2, så kræver det ikke nogen ændring i din kode
Lige nu har dine tabeller disse felter: Varenr (Som er Unik) Beskrivelse Pris
Du tilføjer derefter et felt i tabellerne der hedder varetype For hver af tabellerne sætter du nu en standard værdi: VHS varetype = 1 DVD varetype = 2 osv...
Når du bagefter bruger denne union, vil alle resultater komme ud i et stort resultset: SELECT * FROM DVD UNION SELECT * FROM VHS UNION SELECT * FROM Diverse;
varenr beskrivelse pris varetype 1 bil 2000 3 2 bil2 2333 3 3 Ringenes Herre 1 120 2 4 Ringenes Herre 2 140 2 5 Ringenes Herre 3 160 2 6 Ringenes Herre 1 VHS 120 1 7 Ringenes Herre 2 VHS 140 1 8 Ringenes Herre 3 VHS 160 1 Derefter kan du spørge på varetype hvad slags vare du har fundet
Heh ja det er en mulighed, men dette giver igen en masse ekstra programmering for at disse oplysninger så gemmes og en del større database. Det var var min pointe i denne spørgsmål er om man her ikke kan få den til selv at finde ud af hvilken tabel i databasen den har taget varenr fra, så den automatisk finder tabel navnet, uden at man skal lave ekstra felter... for så kan jeg lige så godt lave den samlede tabel med alle vare den ville være hurtigere at lave... Men stadig tage lang tid...
Metoden jeg har beskrevet ovenfor koster ikke noget administration kun lidt ekstra plads, da felterne blot skal have sat en default værdi. Men jeg giver dig fuldstændig ret i at databasen helst skulle ligges sammen.
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.