TweetFollow Us on Twitter

Batch Processing
Volume Number:9
Issue Number:5
Column Tag:Jörg's Folder

Related Info: Apple Event Mgr Edition Manager Event Manager

Batch Processing with Apple Events

Solutions for a specific batch task

By Jörg Langowski, MacTech Magazine Regular Contributing Author

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

This column was initiated by a reader’s question:

“Dear Jörg,

I am looking for a way to simulate batch files on the mac. I need to run two Fortran programs sequentially, then open Excel and run a macro on the results. What should I use? Can it be done? If you can solve this I'll subscribe!”

Homer Bartlett, Microstar Inc.

Well, we always welcome new subscribers, and your question is actually of very general interest; so this month I’ll write about ‘batch processing with Apple Events’. This is actually a rather ambitious title for what we’ll be doing, sending a couple of Apple Events to other programs to make them do their things; but didn’t the headline catch your eye? So there.

I have found three principal ways to install a way of ‘batch processing’ like Homer Bartlett asked for. a) you write a Fortran program that sends an ‘oapp’ Apple Event to each of the two programs that you want to execute. These two programs leave intermediate results in files. Then, the Fortran program opens Excel (again via an Apple Event), and makes Excel execute a macro file. How this is done, you’ll see soon. b) you write a Fortran program that calls the two other programs via Apple Events as before, but the intermediate results are left in edition files that can be handled by System 7’s Edition Manager. Excel 3.0 and higher supports Subscribe and Publish; if an Excel worksheet is opened that subscribes to those edition files, the data will automatically be updated when the edition is modified. And, last one and easiest one, c) you control everything from Excel - the execution of the two Fortran programs and the following running of the macro. I’ll give you examples for all three of these procedures.

First of all, let’s write two little Fortran programs that calculate our ‘results’ and write them to files. They’re at the start of the example: one calculates a sine curve, the other an exponential, and the Excel macro will later open the files and read them into a worksheet where the results are multiplied and displayed in a graph.

Opening an application from Fortran

Language Systems Fortran provides a rather convenient interface to the four basic required Apple Events. There is a routine F_SendEvent that takes 3 parameters: first a character*4 constant which is the Apple event ID, then a string that specifies the target application and finally an optional document name (also a string). Thus, to open Microsoft Excel from a Fortran program, you might include the line

call F_SendEvent(‘oapp’,’Microsoft Excel’,’’)

and to open the worksheet ‘SinExp’ from Excel

call F_SendEvent(‘odoc’,’Microsoft Excel’,’SinExp’)

These commands are contained in the main program of listing 1. First, in fact, we call the two programs that generate our data, both using the ‘oapp’ event, and then we send the ‘odoc’ event to Excel for opening the macro sheet that opens and multiplies the two output files. Since the program continues after sending the ‘oapp’ event without waiting that the called program has actually written the file, we check whether the output files are actually there before continuing with the macro execution. We assume here that Excel is already open; I did not want to hard code a line that contained the full access path for opening Excel, because that is obviously different from Macintosh to Macintosh. So make sure Excel is open before you run the program.

When the Excel macro sheet has been opened, Excel is ready for executing the macro. Now, how do you make Excel execute a macro - or any command for that matter - from the outside, by sending an Apple event? This is documented in two places: You can either get the ‘Excel 4.0 Software Development Kit’ from Microsoft, or download a file that you can find on AppleLink where the Apple events are described that Excel understands. I downloaded the file, you find it in the archives of the Apple Events discussion in Developer support:System 7 talk. It’s somewhere in April/May 1992; search for ‘Excel’ and you’ll find it; it is a posting by Ben Waldman from Microsoft. The file with the full description of the Apple events understood by Excel is too long to be printed here (45 pages of MS Word text, that would take a full issue of this magazine!). But here, we need only one very basic Apple event, the ‘dosc’ event that is becoming a kind of a standard for remote command execution; for instance HyperCard and the MPW tool server also understand it. The ‘dosc’ event contains a text parameter, which is simply a script of commands to execute by the program; in HyperCard, those are Hypertalk commands and in Excel, any valid Excel command or function.

Language Systems Fortran contains a function that lets you send a script to another program through the ‘dosc’ event. The script lines are defined in a character array, e.g.,

character *40 script(10)

will allow you to write a script of 10 lines of 40 characters maximum each. The function call

Error = F_SendScript('Microsoft Excel',script,10)

would then send the ten lines to the application ‘Microsoft Excel’, which executes them. In our case, we send only one line

'RUN("SinExp!R1C1") '

which is the command to execute the macro starting at row 1, column 1 in the open macro sheet ‘SinExp’. Note that Excel scripts that are sent by Apple events never contain equal signs in front of the command, unlike the same command contained in a worksheet or macro sheet.

So here you go - we have created a Fortran program that calls two other programs and then runs an Excel macro on the results. But there are two other ways to achieve a similar result.

Publish/Subscribe

First of all, one can use the Edition manager, part of System 7. Using this service, a program can ‘publish’ an ‘edition’ of some data, and another program can ‘subscribe’ to it. The publisher and subscriber are then automatically linked together through Apple events so that the data that the subscriber ‘sees’ gets automatically updated when the publisher changes it.

Language Systems Fortran supports the Edition manager. When you open a Fortran file, write data to it, and close it with status=’publish’, you create an edition of that file. Excel 4.0, for instance, can subscribe to such an edition. Doing that from Excel is easy: you select a range of cells and then select ‘Subscribe to ’ from the Edit menu. You can then select an edition file which will be used to update automatically this selected range of cells. In the source code disk, I have already defined a worksheet that contains subscribers to the two data files that are generated by the two Fortran programs.

Listing 2 gives the program example. Here the two ‘data-generating’ parts are implemented as subroutines that can be selected from a menu in the main Fortran program. When you first write the data files, the editions are created. Excel can then subscribe to them, which is done in the worksheet, and a graph is linked to the data. When you then go back to the Fortran program and recalculate the data in the two files with other parameters, you’ll see that the graph also changes (almost) instantaneously.

Calling Fortran programs from Excel macros

This is the last possibility that I found, and it might be the easiest one. There is a function in Excel called EXEC( ) which allows you to execute a program from within Excel. Listing 3 shows a macro which calls the two Fortran programs that create the data files, and then does the calculations and creates a graph like the previous macro. You don’t need to compile a main Fortran program as in the first example, but just execute a sequence of Excel commands which may even be contained in a text file. In fact, this last example might come closest to answer Homer Bartlett’s original question, which was a way to simulate batch files on the Macintosh.

Last remark: I have seen a lot of discussion going on lately about Frontier, a scripting system for the Macintosh developed by UserLand Software. Although I have never seen the product, I’d like to write about it sooner or later when I get hold of it and find the time for writing.

See you next month.

Listing1: Calling other Fortran programs and an Excel macro from Fortran

a. The called programs
    (compile and link using the RunNoWindow script)

 program doExp
 real exptab(100),period
 
 parameter (period=30.0)
 
 do j = 1,100
 exptab(j) = exp(-j/period)
 end do
 
 open(10,file='expData')
 write(10,100) exptab
 close(10)
 
100format(x,f10.2)
 end

 program doSine
 real sintab(100),period
 parameter (twopi = 6.283185,period = 15.0)
 
 do j = 1,100
 sintab(j) = sin(twopi*j/period)
 end do
 
 open(10,file='SinData')
 write(10,100) sintab
 close(10)
 
100format(x,f10.2)
 end

b. The main program

cSends commands to excel via the 'dosc' event.
c
cCompile with -bkg=4.
c
 program SendScript

 integer*2 err, F_SendScript
 external F_SendScript
 character*30  ch
 logical exists
 
 ch = 'RUN("SinExp!R1C1") '

 type *, 'Generating Data '
 
 Error = F_SendEvent('oapp','sinus','')
 call checkError(Error)

 Error = F_SendEvent('oapp','expo','')
 call checkError(Error)
 
 exists = .false.
 do while (.not. exists)
 inquire(file='expData',exist=exists)
 end do
 
 exists = .false.
 do while (.not. exists)
 inquire(file='SinData',exist=exists)
 end do
 
 type *, 'Opening Macro sheet '

 Error = F_SendEvent('odoc','Microsoft Excel',     *           
 'SinExp')
 call checkError(Error)

 type *, 'Running Macro '

 Error = F_SendScript('Microsoft Excel',ch,1)

 call checkError(Error)

 type *, 'Quitting Excel '

 Error = F_SendEvent('quit','Microsoft Excel','')
 call checkError(Error)

 end

 subroutine checkError(Error)
 integer*2Error
 character*10  ch5
 if (Error <> 0) then
 write(ch5,'(i10)') Error
 call alertbox('Error '//ch5//' occurred.')
 write(*,*) 'Error '//ch5//' occurred.'
 stop
 end if
 end

c. The Excel macro

"=OPEN(""expData"")"
"=OPEN(""SinData"")"
"=SELECT(""R1C2"")"
"=FORMULA(""=expData!RC[-1]*RC[-1]"")"
"=SELECT(""R1C2:R100C2"")"
=FILL.DOWN()
"=NEW(2,1)"
"=GALLERY.LINE(2,TRUE)"
"=ACTIVATE(""SinData"")"
=CLOSE(FALSE)
"=FILE.DELETE(""SinData"")"
"=ACTIVATE(""expData"")"
=CLOSE(FALSE)
"=FILE.DELETE(""expData"")"
=RETURN()
Listing 2: Excel/Fortran interface via Publish/Subscribe


 program PublishDemo
 integer*2Error,F_SendEvent
 external F_SendEvent
 external doPublish,doExit
 
 call moveoutwindow(20,40,300,300)
 call addmenuitem('Publish','Publish Sine',doSine)
 call addmenuitem('Publish','Publish Exp',doExp)

 write(*,*)
 write(*,*) 'Opening Application  Excel '
 write(*,*)
 write(*,*) 'Opening SinExpTable '
 Error = F_SendEvent('odoc','Microsoft Excel', *   'SinExpTable')
 call checkError(Error)

 write(*,*)
 write(*,*) 'Opening SinExpChart '
 Error = F_SendEvent('odoc','Microsoft Excel', *   'SinExpChart')
 call checkError(Error)

 write(*,*)
 write(*,*) 'Use the Publish menu to update the Excel
 1 chart.'
 
 call SetExitProc(doExit)
 end
 
 subroutine checkError(Error)
 integer*2Error
 character*5ch5
 if (Error <> 0) then
 write(ch5,'(i5)') Error
 call alertbox('Error '//ch5//' occurred.')
 write(*,*) 'Error '//ch5//' occurred.'
 stop
 end if
 end
 
!!mp inlines.f
 subroutine doSine
 real   sintab(100),period
 parameter (twopi = 6.283185)
 
 type *,"Enter period of sine in steps: "
 accept *,period
 do j = 1,100
 sintab(j) = sin(twopi*j/period)
 end do
 
 open(10,file='SinData')
 write(10,100) sintab
 close(10,status='Publish')
 
100format(x,f10.2)
 end

 subroutine doExp
 real   exptab(100),period
 
 type *,"Enter decay period in steps: "
 accept *,period
 do j = 1,100
 exptab(j) = exp(-j/period)
 end do
 
 open(10,file='expData')
 write(10,100) exptab
 close(10,status='Publish')
 
100format(x,f10.2)
 end

 subroutine doExit()
 integer*2Error,F_SendEvent
 external F_SendEvent

 Error = F_SendEvent('quit','Microsoft Excel','')
 call checkError(Error)
 end
Listing 3: Calling Fortran programs from an Excel macro
(this assumes that the Fortran programs are in the same folder as Excel)

"=EXEC(""expo"")"
"=EXEC(""sinus"")"
"=WAIT(NOW()+""00:00:05"")"
"=OPEN(""expData"")"
"=OPEN(""SinData"")"
"=SELECT(""R1C2"")"
"=FORMULA(""=expData!RC[-1]*RC[-1]"")"
"=SELECT(""R1C2:R100C2"")"
=FILL.DOWN()
"=NEW(2,1)"
"=GALLERY.LINE(2,TRUE)"
"=ACTIVATE(""SinData"")"
=CLOSE(FALSE)
"=FILE.DELETE(""SinData"")"
"=ACTIVATE(""expData"")"
=CLOSE(FALSE)
"=FILE.DELETE(""expData"")"
=RETURN()

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

calibre 2.69.0 - Complete e-book library...
Calibre is a complete e-book library manager. Organize your collection, convert your books to multiple formats, and sync with all of your devices. Let Calibre be your multi-tasking digital librarian... Read more
Evernote 6.9.1 - Create searchable notes...
Evernote allows you to easily capture information in any environment using whatever device or platform you find most convenient, and makes this information accessible and searchable at anytime, from... Read more
jAlbum Pro 13.5 - Organize your digital...
jAlbum Pro has all the features you love in jAlbum, but comes with a commercial license. You can create gorgeous custom photo galleries for the Web without writing a line of code! Beginner-friendly... Read more
jAlbum 13.5 - Create custom photo galler...
With jAlbum, you can create gorgeous custom photo galleries for the Web without writing a line of code! Beginner-friendly, with pro results - Simply drag and drop photos into groups, choose a design... Read more
Google Chrome 53.0.2785.143 - Modern and...
Google Chrome is a Web browser by Google, created to be a modern platform for Web pages and applications. It utilizes very fast loading of Web pages and has a V8 engine, which is a custom built... Read more
Chromium 53.0.2785.143 - Fast and stable...
Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all Internet users to experience the web. Version 53.0.2785.143: [Security Fix] High CVE-2016-... Read more
QuickBooks 2015 16.1.7.1524 R8 - Financi...
Save 20% on QuickBooks Pro for Mac today through this special discount link QuickBooks 2015 helps you manage your business easily and efficiently. Organize your finances all in one place, track... Read more
Sierra Cache Cleaner 11.0.1 - Clear cach...
Sierra Cache Cleaner is an award-winning general purpose tool for macOS X. SCC makes system maintenance simple with an easy point-and-click interface to many macOS X functions. Novice and expert... Read more
Default Folder X 5.0.7 - Enhances Open a...
Default Folder X attaches a toolbar to the right side of the Open and Save dialogs in any OS X-native application. The toolbar gives you fast access to various folders and commands. You just click on... Read more
Safari Technology Preview 10.1 - The new...
Safari Technology Preview contains the most recent additions and improvements to WebKit and the latest advances in Safari web technologies. And once installed, you will receive notifications of... Read more

Pumped BMX 3: Beginner tips and tricks
There’s a whole lot more to Pumped BMX 3 than meets the eye. Your goal is to perform a wide array of sweet flips and tricks, but that’s easier said than done. It takes well practiced timing and coordination, and the game doesn’t really explain that... | Read more »
Cybird’s latest release - BFB Champions...
Launched in the UK in early September, BFB Champions’ newest update is loaded with great new features, and looks set to outshine the original version by taking it out of soft launch and giving it a new lease of life. | Read more »
3 apps to boost your focus
As someone who works from home, my workspace is a minefield of distraction. Cats, tasty snacks, the wind blowing past my window, that cleaning that I suddenly can’t put off any longer. If I let distraction takes its course, I find that soon half... | Read more »
Pumped BMX 3 (Games)
Pumped BMX 3 1.0 Device: iOS Universal Category: Games Price: $3.99, Version: 1.0 (iTunes) Description: The final instalment of the smash hit #1 rated BMX game is here! Following on from the insane success of Pumped BMX 2, Pumped 3... | Read more »
4 games like Burly Men at Sea to inspire...
Burly Men at Sea is out today and it looks a treat. It tells the tale of three Scandinavian fishermen who leave the humdrum of their daily lives to go exploring. It’s a beautiful folksy story that unfurls as you interact with the environment... | Read more »
3 reasons you need to play Kingdom: New...
Developed by a tag team of indie developers - Thomas "Noio" van den Berg and Marco "Licorice" Bancale - Kingdom is a vibrant medieval fantasy adventure that casts players as a king or queen who must expand their empire by exploring the vasts lands... | Read more »
JoyCity have launched a brand new King o...
Great news for all of you Game of Dice fans out there - JoyCity have just released a brand new limited edition pack with a really cool twist. The premise of Game of Dice is fairly straightforward, asking you to roll dice to navigate your way around... | Read more »
Burly Men at Sea (Games)
Burly Men at Sea 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: Burly Men at Sea is a folktale about a trio of large, bearded fishermen who step away from the ordinary to seek adventure. | Read more »
3 tips for catching the gnarliest waves...
Like a wave breaking on the shore, Tidal Rider swept its way onto the App Store charts this week settling firmly in the top 10. It’s a one-touch high score-chaser in which you pull surfing stunts while dodging seagulls and collecting coins. The... | Read more »
The beginner's guide to destroying...
Age of Heroes: Conquest is 5th Planet Games’ all new turn-based multiplayer RPG, full of fantasy exploration, guild building, and treasure hunting. It’s pretty user-friendly as far as these games go, but when you really get down to it, you’ll find... | Read more »

Price Scanner via MacPrices.net

CAZE Annouces New Zero 5 Case for Jet Black i...
Hong Kong basd CAZE has announced Zero 5 case for iPhone 7/ 7 Plus, one of the world’s thinnest clear hard cases, measuring just 0.5 millimeters. CAZE has been producing and improving the Zero 5... Read more
Nest Egg Inventory App for iOS Offers Conven...
Campbell, California based Winprogger LLC has announced the release and immediate availability of Nest Egg – Inventory 4.1.22, an important update to their easy-to-use, yet comprehensive inventory... Read more
Factor4, LLC Launches Apple iOS and Android G...
Factor4, LLC, which offers gift and loyalty services to the SMB marketplace, has released free mobile applications that enable merchants to process via all Apple and Android devices. The Apple and... Read more
15-inch Retina MacBook Pros on sale for $200...
B&H Photo has 15″ Retina Apple MacBook Pros on sale for $200 off MSRP. Shipping is free, and B&H charges NY tax only: - 15″ 2.2GHz Retina MacBook Pro: $1799 $200 off MSRP - 15″ 2.5GHz Retina... Read more
Apple refurbished iMacs available for up to $...
Apple has Certified Refurbished 2015 21″ & 27″ iMacs available for up to $350 off MSRP. Apple’s one-year warranty is standard, and shipping is free. The following models are available: - 21″ 3.... Read more
Check Apple prices on any device with the iTr...
MacPrices is proud to offer readers a free iOS app (iPhones, iPads, & iPod touch) and Android app (Google Play and Amazon App Store) called iTracx, which allows you to glance at today’s lowest... Read more
Apple price trackers, updated continuously
Scan our Apple Price Trackers for the latest information on sales, bundles, and availability on systems from Apple’s authorized internet/catalog resellers. We update the trackers continuously: - 15″... Read more
Apple refurbished 2016 13-inch MacBook Airs a...
Apple has Certified Refurbished 2016 13″ MacBook Airs available starting at $849. An Apple one-year warranty is included with each MacBook, and shipping is free: - 2016 13″ 1.6GHz/8GB/128GB MacBook... Read more
1.4GHz Mac mini on sale for $449, save $50
Adorama has the 1.4GHz Mac mini on sale for $50 off MSRP including free shipping plus NY & NJ sales tax only: - 1.4GHz Mac mini (Apple sku# MGEM2LL/A): $449 $50 off MSRP To purchase a mini at... Read more
Apple refurbished 2015 13-inch MacBook Airs a...
Apple has Certified Refurbished 2015 13″ MacBook Airs available starting at $759. An Apple one-year warranty is included with each MacBook, and shipping is free: - 2015 13″ 1.6GHz/4GB/128GB MacBook... Read more

Jobs Board

*Apple* Retail - Multiple Positions- Akron,...
Job Description:SalesSpecialist - Retail Customer Service and SalesTransform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Hardware Design Validation Engineer - *Apple...
Changing the world is all in a day's work at Apple . If you love innovation, here's your chance to make a career of it. You'll work hard. But the job comes with more Read more
Systems Architecture Prototyping - *Apple*...
Changing the world is all in a day's work at Apple . If you love innovation, here's your chance to make a career of it. You'll work hard. But the job comes with more Read more
*Apple* Retail - Multiple Positions- South B...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Restaurant Manager (Neighborhood Captain) - A...
…in every aspect of daily operation. WHY YOU'LL LIKE IT: You'll be the Big Apple . You'll solve problems. You'll get to show your ability to handle the stress and Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.