emacs-orgmode
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]