From: Christian Moe <mail@christianmoe.com>
To: Alin Soare <as1789@gmail.com>
Cc: emacs-orgmode@gnu.org
Subject: Re: Re: value of properties
Date: Wed, 10 Nov 2010 13:15:41 +0100 [thread overview]
Message-ID: <4CDA8CED.5050608@christianmoe.com> (raw)
In-Reply-To: <AANLkTimRY+gHnbiM59tWSRd2sMc6QgZYANT-_3KCxRaW@mail.gmail.com>
On 11/9/10 11:00 PM, Alin Soare wrote:
>
> Hi again,
>
> I write you again, perhaps this time somebody can help me solve the
> problem.
I'll take a shot at this, but others may have better solutions to
your first problem.
>
> Suppose I have a list like this
>
>
> * TODO vêtements [0/0] :total:
> :PROPERTIES:
> :total: 0
> :END:
>
> - pour week end
> - [ ] X 30
> - [X] Y 80
> - [ ] Z 100
> - [ ] W 20
> - pour les loisirs
> - [X] X 30
> - [ ] Y 80
> - [ ] Z 10
> - pour la maison:
> - [ ] pantoufle 25
>
> I want to add all values of the fields that are crossed and keep the
> sum into the value of the property 'total'. Is it possible to do it
> using org mode ? I looked over many documents, but not found.
I think the short answer is no -- Org mode does not know to extract
numbers from list items. By far the easiest way to get calculations
like this done is to put the data in a table.
Otherwise you'd need to write your own function for it. You could use
Org functions to advance from one list item to another, and
org-entry-put to put the result in the :total: property, but the rest
I think you'd have to do from scratch. I'm not going to do that.
Now, if your list looked like this instead (admittedly an unnatural
way to do it):
* TODO vêtements
:PROPERTIES:
:total: 110
:END:
** pour week end [1/4]
*** TODO 30 :X:
*** DONE 80 :Y:
*** TODO 100 :Z:
*** TODO 20 :W:
** pour les loisirs [1/3]
*** DONE 30 :X:
*** TODO 80 :Y:
*** TODO 10 :Z:
** pour la maison [0/1]
*** TODO 25 :pantoufle:
... you could draw on Org functionality to e.g. write a function like
this:
(defun my-org-get-total-done ()
"Sets the `total' property of the heading at point to the sum of
the figures in the subheadings marked DONE. Warning: The text of each
heading must be a number."
(interactive)
(let (entries total)
(setq entries
(org-map-entries '(string-to-number (nth 4
(org-heading-components)))
"/+DONE"
'tree))
(setq total
(format "%s" (reduce '+ entries)))
(org-entry-put nil "total" total)))
You'd want to improve on it, by
- adding error handling (what if there's a heading that does not
contain just a number?);
- giving the user a choice of keywords to match -- e.g., sometimes you
might want a total only for the `X' garments, so you'd want to pass
`X/+DONE' to org-map-entries;
- making updates automatic not manual (using
org-checkbox-statistics-hook?)
> Other problem, suppose I have this table inside the same file.
>
>
>
> | | quoi | prix |
> |---+-------+---------|
> | | X | 500 |
> | | Y | 700 |
> | | Z | 100 |
> | | W | 100 |
> | | T | 100 |
> |---+-------+---------|
> | # | Total | 1500 |
> | ^ | | montant |
> #+TBLFM: $montant='(+ @I..@II);N
>
> I wish to sum the value of the variable $montant with the value of the
> property 'total' from the other part (from the list), and use the
> result in other computations.
This is comparatively easy...
Give the table a TBLNAME, e.g. `prices':
#+TBLNAME: prices
| | quoi | prix |
|---+-------+---------|
| | X | 500 |
...etc.
Then you can use the ordinary remote reference syntax, see
info:org:References.
Give the entry an ID property, e.g. `clothes':
* TODO vêtements
:ID: clothes
:total: 110
:END:
You'll need some Lisp to reference it, see formula below.
| What | How much |
|-------------------------+----------|
| Total from last table | 1500 |
| Value of total property | 110 |
|-------------------------+----------|
| Sum | 1610 |
#+TBLFM: @2$2=remote(prices, $montant)::@3$2='(org-entry-get
(org-find-entry-with-id "clothes") "total")::@4$2=vsum(@I..@II)
Yours,
Christian
> Are these things possible using org mode ?
> I looked today over some examples of babel language, but I did not
> find what I need.
>
>
>
> Thanks in advance for any help.
>
>
> Alin Soare.
>
>
>
>
> 2010/11/7 Alin Soare <as1789@gmail.com <mailto:as1789@gmail.com>>
>
> Hi,
>
> I have been using org mode for a few days and I am impressed.
>
> I have followed a few tutorials and videos, however I want to
> solve a problem and I did not find how can I do it.
>
> I have 2 tables , and every such table has a variable $sum, that
> is the sum of a column. Because I am lisp engineer, I used the
> formula '(+ @I..@II);N to compute it, I prefer lisp to calc.
>
> My problems are
>
> 1: to export the value of the $sum from one table, and make global
> computations using it
> 2: to compute the value of some property in function of such
> variables, defined inside tables.
>
> Afterwards, can I compute the value of a property in function of
> the value of other properties ?
>
> Probably my question is stupid, I do not know, because I did not
> understand yet the principles of properties of org mode.
>
>
>
>
>
> _______________________________________________
> Emacs-orgmode mailing list
> Please use `Reply All' to send replies to the list.
> Emacs-orgmode@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
--
Christian Moe
E-mail: mail@christianmoe.com
Website: http://christianmoe.com
next prev parent reply other threads:[~2010-11-10 12:14 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-07 9:05 value of properties Alin Soare
2010-11-09 22:00 ` Alin Soare
2010-11-10 12:15 ` Christian Moe [this message]
2010-11-11 13:10 ` Christian Moe
2010-11-11 13:20 ` Alin Soare
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=4CDA8CED.5050608@christianmoe.com \
--to=mail@christianmoe.com \
--cc=as1789@gmail.com \
--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).