SUGI 29 Applications Development. Paper 026-29



Similar documents
SysPatrol - Server Security Monitor

StARScope: A Web-based SAS Prototype for Clinical Data Visualization

24x7 Scheduler Multi-platform Edition 5.2

Creating Dynamic Web Based Reporting

Forward proxy server vs reverse proxy server

Interfacing SAS Software, Excel, and the Intranet without SAS/Intrnet TM Software or SAS Software for the Personal Computer

Hands-On Workshops HW003

SAS, Excel, and the Intranet

DiskPulse DISK CHANGE MONITOR

IBM WebSphere Application Server Version 7.0

StreamServe Persuasion SP4 Service Broker

Paper PO03. A Case of Online Data Processing and Statistical Analysis via SAS/IntrNet. Sijian Zhang University of Alabama at Birmingham

SAS/IntrNet 9.3: Application Dispatcher

Scheduling in SAS 9.3

Copyright. Copyright. Arbutus Software Inc Roberts Street Burnaby, British Columbia Canada V5G 4E1

Release Bulletin Sybase ETL Small Business Edition 4.2

SAM Server Utility User s Guide

Big Data, Fast Processing Speeds Kevin McGowan SAS Solutions on Demand, Cary NC

SAS/IntrNet 9.4: Application Dispatcher

Studio 5.0 User s Guide

Improving Your Relationship with SAS Enterprise Guide

Oracle Universal Content Management

High Level Design Distributed Network Traffic Controller

Automated distribution of SAS results Jacques Pagé, Les Services Conseils HARDY, Quebec, Qc

Scheduling in SAS 9.4 Second Edition

JAMF Software Server Installation Guide for Linux. Version 8.6

Efficient database auditing

SAS 9.4 PC Files Server

CA ARCserve Backup for Windows

Building Applications Using Micro Focus COBOL

Migrating to vcloud Automation Center 6.1

A Document Retention System for Eye Care Practices. Release Notes. Version 7.5 October A Milner Technologies, Inc. Solution

Cabot Consulting Oracle Solutions. The Benefits of this Approach. Infrastructure Requirements

Software: Systems and Application Software

Networking Best Practices Guide. Version 6.5

WebSpy Vantage Ultimate 2.2 Web Module Administrators Guide

Top 10 Things to Know about WRDS

"SQL Database Professional " module PRINTED MANUAL

SQL Pass-Through and the ODBC Interface

National Fire Incident Reporting System (NFIRS 5.0) Configuration Tool User's Guide

Monitoring Replication

Chapter 12 Programming Concepts and Languages

SAM XFile. Trial Installation Guide Linux. Snell OD is in the process of being rebranded SAM XFile

Transparent Identification of Users

APACHE WEB SERVER. Andri Mirzal, PhD N

7 Why Use Perl for CGI?

PN Connect:Enterprise Secure FTP Client Release Notes Version

FREQUENTLY ASKED QUESTIONS

Oracle Forms Services Secure Web.Show_Document() calls to Oracle Reports Server 6i

Mercury Users Guide Version 1.3 February 14, 2006

FF/EDM Intro Industry Goals/ Purpose Related GISB Standards (Common Codes, IETF) Definitions d 4 d 13 Principles p 6 p 13 p 14 Standards s 16 s 25

Evaluator s Guide. PC-Duo Enterprise HelpDesk v5.0. Copyright 2006 Vector Networks Ltd and MetaQuest Software Inc. All rights reserved.

Configuring an Alternative Database for SAS Web Infrastructure Platform Services

aims sql server installation guide

Copyright Software Technology, Inc Cushman Drive Lincoln, NE (402)

Installation Instructions for Version 8 (TS M1) of the SAS System for Microsoft Windows

PHP Integration Kit. Version User Guide

Essential Project Management Reports in Clinical Development Nalin Tikoo, BioMarin Pharmaceutical Inc., Novato, CA

SAS Client-Server Development: Through Thick and Thin and Version 8

CA Workload Automation Agent for Databases

An Application of the Internet-based Automated Data Management System (IADMS) for a Multi-Site Public Health Project

CatDV Pro Workgroup Serve r

McAfee Endpoint Encryption for PC 7.0

Enabling Kerberos SSO in IBM Cognos Express on Windows Server 2008

BarTender Web Print Server

NovaBACKUP xsp Version 15.0 Upgrade Guide

ERserver. iseries. Work management

webmethods Certificate Toolkit

Setting Up Specify to use a Shared Workstation as a Database Server

An macro: Exploring metadata EG and user credentials in Linux to automate notifications Jason Baucom, Ateb Inc.

VMware vcenter Discovered Machines Import Tool User's Guide Version for vcenter Configuration Manager 5.3

imhosted Web Hosting Knowledge Base

SAS Scalable Performance Data Server 5.1

EPiServer Operator's Guide

enicq 5 System Administrator s Guide

Effective Use of Individual User Profiles with Software Distribution

JAMF Software Server Installation Guide for Windows. Version 8.6

Witango Application Server 6. Installation Guide for OS X

Installation & Configuration Guide

HP Service Manager. Software Version: 9.40 For the supported Windows and Linux operating systems. Application Setup help topics for printing

You have got SASMAIL!

MIGRATING DESKTOP AND ROAMING ACCESS. Migrating Desktop and Roaming Access Whitepaper

CentreWare Internet Services Setup and User Guide. Version 2.0

CA ARCserve Backup for Windows

LabVIEW Internet Toolkit User Guide

Integration Guide. SafeNet Authentication Service. Oracle Secure Desktop Using SAS RADIUS OTP Authentication

How To Test Your Web Site On Wapt On A Pc Or Mac Or Mac (Or Mac) On A Mac Or Ipad Or Ipa (Or Ipa) On Pc Or Ipam (Or Pc Or Pc) On An Ip

Equipment Room Database and Web-Based Inventory Management

StruxureWare Power Monitoring 7.0.1

Transcription:

Paper 026-29 Developing A System With SAS/INTRNET, Accessing An Oracle Database, Some ODS and A Whole Lot of Problems Gabriel Cano Constella Group, Durham, NC Bob Cameron, Constella Group, Durham, NC Kevin McGowan, Constella Group, Durham, NC Jean Orelien, Constella Group, Durham, NC ABSTRACT The National Institute of Environmental Health Sciences (NIEHS) National Toxicology Program (NTP) has sponsored the redesign of its Toxicology Data Management System (TDMS) called The Toxicology Data Management System Enterprise (TDMSE). This redesign brings a multigenerational development from 1980 back into focus with current technologies. This paper will describe issues regarding the approach of redesigning a report delivery system developed with SAS/INTRNET. The system also uses SAS SQL to access an Oracle database. Internet and system connectivity issues will be detailed as they effected system implementation along with contingency plans when system connectivities failed. Other challenges encountered during development will be discussed such as SQL queries, ODS, HTML web posts, a little bit of Java, modifying the SAS/INTRNET configuration files and apparent system anomalies. KEYWORDS SAS/INTRNET, SAS SQL, ODS INTRODUCTION The purpose of this paper is to exhibit the various challenges during the software development phases for the statistical reporting component of the NTP s TDMS redesign. This paper will also focus on the statistical reporting and database interfacing aspects of the new system. There will also be a fair amount of attention given to troubleshooting and dealing with the various obstacles encountered. First, a brief history of the current system will be presented. Next, the revised system will be described with some logistical details. Finally, some interesting and challenging experiences involving SAS/INTRNET and operating system issues will be detailed. A BRIEF HISTORY The TDMS database system for the NTP started as an IBM mainframe system at NCTR (National Center for Toxicology Research) in Arkansas in 1980. When the NTP project headquarters moved to NIEHS the TMDS database system moved with it. In 1985 TDMS moved from the IBM system to a VAX/VMS system. One of the reasons it moved to a VAX system was the availability on VAX of the ADABAS software that was used as the database. The TDMS system did not go through any major changes after 1985 until 1998 when it was moved to Open VMS on a VAX Alpha server machine from a larger VAX system. Also in 1998 a web-based interface was added to allow users to request reports from any web browser. In 2002 the NTP decided to completely revamp TDMS converting it to run on more current technologies. THE OLD SYSTEM AND THE DATABASE The NTP database consists of animal data such as pathology results, animal weights, food and water consumption and other measurements that are collected from several labs throughout the United States along with one lab in Italy. The data is collected using personal computers at each lab on a daily basis. The data is transferred from the labs into the TDMS database electronically via modems. The communication to the labs is two-way in that the project directors can also send data back to the labs if it needs correction or updating. At the start of a project study managers download all the data needed to run the study into the lab computers. The software on the computers in the labs is written by the same programmers who maintain the TDMS database. The conversion of the TDMS system from a VAX/ADABAS system to one utilizing current technologies required that all of the database queries be written over from scratch. This ended up being a good idea because the queries in the old system have the following problems: Hard to maintain -- the queries are written in many different languages such as C, Pascal, Cobol and Natural (Natural is the database query language for ADABAS.) Some of the languages used have no current employee that is an expert in the language. 1

Limited use -- most of the current queries were designed to be used on only 1 study at a time. For projects where data are needed to be analyzed across multiple studies additional programming has to be done to combine the data from multiple studies. Not a relational system -- the ADABAS system uses flat files rather than a relational system. This leads to more programming than is needed with a relational system. Flat file systems also typically use up more disk space and run slower than relational systems. Availability -- Though SAS is already used for statistical reporting more recent improvements to that product could be utilized to make reports more available to scientists/users. For these reasons and others the system as a whole needed a reinvigoration of succinctness and accessibility. This is a general logistical picture of the system, old and new: Figure 1. The System Submit and Report Query Database Analysis Report THE NEW SYSTEM The redesign of the TDMS was coordinated by an IT staff separate and independent of the statistical developers. This also included the entire port and administration of the data in the new database; the data was moved into an Oracle database (hereinafter referred to as the database). The statistical reporting component described in this paper is a smaller (but not insignificant) part of the entire TDMS. OVERALL IMPROVEMENT The new TDMS is better than the current system in several ways: More user friendly -- The new system is 100% web based rather than using an old-fashioned character based system. Better database design -- The new system uses a relational design for better data storage and faster access. The new database is designed to be much easier to compile data across multiple studies. Better reports -- The upgraded system will output reports in modern formats such as PDF and XML rather than plain ASCII text files. The modern report formats allow the usage of color, graphics and text combined, and better ability to distribute the reports to users on different computing platforms such as Windows, Macintosh, and various forms of UNIX. More consistent software development strategy -- The new system uses Oracle, Java, HTML, and SAS (for 95% of the software modules) all based on a Linux operating system. Despite the fact that newer tools have been used there were some situations where some of the old technology could not be immediately eliminated. Those portions will eventually be phased out. On the other hand there are points in the system where the newer technology was still unable to accomplish the streamlining that was sought with this revision. This high level graphic of the revised system, TDMS Enterprise (TDMSE), describes the statistical reporting logistics: Figure 2. The Statistical Reporting System 2

SAS Intrnet HTTP Post SAS Webserver Application Server SAS SQL Transactions Report/System Status Oracle Database Display Result TDMS Enterprise Scientist s workstation Report Request A request for a statistical report proceeds as follows: -- A user issues a report request in TDMSE. -- The Webserver invokes the Appsvr to start a SAS/INTRNET process. -- A report process is initiated as STARTED in the database. -- The database is queried using HTTP post information. -- The report entry in the database is updated to FINISHED upon completion. -- TDMSE then retrieves the report making it available to the user. This is an example of how streamlining was partly unachievable due to the reliance of so many internet connections. DEVELOPMENT PHASES Implementation and development of this system brought an array of never ending challenges. Most notably it would take about 2 months for the system web server and the SAS Application server to be configured and ready. Issues regarding firewalls prevented direct system development until all the proper personnel could be contacted. Availability of the new system [and the data] was also a concern since that development was physically separate and independent from the statistical reporting component of the system. Due to the circumstances at hand a massive effort of parallel development had to happen. The statistical reporting programs had to absolutely be implemented and ready to run by the time all the interface pieces of the system were in place. Development had to begin as soon as possible or the statistical reporting programs would not be ready for the TDMS beta test. Figure 3 is a graphic of the most available and stable testing system: Figure 3. Testing Environment 3

SAS Webserver Application Server SAS SQL Transactions Programmer Request Reports Oracle Database Scientist s workstation In this configuration programmer requests could be in the form of either SAS Batch or SAS/INTRNET processes. The reliability was most favorable and one that could be controlled. This was also the best contingency plan since the expectation is that the stability of system interfaces and firewalls is, at times, precarious. The following developmental phases cite major episodes encountered during development and steps taken to deal with them. These are not independent processes and in most cases development was iterative and crossed over phases. PHASE 1 PORTING AND RUNNING The old system code was taken directly from old system work directories and ported to the new testing environment. Initially, firewalls and other machine service issues precluded developers from immediate access to the development machine and SAS/INTRNET service. Eventually these initial issues were resolved and SAS code was ported to the new Linux machine. Programs were implemented to fit the new file system. Looking at Figure 3 the initial programmer requests were from SAS batch. Old data were used until the queries could be developed. Once the Appserver was online SAS/INTRNET programs were then run with a web browser. Running programs with a web browser would allow the Appserver to carry out a programming request rather than a batch request. The state of the programming environment during this programming invocation is closer to the environment that would exist once the system was up and running. This is what launching a program directly from a developer s computer via the application dispatcher might look like: www.webserver.com/directory/broker?_program=lib.pgm.sas&_service=default Once programs were sufficiently running HTML code was developed by the IT staff to simulate a TDMSE HTTP post. A simulation is run by the developer while an actual system post comes from TDMSE. Figure 4 shows what both the simulated system pages and the actual system looked like. Figure 4. HTML Test Page 4

This is what typical HTTP post symbols looked like: Symbols passed to SAS #symbols:??? "_SRVNAME" = "webserver" "_SRVPORT" = "ZZZZ" "_REQMETH" = "POST" "_RMTHOST" = "XX.XXX.XXX.X" "_RMTADDR" = "XX.XXX.XXX.X" "_RMTUSER" = "" "_HTUA" = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" "_mrvimg" = "/sasweb/intrnet8/mrv/images" "_grfaplt" = "/sasweb/graph/graphapp.jar" "_grafloc" = "/sasweb/graph" "_SERVICE" = "default" "_PROGRAM" = "devenv.test.sas" "_debug" = "131" "_VERSION" = "8.2" "_URL" = "/cgi-bin/broker.exe" "_ADMIN" = "[your-name]" "_ADMAIL" = "[your-email]@[your-site]" "_SERVER" = "sashost" "_PORT" = "YYYY" "textstudynum" = "00000" "texttestnum" = "00" Using timeout: 60 Content-type: text/html Pragma: no-cache Content-type: text/html This code portion resembles how the posted symbols were retrieved: %let studynum = &textstudynum; %let testnum = &texttestnum; %let repstartdate = &textstartdate; %let ntpreport = &textarrayreport; Many other parameters were also passed along and retrieved. Once the system was fully functional the testing environment scheme changed from the testing system (Figure 3) to the proposed revised system (Figure 2). As previously stated due to the precarious nature of the entire system environment development efforts constantly wavered between the initial batch method to actual system requests. PHASE 2 GENERATING OUTPUT This portion of development and testing dealt mostly with converting the old text report into PDF format. Since development was now occurring on a Linux system the temporary files and data comparisons within SAS were still under the assumptions of a VAX/OpenVMS system. The issue of case sensitivity popped up often. Once the report result file was populated with information the text file was converted to PDF format using ODS. The problem here now became inserting page breaks in to a PDF file using ODS under SAS/INTRNET. SAS/INTRNET will not insert page breaks if options nonumber and nodate are used. These options were needed since the old style created text reports using a DATA _NULL_ statement. This problem was resolved in the PDF file with the help from SAS Technical Support as follows: options nonumber nodate spool; ods pdf file="&reportfile"; title '00'x; run; data _null_; create report file statements here run; 5

ods pdf close; ods listing; run; quit; Note: Page breaks are suppressed without the title 00 x; portion. The SAS Technical Support note indicating this problem is found here: http://support.sas.com/techsup/unotes/sn/006/006928.html PHASE 3 DEVELOPMENT OF QUERIES This was an aspect of report programming that would change the face of the statistical component in a slightly more dramatic fashion. This was due to need for introducing database queries into the reporting component. Previously, this was a separate and physically independent process. But now that a new database exists those queries had to be rewritten and incorporated into the new system programs. Since the old system is a multi-generational development there is no one expert on the system. Developers had to resort to a reverse engineering strategy. To understand the effort needed to proceed with query development one must understand the elements of the database. The database contains approximately 100 tables with the following breakdown by category: 20 core tables, 15 protocol tables, 25 reference tables and 40 intersection tables. There are just over 500 long term studies in the database along with a similar number of short term studies. The process to develop queries to work with the new relational database was broken down into the following steps: Documenting existing queries -- this was needed to make sure that the new queries would match the existing queries. Learning the structure of the new database -- this step was needed since the new database design was very different from the old design. Development and testing of new queries outside the report system -- this included comparing data output from the existing queries to the data output from the new queries. Integration of queries into report programs this step includes testing of the complete report and additional programming to allow quality checking of the data. This is an example of the code used to extract information from the database: proc sql; connect to oracle(user=xxx orapw=yyy path=&path); create table sacrif2 as select * from connection to oracle ( select animal_num as number, p_treatments.treat_num as treat, r_reference_groups.code as remove from &ntpdatabase..c_animal, &ntpdatabase..p_experiment, &ntpdatabase..p_treatment where c_animals.pexp_pac_id = p_experiments.pac_id and c_animals.ptre_pac_id = p_treatments.pac_id and p_treatments.pexp_pac_id = p_experiments.pac_id and c_animal_removal_events.rrefg_rac_id_anm_rml_rsn = r_reference_groups.rac_id and c_animal_removal_events.canl_cac_id = c_animals.cac_id and r_reference_groups.reference_type like 'ANIMAL_REMOVAL_REASONS' and p_experiments.study_num = &ntpstudy and p_experiments.test_num = &ntptest ); disconnect from oracle; Approximately 20 SAS SQL queries like this were developed to retrieve data and update the database on report status. PHASE 4 REPORT INSTANTIATION 6

Communication with the new database brought on a new set of problems. In order for the TDMSE to see a report an entry had to be defined in the TDMSE report queue. The process was carried out within SAS for each report as follows: --Get a unique sequence ID --Initialize a process as STARTED --Enter the report location --Signal process as FINISHED Some status flags are sent throughout processing. This is a query to define a report as STARTED in the database: proc sql; connect to oracle(user=xxxxx orapw=yyyyyy path=&ntpsid); execute ( insert into &ntpdatabase..u_reports values (&operatorid, &experimentid, &sequenceid, %str(%'&sysdate.%'), NULL, NULL, &store_ess, 'application/pdf', NULL, %scan(&status_rac_id,&estat), &reportid, %str(%'&txtsubtitle.%') )) by oracle; disconnect from oracle; This is the SAS call to the Java code to insert the report into the new database: %let temp_out = "java -classpath ""ojdbc.jar:proglib"" FileToClob userid password database reportfile"; systask command &temp_out; The above Java code is shown for completeness of covering the problems encountered during development. SAS SQL under version 8.2 does not allow an insert of Character Large Object Binary (CLOB) data into an Oracle database. So the process of locating the PDF file had to be done in an external process from SAS. According to SAS Technical Support this problem is fixed in SAS version 9. Another noteworthy item is that during program runs with SAS/INTRNET the programming environment variable setting are lost. So even though the path to Java could be defined in the programmer s environment setting the external process called from SAS still does not know the location of the Java program. So the entire path for the location of Java had to be used for the systask call. Once the program was inserted in to the database the report request was complete. This is a query to define a report as finished in the database: proc sql; connect to oracle(user=xxx orapw=yyy path=&path); execute ( update &ntpdatabase..u_reports set completion_date = %str(%'&sysdate.%'), report_error = NULL, rrefg_rac_id_status = FINISHED_CODE where id = &sequenceid ) by oracle; PHASE 5 TESTING AND DEVELOPMENT 7

For this effort the system directory structure played a crucial part in how team members carried out testing. Once programs were reasonably functional team members were able make copies of the system and test very different aspects of the programs. Figure 5. System Directory Structure Test System Copy of Test System Programs Utility Programs Programs Utility Programs Temporary Data Output Temporary Data Output Clearly, the ability to test the system heavily had a great impact on how the system was further developed. It did not matter at what point testing needed to occur. Team members could test the system from the batch level or the higher system level. The ability to copy the test system was very useful in version control and testing during the early stages of development. Eventually, all testing and QA was carried out directly in TDMSE. APPARENT SYSTEM ANOMALIES Various invisible problems plagued the system throughout its development. Time after time it was impossible to run SAS reports in TDMSE. It was unacceptable to allow any one problem slow progress. Development continued in an environment that was always known to be functional and without any possibility of effects from external forces; that environment was the SAS batch environment. Even while running programs in batch there were constant programming issues to be dealt with as previously stated. Once programs reached the SAS/INTRNET development stage programmers faced an entirely new variety of more complex programming challenges. The following items are a list of the items that created apparent system anomalies: -- Permissions Issues. (Batch vs. SAS/INTRNET) -- Timeout issues -- Default versus Pool service -- Running external processes Though these items are separately detailed the reader can appreciate the complexity of how these items are interrelated to create a most mysterious and aggravating development quandary. PERMISSIONS ISSUES - BATCH VS. SAS/INTRNET Keep in mind that development for the TDMS was done on a Linux operating system. Those who know about Unix and its variants know that each file touched on the system has explicit ownership properties associated with them. They are in the form of read, write and execute for an owner, group, and world. When SAS reports were run in batch the issue of permission was invisible because all developers were running processes that defaulted to group level access. -rw-rw-r-- 1 userid groupid 21000 Jan 20 11:49 report.pdf However, when SAS/INTRNET ran reports these processes were run outside of group level access; they required world read and write permissions. Again note, most of the core SAS programs were ported from the old system. All programs created a final report but some reports dynamically created code and data that were later included (and used) in the program. But the most heart wrenching difficulty came when a SAS report was completely self contained (having no other dependencies besides itself) created a report but was unable to load it into the database with Java. This was the most difficult permissions problem to find because SAS/INTRNET showed no error in the logs. This was 8

eventually detected by the TDMSE system log which was a very last resort in development due to the complexity of the already existing problems at hand. Solving this was the beginning of the end of the permissions issues problem. TIMEOUT ISSUES Some reports ran longer that 5 minutes. Larger reports ran for 30 minutes to an hour or longer. Since most SAS/INTRNET timeout variables default to 5 minutes the issue of process timeouts was horrendous. After many telephone calls to SAS Technical Support this issue was cleared up but not easily. It was discovered that the broker timeout variable needed to be updated along with the webserver timeout variable. SAS Technical Support also suggested that the timeout variables in the PROC APPSRV block be kept in synch with the broker timeout variable though there was no apparent timeout issue associated with this. Eventually database queries were optimized and the larger report times were brought down to 5 to 10 mintue processing times. But because of the many internet connections, database traffic and other existing services times can be expected to vary. DEFAULT VERSUS POOL SERVICE For various reasons a separate SAS/INTRNET service was created for the TDMS. As development activity increased it was discovered some report processes were not returning back from the application server. This was due to the fact that the default service has only one port queue. If processes wait for longer than their timeout period in the queue they disappear, i.e. timeout. The pool service can accommodate 16 port processes. More can easily be configured by the administrator. What was also discovered was that even with 16 processes report programs, at times, were not returning from the Appserver. Another painful discovery was that this could happen if errors were encountered such as syntax (or others) and the processes were not properly released from the service queue. Dummy processes could still exist in the service queue and had to be manually deleted or the service restarted. EXTERNAL PROCESSES Some reports required that external programs (C or Fortran) be run from SAS to produce data to be used later in the program. External processes were originally run with the systask command with no luck. systask command "myprog_c arg1 arg2 " shell="tcsh"; A HOSTCMD error resulted and all efforts to track down the reason for it failed. Calls to SAS Technical Support offered other options for running external processes. Three other ways to run external processes in SAS are: (1) Using an X COMMAND: X "myprog_c arg1 arg2 "; (2) Using a FILENAME PIPE: filename c_prog pipe "myprog_c arg1 arg2"; data c_log; infile c_prog ; input intext $132.; run; quit; (3) Use a SYSTEM call: data _null_; rc=system("myprog_c arg1 arg2"); if rc = 0 then put 'No errors'; else put 'Error' rc; run; The program report process had to wait for the external process to finish so either Option 2 or 3 were more desirable. Option 2 was preferred since a log could be more easily saved and checked as needed. Later SAS Technical Support suggested that in the original systask method that the shell portion be removed. systask command " myprog_c arg1 arg2 " ; 9

This worked. It was concluded that the shell option was causing a mysterious scope issue in running external processes in SAS/INTRNET. CONCLUSION It should be clear that there was a steady level of complexity present throughout system development and testing. The team consisted of anywhere from 4 to 6 personnel working at any one time on the system. It is the hope of the authors that the reader now has an idea of what a possible testing environment might look like for developing a large system which requires SAS/INTRNET interacting with an Oracle database (or similar data store) and relying heavily on internet connections. Also, the authors hope to impart some sense of apparent anomalous activities and some possible contingency plans for dealing with them. Another noteworthy observation that is that projects utilizing SAS/INTRNET require a fair amount of contact with system administrators, a knowledge of the systems at play and the internet capabilities or limitations as a whole. REFERENCES SAS Web Tools: Static and Dynamic Solutions Using SAS/INTRNET Software Course Notes, 2001 SAS Institute Inc. SAS Web Tools: Advanced Dynamic Solutions Using SAS/INTRNET Software Course Notes, 2001 SAS Institute Inc. ACKNOWLEDGMENTS This research was supported by the National Institute of Environmental Health Sciences under contract number GS- 10F-0351K. Special thanks to Scott Lambdin, systems administrator at NIEHS, who was vastly instrumental in tracking down apparent system anomalies. This paper was also made possible by the laborious efforts of staff employed by Constella Group, Inc and staff from NIEHS. CONTACT INFORMATION Contact the author(s) at: Gabriel Cano Constella Group 2605 Meridian Parkway Durham, NC 27713 Phone: (919) 313-7708 Fax: (919) 544-7507 Email: gcano@constellagroup.com Web: www.constellagroup.com Bob Cameron Constella Group 2605 Meridian Parkway Durham, NC 27713 Phone: (919) 313-7594 Fax: (919) 544-7507 Email: cameron2@niehs.nih.gov Web: www.constellagroup.com Kevin McGowan Constella Group 2605 Meridian Parkway Durham, NC 27713 Phone: (919) 313-7554 Fax: (919) 544-7507 Email: kmcgowan@constellagroup.com Web: www.constellagroup.com Jean Orelien Constella Group 2605 Meridian Parkway 10

Durham, NC 27713 Phone: (919) 313-7607 Fax: (919) 544-7507 Email: jorelien@constellagroup.com Web: www.constellagroup.com TRADEMARK INFORMATION SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. Indicates USA registration. Other brand and product names are registered trademarks or trademarks of their respective companies. 11