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

Slumpa ut en vinnare


Micke_skane

Rekommendera Poster

Micke_skane

Hej Alla,

 

Suttit och fått ihop en databas där man för in personer som svarat på frågor. Dem som har svarat rätt är med i ett urval som slumpar ut en vinnare.

Problemet är att min SQL-sats Inte sköter urvalet som jag vill.

I databasen har jag ett JA/NEJ-fält som blir SANT om personerna svarat rätt.

Då jag kör min kod och slumptalet hamnar på en post där fältet svarat_ratt är FALSKT så får jag ett felmeddelande:

Row handle i invalid

 

Varför dem posterna är med i urvalet kan jag inte förstå!

 

Så här ser koden ut:

 

slumpa_vinnare.aspx

'# Databasanslutning
Dim myConnection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Server.MapPath("db2/vinstval_namn.mdb"))

Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
'#<--==========Vinsturval========================-->
Dim NumNamn As Integer
'#==========Hämta Antal namn i databasen================
Dim StrSQL As String = [color="#ff0000"]"SELECT TOP 1 namnID FROM vinst_urval Where svarat_ratt=true ORDER BY namnID DESC"[/color]
Dim myCommand As New OleDbCommand(StrSQL, myConnection)
Dim myReader As OleDbDataReader

Try
myConnection.Open()
myReader = myCommand.ExecuteReader
myReader.Read()
NumNamn = myReader("namnID")
myReader.Close()
myConnection.Close()
Catch ex As Exception
Namn.Text = "Databasfel: vinst_fornamn antal"
End Try

'#==========Slumpmässigt tal======================
Dim MyValue As Int16
'# Starta slumptalsgeneratorn
Randomize() 
'# Generera slumpmässigt tal mellan 1 och antal namn i databasen
MyValue = Int((NumNamn * Rnd()) + 1) 
'#=========Hämta vald vinnare=======================
StrSQL = "SELECT vinst_fornamn FROM vinst_urval WHERE svarat_ratt=true AND namnID LIKE " & MyValue
myCommand.CommandText = StrSQL

Try
myConnection.Open()
myReader = myCommand.ExecuteReader
myReader.Read()
Namn.Text = myReader("vinst_fornamn").ToString
myReader.Close()
myConnection.Close()
Catch ex As Exception
Namn.Text = ex.Message
End Try
'#<--=========Slut av val av vinnare======================->

End Sub

 

Tycker min sql-sats ser rätt ut...

Tar jag bort Where-frågan så får jag fram ett namn utan något felmeddelande. Men jag vill bara ha dem som har "JA" i fältet svarat_ratt.

Som det är nu visas bara värdet ur Ett fält men hur gör man om man vill få fram värdet ur flera fält, typ f-namn, e-namn, stad.

 

Sen skulle jag vilja veta Var/Hur i koden jag kan skriva för att skicka alla fälten ur den post jag får fram till en annan tabell.

Vet att man kan använda Into men vet inte riktigt Var och Hur jag gör Här i detta exemplet.

 

Hoppas Någon har en lösning/ide till mitt problem!

 

Ha det!

Micke

 

 

[inlägget ändrat 2005-05-05 06:02:26 av Micke_skane]

Länk till kommentar
Dela på andra webbplatser

  • Svars 71
  • Skapad
  • Senaste svar

Är du säker på att du ska ha operatorn LIKE när du ska ta fram ett namnId? Är det inte numeriskt så att det borde stå namnID = MyValue ?

 

Vidare, för att ta fram flera kolumner ur samma tabell så skriver du dem i selectsatsen som såhär:

 

"Select namn, adress, telefonnr from Register where namnid = 1"

Du skriver helt enkelt bara ett komma mellan kolumnerna.

Ska du ta fram data från flera tabeller samtidigt så behöver du lära dig att joina flera tabeller.

 

Om du matar in värdena från selectsatsen till objekt i formuläret, så kan du sen använda objekten vid din insertsats:

 

"Insert into NyTabell (namn, adress, telefonnr) values ('"&Textfalt.Namn&"', '"&Textfalt.Adress&"', '"&Textfalt.Telefon&"')"

 

Notera enkelfnuttarna som du måste ha när du ska mata in sträng-värden i databasen. Numeriska fält skall INTE ha såna.. Syntaxen "Textfalt.Namn" osv får du justera efter vad dina objekt heter som har de värden du vill infoga.

 

 

Edit: stavning

 

[inlägget ändrat 2005-05-06 23:50:57 av Jenny R]

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej Jenny,

 

Tack för Ditt svar.

 

Ska testa dina förslag men det som jag inte förstår är varför Dem rader som jag valt bort(false) i mitt urval svarat_ratt=true ändå finns med när slumptalet väljs?!

Då dem väljs visas meddelandet:

Row handle in invalid

 

Kan det vara så att man väljer ju första ALLA posterna för att få redan på högsta talet det kan bli men sedan då man ska välja slumptalet så väljer jag ju bort vissa rader. Den kanske inte förstår. Det blir någon sorts krock.

Typ "gå både vänster och höger samtidigt"!?

 

Min tanke är:

 

1. Välj ut en post ur slumptals-tabellen.

2. Skicka dennas info till en annan tabell

3. Töm slumptals-tabellen helt

4. Hämta dem fälten du vill ur tabellen under punkt 2

 

Hoppas Du förstår min tanke med tävlingstabellerna :)

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Hej igen

 

Jag är egentligen ASP-programmerare och ny på Access, så jag kan inte ge dig exakt kod, men jag kan försöka hjälpa dig med tänket :)

 

Jodå, jag förstår din tanke.

Men, det första du gör är att ta fram det antal namn som har svarat rätt genom att plocka ut det högsta id:t på den personen.. Om vi säger att du har en tabell med 20 pers där varannan person har svarat_ratt=true och varannan person har svarat_ratt = false så får du till svar att du har 19 namn i databasen med din fråga. Fast det har du ju inte, du har ju bara 10...

 

I Oracle eller SQLServer hade jag skrivit:

"Select count(namnID) as antal from vinst_urval where svarat_ratt=true "

...

myReader.Read()

NumNamn = myReader("antal")

för att få fram antal rader, snarare än att hämta högsta id:t som du gör med din Top-sats.

 

Men, det är ju heller inte bra, för på något sätt ska jag ju ha fram personen som också har vunnit.. istället hade jag loopat igenom svaren på frågan och lagt in namnId i en array.

 

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

*ASPkod, du får omvandla till access...*

set rs = db.execute(sSql)

DIM anNamnId(), nDim, nAntal

nAntal = 0

nDim = 0

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

 

När jag gjort detta så tar jag fram det slumpade numret med nAntal som max. Kontrollerar att det slumpade numret INTE är STÖRRE än max.

 

Hämta sen rätt id

nValdVinnarID = anNamnId( nSlumpadeNumret )

sSql = "Select vinst_fornamn from vinst_urval where namnID = "&nValdVinnarID

...

myReader.Read()

sForNamn = myReader("vinst_fornamn")

 

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

sSql = "Insert into NyTabell (fornamn) values ('"&sForNamn&"')"

Notera enkelfnuttarna kring namnet eftersom det är en sträng

 

Töm sen din urvalstabell:

sSql = "delete from vinst_urval"

 

Torrhackat och med blandad kod, men jag hoppas du förstår :)

 

Lycka till!

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej,

 

Förstår delar av din kod men jag förstår hela din tanke :)

 

Det låter ju smart att lista ut dem som svarat rätt i en fält-variabel och sen slumpa ut en person ur den istället.

 

Menade du att man av infon man fick fram ur variabeln välja Den post som motsvarades av slumpvalet så att man kan skicka värdena vidare?

 

sSql = "Select namnID from vinst_urval where svarat_ratt=true order by namnID "
*ASPkod, du får omvandla till access...*
[b]vad menar du med att omvandla???
Vad är detta för sorts kod...
[/b]
set rs = db.execute(sSql)
DIM anNamnId(), nDim, nAntal
nAntal = 0
nDim = 0
While not rs.eof 
nAntal = nAntal + 1
...if nDim < nAntal then
......nDim = nDim + 2
......reDIM preserve anNamnId( nDim )
[b]Vad menar du med denna kodsnutt?[/b]
...end if
...anNamnId( nAntal ) = rs("namnID")
...rs.MoveNext
Wend

 

Vi tänker samma saker men jag förstår inte HUR du skriver :)

 

Som sagt, i mitt exempel kan man nog ta bort funktionen att skriva ut ur slumpatals-tabellen för man kan ju använda tabellen man skickat infon vidare till. Då hämtar man ju bara den senast inlagda.

 

Ändra gärna i koden jag lagt upp i mitt föregående brev :)

Jag ska också försöka ta bort och ändra så kan Du få se hur Jag skrivit om koden...

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Hej igen

 

Nej, jag tänker inte ändra i din kod som du redan gjort, eftersom jag - som jag redan sagt - inte är särskilt hemma i just programmeringen för Access (som använder VBA), men väl i ASP (som använder VB script).

 

Du har fått hela ordningen av mig, nu ska du bara se till att det blir kod för Access.

 

Detta nedan är ASP-kod, precis som jag skrev ;) Du får själv göra ev anpassningar i syntaxen för att det skall fungera att köra i Access. Språken är dock ganska lika, kanske tom identiska, förutom att du får göra om databaskopplingen (db) så att det fungerar med din.

Jag matar in lite mer kommentararer så att du kan se vad som händer.. (Punkterna i början på raderna är enbart för indenteringens skull, de får du sen ta bort!!)

 

<%

'här körs sqlsatsen som finns i sSql

set rs = db.execute(sSql)

'dimmar array och variabler

DIM anNamnId(), nDim, nAntal

 

'nollar räknare

nAntal = 0

nDim = 0

 

'loopar igenom de rader jag får som svar på sqlsatsen

While not rs.eof 'du kan använda Do until rs.eof om det känns bättre...

 

'räknar upp antal-räknaren som håller koll på hur många poster vi får.

' vi kommer INTE att använda position 0 i arrayen...

...nAntal = nAntal + 1

 

'här måste vi kolla att det finns plats att lägga in värdena på i arrayen.

'eftersom jag inte vet hur många posterna blir så dimmar jag om arrayen

'allt eftersom antalet växer

...if nDim < nAntal then

......nDim = nDim + 2

 

'preserve måste användas för att vi inte ska förlora

'tidigare inmatade värden

......reDIM preserve anNamnId( nDim )

 

'avslutar ifsatsen ovan

...end if

 

'lägger in namnId på plats i arrayen på positionen nAntal

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

 

'flyttar fram till nästa post i recordsetet som blev när vi körde sqlfrågan

...rs.MoveNext

 

'avslutningskommando för While

Wend 'använder du Do until... får du byta ut denna mot Loop

%>

 

Vad du sen gör är alltså att du slumpar fram ett nummer som får motsvara en position i arrayen, och det id som du lagrat på den positionen blir sen vinnare.

 

Du måste ju också hämta upp värdena på den person som vunnit (vars ID du har i nValdVinnarID) för att sen placera dem i den nya tabellen..??

Att hämta senast inlagda från den nya tabellen är väl onödigt när du redan har id:t på den person vars värden du vill ha? Det blir dessutom enklare för databasen att jobba på det viset, mot ett bestämt id.

 

Gör nu ett försök själv och posta sen koden om det inte funkar! :D

 

 

Edit: färgerna

[inlägget ändrat 2005-05-10 13:16:56 av Jenny R]

[inlägget ändrat 2005-05-10 13:17:46 av Jenny R]

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej Jenny,

 

Fått tid Nu att sitta med koden :)

Provat att få koden att göra som jag vill men inte lyckats.

Gjort sidan till .asp istället för .aspx!

 

Såhär ser koden ut nu, med kommentarer!

 

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

<%@ 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)[/color]

   [color="#006400"]'#==========Hämta Antal namn i databasen================[/color]
   sSql = "Select namnID from vinst_urval where svarat_ratt=true order by namnID "
set rs = db.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

[color="#006400"]'============Skapa variabler med värdena=============[/color]
   myReader.Read()
   sForNamn = myReader("vinst_fornamn")

   [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) values ('"& sForNamn &"')"
   [color="#006400"]'=========Notera enkelfnuttarna kring namnet eftersom det är en sträng=========[/color]

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

Conn.Close
Set Conn = Nothing
%>

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

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

 

På sidan dyker felmeddelandet att "sidan inte kan visas" upp...

Provat att se var i koden jag gjort nått fel men jag ser det inte och förstår därför inte vad som är fel :)

Har valt att Inte tömma tabellen ännu, ville först se om det gick att få ut nått!

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Hoppar in med en alternativ-kod till din lösning. Testa och se om den funkar som du tänkt. Fråga om det är något du undrar över.

[log]

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Slumpa ut en vinnare</title>
</head>
<body>
<%
' 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 namnID på alla de som svarat rätt
SET RS=conn.execute("SELECT namnID FROM vinst_urval WHERE svarat_ratt=true")
IF NOT RS.EOF THEN
  finnsSvaratRatt=True
  namnIDstr=namnIDstr&RS(0)&"|"
ELSE
  finnsSvaratRatt=False
SET RS=Nothing

IF finnsSvaratRatt THEN
  ' Skapa array med hämtade namnID
  namnIDarr=Split(namnIDstr, "|")

  ' Räkna antal namnID i arrayen
  antalNamn=Ubound(namnIDarr)-1

  ' Slumpa fram ett tal för att kunna välja namnID i arrayen
  Randomize
  slumpTal = Rnd(1)*antalNamn

  ' Hämta och skriv ut vinnar-info
  SET RS=conn.execute("SELECT vinst_fornamn, vinst_efternamn, stad FROM vinst_urval WHERE namnID = "& namnIDarr(slumpTal) &"")
  Response.Write(RS(0)&" "&RS(1)&", "&RS(2))
  SET RS=Nothing
ELSE
  Response.Write("Det finns ingen som svarat rätt!")
END IF

Conn.Close
Set Conn = Nothing
%>
</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-13 15:39:32 av Cluster]

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej Cluster,

 

Det är Självklart du får göra inlägg...:)

Jag är Alltid tacksam för den hjälp man får!

 

Det fungerar att det kommer ut ett förnamn, efternamn och stad men det blir hela tiden bara den översta ur databasen. Alltså namnID=1!

Vet inte om den inte kör slumpen eller inte...

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Oops, testa:[log]

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Slumpa ut en vinnare</title>
</head>
<body>
<%
Randomize

Set Conn = Server.CreateObject("ADODB.Connection")
ConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db2/vinstval_namn.mdb")
Conn.open connString

SET RS=conn.execute("SELECT namnID FROM vinst_urval WHERE svarat_ratt=true")
IF NOT RS.EOF THEN
  finnsSvaratRatt=True
  namnIDstr=namnIDstr&RS(0)&"|"
ELSE
  finnsSvaratRatt=False
SET RS=Nothing

IF finnsSvaratRatt THEN
  namnIDarr=Split(namnIDstr, "|")
  SET RS=conn.execute("SELECT vinst_fornamn, vinst_efternamn, stad FROM vinst_urval WHERE namnID = "& namnIDarr(Rnd(1*(Ubound(namnIDarr))) &"")
  Response.Write(RS(0)&" "&RS(1)&", "&RS(2))
  SET RS=Nothing
ELSE
  Response.Write("Det finns ingen som svarat rätt!")
END IF

Conn.Close
Set Conn = Nothing
%>
</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 <------

 

Länk till kommentar
Dela på andra webbplatser

Cluster

 

Tänkte just fråga om den där loopen, men jag strutnar i det då

:)

 

Micke

 

Jag förstår att du får fel...

Efter

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

Måste du ju köra sql-satsen också... du måste också läsa in dem i variabler (du hämtar ju fler saker än bara förnamn)..

 

Sen får du lägga till i insertsatsen, resterande kolumner som du vill spara ner saker i, samt variablerna för dessa.

 

Eller så tar du Clusters lösning som är samma tänk men lite annan kod.

Du lär dig antaligen inget på att använda hans färdiga kod ;), men jag tvivlar inte en sekund på att det inte fungerar !:thumbsup:

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Fick lägga till en ) efter SQL... samt en END IF men efter det så fick jag inga felmeddelanden men inga namn heller. Sidan är bara helt vit men dock utan några felmeddelanden.

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

grrr.. fre 13:e...

[log]<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<title>Slumpa ut en vinnare</title>

</head>

<body>

<%

' 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 namnID på alla de som svarat rätt

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

IF NOT RS.EOF THEN

finnsSvaratRatt=True

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

ELSE

finnsSvaratRatt=False

SET RS=Nothing

 

IF finnsSvaratRatt THEN

' Skapa array med hämtade namnID

namnIDarr=Split(namnIDstr, "|")

 

' Räkna antal namnID i arrayen

antalNamn=Ubound(namnIDarr)-1

 

' Slumpa fram ett tal för att kunna välja namnID i arrayen

Randomize

slumpTal =cLng(Rnd*antalNamn+1)

 

' Hämta och skriv ut vinnar-info

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

Response.Write(RS(0)&" "&RS(1)&", "&RS(2))

SET RS=Nothing

ELSE

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

END IF

 

Conn.Close

Set Conn = Nothing

%>

</body>

</html>[/log]

 

[...]men jag tvivlar inte en sekund på att det inte fungerar !
? (dubbelnegationer)

 

/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-13 16:01:11 av Cluster]

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Hej Jenny,

 

Vet inte riktigt Vad du menar med:

 

Efter

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

Måste du ju köra sql-satsen också... du måste också läsa in dem i variabler (du hämtar ju fler saker än bara förnamn)..

 

Menar du att jag ska köra En till SQL-sats?

 

Jag känner att jag lär mig mycket på att se hur andra som vet mer än jag gör/tänker. Sen vill/gör jag själv egna tester på hur andra tänkt/gjort bara för att se vad som händer om man gör si eller så... :)

 

Jag vill inte bara veta utan förstå oxå :)

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Ja just det :)

Nästan som en Måndag ;)

 

Koden ville ha En END IF efter END IF om redan var i koden.

Får dock fortfarande bara en vit sida utan namn eller felmeddelanden ;)

 

Fredag 13-e ...;)

 

Länk till kommentar
Dela på andra webbplatser

Vet inte riktigt Vad du menar med[...]
Hon menar att din kod enbart skapar en sträng med sql-frågan men att frågan alldrig ställs mot databasen. Typ: conn.execute(DIN_SQL_STRÄNG)

 

Menar du att jag ska köra En till SQL-sats?
Jupp! När du har tagit reda på ett framslumpat id så måste du köra en fråga som hämtar ut info om den som har det id:t.

 

Men den första anledningen till att det inte fungerar i din "ursprungliga" kod är nog

set rs = db.execute(sSql)

vilket nog borde vara

set rs = conn.execute(sSql)

Jag känner att jag lär mig mycket på att se hur andra som vet mer än jag gör/tänker.
Du kan ju kolla på min kod då, fast det verkar bli många slarvfel idag... ;)[log]<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<title>Slumpa ut en vinnare</title>

</head>

<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)&"|"

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)

 

' Skriv ut vinnar-infon

Response.Write(namnIDarr(slumpTal))

END IF

 

SET RS=Nothing

 

'Stäng databaskopplingen

conn.Close

Set conn = Nothing

%>

</body>

</html>[/log]

 

[edit:]Tog bort den extra databasfrågan och körde allt i arrayen från första frågan. Testkört ock klart!

 

/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-13 16:55:10 av Cluster]

Länk till kommentar
Dela på andra webbplatser

Hehe, menar du att det kanske innbar att jag tvivlade på att det fungerade? ;)

Inte.. jag tvivlar INTE på att det INTE fungerar.. eller - jag tror att det fungerar (2 lika blir +, 2 olika blir minus lärde jag mig i matten ;) ) :)

 

Länk till kommentar
Dela på andra webbplatser

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

nValdVinnarID = anNamnId( nSlumpadeID )

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

 

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

myReader.Read()

sForNamn = myReader("vinst_fornamn")

 

'=========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_tavlingen (vinnare_fornamn) values ('"& sForNamn &"')"

 

 

Ok.. kolla här då, jag har kopierat det partiet som strular för dig i min kod (förutsatt att din databaskoppling fungerar, så att du har fått fram din array - har du kollat det?)

 

När du väl tagit ut nValdVinnarID så skapar du en sträng innehållandes en sqlsats - sSql. Men du kör den aldrig mot databasen. Här måste du igen köra en

set rs = db.execute( sSql )  

så att den hämtar upp det du vill ha.

 

myReader.Read() var din gamla kod. Har du inte kvar den syntaxen på din databaskoppling/läsning så behöver du itne det här. Men du måste lägga in värdena i variabler.

Jag hade läst såhär:

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

 

Beträffande inläggandet i din andra tabell...

Om du inte hämtar id automatiskt (jag tror Access gör det genom att id-fältet är av typen Räknare?), så måste du hämta det själv.

sSql = "select max(id) from NyTabell"
set rs = db.execute( sSql )
nId = rs(0) + 1

 

Sen lägger jag in i nya tabellen

sSql = "Insert into NyTabell (id, fornamn, efternamn, stad) values (nId, '"&sForNamn&"', '"&sEfterNamn&"', '"&sStad&"' )"
set rs = db.execute( sSql )

Du kan använda dina variabler när du ska skriva ut sen.

 

 

Om jag läser din kod rätt så borde din Conn vara det som jag refererar till som db. Du får alltså översätta mina db till din Conn..

 

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

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Okej,

 

Ska testa ändringarna men jag får återkomma om några timmar. Ska ut någon timme nu!

 

Men jag brinner redan för att testa ;)

 

Ha det sålänge!

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

OT:

Fast om man skall använda talesättet: "Jag tvivlar inte en sekund på att..." så tycker nog jag iaf att det skall vara "Jag tvivlar inte en sekund på att det fungerar". Eller?

 

/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

Hej igen,

 

Tillbaka efter lite fotboll ;)

Har testat Clusters förslag och det fungerade!

Nu slumpar den ut dem som svarat rätt!

Ska kolla koden vad den gör sen för jag ska ju skicka vinnaren vidare till en annan tabell oxå. Ser inte ännu vad jag ska använda för att skicka med i INTO-satsen.

 

Ska även testa Ditt, Jenny, förslag ;)

Förstår faktiskt Det mer ;)

Känns om att det är lättare att dela upp vilka fält, då du gör variabler av dem olika fält-värdena, som ska skrivas ut och var dem ska skrivas ut...

 

Jag vill även att det man fyller i fomuläret(namn, stad samt ett meddelande) ska skickas som mail Om man nu har valt att skriva nått i text-fältet. Typ "IF text_falt = "" skicka inte annars så skicka mailet".

Tavlings-sidan fungerar både som en tavling men man ska oxå kunna höra av sig. Kanske jag delar upp detta senare men jag vet inte ännu :)

Är där nått i nått av dem här exemplen som är svåra att omsätta värden till CDONTS-mailet?

 

Tack sålänge!

Jo, vad är det här med poäng osv?

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Har testat Clusters förslag och det fungerade!
Såklart ;)

 

Ska kolla koden vad den gör [...]
Föredömligt kommenterad om du frågar mig...

[...]sen för jag ska ju skicka vinnaren vidare till en annan tabell oxå. Ser inte ännu vad jag ska använda för att skicka med i INTO-satsen.
Beror ju på vad det är som skall in i den andra tabellen... Om du beskriver din db-design lite så kan du få några förslag.

 

Känns om att det är lättare att dela upp vilka fält, då du gör variabler av dem olika fält-värdena, som ska skrivas ut och var dem ska skrivas ut.
Jag hoppade över det i mitt exempel och använde RS(0) t.o.m RS(2) istället.

 

Är där nått i nått av dem här exemplen som är svåra att omsätta värden till CDONTS-mailet?
Har, om jag ska vara ärlig, inte kollat så noga på Jennys kod men varken hennes eller mitt exempel är det några problem att skapa ett mail (med CDOSYS/CDONTS) av. Dock måste du såklart ha en e-postadress att skicka det till och en att skicka det ifrån.

 

Kör hårt och hör av dig om du har frågor eller kör fast!

 

Jo, vad är det här med poäng osv?

//eforum.idg.se/Eforumintro.asp#Del4 (+ se bifogad bild)

 

 

/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-13 18:26:28 av Cluster]

710918_thumb.jpg

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Glöm det här med att skicka mail ;)

Det gör jag ju INTE på slump-sidan...

Jag lägger ju funktionen på sidan som lägger in värdena i tabellen om jag sen slumpar ur. Då använder jag ju bara värdena ifrån formuläret. Om jag nu vill skicka ifrån detta formuläret men jag tror jag kommer att skapa en egen kontaktsida.

Vet inte riktigt Vad jag tänkte på :)

 

ska forska vidare nu...

 

Micke

 

Länk till kommentar
Dela på andra webbplatser

Vet inte riktigt Vad jag tänkte på
Det blir sådär ibland :)

 

/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

Har testat Clusters förslag och det fungerade!

Såklart ;)

 

Ja, du har ju nästan snott min idé rätt upp o ner :) fast du gav honom koden lite lättvindligare :P

 

Skämt åsido: huvudsaken är att det funkar, å om jag får säga det själv så tycker jag att både du o jag är värda varsin poäng :D

 

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...