[comp.lang.rexx] Spreadsheets with Rexx support?

mwm@VIOLET.BERKELEY.EDU (Mike Meyer, I'll think of something yet) (10/09/89)

A spreadsheet would seem to be a natural for Rexx support, but I
haven't been able to turn any up. Can someone out there provide a
pointer to one, on any platform?

	Thanx,
	<mike

jac@muslix.llnl.gov (James Crotinger) (10/09/89)

In article <8910090133.AA09674@violet.berkeley.edu> mwm@VIOLET.BERKELEY.EDU (Mike  Meyer, I'll think of something yet) writes:
>A spreadsheet would seem to be a natural for Rexx support, but I
>haven't been able to turn any up. Can someone out there provide a
>pointer to one, on any platform?
>
>	Thanx,
>	<mike

    There is one that I know of on the Amiga: Superplan by Precision
Inc.  Their ad says it does "Spreadsheet, Business Graphics, and Time
Management", sideways and color printing, wall charts, Gantt charts,
critical path analysis, programmable, Lotus 1-2-3 and dBase file
compatible, and supports AREXX. List price is $149. Their top of the
line database, Superbase Professional, also has AREXX support.

    I don't own either of these products, and know next to nothing
about them (there was a time when I had every AREXX compatible
commercial program, but that doesn't fit my budget anymore 8-( ). I
haven't even heard anything about Superplan. I have heard quite a few
good things about Superbase Pro, but again I have no personal
experience with it.  However they are both on my shopping list---an
AREXX compatible spreadsheet and database sound like a very useful
combo!

    (Actually I believe AmigaWorld gave Superplan a glowing review, but
they give everything a glowing review)


   Jim

patterso@pilot.njin.net (Ross Patterson) (10/09/89)

I did one as a proof-of-concept under VM/CMS using XEDIT for the screen
manager. All the underlying code is in REXX, no Assembler, no C, no
nuthin'. It ain't fast, and it ain't pretty, but it was fun to do. As you
say, REXX is a natual for this. The content-addressable arrays work very
nicely as a sparse-matrix structure, so you don't have to over-allocate
memory. The ability to set a default value for all variables with a common
stem means that you don't have to special-case the handling of non-existent
cells in the matrix. All in all, not a bad toy.

Ross Patterson
Rutgers University

Benton_J_Elkins@cup.portal.com (10/10/89)

Plan/IT from Intuitive Technologies is a spread sheet-database-business 
graphics program for Amiga with Arexx support. These are the same people
who have developed UltraCard. They are in Monterey 408)646-9147.

cyosta@taux01.UUCP ( Yossie Silverman ) (10/10/89)

Gee, I wrote a simple one a few weeks ago.  I'll include it here, and a sample
data file.  Have fun.  - Yossie

Please, don't look to me for help in understanding it, I don't have the time
to answer.  Yes, I know it isn't efficient, but it does work.  It is a RIGHT
TO LEFT evaluation spread-sheet, each line is done seperately, cellnames are
one dimensional (huh?).  Anyway, the code should be pretty clear (I hope).

To execute it, XEDIT the data file and type SC.

---- SC XEDIT ----

/**/
'TOP'
$._cols = 0 /* how many data columns we have */
do $._top = 0 by 1
  'NEXT'; if rc /= 0 then leave
  'EXTRACT /CURLINE'
  if left(curline.3,1) = '*' then do   /* this be a column header */
    i = $._cols + 1
    parse var curline.3 '*' name.i width.i value.i
    if left(value.i,1) = '=' then do j = 1 to $._cols
      do forever
        k = find(value.i,name.j)
        if k = 0 then leave
        value.i = subword(value.i,1,k-1) 'X.'||j subword(value.i,k+1)
      end
    end
    $._cols = i
  end
  else leave /* setting top in the process */
end
 
$._top = $._top + 1
$._first = $._top
 
$._left = 1
$._cram = 0
'EXTRACT /LSCREEN'
'SET CTLCHAR ( ESCAPE'
'SET CTLCHAR h PROTECT RED'
'SET CTLCHAR l PROTECT NOHIGH'
'SET CTLCHAR e NOPROTECT HIGH'
'SET CTLCHAR v PROTECT HIGH'
'SET PF5 LEFT'; 'SET PF17 LEFT'; 'SET PF6 RIGHT'; 'SET PF18 RIGHT'
'SET PF4 CRAM'; 'SET PF16 CRAM'
do forever
  call update
  'MAKEBUF'; q = queued()
  'READ ALL TAG'
  do i = 1 to queued()-q /* first process all RES tags */
    parse pull tag value
    if tag = 'RES' then call res value
    else queue tag value
  end
  do i = 1 to queued()-q /* now process all the rest */
    parse pull tag value
    select
      when tag = 'CMD' then call cmd value
      when tag = 'PFK' then call cmd subword(value,2)
      otherwise nop
    end
  end
  'DROPBUF'
end
 
res: procedure expose lscreen. $. offsets.
  arg y x data
  y = y - 4 + $._first
  do i = $._right - 1 to $._left by -1
    if offsets.i < x then leave
  end
  x = $._left + i - 1
  'LOCATE :'||y||'EXTRACT /CURLINE'
  z = ''
  do i = 1 to x-1
    parse var curline.3 l ';' curline.3
    z = z||l||';'
  end
  parse var curline.3 ';'curline.3
  'REPLACE' z||data||';'||curline.3
return
 
cmd: procedure expose $. lscreen.
  parse arg cmd parms
  'EXTRACT /SIZE'
  select
    when cmd = 'LEFT' then
      if $._left > 1 then $._left = $._left - 1
    when cmd = 'RIGHT' then
      if $._right <= $._cols then $._left = $._left + 1
    when cmd = 'CRAM' then
      $._cram = ^ $._cram
    when abbrev('FORWARD',cmd,2) then do
      x = $._first + lscreen.1 - 5
      if (x + lscreen.1 - 5) <= size.1 then $._first = x
      else do
        x = size.1 - (lscreen.1 - 5) + 1
        if x < $._top then x = $._top
      end
      $._first = x
    end
    when abbrev('BACKWARD',cmd,2) then do
      x = $._first - (lscreen.1 - 5)
      if x < $._top then x = $._top
      $._first = x
    end
    when cmd = 'QUIT' then do
      do i = 3 to lscreen.1-2
        'SET RESERVED' i 'OFF'
      end
      exit
    end
    otherwise nop
  end
return
 
update: procedure expose lscreen. $. width. name. value. offsets.
  if $._cram then do
    w = 0; extra = 1
    title = ''; entry = ''
    titlesep = ''; entrysep = ''
  end
  else do
    w = 1; extra = 3
    title = '|'; entry = '|'
    titlesep = '(l|'; entrysep = '(l|'
  end
  do i = $._left to $._cols
    offsets.i = w
    w = w + extra + width.i
    if w > (lscreen.2-1) then leave
    title = title||'(h'||left(name.i,width.i)||titlesep
    if left(value.i,1) = '=' then
      entry = entry||'(v'||left(' ',width.i)||entrysep
    else
      entry = entry||'(e'||left(' ',width.i)||entrysep
  end
  $._right = i
  'SET RESERVED 3 N' title||'(l'
  do i = 4 to lscreen.1-2
    x = 1; e = entry||'(l'
    if calc(i-4+$._first) then do j = $._left to $._right-1
      y = index(e,' ',x)
      x = verify(e,' ',,y)
      e = left(e,y-1)||right(x.j,x-y)||substr(e,x)
    end
    'SET RESERVED' i 'N' e
  end
return
 
calc: procedure expose name. value. $._cols x.
  arg lineno
  'LOCATE :'lineno
  if rc /= 0 then return 0
  'EXTRACT /CURLINE'
  do i = 1 to $._cols
    parse var curline.3 x.i ';' curline.3
    if x.i = '' then x.i = 0
    if left(value.i,1) = '=' then interpret 'x.i' value.i
  end
return 1

---- SC DATA ----

* P         2 A
* SIZE_1X   8 N
* RESIZE_1X 8 N
* CD'S_5X   8 = ( SIZE_1X + RESIZE_1X * 2 ) * 5
* 43%_SHR   8 = 0.57 * CD'S_5X
* MEBES     8 N
* 5X        8 = 43%_SHR + MEBES
* 1X        8 = 5X / 5
D;3;-0.63;;;0.26;;;
D;3;-0.63;;;0.26;;;
D;3;-0.63;;;0.26;;;
D; 3;-0.63;;;0.26;;;
D;3;-0.63;;;0.26;;;
D;3;-0.63;;;0.26;;;
D;3;-0.63;;;0.26;;;
D;3;-0.63;;;0.26;;;
-- 
Yossie Silverman                                   What did the Caspian sea?
National Semiconductor Ltd. (Israel)
cyosta%taux01@nsc.nsc.COM         or        RPR1YOS@TECHNION.BITNET
NSA LSD FBI KGB PCP CIA MOSAD NUCLEAR MI5 SPY ASSASSINATE SDI -- OOLCAY ITAY

yorkw@tippy.uucp (10/23/89)

There is a spread sheet program out for the amiga with an AREXX port.
but i can't find the artical right now. I think perhaps Super Plan.
i have a listing from Mr. Hawes of products with Arexx ports.
He fails to get all the PD progs though.
(Mabey it was MaxiPlan....... :^))