Toon posts:

[asp] loop in een loop voor controle

Pagina: 1
Acties:
  • 181 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
hoi

even mijn probleem uitleggen :
ik heb een tabel met daarin records die het veld volgnummer en gebruikt(waarde ja of nee) hebben.
nu moet ik aan de hand van een variabele die ik doorgeef controleren of er volgnummers zijn die als waarde bij gebruikt "nee" hebben. deze variabele geeft aan hoeveel volgnummers oplopend ongebruikt moeten zijn.

dus stel dat de variabele 3 is dan moeten 3opeenvolgende volgnummers als waarde bij ongebruikt "nee" hebben.

in deze tabel beginnen de volgnummers regelmatig opnieuw (van 1-21 of 1-42), ik moet dan alle volgnummers hebben in een string of array die vanaf dat volgnummer 3 volgnummers vrij zijn.

ingewikkeld he!

nu had ik deze loop geschreven :

code:
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
sqlUnits = "SELECT `unit_id`, `unit_volgnummer`, `unit_rack_id`, `unit_toestel_id` FROM `nmbs_unit` WHERE `unit_rack_id` ='"&x_rack&"' AND `unit_toestel_id` <> 0 ORDER BY `unit_volgnummer`"
        set rsUnits = conn.execute(sqlUnits)
        
        do while not rsUnits.eof
            x_volgnummer = rsUnits("unit_volgnummer")
            
            for i=1 to cint(x_toestelHoogte)
                if rsUnits("unit_volgnummer") = x_volgnummer then
                    x_result = "ok"
                else
                    x_result = "not"
                end if
                x_volgnummer = x_volgnummer + 1
                rsUnits.movenext
            next

            if x_result = "ok" then
                x_array = x_array & x_volgnummer &","
            end if
            
            for i=1 to i = cint(x_toestelHoogte)
                rsUnits.moveprevious
            next
        rsUnits.movenext
        loop
        response.write(x_array)


maar ik krijg bij de 2de controle deze foutmelding : error '80020009'
veel meer uitleg krijg ik niet van deze foutmelding en op google zeggen ze dat je het in sql moet controleren maar dat weet ik niet hoe dat werkt

Verwijderd

Misschien is je recordset ForwardOnly, dan mag je geen MovePrevious doen.
Let er trouwens ook op dat je MoveNext bij het laatste record ook een foutmelding gaat geven.

Verwijderd

Topicstarter
Verwijderd schreef op donderdag 04 augustus 2005 @ 15:03:
Misschien is je recordset ForwardOnly, dan mag je geen MovePrevious doen.
hoe kan ik dan terug gaan naar het juiste record??

Verwijderd

Verwijderd schreef op donderdag 04 augustus 2005 @ 15:17:
[...]


hoe kan ik dan terug gaan naar het juiste record??
Ander RecordSetType gebruiken. Waarschijnlijk moet je dan Recordset.Open() gaan gebruiken. Info hierover is op Google genoeg te vinden.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Of je kan je Recordset eerst uitlezen en in een eigen Datastructuur plaatsen. Daarna kan je er mee doen wat je wilt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
ik heb mijn db file aangepast naar wat ik vond op een mysql site , ik heb option=32 geplaatst dat zou adOpenDynamic zijn :

code:
1
2
3
4
5
<% 
xDb_Conn_Str =  "DRIVER={MySQL ODBC 3.51 Driver};SERVER=servername;PORT=3306;DATABASE=dbsys; USER=x;PASSWORD=y;OPTION=32;"
Set conn = Server.CreateObject("ADODB.Connection")
conn.open xDb_Conn_Str
%>


maar dan doe hij het nog niet... :(
en van data in eigen recordsets laden ken ik al helemaal niets

Verwijderd

Recordsettype is een property van een Recordset, niet van een connection !

Verwijderd

Visual Basic:
1
  call rsUnits.open(sqlunits,conn, <recordsettype>)

waarbij <recordsettype> meerdere waarden kan hebben. In jouw geval zou ik de waarde 3 ( adOpenStatic ) gebruiken, je wijzigt toch niets..

Maar zoek ook eens naar Bookmarks, dan heb je je terugloop loop niet nodig.

[edit] O, niet vergeten dan wel
Visual Basic:
1
set rsUnits = Server.CreateObject("ADODB.Recordset")

te gebruiken.

[ Voor 30% gewijzigd door Verwijderd op 04-08-2005 16:03 ]


Verwijderd

Topicstarter
volgens mij mag ik gewoon nooit geen moveprevious doen in mijn mysql db...

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 10:37

mulder

ik spuug op het trottoir

Ik doe zelden tot nooit een moveprevious; je zou eens kunnen kijken waarom je terug wilt in je recordset, dit zou door een andere opbouw van je code voorkomen kunnen worden.

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Don Facundo schreef op donderdag 04 augustus 2005 @ 16:14:
Ik doe zelden tot nooit een moveprevious; je zou eens kunnen kijken waarom je terug wilt in je recordset, dit zou door een andere opbouw van je code voorkomen kunnen worden.
wat bedoel met een andere opbouw, ik moet toch de volgende records kunnen controleren en terug gaan naar het originele...

Verwijderd

zowiezo zal je code niet lekker werken. Je gebruikt het veld "gebruikt" waarover je het hebt helemaal niet .

enne, Strings als voorwaarden gebruiken ( je "ok" en "not" ) gebruiken is altijd gevaarlijk, 1 tikfout, bijv. een hoofdletter, en je code is verrot. Gebruik hier een Boolean voor ! maakt je code ook nog eens kleiner
Visual Basic:
1
x_result = (rsUnits("unit_volgnummer") = x_volgnummer)

Verwijderd

Topicstarter
ik ga mijn recordset in een array gieten, daar zal ik toch wel achteruit kunnen of niet?

Verwijderd

idee : in je lus zou je met een tweede select kunnen kijken hoeveel vrij nummers er zijn

SQL:
1
2
3
4
5
6
7
Select 
  count(*) 
from 
  nmbs_unit 
where 
  unit_volgnummer between <volgnummer> and <volgnummer + toestelhoogte> AND
  gebruikt = false

Als de waarde die hier uitkomt gelijk is aan je toestelhoogte, is er genoeg ruimte.

Verwijderd

Topicstarter
Verwijderd schreef op donderdag 04 augustus 2005 @ 16:32:
idee : in je lus zou je met een tweede select kunnen kijken hoeveel vrij nummers er zijn

SQL:
1
2
3
4
5
6
7
Select 
  count(*) 
from 
  nmbs_unit 
where 
  unit_volgnummer between <volgnummer> and <volgnummer + toestelhoogte> AND
  gebruikt = false


dat is een geweldig idee! eens proberen!
Als de waarde die hier uitkomt gelijk is aan je toestelhoogte, is er genoeg ruimte.

Verwijderd

[edit]oeps, zag niet dat je je antwoord IN de quote had gezet.

[ Voor 65% gewijzigd door Verwijderd op 04-08-2005 16:37 ]


Verwijderd

Mijn oplossing neemt wel aan dat je volgnummers netjes oplopend en aansluitend zijn.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op donderdag 04 augustus 2005 @ 16:30:
ik ga mijn recordset in een array gieten, daar zal ik toch wel achteruit kunnen of niet?
Nee in een array kan je ook niet achteruit. Je kan namenlijk ook niet vooruit. Een Array heeft namenlijk geen huidige positie.

Wat je met een array doet is dat je zelf een index bij kan houden ( wat gewoon een getalletje is ) en die kan je natuurlijk zo veel muteren als je zelf wilt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Verwijderd schreef op donderdag 04 augustus 2005 @ 16:38:
Mijn oplossing neemt wel aan dat je volgnummers netjes oplopend en aansluitend zijn.
ja had te snel gesubmit met die quote...
de volgnummers zijn mooi oplopend altijd...
ben het aan het proberen...

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
conn.open xDb_Conn_Str ,0 ,1

Dat is forward only en read only

conn.open xDb_Conn_Str ,1 ,1 <--- zo kun je movenext en previous doen en een recordcount!

Verwijderd

Mischa_NL schreef op donderdag 04 augustus 2005 @ 16:44:
conn.open xDb_Conn_Str ,0 ,1

Dat is forward only en read only

conn.open xDb_Conn_Str ,1 ,1 <--- zo kun je movenext en previous doen en een recordcount!
had ik ook al aangegeven, alleen zonder die laatste parameter ( die optional is )

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
        do while not rsUnits.eof
            x_volgnummer = rsUnits("unit_volgnummer")
            x_einde = cint(x_volgnummer) + cint(x_toestelHoogte)
            sqlTest = "Select count(*) from `nmbs_unit` where `unit_volgnummer` between "&x_volgnummer&" and "&x_einde&" AND `unit_toestel_id` = 0"
            set aantal = conn.execute(sqlTest)
            
            if cint(aantal) >= cint(x_toestelHoogte) then
                x_array = x_array & x_volgnummer &","
            end if
        rsUnits.movenext
        loop

ik krijg dan deze fout :
Microsoft VBScript runtime error '800a000d'
Type mismatch

in de regel van de if cint(....

  • Ashtaroth
  • Registratie: December 2003
  • Laatst online: 16-02 09:59
Het "Set aantal" statement wil zeggen dat je iets in een object stopt. Met CInt(aantal) wil je dit object converteren naar een integer, vandaar die type mismatch. Bovendien is aantal door het Set-statement een recordset.

[ Voor 4% gewijzigd door Ashtaroth op 04-08-2005 17:21 ]


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Verwijderd schreef op donderdag 04 augustus 2005 @ 17:02:
code:
1
2
3
4
5
6
7
8
9
10
11
        do while not rsUnits.eof
            x_volgnummer = rsUnits("unit_volgnummer")
            x_einde = cint(x_volgnummer) + cint(x_toestelHoogte)
            sqlTest = "Select count(*) from `nmbs_unit` where `unit_volgnummer` between "&x_volgnummer&" and "&x_einde&" AND `unit_toestel_id` = 0"
            set aantal = conn.execute(sqlTest)
            
            if cint(aantal) >= cint(x_toestelHoogte) then
                x_array = x_array & x_volgnummer &","
            end if
        rsUnits.movenext
        loop

ik krijg dan deze fout :
Microsoft VBScript runtime error '800a000d'
Type mismatch

in de regel van de if cint(....
|Dat kan natuurlijk niet... waar haal je in godsnaam de var aantal vandaan?
Je moet die count dmv AS in de query een naam geven en dan op deze manier : aantal.fields("veldnaam") eruit halen.
Pagina: 1