Toon posts:

[ASP/SQL] Recordset filteren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit met het volgende probleem; ik ben bezig om een ASP-applicatie te ontwikkelen met daarin een stuk SQL code. Deze code voert een query uit met bijv. het volgende resultaat :

(ID) | (user)
1 | 1
2 | 1
3 | 1
4 | 1
1 | 2
2 | 2
1 | 3
2 | 4

De ID's zijn bijv. artikelen die door een bepaalde user verkocht worden. Nu wil ik in mijn ASP-applicatie graag een tabel met daarin de ID's en daarachter in een listbox de users. Bovenstaand resultaat op zo'n manier, waarbij de users in een listbox komen :

1 | 1,2,3
2 | 1,2,4
3 | 1
4 | 4

Ik heb al vanalles geprobeerd (in mn SQL-code) om de resultaten op een of andere manier te filteren, maar dat lukt niet. Weet iemand een oplossing hiervoor ???? :)

[ Voor 5% gewijzigd door Verwijderd op 30-10-2003 14:32 ]


Verwijderd

Sorteer ze dan in elk geval op ID, dan ben je al een heel eind.

Verwijderd

ik denk dat je gewoon twee SQL query moet maken.. 1 die de ID's ophaalt en 1 die de per Id de users ophaalt. het resultaat van de laatste zet je dan steeds in die listboxes

  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

deze link stond nog op mijn clipboard omdat ik hem net gebruikt heb: :)

http://www.planet-source-...asp?txtCodeId=18&lngWId=4

edit: hee ik krijg nu ineens een register scherm :?

ah, je mag de pagina maar 5 keer opvragen, dan moet je registreren. Stel voor dat je de code dus de eerste keer ff kopieert ;)

[ Voor 42% gewijzigd door j_du_pee op 30-10-2003 14:38 ]

kaart != map && bottel != fles
Wacht op antwoord


Verwijderd

Topicstarter
Verwijderd schreef op 30 oktober 2003 @ 14:35:
ik denk dat je gewoon twee SQL query moet maken.. 1 die de ID's ophaalt en 1 die de per Id de users ophaalt. het resultaat van de laatste zet je dan steeds in die listboxes
Ik denk dat dit toch de beste oplossing is....ga dit maar es proberen

Verwijderd

Verwijderd schreef op 30 oktober 2003 @ 14:36:
[...]


Ik denk dat dit toch de beste oplossing is....ga dit maar es proberen
Een makkelijke manier, maar als je het resultaat in 1 query kan krijgen is dat natuurlijk veel efficienter, zeker als het aantal IDs oploopt.

Als je de resultaten op de goede manier gesorteerd terugkrijgt kun je met een mooie while loop je resultaten wel goed tonen.

Verwijderd

Topicstarter
Verwijderd schreef op 30 oktober 2003 @ 14:53:
[...]
Een makkelijke manier, maar als je het resultaat in 1 query kan krijgen is dat natuurlijk veel efficienter, zeker als het aantal IDs oploopt.
Weet jij hoe ???? _/-\o_

Verwijderd

Je houdt met een temp variable bij of je id hetzelfde is als de vorige rij van je recordset.
Zo ja, dan plak je er op je huidige regel de waarde bij.
Zo nee, dan stap je naar de volgende regel.

Verwijderd

Je haalt met één query de hele tabel naar binnen die je sorteerd op ID ASC.
Dan loop je eenmaal door je recordset en stop je elk item in een object die je op gaat bouwen met parent-child relaties
Daarna genereer je netjes met een recursieve je gewilde output....

edit:
Dat van JimmyShelter is een envoudigere oplossing...

[ Voor 12% gewijzigd door Verwijderd op 30-10-2003 15:01 ]


  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

Verwijderd schreef op 30 oktober 2003 @ 14:59:
[...]


Je houdt met een temp variable bij of je id hetzelfde is als de vorige rij van je recordset.
Zo ja, dan plak je er op je huidige regel de waarde bij.
Zo nee, dan stap je naar de volgende regel.
zo deed ik het ook altijd. Echter in de link die ik post staat ook een hele mooie oplossing ;) je filtert de recordset telkens, waardoor je ado het zoekwerk voor je laat doen en niet de overhead hebt van steeds een nieuwe query op je DB runnen...

kaart != map && bottel != fles
Wacht op antwoord


Verwijderd

Topicstarter
Verwijderd schreef op 30 oktober 2003 @ 14:59:
[...]
Je houdt met een temp variable bij of je id hetzelfde is als de vorige rij van je recordset.
Zo ja, dan plak je er op je huidige regel de waarde bij.
Zo nee, dan stap je naar de volgende regel.
Heb je hier een voorbeeld van toevallig (code) ?

Verwijderd

Topicstarter
volgens mij lukt het al....ff proberen nog :)

Verwijderd

Je kan natuurlijk ook best zelf wat doen :P

Even heel simpel:
ASP:
1
2
3
4
5
6
7
8
9
10
11
dim temp
temp =-1
do while not RS.EOF
    if temp <> RS("id")
        'voeg nog een item toe
    else
        'begin een nieuwe regel met een nieuw id
    end if

    temp = RS("id")
Loop


Hmm, moet alleen een check bij zodat je de eerste keer ook begint met je tabel.

  • Altaphista
  • Registratie: Juli 2001
  • Laatst online: 16-08 16:51

Altaphista

1. check manual, 2. ask

hmmm, kan je ook gebruike maken van SP's?
Volgens mij was het mogelijk om iets als dit te doen:
SQL:
1
SELECT id1 as blabla, (SELECT  id2 FROM tabel WHERE  id2 = x) AS trala FROM tabel

(weet het niet meer zeker)

Je gaat het pas zien als je het doorhebt.


Verwijderd

Ha!
Dit probleem had ik gister ook.
Het is idee is om te matchen op een bepaalde waarde, in dit geval column 1

Dit is een sniplet van een eigen code wat precies doet wat je wilt.
Ik denk dat je het maar een klein beetje hoeft aan te passen.

Hier hoort trouwens ook een import bij:
dbClass

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<%

// constructor

function dbClass() {
    // Recordset State constants
    
    this.adStateClosed = 0;
    this.adStateOpen = 1;
    this.adStateConnecting = 2;
    this.adStateExecuting = 4;
    this.adStateFetching = 8;
    
    return this;
}

// init procedure

function dbClass.prototype.initialize() {
    this.logStack = [];

    // create fields pool object
    
    this.container = function(arr,oThis) {
        this.pooldata = arr;
        arr = null;
        this.constructor.prototype.item = function(x) { return this.pooldata.getItem(x,oThis.pointer); }
        this.constructor.prototype.length = function() { return oThis.col; }
        return this; 
    }
    try {
        this.adoConnection = Server.CreateObject("ADODB.Connection");
        this.adoRecordset = Server.CreateObject("ADODB.Recordset");
        }
    catch(e) {
        this.log('Error @ initialize. Cannot create server objects. System Message: ['+e.description+']');
        return false;
    }
    return true;
}

function dbClass.prototype.log(text) { this.logStack.push(text); }

function dbClass.prototype.returnLog() { return this.logStack; }

function dbClass.prototype.openConnection(connection) { this.adoConnection.Open(connection); }

function dbClass.prototype.executeQuery(query) {
    if(this.adoRecordset.State == this.adStateOpen) { this.adoRecordset.Close(); }
    this.adoRecordset.Open(query, this.adoConnection);
    if(this.adoRecordset.State == this.adStateClosed) {return container = false; return false;}
        if (this.adoRecordset.EOF) { this.container = false; return false; }
            var p = this.adoRecordset.getRows();
            this.col = (p.ubound(1)+1); 
            this.row = (p.ubound(2)+1);
            var eThis = this;
        this.pool = new this.container(p,eThis);
        this.pointer = 0;
    this.adoRecordset.Close();
    
    return true;
}

function dbClass.prototype.moveNext() { this.pointer++; }

function dbClass.prototype.moveBack() { this.pointer--; }

function dbClass.prototype.moveFirst() { this.pointer = 0; }

function dbClass.prototype.moveLast() { this.pointer = (this.row - 1); }

function dbClass.prototype.eof() { return (this.pointer == this.row)?true:false; }

function dbClass.prototype.bof() { return (this.pointer == 0)?true:false; }

function dbClass.prototype.forceClose() { 
    if(this.adoRecordset.State == this.adStateOpen) { this.adoRecordset.Close(); }
    this.pool = null; this.pointer = null;
}

function dbClass.prototype.destroy() {
    this.pool = null; this.pointer = null; this.logStack = null;
    if(this.adoRecordset.State == this.adStateOpen) { this.adoRecordset.Close(); }
    if(this.adoConnection.State == this.adStateOpen) { this.adoConnection.Close(); }
}

%>


de output is een array stack[] waarbij de column van jou een referencie naar de lang array is :)

ingewikkwled?
helemaal niet!
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    function data.prototype.getStack() {

        stack = [[],[],[],[],[],[]];
        var lang = [];
        var isNew = true;
        var y,z = 0;

        while(!this.db.eof()) {

            if (y == parseInt(this.db.pool.item(0))) { isNew = false; }
            else { isNew = true; }

            if (isNew) {
                if (typeof(lang[lang.length -1]) != 'undefined') {

                    stack[5][stack[5].length] = lang[lang.length -1];
                }
                lang[lang.length] = [];
                lang[lang.length -1][lang[lang.length -1].length] = this.db.pool.item(5);
            }

            if (!isNew) {
                lang[lang.length -1][lang[lang.length -1].length] = this.db.pool.item(5);
            }
            for(var x=0;x<( this.db.pool.length() -1 );x++) {

                if (isNew) {

                    stack[x][stack[x].length] = this.db.pool.item(x);
                }

            }

            y = parseInt(this.db.pool.item(0));

            this.db.moveNext();

            }

        return stack;
    }

  • Bud_s
  • Registratie: Maart 2002
  • Laatst online: 01-08 16:55
Verwijderd schreef op 30 oktober 2003 @ 14:59:
[...]
Je houdt met een temp variable bij of je id hetzelfde is als de vorige rij van je recordset.
Zo ja, dan plak je er op je huidige regel de waarde bij.
Zo nee, dan stap je naar de volgende regel.
Zo heb ik in het verleden al heel wat performance probleempjes opgelost.

Was in een C variant waar een tabel werd doorgelopen van begin tot eind, en steeds bijhorende records uit 4 of 5 andere tabellen er werd bijgehaald.

Je merkte dat je dus heel vaak dezelfde records steeds opnieuw binnehaalde, terwijl je vorige waarde's nog bekend waren. Resulteerde vaak tot 60 % - 70 % minder open / lees actie's.

Ik sluit me dus aan bij Jimmy :)

Zeker om dat het hier relatief simpel te sorteren is.
Vergeet niet de juiste key aan te maken, scheelt ook weer een boel :)

edit:
had al een tijdje terug op de quote knop geramd, ff dingen tussendoor, nu verstuur ik hem en zie al weer een boel andere (goede) reacties.
Beetje spuit 11 gevoel :)

[ Voor 11% gewijzigd door Bud_s op 30-10-2003 15:47 ]


Verwijderd

Ik maak van die code wel ff iets generieks

Verwijderd

Topicstarter
Ben er weer effe mee bezig, maar het wil nog niet echt lukken :(

De SQL query is goed, die is gesorteerd op ID met daarachter de user.
Nu moet ik alleen nog iets hebben waarmee ik dus die recordset kan doorlopen. Ik heb al vanalles geprobeerd, maar het lukt nog steeds niet :'(

Ik loop namelijk steeds tegen het probleem aan dat wanneer ik een record onderzocht heb, er meteen een rij aan een tabel wordt toegevoegd. Als dan bij het volgende record blijkt dat er nog iets aan de vorige rij moet toegevoegd worden, kom ik daar niet meer aan.... Ik weet het echt niet meer 8)7

Weet iemand hoe ik die recordset een record terug kan laten kijken ? Dan weet ik genoeg denk ik....

[ Voor 9% gewijzigd door Verwijderd op 30-10-2003 17:34 ]


Verwijderd

ik heb moeite met het ombouwen van me classe

als je nog ff heb?
Pagina: 1