Toon posts:

[ASP/JS Recordset Mergen]

Pagina: 1
Acties:

Verwijderd

Topicstarter
ppl.

het volgende stukje code merged recordsets.
Stel het volgende:

Je heb de colums
ID
Leeftijd
Vaardigheid

Stel dat Vaardigheid een key is die linkt naar een vaardigheden tabel.
1 user (ID) kan dus meerdere vaardigheden hebben wat resulteert in (als iemand 3 vaardigheden heeft) 3 aparte records. Maar eigenlijk is het handiger als het gewoon 1 record is waarbij de Vaardigheden column gewoon comma separated is.

Met de volgende code wordt dit voor je gedaan.
Het werkt erg eenvoudig.

Zorg er alleen voor dat de column die je wilt mergen de Laaste in de SELECT is.

sample code:

code:
1
2
3
4
5
6
7
var container  = new data();
// set de column waar je op wilt MATCHEN. In ons geval ID
container.setPrimary(num); 
// set de column welke je wilt MERGEN
container.setColumn(num); // in ons geval 3 (laatste in de select
container.loadRecordset(rs); // load de recordset in het object returned T/F
var stack = container.getStack(); // returned false of een array[field][item];


ok hier volgt de echte code.

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<% @language=javascript %>

<%

// constuctor

function writeline(text) { Response.Write(text); }

function data() {

    this.pool;
    return this;
}

function data.prototype.loadContainer() {
    try {
        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.column; }
            this.constructor.prototype.moveNext = function() { oThis.pointer++; }
            this.constructor.prototype.eof = function() { return (oThis.pointer == oThis.row)?true:false; }
        return this;
        }
        return true;
    }
    catch(e) { return false;}
}


function data.prototype.setPrimary(nCol) { this.col = nCol; return nCol?true:false; }
function data.prototype.setColumn(nNum) { this.target = (nNum-1); return nNum?true:false;}

function data.prototype.loadRecordset(rs) {

    if (rs.state != 1) { return false; }
    // convert all

    var p = rs.getRows();

    this.column = (p.ubound(1)+1);
    this.row = (p.ubound(2)+1);

    var eThis = this;

    if (!this.createStack(this.row)) { return false;}
    if (!this.loadContainer()) { return false;}

    this.pool = new this.container(p,eThis);
    this.pointer = 0;

    return true;
}

function data.prototype.createStack(amount) {

    try {
        this.stack = [];

        for (x=0;x<(amount);x++) {
            this.stack[x] = [];
        }
        return true;
    }
    catch(e) { return false;}
}

function data.prototype.getStack() {

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

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

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

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

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

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

                if (isNew) {

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

            }

            y = parseInt(this.pool.item(this.col));

            this.pool.moveNext();

        }

        return stack?stack:false;
    }

%>


Laat me weten wat je er van vind.

[ Voor 3% gewijzigd door Verwijderd op 16-06-2016 14:10 ]


  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 12-08 16:04

Jaspertje

Max & Milo.. lief

Verwijderd schreef op 31 oktober 2003 @ 11:42:
ppl.

het volgende stukje code merged recordsets.
Stel het volgende:

Je heb de colums
ID
Leeftijd
Vaardigheid

Stel dat Vaardigheid een key is die linkt naar een vaardigheden tabel.
1 user (ID) kan dus meerdere vaardigheden hebben wat resulteert in (als iemand 3 vaardigheden heeft) 3 aparte records. Maar eigenlijk is het handiger als het gewoon 1 record is waarbij de Vaardigheden column gewoon comma separated is.

Met de volgende code wordt dit voor je gedaan.
Het werkt erg eenvoudig.

Zorg er alleen voor dat de column die je wilt mergen de Laaste in de SELECT is.

Laat me weten wat je er van vind.
Ik vindt het slecht.. je wilt namelijk niet de data komma seperated hebben, dat druist tegen elk goed database model en tegen elke goede theorie in.. Dus eigelijk is het onzin wat je doet.. (ik heb je code ook niet bekeken)..

Sorry

Verwijderd

Topicstarter
Als je kijkt dan zie je dat het een array is
Deze is inprincipe comma separated

bijv

array[5][1] levert gewoon een entry uit een array op

Er zijn geen andere manieren om dit met sql op te lossen.
En ik gebruik graag getRows() dus vandaar

Verwijderd

Topicstarter
nog een ding
getRows() returned een elle lange array

Met dit model is het nog goed gescheiden ook

want de fields zijn gewoon subarrays in een array

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Kun je iets meer uitleg geven over waarom je dit gedaan hebt, waarom je welke keuze gedaan hebt en waarom dit de beste manier is tov de andere manieren die mogelijk zijn :)

Enkele puntjes die ik (in deze voor mij niet beheersde taal) zie:
• Je merged de recordset in je applicatie toch? Dit merge je toch dmv een array ipv een csv?
• Waarom dat ding stack noemen? Het is een array van array's en ik zie geen pop() en push() operanderen daarop (of bestaan die wel?)
• Je gaat er van uit dat het int's zijn die gemerged worden. Kun je die veronderstelling niet beter gewoon dirigeren naar de Handler ipv deze module?

Verwijderd

Topicstarter
1. alert(array); --> levert een csv op
2. Ik heb het even omgeturned van een ander deel code. Daar zitten wel mogelijkheden tot push en pop in.
3. het is onlogisch te mergen op strings of andere datatypes. Een beetje database bouwer heeft altijd een primary key of een id (wat ints zijn)

:)

Verwijderd

Topicstarter
Geen idee trouwens of dit de beste manier is.
Vast niet.

Maar het is wel EEN manier.

Het is gewoon snel en makkelijk

Ik had het toevallig eergister nodig. Maar SQL kan geen recordsmergen waarbij een bepaalde column overeent komt wanneer hij niet distinct is.

Deze lost dat probleem op

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 12-08 16:04

Jaspertje

Max & Milo.. lief

Verwijderd schreef op 31 oktober 2003 @ 11:49:
Als je kijkt dan zie je dat het een array is
Deze is inprincipe comma separated

bijv

array[5][1] levert gewoon een entry uit een array op

Er zijn geen andere manieren om dit met sql op te lossen.
En ik gebruik graag getRows() dus vandaar
Verwijderd schreef op 31 oktober 2003 @ 11:51:
nog een ding
getRows() returned een elle lange array

Met dit model is het nog goed gescheiden ook

want de fields zijn gewoon subarrays in een array
Ook bij SQL kan je GetRows doen, waardoor het ook gewoon een array wordt. En ipv 1,3,5 staat er dan
1
3
5

En nog iets over het db model.. wat als ik nu de middelste vaardigheid niet meer heb, dan moet je die er helemaal uitgaan zoeken en dan alles opnieuw wegschrijven in de db.. terwijl, als het allemaal apparte records zijn, dan doe je delete where vaardigheid = 3 and user = 1 en klaar.... Is ook minder fout gevoelig volgens mij. Nog iets.. hoe kan jij nu checken dat je vaardigheid 3 al hebt? dat is ook foutgevoeliger...

Nog een edit:
Wat als ik nu ook de naam van de vaardigheid meteen wil weten, dan kan je dat niet weergeven op deze manier.. dan moet je meerdere querys uitvoeren terwijl dat makkelijk kan als alle record appart zijn.

offtopic:
Je kan ook de edit knop gebruiken

[ Voor 14% gewijzigd door Jaspertje op 31-10-2003 12:02 ]


Verwijderd

Topicstarter
Als je goed kijkt dan maak ik ook gebruik van getRows();

Je kan niet zomaar deleten
Stel je heb

vaardigheid_id[tab]vaardigheid
en

id[tab]user[tab]vaardigheid

dan krijg je (bij 3x vaarhigheid) 3 records.
Wat wil je dan gaan deleten?

dan is het:
1 [tab] jackieherer [tab] engels
1 [tab] jackieherer [tab] frans
1 [tab] jackieherer [tab] duits

niet te doen dus ;)

bij mij komt er uit

1 [tab] jackiehere [tab] array[engels,frans,duits]

handiger toch?

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 12-08 16:04

Jaspertje

Max & Milo.. lief

Verwijderd schreef op 31 oktober 2003 @ 12:02:
Als je goed kijkt dan maak ik ook gebruik van getRows();

Je kan niet zomaar deleten
Stel je heb

vaardigheid_id[tab]vaardigheid
en

id[tab]user[tab]vaardigheid

dan krijg je (bij 3x vaarhigheid) 3 records.
Wat wil je dan gaan deleten?

dan is het:
1 [tab] jackieherer [tab] engels
1 [tab] jackieherer [tab] frans
1 [tab] jackieherer [tab] duits

niet te doen dus ;)

bij mij komt er uit

1 [tab] jackiehere [tab] array[engels,frans,duits]

handiger toch?
Maar je slaat alleen nummers op, dan heb je nog geen namen?

Maar je hebt wel gelijk dat dit niet ideaal is, maar ik zou liever zien dat ie alleen de userID meegeeft en dat je het dan in de code oplost waar je al eerder dan de username hebt gegeven..

[ Voor 16% gewijzigd door Jaspertje op 31-10-2003 12:06 ]


Verwijderd

Topicstarter
Hij neemt niet alleen de nummers mee

Hij neemt gewoon de return waarde van een field uit de SELECT mee
kan dus van alles zijn, omschrijving, id nummer boeit niet

probeer het eens. Er zit nog een kleine backend achter door het makkelijk doorlopen van getRows() arrays

this.pool opties

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Verwijderd schreef op 31 oktober 2003 @ 11:56:
3. het is onlogisch te mergen op strings of andere datatypes. Een beetje database bouwer heeft altijd een primary key of een id (wat ints zijn)
Onlogisch misschien, maar er zijn wel voorbeelden te bedenken waarin het helemaal niet zo'n probleem is. Waarom zou je jouw logica dan doorvoeren naar iedereen? Ik zou gewoon geen aanname maken, gewoon lekker als string erin duwen en mooi generiek houden.

Verder nog:
• A PRIMARY KEY is a unique KEY where all key columns must be defined as NOT NULL. If they are not explicitly declared as NOT NULL, it will be done implicitly (and quietly). In MySQL the key is named PRIMARY. A table can have only one PRIMARY KEY. If you don't have a PRIMARY KEY and some applications ask for the PRIMARY KEY in your tables, MySQL will return the first UNIQUE key, which doesn't have any NULL columns, as the PRIMARY KEY.
• A PRIMARY KEY can be a multiple-column index. However, you cannot create a multiple-column index using the PRIMARY KEY key attibute in a column specification. Doing so will mark only that single column as primary. You must use a separate PRIMARY KEY(index_col_name, ...) clause.
Wat doe jij met multiple-column primairy key indexen?

Verwijderd

Topicstarter
lol kom op ;)

Dit ding heb ik gewoon ff in elkaar gedraait (niets te doen op me stage)

Niet met die gekke dingen aankomen zetten :)

oh wacht!

haha je kan gewoon op allerlij soorten datatypes doen

Aangezien je alleen het COLUMN nummer selecteert. De inhoud daarvan is niet boeiend
(variabele zijn toch varianten)

ook weer opgelost :)

Verwijderd

Topicstarter
Dit geldt alleen als je parseInt weghaalt bij het toewijzen van y and het vergelijken met de column entry in de pool

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 12-08 16:04

Jaspertje

Max & Milo.. lief

Opzich zal het wel leuk zijn, en voor een aantal dingen ook wel werken dat geloof ik meteen. Maar als ik met deze dingen op school zou aankomen dan zou ik alle hoeken van de leraren kamer zien. want het is (volgens de optimalisatie regels) not done om het zo op te slaan, maar nogmaals, het zal wel eens handig kunnen zijn..

Verwijderd

Topicstarter
Als je een andere manier weet.
Want voor zover ik weet is die er niet.

Ik heb genoeg informatie op internet opgezocht over dit punt, en nergens werd een degelijke oplossing aangedragen.

Hoe zou je het dan doen?

(keep in mind dat het niet perfect is natuurlijk)

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 12-08 16:04

Jaspertje

Max & Milo.. lief

Wat wil je precies dan? Je wilt alles in een array hebben.. zover volg ik het.. Als ik een query uitvoer.. waaruit de volgende dingen komen:

Jasper, 1
Jasper, 3
Jasper, 5
Jasper, 7

Dan wil jij liever Jasper, 1, 3, 5, 7 omdat je dan maar een keer Jasper hebt met meteen de goede waardes.

Volgens mij is er geen betere manier om het zo te doen als jij (volgens mij) wilt. Maar een andere vraag die dan bij mij opkomt, wil je wel echt wat jij (alweer volgens mij) wilt :)

Uitleg: Een database model is volgens mij belangrijker dan het meteen goed weergeven van gegevens (uitzonderingen uiteraard daargelaten, en misschien is dit er wel een)
het voordeel van jou manier, is dat je maar een query hebt voor alles wat je nodig hebt. het nadeel (al x keer genoemd, het dbmodel).

Ik zou (met 2 query's) hetzelfde bereiken als jij denk ik, met het dbmodel waarbij alles appart opgeslagen wordt. Die 2 query's zijn zelfs nog terug te brengen naar een als ik al weet over welke user het gaat. Als je wilt dat ik er een voorbeeld bijzet, vraag het dan, want dan ga ik kijken waar ik dat heb staan.

Ik vindt overigens wel dat het altijd lastig is om een tabel te vullen met meerdere x en y waardes:
  | a | b | c | d
1| x |   | x |
2| x | x | x |
3|   |   | x | x

Verwijderd

Topicstarter
Ik heb het even gechecked met de Oracle mensen hier, en die zeggen dat het niet kan. Ook niet met 2 query's.

Kijk. Hij rebuild gewoon die getRows() array in een iets betere structuur met bijkomende voordelen

jasper | 1
jasper | 2
jasper | 3

ref:

1|sex
2|peuken
3| bier

SELECT naam, voorkeur from blabla

dan krijg je toch echt.

Japsper |1
jasper |2
jasper |3

bij mij krijg je
jasper | array[sex,peuken,bier] (ligt aan de query wat je wilt hebben)

zo kan je makkelijk door de array loopen en al je informatie eruit halen die je nodig heb

ook de velden zijn gescheiden

stack[field][row]
stack[0][0] levert jasper op
en stack[1][0] levert voorkeur op

naja er zitten fouten in de code. die zijn nu gefixed

Verwijderd

Topicstarter
Database heb ik niet gemaakt.
Die is gewoon van software pakket (www.nebu.com)

Ik haal alleen maar informatie eruit voor display

maar geloof me. Volgens mij is het best wel handig voor mensen die gewent zijn getRows() te gebruiken en dit probleem wel eens tegen komen

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 12-08 16:04

Jaspertje

Max & Milo.. lief

Verwijderd schreef op 31 oktober 2003 @ 14:23:
Database heb ik niet gemaakt.
Die is gewoon van software pakket (www.nebu.com)

Ik haal alleen maar informatie eruit voor display

maar geloof me. Volgens mij is het best wel handig voor mensen die gewent zijn getRows() te gebruiken en dit probleem wel eens tegen komen
Ja, maar ik gebruik ook GetRows alleen is mijn array multidimensionaal (geloof dat het zo heet)
Pagina: 1