14. august 2001 - 00:23Der er
33 kommentarer og 1 løsning
Data fra flere tabeller
Er der nogen der ved hvor man kan få et script, der gør sådan, at ved en søgning bliver der søgt i flere tabeller og herefter listes resultaterne \"tabel opdelt\". Jeg kan godt finde ud af at gøre det ved at åbne & lukke databasen en million gange, men det er jo ikke ligefrem ressource venligt.. Jeg kan regne mig frem til at jeg skal bruge nogle arrays og den slags sjov, men jeg er efterhånden fuldstændig blank for ideer.
webbe >> jeg vil ikke påstå at din løsning ikke virker, men jeg mener der er nogle åbenløse begrænsninger med den, som spørgeren bør være opmærksom på.
1. Virker kun på relaterede tabeller - og vil dermed eks. ikke vise poster fra tabel1, der ikke har et matchende post i tabel2 2. Returnerer data i ét stort recordset, hvilket gør det svært at vise data tabelopdelt
Det er vel egentlig også det der er meninge som jeg forstår spørgsmålet!? I Access er det jo ikke hensigtsmæssigt med tabeller med mange felter/kolonner, som man fx. kan i Oracle! Derfor vil man have brug for flere tabeller med oplysnigner om fx. én post, hvor der er et fælles id/nøgle-felt!
Tmceu >> da jeg prøvede den fik jeg at vide at objektet eller handlingen ikke undestøttede \"Set objRS = objRS.NextRecordset\". Til oplysning bruger jeg MSSQL til database. Webbe>> det er ikke tabeller med relation til hinanden jeg skal bruge, men til gengæld bare søgning i flere. Det jeg helt præcist skal bruge det til er at jeg har 5ca. 40 tabeller som en søgefunktion så skal tjekke igennem og så vise resultaterne fra hver tabellerne hver for sig. Tabellerne er bygget fuldstændig ens op, men indholdet er vidt forskelligt, og skal ikke sammenføres på nogen måde. Og sth, når prøver at bruge din funktion (som ellers var min første ide) får jeg at vide at ID´en kan refere til flere tabeller(id er et felt i databasen). Håber dette præcisere mit mål lidt mere..
Jeg kom til at tænke lidt mere over dit spørgsmål og har et forslag: Hvis du ønsker at gøre din søgning total dynamisk til at søge i eks. alle usertables, kan du bruge noget i stil med nedenstående:
Returner alle usertables med \"select * from sysobjects where OBJECTPROPERTY(id, N\'IsUserTable\') = 1\"
Loop igennem posterne og dan et SQL statement hvor alle tabeller er inkluderet (\"SELECT * FROM Tabel1;SELECT * FROM Tabel2.....\")
Brug koden fra tidligere til at vise resultatet for alle tabellerne
Do Until objRS Is Nothing Do While Not objRS.EOF -- kode pr. record -- objRS.MoveNext Loop Set objRS = objRS.NextRecordset Loop
Hvis du ønsker at søge i alle tables, er dette totalt vedligeholdelses frit, da alle nye tabeller aut. er inkluderet i søgningen.
Jeg har lige lavet en lille test og det virker perfekt.
P.S. Kan ikke huske om der er en begrænsning på længden af SQL statement, dette kan i så fald være et problem, da det godt kan blive langt.
TMCEU>> Jeg har prøvet dine ting nu, og er kommet så langt at jeg har fået en ny fejlmeddelelse(Juhuu!!), den siger \"Ambiguous column name \'navn\'\", (Ambiguous = tvetydig) hvilket jo må mene at den brokker sig over at søge i 2 tabeller, eller hvad?
Det betyder at du har min. 2 tabeller hvor det samme feltnavn indgår (sandsynligvis i WHERE delen). Hvis du eks. laver nedenstående vil du få den fejl:
Et par fiktive tabeller
Tabel1: Navn, Adresse Tabel2: Navn, kategori
Select * From Tabel1 inner join Tabel2 on Tabel1.Navn = Tabel2.Navn where Navn = \"Julemanden\"
I disse tilfælde, er du derfor nødt til at referere til et felt eksplicit:
Select * From Tabel1 inner join Tabel2 on Tabel1.Navn = Tabel2.Navn where Tabel1.Navn = \"Julemanden\"
Du kan også bruge et alias for tabellerne, så du ikke hele tiden skal skrive lange tabelnavne foran:
Select * From Tabel1 as T1 inner join Tabel2 as T2 on Tabel1.Navn = Tabel2.Navn where T1.Navn = \"Julemanden\"
Håber det hjælper dig videre, om ikke andet så til en ny fejlmeddelelse :-)
Jamen så får jeg jo ikke delt resultaterne op afhængigt af hvilken tabel de kommer fra. Og til information så har du ret med med feltnavn, som nævnt tidligere er alle tabeller bygget ens op, med kolonne-navne og alting, det er indholdet i kolonnerene der forskellig.
Jeg tror vi taler lidt forbi hinanden. Mit sidste svar var kun et eksempel for at vise hvad der kan være årsagen til at du får fejlen \"Ambiguous column name \'navn\'\". Jeg har forstået at du skal have tabellerne behandlet seperat, og det er det denne kode gør:
Do Until objRS Is Nothing Do While Not objRS.EOF -- kode pr. record -- objRS.MoveNext Loop Set objRS = objRS.NextRecordset Loop
For at få flere seperate recordsets tilbage, skal du opbygge dit SQL statement som herunder, adskilt med semikolon.
Det er fedt du gider hjælpe så meget, det er jeg meget taknemmelig overfor, nå men her er fejl-koden: Fejltype: Microsoft OLE DB Provider for ODBC Drivers (0x80040E14) [Microsoft][ODBC SQL Server Driver][SQL Server]Ambiguous column name \'navn\'. /hobo/search/source195/search.asp, line 56
Og her asp koden: \' Opbygger en dynamisk SQL streng strSQL = \"SELECT navn, email, website, by1 FROM ba, bb WHERE\" strSQL = strSQL & \" (navn LIKE \'%\" & strKeyword & \"%\')\" strSQL = strSQL & \" OR (by1 LIKE \'%\" & strKeyword & \"%\')\"
strSQL = \"SELECT navn, email, website, by1 FROM ba, bb WHERE\" strSQL = strSQL & \" (navn LIKE \'%\" & strKeyword & \"%\')\" strSQL = strSQL & \" OR (by1 LIKE \'%\" & strKeyword & \"%\')\"
den kan ikke finde ud af om du mener hhv. navn og by1 i tabellen ba eller bb! Hvis du virkelig vil have dit statement opbygget som ovenstående, skal du rette det lidt til:
strSQL = \"SELECT navn, email, website, by1 FROM ba, bb WHERE\" strSQL = strSQL & \" (ba.navn LIKE \'%\" & strKeyword & \"%\')\" strSQL = strSQL & \" OR (ba.by1 LIKE \'%\" & strKeyword & \"%\')\" strSQL = strSQL & \" OR (bb.navn LIKE \'%\" & strKeyword & \"%\')\" strSQL = strSQL & \" OR (bb.by1 LIKE \'%\" & strKeyword & \"%\')\"
grunden til at jeg ikke har lavet select´en som din er at den så kun tog Where delen med på den sidste select, og det vil blive lidt tungt, hvis jeg skal skrive en where for hver tabel...Du ved dovenskab er en programmørs dyd;)
Undskyld, der er lige endnu en fejl. Den har samme problem med SELECT delen: SELECT navn, email, website, by1 ... den ved ikke om du mener navn fra ba eller bb tabellen. Skal rettes til:
strSQL = \"SELECT ba.navn, ba.email, ba.website, ba.by1, bb.navn, bb.email, bb.website, bb.by1 FROM ba, bb WHERE\" strSQL = strSQL & \" (ba.navn LIKE \'%\" & strKeyword & \"%\')\" strSQL = strSQL & \" OR (ba.by1 LIKE \'%\" & strKeyword & \"%\')\" strSQL = strSQL & \" OR (bb.navn LIKE \'%\" & strKeyword & \"%\')\" strSQL = strSQL & \" OR (bb.by1 LIKE \'%\" & strKeyword & \"%\')\"
Men nu begynder dit SQL statement at blive uoverskueligt, ikke ?
hæhæ...du har lidt ret, især hvis jeg fortæller dig at den skal søge i ca. 45 tabeller.... Så jeg tænkte på om der ikke findes en 8. måde at lave den på?, men jeg prøver lige denne her så vi kan få fundet fejlen.
nu får jeg denne fejlmeddelelse istedet: Elementet kan ikke findes i den samling, der svarer til det anmodede navn eller ordenstal. /hobo/search/source195/search.asp, line 65
Hvor linje 65 er: Navn = rs(\"navn\") Jeg prøvede at skrive rs(\"ba.navn\"), men det hjalp ikke
Dette vil dynamisk opbygge en SQL sætning for dig, med alle de tabeller du smider i array\'et (nemt at udvide)
SELECT navn, email, website, by1 FROM ba WHERE (navn LIKE \'%ord%\') OR (by1 like \'%ord%\');SELECT navn, email, website, by1 FROM bb WHERE (navn LIKE \'%ord%\') OR (by1 like \'%ord%\');......
og så får du alle tabeller tilbage som seperate recordsets
Hvis du ikke har mod på det, sker der ikke noget ved at lave den kilometerlange :-)
Nu har lige prøvet din kode, men den går kun og tjekker \"bb\" (jeg gik ind og skar dit array ned til ba & bb), jeg fik den til at skrive strSQL ud og det blev til: SELECT navn, by1 FROM bb WHERE (navn LIKE \'%a%\') OR (by1 LIKE \'%a%\')
Array koden er: Dim arrNames(1) \' definerer et array med 4 elementer arrNames(0) = \"ba\" arrNames(1) = \"bb\"
For i = LBound(arrNames) To UBound(arrNames)
\' Opbygger en dynamisk SQL streng strSQL = \"SELECT navn, by1 FROM \" & arrNames(i) & \" WHERE\" strSQL = strSQL & \" (navn LIKE \'%\" & strKeyword & \"%\')\" strSQL = strSQL & \" OR (by1 LIKE \'%\" & strKeyword & \"%\')\"
Det var så lidt, fortsat held og lykke og godnat zzzZZZ
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.