AUTOMATING OPENOFFICE.ORG WITH OOREXX: OOREXX NUTSHELL EXAMPLES FOR WRITE AND CALC
|
|
|
- Jessica Lindsey
- 10 years ago
- Views:
Transcription
1 AUTOMATING OPENOFFICE.ORG WITH OOREXX: OOREXX NUTSHELL EXAMPLES FOR WRITE AND CALC Rony G. Flatscher Wirtschaftsuniversität Wien (WU), Austria The 2005 International Rexx Symposium, Los Angeles, California, U.S.A., April 17 th - April 21 st, ABSTRACT The opensource Microsoft Office clone "OpenOffice.org" is available on multiple platforms, from Windows, over Linux to OS/2. It can read/write Microsoft office fileformats, such as Word, Excel or PowerPoint. Its scripting architecture is radically different from what Microsoft has come up with and appears to be more systematic, although there is a rather steep learning curve to it. This article will give numerous little "nutshell" examples of driving OpenOffice.org via oorexx. All the examples will run unaltered under Linux and Windows. Keywords: Object Rexx, oorexx, BSF, BSF4Rexx, Automation, Scripting, OpenOffice.org, OOo. Disclaimer: The supporting infrastructures and modules, namely BSF4Rexx and OOo.CLS, introduced and used in this article may change in the future due to their work in progress status at the time of this writing! Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 1-27
2 1 INTRODUCTION In the 90ies a German company named "Star Division" developed a portable C++ class library that it named "Star". It became available for MacOS, Unix, OS/2 and Windows. With this infrastructure the company started to develop an integrated office suite which should be portable to all platforms that "Star" was available. It was named "StarOffice". Due to the success of the Microsoft office (MSO) suite, it was very important for Star Division to create their office suite in a way, which allowed co-operating with MSO users as seemlessly as possible. For that reason powerful import and export filters for MSO have been of paramount importance and in effect allows it today, to import and export most MSO documents into/from StarOffice on any platform Star Office is available. In addition the StarOffice user interface resembles the MSO user interface, such that it becomes rather feasible for companies to migrate from MSO to StarOffice should they wish to escape a possibly undersired lock-in situation, or should they strategically plan to not be locked-in anymore. Among other benefits such a migration also opens up the possibility to switch operating and hardware system platforms as long as StarOffice is available on the new target. Finally, the built-in scripting language ("Star Basic") is a look-alike language to Microsoft's Visual Basic, sharing most of the language constructs and properties, thereby making it relatively easy for MSO (-user) programmers to become productive in StarOffice. The company Sun, looking for a MSO compatible, powerful office suite for its Unixbased operating system Solaris bought the German company and made it available as a commercial product on Windows as well. In addition, two important developments have taken place since then: "StarOffice" has become fully programmable from Java, which is because of Sun's interest to leverage its programming language Java as much as possible, Sun released a version of "StarOffice" into the opensource and made it freely available under the name "OpenOffice". The WWW homepage is located at "OpenOffice.org" and it has therefore become common to abbreviate it as "OOo". Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 2-27
3 Having an opensource version of StarOffice freely available allows companies and organizations to escape potentially undesired lock-ins by switching to the opensource codebase, either immediately or whenever such a company decides this to be a move in its own interest. In the case of switching from StarOffice to OpenOffice (or the other way round) incurs no switching costs whatsoever. If switching from MSO to StarOffice/OOo switching costs (installation, re-training users) need to be taken into account, but it becomes possible to save by cancelling costful upgrade plans in the long run, and possibly remarkable money by being able to switch away from the Windows operating system altogether. Such switching to opensource software that is free, seems to be quite attractive for public administrations in Europe (e.g. German cities, or the Austrian capital Vienna). Possibly more important, free software allows schools, Universities, third world countries, private people to employ a powerful, integrated office package for their needs, without cutting into their (most of the time extremely tight) budgets. Having the software not only free, but also in opensource means that maintenance of such software is even possible, if the original writers are not available anymore. Especially in the scholar environment opensource allows analysis, improvements and extensions to such software, because of such a white box approach. 1 This article introduces the results of analyzing the oorexx nutshell examples for OOo as developed by a student of the author (Augustin, cf. [Aug05]) over the wintersemester 2004/05 at the WU (Wirtschaftsuniversität Wien), creating a requirable oorexx module which should ease the interaction specifically with UNO components, of which OOo is composed of. It then introduces some nutshell examples relating to the word processor ( swrite ) and spreadsheet ( scalc ) in a rewritten form, taking advantage of the developed oorexx module. 1 Cf. [Flat05], section Introduction. Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 3-27
4 2 CREATING AN OOREXX MODULE OOO.CLS This section introduces the oorexx module OOo.CLS which should help oorexx programmers who wish to program OpenOffice.org (OOo) via its constituent UNO (Universal Network Object) components Analyzing oorexx Code to Interact with UNO Components Analyzing the oorexx examples in [Aug05] 3, which are based on information from the OOo developer documentation and information related to scripting in [W3OOoAPI], [W3OOoFW] and [W3OOoUDK]. In researching OOo scripts it is clear that Walter Augustin was looking into Java examples, and trying to rewrite them for oorexx taking advantage of BSF4Rexx (cf. e.g. [Flat04]). Figure 1 4 depicts an oorexx script from [Aug05] which starts up OOo and creates an empty word processor document. Various sections of that code have been highlighted to draw the attention of the reader to the following observations: 1. Most of the program is concerned in creating the runtime environment for driving the UNO components, ing at the statement starting with ocomponentloader =. All of the examples in [Aug05] possess these statements, which therefore are candidates to be outsourced into an own module (package) and made available as a routine. 2. The UNO service objects (instances of UNO components) are queried for interfaces that encapsulate functionality (methods) and/or properties (attributes) belonging semantically together, like Naming services, Factory services and the like. Querying an interface always involves an instance of the Java class com.sun.star.uno.unoruntime, because of its method queryinterface(), the Cf. [Flat05] for an architectural overview of OOo, UNO and how oorexx can interact taking advantage of the Java UNO bindings, by employing BSF4Rexx (cf. [Flat01], [Flat03], [Flat04]). [Aug05] contains Object REXX examples and their counterparts in JavaScript (Rhino) as well. The program in figure 1 uses a URL to connect to the OOo on the local host, port 8,100. If you have not configured your OOo to listen on that port, and wish to test that program, then you need to start an instance of OOo by issuing the following command in a command line window (cf. [OOo03]): soffice -accept=socket,host=localhost,port=8100;urp; Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 4-27
5 Java class object of the interface one queries (first argument to supply) and the service object of which the interface is sought for (second argument to supply). It is noticeable that queryinterface() is used quite often (five times in figure 1 alone) and always consumes two statements, one to get at the Java class object representing the desired interface, and one for invoking the queryinterface() runtime method itself. It may be interesting to note that OOo interface names always start out with a capital X (an OOo convention). 3. The class com.sun.star.beans.propertyvalue is of utmost importance to OOo programs. Many times additional information, attributes for services etc. are denoted with Java arrays of this type. A PropertyValue consists of four fields only 5, the two most important being: Name and Value, where Name is a string and Value an instance of the Java class of the appropriate type 6. It is also interesting to note that in the case of creating empty documents, one needs to supply an empty array object of type PropertyValue. 5 6 Classes that consist of fields (aka attributes, properties ) only, are called structs. The primitive Java types boolean, byte, char, short, int, long, float, double must be represented as instances of the classes java.lang.boolean, java.lang.byte, java.lang.character, java.lang.short, java.lang.integer, java.lang.long, java.lang.float, java.lang.double, respectively. So an oorexx function that box es the primitive datatypes to their Java class counterparts (and an unbox routine for the opposite purpose) would be desirable in the future. Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 5-27
6 /* initialize connection to server, get its Desktop-service and XComponentLoader interface */ scomponentcontext =.bsf~new("com.sun.star.comp.helper.bootstrap") ~createinitialcomponentcontext(.nil) unoruntime =.bsf~new("com.sun.star.uno.unoruntime") surlresolver = scomponentcontext~getservicemanager() ~createinstancewithcontext("com.sun.star.bridge.unourlresolve XUnoUrlResolver =.bsf4rexx~class.class~forname("com.sun.star.bridge.xunourlresolver") ourlresolver = unoruntime~queryinterface(xunourlresolver, surlresolver) unourl = "uno:socket,host=localhost,port=8100;urp;staroffice.namingservice" oinitialobject = ourlresolver~resolve(unourl) XNamingService =.bsf4rexx~class.class~forname("com.sun.star.uno.xnamingservice") snamingservice = unoruntime~queryinterface(xnamingservice, oinitialobject) oservicemanager = snamingservice~getregisteredobject("staroffice.servicemanager") XMSFactory =.bsf4rexx~class.class~forname("com.sun.star.lang.xmultiservicefactory") smsfactory = unoruntime~queryinterface(xmsfactory, oservicemanager) -- Retrieve the Desktop object, we need its XComponentLoader interface -- to load a new document sdesktop = smsfactory~createinstance("com.sun.star.frame.desktop") XDesktop =.bsf4rexx~class.class~forname("com.sun.star.frame.xdesktop") odesktop = unoruntime~queryinterface(xdesktop, sdesktop) XComponentLoaderName =.bsf4rexx~class.class~forname("com.sun.star.frame.xcomponentloader") ocomponentloader = unoruntime~queryinterface(xcomponentloadername, odesktop) /* Open a blank text document */ /* No properties needed */ propertyvaluename =.bsf4rexx~class.class~forname("com.sun.star.beans.propertyvalue") loadprops =.bsf~createarray(propertyvaluename, 0) /* 0=no elements, i.e. empty Java array */ /* load an empty text document */ swritercomponent = ocomponentloader~loadcomponentfromurl("private:factory/swriter", "_blank", 0, loadprops) ::requires "BSF.cls" r", scomponentcontext) Figure 1: A Typical oorexx OOo Program (Modeled After Java Programs). Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 6-27
7 2.2 Devising a Prototype oorexx OOo-Module In this section a prototype oorexx module will get developed which should ease programming in oorexx for OOo. The module s name should be OOO.CLS (OpenOffice.org class) and should supply at least the following features: 1. Contain the initialisation code for the UNO runtime environment, 2. allow to easily create the OOo desktop object, which is the pivotal object for creating and interacting with the OOo components, 3. make it considerably easier to query (and get) interface objects compared to Java, 4. make it easier loading OOo classes. The module will require BSF.CLS, the support for bridging oorexx with Java using the BSF4Rexx (cf. [Flat04]) package. This way oorexx is able to use UNO components from oorexx via their Java interfaces. In this section most of the module gets introduced and explained, the entire module is depicted in appix A at the of this article Initialisation of the oorexx Module OOO.CLS In the initialization part of this module a directory object should be created and stored in the.local oorexx runtime environment. This directory object should serve as a directory maintaining runtime information that is important for OOo and consequently be named with the oorexx environment symbol 7.OOO. One important application of this.ooo directory is its purpose to maintain the most important UNO/OOo objects and make them easily accessible. Firstly, the Java class objects 8 for the following important UNO/OOo classes should be stored with their unqualified name in the.ooo directory: "com.sun.star.beans.propertyvalue": needed for supplying properties to UNO/OOo components, 7 8 In oorexx an identifier that starts with a dot is called environment symbol : the runtime system will try to lookup an entry in one of its runtime environments by removing the leading dot and using the rest of the (uppercased) identifier as the key. Using BSF4Rexx (cf. [Flat04]) allows to interact with those Java class objects as if they were oorexx objects, which makes sing oorexx messages to them straight forward, and still will cause the invocation of the respective Java methods. Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 7-27
8 "com.sun.star.comp.helper.bootstrap": needed for bootstrapping UNO/OOo, "com.sun.star.uno.unoruntime": needed mostly for querying the interface objects. Secondly, the names of those UNO/OOo interfaces should be stored with the help of the.ooo directory object which are needed by the oorexx nutshell programs. For this purpose a directory object is created and stored with the name XInterfaces in.ooo. Each entry in the XInterfaces directory is pointing to the fully qualified name of the interface, using the fully qualified name itself and with a second entry, using the unqualified name as an index The oorexx Class OOO_PROXY The oorexx class OOO_PROXY allows to wrap up any BSF object and add OOo specific behaviour, namely the dealing with messages that indeed are meant for querying interface objects. The class OOO_PROXY is depicted in figure 2. The oorexx constructor method INIT merely saves the BSF object in an attribute (oorexx object variable, which can be directly accessed from each method via the EXPOSE statement issued as the very first statement). The behavior to query interface objects is added by exploiting the oorexx UN- KNOWN -mechanism: whenever a message is sent to an oorexx object for which no method can be found, the NOMETHOD exception is raised by the oorexx runtime system which interrupts and stops the execution of an oorexx program. If a class which was sought for a method which has the same name as the received message name contains a method by the name of UNKNOWN, then the oorexx runtime system will invoke this method instead, supplying as the first argument the name of the message for which no method was found and a second argument, either being.nil or an array object containing the arguments which were supplied to the message in round parenthesis. The OOO_PROXY class implements an UNKNOWN method to intercept all messages for which no methods could be found. If the message starts with a capital X, then it is assumed that the programmer wishes to query the interface object from the 9 This way an interface has always two entries in the XInterfaces directory, e.g. "com.sun.star.uno.xcomponentcontext" will be stored with an index name of "COM.SUN.STAR.UNO.XCOMPONENTCONTEXT" and an index name of XCOMPONENTCON- TEXT. Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 8-27
9 /* ************************************************************* Class: OOo_PROXY Purpose: allows to wrap up BSF (Java) objects as UNO/OOo objects; if instances are destroyed, then no derigistration from the BSF registry takes place ************************************************************* */ ::CLASS OOo_PROXY ::Method bsfobject ATTRIBUTE - stores the BSF object ::METHOD init -- constructor method expose bsfobject -- direct access to BSF object use arg bsfobject -- assign object to attribute self~objectname=bsfobject~objectname -- use same objectname as BSF proxy ::METHOD unknown expose bsfobject parse arg xname -- direct access to BSF object if xname~left(1)~translate="x" then -- if an interface object is asked for, query & return it do xclass=.ooo~entry(xname) -- try to get interface class object if xclass=.nil then -- no entry as of yet do idx=substr(xname, lastpos(".", xname)+1) xclass=ooo.loadclass(.ooo~xinterfaces~entry(xname), idx) -- query and return the interface object, wrap it up as an OOO_PROXY return.ooo_proxy~new(.ooo~unoruntime~queryinterface(xclass, bsfobject)) else -- pass to BSF object (i.e. the BSF class) to handle it do if bsfobject~hasmethod(xname) then -- o.k. it's a BSF method, forward it FORWARD TO (bsfobject) MESSAGE (xname) ARGUMENTS (arg(2)) else FORWARD TO (bsfobject) CONTINUE -- let BSF handle this tmpobj=result - retrieve the returned object -- if a BSF-object, wrap it up as an OOO_PROXY (to gain this UNKNOWN behaviour) if tmpobj~hasmethod("bsf.setfieldvalue") then return.ooo_proxy~new(tmpobj) else return tmpobj Figure 2: OOO.CLS : The OOO_PROXY Class. receiving object. In this case, the entries in the directory object XInterfaces as stored in.ooo are inspected to learn about the fully qualified name of the interface, which then is used to query the interface object. In order to optimize the runtime behavior the Java class objects representing the desired interfaces are created and stored in the.ooo directory by their (unqualified) class name. 10 In any case the received interface object will be wrapped up as an instance of the OOO_PROXY class, such that it receives that particular UNKNOWN behavior as well. If the unknown message does not start with a capital X, then it is either a message which should invoke a BSF method or a message which mostlikely should invoke a 10 In a subsequent run the stored Java class object will be reused. Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 9-27
10 Java method with the help of BSF. In the case of a BSF object the received interface object will be wrapped up as an instance of the OOO_PROXY class, such that it receives that particular UNKNOWN behavior as well. Otherwise the received string value will be returned Public Routine OOo.loadClass The public routine OOo.loadClass expects two arguments, the fully qualified name of the (Java) class to load, and optionally a string determining the index value to use to store the Java class object in the.ooo directory object. If the second argument is omitted, then the (unqualified) class name is used as the index value. The fully qualified Java class name is used to load the Java class object with the help of BSF and gets wrapped up as an OOO_PROXY object. Figure 3 depicts the oorexx code. -- load the given OOo-class and save it in environment ::routine OOo.loadClass public parse arg classname, idx if idx="" then -- omitted, hence extract last word to serve as index idx=substr(classname, lastpos(".", classname)+1) if.ooo~hasentry(idx)=.true then -- idx already used (class maybe loaded already).error~say("ooo.loadclass:" pp(idx) "already used, in hand:" - pp(classname) "in.ooo:" pp(.ooo~entry(idx))) -- load Java class via BSF, wrap it up as an "OOO_PROXY" tmpclass=.ooo_proxy~new(.bsf4rexx~class.class~forname(classname)).ooo~setentry(idx, tmpclass) -- save it in the ".OOo" directory return tmpclass -- return the wrapped class object Figure 3: OOO.CLS : Public Routine OOO.loadClass Public Routine: OOO.connect Figure 4 depicts the public oorexx routine OOO.CONNECT 11 which initializes the UNO runtime environment. The strategy employed allows for using URL-style connections to OOo server instances, running anywhere on the Internet. It is assumed that the local installation of OOo got configured such, that it is addressable via the TCP/IP port number 8,100 as per the OOo developer guide (cf. [OOo03]) The Rexx language allows the dot to be part of an identifier (as well as the question mark, exclamation mark and the underline character, besides letters and digits). 12 An alternative would be to use instead the method bootstrap() from oorexx which is defined in Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 10-27
11 -- connects to given UNO server, returns the XMultiServiceFactory -- interface object of the remote service manager ::routine OOo.connect public parse arg unourl -- no unourl given, use default if unourl="" then unourl="uno:socket,host=localhost,port=8100;urp;staroffice.namingservice" context=.ooo~bootstrap~createinitialcomponentcontext(.nil) uur= context~getservicemanager() ~createinstancewithcontext("com.sun.star.bridge.unourlresolver", context) remoteobject = uur~xunourlresolver ~resolve(unourl) remotenamingservice = remoteobject~xnamingservice remoteservicemanager=remotenamingservice~getregisteredobject("staroffice.servicemanager") remotemsf = remoteservicemanager~xmultiservicefactory if.ooo~hasentry("remotemsf")=.false then.ooo~remotemsf=remotemsf -- save remote MultiServiceFactory return remotemsf -- return the remote XMultiServiceFactory interface object Figure 4: OOO.CLS : Public Routine OOO.connect. This routine will return a XMultiServiceFactory interface object which can be used to create the OOo desktop object and more. For later referral this object will get stored in the.ooo directory under the name remotemsf Public Routine: OOO.getDesktop This routine creates a desktop service object, queries its desktop interface object and returns it. If no context object is supplied as an argument, then the one stored in the.ooo directory is used. The code of this routine is depicted in figure create and return the OOo Desktop interface object ::routine OOo.getDesktop USE ARG remotemsf if remotemsf="" remotemsf=.nil then -- no vaild argument supplied remotemsf=.ooo~remotemsf -- use the one stored by "OOO.connect" -- create the OOo Desktop service object remotedesktop=remotemsf~createinstance("com.sun.star.frame.desktop") -- query and return its desktop interface object return.ooo~unoruntime~queryinterface(.ooo~xdesktop, remotedesktop) Figure 5: OOO.CLS : Public Routine OOO.getDesktop. the class com.sun.star.comp.helper.bootstrap, e.g.: xcontext =.bsf~bsf.import("com.sun.star.comp.helper.bootstrap")~bootstrap Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 11-27
12 2.2.6 Putting the Module OOO.CLS to Work Figure 6 shows the oorexx code that is needed for creating an empty instance of a word processor component, if using the module OOO.CLS. This has exactly the same effect, as the Java transcription to oorexx of figure 1, which was the basis of the analysis and the reason for devising the module OOO.CLS. Therefore one can expect that some code can be saved, nevertheless it is noticeable how much of the original code can be left out. Taking advantage of the module allows the resulting code to become considerably more concise, and by the same token it also becomes easier to read and to understand. /* initialize connection to server, get its Desktop-service and XComponentLoader interface */ xmsfactory=ooo.connect() -- connect to server and retrieve remote multi server factory -- Retrieve the Desktop object, we need its XComponentLoader interface -- to load a new document sdesktop = xmsfactory~createinstance("com.sun.star.frame.desktop") odesktop = sdesktop~xdesktop -- get desktop interface ocomponentloader = odesktop~xcomponentloader -- get componentloader interface /* load an empty text document */ swritercomponent = ocomponentloader~loadcomponentfromurl("private:factory/swriter", "_blank", 0,.OOo~noProps) ::requires OOo.cls -- get OOo support Figure 6: Program of Figure 1 Rewritten, Using the Module OOO.CLS. Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 12-27
13 3 NUTSHELL EXAMPLES The examples in this chapter originate in the work of [Aug05], who created them following the Java examples available in [OOo03], [W3OOoFW] and on the Internet in general. The oorexx examples could be simplified quite considerably in this article by taking advantage of the oorexx module OOO.CLS, making it easier to understand and ext on them. In order to run the examples one needs to have Object REXX or its opensource version Open Object Rexx (oorexx, cf. [W3ooRexx]) and BSF4Rexx (cf. [W3B4R]) installed. In addition the Java classpath needs to point to the OOo Java archives according to the documentation in [OOo03] and the oorexx module OOO.CLS from the appix of this article needs to be accessible 13 by these oorexx programs. As described in section 2.2.4, the public routine OOO.connect of the oorexx module OOO.CLS uses the explicit port number 8,100, so one needs to set up OOo accordingly. Alternatively, one can invoke an instance of OOo via the commandline, instructing it to accept client connections via port 8,100. This can be done by issuing the following command in a commandline window: 14 soffice -accept=socket,host=localhost,port=8100;urp; Most of the OOo nutshell examples of this chapter run unchanged on Windows and Linux. 15 For each nutshell example a brief description is given. 3.1 swriter Nutshell Example # 1 Figure 7 depicts an oorexx nutshell example that creates an empty word processor component and saves that empty document in a Microsoft Word format, such that MS Word users are able to work with that document. This nutshell relates to [Aug05] Example_08.rex. To store a document one needs to acquire the XStorable interface object and use 13 Any Rexx program/module is accessible if it resides in the same directory as the running Rexx program or in a directory denominated in the operating system environment variable PATH. 14 A future implementation of the routine OOO.connect may forgo this need by using the bootstrap() method of the UNO Bootstrap class instead. If so, the ability of being able to connect to an OOo server instance via TCP/IP should be preserved. 15 In this implementation of the oorexx module OOO.CLS fully qualified filenames need to be adjusted to the target platform as the Windows version always contains a drive letter (a letter followed immediately by a colon). Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 13-27
14 /* initialize connection to server, get its Desktop-service and XComponentLoader interface */ xmsf=ooo.connect() -- connect to server and retrieve remote multi server factory -- Retrieve the Desktop object, we need its XComponentLoader interface -- to load a new document odesktop = xmsf~createinstance("com.sun.star.frame.desktop") xdesktop = odesktop~xdesktop -- get desktop interface xcomponentloader = xdesktop~xcomponentloader -- get componentloader interface /* load an empty text document */ xwritercomponent = xcomponentloader~loadcomponentfromurl( - "private:factory/swriter", "_blank", 0,.OOo~noProps) -- Get a "Storable" interface in the context of the Writer application xstorable=xwritercomponent~xstorable -- This time we need to define a property: The filter name storeprops =.bsf~createarray(.ooo~propertyvalue, 1) storeprops[1] =.bsf~new("com.sun.star.beans.propertyvalue") storeprops[1]~bsf.setfieldvalue("name", "FilterName") storeprops[1]~bsf.setfieldvalue("value", "MS Word 97") storeurl = "file:///c:/test.doc" -- Linux/UNIX users change the filename! xstorable~storeasurl(storeurl, storeprops) ::requires OOo.cls -- get OOo support Figure 7: swriter Nutshell Example # 1 (Saving as a MS Word Document). its methods to store it. In this case the method storeasurl is used, which expects as arguments the document s file name in URI form and an array of properties which give additional information about how the storing should be carried out. In this example one property, FilterName, is given with a value of Word 97, causing OOo to store the document in MS Word 97 format. 3.2 swriter Nutshell Example # 2 Figure 8 depicts an oorexx nutshell example that creates an empty word processor component and prints that empty document to a locally installed printer. This nutshell relates to [Aug05] Example_10.rex. To print a document one needs to acquire the XPrintable interface object and use its methods to set the printer and to print the document. In this case the method setprinter is used to determine the printer which should get used by supplying its name in its argument (an array that contains one property element). The method print is used to invoke the print process, which gets the information via the property array to print the first page only! Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 14-27
15 /* initialize connection to server, get its Desktop-service and XComponentLoader interface */ xmsf=ooo.connect() -- connect to server and retrieve remote multi server factory -- Retrieve the Desktop object, we need its XComponentLoader interface -- to load a new document odesktop = xmsf~createinstance("com.sun.star.frame.desktop") xdesktop = odesktop~xdesktop -- get desktop interface xcomponentloader = xdesktop~xcomponentloader -- get componentloader interface /* load an empty text document */ xwritercomponent = xcomponentloader~loadcomponentfromurl( - "private:factory/swriter", "_blank", 0,.OOo~noProps) -- Get a "Printable" interface in the context of the Writer application xprintable=xwritercomponent~xprintable -- We need to define a property: The printer name props =.bsf~createarray(.ooo~propertyvalue, 1) props[1] =.bsf~new("com.sun.star.beans.propertyvalue") -- This is a printer's name as known in your system. props[1]~bsf.setfieldvalue("name", "Name") props[1]~bsf.setfieldvalue("value", "Apple Color LW 12/660 PS on file") xprintable~setprinter(props) -- This prints the (empty) test page props[1]~bsf.setfieldvalue("name", "Pages") props[1]~bsf.setfieldvalue("value", "1") xprintable~print(props); ::requires OOo.cls -- get OOo support Figure 8: swriter Nutshell Example # 2 (Print the First Page of a Document). 3.3 swriter Nutshell Example # 3 Figure 9 depicts an oorexx nutshell example that creates an empty word processor component, changes the style of a paragraph, inserts the current page number into it and finally adds some text at the to it. This nutshell relates to [Aug05] Example_24.rex. This example demonstrates the Model-View-Controller (MVC) paradigm that OOo implements: in order to manipulate the content of a document one needs to get the controller object of the document which can then be used to get the view cursor. A cursor allows addressing certain parts and types of information in a document, in our example we use a view cursor from which a page cursor is requested. Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 15-27
16 /* initialize connection to server, get its Desktop-service and XComponentLoader interface */ xmsf=ooo.connect() -- connect to server and retrieve remote multi server factory -- Retrieve the Desktop object, we need its XComponentLoader interface -- to load a new document odesktop = xmsf~createinstance("com.sun.star.frame.desktop") xdesktop = odesktop~xdesktop -- get desktop interface xcomponentloader = xdesktop~xcomponentloader -- get componentloader interface End of connection header /* load an empty text document */ otextcomponent = xcomponentloader~loadcomponentfromurl( - "private:factory/swriter", "_blank", 0,.OOo~noProps) xdocument=otextcomponent~xtextdocument xtext=xdocument~gettext -- Now we could start writing into the document, for example: xtext~setstring("a few words...") -- In order to set paragraph properties, we need a cursor for navigation. -- A cursor can be retrieved from the controller, the controller comes from the model, -- and the model comes from the component, i.e. the application. xmodel=xdocument~xmodel xcontroller = xmodel~getcurrentcontroller -- Get model from component -- The model knows its controller -- The controller gives us the TextViewCursor, query the ViewCursor supplier interface xviewcursorsupplier=xcontroller~xtextviewcursorsupplier xviewcursor = xviewcursorsupplier~getviewcursor -- Get the ViewCursor -- Set the appropriate property for paragraph style xcursorpropertyset=xviewcursor~xpropertyset xcursorpropertyset~bsf.invokestrict("setpropertyvalue", "STRING", "ParaStyleName", - "STRING", "Quotations") -- Print the current page number we need the XPageCursor interface for this xpagecursor=xviewcursor~xpagecursor -- This is written directly into the open document (see above). xtext~setstring("the current page number is:" xpagecursor~getpage) -- The text creates a model cursor from the viewcursor xmodelcursor = xtext~createtextcursorbyrange(xviewcursor~getstart) -- Now we could query XWordCursor, XSentenceCursor and XParagraphCursor -- or XDocumentInsertable, XSortable or XContentEnumerationAccess -- and work with the properties of com.sun.star.text.textcursor -- In this case we just go to the of the paragraph and add some text. -- Now get a paragraph cursor first. xparagraphcursor=xmodelcursor~xparagraphcursor -- Go to the of the paragraph xparagraphcursor~gotoendofparagraph(.false) xparagraphcursor~setstring(" ***** Fin de semana! ******") ::requires OOo.cls Figure 9: swriter Nutshell Example # 3 (Edit Text in Word Processor Document). Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 16-27
17 3.4 scalc Nutshell Example # 1 Figure 10 depicts an oorexx nutshell example that creates an empty spreadsheet document and adds two entries into it. This nutshell relates to [Aug05] Example_14.rex. From the code it can be seen that a spreadsheet document can be regarded as a collection of sheets. Therefore it is important to address that collection and to pick the sheet one wishes to interact with; in this case a XIndexAccess interface object is created which allows to index its collection with an integer number (index starts with 0). All co-ordinates are 0-based, hence the cell A1 (left top cell) resides in column=0 and row=0. /* initialize connection to server, get its Desktop-service and XComponentLoader interface */ xmsf=ooo.connect() -- connect to server and retrieve remote multi server factory -- Retrieve the Desktop object, we need its XComponentLoader interface -- to load a new document odesktop = xmsf~createinstance("com.sun.star.frame.desktop") xdesktop = odesktop~xdesktop -- get desktop interface xcomponentloader = xdesktop~xcomponentloader -- get componentloader interface /* load an empty text document */ osheetcomponent = xcomponentloader~loadcomponentfromurl( - "private:factory/scalc", "_blank", 0,.OOo~noProps) xdocument=osheetcomponent~xspreadsheetdocument xsheets=xdocument~getsheets xindexsheets=xsheets~xindexaccess xsheet=xindexsheets~getbyindex(0)~xspreadsheet -- get the spreadsheet interface for the sheet -- (1) insert a value (number) call setcell 1, 1, , xsheet, 1 -- (2) insert a text string (formula, text) call setcell 1, 2, "Hello", xsheet, 0 ::requires OOo.cls -- get OOo support -- A function for inserting values or formulas into cells -- Parameters: -- x, y cell coordinates -- content value or formula to insert -- container the spreadsheet or cell range where the cell resides -- isvalue (1 [true] or 0) indicates whether the content should be -- regarded as a number or a character string ::routine setcell use arg x, y, content, container, isvalue ocell = container~getcellbyposition(x, y) if isvalue then ocell~setvalue(content) else ocell~setformula(content) RETURN Figure 10: scalc Nutshell Example # 1 (Enter Values into a Spreadsheet). Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 17-27
18 3.5 scalc Nutshell Example # 2 Figure 11 depicts an oorexx nutshell example that creates an empty spreadsheet document and adds two entries into it. This nutshell relates to [Aug05] Example_18.rex. The program first fills in a few values using the routine setcell, calculates the average of a given area in routine avgnonempty and stores it in the cell with the coordination 0, 3 (i.e. column=0, row=3 ; or: A4 ). 3.6 scalc Nutshell Example # 3 Figure 12 depicts an oorexx nutshell example that creates an empty spreadsheet document, adds entries to it and uses them to create a 3-D diagram. This nutshell relates to [Aug05] Example_22.rex. The program first fills in a few values, then creates a rectangle which will contain the diagram created from the values and finally will turn the shape of the diagram from 2- D to 3-D. Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 18-27
19 /* initialize connection to server, get its Desktop-service and XComponentLoader interface */ xmsf=ooo.connect() -- connect to server and retrieve remote multi server factory -- Retrieve the Desktop object, we need its XComponentLoader interface -- to load a new document odesktop = xmsf~createinstance("com.sun.star.frame.desktop") xdesktop = odesktop~xdesktop -- get desktop interface xcomponentloader = xdesktop~xcomponentloader -- get componentloader interface /* load an empty text document */ osheetcomponent = xcomponentloader~loadcomponentfromurl( - "private:factory/scalc", "_blank", 0,.OOo~noProps) xdocument=osheetcomponent~xspreadsheetdocument xsheets=xdocument~getsheets xindexsheets=xsheets~xindexaccess xsheet=xindexsheets~getbyindex(0)~xspreadsheet -- get the spreadsheet interface for the sheet -- (1) setcell dummy data call setcell 0, 0, 5.2, xsheet, 1 call setcell 0, 2, 2.3, xsheet, 1 -- (2) Calculate and print average result = avgnonempty(0, 0, 0, 2, xsheet) call setcell 0, 3, result, xsheet, 1 -- (3) setcell some labels call setcell 1, 1, "<- Remains empty", xsheet, 0 call setcell 1, 3, "<- The average", xsheet, 0 ::requires OOo.cls -- get OOo support -- A function for inserting values or formulas into cells -- Parameters: -- x, y cell coordinates -- content value or formula to insert -- container the spreadsheet or cell range where the cell resides -- isvalue (1 [true] or 0) indicates whether the content should be -- regarded as a number or a character string ::routine setcell use arg x, y, content, container, isvalue ocell = container~getcellbyposition(x, y) if isvalue then ocell~setvalue(content) else ocell~setformula(content) return -- A function to calculate the average not considering empty fields ::routine avgnonempty use arg fromx, fromy, tox, toy, container sum = 0 fieldcount = 0 do i=fromx to tox do j=fromy to toy currentvalue = container~getcellbyposition(i, j) ~getvalue if currentvalue <> 0 then do sum = sum + currentvalue fieldcount = fieldcount + 1 if fieldcount > 0 then return (sum/fieldcount) return 0 Figure 11: scalc Nutshell Example # 2 (Enter and Retrieve Spreadsheet Values). Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 19-27
20 /* initialize connection to server, get its Desktop-service and XComponentLoader interface */ xmsf=ooo.connect() -- connect to server and retrieve remote multi server factory -- Retrieve the Desktop object, we need its XComponentLoader interface -- to load a new document odesktop = xmsf~createinstance("com.sun.star.frame.desktop") xdesktop = odesktop~xdesktop -- get desktop interface xcomponentloader = xdesktop~xcomponentloader -- get componentloader interface /* load an empty text document */ osheetcomponent = xcomponentloader~loadcomponentfromurl( - "private:factory/scalc", "_blank", 0,.OOo~noProps) xdocument=osheetcomponent~xspreadsheetdocument xsheets=xdocument~getsheets xindexsheets=xsheets~xindexaccess xsheet=xindexsheets~getbyindex(0)~xspreadsheet -- get the spreadsheet interface for the sheet -- As a prerequisite, we populate the spreadsheet with some numeric values: do i=0 to 4 do j=0 to 3 call setcell i, j, i+j, xsheet, 1 -- First create the elements the chart consists of: -- (1) a frame (made from the Rectangle class) orect =.bsf~new("com.sun.star.awt.rectangle") orect~bsf.setfieldvalue("x", 500) orect~bsf.setfieldvalue("y", 3000) orect~bsf.setfieldvalue("width", 25000) orect~bsf.setfieldvalue("height", 11000) -- (2) the underlying data (the numeric values come from a cell range) myrange=xsheet~xcellrange ~getcellrangebyname("a1:e4") -- Get the address of the underlying data (in our case a cell range) myaddr=myrange~xcellrangeaddressable ~getrangeaddress cellrangeaddressname =.bsf4rexx~class.class~forname("com.sun.star.table.cellrangeaddress") oaddr =.bsf~createarray(cellrangeaddressname, 1) oaddr[1] = myaddr -- Now get the chart collection from the Sheet's charts supplier and add a new chart -- Get the supplier and its charts ocharts=xsheet~xtablechartssupplier ~getcharts -- App a new chart to the collection ocharts~addnewbyname("example", orect, oaddr, "true", "true") -- change diagram properties: 2-D to 3-D ochart=ocharts~xnameaccess ~getbyname("example") xchart=ochart~xtablechart oemb=xchart~xembeddedobjectsupplier ~getembeddedobject odiag=oemb~xchartdocument ~getdiagram odiag~xpropertyset ~setpropertyvalue("dim3d",.bsf~new("java.lang.boolean", "true")) ::requires OOo.cls -- get OOo support ::routine setcell use arg x, y, content, container, isvalue ocell = container~getcellbyposition(x, y) if isvalue then ocell~setvalue(content) else ocell~setformula(content) return Figure 12: scalc Nutshell Example # 3 (Enter Spreadsheet Values, Create Diagram). Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 20-27
21 4 SUMMARY AND OUTLOOK This article introduced the reader to developing and employing a new oorexx module, OOo.cls, which is inted at easying the programming of OpenOffice.org (OOo) from oorexx in a portable manner. As a starting point the oorexx nutshell examples modeled after Java and JavaScript in [Aug05] served as a study object to find out code sequences that are either repetitive (e.g. the initialization of UNO components) or which state a recurrent pattern (e.g. the need for carrying out queryinterface-invocations on UNO service objects). The effects of employing OOo.cls were demonstrated by rewriting an original [Aug05] example (cf. figure 1), which was modeled after Java examples given by OOo code repository sites (e.g. [W3OOoAPI]), yielding the oorexx program as depicted in figure 6. After this proof-of-concept a few nutshell examples which demonstrate the interaction with the word processor ( swriter ) and the spreadsheet ( scalc ) component of OOo are given. These nutshells are inted as starting points to help the reader understand the necessary steps to take in order to be able to drive OOo. As the support is realized via the Java interfaces of the UNO components (cf. [OOo03]) which constitute OOo (cf. [Flat05]), it is necessary to use the BSF4Rexx (cf. [Flat04]) package, which allows oorexx to almost transparently address Java. This BSF4Rexx support can be further improved, e.g. by supplying box and unbox routines that will create from primitive datatypes Java objects instantiating their appropriate Java class and vice-versa. Also, being able to query and set Java fields by merely sing the field names to the Java object proxies (as is the case with oorexx object attributes) would ease programming quite a bit. Finally, the support for the interface classes in OOo.cls needs to be replenished. It may be possible upon further research to take advantage of Java and UNO reflection to transparently handle the querying of interface classes dynamically at runtime. Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 21-27
22 5 REFERENCES [Aug05] Augustin A.: Examples for Open Office Automation with Scripting Languages, Bachelor course paper, Wirtschaftsuniversität Wien, January [Ende97] Ender T.: "Object-Oriented Programming with REXX", John Wiley & Sons, New York et.al [Flat01] [Flat03] [Flat04] [Flat05] Flatscher R.G.: "Java Bean Scripting with Rexx", in: Proceedings of the 12 th International Rexx Symposium, Raleigh, North Carolina, USA, April 30 th - May 2 nd, Flatscher R.G.: The Augsburg Version of BSF4Rexx, in: Proceedings of the 14 th International Rexx Symposium, Raleigh, North Carolina, USA, May 5 th - May 7 th, Flatscher R.G.: Camouflaging Java as Object REXX, in: Proceedings of the 2004 International Rexx Symposium, Böblingen, Germany, May 3 rd - May 6 th, Flatscher R.G.: Automating OpenOffice with oorexx: Architecture, Gluing to Rexx Using BSF4Rexx, in: Proceedings of the The 2005 International Rexx Symposium, Los Angeles, California, U.S.A., April 17 th - April 21 st, [OOo03] N.N.: OpenOffice.org Developer s Guide, PDF download from [W3OOo], June [Pit04] Pitonyak A.: OpenOffice.org Macros Explained, Hetzenwerke Publishing, Whitefish Bay [VeTrUr96] Veneskey G., Trosky W., Urbaniak J.: "Object Rexx by Example", Aviar, Pittsburgh [W3BSF] Homepage of Apaches Bean Scripting Framework (BSF), URL ( ): [W3B4R] Beta test and release candidate site of the BSF4Rexx package, URL( ): [W3ObjRexx] Open Object Rexx homepage, URL ( ): Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 22-27
23 [W3OOo] OpenOffice.org homepage, URL ( ): [W3OOoAPI] OpenOffice.org API Homepage, URL ( ): [W3OOoFW] OpenOffice.org Framework Homepage with Links to Scripting, URL ( ): [W3OOoUDK] OpenOffice.org UDK (UNO development kit) homepage, URL ( ): [W3ooRexx] Homepage of Open Object Rexx (oorexx), URL ( ): [W3RexxLA] Homepage of the Rexx Language Association, URL ( ): Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 23-27
24 APPENDIX A Full listing of the oorexx module OOo.CLS. /* */ author: Rony G. Flatscher date: /19/20 version: name: OOo.cls purpose: ease interfacing with OpenOffice.org, v1.1.x and up needs: BSF4Rexx -- if no environment entry, then create the entry with default classes if.local~hasentry("ooo")=.false then do.local~ooo=.directory~new -- create a new directory object and store it in.local -- preload classes l =.list~of( - "com.sun.star.beans.propertyvalue", - "com.sun.star.comp.helper.bootstrap", - "com.sun.star.uno.anyconverter", - "com.sun.star.uno.unoruntime" - ) do c over l -- get Java class object and save it in.ooo call OOo.loadClass c.ooo~noprops=.bsf~createarray(.ooo~propertyvalue, 0) -- create empty array of property-value -- list of Interface classes to be loaded at runtime (needs completion) l =.list~of( - "com.sun.star.beans.xintrospectionaccess", - "com.sun.star.beans.xmultipropertyset", - "com.sun.star.beans.xpropertyset", - "com.sun.star.bridge.xunourlresolver", - "com.sun.star.container.xenumeration", - "com.sun.star.container.xindexaccess", - "com.sun.star.container.xindexcontainer", - "com.sun.star.container.xnameaccess", - "com.sun.star.container.xnamecontainer", - "com.sun.star.container.xnamed", - "com.sun.star.chart.xchartdocument", - "com.sun.star.document.xembeddedobjectsupplier", - "com.sun.star.drawing.xdrawpage", - "com.sun.star.drawing.xdrawpagessupplier", - "com.sun.star.drawing.xshape", - "com.sun.star.drawing.xshapes", - "com.sun.star.frame.xcomponentloader", - "com.sun.star.frame.xcontroller", - "com.sun.star.frame.xdesktop", - "com.sun.star.frame.xframe", - "com.sun.star.frame.xframessupplier", - "com.sun.star.frame.xmodel", - "com.sun.star.frame.xstorable", - "com.sun.star.lang.xcomponent", - "com.sun.star.lang.xmulticomponentfactory", - "com.sun.star.lang.xmultiservicefactory", - "com.sun.star.lang.xserviceinfo", - "com.sun.star.lang.xsingleservicefactory", - "com.sun.star.lang.xtypeprovider", - "com.sun.star.presentation.xpresentationsupplier", - "com.sun.star.script.xtypeconverter", - "com.sun.star.sheet.xcellrangeaddressable", - "com.sun.star.sheet.xcellrangesquery", - "com.sun.star.sheet.xspreadsheet", - "com.sun.star.sheet.xspreadsheetdocument", - "com.sun.star.sheet.xspreadsheetview", - "com.sun.star.sheet.xspreadsheets", - "com.sun.star.style.xstylefamiliessupplier", - Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 24-27
25 "com.sun.star.table.xcell", - "com.sun.star.table.xcellrange", - "com.sun.star.table.xtablechart", - "com.sun.star.table.xtablechartssupplier", - "com.sun.star.text.xpagecursor", - "com.sun.star.text.xparagraphcursor", - "com.sun.star.text.xsentencecursor", - "com.sun.star.text.xtext", - "com.sun.star.text.xtextcontent", - "com.sun.star.text.xtextcursor", - "com.sun.star.text.xtextdocument", - "com.sun.star.text.xtextrange", - "com.sun.star.text.xtextviewcursorsupplier", - "com.sun.star.text.xwordcursor", - "com.sun.star.uno.xcomponentcontext", - "com.sun.star.uno.xnamingservice", - "com.sun.star.uno.xinterface", - "com.sun.star.util.xmodifiable", - "com.sun.star.util.xrefreshable", - "com.sun.star.util.xsearchable", - "com.sun.star.view.xprintable" - ) -- save interface class names with which we want to deal d=.directory~new do i over l idx=substr(i, lastpos(".", i)+1) d~setentry(i, i) -- by fully qualified name d~setentry(idx, i) -- by last word.ooo~xinterfaces = d -- save directory ::requires "BSF.cls" -- get BSF4Rexx support -- load OOo-class and save it in environment ::routine OOo.loadClass public parse arg classname, idx if idx="" then idx=substr(classname, lastpos(".", classname)+1) -- extract last word to serve as index if.ooo~hasentry(idx)=.true then -- e.g. last word is used as a class in a another package as well.error~say("ooo.loadclass:" pp(idx) "already used, in hand:" pp(classname) "in.ooo:" pp(.ooo~entry(idx) -- say "classname="classname "idx="idx tmpclass=.ooo_proxy~new(.bsf4rexx~class.class~forname(classname)) -- wrap it up.ooo~setentry(idx, tmpclass) -- load the given Java class and save it in.ooo return tmpclass -- connects to given UNO server, returns the XMultiServiceFactory interface object of the remote service m ::routine OOo.connect public parse arg unourl -- no unourl given, use default if unourl="" then unourl="uno:socket,host=localhost,port=8100;urp;staroffice.namingservice" context=.ooo~bootstrap~createinitialcomponentcontext(.nil) uur= context~getservicemanager() ~createinstancewithcontext("com.sun.star.bridge.unourlresolver", context) remoteobject = uur~xunourlresolver ~resolve(unourl) remotenamingservice = remoteobject~xnamingservice remoteservicemanager=remotenamingservice~getregisteredobject("staroffice.servicemanager") remotemsf = remoteservicemanager~xmultiservicefactory if.ooo~hasentry("remotemsf")=.false then.ooo~remotemsf=remotemsf -- save remote MultiServiceFactory return remotemsf -- return the remote XMultiServiceFactory Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 25-27
26 -- get and return the XDesktop interface object ::routine OOo.getDesktop USE ARG remotemsf if remotemsf="" remotemsf=.nil then remotemsf=.ooo~remotemsf -- use the stored remote MultiServiceFactory remotedesktop=remotemsf~createinstance("com.sun.star.frame.desktop") -- return the XDesktop interface of the remote desktop return.ooo~unoruntime~queryinterface(.ooo~xdesktop, remotedesktop) ::routine iif public if arg(1)=.true then return arg(2) else return arg(3) /* ************************************************************* Class: OOo_PROXY Purpose: allows to wrap up Java objects as Object Rexx objects; if instances are destroyed, then no derigstration from the BSF registry takes place restriction: needed to make getting interface objects easier ************************************************************* */ ::CLASS OOo_PROXY -- subclass BSF PUBLIC ::Method bsfobject ATTRIBUTE ::METHOD init expose arg bsfobject -- direct access to BSF object use arg bsfobject -- assign object to attribute self~objectname=bsfobject~objectname -- use same objectname as BSF proxy (= idx into BSF-registry) ::METHOD unknown expose arg bsfobject -- direct access to BSF object parse arg xname if xname~left(1)~translate="x" then -- if an interface object is asked for, query and return it do xclass=.ooo~entry(xname)-- try to get interface class object if xclass=.nil then -- no entry as of yet do idx=substr(xname, lastpos(".", xname)+1) xclass=ooo.loadclass(.ooo~xinterfaces~entry(xname), idx) -- query and return the interface object return.ooo_proxy~new(.ooo~unoruntime~queryinterface(xclass, bsfobject)) else -- pass to super class (i.e. BSF) to handle it do if bsfobject~hasmethod(xname) then -- o.k. it's a BSF method FORWARD TO (bsfobject) MESSAGE (xname) ARGUMENTS (arg(2)) else FORWARD TO (bsfobject) CONTINUE -- let BSF handle this tmpobj=result -- if a BSF-object, wrap it up if tmpobj~hasmethod("bsf.setfieldvalue") then return.ooo_proxy~new(tmpobj) else return tmpobj Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 26-27
27 Date (latest version) of Article: Published in: Proceedings of the 2005 International Rexx Symposium, Los Angeles, California, U.S.A., April 18 th - April 21 st, 2005, The Rexx Language Association, Raleigh N.C., Presented at: 2005 International Rexx Symposium, Los Angeles, California, U.S.A., April 20 th, Automating OpenOffice.org with oorexx: oorexx Nutshell Examples for Write and Calc, page 27-27
D-Bus Language Bindings for oorexx
Institut für Betriebswirtschaftslehre und Wirtschaftsinformatik D-Bus Language Bindings for oorexx The 2011 International Rexx Symposium Rony G. Flatscher Wirtschaftsuniversität Wien Augasse 2-6 A-1090
Implementing Rexx Handlers in NetRexx/Java/Rexx
Institut für Betriebswirtschaftslehre und Wirtschaftsinformatik Implementing Rexx Handlers in NetRexx/Java/Rexx The 2012 International Rexx Symposium Rony G. Flatscher Wirtschaftsuniversität Wien Augasse
Eskills360 0 - Desktop Courses
Eskills360 Desktop DESKTOP COMPUTER SKILLS Adobe Adobe Flash CS5 Introduction to Adobe Flash Professional CS5 Drawing and Working with Images in Flash CS5 Using Flash CS5 Libraries, Text, and Components
OpenOffice.org Writer
OOoRegiCon North America Technical Writing using OpenOffice.org Writer Jean Hollis Weber Jean Hollis Weber Community Volunteer - Slide 1 Why OOo for Techwriting? Combines best features of MS Word and FrameMaker
FileMaker Pro and Microsoft Office Integration
FileMaker Pro and Microsoft Office Integration page Table of Contents Executive Summary...3 Introduction...3 Top Reasons to Read This Guide...3 Before You Get Started...4 Downloading the FileMaker Trial
How To Run A Test File Extension On A Rexx 4.1.1 (Unix) 4.2.1 On A Microsoft Linux 4.3.2 (Amd64) (Orchestra) (For Windows) (
Institut für Betriebswirtschaftslehre und Wirtschaftsinformatik Configuring Rexx Interpreter Instances from NetRexx/Java The 2012 International Rexx Symposium Rony G. Flatscher Wirtschaftsuniversität Wien
Calc Guide Chapter 9 Data Analysis
Calc Guide Chapter 9 Data Analysis Using Scenarios, Goal Seek, Solver, others Copyright This document is Copyright 2007 2011 by its contributors as listed below. You may distribute it and/or modify it
Microsoft Windows PowerShell v2 For Administrators
Course 50414B: Microsoft Windows PowerShell v2 For Administrators Course Details Course Outline Module 1: Introduction to PowerShell the Basics This module explains how to install and configure PowerShell.
FileMaker 11. ODBC and JDBC Guide
FileMaker 11 ODBC and JDBC Guide 2004 2010 FileMaker, Inc. All Rights Reserved. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker is a trademark of FileMaker, Inc. registered
TechTips. Connecting Xcelsius Dashboards to External Data Sources using: Web Services (Dynamic Web Query)
TechTips Connecting Xcelsius Dashboards to External Data Sources using: Web Services (Dynamic Web Query) A step-by-step guide to connecting Xcelsius Enterprise XE dashboards to company databases using
New Features in BSF4ooRexx (Camouflaging Java as oorexx) http://sourceforge.net/projects/bsf4oorexx/files/
Institut für Betriebswirtschaftslehre und Wirtschaftsinformatik New Features in BSF4ooRexx (Camouflaging Java as oorexx) http://sourceforge.net/projects/bsf4oorexx/files/ The 2015 International Rexx Symposium
DataPA OpenAnalytics End User Training
DataPA OpenAnalytics End User Training DataPA End User Training Lesson 1 Course Overview DataPA Chapter 1 Course Overview Introduction This course covers the skills required to use DataPA OpenAnalytics
An Introduction to Procedural and Object-oriented Programming (Object Rexx) 8 "Automating Windows and Windows Applications"
MIS Department An Introduction to Procedural and Object-oriented Programming (Object Rexx) 8 "Automating Windows and Windows Applications" Windows Script Host (WSH), Windows Script Engine (WSE), Windows
Projektseminar aus Wirtschaftsinformatik
Projektseminar aus Wirtschaftsinformatik Creation and Installation of BSF4ooRexx on MacOSX Seminararbeit 26.01.2011 Jürgen Hesse Manuel Paar Table of contents 1 Introduction... 4 1.1 oorexx... 4 1.2 BSF4ooRexx...
Ansur Test Executive. Users Manual
Ansur Test Executive Users Manual April 2008 2008 Fluke Corporation, All rights reserved. All product names are trademarks of their respective companies Table of Contents 1 Introducing Ansur... 4 1.1 About
SyncTool for InterSystems Caché and Ensemble.
SyncTool for InterSystems Caché and Ensemble. Table of contents Introduction...4 Definitions...4 System requirements...4 Installation...5 How to use SyncTool...5 Configuration...5 Example for Group objects
The 2014 Edition of BSF4ooRexx (for Windows, Linux, MacOSX) http://sourceforge.net/projects/bsf4oorexx/files/
Institut für Betriebswirtschaftslehre und Wirtschaftsinformatik The 2014 Edition of BSF4ooRexx (for Windows, Linux, MacOSX) http://sourceforge.net/projects/bsf4oorexx/files/ The 2014 International Rexx
DESKTOP COMPUTER SKILLS
1 Desktop Computer Skills Price List DESKTOP COMPUTER SKILLS Microsoft Office 2010 Microsoft Office 2010: New Features Please note all prices exclude VAT Approx. Learning Hours: 3 Price: 45 Office 2010
How To Write A Macro In Libreoffice 2.2.2 (Free) With Libre Office 2.3.2 And Libreos 2.4.2 With A Microspat
Getting Started Guide Chapter 13 Getting Started with Macros Using the Macro Recorder and Beyond Copyright This document is Copyright 2010 2012 by its contributors as listed below. You may distribute it
INTRODUCTION TO OBJECTIVE-C CSCI 4448/5448: OBJECT-ORIENTED ANALYSIS & DESIGN LECTURE 12 09/29/2011
INTRODUCTION TO OBJECTIVE-C CSCI 4448/5448: OBJECT-ORIENTED ANALYSIS & DESIGN LECTURE 12 09/29/2011 1 Goals of the Lecture Present an introduction to Objective-C 2.0 Coverage of the language will be INCOMPLETE
Release 2.1 of SAS Add-In for Microsoft Office Bringing Microsoft PowerPoint into the Mix ABSTRACT INTRODUCTION Data Access
Release 2.1 of SAS Add-In for Microsoft Office Bringing Microsoft PowerPoint into the Mix Jennifer Clegg, SAS Institute Inc., Cary, NC Eric Hill, SAS Institute Inc., Cary, NC ABSTRACT Release 2.1 of SAS
Extending Desktop Applications to the Web
Extending Desktop Applications to the Web Arno Puder San Francisco State University Computer Science Department 1600 Holloway Avenue San Francisco, CA 94132 [email protected] Abstract. Web applications have
MicroStrategy Desktop
MicroStrategy Desktop Quick Start Guide MicroStrategy Desktop is designed to enable business professionals like you to explore data, simply and without needing direct support from IT. 1 Import data from
Differences in Use between Calc and Excel
Differences in Use between Calc and Excel Title: Differences in Use between Calc and Excel: Version: 1.0 First edition: October 2004 Contents Overview... 3 Copyright and trademark information... 3 Feedback...3
Importing TSM Data into Microsoft Excel using Microsoft Query
Importing TSM Data into Microsoft Excel using Microsoft Query An alternate way to report on TSM information is to use Microsoft Excel s import facilities using Microsoft Query to selectively import the
CLC Server Command Line Tools USER MANUAL
CLC Server Command Line Tools USER MANUAL Manual for CLC Server Command Line Tools 2.5 Windows, Mac OS X and Linux September 4, 2015 This software is for research purposes only. QIAGEN Aarhus A/S Silkeborgvej
ABSTRACT INTRODUCTION CLINICAL PROJECT TRACKER OF SAS TASKS. Paper PH-02-2015
Paper PH-02-2015 Project Management of SAS Tasks - Excel Dashboard without Using Any Program Kalaivani Raghunathan, Quartesian Clinical Research Pvt. Ltd, Bangalore, India ABSTRACT Have you ever imagined
MS Access Lab 2. Topic: Tables
MS Access Lab 2 Topic: Tables Summary Introduction: Tables, Start to build a new database Creating Tables: Datasheet View, Design View Working with Data: Sorting, Filtering Help on Tables Introduction
Integrating IBM Cognos 8 BI with 3rd Party Auhtentication Proxies
Guideline Integrating IBM Cognos 8 BI with 3rd Party Auhtentication Proxies Product(s): IBM Cognos 8 BI Area of Interest: Security Integrating IBM Cognos 8 BI with 3rd Party Auhtentication Proxies 2 Copyright
Pulse Secure Client. Customization Developer Guide. Product Release 5.1. Document Revision 1.0. Published: 2015-02-10
Pulse Secure Client Customization Developer Guide Product Release 5.1 Document Revision 1.0 Published: 2015-02-10 Pulse Secure, LLC 2700 Zanker Road, Suite 200 San Jose, CA 95134 http://www.pulsesecure.net
How to use PDFlib products with PHP
How to use PDFlib products with PHP Last change: July 13, 2011 Latest PDFlib version covered in this document: 8.0.3 Latest version of this document available at: www.pdflib.com/developer/technical-documentation
Abstract. For notes detailing the changes in each release, see the MySQL for Excel Release Notes. For legal information, see the Legal Notices.
MySQL for Excel Abstract This is the MySQL for Excel Reference Manual. It documents MySQL for Excel 1.3 through 1.3.6. Much of the documentation also applies to the previous 1.2 series. For notes detailing
Sample- for evaluation only. Advanced Excel. TeachUcomp, Inc. A Presentation of TeachUcomp Incorporated. Copyright TeachUcomp, Inc.
A Presentation of TeachUcomp Incorporated. Copyright TeachUcomp, Inc. 2010 Advanced Excel TeachUcomp, Inc. it s all about you Copyright: Copyright 2010 by TeachUcomp, Inc. All rights reserved. This publication,
Centricity EMR 9.8.6. Who should read these release notes? !!! Important! The installation process for this release has.
GE Healthcare Centricity EMR 9.8.6 Release Notes Contents What's new in EMR 9.8.6?... 2 Upgrade considerations... 6 Install the release... 7 Subscribe to Centricity Services mailing lists... 8 Who should
Writer Guide. Chapter 15 Using Forms in Writer
Writer Guide Chapter 15 Using Forms in Writer Copyright This document is Copyright 2005 2008 by its contributors as listed in the section titled Authors. You may distribute it and/or modify it under the
BarTender s ActiveX Automation Interface. The World's Leading Software for Label, Barcode, RFID & Card Printing
The World's Leading Software for Label, Barcode, RFID & Card Printing White Paper BarTender s ActiveX Automation Interface Controlling BarTender using Programming Languages not in the.net Family Contents
Topics. Introduction. Java History CS 146. Introduction to Programming and Algorithms Module 1. Module Objectives
Introduction to Programming and Algorithms Module 1 CS 146 Sam Houston State University Dr. Tim McGuire Module Objectives To understand: the necessity of programming, differences between hardware and software,
Search help. More on Office.com: images templates
Page 1 of 14 Access 2010 Home > Access 2010 Help and How-to > Getting started Search help More on Office.com: images templates Access 2010: database tasks Here are some basic database tasks that you can
ACCESS 2007. Importing and Exporting Data Files. Information Technology. MS Access 2007 Users Guide. IT Training & Development (818) 677-1700
Information Technology MS Access 2007 Users Guide ACCESS 2007 Importing and Exporting Data Files IT Training & Development (818) 677-1700 [email protected] TABLE OF CONTENTS Introduction... 1 Import Excel
FileMaker 12. ODBC and JDBC Guide
FileMaker 12 ODBC and JDBC Guide 2004 2012 FileMaker, Inc. All Rights Reserved. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker and Bento are trademarks of FileMaker, Inc.
Moving from CS 61A Scheme to CS 61B Java
Moving from CS 61A Scheme to CS 61B Java Introduction Java is an object-oriented language. This document describes some of the differences between object-oriented programming in Scheme (which we hope you
Release Document Version: 1.4-2013-05-30. User Guide: SAP BusinessObjects Analysis, edition for Microsoft Office
Release Document Version: 1.4-2013-05-30 User Guide: SAP BusinessObjects Analysis, edition for Microsoft Office Table of Contents 1 About this guide....6 1.1 Who should read this guide?....6 1.2 User profiles....6
Integrated Open-Source Geophysical Processing and Visualization
Integrated Open-Source Geophysical Processing and Visualization Glenn Chubak* University of Saskatchewan, Saskatoon, Saskatchewan, Canada [email protected] and Igor Morozov University of Saskatchewan,
FileMaker 14. ODBC and JDBC Guide
FileMaker 14 ODBC and JDBC Guide 2004 2015 FileMaker, Inc. All Rights Reserved. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker and FileMaker Go are trademarks of FileMaker,
Java Application Developer Certificate Program Competencies
Java Application Developer Certificate Program Competencies After completing the following units, you will be able to: Basic Programming Logic Explain the steps involved in the program development cycle
DiskPulse DISK CHANGE MONITOR
DiskPulse DISK CHANGE MONITOR User Manual Version 7.9 Oct 2015 www.diskpulse.com [email protected] 1 1 DiskPulse Overview...3 2 DiskPulse Product Versions...5 3 Using Desktop Product Version...6 3.1 Product
BarTender Integration Methods. Integrating BarTender s Printing and Design Functionality with Your Custom Application WHITE PAPER
BarTender Integration Methods Integrating BarTender s Printing and Design Functionality with Your Custom Application WHITE PAPER Contents Introduction 3 Integrating with External Data 4 Importing Data
3F6 - Software Engineering and Design. Handout 10 Distributed Systems I With Markup. Steve Young
3F6 - Software Engineering and Design Handout 10 Distributed Systems I With Markup Steve Young Contents 1. Distributed systems 2. Client-server architecture 3. CORBA 4. Interface Definition Language (IDL)
VOL. 2, NO. 1, January 2012 ISSN 2225-7217 ARPN Journal of Science and Technology 2010-2012 ARPN Journals. All rights reserved
Mobile Application for News and Interactive Services L. Ashwin Kumar Department of Information Technology, JNTU, Hyderabad, India [email protected] ABSTRACT In this paper, we describe the design and
Introduction to Microsoft Access 2003
Introduction to Microsoft Access 2003 Zhi Liu School of Information Fall/2006 Introduction and Objectives Microsoft Access 2003 is a powerful, yet easy to learn, relational database application for Microsoft
Integrating VoltDB with Hadoop
The NewSQL database you ll never outgrow Integrating with Hadoop Hadoop is an open source framework for managing and manipulating massive volumes of data. is an database for handling high velocity data.
Web Presentation Layer Architecture
Chapter 4 Web Presentation Layer Architecture In this chapter we provide a discussion of important current approaches to web interface programming based on the Model 2 architecture [59]. From the results
Oracle Universal Content Management 10.1.3
Date: 2007/04/16-10.1.3 Oracle Universal Content Management 10.1.3 Document Management Quick Start Tutorial Oracle Universal Content Management 10.1.3 Document Management Quick Start Guide Page 1 Contents
Sisense. Product Highlights. www.sisense.com
Sisense Product Highlights Introduction Sisense is a business intelligence solution that simplifies analytics for complex data by offering an end-to-end platform that lets users easily prepare and analyze
FileMaker 13. ODBC and JDBC Guide
FileMaker 13 ODBC and JDBC Guide 2004 2013 FileMaker, Inc. All Rights Reserved. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker and Bento are trademarks of FileMaker, Inc.
Witango Application Server 6. Installation Guide for OS X
Witango Application Server 6 Installation Guide for OS X January 2011 Tronics Software LLC 503 Mountain Ave. Gillette, NJ 07933 USA Telephone: (570) 647 4370 Email: [email protected] Web: www.witango.com
Microsoft Office Word 2010: Level 1
Microsoft Office Word 2010: Level 1 Workshop Objectives: In this workshop, you will learn fundamental Word 2010 skills. You will start by getting acquainted with the Word user interface, creating a new
Microsoft Office Access 2007 which I refer to as Access throughout this book
Chapter 1 Getting Started with Access In This Chapter What is a database? Opening Access Checking out the Access interface Exploring Office Online Finding help on Access topics Microsoft Office Access
CE 504 Computational Hydrology Computational Environments and Tools Fritz R. Fiedler
CE 504 Computational Hydrology Computational Environments and Tools Fritz R. Fiedler 1) Operating systems a) Windows b) Unix and Linux c) Macintosh 2) Data manipulation tools a) Text Editors b) Spreadsheets
E-mail Listeners. E-mail Formats. Free Form. Formatted
E-mail Listeners 6 E-mail Formats You use the E-mail Listeners application to receive and process Service Requests and other types of tickets through e-mail in the form of e-mail messages. Using E- mail
from Microsoft Office
OOoCon 2003 Migrating from Microsoft Office to OpenOffice.org/StarOffice by Frank Gamerdinger [email protected] 1 Who needs migration? OpenOffice.org & StarOffice - only the brave!(?) 2 Agenda
IMPLEMENTATION OF AN AGENT MONITORING SYSTEM IN A JINI ENVIRONMENT WITH RESTRICTED USER ACCESS
IMPLEMENTATION OF AN AGENT MONITORING SYSTEM IN A JINI ENVIRONMENT WITH RESTRICTED USER ACCESS Marietta A. Gittens (Dr. Sadanand Srivastava, Dr. James Gil De Lamadrid) {mgittens, ssrivas, gildelam}@cs.bowiestate.edu
Lab 2: MS ACCESS Tables
Lab 2: MS ACCESS Tables Summary Introduction to Tables and How to Build a New Database Creating Tables in Datasheet View and Design View Working with Data on Sorting and Filtering 1. Introduction Creating
Chapter 15 Using Forms in Writer
Writer Guide Chapter 15 Using Forms in Writer OpenOffice.org Copyright This document is Copyright 2005 2006 by its contributors as listed in the section titled Authors. You can distribute it and/or modify
An Oracle White Paper May 2013. Creating Custom PDF Reports with Oracle Application Express and the APEX Listener
An Oracle White Paper May 2013 Creating Custom PDF Reports with Oracle Application Express and the APEX Listener Disclaimer The following is intended to outline our general product direction. It is intended
A Scheme for Automation of Telecom Data Processing for Business Application
A Scheme for Automation of Telecom Data Processing for Business Application 1 T.R.Gopalakrishnan Nair, 2 Vithal. J. Sampagar, 3 Suma V, 4 Ezhilarasan Maharajan 1, 3 Research and Industry Incubation Center,
dbusoorexx Bringing the Power of D-Bus to Your Fingertips
Institut für Betriebswirtschaftslehre und Wirtschaftsinformatik dbusoorexx Bringing the Power of D-Bus to Your Fingertips LinuxCon Europe 2015, Dublin October 6 th, 2015 Rony G. Flatscher Wirtschaftsuniversität
OX Spreadsheet Product Guide
OX Spreadsheet Product Guide Open-Xchange February 2014 2014 Copyright Open-Xchange Inc. OX Spreadsheet Product Guide This document is the intellectual property of Open-Xchange Inc. The document may be
InfoView User s Guide. BusinessObjects Enterprise XI Release 2
BusinessObjects Enterprise XI Release 2 InfoView User s Guide BusinessObjects Enterprise XI Release 2 Patents Trademarks Copyright Third-party contributors Business Objects owns the following U.S. patents,
PHP Integration Kit. Version 2.5.1. User Guide
PHP Integration Kit Version 2.5.1 User Guide 2012 Ping Identity Corporation. All rights reserved. PingFederate PHP Integration Kit User Guide Version 2.5.1 December, 2012 Ping Identity Corporation 1001
EMC Documentum Composer
EMC Documentum Composer Version 6.5 User Guide P/N 300 007 217 A02 EMC Corporation Corporate Headquarters: Hopkinton, MA 01748 9103 1 508 435 1000 www.emc.com Copyright 2008 EMC Corporation. All rights
Log Analysis Software Architecture
Log Analysis Software Architecture Contents 1 Introduction 1 2 Definitions 2 3 Software goals 2 4 Requirements 2 4.1 User interaction.......................................... 3 4.2 Log file reading..........................................
IBM Operational Decision Manager Version 8 Release 5. Getting Started with Business Rules
IBM Operational Decision Manager Version 8 Release 5 Getting Started with Business Rules Note Before using this information and the product it supports, read the information in Notices on page 43. This
Microsoft Access 2007
How to Use: Microsoft Access 2007 Microsoft Office Access is a powerful tool used to create and format databases. Databases allow information to be organized in rows and tables, where queries can be formed
LMS Evaluation Tool User Guide
LMS Evaluation Tool User Guide August 2004 CC-BY-SA 3waynet Inc. and the Commonwealth of Learning LMS Evaluation Tool User Guide: Issue 1.2 ii Table of Contents 1. Introduction...1 2. General Overview...2
FREQUENTLY ASKED QUESTIONS
FREQUENTLY ASKED QUESTIONS Secure Bytes, October 2011 This document is confidential and for the use of a Secure Bytes client only. The information contained herein is the property of Secure Bytes and may
Web Services API Developer Guide
Web Services API Developer Guide Contents 2 Contents Web Services API Developer Guide... 3 Quick Start...4 Examples of the Web Service API Implementation... 13 Exporting Warehouse Data... 14 Exporting
Test Automation Integration with Test Management QAComplete
Test Automation Integration with Test Management QAComplete This User's Guide walks you through configuring and using your automated tests with QAComplete's Test Management module SmartBear Software Release
DB2 Connect for NT and the Microsoft Windows NT Load Balancing Service
DB2 Connect for NT and the Microsoft Windows NT Load Balancing Service Achieving Scalability and High Availability Abstract DB2 Connect Enterprise Edition for Windows NT provides fast and robust connectivity
Easy-Cassandra User Guide
Easy-Cassandra User Guide Document version: 005 1 Summary About Easy-Cassandra...5 Features...5 Java Objects Supported...5 About Versions...6 Version: 1.1.0...6 Version: 1.0.9...6 Version: 1.0.8...6 Version:
Desktop Solutions Quick Reference Card StarOffice 7 and StarSuite 7
Introduction Product description StarOffice is a full-featured office productivity suite that runs on Solaris, Windows and Linux and is compatible with MS Office file formats. StarOffice main components
IBM SPSS Statistics Version 22. Concurrent License Administrator s Guide
IBM SPSS Statistics Version 22 Concurrent License Administrator s Guide Contents Administrator's guide......... 1 Before you start............. 1 Ghosting............... 1 Citrix and Terminal Services........
Handout 1. Introduction to Java programming language. Java primitive types and operations. Reading keyboard Input using class Scanner.
Handout 1 CS603 Object-Oriented Programming Fall 15 Page 1 of 11 Handout 1 Introduction to Java programming language. Java primitive types and operations. Reading keyboard Input using class Scanner. Java
Producing Listings and Reports Using SAS and Crystal Reports Krishna (Balakrishna) Dandamudi, PharmaNet - SPS, Kennett Square, PA
Producing Listings and Reports Using SAS and Crystal Reports Krishna (Balakrishna) Dandamudi, PharmaNet - SPS, Kennett Square, PA ABSTRACT The SAS Institute has a long history of commitment to openness
J j enterpririse. Oracle Application Express 3. Develop Native Oracle database-centric web applications quickly and easily with Oracle APEX
Oracle Application Express 3 The Essentials and More Develop Native Oracle database-centric web applications quickly and easily with Oracle APEX Arie Geller Matthew Lyon J j enterpririse PUBLISHING BIRMINGHAM
INPS Remote Vision MIQUEST Training Manual
INPS Remote Vision MIQUEST Training Manual DEVELOPED BY: DHARMESH PATEL DATE: SEPTEMBER 2008 Page 1 of 24 MIQUEST Miquest stands for Morbidity Query Information Export Syntax. It is a tool recommended
Course Number: IAC-SOFT-WDAD Web Design and Application Development
Course Number: IAC-SOFT-WDAD Web Design and Application Development Session 1 (10 Hours) Client Side Scripting Session 2 (10 Hours) Server Side Scripting - I Session 3 (10 hours) Database Session 4 (10
Java CPD (I) Frans Coenen Department of Computer Science
Java CPD (I) Frans Coenen Department of Computer Science Content Session 1, 12:45-14:30 (First Java Programme, Inheritance, Arithmetic) Session 2, 14:45-16:45 (Input and Programme Constructs) Materials
BarTender Web Print Server
The World's Leading Software for Label, Barcode, RFID & Card Printing White Paper BarTender Web Print Server Web-based Software for Printing Barcodes, Labels, ID Cards and more. Contents Introduction to
Ultimus and Microsoft Active Directory
Ultimus and Microsoft Active Directory May 2004 Ultimus, Incorporated 15200 Weston Parkway, Suite 106 Cary, North Carolina 27513 Phone: (919) 678-0900 Fax: (919) 678-0901 E-mail: [email protected]
Extending XSLT with Java and C#
Extending XSLT with Java and C# The world is not perfect. If it were, all data you have to process would be in XML and the only transformation language you would have to learn would XSLT. Because the world
OneStop Reporting 3.7 Installation Guide. Updated: 2013-01-31
OneStop Reporting 3.7 Installation Guide Updated: 2013-01-31 Copyright OneStop Reporting AS www.onestopreporting.com Table of Contents System Requirements... 1 Obtaining the Software... 2 Obtaining Your
FileMaker 8. Installing FileMaker 8 ODBC and JDBC Client Drivers
FileMaker 8 Installing FileMaker 8 ODBC and JDBC Client Drivers 2004-2005 FileMaker, Inc. All Rights Reserved. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker is a trademark
