emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
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

  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).