utilizzo del pacchetto datatool

  • Creatore
    Topic
  • #50108
    Up
    0
    Down
    ::


    Salve,
    utilizzo (fino a ieri con molta soddisfazione) il pacchetto “datatool” per redigere delle note spesa di rimborso all’azienda per cui lavoro.
    Ho preparato un file .tex per creare le note spesa in automatico a partire da un file CSV.
    L’ultima volta che ho utilizzato questo codice:
    `
    \documentclass[a4paper,11pt,pdftex]{article}
    \usepackage[italian]{babel}
    \usepackage[latin1]{inputenc}
    \usepackage{eurosym}
    \usepackage{helvet}
    \usepackage{ifpdf}
    \usepackage{datatool}
    \usepackage{xcolor}
    \usepackage{colortbl}
    \usepackage{multicol}
    \usepackage{rccol}
    \newcolumntype{e}[1]{R[.][,]{#1}}
    \usepackage{boldline}
    \usepackage{booktabs}
    \pagestyle{empty}

    \addtolength\textwidth{2cm}
    \setlength\hoffset{-0.5cm}
    \addtolength\textheight{2cm}
    \setlength\topmargin{0cm}
    \setlength\marginparwidth{0cm}
    \setlength\oddsidemargin{0cm}

    \newcommand{\databasefilename}{nj.csv}
    \newcommand{\customer}{cliente Blah Blah S.p.A.}
    \ifpdf
    \usepackage[pdftex]{graphicx}
    \pdfpagewidth=\paperwidth
    \pdfpageheight=\paperheight
    \pdfinfo{
    /Author (Io)
    /Title (Nota spese \customer)
    /CreationDate (D:20100906120000)
    /Subject (Nota spese)
    /Keywords (fisco;tasse;rimborso;fattura)
    }
    \else
    \usepackage[dvips]{graphicx}
    \fi
    \usepackage{pdfpages}
    \begin{document}
    \usefont{OT1}{phv}{m}{n}\selectfont
    \renewcommand{\familydefault}{\sfdefault}

    \vspace*{-3.0cm}

    Nota spese per missione per conto BLAH s.r.l. c/o \customer.

    \vspace{0.5cm}
    \DTLsetseparator{,}
    \DTLloaddb[noheader,keys={Data,Nome,Missione,Descrizione,Importo},%
    headers={Data,,,Descrizione,Importo}]{dati}{\databasefilename}
    %\renewcommand{\dtldisplayafterhead}{\toprule}
    %\DTLdisplaydb{dati}
    \def\tautost{0}
    \def\tvitto{0}
    \def\talloggio{0}
    \def\tcarbu{0}
    \def\tautopers{0}
    \def\taltro{0}
    \def\ttaxi{0}
    \def\tmater{0}
    \def\grandtotal{0}

    \begin{center}
    \begin{tabular}{p{0.15\textwidth}p{0.35\textwidth}e{4}{2}}
    \toprule
    %\rowcolor[gray]{0.8}
    Data & Descrizione & \multicolumn{1}{r}{Importo (\euro)} \\
    \midrule
    \DTLforeach{dati}{\Data=Data,\Descrizione=Descrizione,\Importo=Importo}%
    %{\Data & \Descrizione & \textsf{\Importo} \\} \\
    {\Data & \Descrizione & \Importo \\} \\
    \bottomrule

    \end{tabular}
    \end{center}

    \DTLforeach[\DTLisieq{\Descrizione}{autostrada}]{dati}{%
    \Data=Data,\Descrizione=Descrizione,\Importo=Importo}{%
    \DTLgadd{\tautost}{\Importo}{\tautost}}

    \DTLforeach[\DTLisieq{\Descrizione}{vitto}]{dati}{%
    \Data=Data,\Descrizione=Descrizione,\Importo=Importo}{%
    \DTLgadd{\tvitto}{\Importo}{\tvitto}}

    \DTLforeach[\DTLisieq{\Descrizione}{alloggio}]{dati}{%
    \Data=Data,\Descrizione=Descrizione,\Importo=Importo}{%
    \DTLgadd{\talloggio}{\Importo}{\talloggio}}

    \DTLforeach[\DTLisieq{\Descrizione}{auto personale}]{dati}{%
    \Data=Data,\Descrizione=Descrizione,\Importo=Importo}{%
    \DTLgadd{\tautopers}{\Importo}{\tautopers}}

    \DTLforeach[\DTLisieq{\Descrizione}{carburante}]{dati}{%
    \Data=Data,\Descrizione=Descrizione,\Importo=Importo}{%
    \DTLgadd{\tcarbu}{\Importo}{\tcarbu}}

    \DTLforeach[\DTLisieq{\Descrizione}{taxi}]{dati}{%
    \Data=Data,\Descrizione=Descrizione,\Importo=Importo}{%
    \DTLgadd{\ttaxi}{\Importo}{\ttaxi}}

    \DTLforeach[\DTLisieq{\Descrizione}{materiali}]{dati}{%
    \Data=Data,\Descrizione=Descrizione,\Importo=Importo}{%
    \DTLgadd{\tmater}{\Importo}{\tmater}}

    \DTLforeach[\DTLisieq{\Descrizione}{altro}]{dati}{%
    \Data=Data,\Descrizione=Descrizione,\Importo=Importo}{%
    \DTLgadd{\taltro}{\Importo}{\taltro}}

    \DTLgaddall{\grandtotal}{\tvitto,\talloggio,\tautost,\tautopers,\tcarbu,\ttaxi,\tmater,\taltro}

    \vspace{0.5cm}

    \begin{center}
    \begin{tabular}{p{0.4\textwidth}r}
    \toprule
    \rowcolor[gray]{0.8}
    Tipo spesa & Importo totale (\euro) \\
    \midrule
    Vitto & {\tvitto} \\
    Alloggio & {\talloggio} \\
    Pedaggi stradali & {\tautost} \\
    Rimborso kilometrico & {\tautopers} \\
    Carburante & {\tcarbu} \\
    Taxi & {\ttaxi} \\
    Materiali & {\tmater} \\
    Altro & {\taltro} \\
    \midrule
    {\bfseries Totale} & {\bfseries\grandtotal} \\
    \bottomrule
    \end{tabular}
    \end{center}
    \end{document}
    `

    con questo file CSV chiamato “nj.csv”:
    `
    2010/09/04,pincopallo,”blablabla”,TAXI,93.21
    2010/09/03,pincopallo,”blablabla”,TAXI,18.53
    2010/09/03,pincopallo,”blablabla”,VITTO,9.70
    2010/09/03,pincopallo,”blablabla”,TAXI,10.20
    2010/08/24,pincopallo,”blablabla”,TAXI,26.10
    2010/08/30,pincopallo,”blablabla”,TAXI,22.09
    2010/08/24,pincopallo,”blablabla”,ALTRO,65.89
    2010/08/24,pincopallo,”blablabla”,TAXI,13.18
    2010/08/23,pincopallo,”blablabla”,TAXI,25.00
    2010/09/04,pincopallo,”blablabla”,VITTO,9.60
    2010/09/04,pincopallo,”blablabla”,VITTO,1.70
    2010/08/23,pincopallo,”blablabla”,TAXI,74.67
    2010/08/24,pincopallo,”blablabla”,VITTO,6.40
    2010/08/30,pincopallo,”blablabla”,VITTO,55.10
    2010/08/23,pincopallo,”blablabla”,VITTO,45.06
    2010/09/03,pincopallo,”blablabla”,VITTO,44.21
    2010/08/23,pincopallo,”blablabla”,VITTO,2.60
    2010/08/23,pincopallo,”blablabla”,VITTO,27.86
    2010/08/23,pincopallo,”blablabla”,TAXI,40.30
    2010/08/23,pincopallo,”blablabla”,ALTRO,1113.03
    2010/09/03,pincopallo,”blablabla”,ALTRO,1225.95
    2010/09/03,pincopallo,”blablabla”,ALTRO,66.13
    2010/08/31,pincopallo,”blablabla”,VITTO,22.29
    2010/08/31,pincopallo,”blablabla”,TAXI,24.81
    2010/09/04,pincopallo,”blablabla”,TAXI,21.50
    2010/08/31,pincopallo,”blablabla”,ALLOGGIO,209.09
    2010/09/04,pincopallo,”blablabla”,ALLOGGIO,162.48
    2010/09/03,pincopallo,”blablabla”,ALLOGGIO,155.56
    2010/09/04,pincopallo,”blablabla”,ALTRO,11.10
    2010/08/24,pincopallo,”blablabla”,ALLOGGIO,136.8
    `
    ho riscontrato un comportamento tutt’ora per me inspiegabile. Infatti, basta cambiare il numero dell’ultima riga ultima colonna nel file (136.8) in 16.8 o in 100.8 per veder scomparire l’errore di compilazione che pdflatex ravvisa con il file CSV originale.
    Qualcuno mi sa spiegare il motivo?
    Grazie a chi ci volesse perdere un po’ di tempo (e a chi ne ha già perso leggendo questo post).

    Gianluca

Visualizzazione 3 filoni di risposte
  • Autore
    Risposte
    • #50109
      Up
      0
      Down
      ::

      Salve,
      utilizzo (fino a ieri con molta soddisfazione) il pacchetto “datatool” per redigere delle note spesa di rimborso all’azienda per cui lavoro.
      Ho preparato un file .tex per creare le note spesa in automatico a partire da un file CSV.
      L’ultima volta che ho utilizzato questo codice:
      `
      \documentclass[a4paper,11pt,pdftex]{article}
      …`
      con questo file CSV chiamato “nj.csv”:
      `2010/09/04,pincopallo,”blablabla”,TAXI,93.21

      2010/08/24,pincopallo,”blablabla”,ALLOGGIO,136.8
      `
      ho riscontrato un comportamento tutt’ora per me inspiegabile. Infatti, basta cambiare il numero dell’ultima riga ultima colonna nel file (136.8) in 16.8 o in 100.8 per veder scomparire l’errore di compilazione che pdflatex ravvisa con il file CSV originale.
      Qualcuno mi sa spiegare il motivo?
      Grazie a chi ci volesse perdere un po’ di tempo (e a chi ne ha già perso leggendo questo post).

      Curioso: ti impone di spendere meno di 660 € di alloggio. Infatti mettendo 132.86 non viene fuori l’errore, ma con 132.87 sì (il totale con 132.86 è 659.99 €). Se aggiungo un centesimo alla voce precedente torna l’errore.

      Accontentati di 659.99 €. :D. Sinceramente non so, forse robitex ha qualche idea.

      Ciao
      Enrico

    • #50110
      admin
      Amministratore del forum
        Up
        0
        Down
        ::


        Diventa ancora più curioso se invece di una scrivi due o più volte l’ultima riga:`2010/09/04,pincopallo,”blablabla”,TAXI,93.21
        2010/09/03,pincopallo,”blablabla”,TAXI,18.53
        2010/09/03,pincopallo,”blablabla”,VITTO,9.70
        2010/09/03,pincopallo,”blablabla”,TAXI,10.20
        2010/08/24,pincopallo,”blablabla”,TAXI,26.10
        2010/08/30,pincopallo,”blablabla”,TAXI,22.09
        2010/08/24,pincopallo,”blablabla”,ALTRO,65.89
        2010/08/24,pincopallo,”blablabla”,TAXI,13.18
        2010/08/23,pincopallo,”blablabla”,TAXI,25.00
        2010/09/04,pincopallo,”blablabla”,VITTO,9.60
        2010/09/04,pincopallo,”blablabla”,VITTO,1.70
        2010/08/23,pincopallo,”blablabla”,TAXI,74.67
        2010/08/24,pincopallo,”blablabla”,VITTO,6.40
        2010/08/30,pincopallo,”blablabla”,VITTO,55.10
        2010/08/23,pincopallo,”blablabla”,VITTO,45.06
        2010/09/03,pincopallo,”blablabla”,VITTO,44.21
        2010/08/23,pincopallo,”blablabla”,VITTO,2.60
        2010/08/23,pincopallo,”blablabla”,VITTO,27.86
        2010/08/23,pincopallo,”blablabla”,TAXI,40.30
        2010/08/23,pincopallo,”blablabla”,ALTRO,1113.03
        2010/09/03,pincopallo,”blablabla”,ALTRO,1225.95
        2010/09/03,pincopallo,”blablabla”,ALTRO,66.13
        2010/08/31,pincopallo,”blablabla”,VITTO,22.29
        2010/08/31,pincopallo,”blablabla”,TAXI,24.81
        2010/09/04,pincopallo,”blablabla”,TAXI,21.50
        2010/08/31,pincopallo,”blablabla”,ALLOGGIO,209.09
        2010/09/04,pincopallo,”blablabla”,ALLOGGIO,162.48
        2010/09/03,pincopallo,”blablabla”,ALLOGGIO,155.56
        2010/09/04,pincopallo,”blablabla”,ALTRO,11.10
        2010/08/24,pincopallo,”blablabla”,ALLOGGIO,136.80
        2010/08/24,pincopallo,”blablabla”,ALLOGGIO,136.80
        2010/08/24,pincopallo,”blablabla”,ALLOGGIO,136.80
        2010/08/24,pincopallo,”blablabla”,ALLOGGIO,136.80`
        Così funziona 😯 .

        Ciao,
        ansys.

      • #50111
        Up
        0
        Down
        ::


        Interessante questo pacchetto proprio l’altro giorno pensavo che sarebbe utile avere delle funzioni simili.

      • #50112
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::


          Ciao,
          per il caso in esame esiste non uno, ma una serie di intervalli tabù per il totale di una voce: basta che la somma abbia due cifre uguali iniziali ed il numero sia di due o tre cifre significative.

          Per esempio otterremo errore se il totale vale 550.23. Verifichiamolo:
          Aggiungiamo la seguente riga al file nj.csv e compiliamo (carburante vale zero nel file quindi 550.23 diventa il totale):
          `2010/08/23,pincopallo,”blablabla”,CARBURANTE,550.23`

          Cifre tabù sono anche:
          `55
          77
          770.56`
          ma non:
          `3
          3300
          `

          Inoltre, se anche il totale è un valore tabù, l’errore non si presenta se control sequence che lo rappresenta è data come prima valore della lista al comando \DTLgaddall.
          Per verificarlo basta mettere nella lista in prima posizione \tcarb anziché \tvitto.

          `\DTLgaddall{\grandtotal}{\tcarbu,\tvitto,\talloggio,\tautost,\tautopers,\ttaxi,\tmater,\taltro}`

          D’altra parte, il file nj.csv così com’era presentava già un valore tabù per la voce Vitto, ma essendo la prima della lista andava tutto liscio.

          Sembra quindi un bug del pacchetto datatool, probabilmente per qualche tipo di parsing che finisce non bene.
          Non rimane quindi che segnalare la cosa all’autrice del pacchetto Nicola Talbot.

          L’errore ha queste ulteriori caratteristiche:
          * Non dipende da una voce particolare, ma riguarda tutte le voci tranne la prima della lista. Sufficiente è (a volte parlo come Ioda) che il totale sia negli intervalli incriminati.
          * Non dipende dal numero di voci che compongono la somma finale (basta una sola voce come abbiamo visto per quella del carburante).
          * Risiede nel comando \DTLgaddall (basta commentarlo e l’errore sparisce).

          ***
          Il report che chiede il nostro amico mi ha immediatamente ricordato il pacchetto calctab.
          Paradossalmente evitai all’epoca di implementare gli ambienti con datatool. Lo segnalai nell’articolo per ArsTeXnica per il GuITmeeting 2008 ed il mio anonimo revisore (che ringrazio naturalmente), mi fece notare che nella bozza non ne avevo spiegato i motivi.
          Proprio una bellissima avventura quella di calctab.

          Tornando al problema, anche calctab potrebbe produrre un report simile a quello richiesto, tuttavia il suo sviluppo è sospeso alla versione 0.6.1, perché è per me ancora troppo difficile implementare le estensioni del linguaggio per le mie conoscenze di TeX, anche se sono molto migliorate ormai e potrei già revisionare il codice (diventatopraticamente illeggibile).

          Già, perché l’idea è quella di rendere disponibile un linguaggio per la creazione di report tabellari qualsiasi, assemblando al volo colonne di diversi tipi, mentre oggi sono disponibili sono due tabelle report dalla struttura fissa (calctab e xcalctab).
          Staremo a vedere.
          Saluti.

          A dimenticavo: date un occhiata anche al pacchetto di cui non ricordo il nome ma solo quello dell’autore: Christian Tellechea già autore del pacchetto xstring. Si tratta di una specie di foglio di calcolo.

      Visualizzazione 3 filoni di risposte
      • Devi essere connesso per rispondere a questo topic.

      Go to top