[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Orgmode] Re: value of properties
From: |
Christian Moe |
Subject: |
Re: [Orgmode] Re: value of properties |
Date: |
Wed, 10 Nov 2010 13:15:41 +0100 |
User-agent: |
Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 |
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='(+ @address@hidden);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(@address@hidden)
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 <address@hidden <mailto:address@hidden>>
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 '(+ @address@hidden);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.
address@hidden
http://lists.gnu.org/mailman/listinfo/emacs-orgmode
--
Christian Moe
E-mail: address@hidden
Website: http://christianmoe.com