Just nu i M3-nätverket
Jump to content

funktion


Tenkes

Recommended Posts

Jag har en funktion som hämtar för och efternamn, adress, användarid och lite till från en databas och sedan returnerar de. Jag vill visa alla dessa saker på var sin plats i ett formulär. Mitt problem är att när jag gör tilldelningen (se nedan)

 

<%

dim varde

varde=Hamta

%>

 

så får jag allt på en enda rad eftersom jag hämtar allt på en gång. Hur gör jag för att det som returneras från min funktion ska kunna delas upp och visas på var sin plats i mitt formulär. Måste jag ha fler funktioner och hämta saker var för sig?

Link to comment
Share on other sites

Som du ser hämtar jag förnamn och efternamn med hjälp av min funktion.

Där det står value="????" i formuläret

skulle de placeras. Jag har testat value="<%=varde%>" men då får jag förnamn och efternamn på en rad.

 

 

<%option explicit%>

<%

dim varde

varde=Hamta

%>

 

<HTML><HEAD>

<BODY>

 

<FORM action="" method=POST name=form1>

<TABLE WIDTH="300" BORDER="0" CELLSPACING="1" CELLPADDING="1">

<TR>

<TD>Efternamn</TD>

<TD><INPUT type="text" name="Efternamn" value="????"></TD>

</TR>

<TR>

<TD>Förnamn</TD>

<TD><INPUT type="text" name="Förnamn" value="????"></TD>

</TR>

</TABLE>

</FORM>

 

</HEAD></HTML>

<SCRIPT LANGUAGE=vbscript RUNAT=Server>

dim Connection, rs, SQL, v

 

function Hamta()

 

set Connection=server.CreateObject("ADODB.Connection")

set rs=server.CreateObject("ADODB.Recordset")

 

Connection.open "DSN=test; UID=sa; PWD=; DATABASE=sql"

 

SQL="Select * From PersUppg"

 

rs.Open SQL, Connection

 

v=rs("FORNAMN") + rs("EFTERNAMN")

 

rs.Close

Hamta=v

end function

 

</SCRIPT>

 

[inlägget ändrat 2002-09-16 12:38:19 av Tenkes]

[inlägget ändrat 2002-09-16 12:41:58 av Tenkes]

Link to comment
Share on other sites

Eftersom functionen bara kan returnera en variabel så kanske du kan hitta ett sätt där du kan separera för- och efternamn innan du returnera variabeln v.

 

T ex

v = rs( "fornamn" ).value & "|" & rs( "efternamn" ).value

 

Tecknet | kanske kan vara en lämpligt separator en du kan välja ett tecken eller tecken kombination som du vet ej förekommer i namnen.

 

När du får tillbaka värdet från funktionen så kan du göra en split på värdet och då får du de uppdelade i två delar

 

Exempel

mHamta=Hamta

mHamtaArr = Split( "|" )

fornamn = mHamtaArr(0)

eftyernamn = mHamtaArr(1)

 

/Björn

 

 

Link to comment
Share on other sites

Jag får ett felmeddelande.

 

Error Type:

Microsoft VBScript runtime (0x800A0009)

Subscript out of range: '[number: 1]'

 

det är denna rad

efternamn = mHamtaArr(1)

 

Link to comment
Share on other sites

Jag är inte så insatt i funktionen split men jag skulle tro att den menar att den inte har/får ett efternamn i mHamtaArr(1). mHamtaArr(1) finns alltså inte, medan mHamtaArr(0) finns (om du nu hänger me). Jag skulle kolla på mHamtaArr(0) om vad det innehåller, tex det kan ju vara så att den innehåller efternamnet också...vilket då skulle tyda på att felskrivning i split-funktionen.

 

Sen kollade jag på din rad som kopplar upp sig mot databasen. Jag hoppas att du har ett lösen för användaren 'sa'. För ett blankt lösen är aldrig att rekomendera.

 

/MVH Muad'dib

Poäng för bra inlägg mottages...

-=*Socialt liv? Var laddar man ner det?*=-

 

 

[inlägget ändrat 2002-09-16 13:50:00 av Muaddib]

Link to comment
Share on other sites

Funktionen split retunerar en Array, för att kolla hur många värden du har i en Array så finns det en funktion som heter UBound( ). Du måste ändra i din funktion Hamta, har du gjort det?

Raden

v=rs("FORNAMN") + rs("EFTERNAMN")

ändras till

v=rs("FORNAMN") & "|" & rs("EFTERNAMN")

 

Sen ligger resten av dina ändringar i koden som anropar funktionen.

 

varde = Split( Hamta, "|" )

if UBound( varde ) > 2 Then

fornamn = varde(0)

efternamn = varde( 1 )

else

fornamn = "Saknas" ' Eller vad du nu föredrar

efternamn = "Saknas" ' Eller vad du nu föredrar

end if

 

 

En annan sak, du borde specificera vilka kolumner du skall hämta från tabellen, så din SQL stäng borde se ut så här istället:

SQL = "SELECT fornamn, efternamn FROM PersUppg"

 

När det gäller raden

v = rs( "FORNAMN" ) + rs( "EFTERNAMN" ) så gör operatorn + att den slår ihop strängarna ( om det är strängar ) men det är bättre att använda & operatorn istället. Du kollar inte om recorsetet du får tillbaka verkligen innehåller något värde vilket du borde göra.

Funktionen Hamta skulle se ut så här istället:

Function Hamta

Set Connection = Server.CreateObject( "ADODB.Connection" )

Connection.open "DSN=test; UID=SA; DATABASE=sql"

 

Set rs = Server.CreateObject( "ADODB.RecordSet" )

 

SQL = "SELECT TOP 1 fornamn, efternamn FROM PErsUppg"

 

rs.Open SQL, Connection

if Not rs.eof then

v = rs( "fornamn" ).value & "|" & rs( "efternamn" ).value

else

v = "Saknas förnamn" & "|" & "Saknas efternamn"

end if

 

rs.Close

Set rs = Nothing

Hamta = v

End Function

 

Referenser:

Om UBound

http://msdn.microsoft.com/library/en-us/script56/html/vsfctUBound.asp?frame=true

 

Om Split

http://msdn.microsoft.com/library/en-us/script56/html/vsfctsplit.asp?frame=true

 

Om operation &

http://msdn.microsoft.com/library/en-us/script56/html/vsoprConcatenation.asp?frame=true

 

Om operatorn +

http://msdn.microsoft.com/library/en-us/script56/html/vsoprAdd.asp?frame=true

 

 

Om du har fler konkreta frågor kan du maila på master@universe.tm

 

/Björn

 

Link to comment
Share on other sites

Mikael Ericsson

Ett annat sätt att skapa en funktion som returnerar ett antal värden:

 

function Frukter() 'returnerar 3 värden
dim retur(2)
retur(0)="Apelsin"
retur(1)="Banan"
retur(2)="Päron"
Frukter=retur
end function

dim MinaFrukter
MinaFrukter=Frukter()
alert(MinaFrukter(0))
alert(MinaFrukter(1))
alert(MinaFrukter(2))

function Bilar() ' returnerar okänt antal
dim retur()
redim preserve retur(0)
retur(0)="Volvo"
redim preserve retur(1)
retur(1)="Saab"
redim preserve retur(2)
retur(2)="Audi"
redim preserve retur(3)
retur(3)="Mazda"
Bilar=retur
end function

dim MinaBilar
MinaBilar=Bilar()
for i=0 to ubound(MinaBilar)
alert(MinaBilar(i))
next

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...