emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Nick <oinksocket@letterboxes.org>
To: emacs-orgmode@gnu.org
Subject: Re: spreadsheet table limitations, specifically summing hours?
Date: Fri, 14 May 2010 15:49:33 +0100	[thread overview]
Message-ID: <4BED62FD.1010502@letterboxes.org> (raw)
In-Reply-To: <4BED25AD.3080203@letterboxes.org>

Earlier I wrote:
> There seem to be two problems;
> 
>  c) Summing HH:MM values (which org-table-sum seems to manage - although oddly
>     without including the minutes - but not vsum)

Excuse me answering my own question,  but time is money, and so I've hastily
written my own elisp functions to do this (appended).  Perhaps this will help
someone else.

Given these functions defined in a .emacs config or similar, I can do:




|   | week ending | hh:mm  | Total H | Total |    VAT | Total+VAT |
| ! | week        | hhmm   |   hours | total |    vat |           |
|---+-------------+--------+---------+-------+--------+-----------|
|   | 28/02/10    | 20:11h |         |       |        |           |
|   | 07/03/10    | 21:11h |         |       |        |           |
|   | 14/03/10    | 25:40h |         |       |        |           |
|   | 21/03/10    | 27:16h |         |       |        |           |
|---+-------------+--------+---------+-------+--------+-----------|
| # | 22/03/10    | 94:18h |      94 |  2820 | 493.50 |   3313.50 |
|---+-------------+--------+---------+-------+--------+-----------|
|   | 28/03/10    | 26:24h |         |       |        |           |
|   | 04/04/10    | 21:15h |         |       |        |           |
|   | 11/04/10    | 23:15h |         |       |        |           |
|---+-------------+--------+---------+-------+--------+-----------|
| # | 27/02/10    | 70:54h |      71 |  2130 | 372.75 |   2502.75 |
|---+-------------+--------+---------+-------+--------+-----------|
#+TBLFM: $3='(reduce 'my-sum-hhmm '(@-I..@-II))::$4='(round (my-hhmm-to-hours
$hhmm))::$5=$hours*$hourlyrate::$6=$total*$vatrate;%.2f::$7=$total+$vat;%.2f
#+CONSTANTS: vatrate=0.175 hourlyrate=35


Although I'd still be interested if someone can show me a better way.

Cheers,

N

ps I wonder if a long set of formulae like this could be split over several
+TBLFM lines?  The answer seems to be no.

----
;; Parse an HH::MM date into a list containing a pair of numbers, (HH MM)
(defun my-parse-hhmm (hhmm)
  (let ((date-re "\\([0-9]+\\):\\([0-9]+\\)h?")
	hours
	minutes)
    (unless (string-match date-re hhmm)
      (error "Argument is not a valid date: '%s'" hhmm))
    (setq hours (string-to-number (match-string 1 hhmm))
	  minutes (string-to-number (match-string 2 hhmm)))
    (list hours minutes)))

;; Convert a HH:MM date to a (possibly fractional) number of hours
(defun my-hhmm-to-hours (hhmm)
  (let* ((date (my-parse-hhmm hhmm))
	(hours (first date))
	(minutes (second date)))
    (+ (float hours) (/ (float minutes) 60.0))))

	
;; Date summing
;; This can be used in a table formula like this:
;; #+TBLFM: $3='(reduce 'my-sum-dates '(@-I..@-II))
(defun my-sum-hhmm (a b)
  (let* (;; parse a
	 (a-date (my-parse-hhmm a))
	 (a-hours (first a-date))
	 (a-minutes (second a-date))
	
	 ;; parse b
	 (b-date (my-parse-hhmm b))
	 (b-hours (first b-date))
	 (b-minutes (second b-date))
	
	 ;; add the parts together
	 (minutes (+ a-minutes b-minutes))
	 (hours (+ a-hours b-hours))
	 (carry (floor (/ minutes 60)))
	 (remainder (mod minutes 60)))
    (format "%d:%02dh" (+ hours carry) remainder)))

  parent reply	other threads:[~2010-05-14 14:49 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-14 10:27 spreadsheet table limitations, specifically summing hours? Nick
2010-05-14 14:44 ` Nick Stokoe
2010-05-15 14:27   ` Carsten Dominik
2010-05-14 14:49 ` Nick [this message]
2010-05-14 21:59   ` Stephan Schmitt
2010-05-14 23:40     ` Nick
2010-05-15  6:24     ` Carsten Dominik
2010-05-15  6:31   ` Carsten Dominik
2010-05-17 13:34     ` oinksocket
2010-05-17 19:29       ` Štěpán Němec

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4BED62FD.1010502@letterboxes.org \
    --to=oinksocket@letterboxes.org \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).