Toon posts:

[ASP] Variabel binnen loop wordt overschreven

Pagina: 1
Acties:

Verwijderd

Topicstarter
L.S.,

Ik gebruik onderstaande code om een output van een selectie uit mn database te laten mailen naar een bepaald e-mailadres.

Nu is echter volgens mij het probleem dat de variabele wanneer er meerdere regels zijn telkens overschreven wordt door de eerst volgende.

Hoe kan ik dit verhelpen zodat toch alles wordt samengevat in 1 variabele ?

Bijvoorbaat dank !

PHP:
1
2
3
4
5
6
7
8
dim mailBody
mailBody = "<html>"
rs.MoveFirst
mailBody= mailBody & "<TD>"&productdesc&"</TD>"
response.write mailBody
    rs.MoveNext
    loop
mailBody = mailBody& "</HTML>"

Verwijderd

Hoe kom je bij de productdesc??? En ik vind die loop er nogal raar uit zien, kun je dat niet beter met een While doen?? Je doet volgens mij niets met de waarde uit rs... Misschien wat meer info geven :)

Ow ja, het is ook geen php-code ;)

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 14-04 21:55
Heel aparte code. iets met een rs, waar niks uit gehaald wordt, een mailbody die eerst geprint wordt en waar daarna </html> aan toegevoegd wordt. Ik ben 't kwijt. :?

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


Verwijderd

Ik had die response.write niet eens gezien :)

@TS: Leg je code eens uit....

Verwijderd

Topicstarter
PHP:
1
2
3
4
5
orderno=request.querystring("orderno")

    SQL = "SELECT * FROM orders WHERE orderno=" & orderno 
    rs.Open SQL, Conn
    productdesc = rs("productdesc")


Misschien verklaar dit &productdesc &
:Y) :P

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 14-04 21:55
Verwijderd schreef op maandag 23 januari 2006 @ 10:09:
PHP:
1
2
3
4
5
orderno=request.querystring("orderno")

    SQL = "SELECT * FROM orders WHERE orderno=" & orderno 
    rs.Open SQL, Conn
    productdesc = rs("productdesc")


Misschien verklaar dit &productdesc &
:Y) :P
Denk je dat we hier een glazen bol hebben of puzzelen leuk vinden ? Je plaatst steeds een stukje code.

begin eens met de *hele* loop te plaatsen waar het nu om gaat, met een beetje uitleg.

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:58

Janoz

Moderator Devschuur®

!litemod

Ik raad de TS aan om gewoon eens zelf door zijn code heen te lopen. Er is niet eens een fatsoenlijke loop en ik vermoed dat er uberhaupt maar 1x een productspecs uit een recordset gehaald wordt. Programmeren is exact omschrijven wat een computer voor je moet gaan doen, niet simpelweg een paar dingen achter elkaar zetten en hopen dat de computer zelf uitvogeld wat je eigenlijk wilt hebben.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Ik heb het hoop k zo wat duidelijker gemaakt, ben namelijk zelf ook niet zo'n puzzelaar ! 8)7

Het zit hem namelijk in de variabele MAILBODY, zover ben k zelf ook al alleen weet k niet hoe k dit kan oplossen

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
orderno=request.querystring("orderno")

    SQL = "SELECT * FROM orders WHERE orderno=" & orderno 
    rs.Open SQL, Conn
    productdesc = rs("productdesc")

'Hieronder moeten alle rijen met het betreffende ordernummer in een variabele geplaatst worden
dim mailBody
mailBody = "<html>"
rs.MoveFirst
mailBody= mailBody & "<TD>"&productdesc&"</TD>"
response.write mailBody
    rs.MoveNext
    loop
mailBody = mailBody& "</HTML>"

Set Mailer = Server.CreateObject("SMTPsvg.Mailer")
Mailer.FromName = "Afzender" 
Mailer.FromAddress= "AfzenderAdres" 
Mailer.RemoteHost = "smtpmail.server.com" 
Mailer.AddRecipient "Ontvanger", "OntvangerAdres"
Mailer.Subject = "Bestelling"
Mailer.ContentType = "text/html"
'Hieronder moet het resultaat van de betreffende order worden geplaatst in 1 variabele
Mailer.BodyText = mailBody
if Mailer.SendMail then
Response.Write "Mail send !"
else Response.Write "Mail send failure. Error was " & Mailer.Response 
end if 
rs.close

[ Voor 34% gewijzigd door Verwijderd op 23-01-2006 10:24 ]


  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 14-04 21:55
Verwijderd schreef op maandag 23 januari 2006 @ 10:18:
:r

Ik heb het hoop k zo wat duidelijker gemaakt, ben namelijk zelf ook niet zo'n puzzelaar ! 8)7

code:
1
2
3
4
5
rs.MoveFirst
mailBody= mailBody & "<TD>"&productdesc&"</TD>"
response.write mailBody
    rs.MoveNext
    loop
Heb wel eens in de documentatie gekeken hoe je een loop maakt in asp ? http://www.learn-programm...rogramming_web_asp03.html
code:
1
2
3
4
5
rs.MoveFirst
do
mailBody= mailBody & "<TD>"&productdesc&"</TD>"
    rs.MoveNext
loop until rs.eof

[ Voor 17% gewijzigd door StevenK op 23-01-2006 10:25 ]

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


Verwijderd

Topicstarter
Heb het nu werkend, zie code onder. PRODUCTDESC is nu geen variabele ;)

PHP:
1
2
3
4
5
6
7
8
9
dim mailBody
mailBody = "<html>"
rs.MoveFirst
do
mailBody= mailBody & "<TD>"&rs("productdesc")&"</TD>"
    rs.MoveNext
loop until rs.eof
mailBody = mailBody& "</HTML>"
response.write mailBody


Bedankt voor het puzzelen :P

[ Voor 108% gewijzigd door Verwijderd op 23-01-2006 11:01 ]


Verwijderd

offtopic:
Waarom maak je er telkens php-code tags van :?


Misschien voor jou: Welkom in P&W: FAQ en Beleid *updated: 20 mei*

  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 19-12-2025

wizzkizz

smile...tomorrow will be worse

Je code is inderdaad euhm ... niet optimaal ;)
Zelf zou ik het zo doen denk ik:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Dim sSQL, rsProducts, arProducts, sOrderNr, iOrderNr
Dim sMailBody

sOrderNr = Request.queryString( "orderno" )

' beveiligen tegen SQL injectie
On Error Resume Next
    Err.Clear()
    iOrderNr = cInt( sOrderNr )

    If Err.Number <> 0 Then
        With Response
            .Write "Ongeldig ordernummer opgegeven"
            .Flush
            .End
        End With
    End If
On Error Goto 0

' Vlieg naar je databeest en haal alles op wat je wilt hebben. Het is trouwens een goed idee om de kolommen
' die je nodig hebt expliciet op te geven, dan heb je een kleinere recordset aangezien je nu maar 1 kolom gebruikt.
' Ook van je datamodel snap ik niet zo veel, is het niet handiger om een aparte tabel met je producten te hebben
' en een aparte tabel voor je orders en dan te koppelen op productid? Nu krijg je super veel redunantie in je
' order tabel. (Of is het een extra veld wat evt. comments bij het bestelde product opslaat?)
sSQL = "SELECT * FROM orders WHERE orderno=" & cStr( iOrderNr )
Set rsProducts = Server.createObject( "ADODB.Recordset" )
    rsProducts.Open sSQL, Conn
    
    If Not rsProducts.Eof Then
        arProducts = rsProducts.getRows()
    End If
Set rsProducts = Nothing

If Not isEmpty( arProducts ) Then
' Ren door alle resultaten en plak de omschrijving in je tabel
    Dim x
    For x = 0 To uBound( arProducts, 2 )
        sMailBody = sMailbody & "<td>"& arProducts( zero_based_kolom_nummer_hier, x ) &"</td>"
    Next
    
    ' Ik weet niet hoe jou output er precies uit moet zien, maar voor het idee:
    sMailBody = "<table><tr>" & sMailBody & "</tr></table>"
Else
' Geen beschrijvingen gevonden, geef hier een melding van
    sMailBody = "<p>Er zijn geen items gevonden voor het opgegeven ordernummer</p>"
End If

' Maak er even correcte HTML van
sMailBody = "<html><head><title>Details voor ordernummer "& cStr( iOrderNr ) & ".</title></head>" &_
            "<body>" & sMailBody & "</body></html>"


Ik heb wel erg veel voor gezegd, maar kon even niet op die code kijken :X Ook is het wel handig om een error-check om het stukje te zetten waar je de gegevens uit je database probeert te halen voor het geval daar *iets* mis gaat.

[ Voor 10% gewijzigd door wizzkizz op 23-01-2006 11:17 ]

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 19-12-2025

wizzkizz

smile...tomorrow will be worse

Verwijderd schreef op maandag 23 januari 2006 @ 10:53:
Heb het nu werkend, zie code onder. PRODUCTDESC is nu geen variabele ;)

PHP:
1
2
3
4
5
6
7
8
9
dim mailBody
mailBody = "<html>"
rs.MoveFirst
do
mailBody= mailBody & "<TD>"&rs("productdesc")&"</TD>"
    rs.MoveNext
loop until rs.eof
mailBody = mailBody& "</HTML>"
response.write mailBody


Bedankt voor het puzzelen :P
En wat nu als er een lege recordset teruggegeven wordt? Of als ik als orderno een code opgeef om je hele tabel te dumpen? Best wel lastig dan ;)

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
Verwijderd schreef op maandag 23 januari 2006 @ 10:53:
Heb het nu werkend, zie code onder. PRODUCTDESC is nu geen variabele ;)

PHP:
1
2
3
4
5
6
7
8
9
dim mailBody
mailBody = "<html>"
rs.MoveFirst
do
mailBody= mailBody & "<TD>"&rs("productdesc")&"</TD>"
    rs.MoveNext
loop until rs.eof
mailBody = mailBody& "</HTML>"
response.write mailBody

Bedankt voor het puzzelen :P
als je een do...loop contructie gebruikt zal de code altijd 1x uitvoeren, als je recordset dus eof is krijg je een error.

je kunt beter while NOT rs.eof...wend of do while NOT rs.eof...loop gebruiken.

www.aspfaqs.com of www.w3schools.com voor meer info over basis ASP

[ Voor 22% gewijzigd door 4of9 op 23-01-2006 12:02 ]

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • majornono
  • Registratie: Juni 2002
  • Laatst online: 04-04 23:16
en als je in een loop veel strings achter elkaar plakt (in mailbody) kun je beter een dictionary gebruiken. Bij veel records levert levert dat een enorme snelheidswinst op.

Problem Exists Between Chair And Keyboard


  • kalechinees
  • Registratie: Mei 2005
  • Laatst online: 13-04 21:15
Grrr, ik begin de vooroordelen van de php'ers te begrijpen >:) ben zelf hardcore ASP'er(VBscript/Jscript) maar hier werd zelfs ik niet veel wijzer van

Anyway back ontopic :)

ASP:
1
2
3
4
do while not rs.eof
  response.write "<td>" & rs("blaataap") & "</td>"
  rs.movenext   ' nooit vergeten :)
loop


enzovoort enzovoorts

even weer offtopicm waarom gebruiken er zo weinig mensen spaties en breaks in hun string....
ASP:
1
2
3
4
5
6
sql = "SELECT " _
            & * " _
     & "FROM " _
            & "Blaataap " _
     & "WHERE " _
            & "blaataap_id = " & blaataap_id

ipv
ASP:
1
rs.open "select * from blaataap where blaataap_id="&blaataap_id, conn

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:59

mulder

ik spuug op het trottoir

kalechinees schreef op maandag 23 januari 2006 @ 20:42:
even weer offtopicm waarom gebruiken er zo weinig mensen spaties en breaks in hun string....
ASP:
1
2
3
4
5
6
sql = "SELECT " _
            & * " _
     & "FROM " _
            & "Blaataap " _
     & "WHERE " _
            & "blaataap_id = " & blaataap_id

ipv
ASP:
1
rs.open "select * from blaataap where blaataap_id="&blaataap_id, conn
Omdat dat lelijker, onleesbaarder en langzamer is? Waarom zou je doen wat jij doet?

oogjes open, snaveltjes dicht


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:58

Janoz

Moderator Devschuur®

!litemod

Nou, ik vind
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        StringBuffer sql = new StringBuffer ("SELECT DISTINCT " +
        " DUNS_NUMBER," +
        " NAME," +
        " ADDRESS," +
        " POSTAL_CODE, " +
        " CITY, " +
        " COUNTRY, " +
        " DUNS_TYPE " +
        " FROM" +
        "   SRCMGR.IMS_SRC_CATEGORIES CAT" + 
        " left join " +
        "   SRCMGR.IMS_SRC_CATEGORY_GROUPS CGR on CAT.CAT_ID = CGR.CAT_ID" + 
        " left join" + 
        "   SRCMGR.IMS_SRC_CATEGORY_SUBGROUPS CSG on CGR.CGR_ID = CSG.CGR_ID" + 
        " left join" + 
        "   SRCMGR.IMS_SRC_CATEGORY_SUBSUBGROUPS CSS on CSG.CSG_ID = CSS.CSG_ID" +
        " right join" +
        "   SRCMGR.IMS_SRC_DUNS_PER_CSS DPC on CSS.CSS_ID = DPC.CSS_ID " +
        " left join" + 
        "   SRCMGR.IMS_SRC_DUNS DUN on DPC.DUNS_NUMBER = DUN.DUNS_NUMBER" +
        " where ");

toch echt wel een stuk leesbaarder en mooier dan een enorm lange string achter elkaar en langzamer is sowieso een kul argument. Zeker bij gecompileerde talen wordt het al weggeoptimaliseerd en ik kan me goed voorstellen dat de interpreter van VB voor dat soort constructies geen tot nauwelijks extra parse tijd nodig heeft.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 19-12-2025

wizzkizz

smile...tomorrow will be worse

meestal knip ik mn queries ook in stukjes, behalve hele kleine zoals select * from table where id=3 ofzo (niet dat ik die * in de select gebruik, maar goed). Meestal heeft het zo een vorm:
Visual Basic:
1
2
3
4
5
6
SELECT A.kolom1, A.kolom2, B.kolom3, B.kolom4, C.kolom5
FROM   tabel1 A, table2 B, table3 C
WHERE  A.kolom1 = B.kolom2
             ...
             ...
             ...

Eventueel aangevuld met allerlei geavanceerdere sql, maar subqueries probeer ik zo veel als mogelijk te vermijden om compatibel te blijven met mySQL 4.x.y die dat niet zo goed kan verwerken.

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 05-02 21:24
kalechinees schreef op maandag 23 januari 2006 @ 20:42:
even weer offtopicm waarom gebruiken er zo weinig mensen spaties en breaks in hun string....
[code=asp]
sql = "SELECT " _
& * " _
& "FROM " _
& "Blaataap " _
& "WHERE " _
& "blaataap_id = " & blaataap_id
Ik moet zeggen dat ik dit wel weer wat overdreven vind, SELECT en velden mogen best op 1 regel dus:
code:
1
2
3
sql = " SELECT *" & _
      " FROM Blaataap " & _
      " WHERE blaataap_id = " & blaataap_id


Vind ik net weer wat leesbaarder, vaak doe ik er nog LineFeeds tussen, als ik dan een query moet debuggen dan is hij ook leesbaar als ik het resultaat van sql in de Query analyzer plak.

[ Voor 11% gewijzigd door Serpie op 24-01-2006 12:16 ]


  • kalechinees
  • Registratie: Mei 2005
  • Laatst online: 13-04 21:15
Met name bij het selecteren van meerdere velden (over meerdere tabellen) is het aan te raden om meerdere regels te gebruiken.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select voornaam, achternaam, geboortedatum, woonplaats
from tabelnaam inner join tabel on tabelnaam.id = tabel.id etcet 

of

SELECT
     voornaam,
     achternaam,
     geboortedatum,
     woonplaats,
FROM
     tabelnaam INNER JOIN Tabel
         ON tabelnaam.id = tabel.id

oid :)ik doe maar wat


Ik gebruik liever meerdere regels dan dat ik met m'n neus op het scherm moet zitten om het te lezen.


achja, ieder z'n ding :)

[ Voor 75% gewijzigd door kalechinees op 24-01-2006 13:19 ]


Verwijderd

Als je Query's leesbaar moet hebben in je code gebruik je toch Stored Procedures?

Bij een inline Query heb ik altijd de totale Query op 1 regel, kan hem dan veel sneller kopieren en plakken in Query Analyser

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:59

mulder

ik spuug op het trottoir

Janoz schreef op dinsdag 24 januari 2006 @ 09:14:[...]
toch echt wel een stuk leesbaarder en mooier dan een enorm lange string achter elkaar en langzamer is sowieso een kul argument. Zeker bij gecompileerde talen wordt het al weggeoptimaliseerd en ik kan me goed voorstellen dat de interpreter van VB voor dat soort constructies geen tot nauwelijks extra parse tijd nodig heeft.
We hebben het over Classic ASP hier en zelfs in .NET word deze manier van string concatten niet aangeraden, daar is een StringBuilder voor. En tuurlijk zal het dit voorbeeld geen minuten schelen, ik zou mij er ook niet druk over maken ;) Ging mij meer om de onleesbaarheid en imho onnodige plakacties.
kalechinees schreef op dinsdag 24 januari 2006 @ 13:12:
Met name bij het selecteren van meerdere velden (over meerdere tabellen) is het aan te raden om meerdere regels te gebruiken.
Dit is al leesbaarder en bovendien een stored procedure, die zien er bij mij ook zo uit :)

oogjes open, snaveltjes dicht

Pagina: 1