Avatar billede bongo20 Nybegynder
22. juli 2005 - 13:30 Der er 20 kommentarer og
1 løsning

Return i en sub eller function

Hej


Hvordan ser syntaxen ud hvis jeg vil returnere en værdi fra en sub eller function?
Avatar billede ksoren Nybegynder
22. juli 2005 - 13:35 #1
Function NavnPaaFunktion()
    NavnPaaFunktion = værdi
End Function

En sub kan ikke returnere noget
Avatar billede busschou Praktikant
22. juli 2005 - 13:36 #2
Forskellen på en sub og en funktion er at en sub ikke returnerer en værdi men en funktion gør
---
<%
Call sub_udskriv("hej")

response.write funktion_udskriv("børge")

Sub sub_udskriv(ord)
  response.write "ord")
End Sub

Function funktion_udskriv(ord)
  funktion_udskriv = "hej"&ord
End Function
%>
Avatar billede bongo20 Nybegynder
22. juli 2005 - 17:44 #4
Vil det sige at jeg ikke kan gøre følgende:


Function Query(sql)
    rs.Open sqlStr, cn
    Query = rs
End Function

rs = Query("Select * From Test1")
Avatar billede busschou Praktikant
22. juli 2005 - 17:47 #5
hmm jo det burde du så netop fordi det er en funktion
Og du siger at funktionen skal returnere rs
Avatar billede busschou Praktikant
22. juli 2005 - 17:50 #6
men du skal selvfølgelig kalde den med sql og ikke sqlStr  når det er den du giver i parameter
---
Function Query(sql)
    rs.Open sql, cn
    Query = rs
End Function
---
og tilsvarende så skal den vide hvad "cn" er
Med mindre du har defineret "cn" globalt så skal den også med som parameter
Avatar billede busschou Praktikant
22. juli 2005 - 17:50 #7
ja og tilsvarende med rs.open, det kræver at rs er defineret globalt
Avatar billede bongo20 Nybegynder
22. juli 2005 - 17:50 #8
Jeg får denne fejl:

Der opstod en Microsoft VBScript-kørselsfejl (0x800A01C2)
Antallet af argumenter er forkert eller egenskabstildelingen er ugyldig: 'rs'
Avatar billede busschou Praktikant
22. juli 2005 - 17:54 #9
Men altså, hvis det var mig så ville jeg erklære rs, cn med mere og benytte en sub til at tildele dem ala
---
Dim rs,cn
Set rs = //noget create recordset
Set cn = //hvad den nu skal være
Sub query(sql)
  rs.open sql,cn
End Sub
---
så vil du udenfor bare kunne kalde
query("Select * From Test1")
og så kan du nu direkte bruge rs da den er Dim´et globalt
Avatar billede bongo20 Nybegynder
22. juli 2005 - 17:57 #10
Ok måske jeg vil gøre det sådan, men kan du se hvorfor det her sker:


Set rs = CreateObject("ADODB.Recordset")
Set cn = CreateObject("ADODB.Connection")
cn.Open "DRIVER={SQL Server};SERVER=mssql.test.com;DATABASE=test;UID=hem;PWD=hem"                   
               
rs = Query("Select * From Test")     
           
Function Query(sqlStr)
    rs.Open sqlStr, cn 
    Query = rs   
End Function



Dette får denne fejl:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A01C2)
Antallet af argumenter er forkert eller egenskabstildelingen er ugyldig: 'rs'
Avatar billede busschou Praktikant
22. juli 2005 - 17:59 #11
hmm ikke umiddelbart, hvilken linje er fejlen i?
Jeg kender ikke så meget til den måde at åbne recordset på desværre
Men det kunne også måske tyde på at man så ikke kan lave en funktion returnere et recordset, det kan jeg bare ikke lige forstå hvis man ikke kan, ville jeg mene man kunne
Avatar billede busschou Praktikant
22. juli 2005 - 18:01 #12
men altså der er da vist ingen grund til at have en funktion
Da du har erklæret rs højere oppe så er den jo tilgængelig
---
Set rs = CreateObject("ADODB.Recordset")
Set cn = CreateObject("ADODB.Connection")
cn.Open "DRIVER={SQL Server};SERVER=mssql.test.com;DATABASE=test;UID=hem;PWD=hem"                 
             
Query("Select * From Test")   
         
Sub Query(sqlStr)
    rs.Open sqlStr, cn
End Sub
-----
Burde være lige så godt og så kan du bruge rs som du vil
Avatar billede ksoren Nybegynder
22. juli 2005 - 18:12 #13
rs er et objekt, dvs der skal benyttes Set ved return

Set Query = rs
Avatar billede ksoren Nybegynder
22. juli 2005 - 18:13 #14
Personlig ville jeg nok bruge cn.Execute

Function Query(sqlStr)
    Set Query = cn.Execute(sqlStr)
End Function

Set rs = Query("...")
...
rs.Close
Avatar billede bongo20 Nybegynder
22. juli 2005 - 19:53 #15
Det virker glimrende, tak begge. Smider i et svar?
Avatar billede busschou Praktikant
22. juli 2005 - 19:55 #16
oki godt det virker :o)
Avatar billede ttopholm Nybegynder
23. juli 2005 - 02:06 #17
Bare til orientering kan en sub godt returnere en værdi, hvis variablen er defineret udenfor sub'en... fx.

dim returnvalue

sub tester(ord)
  returnvalue = ord
end sub

call tester("hej")
Response.write returnvalue

Men er lidt mere besværlig....
Avatar billede ksoren Nybegynder
23. juli 2005 - 02:14 #18
Det vil jeg så godt nok ikke kalde at 'returnere' en værdi :o
Avatar billede ksoren Nybegynder
23. juli 2005 - 02:28 #19
Hvis man skal have en Sub til at "returnere" en værdi, ville jeg nok bruge denne metode:

Hvis ByVal ikke angives explicit, vil rs pege på vores variabel udenfor

Sub Query(sqlStr, rs)
    Set rs = Conn.Execute(sqlStr)
End Sub

Dim rs
Call Query("select * from tal", rs)
Avatar billede busschou Praktikant
23. juli 2005 - 07:15 #20
ttopholm >> returnere, det må vist slås op i en ordbog ;o) For det der er ikke at returnere en værdi, det er at ændre en værdi. I min verden uden at slå det op i en ordbog så betyder returnere "at komme hjem"/"vende tilbage", på samme måde som ordet "return".
Du kan sende børnene i byen og enten kan de komme hjem med vare (returnere en vædi), eller også kan de spise dem undervejs (ikke returnere en værdi), men din pung bliver tom uanset hvad (den globale variabel) :o)
Avatar billede ttopholm Nybegynder
23. juli 2005 - 11:49 #21
ja.. det er nu rigtigt...
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