You are previewing PowerBuilder 9: Advanced Client/Server Development.
O'Reilly logo
PowerBuilder 9: Advanced Client/Server Development

Book Description

Over a decade ago PowerBuilder introduced the idea of rapid Client/Server application development and, for much of that time, was the leader in both technology and sales in the enterprise development market. Although PowerBuilder has lost significant market share to Visual Basic and Delphi, it still enjoys an intensely loyal developer community of close to 300,000. Version 9 of PowerBuilder continues the tradition of introducing leading-edge technology to these developers. PowerBuilder 9 Client/Server Development zeroes in on the most important aspects of building client/server applications in PowerBuilder, including PBNI (native interface), PFC (foundation classes), and database connectivity.

Table of Contents

  1. Copyright
  2. About the Lead Authors
  3. About the Contributing Authors
  4. Acknowledgments
  5. We Want to Hear from You!
  6. Introduction
    1. About This Book
    2. How This Book Is Organized
      1. Part One, “The PowerBuilder Development Environment”
        1. Chapter 1, “The PowerBuilder Integrated Development Enivironment”
        2. Chapter 2, “Source Code Control”
        3. Chapter 3, “Compiling and Deploying Applications”
        4. Chapter 4, “InfoMaker”
        5. Chapter 5, “Advanced Coding Techniques”
      2. Part Two, “The DataWindow”
        1. Chapter 6, “Advanced DataWindow Techniques”
        2. Chapter 7, “Extreme DataWindows”
        3. Chapter 8, “XML DataWindows”
      3. Part Three, “Database Connectivity”
        1. Chapter 9, “Sybase Adaptive Server Enterprise”
        2. Chapter 10, “Sybase Adaptive Server Anywhere”
        3. Chapter 11, “Oracle”
        4. Chapter 12, “ODBC”
        5. Chapter 13, “JDBC”
        6. Chapter 14, “IBM DB2”
        7. Chapter 15, “IBM Informix”
      4. Part Four, “Advanced Topics”
        1. Chapter 16, “PowerBuilder Foundation Classes (PFC)”
        2. Chapter 17, “Third Party Tools”
        3. Chapter 18, “Advanced Controls”
        4. Chapter 19, “PowerBuilder Native Interface (PBNI)”
        5. Chapter 20, “Object Linking and Embedding (OLE)”
        6. Chapter 21, “Future Directions”
    3. Recommendations for Further Reading
  7. I. The PowerBuilder Development Environment
    1. 1. The PowerBuilder Integrated Development Environment
      1. Objectives
      2. IDE History
      3. Workspaces and Targets
        1. Workspaces
          1. New
          2. Add Target
          3. Open Workspace
          4. Incremental Build
          5. Full Build
          6. Deploy
          7. Debug
          8. Run
          9. Close
          10. Get Latest Version
          11. Check Out
          12. Check In
          13. Undo Check Out
          14. Run Source Control Management Tool
          15. Add to Source Control
          16. Refresh Status
          17. Show Differences
          18. Show History
          19. Show
          20. Properties
        2. Targets
          1. Target Application
          2. Target Template Application
          3. Target Existing Application
          4. Other Target Options
          5. New...
          6. Search
          7. Incremental Build
          8. Full Build
          9. Migrate
          10. Deploy
          11. Debug
          12. Run
          13. Remove Target
          14. Get Latest Version
          15. Check Out
          16. Check In
          17. Undo Check Out
          18. Add to Source Control
          19. Remove from Source Control
          20. Show Differences
          21. Show History
          22. Refresh Status
          23. Show
          24. Refresh Status
          25. Properties
      4. The IDE Examined
        1. IDE Toolbar
        2. IDE Menu Options
          1. File
          2. Run
          3. Tools
          4. Window
          5. Help
        3. System Tree
        4. Clip Window
        5. Output Window
        6. Design Area
      5. Other Useful Features of the IDE
        1. To Do Lists
        2. Keyboard Shortcuts
        3. Profiling, Tracing, Debugging
        4. Other Tools
      6. Advanced IDE Features
        1. Using Inheritance and the IDE to Promote Productivity
          1. Inheritance in the IDE
          2. Inherited Object Attributes
      7. Conclusion
    2. 2. Source Code Control
      1. Objectives
      2. Why Implement Version Control?
      3. PowerBuilder and SCC Integration
        1. A Brief Look Back at SCC Integration with PowerBuilder
        2. Early Code Management Architectures
        3. Architectural Changes in the SCC Interface
        4. New SCC File Types
          1. PBG Files
          2. PBC Files
        5. Architectural Changes to PBNative
          1. The SR* File
          2. The PRP File
      4. IDE Changes in PowerBuilder 8 and 9
        1. Workspace Properties Dialog Box
          1. Source Control System
          2. UserID
          3. Project
          4. Local Root Directory
          5. Connect
          6. Advanced
          7. Log All Activity
          8. Require Comments on Checkin
          9. This Project Requires that I Sometimes Work Offline
          10. Delete PowerBuilder Generated Object Files
          11. Perform Diff on Status Update
          12. Suppress Prompts to Overwrite Read-only Files
          13. Status Refresh Rate
        2. Installation Notes
        3. System Tree and Library Painter SCC Icons
        4. Library Painter
      5. Source Control Menus
        1. Workspace-level Context Menu
        2. Target-level Context Menu
        3. PBL-level Context Menu
        4. Object-level Context Menu
      6. Source Code Control Operations
        1. Add to Source Control
        2. Remove from Source Control
        3. Refresh Status
        4. Check Out
        5. Check In
        6. Undo Checkout
        7. Get Latest Version
        8. Show Differences
        9. Show History
        10. SCC Properties
        11. Backup SCC Status Cache
        12. Run Source Control Management Tool
        13. Advanced Options
      7. Effective SCC Implementation with PowerBuilder 9
      8. Project Workspace and Target Planning
      9. Setting Up PBNative in PB 9
        1. Step 1—Folder and PBL Restructuring
        2. Step 2—Creating the Workspace and Targets
        3. Step 3—Setting Up the PBNative Repository
        4. Step 4—Adding Other Developers
        5. Step 5—Optionally Using a Work PBL
      10. Setting Up Third-party SCC Providers
      11. Branching and Merging with PowerBuilder 9
        1. Initial Setup and Registration
        2. Normal Operation
        3. Set Up the Branch Workspace and View
      12. A Brief Review of Third-party SCC Tools
      13. Conclusion
    3. 3. Compiling and Deploying Applications
      1. Objectives
      2. PowerBuilder Deployment Through the Years
      3. Application Deployment with PowerBuilder 9
        1. Compiler Basics
        2. The Application Package
        3. Using Dynamic Runtime Libraries
        4. Using External Resources
        5. The Project Painter
        6. Target-level Deployment
        7. Workspace-level Deployment
        8. Building a Runtime Library
      4. Command-Line Deployment with OrcaScript
        1. Overview
        2. Architecture
        3. OrcaScript Command Reference
          1. OrcaScript Argument Descriptions
          2. Sample OrcaScript Command Files
        4. PowerGen
      5. Delivering the Completed Application to End Users
        1. Environmental Components
          1. PowerBuilder Runtime DLLs
          2. Database Interface Files
          3. ODBC Drivers and Profiles
          4. OLEDB Drivers and Profiles
          5. JDBC Drivers and Profiles
          6. PowerBuilder Runtime Packager
          7. Database Client-side Communication Software
        2. Application Components
          1. The Executable Application
          2. Any Additional Supporting Files
          3. Local Database Files
          4. C/C++ Runtime Files for PBNI Components
          5. External Program Files
      6. Additional Tips and Tricks
        1. Building Version Information into the Executable
        2. Deploying Applications from the Database
      7. Conclusion
    4. 4. InfoMaker
      1. Objectives
      2. The InfoMaker Environment
        1. Library Painter
        2. Report Painter
        3. Pipeline and Database Painters
        4. Form Painter
      3. Deployment
      4. New Features
        1. Executable Versioning
        2. Command-Line Arguments
        3. New File Save Formats
        4. XML
      5. Where Does PowerBuilder Fit In?
        1. Custom Form Styles
        2. Default Form Styles
        3. Actions
        4. Toolbar Settings in the Registry
        5. Nondefault Form Styles
      6. Customizing the Imstyle9.pbl
      7. Limitations
      8. Debugging Your Code
      9. Writing Code in InfoMaker Forms Without PowerBuilder
      10. Conclusion
    5. 5. Advanced Coding Techniques
      1. Objectives
      2. Environment
        1. Setting Up Your Environment
          1. Using Workspaces
          2. Using Targets
          3. The System Tree or the Library Painter
        2. Operating System Support (XP)
        3. Library Organization
          1. Library Size
          2. Developer Access
          3. Shared Objects
          4. When Using Read-Only Libraries or PBD Files
          5. Remaining Library Structure
        4. Library Maintenance
          1. Optimization
          2. Regeneration
      3. The IDE
        1. Using Hotkeys
          1. Adding Shortcuts
          2. Switching Between Items in the Design Area
        2. Extending the PowerPanel
      4. Coding
        1. Coding Framework
          1. Encapsulation
          2. Encapsulated Systems
            1. Non-encapsulated
            2. Encapsulated
          3. So Where Does the Code Go?
            1. Global Functions
            2. Ancestor Functions
            3. Non-Visual Objects
          4. Encapsulation Example
          5. So What Code Goes in the Object Itself?
        2. What About Events?
          1. Over Abstraction
          2. Balancing Your Design
          3. Code for the Rule—Not the Exceptions
        3. Exception Handling
          1. Introducing Exception Handling
          2. Extending the Application—Proving Extensibility
          3. The Throws Area of a Function Prototype
          4. Exception Processing Summary
        4. Performance
          1. The Perception of Performance
          2. Performance Myths and Realities
          3. Loop Boundaries
          4. String Manipulation
          5. Window Open—The Effect of Open Techniques
            1. RetrieveRow()
          6. The Effect of Inheritance
          7. Dynamic Function Calls
          8. Multithreading
          9. PB Controls
          10. Menus
        5. Performance Summary
      5. Database Independence
        1. Database Design
        2. DataWindows
        3. Embedded SQL
      6. Conclusion
  8. II. The DataWindow
    1. 6. Advanced DataWindow Techniques
      1. Objectives
      2. Using Expressions
        1. Design-Time Expressions
          1. Columns
          2. Expression
          3. Functions
        2. Boolean Evaluation
        3. Other Evaluations
        4. Runtime Expressions
          1. Syntax
          2. Direct Object Manipulation (a.k.a. Dot Notation)
          3. modify Function
        5. Expressions with Bands
          1. Header and Trailer Bands
        6. Expressions with Shapes
      3. DataWindow Reporting
        1. Nested Reports
          1. Nested Reports: How Does the Data Get Retrieved?
          2. Nested Reports: Accessing Objects
          3. Nested Reports and the getchild() Method
        2. Composite Reports
        3. Dynamic Nested Reports
          1. Using Expressions or Column Values
          2. Using String Values
          3. Using Numeric Values
          4. Prompting the User for Retrieval Arguments
          5. How Dynamic Can We Get?
          6. Sharing Data Between Reports
          7. Limitations on Sharing Data
          8. Limitations Nesting/Composite
        4. What’s the Difference? Composite Versus Nested
      4. Dynamic SQL
        1. Dynamic SQL (Format 1)
        2. Dynamic SQL (Format 2)
        3. Dynamic SQL (Format 3)
        4. Dynamic SQL (Format 4)
      5. Other SQL Considerations
        1. SQLPreview Event
        2. The TABLE.SELECT Property
        3. Important Note About the Describe Function
        4. SetSQLSelect Function
        5. Why TABLE/SELECT Is Preferred over SetSQLSelect
        6. Dynamic DataWindows
          1. SyntaxFromSQL
          2. Create
        7. Final SQL Thoughts
      6. Fun with Bands
        1. The Basics
        2. Changing the Header Band
        3. Suppressing the Detail Line
        4. Working with Groups
        5. Moving Objects Between Bands
      7. Dynamically Creating DataWindow Objects
        1. The Naked DataWindow
        2. Understanding the Syntax
          1. Version Information
          2. DataWindow Properties
          3. Band Properties
          4. Source Definition
          5. Object Definitions
          6. DataWindow HTML/XML Properties
        3. Creating Dynamic Objects
          1. Adding the Code
      8. New Client/Server DataWindow Features
        1. DataWindow Print Enhancements
        2. ClipText
        3. OverridePrintJob
        4. PrinterName
        5. Printing Multiple Copies
        6. Collate
        7. Child DataWindow Retrieval
        8. Group Report Scrolling
      9. Conclusion
    2. 7. Extreme DataWindows
      1. Objectives
      2. Drawing Simple Shapes
      3. Creating and Manipulating a Rectangle
        1. uo_lbd event
        2. uo_mm event
        3. uo_lbu event
        4. Selecting the Objects
      4. Moving Images Within and Between Datawindows
      5. Moving Images from One Datawindow to Another
      6. Creating Rich Graphical Datawindows Using Metadata
        1. Controlling Visual Datawindow Objects
        2. Applying Metadata to the Visual Properties of Datawindow Objects
        3. Constructing Metadata
      7. Manipulating Metadata
        1. Assigning Negative Values to Some Datawindow Object Properties
        2. Displaying a Row-Based Object Across Multiple Rows
      8. Included Source Code
      9. Conclusion
    3. 8. XML DataWindows
      1. Introduction
      2. What Is XML?
        1. XML Terminology
      3. XML Parsers
      4. DataWindow Export Engine
      5. Export Templates: Graphical User Interface
        1. Export Template Header Section
        2. Export Template Detail Section
        3. Mapping DataWindow Elements to XML Nodes
      6. Exporting XML
      7. Example I
      8. Example II
      9. Example III
      10. Example IV
      11. Importing XML
      12. New DLLs
      13. Conclusion
  9. III. Database Connectivity
    1. 9. Sybase Adaptive Server Enterprise
      1. Objectives
      2. Connecting to ASE
      3. Data Types
      4. DataWindows
        1. Using a SQL Statement for the Source
        2. Using a Stored Procedure for the Source
        3. Using Stored Procedures for Updates
      5. Stored Procedures
        1. As Remote Procedure Calls
        2. As Embedded SQL
          1. Multiple Result Sets
        3. Optional Arguments
      6. Embedded SQL
      7. Special Issues
        1. Identity Columns
        2. Hiding Object Ownership
        3. Using DBHandle and CT-LIB
        4. Using print Statements for Debugging
      8. Conclusion
    2. 10. Sybase Adaptive Server Anywhere
      1. Objectives
      2. Connecting via PowerBuilder
        1. Configuring the PowerBuilder Connection Profile
      3. Data Types
      4. Development Considerations
        1. Identifier Case
        2. Qualifying SQL with Owner Names
      5. Interacting with the Database
        1. DataWindows
          1. Using Computed Columns
          2. Identity Columns
          3. Using Stored Procedures Within DataWindows
        2. Calling Stored Procedures Directly
        3. Embedded SQL
      6. Conclusion
    3. 11. Oracle
      1. Objectives
      2. Connecting to Oracle
      3. Data Types
      4. Datawindows
        1. Using a SQL Statement for the Source
        2. Using a Stored Procedure for the Source
        3. Using Stored Procedures for Updates
        4. OLE Database Blob Columns
      5. Stored Procedures
        1. As Remote Procedure Calls
        2. As Embedded SQL
          1. Multiple Resultsets
          2. Named Notation
      6. Embedded SQL
      7. Special Issues
        1. User-Defined Data Types
        2. Invalid Objects
        3. Using Synonyms to Hide Schema Ownership
        4. Nonintelligent (Surrogate) Primary Keys
        5. Security
        6. Failover Support
        7. Multiple Oracle Homes
        8. Typical ORA-xxxxx Errors
        9. Slow Connection
        10. Troubleshooting
        11. National Language Support
        12. Shared Server
        13. Connecting to Non-Oracle Databases
        14. Using DBHandle and OCI DLLs
      8. Conclusion
    4. 12. ODBC
      1. Objectives
      2. What Is ODBC?
      3. How Is ODBC Used?
        1. Establish Configuration
        2. Connect to the Database
        3. Set Up Calls to the ODBC API
        4. Execute Calls to the ODBC API
        5. Examine the Return from the ODBC API Call
      4. Setting Up an ODBC Data Source
      5. ODBC Data Sources on Your Machine
        1. Single-tier Versus Multiple-tier Drivers
      6. ODBC and PowerBuilder’s Transaction Object
        1. DBParms
      7. The Mysterious File—PBODB09.INI
        1. The Sections of the File
      8. Troubleshooting ODBC
        1. Database Trace
        2. ODBC Driver Manager Trace
      9. ODBC Resources
      10. Conclusion
    5. 13. JDBC
      1. Objectives
      2. JDBC Architecture
        1. Type 1 Driver
        2. Type 2 Driver
        3. Type 3 Driver
        4. Type 4 Driver
      3. Sybase jConnect for JDBC
      4. Getting Started
      5. Specifying Data Sources
      6. Making Connections
      7. Executing Statements and Retrieving Results
      8. ResultSet and Database Metadata
      9. DatabaseMetaData
      10. ResultSetMetaData
      11. An Example Using Sybase JConnect
      12. Transactions in JDBC
        1. JDBC Transaction Isolation Levels
      13. Using JDBC in PowerBuilder
        1. Preparing to Use the JDBC Interface
        2. Define a Database Profile from PowerBuilder
        3. Configuring Options for Components Running Within EAServer
      14. Conclusion
    6. 14. IBM DB2 and CICS Via Sybase Mainframe Connect
      1. Objectives
      2. DirectConnect Architecture Overview
      3. Connecting Via PowerBuilder
        1. Configuring Open Client
        2. Configuring the PowerBuilder Connection Profile
        3. Additional Connection Parameters
          1. AppName
          2. DelimitIdentifier
          3. ErrTrace
          4. HostReqOwner
          5. LowerCaseIdent
          6. Request
          7. ShowWarnings
          8. SQLQualifiers
          9. SystemOwner
          10. TRS
          11. UseProcSyntax
        4. Connection Initialization
      4. Data Types
        1. Character Data Types
          1. Subtypes
          2. LONG VARCHAR
        2. Distinct Data Types
        3. Unsupported Data Types
      5. Development Considerations
        1. Identifier Case
        2. Qualifying SQL with Owner Names
        3. Table Lists
        4. PowerBuilder Extended Attribute Tables
      6. Accessing External Data
        1. Metadata
        2. Remote Procedure Calls (RPCs)
        3. Remote Stored Procedures (RSPs)
          1. RSP4C
          2. RSP8C
          3. RSP3C
          4. Considerations When Using TRS or Two-Tier Connections
        4. DB2 Native Stored Procedure Invocation
        5. Handling Warnings
          1. In RSPs
          2. In RPCs
      7. Security Interfaces
        1. SYPM Transaction
        2. TRS Options
          1. sgw_peminfopwd
          2. sgw_pemchpwd
        3. sp_password Via DB2 Access Service
      8. Conclusion
    7. 15. IBM Informix
      1. Objectives
      2. Connecting to Informix
        1. Setnet32 Configuration
        2. PowerBuilder Database Profile Setup for IBM Informix
      3. Data Types
        1. DATETIME and TIME Data Types
        2. INTERVAL Data Type
        3. SERIAL Data Type
          1. In Embedded SQL
          2. In DataWindows
        4. TEXT and BYTE Data
          1. In Embedded SQL
          2. In DataWindows
        5. Other Data Types
      4. Using Stored Procedures
        1. Within DataWindows
        2. As an RPC FUNC
        3. Within Embedded SQL
        4. Handling RAISE EXCEPTION
      5. Outer Join Syntax
      6. Logging Modes
      7. AutoCommit
      8. Isolation Level
      9. Conclusion
  10. IV. Advanced Topics
    1. 16. PowerBuilder Foundation Classes (PFC)
      1. Objectives
      2. What Is the PFC?
      3. What Is SBA?
      4. PFC Architecture
      5. PFC Major Objects and Services
        1. PFC Objects
          1. PFC Application Object
          2. PFC Window Objects
          3. PFC Controls
        2. PFC Services
          1. Instantiating PFC Services
          2. PFC Application Services
          3. PFC Window Services
          4. PFC Datawindow Services
          5. PFC Global Services
      6. The PFC Start Wizard
      7. PFC Quickstart
        1. The Wizsrce Scripts
      8. The PFC Example Application
      9. Using Common PFC Objects and Services
        1. PFC Constants
        2. Menus
        3. Datawindows (u_dw)
        4. Resize Service
        5. Linkage Service
          1. Retrieving and Updating
          2. But Wait...There’s More!
        6. Split Bar
        7. Status Bar Service
      10. More Precoded Scripts
        1. Application Object
        2. Window (W_master or Descendant)
        3. Datawindow
      11. Tips and Tricks—Getting the Most from PFC
      12. A Need for Speed
      13. Debugging PFC
        1. Avoiding the Activate Event
        2. PFC Debug Log
      14. What’s Changed in the PFC
        1. Changes in PFC as of PowerBuilder 6
        2. Changes in PFC as of PowerBuilder 7
        3. Changes in PFC as of PowerBuilder 8
        4. Changes in PFC as of PowerBuilder 9
      15. PFC Resources
      16. Conclusion
    2. 17. Third-Party Tools
      1. Objectives
      2. What’s Out There?
      3. If You Don’t Look For It, You Won’t Find It
        1. Finding Tools on the Internet
        2. Publication Articles and Advertising
      4. Serving Those Who Serve Us
      5. Buy Versus Build—The War Rages On
      6. Tips on Selecting a Product
        1. Know Your Requirements
        2. Know What’s Available
        3. Be Flexible
        4. Consider Reengineering Your Business Processes
        5. Be Realistic
        6. Carefully Consider the Stability of the Product Company
        7. Buy the Source Code
        8. Get References
        9. Don’t Sweat the Small Stuff
      7. Types of Tools
        1. Pre-development
        2. Co-Implementation
        3. Efficiency
      8. Products Listing
        1. Coding Utilities
        2. Regeneration/Make Tools
        3. Testing Tools
        4. Web Migration Tools
        5. Case, Design, and Analysis Tools
        6. Code Frameworks
        7. End User Reporting Tools
        8. Additional Utilities and Tools
      9. Other Sybase Tools
      10. Conclusion
    3. 18. Common Controls
      1. Objectives
      2. What Is the Win32 API?
        1. Finding Good Documentation
        2. The Documentation Is C-centric
        3. Mapping C Data Types to PowerBuilder Data Types
        4. Mapping Win32 API Calls to PowerBuilder External Functions
        5. What’s the Difference between SendMessageA and SendMessageW?
        6. Overloading SendMessage
        7. Creating Constants for the Message IDs
        8. Mapping C Structures to PowerBuilder Structures
        9. Encapsulating the Win32 API Calls
        10. Review
      3. The Messaging Subsystem
        1. Window Handles and Events
        2. Sending Messages Programmatically
        3. Child Windows, Parent Windows, and Notification Messages
        4. Creating Windows Programmatically
        5. Review
      4. Common Controls
        1. List of Common Controls
        2. Common Control DLL Versions
        3. How to Determine Which Version of COMCTL32.DLL Is Installed
        4. Review
      5. PowerBuilder External Visual Objects
        1. Review
      6. Encapsulating a Common Control
        1. Where to Start?
        2. Initialize the Common Controls
        3. Window Styles and Class Names
        4. Message IDs
        5. Sending Messages to the Common Control
        6. Wrapping Messages in Functions
        7. Associating the Implementation with the Visual Control
        8. Implementing the Nonvisual User Object
        9. Review
      7. Creating the Visual Component
        1. Using the Common Control
        2. Review
      8. Conclusion
    4. 19. PowerBuilder Native Interface (PBNI)
      1. Objectives
      2. What Is PBNI?
        1. IPB_Session
        2. IPB_Value
        3. IPB_Arguments
        4. IPB_VM
      3. The PBNI SDK
      4. Building PBNI Extensions
        1. Implementing PBNI Classes
        2. PBNI Required Functions
          1. PBX_GetDescription
          2. PBX_CreateNonVisualObject
          3. PBX_CreateVisualObject
          4. PBX_InvokeGlobalFunction
        3. Building a PBNI Extension DLL
      5. Your First PBNI Class
        1. Create the PBNI DLL
        2. Create the PBD
        3. Create the PB Client
        4. Example Review
      6. Working with PBNI Objects
        1. Exchanging Data with PowerBuilder
        2. Calling PowerScript Object Functions
        3. PBNI Callback Example Review
      7. Triggering PowerBuilder Events
      8. PBNI Global Functions
      9. Calling PowerScript System Functions from Within a PBX
      10. Accessing and Manipulation Arrays
        1. PBBoundedArrayCreator
        2. PBUnboundedArrayCreator
        3. PBArrayAccessor
        4. PBBoundedObjectArrayCreator
        5. PBUnboundedObjectArrayCreator
        6. PBObjectArrayAccessor
      11. PBNI Visual Objects
        1. GetWindowClassname
        2. CreateControl
        3. Visual PBNI Example Review
      12. Handling PBNI Exceptions in PowerBuilder
      13. Debugging PBNI Classes
      14. Deploying Your PBNI Extension
      15. Loading the PowerBuilder VM in a Third-Party Application
      16. PBNI Utilities
        1. PBSIG90
        2. PBX2PBD90
      17. Conclusion
    5. 20. Object Linking and Embedding
      1. Objectives
      2. The OLE Environment
        1. Early Versus Late Binding
        2. ActiveX Designers
      3. OLE Custom Controls
      4. OLE Automation
        1. Microsoft Office–Related OLE Examples
      5. OLEStream and OLEStorage
      6. Conclusion
    6. 21. Future Directions
      1. Objectives
      2. A Bit of Perspective
      3. .NET
        1. Support for XML Services
        2. DataWindow.NET and DataStore.NET
        3. Create .NET Objects from the PB IDE
        4. Support for .NET
      4. Java
        1. Web Services in EAServer
        2. EJB Clients, PB Web Services, and JPSs
        3. PB NVOs in Third-Party Application Servers
      5. Mobile Targets
      6. IDE Integration
      7. Conclusion
  11. V. Appendixes
    1. A. Sybase Adaptive Server Enterprise Reference
      1. Database Connection Parameters
    2. B. Oracle Reference
      1. Database Connection Parameters
    3. C. Third-Party Tools Reference
      1. Available Third-Party Tools
        1. Coding Utilities
        2. Regeneration/Make Tools
        3. Testing Tools
        4. Web Migration Tools
        5. Case and Design Tools
        6. Code Frameworks
        7. End User Reporting Tools
        8. Additional Utilities