Just nu i M3-nätverket
Gå till innehåll

Slumpa ut en vinnare


Micke_skane

Rekommendera Poster

Jaja.. messerschmitter.. du förstod ju iaf att det var nån typ av beröm? ;)

 

Trevlig helg! :)

 

Länk till kommentar
Dela på andra webbplatser

  • Svars 71
  • Skapad
  • Senaste svar
Ja, du har ju nästan snott min idé rätt upp o ner.
He he, men som sagt kollade inte så noga på din kod. "Great minds think alike";)

 

/Cluster

------------------------------------------------------

"Den som försummar att dricka ur erfarenhetens källa

kommer troligen att dö av törst i okunnighetens öken."

------> http://eforum.kicks-ass.net <------

 

Länk till kommentar
Dela på andra webbplatser

du förstod ju iaf att det var nån typ av beröm?
Absolut! Och tack!

 

/Cluster

------------------------------------------------------

"Den som försummar att dricka ur erfarenhetens källa

kommer troligen att dö av törst i okunnighetens öken."

------> http://eforum.kicks-ass.net <------

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Okej!

 

Min tanke är att jag vill spara alla som vunnit i en egen databas.

Typ :

"Insert into vinnare_tavlingen (vinnare_fornamn, vinnare_efternamn, stad) values ('"& sForNamn &"', osv...)"

Kan jag sätta RS(0) istället för sFornamn? Som jag ser det skulle jag det! För det är ju samma plats i rs-et!

Denna tabell ska vara underlag för att se vilka som vunnit under ett år samt se var dem bor. Kolla alltså geografiskt vilka som är målgruppen!

 

Sen har du sammanfogat hela posten som blir vald till en variabel som blir utskriven. Kan man göra om fälten ur den post som blivit vald till Egna variabler typ fornamn=rs(0) osv...

 

Min tanke är att jag på min admin-sida ska få ut alla fälten i en viss ordning:

förnamn efternamn

Postnummer Stad

Epost Telefon

 

men på förstasidan visas endast

förnamn efternamn

stad

 

Men det är klart: Vet att Du, Jenny, Inte gillar min tanke :) men man kan ju hämta värdena ifrån tabellen, som fått värdena ifrån INTO-satsen, som innehåller alla som vunnit. Då kan man ju välja där vilka <%=RS("")%> man vill ska skrivas ut... Eller???

Då kan ju slump-sidan Enbart vara en "slump-sida".

 

Förstår du min tanke :)

 

Självklart ska Ni ha poäng! Ska kolla upp hur man gör bara!

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

NU har ni fått varsin poäng :)

 

Hoppas den kommer väl till pass. Vad ska man med poängen till?

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Stefan Eklinder
Vad ska man med poängen till?

 

Vinna biobiljetter om man har tur. :-)

 

---

C:\Eforum\Stefan Eklinder>|

 

"Det finns två företeelser som är oändliga, universum och den mänskliga dumheten. Jag är dock inte säker på den förstnämnda."

 

- Albert Einstein

 

-->Passerade 10.000 inlägg den 1 maj 2005 kl: 16.48<--

 

Länk till kommentar
Dela på andra webbplatser

Vi tar det lätta först:

Poängen får vi genom att du klickar i våra respektive Poängstaplar för valt inlägg. :)

 

 

som svar på din fråga omdu kan använda rs-variablerna istället - jadå, så länge du inte kör en ny sql-fråga med rs = conn.execute(sSql) eftersom du då får andra värden i dina rs-variabler.

Dels därför, och dels för läsbarheten så föredrar jag att använda tydligare variabler. Det underlättar också för mig sen om jag vill ändra i sqlsatsen, jag behöver bara ändra på ett ställe... På flera ställen kan man också behöva göra om rs-variablerna (som blir av typen Field) till andra typer (t ex integer - nummer) och då måste jag ändå lagra dem på nytt ställe.

 

rs(0) pekar på första kolumnen i din selectsats, rs(1) på andra osv..

har man unika namn på kolumnerna kan man skriva rs("fornamn"), rs("efternamn") osv, men så fort man får två kolumner med samma namn så måste man ange med siffror (t ex då man joinar två tabeller)

 

Men - du kan alltså använda dem i insertsatsen om du vill, dock fortfarande med fnuttar på rätta ställena.

 

Sen har du sammanfogat hela posten som blir vald till en variabel som blir utskriven.

Jag är inte med på vad det är jag sammanfogat..??

Det är nog Cluster som gör det, jag gör som sagt inte så just pga att jag inte kan styra över informationen som jag vill då... :)

Läser du in dem i variabler så som jag gjort så kan du själv också välja hur de ska stå när du ska presentera dem.

 

Anledningen till att det inte visas mer än namnen o stad, gissar jag är för att du bara plockar ut förnamn, efternamn och stad i din sqlsats? Det är bara att hämta upp resten av kolumnerna och göra likadant med dem som de första 3. Glöm inte lägga in dem i din nya tabell sen.

 

Och ja, du har helt rätt - jag förstår inte varför du ska lägga in något i en tabell med hjälp av variabler och sen hämta samma värden med en ny sqlsats som tar mer tid, när värdena redan finns i variablerna....

 

Om du däremot ska hämta upp dem på en annan sida - då pratar vi nåt helt annat..! Jag skulle ändå råda dig att använda dig av id:n på posterna så att du är säker på att du hämtar rätt post och på snabbaste sätt... "Senast inlagd" är lite suspekt.. Du får helt enkelt se till att skicka det id som blev på vinnaren i nya tabellen till den sida som ska hämta upp informationen (kan göras t ex genom javascript)!

 

Lycka till igen!!

 

 

 

[inlägget ändrat 2005-05-13 19:08:06 av Jenny R]

[inlägget ändrat 2005-05-13 19:11:58 av Jenny R]

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Jag menade att Cluster sammanfogade :)

 

Ska läsa ditt brev ett par gånger och testa för jag förstod inte nu direkt :)

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej Jenny,

 

Försökt att få Din kod men jag får bara att sidan inte kan visas:

såklart så måste jag Sätta igång sql-satserna. Det hade jag ju inte gjort, om du oxå påpekade emn jag tycker att jag har skrivit in rätt kod nu men tydligen inte. Såhär ser koden ut nu:

 

<%@ Page Language="VB" %>
<%@ import Namespace="System.Data.OleDB" %>
<%

[color="#006400"]'# Databasanslutning
'Dim myConnection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Server.MapPath("db2/vinstval_namn.mdb"))[/color]
Set Conn = Server.CreateObject("ADODB.Connection")
ConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2/vinstval_namn.mdb")
Conn.Open ConnString
[color="#006400"]'Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)

   '#==========Hämta Antal namn i databasen================[/color]
sSql = "Select namnID from vinst_urval where svarat_ratt=true"
set rs = Conn.Execute(sSql)
[color="#006400"]'#==========Deklarera Array=============[/color]
   DIM anNamnId(), nDim, nAntal
     nAntal = 0
     nDim = 0
[color="#006400"]'===========Lägg namnen i arrayn========[/color]
While not rs.EOF 
     nAntal = nAntal + 1
     If nDim < nAntal Then
     nDim = nDim + 2
     ReDIM preserve anNamnId( nDim )
     End if
     anNamnId( nAntal ) = rs("namnID")
     rs.MoveNext
   Wend

[color="#006400"]'==========Slumpa fram ett ID ur nValdVinnareID=============[/color]
Randomize
   nSlumpadeID = Rnd(1)*nAntal

[color="#006400"]'=============Hämta rätt ID==============[/color]
nValdVinnarID = anNamnId( nSlumpadeID )
   sSql = "Select vinst_fornamn, vinst_efternamn, stad from vinst_urval where namnID = "&nValdVinnarID
   Set rs = Conn.Execute(sSQL)
[color="#006400"]'============Skapa variabler med värdena=============[/color]

   sForNamn = rs("vinst_fornamn")
sEfterNamn = rs("vinst_efternamn")
sStad = rs("stad")

  [color="#006400"] '=========Lägg in i ny tabell (hämta ev id för nya tabellen om du inte har automatik på det)=========[/color]
    sSql = "Insert into vinnare_tavlingen (vinnare_fornamn, vinnare_efternamn, stad) values ('"& sForNamn &"', '"& sEfterNamn &"', '"& sStad &"')"
 Set rs = Conn.Execute(sSQL)
  [color="#006400"] '=========Notera enkelfnuttarna kring namnet eftersom det är en sträng=========[/color]

   [color="#006400"]'=========Töm urvalstabell=============
    'sSql = "delete from vinst_urval"

'End Sub[/color]
Conn.Close
Set Conn = Nothing
%>

<html>
<head>
<title>Slumpa ut en vinnare med Array</title>
</head>

<body>
<%
 Response.Write sForNamn
%>
</body>

 

Är där nått jag glömt? Jag sätter ju igång alla sql-satser och jag har ju deklarerat variablerna och använder dem som jag ska...Tycker jag :)

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Flyttar tråden till ASP & VBScript

 

/OZn - Moderator för Access

_______________________________________________________

Microchips - De små potatisflingorna du äter allra sist i chipspåsen

 

Länk till kommentar
Dela på andra webbplatser

sSql = "Select vinst_fornamn, vinst_efternamn, stad from vinst_urval where namnID = "&nValdVinnarID

Set rs = Conn.Execute(sSQL)

 

Du kör inte rätt sqlsats.. strängen sSQL är ingen sql-sats, men strängen sSql är .... Den är case-sensitive..

Det är likadant vid insert-satsen.

 

Jag har ju inte dimmat alla variabler ordentligt, men du kanske har lagt till alla andra någon annanstans...? :) ASP är ju förlåtande och tillåter dig att använda icke-dimmade variabler, utan att bråka.

 

När du får "sidan kan inte visas" så får du kanske också ett felmeddelande av asp-motorn som talar om vad och vilken rad som felar? Posta gärna med det och markera raden i din kod så vi kan se den.

 

Och nu kan jag tipsa om LOG-knappen ovan..

Har du ett långt inlägg - tryck LOG, klistra in texten, tryck LOG igen.

Då får du [ L O G ] och [ / L O G ] runt texten (fast utan mellanslagen) och det för att din text gråas och fälls in bakom plustecknet.. (se ex i Clusters inlägg)..

 

//Jenny

 

[inlägget ändrat 2005-05-14 02:27:47 av Jenny R]

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej Jenny,

 

Sent upp :)

 

Där ser man. Har man lärt sig ännu en sak ang Case sensitive och Asp:)

Jag har missat det själv men jag brukar vara väldigt noga med att det ska vara likadant bara för att undvika såna här fel :)

 

Jag har faktiskt fått det att fungera nästan fullt ut.

Jag tog bort:

[MÄRK]<%[/MÄRK]@ Page Language="VB" [MÄRK]%>[/MÄRK]
[MÄRK]<%[/MÄRK]@ import Namespace="System.Data.OleDB" [MÄRK]%>[/MÄRK]

 

Och då visades sidan med eventuella fel.

Kollade sen att skriva ut Array och det fungerade.

Sidan slumpar nu ut namnen som svarat rätt men Ibland kommer detta felmeddelandet:

Syntax error (missing operator) in query expression 'namnID ='.

Raden den pekar på är där Sql-satsen om att hämta rätt ID körs (Execute).

 

Att skicka värdena vidare till den andra tabellen fungerar!

 

Ang LOG så har jag lärt mig en sak till nu :)

Såhär ser min kod ut nu:

[log]

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

 

<%

'#=========Databasanslutning============#

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

ConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2/vinstval_namn.mdb")

Conn.Open ConnString

 

'#==========Hämta Antal namn i databasen================#

sSql = "Select namnID from vinst_urval where svarat_ratt=true"

set rs = Conn.Execute(sSql)

'#==========Deklarera Array=============#

DIM anNamnId(), nDim, nAntal

nAntal = 0

nDim = 0

'#===========Lägg namnen i arrayn========#

While not rs.EOF

nAntal = nAntal + 1

If nDim < nAntal Then

nDim = nDim + 2

ReDIM preserve anNamnId( nDim )

End if

anNamnId( nAntal ) = rs("namnID")

rs.MoveNext

Wend

 

'#==========Slumpa fram ett ID ur nValdVinnareID=============#

Randomize

nSlumpadeID = Rnd(1)*nAntal

 

'#=============Hämta rätt ID==============#

nValdVinnarID = anNamnId( nSlumpadeID )

sSql = "Select vinst_fornamn, vinst_efternamn, stad from vinst_urval where namnID = "&nValdVinnarID

Set rs = Conn.Execute(sSql) Här pekar felet på!!!

'#============Skapa variabler med värdena=============#

 

sForNamn = rs("vinst_fornamn")

sEfterNamn = rs("vinst_efternamn")

sStad = rs("stad")

 

'#=========Lägg in i ny tabell (hämta ev id för nya tabellen om du inte har automatik på det)=========#

sSql = "Insert INTO vinnare_tavling (vinnare_fornamn, vinnare_efternamn, vinnare_stad) values ('"& sForNamn &"', '"& sEfterNamn &"', '"& sStad &"')"

Set rs = Conn.Execute(sSql)

'#=========Notera enkelfnuttarna kring namnet eftersom det är en sträng=========#

 

'#=========Töm urvalstabell=============#

'sSql = "delete from vinst_urval"

 

Conn.Close

Set Conn = Nothing

%>

 

<html>

<head>

<title>Slumpa ut en vinnare med Array</title>

</head>

 

<body>

<%

Response.Write sForNamn & " " & sEfterNamn & " " & sStad

%>

</body>

</html>

[/log]

 

Vad är Din tanke på att det ibland dyker upp felmeddelandet?

I tabellen har alla fälten som ska ingå värden i sig.

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Hej Micke!

 

Enligt felmeddelandet så säger den att värdet för nValdVinnarID saknas, vilket då skulle innebära att positionen i arrayen inte har något värde. Vi har ju faktiskt en post utan värde, och det är posten 0 (första positionen i arrayen). Om du skulle få slumptalet 0 så finns ju inget värde.

 

Du skulle kunna lägga in en felhantering på detta (punkter är indentering - ta bort dem..)

bOk = [color="#0000ff"]False[/color]
[color="#006400"][GRÖN]'så länge bOk inte är TRUE, slumpa fram ett nytt tal[/color]
[color="#006400"]'i de flesta fall kommer den bara att köras en gång, men i de fall [/color]
[color="#006400"]'de slumpade talet inte är ok så slumpar den om talet[/color][/GRÖN]
[color="#0000ff"]While[/color] [color="#0000ff"]Not[/color] bOk
..[color="#0000ff"]Randomize[/color]
..nSlumpadeID = [color="#0000ff"]Rnd[/color](1)*nAntal
..[color="#0000ff"]If[/color] nSlumpadeID > 0 [color="#0000ff"]And[/color] nSlumpadeID < (nAntal+1) [color="#0000ff"]Then[/color]
[color="#006400"][GRÖN]'det slumpade talet är ok..[/color][/GRÖN]
....bOk = [color="#0000ff"]True[/color]
..[color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
[color="#0000ff"]Wend[/color]

 

Jag brukar inte jobba med Randomizern, så ev kan det vara så att det är smartare att starta själva slumpmotorn (Randomize) utanför while-snurran och sen bara köra funktionen Rnd() inne i snurran.

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej Du,

 

Det är nog så att det är positionen 0 som inte går.

Sätts den till 0 bara för att man ska veta att värdet börjardärifrån eller?

Är nAntal = "" samma som nAntal = 0? För annars kunde man kanske sätta den = "" så kan position 0 ingåi slumpen...

 

Dit förslag på regel förstod jag men inte om man skulle ta bort allt annat som oxå ingick tidigare i While-satsen.

 

Ska testa och se vad som händer :)

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej igen,

 

Testat nu och sidan tar SÅ LÅNGT tid på sig att man inte orkade vänta.

Tror den kör om Randomize-funktionen hela tiden då den ingår i While-satsen. Lade Randomize utanför While-satsen men det var samma sak då med.

 

Jag tror att det var bättre att ha hela slump-funktionen utanför bara man kan få Arrayen att hantera sina positioner bättre...

 

Eller vad tror Du? Kan man inte få att alla platser ska ingå :)

 

Micke :)

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej Cluster,

 

Satt och förökte få Ditt exempel uppdelat istället för att ha En sammalagen sträng.

 

Fick bara att sidan inte kunde visas :thumbsup: Ovanligt...

 

Såhär ändrade jag i den kod:

[log]

<body>

<%

' Skapa databasakopplingen

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

connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2/vinstval_namn.mdb")

conn.open connStr

 

' Hämta info, på alla de som svarat rätt, från databasen

SET RS=conn.execute("SELECT vinst_fornamn, vinst_efternamn, stad FROM vinst_urval WHERE svarat_ratt=true")

 

IF RS.EOF THEN

Response.Write("Det finns ingen som svarat rätt!")

ELSE

'Skapa en sträng med alla som svarat rätt

DO Until RS.EOF

namnIDstr = namnIDstr&RS(0)&" "&RS(1)&", "&RS(2)&"|"

'namnIDstr = namnIDstr&RS("namnID")"|"

RS.MoveNext

Loop

 

'Ta bort sista |-tecknet

namnIDstr = Left(namnIDstr, (Len(namnIDstr)-1))

 

' Skapa array med de som svarat rätt

namnIDarr = Split(namnIDstr, "|")

 

' Kolla antal positioner i arrayen

antalNamn = Ubound(namnIDarr)

 

' Slumpa fram ett tal

Randomize

slumpTal = cLng(Rnd*antalNamn)

 

'Set RS=conn.execute("Select vinst_fornamn, vinst_efternamn, stad FROM vinst_urval WHERE namnID="& namnIDarr(slumpTal)

 

' Skriv ut vinnar-infon

Response.Write(namnIDarr(slumpTal)) Denna rad som kommentar!

END IF

 

SET RS = Nothing

 

'Stäng databaskopplingen

conn.Close

Set conn = Nothing

%>

<%=RS("vinst_fornamn")%> <=RS("vinst_efternamn")%><br>

<=R("stad")%>

</body>

[/log]

 

Allt det blåa är saker jag själv lagt till och jag satte kommentarer på det sakerna som stod precis ovanför vid att skapa en sträng.

Tänkte att jag skulle bygga arrayen med ID-numret istället och sedan hämta värdena med den blåa execut-satsen .

 

Då tänkte jag att man skulle kunna skriva ut dem sedan.

Men hur kan man göra dem aktulla fälten som blivit utvalda ur slump-funktinen till variabler istället? Om man får dem til variabler istället kan man ju göra vad man vill med dem sedan :) Nästan allt

:)

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Micke

 

Arrayers startposition är alltid på position 0. Array[0] kan vara tom, men det är inte sama sak som att nAntal = "".. nAntal är i ovan givna exempel 0 medan arrayen Array[0] kan vara "" (tom sträng).

Eftersom jag ofta använder själva positionsangivaren som räknare, så startar jag hellre mina räknare på postition 1, för då får jag också rätt antal poster i tabellen i min variabel nAntal.

 

När du selectar mot databasen så anger du helst vilka kolumner du vil ha fram (namn, stad, telefonnr t ex). Dessa kan du sen hänvisa via databaskopplingens namn (i ditt fall Conn) och sen antingen positionen kolumnen hade i sqlsatsen (dvs Conn(0) hämtar namnvärdet ) eller via kolumnens namn (om det är unikt i sqlsatsen)(dvs Conn("namn") hämtar namn-värdet).

För att tilldela dessa till variabler:

sVariabel= Conn(0)

ELLER

sVariabel = Conn("namn")

 

Så fort du hämtar en ny rad (MoveNext) eller så fort du ställer en ny (annan) fråga (när du kör execute) så får du nya värden i Conn-variablerna.

 

När du ska köra Clusters kod (omarbetad av dig) så kan du ju inte skapa en sträng av namnID - du har ju inte selectat det värdet...

 

Vidare så har du missat ett "s" i "RS" i sista utskriften samt ett "%" i en "<%=" vid samma utskrift.

 

Ang felhanteringen av min egna kod, med whilesnurran -

Kolla vad det är för värde som är framslumpat, för det verkar som om det inte är större än 0 och mindre än nAntal+1 eftersom det inte går in och sätter bOk till TRUE så att loopen avbryts.

Kan ju vara typen som felar, sätt då det framslumpade värdet till

nSlumpadeID = cLng( nSlumpadeID ) så att de får kompatibla typer när du sen jämför mot 0 och nAntal + 1.

 

Och återigen.. försök felsöka din kod noggrannare samt posta ev rad och så som den pekar på.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej Jenny,

 

Det låter ju klokt att tabellen samt räknaren har Samma "värde" :)

 

Har testat att skriva ut det slumpade värdet, var dock lite osäker på Vad som ska vara med i koden under alla dessa tester...

Såhär gjorde jag:

[log]

<%

'#=========Databasanslutning============#

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

ConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2/vinstval_namn.mdb")

Conn.Open ConnString

 

'#==========Hämta Antal namn i databasen================#

sSql = "Select namnID from vinst_urval where svarat_ratt=true"

set rs = Conn.Execute(sSql)

'#==========Deklarera Array=============#

DIM anNamnId(), nDim, nAntal

nAntal = 0

nDim = 0

'#===========Lägg namnen i arrayn========#

bOk = False

 

While Not bOk

nAntal = nAntal + 1

Randomize

nSlumpadeID = Rnd(1)*nAntal

Response.Write nSlumpadeID

'nSlumpadeID = cLng(nSlumpadeID)

If nSlumpadeID > 0 And nSlumpadeID < (nAntal+1) Then

bOk = True

'nDim = nDim + 2

'ReDIM preserve anNamnId( nDim )

End if

'anNamnId( nAntal ) = rs("namnID")

'rs.MoveNext

Wend

 

'#==========Slumpa fram ett ID till nValdVinnareID=============#

'Randomize

'nSlumpadeID = Rnd(1)*nAntal

 

'#=============Hämta rätt ID==============#

nValdVinnarID = anNamnId( nSlumpadeID )

sSql = "Select vinst_fornamn, vinst_efternamn, stad from vinst_urval where namnID = "&nValdVinnarID

Set rs = Conn.Execute(sSql)

'#============Skapa variabler med värdena=============#

 

sForNamn = rs("vinst_fornamn")

sEfterNamn = rs("vinst_efternamn")

sStad = rs("stad")

 

'#=========Lägg in i ny tabell (hämta ev id för nya tabellen om du inte har automatik på det)=========#

'sSql = "Insert INTO vinnare_tavling (vinnare_fornamn, vinnare_efternamn, vinnare_stad) values ('"& sForNamn &"', '"& sEfterNamn &"', '"& sStad &"')"

'Set rs = Conn.Execute(sSql)

'#=========Notera enkelfnuttarna kring namnet eftersom det är en sträng=========#

 

'#=========Töm urvalstabell=============#

'sSql = "delete from vinst_urval"

 

Conn.Close

Set Conn = Nothing

%>

 

<html>

<head>

<title>Slumpa ut en vinnare med Array</title>

</head>

 

<body>

<%

Response.Write sForNamn & " " & sEfterNamn & " " & sStad

%>

</body>

</html>[/log]

 

Jag har testat en del olika varianter.

Dels utan att hämta ut fornamn... och bara skriva ut slumptalet men även som jag skickat in här där jag hämtar ut fälten.

Får alltid ett värde om är 0.XXXXXXX och IBLAND över 1 men då finns det med på slutet av värdet E-2 eller E-3. Det blir nästan hela tiden ett värde mellan 0-1. Då jag väljer att skriva ut fälten står där "bara"

Subscript out of range

 

Vilket kanske inte är konstigt om det inte är ett heltal som hämtas...

Det gjorde ingen skillnad om jag skrev nSlumpadeID = cLng(nSlumpadeID) eller om Randomize var inne i While-satsen eller inte.

 

Har jag skrivit rätt för att få reda på det Du/Vi ville ha reda på? :)

 

Ang Clusters variant så missade jag helt att jag inte gjort om hämtningen av namnID MEN Tyvärr så fick jag inte det att fungera ändå :thumbsdown:

Kan det ha med att stängen som skapas Nu är enbart ID-siffror, så att när det sen ska delas upp så "krockar" koden. Tycker att det inte ska göra det för det är ju bara ett värde som fornamn osv är...Men man vet ju aldrig.

Får testa vidare!

Missarna med rs och % blev då jag skrev in det här. Går lite fort ibland över tagenterna...

Nu ser hans kod ut så här:

Sidan kan inte visas då man kör den...

[log]

<%

' Skapa databasakopplingen

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

connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2/vinstval_namn.mdb")

conn.open connStr

 

' Hämta info, på alla de som svarat rätt, från databasen

SET RS=conn.execute("SELECT namnID FROM vinst_urval WHERE svarat_ratt=true")

 

IF RS.EOF THEN

Response.Write("Det finns ingen som svarat rätt!")

ELSE

'Skapa en sträng med alla som svarat rätt

DO Until RS.EOF

'namnIDstr = namnIDstr&RS(0)&" "&RS(1)&", "&RS(2)&"|"

namnIDstr = namnIDstr&RS("namnID")&"|"

RS.MoveNext

Loop

 

'Ta bort sista |-tecknet

namnIDstr = Left(namnIDstr, (Len(namnIDstr)-1))

 

' Skapa array med de som svarat rätt

namnIDarr = Split(namnIDstr, "|")

 

' Kolla antal positioner i arrayen

antalNamn = Ubound(namnIDarr)

 

' Slumpa fram ett tal

Randomize

slumpTal = cLng(Rnd*antalNamn)

 

Set RS=conn.execute("Select vinst_fornamn, vinst_efternamn, stad FROM vinst_urval WHERE namnID=")& namnIDarr(slumpTal)

 

' Skriv ut vinnar-infon

'Response.Write(namnIDarr(slumpTal))

END IF

 

SET RS = Nothing

 

'Stäng databaskopplingen

conn.Close

Set conn = Nothing

%>

<%=RS("vinst_fornamn")%>

</body>

</html>[/log]

 

Känns som vi är/var nära att det skulle fungera men inte riktigt än :)

Och vi kan inte skylla på fredagen den 13 eller att det är måndag :)

 

Är där nått mer Du vill veta om koden?

Nu blev det mycket info men det kanske kan underlätta :)

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Tänkte att jag skulle bygga arrayen med ID-numret istället och sedan hämta värdena med den blåa execut-satsen.

Ok, men varför vill du köra ytterligare en sql-fråga? Du kommer enbart förlora prestanda...

 

Om man får dem til variabler istället kan man ju göra vad man vill med dem sedan :) Nästan allt

Vad är det som du vill göra som du inte kan göra nu? Om du vill ha ut förnamn, efternamn och stad (på vinnaren) i tre separata variabler så kan du ändra inläsningen i arrayen så att du enkelt kan dela upp den post som slumpar fram. Om du vill ha med ID:t för framtida behandling så är det inte heller några problem.

[log]

[MÄRK]<%[/MÄRK]@LANGUAGE=[GRÅ]"VBSCRIPT"[/GRÅ] CODEPAGE=[GRÅ]"1252"[/GRÅ][MÄRK]%>[/MÄRK]
<!DOCTYPE HTML [color="#0000ff"]Public[/color] [GRÅ]"-//W3C//DTD HTML 4.01 Transitional//EN"[/GRÅ] [GRÅ]"http://www.w3.org/TR/html4/loose.dtd"[/GRÅ]>
<html>
<head>
<meta http-equiv=[GRÅ]"Content-Type"[/GRÅ] content=[GRÅ]"text/html; charset=iso-8859-1"[/GRÅ]>
<title>Slumpa ut en vinnare</title>
</head>
<body>
[MÄRK]<%[/MÄRK]
[color="#006400"]' Skapa databasakopplingen[/color]
[color="#0000ff"]Set[/color] conn = [b]Server[/b].[color="#0000ff"]CreateObject[/color]([GRÅ]"ADODB.Connection"[/GRÅ])
connStr = [GRÅ]"Provider=Microsoft.Jet.OLEDB.4.0; Data Source="[/GRÅ] & [b]Server[/b].MapPath([GRÅ]"db2/vinstval_namn.mdb"[/GRÅ])
conn.open connStr

[color="#006400"]' Hämta info, på alla de som svarat rätt, från databasen[/color]
[color="#0000ff"]Set[/color] RS=conn.[color="#0000ff"]Execute[/color]([GRÅ]"SELECT namnID, vinst_fornamn, vinst_efternamn, stad FROM vinst_urval WHERE svarat_ratt=true"[/GRÅ])

[color="#0000ff"]If[/color] RS.EOF [color="#0000ff"]Then[/color]
   [b]Response[/b].Write([GRÅ]"Det finns ingen som svarat rätt!"[/GRÅ])
[color="#0000ff"]Else[/color]
   [color="#006400"]'Skapa en sträng med alla som svarat rätt[/color]
   [color="#0000ff"]Do[/color] Until RS.EOF
      namnIDstr=namnIDstr&RS(0)&[GRÅ]":"[/GRÅ]&RS(1)&[GRÅ]":"[/GRÅ]&RS(2)&[GRÅ]":"[/GRÅ]&RS(3)&[GRÅ]"|"[/GRÅ]
      RS.MoveNext
   [color="#0000ff"]Loop[/color]

   [color="#006400"]'Ta bort sista |-tecknet[/color]
   namnIDstr=[color="#0000ff"]Left[/color](namnIDstr, ([color="#0000ff"]Len[/color](namnIDstr)-1))

   [color="#006400"]' Skapa array med hämtade namnID[/color]
   namnIDarr=[color="#0000ff"]Split[/color](namnIDstr, [GRÅ]"|"[/GRÅ])

   [color="#006400"]' Räkna antal namnID i arrayen[/color]
   antalNamn=[color="#0000ff"]UBound[/color](namnIDarr)

   [color="#006400"]' Slumpa fram ett tal för att kunna välja namnID i arrayen[/color]
   [color="#0000ff"]Randomize[/color]
   slumpTal =[color="#0000ff"]CLng[/color]([color="#0000ff"]Rnd[/color]*antalNamn)

   [color="#006400"]' Gör om [GRÅ]"vinnar-positionen"[/GRÅ] i arrayen till en sträng[/color]
   vinnarStr=namnIDarr(slumpTal)

   [color="#006400"]'Dela upp strängen i variabler genom att skapa en temporär array[/color]
   tempArr=[color="#0000ff"]Split[/color](vinnarStr,[GRÅ]":"[/GRÅ])
   vinst_ID=tempArr(0)
   vinst_fornamn=tempArr(1)
   vinst_efternamn=tempArr(2)
   vinst_stad=tempArr(3)

[color="#0000ff"]End[/color] [color="#0000ff"]If[/color]

[color="#0000ff"]Set[/color] RS=[color="#0000ff"]Nothing[/color]

[color="#006400"]'Stäng databaskopplingen[/color]
conn.Close
[color="#0000ff"]Set[/color] conn = [color="#0000ff"]Nothing[/color]
[MÄRK]%>[/MÄRK]
<h1>WE HAVE A WINNER!</h1>
<strong>ID</strong>: [MÄRK]<%[/MÄRK]=vinst_ID%><br>
<strong>Förnamn</strong>: [MÄRK]<%[/MÄRK]=vinst_fornamn%><br>
<strong>Efternamn</strong>: [MÄRK]<%[/MÄRK]=vinst_efternamn%><br>
<strong>Stad</strong>: [MÄRK]<%[/MÄRK]=vinst_stad%>
</body>
</html>

[/log]

 

/Cluster

------------------------------------------------------

"Den som försummar att dricka ur erfarenhetens källa

kommer troligen att dö av törst i okunnighetens öken."

------> http://eforum.kicks-ass.net <------

 

[inlägget ändrat 2005-05-15 11:37:16 av Cluster]

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej Cluster,

 

Det fungerar!!! :)

 

Varför jag ville dela upp dem var för att jag ska skicka värdena vidare och jag visste inte Hur man skulle kunna göra det utan att dem var uppdelade.

Jag vet hur jag skickar vidare saker till en annan tabell genom att använda variablena typ:

 

[GRÅ]"Insert INTO vinnare_tavling (vinnare_fornamn, vinnare_efternamn, vinnare_stad) values ('"[/GRÅ]& vinst_fornamn &[GRÅ]"', '"[/GRÅ]& vinst_efternamn &[GRÅ]"', '"[/GRÅ]& vinst_stad &[GRÅ]"')"[/GRÅ]

 

Kunde jag ha gjort det med Sättet som Du skrev innan med sammaslaget värde?

 

Som det är nu så kvittar det att man rensar tabellen där slumpen sker ifrån? Tänker att ID-numret ändras ju efter man raderat Allt ur tabellen. Det fortsätter ju därifrån den sista om stod i tabellen hade Sitt ID-värde.

Varför jag vill radera är för att det är ju en ny tävling varje månad.

 

Återigen STORT tack!

 

Micke

 

[inlägget ändrat 2005-05-15 13:15:34 av Micke_skane]

Länk till kommentar
Dela på andra webbplatser

Morsning!

Jag har med intresse följt era inlägg och vill nu lämna ett förslag på hur jag skulle ha löst det hela.

Problem är två som jag ser det:

1) Hur många tänkbara vinnare finns det

2) Vem av dessa är vinnare

Jag hade utan tvekan valt två sql-frågor för att lösa det hela.

1) Den första för att hämta alla tänkbara vinnare

2) Den andra för att hämta info om den som vann.

Dessutom finns aspekten med snabbheten. Om jag vill att sidan ska ladda snabbt så vill jag inte gärna göra någon form av loop. Man kan tänka sig att tävlingen blir extremt populär, med en loop kan sidan bli extremt långsam att ladda.

Dessutom hade jag absolut inte raderat någonting. Jag hade hellre lagt till en kolumn med tävlingsomgång.

Nåväl, här är mitt kodförslag:

<% option explicit

response.buffer = true

 

randomize

 

'*************** OPEN THE DATABASE

dim conn

set conn = Server.CreateObject ("ADODB.Connection")

conn.open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db/db.mdb")

 

dim sql, rs

 

sql = "SELECT personID "

sql = sql & "FROM tblPerson "

sql = sql & "WHERE "

sql = sql & "tavlingsOmgang = 1 "

sql = sql & "AND "

sql = sql & "svaratRatt = 1"

set rs = conn.execute(sql)

 

dim strPersonID, arrPersonID, antalPersonID

strPersonID = rs.GetString(,,"",",","")

strPersonID = Left(strPersonID, Len(strPersonID)-1)

arrPersonID = split(strPersonID,",")

antalPersonID = UBound(arrPersonID)+1

 

dim intRandomVinnare

intRandomVinnare = int(rnd()*antalPersonID)

 

dim intVinnare

intVinnare = arrPersonID(intRandomVinnare)

 

sql = "SELECT personID, forNamn, efterNamn, stad, svaratRatt "

sql = sql & "FROM tblPerson "

sql = sql & "WHERE "

sql = sql & "personID = "&intVinnare&""

set rs = conn.execute(sql)

 

dim intPersonID, strForNamn, strEfterNamn, strStad, intSvaratRatt

intPersonID = int(rs("personID"))

strForNamn = trim(rs("forNamn"))

strEfterNamn = trim(rs("efterNamn"))

strStad = trim(rs("stad"))

intSvaratRatt = int(rs("svaratRatt"))

 

conn.close

set conn = nothing

 

response.write "<b>Vinnare Är</b><br>"

response.write intPersonID & "<br>"

response.write strForNamn & "<br>"

response.write strEfterNamn & "<br>"

response.write strStad & "<br>"

response.write intSvaratRatt & "<br>"

%>

Inte speciellt mycket kod och dessutom mycket snabbladdat.

Vad sägs?

/donRollo

 

[inlägget ändrat 2005-05-15 15:03:29 av donRollo]

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej donRollo,

 

Kul att du följt "dåkissåpan" :)

 

Din variant är oxå Kanon, i mina ögon!

Varför hade du inte tömt databasen? Vill gärna veta Varför?

 

Angående Loop eller inte och om det skulle slöa ner sidan så har det inte så stor inverkan då sidan ska fungera som Admin-sida där jag själv kör sidan för att få ut en vinnare varje månad. Sidan kommer Inte att köras av dem som tävlar. Dem fyller bara i uppgifter som fylls i databasen där jag sen slumpar ut en vinnare.

 

Hur menar du att du hade gjort med tavlingsOmgang = 1?

Hur skulle det ha sköts i databasen?

Du menar att du hade fyllt på med ett nytt fält, hur sköter tavlingsOmgang = 1 det?

 

Förstår inte riktigt Din databas uppbyggnad?

Men jag vill gärna veta :)

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Vad jag menade när jag gav dig felhanteringssnurran var att den skulle läggas in som ett eget paket vid randomizern, inte att du skulle förstöra loopen där du lägger in namnen..

Har lagt in paketen så som jag hade tänkt, plus nya kommentarer.

 

[log]'#==========Deklarera Array=============DIM anNamnId(), nDim, nAntal

nAntal = 0

nDim = 0

'===========Lägg namnen i arrayn========

While not rs.EOF

..nAntal = nAntal + 1

..If nDim < nAntal Then

....nDim = nDim + 2

....ReDIM preserve anNamnId( nDim )

..End if

..anNamnId( nAntal ) = rs("namnID")

..rs.MoveNext

Wend

 

bOk = False

'så länge bOk inte är TRUE, slumpa fram ett nytt tal

'i de flesta fall kommer den bara att köras en gång, men i de fall

'de slumpade talet inte är ok så slumpar den om taletWhile Not bOk

..Randomize

'vad får du 1an från i Rnd-funktionen?

..nSlumpadeID = Rnd(1)*nAntal

'gör om till heltal om det nu är decimaltal

..nSlumpadeID = cInt( nSlumpdadeID )

'felsökningstips

..response.write "SLUMPADE ID: "&nSlumpadeID

..If nSlumpadeID > 0 And nSlumpadeID < (nAntal+1) Then

'det slumpade talet är ok......bOk = True

..End If

Wend[/log]

 

 

 

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej Jenny,

 

Det fungerar Toppen!

Får inga felmeddelanden om att någon array-plats inte stämmer.

 

Jag trodde innan att jag skulle ersätta slump-satsen med den andra satsen...Jag som missförstod...

 

Men det fungerar bra!

 

Stort TACK :thumbsup:

 

Vet du nått om datum-funktioner i Asp? Hur man kan göra så att månader skrivs ut på svenska? Tänkte använda ett hidden-fält i formuläret där aktuell månad följs med in i databasen då man skickar in sin medverkan i tävlingen. Så är Min tanke :)

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Vet du nått om datum-funktioner i Asp? Hur man kan göra så att månader skrivs ut på svenska? Tänkte använda ett hidden-fält i formuläret där aktuell månad följs med in i databasen då man skickar in sin medverkan i tävlingen.
Jag skulle föreslå att du har datumformat på kolumnen i databasen och sköter formateringen vid utskrift. Då kan du använda Now() för datum&tid eller Date() för enbart datum.

Sedan kan du plocka ut år/mån/dag ur detta.

Testa tex:

dittDatum=[color="#0000ff"]Now[/color]()
dagen=[color="#0000ff"]Day[/color](dittDatum)
manaden=[color="#0000ff"]Month[/color](dittDatum)
aret=[color="#0000ff"]Year[/color](dittDatum)

...för att få en bild av hur det fungerar.

Kolla tex på http://www.w3schools.com/vbscript/func_formatdatetime.asp för hur du skall formatera det för utskrift.

Om servern är på annat språk än svenska kan du skapa en egen funktion för att få fram svenska namnen. Tex:

[color="#0000ff"]Function[/color] returnSweMonth(myInt)
   [color="#0000ff"]Select[/color] [color="#0000ff"]Case[/color] myInt
      [color="#0000ff"]Case[/color] 1 returnSweMonth=[GRÅ]"Januari"[/GRÅ]
      [color="#0000ff"]Case[/color] 2 returnSweMonth=[GRÅ]"Februari"[/GRÅ]
      [color="#0000ff"]Case[/color] 3 returnSweMonth=[GRÅ]"Mars"[/GRÅ]
      [color="#0000ff"]Case[/color] 4 returnSweMonth=[GRÅ]"April"[/GRÅ]
      [color="#0000ff"]Case[/color] 5 returnSweMonth=[GRÅ]"Maj"[/GRÅ]
      [color="#0000ff"]Case[/color] 6 returnSweMonth=[GRÅ]"Juni"[/GRÅ]
      [color="#0000ff"]Case[/color] 7 returnSweMonth=[GRÅ]"Juli"[/GRÅ]
      [color="#0000ff"]Case[/color] 8 returnSweMonth=[GRÅ]"Augusti"[/GRÅ]
      [color="#0000ff"]Case[/color] 9 returnSweMonth=[GRÅ]"September"[/GRÅ]
      [color="#0000ff"]Case[/color] 10 returnSweMonth=[GRÅ]"Oktober"[/GRÅ]
      [color="#0000ff"]Case[/color] 11 returnSweMonth=[GRÅ]"November"[/GRÅ]
      [color="#0000ff"]Case[/color] 12 returnSweMonth=[GRÅ]"December"[/GRÅ]
   [color="#0000ff"]End[/color] [color="#0000ff"]Select[/color]
[color="#0000ff"]End[/color] [color="#0000ff"]Function[/color]

[color="#006400"]'Testa funktionen[/color]
[b]Response[/b].Write(returnSweMonth(12))

 

 

/Cluster

------------------------------------------------------

"Den som försummar att dricka ur erfarenhetens källa

kommer troligen att dö av törst i okunnighetens öken."

------> http://eforum.kicks-ass.net <------

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...