I have the following table: |---+------------+---------+---------+--------+--------+-------+-------------------+----------+--------| | | datum | kmstand | prijs/l | liters | dagen | prijs | km's | prijs/km | km/l | |---+------------+---------+---------+--------+--------+-------+-------------------+----------+--------| | # | | 155111 | | | | | | | | | # | 2007-07-09 | 156146 | 102.2 | 62.25 | #ERROR | 63.62 | 1035 | 6.147 | 16.627 | | # | 2007-09-11 | 6953 | 97.8 | 47.75 | #ERROR | 46.70 | Verkeerde kmstand | | | | # | | | | | #ERROR | | | | | |---+------------+---------+---------+--------+--------+-------+-------------------+----------+--------| #+TBLFM: $6='(if (and (not (check-if-after-hline)) (nz @-1$2) (nz $2)) (- (time-to-days (org-read-date t t "$2")) (time-to-days (org-read-date t t "@-1$2"))) "");S::$7='(if (and (nz $4) (nz $5)) (format "%.2f" (/ (* $4 $5) 100)) "");N::$8='(if (and (nz @-1$3) (nz $3)) (if (> $3 @-1$3) (- $3 @-1$3) (if (not (check-if-after-hline)) "Verkeerde kmstand" "")) "");N::$9='(if (and (nz $8) (nz $7)) (format "%.3f" (/ (* $7 100) $8)) "");N::$10='(if (and (nz $8) (nz $5)) (format "%.3f" (/ $8 $5)) "");N With debug I get: Substitution history of formula Orig: '(if (and (not (check-if-after-hline)) (nz @-1$2) (nz $2)) (- (time-to-days (org-read-date t t "$2")) (time-to-days (org-read-date t t "@-1$2"))) "");S $xyz-> '(if (and (not (check-if-after-hline)) (nz @-1$2) (nz $2)) (- (time-to-days (org-read-date t t "$2")) (time-to-days (org-read-date t t "@-1$2"))) "") @r$c-> '(if (and (not (check-if-after-hline)) (nz #(" " 0 12 (lazy-lock t face org-table hilit-chg hilit-chg))) (nz $2)) (- (time-to-days (org-read-date t t "$2")) (time-to-days (org-read-date t t "#(" " 0 12 (lazy-lock t face org-table hilit-chg hilit-chg))"))) "") $1-> '(if (and (not (check-if-after-hline)) (nz #(" " 0 12 (lazy-lock t face org-table hilit-chg hilit-chg))) (nz #("2007-07-09" 0 3 (hilit-chg hilit-chg lazy-lock t) 3 5 (hilit-chg hilit-chg lazy-lock t) 5 6 (hilit-chg hilit-chg lazy-lock t) 6 8 (hilit-chg hilit-chg lazy-lock t) 8 9 (hilit-chg hilit-chg lazy-lock t) 9 10 (hilit-chg hilit-chg lazy-lock t)))) (- (time-to-days (org-read-date t t "#("2007-07-09" 0 3 (hilit-chg hilit-chg lazy-lock t) 3 5 (hilit-chg hilit-chg lazy-lock t) 5 6 (hilit-chg hilit-chg lazy-lock t) 6 8 (hilit-chg hilit-chg lazy-lock t) 8 9 (hilit-chg hilit-chg lazy-lock t) 9 10 (hilit-chg hilit-chg lazy-lock t))")) (time-to-days (org-read-date t t "#(" " 0 12 (lazy-lock t face org-table hilit-chg hilit-chg))"))) "") Result: #ERROR Format: NONE Final: #ERROR If I use the code after $1, I get: Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p #(" " 0 12 (lazy-lock t face org-table hilit-chg hilit-chg))) =(#(" " 0 12 (lazy-lock t face org-table hilit-chg hilit-chg)) 0) (not (= n 0)) nz(#(" " 0 12 (lazy-lock t face org-table hilit-chg hilit-chg))) (and (not (check-if-after-hline)) (nz #(" " 0 12 ...)) (nz #("2007-07-09" 0 3 ... 3 5 ... 5 6 ... 6 8 ... 8 9 ... 9 10 ...))) (if (and (not ...) (nz #(" " 0 12 ...)) (nz #("2007-07-09" 0 3 ... 3 5 ... 5 6 ... 6 8 ... 8 9 ... 9 10 ...))) (- (time-to-days ...) (time-to-days ...)) "") eval((if (and (not ...) (nz #(" " 0 12 ...)) (nz #("2007-07-09" 0 3 ... 3 5 ... 5 6 ... 6 8 ... 8 9 ... 9 10 ...))) (- (time-to-days ...) (time-to-days ...)) "")) eval-last-sexp-1(t) eval-last-sexp(t) eval-print-last-sexp() call-interactively(eval-print-last-sexp) recursive-edit() byte-code(... debug(error (wrong-type-argument number-or-marker-p #(" " 0 10 (lazy-lock t face org-table hilit-chg hilit-chg)))) =(#(" " 0 10 (lazy-lock t face org-table hilit-chg hilit-chg)) 0) (not (= n 0)) nz(#(" " 0 10 (lazy-lock t face org-table hilit-chg hilit-chg))) (and (not (check-if-after-hline)) (nz #(" " 0 10 ...)) (nz #("20070709" 0 3 ... 3 4 ... 4 5 ... 5 6 ... 6 7 ... 7 8 ...))) (if (and (not ...) (nz #(" " 0 10 ...)) (nz #("20070709" 0 3 ... 3 4 ... 4 5 ... 5 6 ... 6 7 ... 7 8 ...))) (- (time-to-days ...) (time-to-days ...)) "") eval((if (and (not ...) (nz #(" " 0 10 ...)) (nz #("20070709" 0 3 ... 3 4 ... 4 5 ... 5 6 ... 6 7 ... 7 8 ...))) (- (time-to-days ...) (time-to-days ...)) "")) eval-last-sexp-1(t) eval-last-sexp(t) eval-print-last-sexp() call-interactively(eval-print-last-sexp) recursive-edit() byte-code(... debug(error (void-variable nz)) (and (not (check-if-after-hline)) nz (#(" " 0 10 ...)) (nz #("20070709" 0 3 ... 3 4 ... 4 5 ... 5 6 ... 6 7 ... 7 8 ...))) (if (and (not ...) nz (#(" " 0 10 ...)) (nz #("20070709" 0 3 ... 3 4 ... 4 5 ... 5 6 ... 6 7 ... 7 8 ...))) (- (time-to-days ...) (time-to-days ...)) "") eval((if (and (not ...) nz (#(" " 0 10 ...)) (nz #("20070709" 0 3 ... 3 4 ... 4 5 ... 5 6 ... 6 7 ... 7 8 ...))) (- (time-to-days ...) (time-to-days ...)) "")) eval-last-sexp-1(t) eval-last-sexp(t) eval-print-last-sexp() call-interactively(eval-print-last-sexp) recursive-edit() byte-code(... debug(error (void-variable nz)) (and (not (check-if-after-hline)) nz (#(" " 0 10 ...)) (nz #("20070709" 0 3 ... 3 4 ... 4 5 ... 5 6 ... 6 7 ... 7 8 ...))) (if (and (not ...) nz (#(" " 0 10 ...)) (nz #("20070709" 0 3 ... 3 4 ... 4 5 ... 5 6 ... 6 7 ... 7 8 ...))) (- (time-to-days ...) (time-to-days ...)) "") eval((if (and (not ...) nz (#(" " 0 10 ...)) (nz #("20070709" 0 3 ... 3 4 ... 4 5 ... 5 6 ... 6 7 ... 7 8 ...))) (- (time-to-days ...) (time-to-days ...)) "")) eval-last-sexp-1(t) eval-last-sexp(t) eval-print-last-sexp() call-interactively(eval-print-last-sexp) recursive-edit() byte-code(... debug(error (wrong-type-argument integerp nil)) decode-time((nil nil nil 9 7 2007 nil nil nil)) time-to-day-in-year((nil nil nil 9 7 2007 nil nil nil)) eval((time-to-day-in-year (parse-time-string "2007-07-09"))) eval-last-sexp-1(t) eval-last-sexp(t) eval-print-last-sexp() call-interactively(eval-print-last-sexp) recursive-edit() byte-code(... debug(error (void-function parse_time_string)) (parse_time_string "2007-07-09") eval((parse_time_string "2007-07-09")) eval-last-sexp-1(t) eval-last-sexp(t) eval-print-last-sexp() call-interactively(eval-print-last-sexp) Where there stands 'byte-code(...', there was some byte-code which I could not copy for one reason or another. nz is a function which checks if a field is empty (or zero). And this does not give a problem in the other columns. So what am I doing wrong? To be sure, here is the code of nz: ;;; notZero (defun nz (n) (interactive "nValue: ") (not (= n 0.)) ) -- Cecil Westerhof <CecilWesterhof@xs4all.nl>
Op do, 12-07-2007 te 08:07 +0200, schreef Cecil Westerhof:
> I have the following table:
> |---+------------+---------+---------+--------+--------+-------+-------------------+----------+--------|
> | | datum | kmstand | prijs/l | liters | dagen | prijs | km's | prijs/km | km/l |
> |---+------------+---------+---------+--------+--------+-------+-------------------+----------+--------|
> | # | | 155111 | | | | | | | |
> | # | 2007-07-09 | 156146 | 102.2 | 62.25 | #ERROR | 63.62 | 1035 | 6.147 | 16.627 |
> | # | 2007-09-11 | 6953 | 97.8 | 47.75 | #ERROR | 46.70 | Verkeerde kmstand | | |
> | # | | | | | #ERROR | | | | |
> |---+------------+---------+---------+--------+--------+-------+-------------------+----------+--------|
> #+TBLFM: $6='(if (and (not (check-if-after-hline)) (nz @-1$2) (nz $2)) (- (time-to-days (org-read-date t t "$2")) (time-to-days (org-read-date t t "@-1$2"))) "");S::$7='(if (and (nz $4) (nz $5)) (format "%.2f" (/ (* $4 $5) 100)) "");N::$8='(if (and (nz @-1$3) (nz $3)) (if (> $3 @-1$3) (- $3 @-1$3) (if (not (check-if-after-hline)) "Verkeerde kmstand" "")) "");N::$9='(if (and (nz $8) (nz $7)) (format "%.3f" (/ (* $7 100) $8)) "");N::$10='(if (and (nz $8) (nz $5)) (format "%.3f" (/ $8 $5)) "");N
I should not use 'nz', but 'not' and 'equal'. This gives:
|---+------------+---------+---------+--------+-------+-------+-------------------+----------+--------|
| | datum | kmstand | prijs/l | liters | dagen | prijs | km's | prijs/km | km/l |
|---+------------+---------+---------+--------+-------+-------+-------------------+----------+--------|
| # | | 155111 | | | | | | | |
| # | 2007-07-09 | 156146 | 102.2 | 62.25 | -3 | 63.62 | 1035 | 6.147 | 16.627 |
| # | 2007-09-11 | 6953 | 97.8 | 47.75 | 64 | 46.70 | Verkeerde kmstand | | |
| # | | | | | | | | | |
|---+------------+---------+---------+--------+-------+-------+-------------------+----------+--------|
#+TBLFM: $6='(if (and (not (check-if-after-hline)) (not (equal @-1$2 "")) (not (equal $2 ""))) (- (time-to-days (org-read-date t t (concat $2))) (time-to-days (org-read-date t t (concat @-1$2)))) "");S::$7='(if (and (nz $4) (nz $5)) (format "%.2f" (/ (* $4 $5) 100)) "");N::$8='(if (and (nz @-1$3) (nz $3)) (if (> $3 @-1$3) (- $3 @-1$3) (if (not (check-if-after-hline)) "Verkeerde kmstand" "")) "");N::$9='(if (and (nz $8) (nz $7)) (format "%.3f" (/ (* $7 100) $8)) "");N::$10='(if (and (nz $8) (nz $5)) (format "%.3f" (/ $8 $5)) "");N
The only problem is that in the second element of 'dagen' there stands
'-3'. It looks like it that '(not (equal @-1$2 ""))' is not correctly is
evaluated.
--
Cecil Westerhof <CecilWesterhof@xs4all.nl>
I have been experimenting a little bit more. I now have the following table: |---+------------+---------------+---------------+-----------------------+----------+-------| | | date | previous date | prev at once | prev with dummy field | row date | dagen | |---+------------+---------------+---------------+-----------------------+----------+-------| | # | | | filled | empty | EMPTY | | | # | 2007-07-09 | | filled | empty | FILLED | -3 | | # | 2007-09-11 | 2007-07-09 | filled | filled | FILLED | 64 | | # | | 2007-09-11 | filled | filled | EMPTY | | | # | 2006-12-31 | | filled | empty | FILLED | -193 | |---+------------+---------------+---------------+-----------------------+----------+-------| #+TBLFM: $3='(concat @-1$2);S::$4='(if (not (equal (concat @-1$2) "")) "filled" "empty")::$5='(if (not (equal (concat $3 ) "")) "filled" "empty")::$6='(if (not (equal (concat $2 ) "")) "filled" "empty")::$7='(if (and (not (check-if-after-hline)) (not (equal @-1$2 "")) (not (equal $2 ""))) (- (time-to-days (org-read-date t t (concat $2))) (time-to-days (org-read-date t t (concat @-1$2)))) "");S When checking for the previous date at once you always get filled. If the previous date is copied to a field and this field is checked, you get the expected value. What is happening here? Also why is in the column 'row date' everything in caps? -- Cecil Westerhof <CecilWesterhof@xs4all.nl>
On Jul 12, 2007, at 9:19, Cecil Westerhof wrote: > > > When checking for the previous date at once you always get filled. If > the previous date is copied to a field and this field is checked, you > get the expected value. > What is happening here? Again the formula debugger is showing what happens: In one case "" is substituted, in the other case " ", which is not equal to "". I guess you could call this a bug, I'll see if it can be fixed. Here is an easy way to check if a field is empty: (defun not-white (s) (string-match "\\S-" s)) > Also why is in the column 'row date' everything in caps? Bug, fixed now. - Carsten