From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christian Moe Subject: Re: Re: value of properties Date: Wed, 10 Nov 2010 13:15:41 +0100 Message-ID: <4CDA8CED.5050608@christianmoe.com> References: Reply-To: mail@christianmoe.com Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Return-path: Received: from [140.186.70.92] (port=52491 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PG9ZB-0003Li-9c for emacs-orgmode@gnu.org; Wed, 10 Nov 2010 07:14:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PG9ZA-0007Ct-6w for emacs-orgmode@gnu.org; Wed, 10 Nov 2010 07:14:17 -0500 Received: from mars.hitrost.net ([91.185.193.39]:40487) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PG9Z9-00075P-RO for emacs-orgmode@gnu.org; Wed, 10 Nov 2010 07:14:16 -0500 In-Reply-To: List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Alin Soare Cc: emacs-orgmode@gnu.org 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 > > > 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