/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Gennemløb af recordset
Fra : Jesper Stocholm


Dato : 02-04-01 09:19

Jeg har nogle data, hvor jeg trækker en delmængde ud - dvss en enkelt række,
der kan være sorteret. Jeg har nu behov for at kunne finde /den forrige/
indgang i rækken - givet ved en celleværdi. Jeg har derfor behov for at
gennemløbe rækken - og i tilfælde af et match - gå et skridt tilbage og
udtrække værdien. Er min værdi fx 39 og min række

45
76
39
56

.... skal den returnere 76

Jeg har siddet arbejdet lidt med ADODB.recordset - men jeg kan ikke helt få
det til at virke. Min kode er:

set conn = server.createobject("ADODB.connection")
conn.Open "testclca"
set objrs = server.CreateObject("ADODB.recordset")
prnumber = 67
sql_nav = "SELECT * FROM ProblemTable"
objrs.Open sql_nav, "testclca", adOpenKeyset '<-- Linie 9
Flag = 0
objrs.MoveFirst
do while not objrs.EOF AND Flag <> 1
if cint(objrs("prnumber")) = prnumber then
objrs.Moveprevious
prid = objrs("prnumber")
Flag = 1
end if
objrs.MoveNext()
loop

hvilket giver mig fejlen

Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
[Microsoft][ODBC Driver Manager] Data source name not found and no default
driver specified

.... hvilket jeg ikke forstår. Jeg har testet min DSN (testclca) på sædvanlig
vis - og jeg kan sagtens hente data ud fra den ... så det er ikke min DSN,
der er noget i vejen med ...

Er det mig, der er blind ?

--
The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers.
(Bill Gates from The Road Ahead, p265)
- Jesper Stocholm - http://stocholm.dk

 
 
Jonathan Stein (02-04-2001)
Kommentar
Fra : Jonathan Stein


Dato : 02-04-01 12:53

Jesper Stocholm wrote:

> Jeg har nogle data, hvor jeg trækker en delmængde ud - dvss en enkelt række,
> der kan være sorteret. Jeg har nu behov for at kunne finde /den forrige/
> indgang i rækken - givet ved en celleværdi. Jeg har derfor behov for at
> gennemløbe rækken - og i tilfælde af et match - gå et skridt tilbage og
> udtrække værdien. Er min værdi fx 39 og min række
>
> 45
> 76
> 39
> 56
>
> ... skal den returnere 76

En anden work-around. Lav et auto-increment id-felt (hvis du ikke allerede har
det, og brug to SQL-sætninger:
SQL = "SELECT * FROM ProblemTable WHERE prnumber=" & prnumber
[Execute...]
id = objrs("id")
SQL = "SELECT * FROM ProblemTable WHERE id < " & id & " ORDER BY id DESC"
[Execute...]

- Du har nu det recordset, du ønsker. (Du kan evt. sætte "TOP 1" eller "LIMIT
1" på begge SQL-sætninger).

M.v.h.

Jonathan




Jesper Stocholm (02-04-2001)
Kommentar
Fra : Jesper Stocholm


Dato : 02-04-01 13:34

Jonathan Stein <jstein@image.dk> wrote in <3AC8682C.BB5069F5@image.dk>:

>Jesper Stocholm wrote:
>
>> Jeg har nogle data, hvor jeg trækker en delmængde ud - dvss en enkelt
>> række, der kan være sorteret. Jeg har nu behov for at kunne finde /den
>> forrige/ indgang i rækken - givet ved en celleværdi. Jeg har derfor
>> behov for at gennemløbe rækken - og i tilfælde af et match - gå et
>> skridt tilbage og udtrække værdien. Er min værdi fx 39 og min række
>>
>> 45
>> 76
>> 39
>> 56
>>
>> ... skal den returnere 76
>
> En anden work-around. Lav et auto-increment id-felt (hvis du ikke
> allerede har
>det, og brug to SQL-sætninger:
> SQL = "SELECT * FROM ProblemTable WHERE prnumber=" & prnumber
> [Execute...]
> id = objrs("id")
> SQL = "SELECT * FROM ProblemTable WHERE id < " & id & " ORDER BY id
> DESC" [Execute...]
>
> - Du har nu det recordset, du ønsker. (Du kan evt. sætte "TOP 1" eller
> "LIMIT
>1" på begge SQL-sætninger).
>

mjaeh ... men jeg vil meget gerne undgå dette - specielt da jeg ikke umiddelbart har
adgang til at ændre i selve datamodellen. Derfor skulle det gerne virke med den
eksisterende datamodel. Jeg er heller ikke helt sikker på, at din løsning vil virke (har
dog ikke helt gennemtænkt det), da recordset kan være sorteret på op til 5 forskellige
måder - uafhængigt af ID.

Fx kan tabellen med ID og PRNr se således ud:

| PRNr | ID |
-------------
45 5
76 4
39 9
56 1

Jeg har sidder og lavet lidt om på det, og min kode er nu følgende:

set conn = server.createobject("ADODB.Connection")
conn.Open "testclca"
set objrs = server.CreateObject("ADODB.Recordset")
prnumber = 39
sql_nav = "SELECT * FROM ProblemTable"
objrs.Open sql_nav, conn, adOpenKeyset,'<-- Linie 10
Flag = 0
objrs.MoveFirst
do while not objrs.EOF AND Flag <> 1
if cint(objrs("prnumber")) = cint(prnumber) then
objrs.Moveprevious '<-- linie 15
prid = objrs("prnumber")
Flag = 1
end if
objrs.MoveNext()
loop

hvor jeg får fejlen

ADODB.Recordset (0x800A0C93)
Operation is not allowed in this context

Det, der nager mig mest, er at jeg ikke kan få nogen af recordset-metoderne til at virke.
Hvis jeg udskriver objrs.recordcount får jeg -1 og hvis jeg bruger "objrs.CursorLocation
= adUseServer" får jeg fejlen

ADODB.Recordset (0x800A0BB9)
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one
another.

Så imo lugter det lidt af, at der er en property, der er sat forkert ... eller har fået
en forkert værdi.

.... jeg kan bare ikke se hvor ...
--
Check out the first review of Mac OS X at
http://wincent.org/transitional/final.pgp.txt

- Jesper Stocholm - http://stocholm.dk

Jonathan Stein (03-04-2001)
Kommentar
Fra : Jonathan Stein


Dato : 03-04-01 11:15

Jesper Stocholm wrote:

> ... Jeg er heller ikke helt sikker på, at din løsning vil virke (har
> dog ikke helt gennemtænkt det), da recordset kan være sorteret på op til 5 forskellige
> måder - uafhængigt af ID.

- Og du har ikke mulighed for at sortere i omvendt rækkefølge? (Så du kan bruge næste
recordset i stedet for forrige).

M.v.h.

Jonathan





Jesper Stocholm (03-04-2001)
Kommentar
Fra : Jesper Stocholm


Dato : 03-04-01 12:58


"Jonathan Stein" <jstein@image.dk> wrote in message
news:3AC9A2AB.6E8BB20E@image.dk...
> Jesper Stocholm wrote:
>
> > ... Jeg er heller ikke helt sikker på, at din løsning vil virke (har
> > dog ikke helt gennemtænkt det), da recordset kan være sorteret på op til
5 forskellige
> > måder - uafhængigt af ID.
>
> - Og du har ikke mulighed for at sortere i omvendt rækkefølge? (Så du
kan bruge næste
> recordset i stedet for forrige).
>

nej ... for "rækkefølge" giver i dette tilfælde ikke helt mening ... hvilket
skyldes, at jeg også skal kunne finde den sidste værdi, den første værdi og
den næste værdi.



Anyway ... jeg har dog løst problemet. Det skyldtes, at jeg skulle
initialisere min adOpenKeyset til værende lig 1 ...

Koden (der virker) er nu

set conn = server.createobject("ADODB.Connection")
conn.Open "testclca"
set objrs = server.CreateObject("ADODB.Recordset")
prnumber = 39
sql_nav = "SELECT * FROM ProblemTable"
adOpenKeyset = 1
objrs.Open sql_nav, conn, adOpenKeyset
Flag = 0
objrs.MoveFirst
do while not objrs.EOF AND Flag <> 1
if cint(objrs("prnumber")) = cint(prnumber) then
objrs.Moveprevious
prid = objrs("prnumber")
Flag = 1
end if
objrs.MoveNext()
loop

.... og nu kan jeg anvende alle de forskellige recordset-metoder lige som jeg
lyster ...

Nu jeg tænker over det, så kunne det godt være, at jeg kunne bruge din
løsning alligevel (med tungen tilpas lige i munden), men jeg synes nu, at
den løsning jeg er kommet frem til er lidt pænere ... selvom performance nok
ikke er i top.



Jesper Stocholm





Kim Søvø Pedersen (03-04-2001)
Kommentar
Fra : Kim Søvø Pedersen


Dato : 03-04-01 15:01

selvom performance nok
> ikke er i top.
>
>
>
> Jesper Stocholm
>

Du kan også rulle hele svineriet ud i et array, så kan du jo få fat i alle
tallene som du lyster...? :p



Jesper Stocholm (03-04-2001)
Kommentar
Fra : Jesper Stocholm


Dato : 03-04-01 18:03

"Kim Søvø Pedersen" <ksp@diaphoni.dk> wrote in <bHky6.507$76.60764
@news101.telia.com>:

>selvom performance nok
>> ikke er i top.
>>
>>
>>
>> Jesper Stocholm
>>
>
>Du kan også rulle hele svineriet ud i et array, så kan du jo få fat i alle
>tallene som du lyster...? :p
>

ja ... og jeg kunne også lave en CSV-fil og gennemløbe den ...

.... men jeg vil nu gerne bruge de umiddelbare redskaber der er til det ...
som nu ADODB.recordset ...

--
Jesper Stocholm - http://stocholm.dk

Søg
Reklame
Statistik
Spørgsmål : 177511
Tips : 31968
Nyheder : 719565
Indlæg : 6408590
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste