[XSL] Subtotalen en rariteit

Pagina: 1
Acties:

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Ik ben alweer een tijdje aan 't prutsen, maar krijg het niet voor elkaar. Ik probeer het volgende te doen:

Ik haal een recordset op, persist die in een XML object en jas die samen met een XSL door een XSLT Processor. Nu kom ik 2 problemen tegen, waarvan ik er 1 (nogal ranzig) heb opgelost maar waar ik niet erg tevreden over ben.

Het project is als volgt:

Ik maak een bezorglijst voor een Pizza-Groothandel (fictief) gegroepeerd per datum waarop de pizza's bezorgd moeten worden en daarbinnen gegroepeerd per klant. Ik wil nu per klant een subtotaal weergeven, zodat de chauffeur niet alleen weet wat hij moet afleveren, maar ook wat hij moet afrekenen (de klant krijgt een factuur in envelop).

De problemen:

* RobIII Probleem 1 Ik vergelijk klant-id's met het volgende record, en als deze niet gelijk zijn dien ik een subtotaal weer te geven. Ja, de recordset is altijd gesorteerd op datum en klant. Als ik de ID's met elkaar vergelijk krijg ik echter maar soms een subtotaal, en soms niet. Hiermee bedoel ik het volgende:

In mijn XSL staat de regel:
code:
1
2
3
4
5
<xsl:if test="not (current()/@kl_id = following-sibling::z:row/@kl_id)">
    <!-- Subtotaal per klant rij -->
    ...
    ...
</xsl:if>


Dit werkt soms wel, soms niet. Ik heb dat als volgt opgelost:

code:
1
2
3
4
5
<xsl:if test="not (((current()/@kl_id)+0) = ((following-sibling::z:row/@kl_id)+0))">
    <!-- Subtotaal per klant rij -->
    ...
    ...
</xsl:if>

Ik tel er 0 bij op (waardoor het waarschijnlijk gecast wordt naar een number of int ofzo). Dan werkt het dus wel.

Iemand enig idee hoe ik dit netter oplos :? De huidige oplossing werkt wel, maar dat moet netter kunnen. Ik kan alleen nergens iets vinden als een "Convert", "Cast", "toInt" of iets dergelijks om dit tot een goed einde te brengen.

* RobIII Probleem 2 Ik wil een subtotaal per klant berekenen. Ik heb al vanalles geprobeerd met sum() met bepaalde selects e.d., maar behalve een hele boel errors of NaN-waardes krijg ik er weinig zinnigs uit.

Ik heb nu:

code:
1
<xsl:variable name="subtot" select="sum(xml/rs:data/z:row/@totaalex)"/>


Ik probeer dus een subtotaal in een variabele te gooien, en deze op de juiste plaats af te drukken. Dit werkt dus niet, want ik krijg NaN. Ook heb ik geprobeerd het in een for-each loop op te lossen, maar dat kreeg ik ook niet werkend.

De bestanden
De bestanden waarom het gaat heb ik ingekort zodat ze goed leesbaar zijn en gezipt op onze webspace gegooid. Wil een XSL guru hier eens zijn licht op laten schijnen en dit probleem bekijken?

De zipfile vind je hier. (3Kb, 3 bestanden XML, XSL en CSS)

Ik vraag niet om een compleet uitgewerkte oplossing, maar een vinger in de juiste richting of een URL-etje zou ik erg op prijs stellen.

En wee degene die met w3schools komt aanpoepen ;) Die heb ik namelijk al uit :D

[ Voor 9% gewijzigd door RobIII op 07-05-2004 12:10 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
code:
1
2
3
4
5
<xsl:if test="number(current()/@kl_id) != number(following-sibling::z:row/@kl_id)">
    <!-- Subtotaal per klant rij -->
    ...
    ...
</xsl:if>

Ik denk dat dit al een oplossing voor probleem 1 is. Ik ga het nu even, samen met je andere probleem even testen. brb.

Noushka's Magnificent Dream | Unity


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Michali schreef op 07 mei 2004 @ 12:24:
code:
1
2
3
4
5
<xsl:if test="number(current()/@kl_id) != number(following-sibling::z:row/@kl_id)">
    <!-- Subtotaal per klant rij -->
    ...
    ...
</xsl:if>

Ik denk dat dit al een oplossing voor probleem 1 is. Ik ga het nu even, samen met je andere probleem even testen. brb.
|:( |:(
Ik wou net komen posten dat ik 'm al gevonden had m.b.v. number(), maar je bent me voor.
edit:

Hier kan ik nou écht van balen... Komt zo n00b over :+


Thanks anyway.

Nu mijn 2e probleem nog :+

[ Voor 11% gewijzigd door RobIII op 07-05-2004 12:42 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Dan probleem 2:
code:
1
2
3
4
5
<xsl:if test="number(current()/@kl_id) != number(following-sibling::z:row/@kl_id)">
    <!-- Subtotaal per klant rij -->
    <xsl:variable name="subtot" select="sum(/xml/rs:data/z:row[@kl_id = current()/@kl_id and @lev_datum = current()/@lev_datum]/@totaalex)"/>
    <tr><td colspan="10" class="SubTotRow" align="right">&#8364; <xsl:value-of select="format-number($subtot,'0.00')"/></td></tr>
</xsl:if>

Zoals je ziet heb ik je select in de variable ook een beetje aangepast, ik weet niet zeker of dit de bedoeling was maar goed. Wat er gebeurde is dat je steeds de waarde van alle bestellingen selecteerde en niet die bestellingen met het huidige klantnummer en datum. Dus heb ik die check er even ingezet. Waar het fout ging was dit:
code:
1
<xsl:value-of select="format-number(subtot,'0.00')"/>

heb ik van gemaakt:
code:
1
<xsl:value-of select="format-number($subtot,'0.00')"/>

Je was je $ vergeten :P

Noushka's Magnificent Dream | Unity


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
AAAAARGH! 8)7

Als je een tijdje naar zo'n XSL hebt zitten staren kom je er echt niet meer uit. Ik kreeg steeds NaN terug.... En daarom had ik vanalles en nogwat zitten klooien met die select... |:(

Zie mijn edit in de vorige post :)

Maar mag ik je hartelijk bedanken hiervoor? Als je in de buurt woont kun je een kratje bier komen halen :Y)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Dan nog even twee dingen:
W3Schools, vinden we bij Number functions: number() :P

en:

code:
1
2
3
4
5
6
7
<z:row reg_id="2" reg_omschrijving="Gemert" lev_id="2" bes_id="2"
 lev_datum="2004-05-04T00:00:00" bes_vkleverdatum="2004-05-05T00:00:00" 
lev_opmerking="" bes_opmerking="snel!" kl_id="3" kl_dcnr="5001" kl_naam="rob" 
kl_adres="" kl_postcode="" kl_plaats="" kl_telefoon="" kl_fax="" kl_gsm="" kl_email="" 
prod_code="pizb" prod_omschrijving="pizza b" pr_traceernr="lah0002" lr_aantal="1" 
prod_prijs="1.08" totaalex="1.08" btwc_percentage="6" btw="0.0648" lr_lev_id="2" 
lr_pr_id="2" pr_id="2" prod_id="2" btwc_id="2"/>

=>
code:
1
2
3
4
5
6
7
8
9
10
<z:row>
    <reg_id>2</reg_id>
    <reg_omschrijving>Gemert</reg_omschrijving>
    <lev_id>2</lev_id>
    <bes_id>2</bes_id>
    <lev_datum>2004-05-04T00:00:00</lev_datum>
    <bes_vkleverdatum>2004-05-05T00:00:00</bes_vkleverdatum>
    <lev_opmerking></lev_opmerking>
    <!-- etc... -->
</z:row>


Vind ik persoonlijk een stuk makkelijker xsl'en en lezen.

[ Voor 25% gewijzigd door Michali op 07-05-2004 12:49 ]

Noushka's Magnificent Dream | Unity


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
RobIII schreef op 07 mei 2004 @ 12:45:
[...]
Maar mag ik je hartelijk bedanken hiervoor? Als je in de buurt woont kun je een kratje bier komen halen :Y)
Woonplaats : -
ja ja... :P :Y)

Noushka's Magnificent Dream | Unity


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Gemert :)

Oh, en ik had Number wel gezien op w3schools, maar kreeg 'm daarmee ook niet werkend (achteraf bezien was het waarschijnlijk een ) of ( die ik vergeten was ofzo). Daarom gebruikte ik ook |:( , die ik eigenlijk zelden gebruik :+

* RobIII gaat zich zitten schamen in een hoekje...
Misschien kan een modje deze draad trashen zodat ik niet zo voor schut hoef te staan? :P

Oh, de complete oplossing (voor de volledigheid) is dus geworden:
code:
1
2
3
4
5
6
7
8
<xsl:if test="(number(current()/@kl_id) != number(following-sibling::z:row/@kl_id))">
    <!-- Subtotaal per klant rij -->
    <xsl:variable name="subtot"
    select="sum(/xml/rs:data/z:row[@kl_id = current()/@kl_id and @lev_datum = current()/@lev_datum]/@totaalex) +
    sum(/xml/rs:data/z:row[@kl_id = current()/@kl_id and @lev_datum = current()/@lev_datum]/@btw)"/>
    <tr><td colspan="10" class="SubTotRow" align="right">&#8364;
    <b><xsl:value-of select="format-number($subtot,'0.00')"/></b></td></tr>
</xsl:if>

[ Voor 71% gewijzigd door RobIII op 07-05-2004 13:01 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1