Avatar billede karsten_larsen Praktikant
21. februar 2006 - 23:24 Der er 8 kommentarer og
1 løsning

Funktion som ikke altid gør det den burde gøre!

Jeg bruger nedenståede script til lave en tilfældig kode som ikke må være lig med en eksisterende kode i databasen.

Et par gange har den genereret den samme kode, hvorved to brugere har samme kode. Det var jo ikke meningen.

Er der en bedre løsning end nedenstående:

Function lavKode(antal)
tilladtkarakter = "abcdefghijklmnopqrstuvwxyz23456789"
str = ""
for i = 1 to antal
randomize
index = Int(rnd * len(tilladtkarakter))+1
str = str & Mid(tilladtkarakter,index,1)
next
lavKode = str

strSQL = "Select kode from databse Where kode = '" & TRIM(lavKode) & "'"           
set rs = Conn.Execute(strSQL)
IF rs.EOF then
lavKode = str
else
lavKode(12)
end if
rs.close
Set rs = nothing
conn.CLose
Set conn = nothing               
End Function

Har overvejet om det skulle lægges i en Store procedure eller om det var bedre at tælle antallet af rækker med en tilsvarende kode. Så hvis nul så er koden accepteret.

??:-) karsten_larsen
Avatar billede arne_v Ekspert
21. februar 2006 - 23:32 #1
du bør kun kalde randomize en gang ...
Avatar billede eagleeye Praktikant
21. februar 2006 - 23:39 #2
du ska havde rette denne linje :

lavKode(12)

Så den føre resultatet tilbage hvis den bliver kaldt igen sådan her:

lavKode = lavKode(12)
Avatar billede eagleeye Praktikant
21. februar 2006 - 23:49 #3
Du kan lave en lille test koden som viser det :) Dette er din funktion uden database access og den taget også kun en random karakter og det er enten a, b eller c. Hvis koden er lig med "a" skal den forsøge at finde en ny.. Prøv at koden med skiftevis en af de to linier udkommentered:

lavKode(1)  'testen giver enten a,b eller c
lavKode = lavKode(1) 'testen giver enten b eller c

reload siden og se forskellen.



<%
Function lavKode(antal)
tilladtkarakter = "abc"
str = ""
randomize
for i = 1 to antal
index = Int(rnd * len(tilladtkarakter))+1
str = str & Mid(tilladtkarakter,index,1)
next
lavKode = str

IF not str = "a" then
lavKode = str
else
'lavKode(1)  'testen giver enten a,b eller c
lavKode = lavKode(1) 'testen giver enten b eller c
end if
End Function
response.write lavKode(1)
%>



En anden ting er det bevidst du har skrevet 12 og ikke skriver variablen antal så du overføre samme antal når du kalder funktion inde fra sig selv?

lavKode = lavKode(antal)
Avatar billede karsten_larsen Praktikant
22. februar 2006 - 08:44 #4
Tak for hjælpen. Jeg har tjekket det med "abc.. princippet" og der fungerer det fint samt med lavkode(12) og 400 poster - ingen dubletter.

Til andre som kan bruge det, så er løsningen:

Function lavKode(antal)
tilladtkarakter = "abcdefghijklmnopqrstuvwxyz23456789"
str = ""
for i = 1 to antal
'randomize kaldes før funktionen kaldes
index = Int(rnd * len(tilladtkarakter))+1
str = str & Mid(tilladtkarakter,index,1)
next
lavKode = str
strSQL = "Select kode from databasen Where kode = '" & TRIM(lavKode) & "'"
set rs = Conn.Execute(strSQL)
IF rs.EOF then
lavKode = str
else
lavKode = lavKode(antal)
end if
rs.close
Set rs = nothing
conn.CLose
Set conn = nothing               
End Function
           
%>
<!-- #include Virtual="db.inc" -->
<%
randomize
var_kode = lavKode(12)   


-> Arne, var det det du mente?
Randomize
lavKode(12)
Det kan sagtens køre sådan.

Vil I begge lave et svar, så fordeler jeg point i mellem jer.

:-) karsten_larsen
Avatar billede karsten_larsen Praktikant
22. februar 2006 - 08:47 #5
-> eagleeye, næhe..det med at kalde lavKode(12) inde i selve funktionen, var en fejl som jeg åbenbart havde set mig blind på.

:-) karsten_larsen
Avatar billede eagleeye Praktikant
22. februar 2006 - 14:05 #6
Ok her et svar ;-)
Avatar billede karsten_larsen Praktikant
24. februar 2006 - 08:19 #7
Venter lige med fordeling indtil Arne svarer
Avatar billede arne_v Ekspert
24. februar 2006 - 18:10 #8
jeg synes at du skal give eagleeye alle points, mit bidrag var meget beskedent
Avatar billede karsten_larsen Praktikant
24. februar 2006 - 18:41 #9
okay
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