PDF-Listendruck mit XQuery 3.0

PDF-Listendruck mit XQuery 3.0

PDF-Listendruck mit XQuery 3.0

➪ Die FO-Generierung von PDF-Dokumenten ist auch mit XQuery 3.0 problemlos möglich.

Das Beispiel bietet


xquery version '3.0';
declare namespace wg="http://www.wilfried-grupe.de/xquery/functions";
declare function wg:format-decimal ($a as xs:decimal) as xs:string
{                  
    let   
    $ar as xs:string  := format-number($a, '#,##0.00'),
    $ar1 as xs:string := replace($ar, ',', '#'),
    $ar2 as xs:string := replace($ar1, '\.', ','),
    $ar3 as xs:string := replace($ar2, '#', '.')
    return concat($ar3, ' Euro')
};
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <fo:layout-master-set>
  <fo:simple-page-master 
     margin-right="15mm" 
     margin-left="2cm" 
     margin-bottom="9mm" 
     margin-top="19mm" 
     page-width="297mm" 
     page-height="210mm" 
     master-name="DINA4Quer">
   <fo:region-body />
  </fo:simple-page-master>
 </fo:layout-master-set>
 {
 for $o in /Orte/Ort return
 <fo:page-sequence master-reference="DINA4Quer">
  <fo:flow flow-name="xsl-region-body">
   <fo:block background-color="lightgrey">{$o/name/text()}</fo:block>   
   {
   for $m in $o/Mensch 
   let $ausg := xs:decimal(sum($m/Kauf/Gesamt/text()))
   let $diff := xs:decimal($m/Gehalt/text() - $ausg)
   order by ($diff) ascending
   return
   <fo:block>
      <fo:block 
          margin-left="1cm" 
          space-before="3mm" 
          space-after="1mm">      
      {concat(
            $m/vorname/text(), ' ',  
            $m/name/text(), ' verdient ', 
            wg:format-decimal($m/Gehalt/text()),
            ' Ausgaben: ',
            wg:format-decimal($ausg)),
            ' Differenz: '}
         <fo:inline color="{ if ($diff < 0) 
                             then ('red') 
                             else ('blue') }">{
         wg:format-decimal($diff)}</fo:inline>
        </fo:block>
      <fo:table margin-left="3cm">
            <fo:table-body>
            <fo:table-row background-color="lightgrey">
                <fo:table-cell>
                    <fo:block>Ware</fo:block>
                </fo:table-cell>
                <fo:table-cell>
                    <fo:block>Menge</fo:block>
                </fo:table-cell>
                <fo:table-cell>
                    <fo:block text-align="right">Einzelpreis</fo:block>
                </fo:table-cell>
                <fo:table-cell>
                    <fo:block text-align="right">Umsatz</fo:block>
                </fo:table-cell>
            </fo:table-row>
            {
            for $k in $m/Kauf
            let $art := $k/bez/text()
            group by $art 
            return
            <fo:table-row>
                <fo:table-cell>
                    <fo:block>{$art}</fo:block>
                </fo:table-cell>                        
                <fo:table-cell>
                    <fo:block>{sum(
                    for $kk in  $k where $k/bez/text() = $art 
                    return $kk/anzahl/text()
                    )}</fo:block>
                </fo:table-cell>
                <fo:table-cell>
                    <fo:block text-align="right">{
                    wg:format-decimal(
                    for $kk at $p in  $k 
                    where $k/bez/text() = $art 
                    and $p=1 return $kk/preis/text())}</fo:block>
                </fo:table-cell>                    
                <fo:table-cell>
                    <fo:block text-align="right">{
                    wg:format-decimal(xs:decimal(sum(
                         for $kk in $k 
                         where $k/bez/text() = $art 
                         return $kk/Gesamt/text())))}</fo:block>
                </fo:table-cell>   
            </fo:table-row>
            }
            </fo:table-body>
        </fo:table>           
      </fo:block>           
   }
  </fo:flow>
 </fo:page-sequence>
 }
</fo:root>

Das Resultat ist (nach zusätzlichem Start eines FO-Prozessors) ein PDF-Dokument, das so aussieht (Ausschnitt):

pic/listendruck.png

wg / 15. September 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.




CSV



Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XQuery19.html