Avatar billede goose Nybegynder
10. maj 2006 - 12:48 Der er 13 kommentarer og
2 løsninger

Gem indhold af sub i variabel

Jeg har en database som bl.a. indeholder en tabel der hedder content.

Indholdet i denne tabel indeholder min hjemmeside med alle HTML koder.

Derudover er der også nogle specialkoder, f.eks. $$$specialkode$$$ som i bund og grund er nogle eksterne asp filer som bliver eksekveret når siden bliver kaldt med server.execute

Når jeg så henter indholdet ind på min hjemmeside har jeg en sub som kigger mit content igennen og eksekverer mine specialkoder og præsenterer det hele på hjemmesiden.

Min sub ser således ud:

<%
SQL = "select content from TABEL where id=3"
set rs = conn.execute(SQL)
content = rs("content")
rs.close
set rs = nothing

executenavne = "specialkode"

sub RepKode(content, keys)
  Set CMregEx = New RegExp
  CMregEx.IgnoreCase = True
  CMregEx.Global = True
  CMregEx.Pattern = "[\$]{3}(" & Replace(keys, ",", ")[\$]{3}|[\$]{3}(") & ")[\$]{3}"
  Set Matches = CMregEx.Execute(content)
  startpos = 1
  For Each Match In Matches
      pos = Match.FirstIndex + 1
    Response.Write Mid(content, startpos, pos - startpos)
    Server.Execute("/mappe/" & Replace(Match.Value, "$", "") & ".asp")
    startpos = pos + Len(Match.Value)
  Next
  Response.Write Mid(content, startpos)
End sub
%>

På selve hjemmesiden indsætter jeg så indholdet med:
<% call RepKode(content, executenavne) %>

Alt dette virker perfekt.

Jeg vil nu gerne udvide min hjemmeside med en søgefunktion, så jeg skal have indholdet af hver side - incl. indholdet af de eksekverede specialkoder - gemt i en ny tabel i databasen så jeg kan søge i denne.

Jeg har forsøgt en masse ting som jeg ikke kan få til at virke, og en psydo-kode kunne se således ud:

variabel = call RepKode(content, executenavne)

- og så indsætte denne variabel i databasen, men denne virker naturligvis ikke :o(

Hvordan gør man?

Undskyld den lidt lange beskrivelse.

/Goose
Avatar billede softspot Forsker
10. maj 2006 - 13:12 #1
Du skal umiddelbart have lagt indholdet over i en streng som du kan returnere fra din rutine (der så skal ændres til at være en function):

Function RepKode(content, keys)
  dim tmp
  tmp = ""
  Set CMregEx = New RegExp
  CMregEx.IgnoreCase = True
  CMregEx.Global = True
  CMregEx.Pattern = "[\$]{3}(" & Replace(keys, ",", ")[\$]{3}|[\$]{3}(") & ")[\$]{3}"
  Set Matches = CMregEx.Execute(content)
  startpos = 1
  For Each Match In Matches
      pos = Match.FirstIndex + 1
    tmp = tmp & Mid(content, startpos, pos - startpos)
    Server.Execute("/mappe/" & Replace(Match.Value, "$", "") & ".asp")
    startpos = pos + Len(Match.Value)
  Next
  tmp = tmp & Mid(content, startpos)
  RepKode = tmp
End Function


Dette er dog kun en halv løsning, da det output som dine server.execute leverer ikke kommer med i dette... du skal med andre ord givetvis have splittet din arkitektur ad for at kunne håndtere dette behov.

En vild (og nok ikke særlig pratisk anvendelig) idé, er at indlæse dine asp-filer manuelt og smide dem igennem RepKode-funktionen, så du rekursivt fortolker dine asp-filer. Det betyder så også at du selv skal udfør ASP-koden i dine ASP-filer (det kunne du måske have held til at gøre med Execute-kommandoen i VBScript), men det vil kræve at du kører VBScript koden i disse ASP-filer igennem en forberedende parsing som sørger for at omsætte de korte notationer til noget eksekverbart (f.eks. skal <%=Tekst%> omsættes til Response.Write Tekst).
Avatar billede goose Nybegynder
10. maj 2006 - 13:33 #2
Ja, det var jeg også selv kommet frem til, det går galt med server.execute delen som ikke kommer med.

Det er netop den del der volder mig problemer, ellers kan jeg søge i den nuværende tabel :o)

Jeg har eksperimenteret lidt videre og jeg kan godt indlæse mit call i et tekstfelt  i en formular og så submitte denne form og derved indsætte indholdet i databasen, men jeg orker ikke at sidde og gøre dette manuelt hver gang jeg ændrer noget. Der er rigtig mange sider :o)

Jeg kan ikke lige gennemskue om man kan gøre følgende:

Jeg kalder en side, f.eks. opdater.asp som looper igennem alle id numre i databasen

For hvert loop indsætter den indholdet i et tekstfelt(form) og submitter formen - gemmer og fortsætter til næste id nr.

Det er fint at jeg skal aktiverer denne del selv, hvis bare den selv kan loope igennem og gemme i databasen.

Kan det mon lade sig gøre og hvordan?

/Goose
Avatar billede goose Nybegynder
10. maj 2006 - 13:34 #3
Tekstfelt skal naturligvis være textarea :o)

/Goose
Avatar billede softspot Forsker
10. maj 2006 - 13:45 #4
Du kan lave et HTTPRequest på serveren som submitter din form automatisk, rent faktisk ville det være bedst hvis du kunne sætte en "scheduled task" op på webserveren (eller en anden maskine), så kunne kalde din webserver for alle de tekster der skal submittes...

Sådan en fætter kan du så bare sætte til at køre med jævne mellemrum, så dit søgeindeks er up-to-date (minus x antal timer)...
Avatar billede goose Nybegynder
10. maj 2006 - 14:10 #5
Det er nok ikke optimalt idet jeg så også vil få tekster fra menupunkter m.v. med i min søgning. Søgeresultat bliver så for bredt hvis du forstår :o)

/Goose
Avatar billede softspot Forsker
10. maj 2006 - 14:53 #6
jooh, men hvis du kan bruge den løsning med et textarea og manuel submit, så kan du vel også bruge den automatiserede udgave...
Avatar billede softspot Forsker
10. maj 2006 - 21:40 #7
...den gør i princippet det samme - bare automatisk.
Avatar billede goose Nybegynder
10. maj 2006 - 22:06 #8
ja jeg har nu fået noget bikset sammen med HttpGet som jeg tror vil virke, dog skal jeg manuelt kører den da jeg ikke har adgang til cron jobs eller lign.

Smid et svar, så får du pointene for god sparring :o)

/Goose
Avatar billede softspot Forsker
10. maj 2006 - 22:10 #9
Du kan godt beholde størstedelen af point - jeg skulle jo ikke lave noget ;-)

I øvrigt kan du bare sætte en planlagt handling op på din lokale maskine som udfører denne handling (med mindre din maskine ikke er tændt hver dag?)...
Avatar billede ttopholm Nybegynder
10. maj 2006 - 22:13 #10
Du kan jo evt. bruge cronjob.de, til dine cronjobs ;-) eller som siftspot siger bruge den lokale maskine, hvis du har adgang til den...
Avatar billede ttopholm Nybegynder
10. maj 2006 - 22:13 #11
siftspot -> softspot
Avatar billede goose Nybegynder
10. maj 2006 - 22:25 #12
Ja, men nu har jeg sat den til at køre når jeg logger af min administration, så det er fint nok så længe det kun er mig der styrer det :o)

Okay, så får du de halve, sparringen var det der skulle til.

/Goose
Avatar billede softspot Forsker
10. maj 2006 - 22:29 #13
Jamen, så takker jeg ydmygt for de mange point :)
Avatar billede goose Nybegynder
10. maj 2006 - 22:36 #14
Jamen det var da så lidt, nogle gange er sparringen jo det mest givtige :o)

/Goose
Avatar billede softspot Forsker
10. maj 2006 - 22:41 #15
Enig! :)
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
Kurser inden for grundlæggende programmering

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