04. december 2002 - 15:35Der er
28 kommentarer og 2 løsninger
hvad gør man når sql er for komplex ?
Jeg har en rimelig lang søgefunktion, hvor jeg skal kigge ned i en helvedes masse felter. Efter at have delt funktionen op i flere linier, får jeg at vide at "Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access Driver] Query is too complex.
/administrationen/mappearkiv/soeg.asp, line 124" søgelinierne starter på line 31 og slutter på linie 124
bare et forslag ved ik om det vil virke såen rent teknisk men prøv at dele den op i flere og skriv thing = strSQL1 & srtSQL2 o.s.v.... gennem den alle og execute thing
1) Nederste lag af SQL laver du som queries i selve din access database, her forbereder du ligesom data
2) Øverste lag af SQL laver du i din ASP, denne SQL bruger de queries der allerede er defineret og kan derfor (forhåbentligt !) blive meget meget simplere.
superior>> lav en query i access... gem den og referer til den istedet fra din asp side... måske skulle du også kigge lidt på basic database-design, for det lyder som om at din database er aller helvedes dårligt designet !!
det er lige som om query giver op inden, den har læst den igennem - den svarer i hvert fakld med fejl meget hurtigt...
koden: <% Dim objRec, antal antal = 0 Set Conn = Server.CreateObject("ADODB.Connection") Set objRec = Server.CreateObject("ADODB.recordset") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("mappearkiv.mdb") sql1 = "SELECT * FROM faner WHERE nummer like '%" & hvilket & "%' " sql1 = sql1 & "OR navn like '%" & hvilket & "%' " sql1 = sql1 & "OR emne like '%" & hvilket & "%' " sql1 = sql1 & "OR ansvarlig like '%" & hvilket & "%' " sql1 = sql1 & "OR ansvarlig like '%" & hvilket & "%' " sql1 = sql1 & "OR afdeling like '%" & hvilket & "%' " sql1 = sql1 & "OR selskab like '%" & hvilket & "%' " sql1 = sql1 & "OR selskab like '%" & hvilket & "%' " sql1 = sql1 & "OR opretdato like '%" & hvilket & "%' " sql1 = sql1 & "OR indhold_fra like '%" & hvilket & "%' " sql1 = sql1 & "OR indhold_til like '%" & hvilket & "%' " sql1 = sql1 & "OR arkivdato like '%" & hvilket & "%' " sql1 = sql1 & "OR plac_rum like '%" & hvilket & "%' " sql1 = sql1 & "OR plac_sektion like '%" & hvilket & "%' " sql1 = sql1 & "OR plac_reol like '%" & hvilket & "%' " sql1 = sql1 & "OR plac_hylde like '%" & hvilket & "%' " sql1 = sql1 & "OR title_1 like '%" & hvilket & "%' OR descr_1 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_2 like '%" & hvilket & "%' OR descr_2 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_3 like '%" & hvilket & "%' OR descr_3 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_4 like '%" & hvilket & "%' OR descr_4 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_5 like '%" & hvilket & "%' OR descr_5 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_6 like '%" & hvilket & "%' OR descr_6 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_7 like '%" & hvilket & "%' OR descr_7 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_8 like '%" & hvilket & "%' OR descr_8 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_9 like '%" & hvilket & "%' OR descr_9 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_10 like '%" & hvilket & "%' OR descr_10 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_11 like '%" & hvilket & "%' OR descr_11 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_12 like '%" & hvilket & "%' OR descr_12 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_13 like '%" & hvilket & "%' OR descr_13 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_14 like '%" & hvilket & "%' OR descr_14 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_15 like '%" & hvilket & "%' OR descr_15 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_16 like '%" & hvilket & "%' OR descr_16 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_17 like '%" & hvilket & "%' OR descr_17 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_18 like '%" & hvilket & "%' OR descr_18 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_19 like '%" & hvilket & "%' OR descr_19 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_20 like '%" & hvilket & "%' OR descr_20 like '%" & hvilket & "%' " sql1 = sql1 & "OR title_21 like '%" & hvilket & "%' OR descr_21 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_22 like '%" & hvilket & "%' OR descr_22 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_23 like '%" & hvilket & "%' OR descr_23 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_24 like '%" & hvilket & "%' OR descr_24 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_25 like '%" & hvilket & "%' OR descr_25 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_26 like '%" & hvilket & "%' OR descr_26 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_27 like '%" & hvilket & "%' OR descr_27 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_28 like '%" & hvilket & "%' OR descr_28 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_29 like '%" & hvilket & "%' OR descr_29 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_30 like '%" & hvilket & "%' OR descr_30 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_31 like '%" & hvilket & "%' OR descr_31 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_32 like '%" & hvilket & "%' OR descr_32 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_33 like '%" & hvilket & "%' OR descr_33 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_34 like '%" & hvilket & "%' OR descr_34 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_35 like '%" & hvilket & "%' OR descr_35 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_36 like '%" & hvilket & "%' OR descr_36 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_37 like '%" & hvilket & "%' OR descr_37 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_38 like '%" & hvilket & "%' OR descr_38 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_39 like '%" & hvilket & "%' OR descr_39 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_40 like '%" & hvilket & "%' OR descr_40 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_41 like '%" & hvilket & "%' OR descr_41 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_42 like '%" & hvilket & "%' OR descr_42 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_43 like '%" & hvilket & "%' OR descr_43 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_44 like '%" & hvilket & "%' OR descr_44 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_45 like '%" & hvilket & "%' OR descr_45 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_46 like '%" & hvilket & "%' OR descr_46 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_47 like '%" & hvilket & "%' OR descr_47 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_48 like '%" & hvilket & "%' OR descr_48 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_49 like '%" & hvilket & "%' OR descr_49 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_50 like '%" & hvilket & "%' OR descr_50 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_51 like '%" & hvilket & "%' OR descr_51 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_52 like '%" & hvilket & "%' OR descr_52 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_53 like '%" & hvilket & "%' OR descr_53 like '%" & hvilket & "%' " sql2 = sql2 & "OR title_54 like '%" & hvilket & "%' OR descr_54 like '%" & hvilket & "%' " sql3 = sql3 & "OR title_a like '%" & hvilket & "%' OR descr_a like '%" & hvilket & "%' " sql3 = sql3 & "OR title_b like '%" & hvilket & "%' OR descr_b like '%" & hvilket & "%' " sql3 = sql3 & "OR title_c like '%" & hvilket & "%' OR descr_c like '%" & hvilket & "%' " sql3 = sql3 & "OR title_d like '%" & hvilket & "%' OR descr_d like '%" & hvilket & "%' " sql3 = sql3 & "OR title_e like '%" & hvilket & "%' OR descr_e like '%" & hvilket & "%' " sql3 = sql3 & "OR title_f like '%" & hvilket & "%' OR descr_f like '%" & hvilket & "%' " sql3 = sql3 & "OR title_g like '%" & hvilket & "%' OR descr_g like '%" & hvilket & "%' " sql3 = sql3 & "OR title_h like '%" & hvilket & "%' OR descr_h like '%" & hvilket & "%' " sql3 = sql3 & "OR title_ij like '%" & hvilket & "%' OR descr_ij like '%" & hvilket & "%' " sql3 = sql3 & "OR title_k like '%" & hvilket & "%' OR descr_k like '%" & hvilket & "%' " sql3 = sql3 & "OR title_l like '%" & hvilket & "%' OR descr_l like '%" & hvilket & "%' " sql3 = sql3 & "OR title_m like '%" & hvilket & "%' OR descr_m like '%" & hvilket & "%' " sql3 = sql3 & "OR title_n like '%" & hvilket & "%' OR descr_n like '%" & hvilket & "%' " sql3 = sql3 & "OR title_o like '%" & hvilket & "%' OR descr_o like '%" & hvilket & "%' " sql3 = sql3 & "OR title_pq like '%" & hvilket & "%' OR descr_pq like '%" & hvilket & "%' " sql3 = sql3 & "OR title_r like '%" & hvilket & "%' OR descr_r like '%" & hvilket & "%' " sql3 = sql3 & "OR title_s like '%" & hvilket & "%' OR descr_s like '%" & hvilket & "%' " sql3 = sql3 & "OR title_tu like '%" & hvilket & "%' OR descr_tu like '%" & hvilket & "%' " sql3 = sql3 & "OR title_vx like '%" & hvilket & "%' OR descr_vx like '%" & hvilket & "%' " sql3 = sql3 & "OR title_yz like '%" & hvilket & "%' OR descr_yz like '%" & hvilket & "%' " sql3 = sql3 & "OR title_ae like '%" & hvilket & "%' OR descr_ae like '%" & hvilket & "%' " sql3 = sql3 & "OR title_oeaa like '%" & hvilket & "%' OR descr_oeaa like '%" & hvilket & "%' " sql3 = sql3 & "OR title_tal like '%" & hvilket & "%' OR descr_tal like '%" & hvilket & "%'"
det er til et system, hvor man indtaster oplysninger for indholdet af et ringbind. Herefter gemmes oplysninger i en søgbar database og samtidig printes en side ud fra de oplysninger man har tastet ind, som kan bruges til faneindeling i starten af ringbindet...
Hvis Access mener at din SQL er for kompleks, er der nok ikke noget at gøre ved det... Men der er nu også et par kandidater i din tabel til en normalisering af data, f.eks. ansvarlig, afdeling og selskab (men det alene ville nok ikke løse dit problem).
Er det muligt at du kan bede brugeren vælge hvilken del af data der skal søges på, f.eks. om det er et af description eller titel felterne der skal søges i. På denne måde ville du få et par forskellige SQL kald, som forhåbentligt kan afvikles hver især uden problemer. (men du mister selvfølgelig noget funktionalitet idet man skal vælge en begrænset del af felterne der skal søges i)
Det lader til at det ikke er dig selv der har designet databasen, men som sagt ligner tabellen snarere et Excel ark med de mange felter udad. Er det virkeligt rigtigt at der udfyldes 54 titler og beskrivelser for hvert ringbind? (mit umiddelbare gæt er at felterne title_1 til title_54 dækker over at der kan være op til 54 faneblade/sektioner i et ringbind, og hvis det er tilfældet er din database designet forkert, eftersom der så er tale om en en-til-mange relation mellem ringbind og faneblad/sektion)
Jeg ved godt at dette ikke løser dit konkrete problem, men jeg ville bede om et par timer til at redesigne systemet, hvis jeg var dig :-)
(Alternativt kan du flytte databasen over på en SQL Server/MSDE og se om den kan håndtere din SQL)
rasmusoller: Dine umiddelbare gæt er ret præcise :) Problemet er bare at jeg ikke har arbejdet så meget med relationsdatabaser. Jeg ville meget gerne kunne lave det på en smartere måde, så hvis du kunne fortælle mig hvorledes jeg så skal gøre, vil jeg gerne smide max. point på ;) Det som du egentlig ser i søgekoden er alle felterne (hvis brugeren ønsker at søge på alt) ud fra den devise at man skal kunne oprette en side med henholdsvis 5,10,12,15,20,31,54,alfsbetisk faneindex. Udgangspunktet har jeg lavet således at de felter der ikke er title eller description udfyldes først (her vælges også antal faner) det bliver så postet og efterfølgende bliver man redirectet til en asp-side med ønskede antal faner, hvor man så fylder resten af indholdet ind i.
arne_v - hvad får du ud af at smide indholdet over i en anden db. felterne bliver jo de samme (i forhold til hvis f.eks index1+2+3+50+51 udfyldes, så skal alle de mellemliggende tal også være på index)
Umiddelbart ville jeg tro at du skal have følgende tabeller/felter i din database (for at kunne repræsentere ringbind/faner - jeg har ikke taget højde for afdelinger, ansvarlig osv). Desuden kender jeg ikke dine data godt nok til at kunne gøre antagelser om datatypen for de enkelte felter, så det har jeg undladt. Desuden har du en skøn blanding af danske og engelske feltnavne, så jeg har valgt at anvende danske navne. Du ændrer bare dette, hvis det skulle være et problem.
Tabel "Ringbind" med følgende felter: nummer (udfra en antagelse om at dette er din primærnøgle - lader til at den er af typen "text") navn emne ansvarlig afdeling selskab opretdato indhold_fra indhold_til arkivdato plac_rum plac_sektion plac_reol plac_hylde
Og en tabel "RingbindSektion" (eller "Faneblad" alt efter hvad du bedst kan lide): RingbindNummer (fremmednøgle der relaterer til feltet "nummer" i Ringbind) SektionId (tekst, f.eks. "A", "1" osv) Titel Beskrivelse (RingbindNummer og SektionId udgør en sammensat primærnøgle for denne tabel)
- Jeg kom til at lave en lille Access test-database, hvor jeg f.eks. har følgende sub til at teste søgningen: (bemærk at den lige skal rettes en lille smule til for at køre i ASP)
Sub DoSearch()
Dim rst As New ADODB.Recordset Dim strSql As String, strSearch As String
strSearch = InputBox("Angiv søgekriterie:")
If strSearch <> "" Then strSearch = Replace(strSearch, "'", "''")
strSql = "select rb.nummer" & vbNewLine & _ "from Ringbind rb" & vbNewLine & _ "where rb.navn like '%" & strSearch & "%'" & vbNewLine & _ " or exists (select *" & vbNewLine & _ " from RingbindSektion rbs" & vbNewLine & _ " where rbs.RingbindNummer = rb.nummer" & vbNewLine & _ " and (rbs.Titel like '%" & strSearch & "%' or rbs.Beskrivelse like '%" & strSearch & "%')" & vbNewLine & _ " )"
Det ved jeg godt, men jeg forventer at folk godt kan finde ud af at indsætte den viste kode i den rette kontekst, f.eks. ASP. Manden har jo vist at han på trods af manglende kendskab til databaser trods alt godt kan finde ud af at skrive et par linjer ASP. (Der mangler f.eks. også nogle felter i SQL'en, og jeg har svært ved at gætte mig frem til hvilke informationer han ønsker at vise for de fundne ringbind).
Det var det som min kommentar "(bemærk at den lige skal rettes en lille smule til for at køre i ASP)" dækker over ;-)
hmm - sidder og prøver mig frem, men synes det virker uoverskueligt.. Jeg ville da meget gerne prøve atse den DB du har lavet, rasmus :) mail: eksperten@jman.dk
jeg evt. maile dig min DB+sider, så du kan se hvad det er jeg har lavet ? Hvis du vil rette det til smider jeg meget gerne et spørgsmål op med 200p ;)
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.