Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Contents
VOL. 7 / ISSUE 2
Impressum
on Page 2
The Vision:
Whats in Store from Sybase in 2000 ?
by Scott McReynolds on Page 3
New Technology:
Introducing Python
by Rolf Andr Klaedtke and Bruce Eckel on Page 14
PowerSurvey Results
by Mark Lansing on Page 16
PowerTip:
Non-Visual Object Instances in PB 7
by Werner Warger on Page 17
Little Helpers:
Table Dancer 1.12 from Helmar G. Dahmer
reviewed by Arthur Hefti on Page 20
Impressum
PowerTimes is an international PowerBuilder Journal published 6 times a year mainly destined to PB User Groups
worldwide. If your User Group does not subscribe to
PowerTimes and you would like to receive it, then you can
subscribe to it on an individual basis.
Contact addresses:
Editor:
Co-Editor:
Mark A. Lansing
Eichmatt 17
CH-6343 Rotkreuz / Switzerland
Fax: ++41 - (0)41 - 790 74 79
e-mail: mlansing@powertimes.com
Column responsibles:
Little Helpers:
Arthur Hefti
arthur@catsoft.ch
PFC Place:
Boris Gasin
bgasin@dynamictechgroup.com
Know How:
Bernie Metzger
bmetzger@kevsys.com
COM Knowledge
Alan Walsh
alwalsh@indiana.edu
EASy Does IT
William B. Heys
Bill.Heys@whittman-hart.com
Subscription rates:
Individual:
User Group:
Introduction
The Internet Application Division at Sybase has a very
broad vision for the year 2000. This year we will be adding a number of great new features to our products to improve the developers environment and productivity. We
will be issuing new releases of the majority of our products this year, and in this article I would like to introduce
you to the new features in order of delivery.
EAServer 3.6
The first product that will be released in 2000 will be version 3.6 of EAServer. This version is targeted for our Java
Developers. It will provide all of the major functionality
for J2EE. The functionality that will be included in this
release is:
PowerJ 3.6
Features for PowerJ will follow a number of those of
EAServer. For PowerJ 3.6 they will include:
Target migration of EJB 1.0 objects to the EJB 1.1
specification. This will automatically update the deployment descriptors as well as create a new target
based on the original. This migration will save the
original target in case it is currently being used in production.
A number of EJB 1.1 class and helper class changes
will also be incorporated. These include such things
as changing of Exception and Finder types to support
the 1.1 specification.
Page 3
PowerBuilder
PowerBuilder continues to stay current with new application development technologies for the purpose of allowing developers to leverage their PowerBuilder skills for
distributed and web applications. Just as PowerBuilder
offers a 4GL approach to traditional Windows application
development, the next release will offer a 4GL-like experience for web development. To address the web requirements for todays applications, PowerBuilder has directly
incorporated web technology from PowerSite.
To effectively use features from PowerSite within
PowerBuilder, it is important that PowerBuilder be able
to work with more than one target application at a time.
Two new concepts are introduced into the PowerBuilder
development environment - workspaces and targets. The
workspace is responsible for holding all of the applications and components that are going to be used for development. Targets are used to represent those applications
and components. By introducing a new web target concept, PowerBuilder will be able to build, manage, and deploy HTML files, images, and other assets that comprise a
web site.
PowerDesigner
For PowerDesigner, Sybase is trying to provide Synergy
with other IAD products. They include plans for application development integration. The main focus if this integration is on EAServer for the purpose of developing new
Web applications. The overall product goal is to simplify
object-oriented, component-based, multi-tier web application development and deployment through analysis and
design. To meet these goals Sybase has planned a number
of enhancements. These enhancements include:
The auto-generation of test data into a designed database. This is to reduce the development time be providing data which can be easily placed into a newly
developed datamodel.
A mechanism to help database administrators compute their designed database size.
The generation of XML files from a class diagram.
This generation includes both the generation of XML
Schema as well as XML Data. It should be noted that
with XML file recovery, an XML document can be
imported into a class diagram.
A number of Repository changes. These include using the same architecture as MetaWorks uses for storing the repository. This will provide one integrated
repository for all of the PowerDesigner products. We
will also be adding support of ASA and other ODBCcompatible RDBMS for the repositorys persistence
database. Sybase will also be adding repository environment administration and management (access
rights, etc.) to the modeling environment. This will
provide a much more secure modeling environment.
Modelers will also be able to consolidation into the
repositorys database as well as extract from this same
environment. They will also be able to version their
?
Scott McReynolds has worked in the data processing industry for over 15 years. He has been with Sybase for 4
1/2 years where he is Senior Product Line Specialist.
You may contact him at Scott.McReynolds@sybase.com.
As you can see from the new features, Sybase has a number
of very exciting plans for its development community!
Watch this space!
Page 5
Page 6
Introduction
At the end of my previous article, we left John, a senior
PowerBuilder developer with VaporWare Inc. (previously
ACME Network Products Corporation,) sitting comfortably in his office chair with his feet up on his desk. The
function that John has written to convert the contents of a
datastore to XML was working as designed; sales reports
were converted to XML file and uploaded to VaporWares
FTP site. Life was good
ls_xml += <row>~r~n
// Column entities
FOR k = 1 TO ll_cols
ls_xml += ( < + &
lds_xml.Describe( # + &
String( k ) + .Name ) + &
> + String( &
lds_data.object.data[j,k] ) +
</ + lds_xml.Describe( &
# + String( k ) + .Name )
+ > + >~r~n )
NEXT
Datastore
Long
String
Integer
lds_xml
ll_rows, ll_cols, j, k
ls_filename, ls_path, ls_xml
li_rc
lds_xml.SetTransObject( SQLCA )
ll_rows = lds_xml.Retrieve()
ll_cols = lds_xml.Datawindow.Column.Count
IF ll_rows > 0 THEN
li_rc = GetFileSaveName( &
Select File, ls_path, &
ls_filename, TXT, &
Text Files (*.TXT), *.TXT )
IF li_rc = 1 THEN
// XML header line
ls_xml = <?xml version=1.0'?>
// Outer entity - data
ls_xml += <data>
// Row entities
FOR j = 1 TO ll_rows
Page 7
Functions and tags that let you create database queries and provide their output to a Web browser in XML
form
Functions to parse XML documents and access individual pieces of a parsed document
A set of objects to create and modify XML documents
<price>249.00</price>
</row>
</data>
>
var
var
sqlString = document.value.sql;
rs = connection.CreateQuery(
sqlString );
<data>
<!formatting>
<row>
<id><!data></id>
<num><!data></num>
<name><!data></name>
<os><!data></os>
<price><!data></price>
</row>
<!/formatting>
</data>
if ( rs.GetErrorCode() == 0 )
{
var nRows= rs.GetRowCount();
var nCols= rs.GetColumnCount();
if ( nRows > 0 )
{
// start top level element
document.writeln( <data> );
http://servername/products.stm
document.writeln(
</row>\n );
<row>
}
}
<id>121</id>
<num>P60543</num>
<name>EAStudio 3.5</name>
<os>Solaris</os>
<price>3445.00</price>
</row>
<row>
<id>122</id>
<num>P60546</num>
<name>EAStudio 3.5 Doc. Set/name>
<os>Windows NT</os>
}
}
else
document.writeln(
<error></error> );
>
</data>
To invoke this XML template, we simply type the following URL into our browsers address field:
http://servername/sql2xml.stm?sql=select * from
sales_order_items order by id, line_id
Page 8
ls_url = http://localhost/xml/
ls_url += sql2xml.stm?
lblb_args = Blob( sql= + sqlsyntax )
ll_length = Len( lblb_args )
ls_headers = Content-Length: + &
String( ll_length ) + ~n~n
<id>2001</id>
<line_id>1</line_id>
<prod_id>300</prod_id>
<quantity>12</quantity>
<ship_date>1996-09-15</ship_date>
</row>
<row>
RETURN 1
</row>
Conclusion
<row>
<id>2001</id>
<line_id>3</line_id>
<prod_id>302</prod_id>
<quantity>12</quantity>
<ship_date>1996-09-14</ship_date>
</row>
</data>
Utopia? Not
Wake up! ITOS is not one of those snazzy Web applications it is an ageing, Client/Server, PowerBuilder 6.5
application, remember? How, then, can a PowerBuilder
application harness the power of a dynamic web page
server?
The answer lies in yet another hidden PowerScript gem
the PostURL PowerScript function. This function performs
an HTTP Post, allowing a PowerBuilder application to
send a page request to a web server.
lblb_args
ls_headers, ls_url
ll_length
Page 9
?
Roy Kiesler is a Senior Lead Consultant at Noblestar Systems in
Cambridge, MA, an e-business
solutions company embracing
measurable results. Roy has been
working with PowerBuilder since
version 4.0, developing client/
server, distributed and Web applications for the Pharmaceutical,
Financial Services and Tele-communications industries. He is a
member of TeamSybase, a group of highly proficient
Sybase/Powersoft product users, who volunteer their
time to answer questions in various support forums.
Contact Roy via e-mail at rkiesler@noblestar.com.
COM+ SECURITY
by Alan J. Walsh
Introduction
Now that Windows 2000 is finally here I thought it might
be useful for me to devote some time to discussing the
new features of COM+ in detail. Some of you will recall
that I gave a preview of these features in an article last
year, but that was based on a release candidate and some
things have changed since then. For one thing not all of
those features made it into the final release of Windows
2000! But most did, and I think it would be interesting to
do some in depth analysis of those features now. Ill start
things off with this article and a subject that many developers dread but nevertheless must face sooner or later
security.
Figure 1, DCOMCNFG
COM Security
Lets start by reviewing what we already know about security in COM. In classic COM, there are four fundamental security settings: authentication, impersonation, access
permissions, and launch permissions. These settings can
be applied on a machine-wide basis, and those settings
become the defaults for all components. You can also
configure COM applications with their own settings. In
either case you use a utility called DCOMCNFG. This utility
still exists in Windows 2000 to provide this functionality
to COM applications.
Launch permissions specify who is allowed to start components running on this particular machine. You simply
add Windows accounts or groups to this list and specify
allow or deny for launch permissions.
Access permissions determine who is allowed to use a particular component. As with launch permissions, this is simply a list of Windows security principals with an allow or
deny flag. Be sure to include the SYSTEM account in the
list of allowed accounts.
Authentication level allows you to set a desired level of
encryption and authentication between the client and your
application. Table 1 lists the possible levels from least secure to most secure.
Be careful when tampering with authentication levels. COM
negotiates a level based upon the settings of the client and
the component. If they do not match an error will result.
For example, your client can programmatically specify a
level that is lower than that of the component, and the calls
will fail.
Impersonation allows you to control the degree to which
the component can know the clients identity, and what
they can do with that knowledge. Again from least to greatest, in table 2 there are the possible impersonation levels.
As with authentication, clients can programmatically set
their impersonation level. If clients do not specify an impersonation level, the machine-wide setting will be used
by the component.
Page 10
Component Services
Figure 2, Identity
Everything we have talked about so far still exists in Windows 2000 to support COM applications, but there is additional functionality to enhance security for COM+ components. To begin with, we have a much more powerful
tool for configuring security and other COM+ properties.
As you can see in figure 3, the new Component Services
Page 11
console provides developers and administrators with a familiar interface for managing COM+.
Application Security
As you continue to drill down in the CS console, youll
see icons for each of your COM+ applications. Even if
you do not have any applications of your own you will
inherit some default system applications from Windows.
If you look in figure 3 youll see that I have applications
related to IIS 5.0, which I happen to have installed on this
machine. If you click on the COM+ Applications folder
you will see icons for each of your applications in the right
pane of your console. As was the case in the MTS Explorer, any active applications will be indicated by a revolving icon. Note that the active X of MTS has been
replaced by a + for COM+.
To access the security settings for an application, simply
right-click on that app and select properties. Youll get a
screen like this one:
We are most interested in the Security, Identity, and Activation tabs. Activation is the best place to start because it
determines a lot of our other choices. As was the case in
MTS, you can choose to run your application either as a
Library application or a Server application. Library apps
are created in the callers process. Server apps are created
in a dedicated server process. If you look back at figure 3
again you can see that I have applications for both in-process and out-of-process IIS applications.
The identity tab allows you to choose the identity of your
component in much the same way we used to do under
COM with DCOMCNFG. The only choices here are Interactive user or a specific user that you must choose. For
Library applications, the identity tab will be greyed out
library applications always run under the clients identity.
The security tab that you see in figure 4 shows you the
possible security settings for a server application. You begin
by choosing whether or not to enforce access checking.
After that you can select between two security levels. In
the first level access checks are only made at the process
level. Note that this setting should be avoided for library
applications. The second security level allows you to turn
on access checking at the component, interface, and method
level. Remember that at this point we are still just
configuring the security for our application. The application in turn will contain one or more components, which
we will discuss later.
In the bottom of the security tab for the application is a
drop-down that allows you to select an authentication level.
The choices here are the same as for COM applications.
Finally you can select an impersonation level. The impersonation level specifies what the application wants to allow when it is a client calling other applications. If you
look at a library application you will notice that the authentication and impersonation drop-downs are replaced
with a single check box that turns on or off authentication
Page 12
for the librarys host process. Now that you have configured
the security settings for your application you can move on
to more specific settings for the components that comprise
the application. But before we do that, we need to explore
another key concept in COM+.
Whats My Role?
Roles were introduced in MTS to allow developers and
administrators an easier way to configure security for components. Roles are categories of users that the developer
defines within the application for specific access levels.
The developer creates roles and assigns those roles different access levels for applications, components, etc. The
administrators job is to later fill in those roles or categories with real user accounts. The beauty of this division of
labour is that the developer can configure security without
having to be aware of the actual users who will eventually
be granted access through roles. You might for example
create a commercial application with roles like Manager
and Clerk. You could then deliver that application to
your customers with a complete security configuration
without having to know who will actually occupy those
roles. All COM+ security is based on roles, so it is important to understand this concept as you develop your application. You need to consider which roles your application
will have and what objects each role will have access to. It
will have a direct impact on everything right down to the
methods that you choose to create.
Getting back to our Component Services console, we can
see how this role-based security works. As you drill down
below the application level you will see two folders: one
for the components that make up your application and another for the roles. You can create new roles by right-clicking on the Roles folder and selecting New. Administrators
can then use this interface to assign users to the role. Rightclicking on a component and selecting Properties brings
up the dialog in Figure 5.
Conclusion
The new Component Services console and the incorporation of MTS features like roles really simplifies the life of
both COM+ developers and administrators. The goal of
COM+ is to provide a system in which developers can
focus on writing business logic, and then choose to incorporate services like security or transactions later when they
configure their components. Security will always be a part
of the development process, but COM+ shows that it
doesnt always have to be the worst part.
?
Alan Walsh works for Indiana University.
He can be reached at
alwalsh@indiana.edu.
This is Alan after his presentation on COM at the
Swiss PB User Group
Meeting in Zurich, Nov. 98.
INTRODUCING PYTHON
by Rolf Andr Klaedtke, based on material from Bruce Eckel
Introduction
Why Python?
What is Python ?
Python is an object-oriented language for writing
standalone programs, scripts and prototypes of complex
applications. One of the nice things about Python is that it
is free: if you havent heard about it, than its probably
because its open source and theres no big marketing
machine (or a single company with a big marketing budget)
pushing it. Its a a grass-roots movement, as Bruce liked
to call it.
Python scripts are portable across many platforms, including all major Unix systems, Linux, Windows 95/98/NT
and MacOS.
Apparently Python is widely used in the Unix and Linux
communities, but it has a clean interface to Windows too.
For those interested in using Python under Windows, the
book Python Programming on Win32 (ISBN 1-56592621-8, OReilly) is a recommendable resource. On the back
cover of this book, one can read the following: Python is
growing in popularity; based on download statistics, there
are now more than 400000 people using Python and more
than 150000 using Python on Windows. Use of the language has been growing at about 40% per year since 1995,
and there is every reason to believe that growth will continue.
Of course, you may argue that much can be written on
paper and the publisher probably has a good reason to write
positive things about the language. Well, dont take the
publishers word maybe I should throw in some statements taken off Bruce Eckels presentation given to us
during the Java Seminar.
A macro language
A rapid prototyping tool for object models and algorithms
A testing tool
Data cleaning and transformation
Python as glue: this probably needs some explanation: Python works well with files, network protocols,
DLLs, and COM objects and it offers extensive libraries to help accessing almost any kind of data. Its
well suited to controlling other packages, for systemadministration tasks, and controlling the flow of data
between systems
The Basics
Python, like Java, is a compiled interpreted language.
It is weakly typed and you get templates without templates. It is like Smalltalk, but with a much more C/C++/
Java-like syntax, real OOP from the ground up. Functions
have regular argument lists and theres no special $ etc.
in front of identifiers, so one doesnt have to manage the
argument passing. There are several quoting mechanisms
and its easy to handle embedded sequences.
However, one of the biggest adjustments is the fact that
Python uses indenting for scope: this is shocking at first,
but then, according to Bruce , its One of the greatest
things you never have to parse braces and everybodys
code looks the same
Page 14
Resources
But not as much debugging because of garbage collection, enforced exceptions, stronger type checking.
Code samples
The following code sends a mail message. There is a free
mailing list manager available written in Python.
These are just a few of them. I bought the first and the last
one on the list and can recommend both of them. Id like
to add that among other material, the last one on the list
provides interesting introductions to COM/DCOM, NT
services and a lot more which already makes it worth buying. Samples include how to integrate Python with Excel
or how to work with E-mail, including a sample of how to
send a message with Exchange/Outlook.
Theres also a Python conference, for details see
www.Python.org (Lifes better without braces).
?
Rolf Andr Klaedtke is an independant consultant and
software developer with over 15 years experience in
the IT industry, mainly working on the AS/400. He is
the publisher of PowerTimes and president of the
Sybase and PowerBuilder User Group Switzerland. In
1996 and 1997 he has been the main organizer of the
Swiss PB Conference. You can reach him at
rak@powertimes.com.
The following code sample opens Word and prints the sentence Python was here in a new document:
from win32com.client.dynamic import Dispatch
Word = Dispatch(Word.Application)
Word.Visible = 1
WordDoc = Word.Documents.Add()
WordRange = WordDoc.Range()
WordRange.InsertAfter(Python was here)
Page 15
The Results
One of the key points we wanted to know was whether or
not we should continue focussing only on the Sybase
toolset. A whopping 78% said yes, so that was clear. We
also wanted to know whether or not the quality of
PowerTimes, including the articles, met your expectations.
An amazing 98% thought that it did. This made us feel
really good - all the late nights have seemingly been worth
it! Many people also commented on the excellent quality
of articles. As the editors, we can only take our hats off to
the authors in PowerTimes - they are really the people who
have made PowerTimes what it is, and we really couldnt
put PowerTimes together without them. The positive results are a reflection of their hard work.
Page 16
You also noted that a discussion of techniques for developing distributed applications would be handy, as well as
information on thin-client development.
91%
73%
60%
53%
53%
51%
40%
38%
22%
4%
A few people mentioned that a column on new and emerging technolgies would be useful, to keep readers up-todate on what is happening.
In Conclusion
You certainly gave us some important feedback, but as
every technical publication, we need people to write about
the topics. Since there are not that many willing, times
have become more difficult for us with every issue.
Other Technologies
We also wanted to know about the technologies you wanted
to read about. You told us that XML, CORBA and EJB
were the most interesting, followed closely by the web.
There were not too many specifics about the latter one, so
we guess just about anything related to the topic would be
interesting.
As mentioned in the editorial, we are currently in discussion with a company who would like to take over
PowerTimes and increase its distribution as well as ensure
some regular article input. Even though there are a lot of
things you want to read about, we will have to leave the
survey results for now. We will hopefully soon be able to
inform you about the future of PowerTimes.
Introduction
The PB 7 Way
The PB 6 Way
How can we accomplish this in PB 6? The first thing is to
define an instance variable of type datastore:
Datastore ids_orders
Page 17
I like this approach very much. Finally you can see your
non-visual objects. But there is more to it...
Page 18
7RROV
&OLHQW6HUYHU
'HYHORSPHQW
- Custom made Software in any Business
Area
,QWHUQHW
(QWHUSULVH, 1HW
'HYHORSPHQW
- Custom made Web Sites
+ Easy to maintain
+ Fast Development
+ Public Hosting available
'HYHORSPHQW
- Custom made Web
Sites for Intranet and
Internet usage
7UDLQLQJ
- For Sybase AG and 5HVDOH
- ColdFusion
SQL AG
- HomeSite
- ScriptBuilder
&RQVXOWLQJ
- On various PowerBuilder Topics
6\EDVH&$33DUWQHU
&ROG)XVLRQ5HVHOOHU
5HVDOH
- SilverStream Reseller
6LOYHU6WUHDP9$5
TABLEDANCER 1.12
from Helmar Gordon Dahmer
reviewed by Arthur Hefti
Introduction
TableDancer is a command line utility that creates HTML
documentation from a SQL Anywhere or Adaptive Server
Anywhere database.
records, if its replicated, remarks and an overview of columns, keys, indexes, trigger information and eventually a
performance hint.
Description
Generated HTML
During the run the tool creates a lot of HTML files describing your database. The documentation includes information about Tables, Views, Procedures, Columns and
their details, Primary and Foreign Keys, Indexes and even
the number of rows in the table.
In My Opinion
TableDancer is an easy to use and quick way to have the
latest information about your data model right at your finger tips. TableDancer can be run after some changes are
done to the database or could be included in the Windows
Scheduler to update the information every hour or every
day.
President:
Greg Fisher
gfisher@dttus.com
Vice President:
Ed Donohue
edonohue@dttus.com
Treasurer:
Danna Goodwin
dagoodwin@dttus.com
Secretary:
Steve Davies
stedavies@dttus.com
The members of ANYPBUG are dedicated to the advancement of their skills both professionally and technically.
ANYPBUG is a not-for-profit organization established
as a forum to help members realize their goals.
Through regular meetings and events, members learn the
latest techniques and trends surrounding the
PowerBuilder product. Members also have a chance to
view emerging technologies before they become prominent in the work place.
Membership is free! Several forward thinking organizations pay an annual fee to help support the activities of
ANYPBUG.
The members of the PowerBuilder User Group Denmark receive PowerTimes thanks to a generous sponsorship from Sybase Denmark.
Please contact Sybase Denmark, if you want to know
more about the PB User Group Denmark:
Sybase Danmark A/S
Lyngbyvej 20
2100 Kobenhavn
http://www.sybase.dk
Michael Baraz
Peter Vassilatos
Jeff Barnes
Catherine Chang
(630) 235-4529
(312) 856-6720
(847) 549-7765
(630) 350-6048
http://www.cpbug.org
The Secretary of the ChicagoLand PowerBuilder User
Group, Jeff Barnes, can be reached at the following email address: jcbarnes@ibm.net.
Page 21
http://www.cmhpbug.com
Officers:
President:
Barry McDonald
mcdonald@nmedia.com
Vice President:
Todd Dake
todd@airnet.com
Secretary:
Earl Kincaid
copbugsec@aol.com
Treasurer:
Sudhir Gadepalli
gadepalli@nmedia.com
The members of the PowerBuilder User Group Italy receive PowerTimes thanks to a generous sponsorship from
Sybase Italia.
L abbonamento a PowerTimes per gli iscritti del Power
Builder User Group Italia e stato gentilmente offerto da
Sybase Italia.
Page 22
http://www.njpbug.org
Phone:973.402.5600
Fax: 973.402.5620
http://www.dynamictechgroup.com
President:
Carole Hargrave
chargrav@magi.com
Wade Kornik
kornikw@home.ca
Secretary:
Paul Grawal
Member:
Brick Du Bourg
brickd@ocs-consulting.com
PBUG Council:
Chairman:
Warren Clayburn
wclayburn@omegaprime.co.uk
Treasurer:
Ian Soden
Isoden@linkhand.com
Secretary:
David Speight
dspeight01@aol.com
Telephone:
Fax:
Email:
Internet:
Postal address:
Suite A8, Kebbell House
Carpenders Park
Watford, Herts. WD1 5BE
Page 23
Thomas Revetal
Stig Melling
Rune Nerhagen
Wenche Fronth
ystein Rolfsen
Leif Aksel Grthe
Zema AS
Sybase
WM-Data
Hrens Forsynings Kommando
De Norske Bokklubbene
Online Consulting Partner AS
Tlf. 90 56 45 68
Tlf. 22 57 70 00
Tlf. 23 09 63 86
Tlf. 22 02 20 00
Tlf. 90 52 74 94
Dianna DeMotto
Phone: (405)360-3386
Email: okcpbug@usa.net
Vice President:
William Walter
Secretary:
Scott Chaney
http://www.okcpbug.iwarp.com
The members of the Oklahoma PowerBuilder User
Group receive PowerTimes thanks to a generous sponsorship from Rattan Consulting from Oklahoma City.
We specialize in designing and programming custom window based & internet applications. We have experience
with EA Studio, EA Server, Powerbuilder, Visual Basic
and C /C++. We also have staff specially trained and experience in Data Warehousing.
We are a Sybase Premier Partner and sell Sybase software
at discounted rates so call us for all your software needs.
Rattan Consulting
4334 NW Expressway Suite 259
Oklahoma City, OK 73116
Phone:(405) 810-8005
Fax:
Email: Trattan@swbell.net
Page 24
(405)810-8097
Paul Bis
paulbis@netcom.ca
(416) 866-5493
Vice President:
Ioana Naum
Membership
Admin.:
Debbie Brittain
Assistant:
Haibo Peng
haibop@softapproach.com
Assistant:
Earl Armbrust
earl-armbrust@compuserve.com
Assitant:
Eugene Osadchi
virtos@hotmail.com
http://www.softapproach.com
CATsoft
President:
Vice President:
Andreas Theis
andreas.theis@national.ch
Treasurer:
Martin Rothenberger
martin@catsoft.ch
Secretary:
vacant
Member:
Werner Warger
wwarger@warger.vol.at
Internet:
http://www.spbug.ch
Phone:
Fax:
Web:
Page 25
+41-55-616 51 11
+41-55-616 51 14
www.catsoft.ch