Professional Documents
Culture Documents
Author
Mark Sullivan
Copyright Oracle Corporation, 1999. All rights reserved. This documentation contains proprietary information of Oracle Corporation. It is provided under a license agreement containing restrictions on use and disclosure and is also protected by copyright law. Reverse engineering of the software is prohibited. If this documentation is delivered to a U.S. Government Agency of the Department of Defense, then it is delivered with Restricted Rights and the following legend is applicable:
Publisher
Kelly Lee Sherry Polm
Contents .....................................................................................................................................................
Preface Profile xv Related Publications xvi Typographic Conventions xvii Lesson 1: Managing Projects with Project Builder Introduction 1-3 Introducing Project Builder 1-5 Project Builder Terminology 1-7 Project Builder Benefits 1-9 Project Builder User Interface 1-11 Project Builder User Interface 1-13 Creating Projects and Subprojects 1-15 Adding Project Files 1-17 Subdirectories Added as Subprojects 1-19 Creating Connections 1-21 Working with Project Files 1-23 Establishing Dependencies 1-25 Building Projects 1-27 Delivering Projects 1-29 Summary 1-33 Practice Session Overview: Lesson 1 1-35 Practice 1 1-36 Lesson 2: Creating a Menu Module Introduction 2-3 Components of the Menu Module 2-5 The Default Menu 2-7 The Menu Editor 2-9 Creating a Menu Module 2-11 Module Properties 2-13 Menu Properties 2-15 Menu Item Properties 2-17 Menu Item Types 2-19
Contents .....................................................................................................................................................
Menu Item Command Types 2-21 Implementing Menu Toolbars 2-23 Storing the Menu Module 2-25 Attaching the Menu Module 2-27 Pop-up Menus 2-29 Summary 2-31 Practice Session Overview: Lesson 2 Practice 2 2-34
2-33
Lesson 3: Managing Menu Modules Introduction 3-3 Using PL/SQL in Menu Item Code 3-5 Useful Built-in Menu Subprograms 3-7 Showing and Hiding the Current Menu 3-9 Managing Menu Security 3-11 Defining Security Roles 3-13 Assigning Access to Menu Items 3-15 Summary 3-17 Practice Session Overview: Lesson 3 3-19 Practice 3 3-20 Lesson 4: Programming Function Keys Introduction 4-3 Key Triggers 4-5 Defining Key Triggers 4-7 Characteristics of Key Triggers 4-9 Classification of Key Triggers 4-11 Using Key Triggers 4-15 Association with Other Interface Controls 4-17 Summary 4-19 Practice Session Overview: Lesson 4 4-21 Practice 4 4-22
Contents .....................................................................................................................................................
Lesson 5: Responding to Mouse Events Introduction 5-3 What Are Mouse Events? 5-5 Responding to Mouse Movement 5-7 Responding to Mouse Button Actions 5-11 Summary 5-17 Practice Session Overview: Lesson 5 5-19 Practice 5 5-20 Lesson 6: Controlling Windows and Canvases Programmatically Introduction 6-3 Using Window-Interaction Triggers 6-5 Built-ins for Manipulating Windows 6-7 Built-ins for Manipulating Canvases 6-9 Working with Tab-Style Canvases 6-11 Windows and Blocks 6-15 Manipulating Window Properties Programmatically 6-17 Showing Multiple Windows 6-19 Closing Windows 6-21 Blocks with Many Items 6-23 Summary 6-25 Practice Session Overview: Lesson 6 6-27 Practice 6 6-28 Lesson 7: Defining Data Sources Introduction 7-3 Data Source Types 7-5 Basing a Data Block on a FROM Clause Query 7-7 Basing a Data Block on a Stored Procedure 7-9 Example of a Query Using a REF Cursor Procedure 7-11 Example of Query Using a Table of Records Procedure 7-13 Example of DML Using a Stored Procedure 7-15 Deciding Whether to Use a REF Cursor or a Table of Records 7-17
Contents .....................................................................................................................................................
Data Block Wizard 7-19 Data Block Properties 7-21 Data Source Guidelines 7-23 Summary 7-27 Practice Session Overview: Lesson 7 Practice 7 7-30
7-29
Lesson 8: Working with Oracle8 Objects in Form Builder Introduction 8-3 What Are Object Types? 8-5 Review of Objects 8-7 Object REFs 8-9 Supported Oracle8 Features 8-11 How Oracle Developer Treats Objects 8-13 Object Type Displays 8-15 Creating Data Blocks Based on Oracle8 Objects 8-17 Selecting Object Table Columns 8-19 Selecting Object Column Attributes 8-21 Blocks with REF Lookups 8-23 The REF Column Value 8-25 LOVs for REFs 8-27 Summary 8-29 Practice Session Overview: Lesson 8 8-31 Practice 8 8-32 Lesson 9: Controlling Data Block Relationships Introduction 9-3 Creating a Relation 9-5 Block Coordination 9-7 Coordinate Blocks Using REFs 9-9 Characteristics of Relation-Handling Triggers 9-11 Principles of Relation-Handling Code 9-13 Obtaining Relation-Handling Information 9-15 Implementing a Coordination-Type Toggle 9-17
Contents .....................................................................................................................................................
Forcing a Commit Per Master 9-19 Summary 9-21 Practice Session Overview: Lesson 9 Practice 9 9-24
9-23
Lesson 10: Building Multiple Form Applications Introduction 10-3 OPEN_FORM to Invoke Additional Forms 10-5 Closing Forms 10-7 Navigating Between Forms 10-9 Transaction Processing for Opened Forms 10-11 CALL_FORM to Invoke Additional Forms 10-13 Transaction Processing for Called Forms 10-15 NEW_FORM to Invoke Additional Forms 10-19 Controlling Open Forms and Called Forms Together Different Ways of Invoking Forms 10-23 Using Form Parameters 10-25 Parameter Lists 10-29 Creating and Manipulating Parameter Lists 10-31 Passing Data Between Forms 10-33 Summary 10-35 Practice Session Overview: Lesson 10 10-37 Practice 10 10-38
10-21
Lesson 11: Working with Record Groups Introduction 11-3 Record Groups 11-5 Using Record Groups 11-7 Defining Record Groups at Design Time 11-9 Built-in Functions for Controlling Record Groups 11-11 Defining Query Record Groups Programmatically 11-17 Defining Nonquery Record Groups Programmatically 11-19 Manipulating Record Group Rows 11-21 Manipulating Selected Record Group Rows 11-23
Contents .....................................................................................................................................................
Defining Global Record Groups 11-25 Manipulating List Items Programmatically 11-27 Implementing Dynamic List Items 11-29 Adding Values to Combo Boxes 11-31 Summary 11-33 Practice Session Overview: Lesson 11 11-35 Practice 11 11-36 Lesson 12: Including Charts and Reports Introduction 12-3 Including Charts by Using the Chart Wizard 12-5 Chart Item Properties 12-11 Reporting Within Form Builder 12-13 Report Object Properties 12-15 Working with Reports 12-17 Summary 12-21 Practice Session Overview: Lesson 12 12-23 Practice 12 12-24 Lesson 13: Applying Timers Introduction 13-3 Timers 13-5 Handling Timer Expiration 13-7 Creating a Timer 13-9 Modifying a Timer 13-11 Deleting a Timer 13-13 Summary 13-15 Practice Session Overview: Lesson 13 Practice 13 13-18
13-17
Lesson 14: Using Server Features in Form Builder Introduction 14-3 Using Oracle Server Functionality in Forms 14-5 Dealing with PL/SQL Code 14-7
Contents .....................................................................................................................................................
PL/SQL8 Support 14-9 New PL/SQL8 Scalar Data Types 14-11 Unsupported Client-Side PL/SQL8 Features 14-13 Handling Errors Raised by the Oracle Server 14-15 Performing DDL with FORMS_DDL 14-19 Using FORMS_DDL 14-21 Summary 14-23 Practice Session Overview: Lesson 14 14-25 Practice 14 14-26 Lesson 15: Using Reusable Components Introduction 15-3 Reusable Components 15-5 Reusable Components List 15-7 The Calendar Class 15-11 Calendar Object Group Content 15-13 Built-in for Manipulating the Calendar 15-15 Summary 15-17 Practice Session Overview: Lesson 15 15-19 Practice 15 15-20 Appendix A: Practice Solutions Practice 1 Solutions A-2 Practice 2 Solutions A-5 Practice 3 Solutions A-9 Practice 4 Solutions A-12 Practice 5 Solutions A-16 Practice 6 Solutions A-18 Practice 7 Solutions A-21 Practice 8 Solutions A-25 Practice 9 Solutions A-29 Practice 10 Solutions A-34 Practice 11 Solutions A-36 Practice 12 Solutions A-42
Contents .....................................................................................................................................................
Appendix B: Table Descriptions and Data Summit Sporting Goods Database Diagram S_CUSTOMER Description B-3 S_CUSTOMER Data B-4 S_DEPT Description and Data B-8 S_EMP Description B-9 S_EMP Data B-10 S_ITEM Description B-13 S_ITEM Data B-14 S_ORD Description and Data B-16 S_PRODUCT Description B-17 S_PRODUCT Data B-18 S_REGION Description and Data B-22 S_TITLE Description and Data B-23 Oracle8 objects: types, tables B-24
B-2
Appendix C: Project Builder Addendum Introduction C-3 Team Development with Project Builder C-5 Generating and Printing Project Reports C-11 Defining New Module Types C-13 Identifying New Module Types C-15 Describing New Module Types C-17 Actions for New Module Types C-19 An Icon for New Module Types C-21 Modifying Types Using Actions C-23 Customizing Actions by Using Macros C-25 Customizing the Launcher C-29 Inheritance in Project Builder C-31 Actions C-33
Contents .....................................................................................................................................................
Summary
C-35
Appendix D: Introduction to Oracle8 Object Features Introduction D-3 New Oracle8 Data Types D-5 Object Types D-7 Creating Oracle8 Objects D-11 Object Columns D-13 Object Views D-15 INSTEAD-OF Triggers D-17 Referencing Objects D-19 Displaying Oracle8 Objects in the Object Navigator D-21 Summary D-29 Appendix E: Menu Run-Time Parameters Introduction E-3 Substitution Parameters E-5 Defining a User-Named Substitution Parameter E-7 Substitution Parameter Built-ins E-9 Validating a Substitution Parameter Value E-11 Summary E-13 Appendix F: Handling Server-Side Errors Introduction F-3 Obtaining the Cause of Declarative-Constraint Violations F-5 Customizing Oracle Server Error Messages F-7 Example Procedure for Handling Oracle Server Errors F-9 Summary F-13 Appendix G: EMP_PKG Package Package Specification G-2 Package Body G-4 Appendix H: Working with ActiveX Controls Introduction H-3
Contents .....................................................................................................................................................
What Are VBX, OCX, and ActiveX Controls? H-5 Comparison of VBX, OCX, and ActiveX Controls H-7 ActiveX in Form Builder H-9 Implementing an ActiveX Control H-11 Inserting an ActiveX Control in an ActiveX Control Item H-13 Importing ActiveX Control Methods and Events Packages H-15 Setting and Getting ActiveX Control Properties H-17 Invoking ActiveX Control Methods H-21 Responding to ActiveX Control Events H-23 Handling Exceptions H-25 Registering an ActiveX Control H-27 Summary H-29 Appendix I: Using Oracle Server Roles at Run Time Using Oracle Server Roles at Run Time I-3 Procedures for Managing Roles I-7 Appendix J: Instructor Note Introduction J-2 How the Project Is Organized Project Setup J-4 Launching the Files J-8
J-3
Preface
.................................
Preface .....................................................................................................................................................
Instructor Note General course information for instructors: PowerPoint Slides The slide show provides many builds to facilitate your explanation. Of course, you can modify these builds if you prefer, depending upon your familiarity with PowerPoint. All slides include a small arrow at the bottom of the screen that is displayed on the final build, so that you know when one slide finishes and the next slide begins. On the last slide of a lesson the arrow points to the left instead of the right. If you modify a build, make sure that this arrow is the last object in the build order. Demonstrations A set of demonstrations is provided to help you with your explanations. You can launch the demonstration files from Project Builder. For additional information, see Appendix J, Instructor Note. Practice Sessions Students might want to view the form that they are asked to produce in each question. Solution files of all forms are available in the LAB_SOL directory. You can also launch them from Project Builder. See Appendix J Instructor Note for additional information.
Profile .....................................................................................................................................................
Profile
Before You Begin This Course Before you begin this course, you should have the following qualifications: Thorough knowledge of: - Creating simple applications with Oracle Developer Form Builder - Creating SQL query statements Working experience of: - Creating PL/SQL constructs, including conditional statements, procedures, and functions - Creating PL/SQL stored (server) procedures and functions Knowledge of using a graphical user interface (GUI) Prerequisites The following instructor-led training (ILT) course: Oracle Developer: Build Forms I Suggested Follow-up Courses Oracle Developer: Build Reports Oracle Developer: Deploy Web-Based Applications Oracle Designer: Design and Generate Oracle Developer Applications How This Course Is Organized Oracle Developer: Build Forms II is an instructor-led course featuring lectures and hands-on exercises. Online demonstrations and written practices reinforce the concepts and skills introduced.
Preface .....................................................................................................................................................
Related Publications
Oracle Publications
Title Oracle Developer Guidelines for Building Applications, Release 6 Oracle Developer Getting Started, Release 6 Part Number A50994-1 A50995-1
Typographic Conventions
Typographic Conventions in Text
Convention Bold italic Caps and lowercase Element Glossary term (if there is a glossary) Buttons, check boxes, triggers, windows Code output, directory names, filenames, passwords, pathnames, URLs, user input, usernames Graphics labels (unless the term is a proper noun) Emphasized words and phrases, titles of books and courses, variables Interface elements with long names that have only initial caps; lesson and chapter titles in cross-references SQL column names, commands, functions, schemas, table names Example The algorithm inserts the new key. Click the Executable button. Select the Cant Delete Card check box. Assign a When-Validate-Item trigger . . . Open the Master Schedule window. Code output: debug.seti(I,300); Directory: bin (DOS), $FMHOME (UNIX) Filename: Locate the init.ora file. Password: Use tiger as your password. Pathname: Open c:\my_docs\projects URL: Go to http://www.oracle.com User input: Enter 300 Username: Log on as scott Customer address (but Oracle Payables)
Initial cap
Italic
Quotation marks
Do not save changes to the database. For further information, see Oracle7 Server SQL Language Reference Manual. Enter user_id@us.oracle.com, where user_id is the name of the user. Select Include a reusable module component and click Finish. This subject is covered in Unit II, Lesson 3, Working with Objects.
Uppercase
Use the SELECT command to view information stored in the LAST_NAME column of the EMP table.
Preface .....................................................................................................................................................
Example Select File>Save. Press [Enter]. Press and release these keys one at a time: [Alt], [F], [D] Press and hold these keys simultaneously: [Ctrl]+[Alt]+[Del]
Typographic Conventions in Navigation Paths This course uses simplified navigation paths, such as the following example, to direct you through Oracle Applications. (N) Invoice>Entry>Invoice Batches Summary (M) Query>Find (B) Approve This simplified path translates to the following: 1 (N) From the Navigator window, select Invoice>Entry>Invoice Batches Summary. 2 (M) From the menu bar, select Query>Find. 3 (B) Click the Approve button. N = Navigator, M = Menu, B = Button
1
................................
Objectives
After completing this lesson, you should be able to do the following: Define Project Builder terminology Identify the uses of Project Builder Recognize the components of the Project Builder user interface Create projects and subprojects
Objectives
Invoke actions associated with entries Create entries from files and subdirectories Establish dependencies among project entries Build files and projects Deliver a project by using the Delivery Wizard
Instructor Note Topic Timing Lecture 40 minutes Practice 25 minutes Total 65 minutes
Introduction ......................................................................................................................................................
Introduction
Overview One of the most difficult aspects of application development is managing the files that make up an application. Large applications can consist of hundreds of files and millions of lines of code. In addition, files that are important to the project as a whole but that are not compiled into the application itself, such as design specifications, test scripts, and documentation, must also be tracked and maintained. This lesson explains how to use Oracle Developer Project Builder to help you manage application development. Additional Project Builder features are covered in Appendix C, Project Builder Addendum. Objectives After completing this lesson, you should be able to do the following: Define Project Builder terminology Identify the uses of Project Builder Recognize the components of the Project Builder user interface Create projects and subprojects Invoke actions associated with entries Create entries from files and subdirectories Establish dependencies among project entries Build files and projects Deliver a project by using the Delivery Wizard Instructor Note Individual componentsForm Builder, Report Builder, and so ondo not have splash screens. You see a splash screen only when you start Project Builder. Oracle Developer demonstrations include the project file that was used to create them. This file provides an excellent prebuilt demonstration that you can use to show students all the capabilities of Project Builder.
Project Entry Representation of project items in the Project Navigator Registry Type Action Macro Storehouse of information Category of files Command string Variable to customize and extend actions
Copyright Oracle Corporation, 1999. All rights reserved.
Subproject
Subproject
Project entries
Built-in Macros
Actions Macros
Registry
User
Instructor Note Demonstration: Use the Oracle Developer: Build Forms II project to illustrate the terminology. Show the different nodes, the Build From FMB action for the Form Builder executable type, and also the ORACONNECT macro.
Action
Macro
Registry
Instructor Note Insist on the word deliver. Do not use the word deploy. Project Builder is not yet able to deploy an application to end users. The only thing that Project Builder does is package a set of files.
1 2
3 4
Instructor Note Demonstration: Use the Oracle Developer: Build Forms II project to show the components. Expand the Summit application subproject node, and change the Project Navigator view. Launch Form Builder from the Launcher.
Dependency view
The Pop-up Menus Use the pop-up menus to launch actions against entries from the Project Navigator. 1 Select the entry. 2 Click the right mouse button. 3 Select one of the available actions shown on the pop-up menu. Note: You can add the commands you consider most useful to the type-specific popup menus available from the Project Navigator. The Property Palette Project Builder includes the Property Palette for connections, types, entries, and projects. Using the Property Palette, you can view and modify properties, actions, and macros. You can also add new actions and macros to types, entries, and projects. The Launcher Project Builder also provides the Launcher, a customizable toolbar to which you can add all the tools, including third-party tools, that you need to edit your project file. Customizing the Launcher is covered in Appendix C, Project Builder Addendum.
Instructor Note Demonstration: Create a new project by using the Project Wizard. Name your project Summit Application and add all the files for the Summit application. Explain that a connection is a named set of a username, a password, and a connect string that can be assigned as a group to a project entry or type.
Instructor Note The directory structure of a project can have far-reaching consequences. Suppose you include modules in a project that are located in a directory that is not a child of the project directory. Then you create actions that search for and modify project modules. How will you find the orphan modules? How will you create alternative actions with hard-coded paths? It is not portable. Perhaps you can search from the root, but this is not efficient. Recommendations: Locate modules in the project directory or in a directory that is a child of the project directory (a good choice when adding subprojects). Use only relative paths. In other words, create a project and subprojects that mirror your actual directory structure.
Instructor Note Create a subproject from a subdirectory. You can use the directory structure where the instructor demo files are stored.
Creating Connections
Creating Connections
In a typical project, the developer has a number of databases to work against. For example, there might be a small scratch database where the developer can create any test data he or she needs; a large test database that contains the data for a formal test suite; and perhaps databases running different versions of Oracle to test backward compatibility or new features. With Project Builder the developer can define and save the connect strings associated with these various databases, and then easily associate those connections with the project files, simply by dragging a connection and dropping it on the entry for the file. When the Form module is next opened from Project Builder, Form Builder automatically connects to the database before opening the form. Define a Connect String 1 Select the Connections node in the Project Navigator and choose New Connection from the pop-up menu to display the Add Connection dialog box. 2 Type a title in the Title text box. The title provides the label for the connect string in the Project Navigator. 3 Type a username, password, and connect string in the corresponding text boxes. 4 (Optional) Add comments in the Comments text field. 5 Click OK to accept the dialog and add the connection to your list of possible connections. Assign a Connect String to a Project or a Project Item 1 In the Project Navigator, expand the Connections node. Select the connection you want to associate with the project or project item. 2 Drag and drop the connection on the project or project item. The new connect string is inserted into the appropriate actions for all items in the project (if you assigned it to a project) or the project item.
Instructor Note Demonstration: Open a Form Builder file. Edit a SQL file or a text file. Show how to create and assign a connect string, because students will have to do it in the practice session. Display the Property Palette by selecting Tools>Property Palette. Mention that it is impossible to describe all the properties, because they differ from type to type. Explain that the properties are classified by family: - General information - Connections - Actions - Macros Do not demonstrate the other options. They are covered later in this lesson. Just explain what they mean.
Implicit Dependencies
Deduces dependencies from Deliverable Type property Build From <type> action Example
Type Deliverable Type Build From FMB FMB-Form Builder document FMX-Form Builder executable ..\bin\ifcmp60.exe
Explicit Dependencies
Add explicit dependencies in the Navigator: Select the parent, click Add Files. Cut the child; paste it onto the parent. Select Navigator> Dependency View.
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note To explain the needs of explicit dependencies, you can use the dependence between two.fmb files. When you make an object a subclass of a form and you change the parent definition. you must build the child.
Establishing Dependencies
Project dependencies refer to the order in which project entries depend on each other. For example, a Form Builder executable file (.fmx) depends on a Form Builder module file (.fmb), which may depend on a Form Builder library file (.pll), and so on. Implicit Dependencies Project Builder automatically deduces many dependencies from the Deliverable Type property and the Build From <type> action of interdependent types. The Deliverable Type property specifies whether the type of file delivered to the end user. The Build From <type> action specifies the command used to build a file of a given type. Example The type Form Builder module (.fmb files) has a deliverable type of Form Builder executable (.fmx files). Therefore, Project Builder can deduce that any .fmx files in your project are dependent on the associated .fmb files, and if those .fmb files change, the .fmx files must be rebuilt based on the Build From <type> action defined for the Forms Executable (.fmx) type. If there is no .fmx file already in your project, Project Builder will show it as an item that is implied by the existence of the .fmb. Explicit Dependencies Sometimes you will have dependencies that Project Builder cannot determine automatically. For instance, your form may contain calls to program units in a PL/SQL library. If the interfaces to the program units in the library change, you need to rebuild the Form Builder executable (.fmx). To allow the developer to include such dependencies in the project definition, dependencies can be added manually. To indicate that an .fmx depends on a PL/SQL library: 1 Select the entry (.fmx file). 2 Select Project>Add Files to Project. 3 Select the files to be added as a dependency of the selected entry. Note: To see the dependencies in the project, select Dependency View in the Project Navigator.
Building Projects
Three build options:
1 2 3
Copyright Oracle Corporation, 1999. All rights reserved.
Callouts
1 2 3 Build All Build Selection Build Incremental
Instructor Note Demonstration: Show all the options. If you want to demonstrate the Build Selection option, be sure to select the .fmx entries, and be sure not to select the .fmb entries. If you want to demonstrate the Build All option, be sure that you illustrate this option on a small project (with few files). Use, for example, the project that you created earlier (Summit Application).
Building Projects
Project Builder easily enables you to ensure that the build is up-to-date. You can update your project and build all dependencies by using one of three build options in the Project Builder Project menu:
Build Option Build Selection Description Select one or more files in the Project Navigator, and choose Build Selection from the Project menu. Project Builder rebuilds the selected files only. To build all files in the project, select the project in the Project Navigator and choose Build All. Project Builder builds all files, regardless of whether you have modified them since the previous compilation. To build modified files only, select Build Incremental from the Project menu, or click the equivalent toolbar button. Project Builder automatically determines which files need to be built, by examining the file time stamps to determine which files have been modified and rebuilding those that are out of date.
Build All
Build Incremental
Delivering Projects
After a project is completed, the remaining task is to deliver the executable files, help files, supporting media (such as sounds, images, videos, or icons), and any other files that the end user will need to have installed. Typically, the delivery process involves setting certain delivery properties and invoking the delivery wizard. The Deliver File Property To simplify this task, Project Builder includes the Deliver File property, which allows you to indicate which entries represent files to be delivered to the end user. Usually the Deliver File property will be inherited from the type. For some files this may not be appropriate. In this case, you can simply override the setting on individual entries, as with any other property. Alternatively, you might choose to organize all the deliverables into a separate subproject, and then set the Deliver File property on that subproject to Yes, which then all the files in the subproject will then inherit. The Deliver the Selected Files Action Before packaging your files, you must define the Deliver the Selected Files to be the exact command needed to archive the files. Typically, the definition for this action uses the PACKFILE macro. The PACKFILE Macro Before packaging your files, you must define the PACKFILE macro to be the name of the .zip or .tar file that is the result of the Deliver action. Actions and Macros are explained in Appendix C, Project Builder Addendum.
Delivering Projects (continued) Once youve developed and tested your project (the application that is a collection of forms, reports, graphics, and PLSQL modules), you need a way to package and deploy it on your target environments. The Delivery Wizard can help you accomplish these tasks by providing the means to: Copy or FTP your completed project, or product, to a staging area. Generate the necessary scripts so your product is installable on Windows 95 and NT through the Oracle Installer. Run your customized Deliver action against a project. To invoke the Delivery Wizard, select Tools>Delivery Wizard from the main menu. Delivery Using an Oracle Installer Script The Delivery Wizard can create the files you need to install your application using Oracle Installer. Select the project you want to deliver, and whether you want all of the files, or only changed files delivered. Select the radio button Deliver locally and create Oracle Installer scripts. Enter the destination directory for the scripts. Enter the name of the script, a program group name for the script, and a version number. You may choose to have the Oracle Developer runtime environment installed at the same time, if you wish. Select the files for delivery. These will be preselect according to each files Delivery property. Specify the subdirectories in which you want the files delivered. You may also specify a start menu label for any file. Specify andy environmental variables that need to be set. Delivery Using the Customized Delivery Action You may also use the Delivery Wizard to package files in an archive file, such as a .zip file or a .tar file. With this method, you must define the Deliver the Selected Files action and the PACKFILE macro. Actions and Macros are explained in Appendix C, Project Builder Addendum.
Summary
Defining Project Builder terminology Using the Project Navigator Creating connections Defining dependencies Building and delivering a project
Instructor Note For additional information about Project Builder, and especially how to use Project Builder in a team environment, see Appendix C, Project Builder Addendum.
Summary ......................................................................................................................................................
Summary
Project Builder Basics Define Project Builder terminology Identify Project Builder uses Describe Project Navigator features Building a Project Create projects and subprojects Create connections Open project files Build and deliver projects Note: For additional information about Project Builder, see Appendix C, Project Builder Addendum.
Practice 1 Overview
This practice covers the following topics: Creating an initial project Creating a connection Experimenting with the various Project Navigator views Creating subprojects and adding files and subdirectories to them Delivering a project
Copyright Oracle Corporation, 1999. All rights reserved.
Practice 1
1 Create a connection to the database.
3 4
Create a new connection. b Name the connection SUMMIT and specify the connect string. Your instructor should provide this information. Create an initial project. a Create a new project (use the Project Wizard). b Name the project Oracle Developer: Build Forms II. Assign to this project the connection created earlier, and save it as summit.upd in the Lab directory. Do not add files to this project. a Using the Project Wizard, create a subproject named Summit Application that belongs to Oracle Developer: Build Forms II. b From the labs directory, add: - baseball.tif - calendar.pll - copy.ico - customers.fmb - Form_Builder_II.olb - pr11_2f.txt - pr7_3a.sql c Give a file items a more meaningful title. Create a subproject and add files to it. Explore the Project Navigator. a Examine the state of the Project Navigator. Note that Project Builder has added executable versions of the Oracle source files that you added to the project. b Turn off the Show Implicit Items option. Note what happens to the Project Navigator display. c Experiment with Project Builders different views. Deliver the project. a Invoke the Delivery Wizard and deliver all files. b Create Oracle Installer scripts on your local file system. c Include all the deliverable files in the project. d Accept the default delivery directories.
a
Practice 1 ......................................................................................................................................................
Do not set any environmental variables upon installation. f Verify the settings, and finish the delivery. If you have time... 6 Create a subproject from a subdirectory and add files to it. Using the Project Wizard, create a subproject named Lab_Sol that belongs to Oracle Developer: Build Forms II. Automatically include all files in that subdirectory.
e
2
................................
Objectives
After completing this lesson, you should be able to do the following: Identify the components of a menu Create, save, and attach menu modules Set menu properties by using the Property Palette Create menu toolbars Create pop-up menus
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note
Topic Lecture Practice Total Timing 50 minutes 40 minutes 90 minutes
Introduction ......................................................................................................................................................
Introduction
Overview By default, each form module uses the same menu structure, called the Default menu. This lesson teaches you how to customize this menu and how to create your own menu modules. You will also learn how to enhance your application by including menu toolbars and pop-up menus. Objectives After completing this lesson, you should be able to do the following: Identify the different components of a menu module Create, save, and attach menu modules Set menu properties by using the Property Palette Create menu toolbars Create pop-up menus
Main menu
Individual menu
Menu toolbar
Instructor Note Demonstration: Run the Orders form (orders.fmb) to explain the components. Open the Default menu (menudef.mmb) to illustrate the hierarchical structure of a menu.
Default Menu
Action Save Clear All Print Print Setup Exit Edit Cut Copy Paste Edit Display List Query Block Record Field Help
Enter Previous Previous Previous Help Execute Next Next Next Keys Cancel Clear Scroll Up Clear List Last Scroll Duplicate Display Criteria Down Error Count Insert Debug Hits Remove Fetch Lock Next Duplicate Set Clear
Instructor Note The path for menudef.mmb is ORACLE_HOME/Tools/Devdem60/Demo/Forms. Open the Default menu (menudef.mmb), and show the menu items in the menu editor.
Menu tab
Technical Note By default, the Menu Editor displays a pull-down menu, with the top-level menu displayed horizontally. If you are developing a full-screen menu, you may want to display the top-level menu vertically, so that the display matches the way your menu will appear at run time. To change the orientation, click the Switch Orientation button. Instructor Note In the Menu Editor, the key sequences [Ctrl] + the down arrow and [Ctrl] + the right arrow create, respectively, a menu item below and to the right of an existing object. Use the Default menu (menudef.mmb) to show the Menu Editor functionalities. Show the steps to move a menu or a menu item. Show the steps to copy a menu to another level. Explain the alert duplicate menu or reuse the original. Demonstrate that if you move a submenu to a parent item with the Command Type property set to PL/ SQL or Null, Form Builder displays an alert.
Main Menu Menu Directory Menu Filename Startup Code Share Library with Form Use Security Module Roles
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note Do not spend a long time going through all the menu module properties; instead point out that they are here for convenience. Also, context-sensitive help is available.
Module Properties
Property Main Menu Description Property that specifies the name of the individual menu in the module that is the main or starting menu at run time For a pull-down menu, the main menu is automatically set to the name of the first menu that you create. Users cannot navigate above this menu in the menu hierarchy. Menu Directory Menu Filename Startup Code Share Library with Form Use Security Path used by Forms as a pointer to the directory for the run-time .mmx file; only used by menu modules that are saved to the database Filename used by Forms as a pointer to the run-time .mmx file; only used by menu modules that are saved to the database PL/SQL code executed when a menu module is loaded in memory Property that enables to be loaded in memory a single copy of a PL/ SQL library, if this library is used by the form module and the menu module Property that when set to Yes enforces security at run time (Set this property to No to test the menu module without having to be a member of any database role.) Property that displays the Menu Module Roles dialog box, where you can list the roles assigned to the menu module (Roles defined must be assigned to individual menu items in the Menu Editor.)
Module Roles
Menu Properties
Instructor Note Do not spend a long time going through all the menu properties; instead point out that they are here for convenience. The Tear-Off property is available for the Motif window manager.
Menu Properties
Property Tear-Off Menu Description Enables the menu to be dragged from the menu bar and repositioned elsewhere on the screen (available only if your window manager supports this feature)
Menu Item Code Submenu Name Keyboard Accelerator Icon in Menu Icon Filename
Technical Note Radio menu items must belong to a radio group. All of the radio items for a radio group must be contiguous on the same menu. Radio group names are internal names that are not displayed at run time. Instructor Note The mappings of logical accelerator keys to physical device keys are defined in the run-time resource file. You must edit the resource file in Oracle Terminal to change the key mappings. You can also create additional accelerator keys in Oracle Terminal (ACCELERATOR6, ACCELERATOR7, and so on), which you can then associate with menu items in a menu module. Demonstration next page: Use the Summit menu (m_summit.mmb) file to show the different menu item types. You can attach it to the ORDERS form and run it to illustrate the menu items at run time. You can also use the Customized menu (menu.mmb) file.
Defining Menu Access Keys Forms indicates an access key by underlining one special character in the menu item. Users can then issue the menu item command by pressing a key combination such as [Alt] + [character]. Specifying the Underline Character
Development execute query eXecute query Exe&cute Query Execute &Query Run Time execute query eXecute query Execute Query Execute Query
Magic Items
About Undo Clear Copy Cut Paste Help Quit Window
Separator Magic
Magic Items Some Magic menu items include default functionality. Because a Magic item provides the standard actions of a graphical user interface (GUI), a copy or paste action is already defined at the menu level. All you need to do is set the item to the Magic type and define the desired action (standard or specific).
Magic Item About Undo Clear Copy Paste Cut Help Command Type Any except Menu Null Default Functionality? No. You must assign a command to these items to perform the desired function. Yes. These items perform the default operations indicated by their names.
Menu
Quit
Null
Window
Null or Menu
No. You must define a submenu to be called by the Magic Help item, and you must assign commands to the items on that submenu. Yes. The Quit command, by default, exits from the form after asking the user to save any changes. Yes. The window item invokes a default submenu that lists all open windows. Users can activate a window by selecting it from the submenu.
PL/SQL Executes a PL/SQL command Plus Form Macro Spawns a process to SQL*Plus Backward compatibility Backward compatibility
Copyright Oracle Corporation, 1999. All rights reserved.
Plus
Note: The command types of Form and Macro are available for compatibility with SQL*Menu V4.0. and SQL*Menu V.5.0. Viewing Menu Item Commands To view the menu item command associated with a menu item, you must take one of the following actions: Double-click the icon to the left of the menu item entry in the Object Navigator Use the Menu Item Code or Submenu Name property in the Property Palette Right-click on the menu item in the Object Navigator or Menu Editor and select PL/SQL Editor from the pop-up menu
Technical Note For more flexible or complex requirements, use the existing Toolbar canvas in form modules. Instructor Note The Default menu toolbar works very well; however, building your own menu and menu toolbar is not so easy. For example, you have to create separator items for every space that you require to group the items. Also, the menu toolbar icons appear in exactly the same order as the menu options, which might not be what you want. Demonstration: Use the menu that you created earlier, and set the properties to display the Save option in a menu toolbar. Use the save.ico file.
You can save your menu module definition by either of the following actions: Clicking the Save icon in the Object Navigator Selecting File>Save Creating an Executable Version Before you can use your customized menu module, you must create an executable version. To do so, select File>Administration>Compile File. The resulting file that you create has the .mmx extension. A menu module executable file containing binary code is not portable between operating systems.
Technical Note If you want to use the Default menu without the associated menu toolbar, replace the value DEFAULT&SMARTBAR in the Menu Module property with DEFAULT only.
Instructor Note Demonstration: Run the Customers form (customers.fmb) demonstration. Navigate to the Comments item, and click the right mouse button.
Pop-up Menus
Pop-up menus are context-sensitive menus. You attach pop-up menus to an item or canvas, and display them by right click on that item or canvas. Pop-up menus enable end users to quickly access common functions and commands. Pop-up menus are top-level objects in the Object Navigator (similar to alerts, blocks, canvases, and so on) and belong to a form module (as opposed to form menus, which belong to a separate menu module). Items on a pop-up menu should be contextual to the menus associated objects. For example, you would not include text-editing items on the pop-up menu for a two-digit numeric item. You might include such items on the popup menu for a multiline text item, however. Incorporating Pop-up Menus 1 In the Object Navigator of a form, click the Pop-up Menus node, and click the Create button on the toolbar. Form Builder creates a pop-up menu and gives it a default name, such as MENU1. 2 In the Object Navigator or Menu Editor, create a main pop-up menu, submenus (if any), and menu items. 3 Assign commands to the menu items. 4 Attach the menu to items and canvases with a new Pop-up Menu property. Rules for Incorporating Pop-up Menus To show pop-up menus for a canvas, the mouse must be on the canvas only. Pop-up menu items can be parents of submenus (if the platform allows it), magic menu items, or separators. Pre-Popup-Menu Trigger You can use this trigger to add dynamic control at run time, prior to displaying the menu. For example, you can use the trigger to identify the cursor context and navigate to a different item if necessary. Instructor Note Beginning with release 6, pop-up menus support icons, check boxes, and option buttons.
Summary
Menu module components The Default menu Creating a menu module Menu properties Menu module storage Menu module and form module association Pop-up menu
Copyright Oracle Corporation, 1999. All rights reserved.
Summary ......................................................................................................................................................
Summary
In this lesson, you learned how to add, create, and customize menu modules. The Menu Module Components Main menu Menu Menu item Menu toolbar The Default Menu Automatically used with every form module Can be customized Creating a Menu Module Properties Menu module properties Menu properties Menu item properties Implementing a Menu Toolbar Menu Module Storage Database tables .mmb file extension .mmx file extension .mmt file extension Menu Module and Form Module Association Using the form module properties of Menu Module and Menu Source Creating a Pop-up Menu Incorporate pop-up menus Rules to incorporate pop-up menus Pre-Popup-Menu trigger
Practice 2 Overview
This practice covers the following topics: Creating a simple menu module Incorporating some of the menu items in the menu toolbar Compiling and attaching the menu to the ORDERS form Creating a pop-up menu
Instructor Note The practice overview in this lesson and the ones that follow are provided only as guides. Outline the practice in the level of detail appropriate for the course participants. For this lab, use the DO_KEY built-in. At this stage of the course, students do not yet know this built-in. Explain it briefly and tell them that it is covered in detail in Lesson 4.
Practice 2
1 Create a new menu module. a
Using the following screenshot as a guideline, create a new menu module called M_SUMMIT.
File Menu
Menu Item Type Plain Visible in Menu Yes Visible in Horiz. Menu Toolbar Yes
Label Save
Clear
Plain
PL/SQL
Yes
Yes
Abort
Null1 Exit
Separator Plain
Yes Yes
Null2
Separator
Null
No
Yes
Practice 2 ......................................................................................................................................................
Edit Menu
Menu Item Type Magic Magic Magic Separator Magic Item Cut Copy Paste Command Type Null Null Null Null Visible in Menu Yes Yes Yes No Visible in Horiz. Menu Toolbar Yes Yes Yes Yes Icon Filename Cut Copy Paste
Sort By Menu
Menu Item Type Menu Item Radio Group Order_By Command Type
Menu Label
Order Id
Radio
PL/SQL
SET_BLOCK_PROPERTY( s_ord, order_by, id ) ; SET_BLOCK_PROPERTY( s_ord, order_by, customer_id ) ; SET_BLOCK_PROPERTY( s_ord, order_by, sales_rep_id ) ;
Customer Id
Radio
Order_By
PL/SQL
Sales Rep Id
Radio
Order_By
PL/SQL
Query Menu
Menu Item Type Plain Plain Command Type PL/SQL PL/SQL Visible in Horiz. Menu Toolbar Yes Yes Icon Filename query execute
Save as M_SUMMIT and compile the menu module. c Attach the menu module to the ORDERS form. d Save and compile the form module. e Run and test the ORDERS form. 2 Add pop-up menus to the CUSTOMERS form. a Open the CUSTOMERS form module. b Copy the EDIT_MENU menu from the M_SUMMIT menu module to the CUSTOMERS form. Attach this pop-up menu to the Comments item. c Save and compile the form module.
b
3
................................
Objectives
After completing this lesson, you should be able to do the following: Control the menu programmatically Manage the interaction between the menu and form documents Implement application security through the menu
Instructor Note
Topic Lecture Practice Total Timing 50 minutes 40 minutes 90 minutes
Introduction ......................................................................................................................................................
Introduction
Overview In this lesson, you will learn how to modify menus dynamically, as well as how to control application security through menu access. Objectives After completing this lesson, you should be able to do the following: Control the menu programmatically by using menu built-ins Customize menu modules by using substitution parameters Implement menu security by using both database roles and the appropriate built-ins
form objects
Must use NAME_IN built-in function Cannot use direct assignment for
form objects
Must use COPY built-in procedure
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note The DO_KEY built-in is explained in the next lesson. Stress that it is very important to use this built-in for generic coding.
Instructor Note Demonstration: Use the Summit menu (m_summit.mmb) file to show examples of these built-ins.
Example This procedure finds the ID of a menu item before setting multiple properties.
DECLARE mi_id MenuItem; BEGIN mi_id := Find_Menu_Item(Preferences.AutoCommit); /* Determine the current checked state of the AutoCommit menu checkbox item and toggle the checked state */ IF Get_Menu_Item_Property(mi_id,CHECKED) = TRUE THEN Set_Menu_Item_Property(mi_id,CHECKED,PROPERTY_FALSE); ELSE Set_Menu_Item_Property(mi_id,CHECKED,PROPERTY_TRUE); END IF; END;
Technical Note REPLACE_MENU replaces the menu for all windows in the application. If you are using CALL_FORM, REPLACE_MENU replaces the menu for both the calling form and the called form with the specified menu.
Example Use a standard procedure to change which root menu in the current menu application appears in the menu bar. A single menu application may have multiple root menus, which an application can set dynamically at run time.
PROCEDURE Change_Root_To(root_menu_name VARCHAR2) IS BEGIN Replace_Menu(MYAPPLSTD, PULL_DOWN, root_menu_name); END;
What Is a Role?
Users
Role
Privileges
Copyright Oracle Corporation, 1999. All rights reserved.
Technical Note If Use Security is modified, you must recompile the menu module.
Assigning Roles to the Menu Module To associate a particular role with a menu item, you must define all the roles used in that menu module: 1 In the Object Navigator, select the menu module. 2 In the Properties window, select the Menu Module Roles property. 3 Click More... to open the Menu Module Roles dialog box. 4 Enter the names of the roles that you want to choose for this menu module. 5 Click OK to accept the roles list. Note: The role must exist in the database. Setting the Use Security Property The Use Security property determines whether Form Builder should take account of the specified roles at run time. When Use Security is set to Yes, Forms enforces security. When Use Security is set to No: Forms ignores security. Your users can access all menu items. You can test your application without being a member of all roles.
Instructor Note You can manipulate roles dynamically at run time by using Form Builder. For example, you can select views from the data dictionary to get information about existing roles. Subprograms belonging to the DBMS_SESSION package enable you to modify the roles that are used by the menu module to enforce security. Tell students that if they want more details about DBMS_SESSION, they can read Appendix I, Using Oracle Server Roles at Run Time.
Summary
PL/SQL in menu item commands Built-ins for use with menus Implementing menu security
Summary ......................................................................................................................................................
Summary
PL/SQL in Menu Item Commands Typical PL/SQL uses Restrictions for PL/SQL in menu item commands Built-ins for Use with Menu Modules Showing and hiding the current menu: - HIDE_MENU - REPLACE_MENU - SHOW_MENU - MENU_REDISPLAY Getting and setting menu properties: - FIND_MENU_ITEM - GET_MENU_ITEM_PROPERTY - SET_MENU_ITEM_PROPERTY
Practice 3 Overview
This practice covers the following topics: Enhancing the menu with a check menu item Synchronizing the Image Activate menu item with the Image button Disabling irrelevant menu items according to form context
Instructor Note The practice overview in this lesson and the ones that follow are provided only as guides. Develop the practice with the level of detail appropriate for the students. This lab uses a lot of PL/SQL code. Because this is not a coding course, we provide the code. Take time to explain this practice so that students understand the code that they will import.
Practice 3
1 Define a check menu item.
Open the M_SUMMIT menu module and create a new menu item to the right of Query and rename it Image. b Create a new menu item under Image and name it Image Activate.
a Menu Label Menu Item Type Command Type
Image Activate
c
Check
PL/SQL
Import the text for the Image Activate menu item by using the pr3_1c.txt file. The menu item name must be IMAGE_ACTIVATE. d Save and compile the menu module. e Run and test the ORDERS form. 2 Synchronize the menu module with the form. a Write startup code for the M_SUMMIT menu module that synchronizes the Image Activate menu item with the Image button. You can import the pr3_2a.txt file. b Save and compile your module. 3 The menu items Sort By and Image are not relevant to the CUSTOMERS form and therefore should have no effect. a Attach the menu module to the CUSTOMERS form. b Modify the startup code of the M_SUMMIT menu module to disable these options when the CUSTOMERS form is opened. You can replace the existing code with the code from the pr3_3b.txt file. You may need to change the code to conform to the exact names you gave to the Main Menu and its menu items. c Save and compile the module. d Run the CUSTOMERS form and test your application.Execute a Query and click the Orders button to move to the ORDERS form. Note that the Sort By and Image menu items are disabled when the CUSTOMERS form is current, and that they are enabled when the ORDERS form is current.
4
................................
Objectives
After completing this lesson, you should be able to do the following: Define key triggers and their uses Program function keys Describe the characteristics of key triggers Classify key triggers Associate function keys with interface controls
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note
Topic Lecture Practice Total Timing 40 minutes 40 minutes 80 minutes
Introduction ......................................................................................................................................................
Introduction
Overview The Oracle Developer Form Builder components enable you to redefine the actions of function keys. This lesson shows you how to define key triggers to intercept and supplement the usual behavior of the function keys with which your users navigate the Oracle Developer application. Objectives After completing this lesson, you should be able to do the following: Define key triggers and their uses Program function keys Classify key triggers Associate function keys with interface controls
Key Triggers
What is a key trigger? Example: Using Key-Exit, display an alert and exit the application if the user answers Yes.
SET_ALERT_PROPERTY(question_alert, ALERT_MESSAGE_TEXT, SET_ALERT_PROPERTY(question_alert, ALERT_MESSAGE_TEXT, Do you really want to leave the form? ); Do you really want to leave the form? ); IF SHOW_ALERT(question_alert) = ALERT_BUTTON1 THEN IF SHOW_ALERT(question_alert) = ALERT_BUTTON1 THEN EXIT_FORM; -- default functionality EXIT_FORM; -- default functionality
Key Triggers
If you press a function key, Forms usually performs the default function associated with that key. You can modify the standard functionality of a function key by defining a key trigger for that function key. What Is a Key Trigger? A key trigger, like any other trigger, is a subprogram that is executed when a certain event occurs. In the case of a key trigger, the event is pressing the function key for which the trigger is defined. The trigger is usually named after the event that causes it to fire. When the key trigger is defined for a function key, the usual functionality of the key is replaced by the PL/SQL text of the trigger. In this respect, key triggers resemble on triggers. Example The form level Key-Exit trigger below displays an alert to ask to the end user if he or she wants to leave the form.
SET_ALERT_PROPERTY(question_alert, ALERT_MESSAGE_TEXT, Do you really want to leave the form?); IF SHOW_ALERT(question_alert) = ALERT_BUTTON1 THEN EXIT_FORM; -- default functionality END IF;
Note: If you also want to execute the default functionality of the function key, you must ensure that the key trigger includes the built-in function associated with the key. Example The following form-level Key-Menu trigger disables [Block Menu] for a form.
BEGIN NULL; END;
Instructor Note Demonstration: Open the LOV Form (Orders2.fmb). Change those properties for the Key-Duprec trigger at the form level. Run the form.
Technical Note The function keys Fn do not necessarily map to F1, F2, F3, and so on.
Key-Others trigger
Technical Note Since mouse-event key triggers are not executed when the mouse is used to initiate window interaction, you should not place code that needs to be executed every time the window interaction occurs in a mouse-event key trigger. Instructor Note Demonstration for next page pair: Use the LOV Form (Orders2.fmb) demonstration to show preventing duplication of the primary key by using the Key-Duprec trigger. Use the same demonstration to illustrate a call of a customized list of values (LOV) form instead of the native Forms LOV, using Key-Listval. To do this click the product LOV button. Do not explain in detail the code associated with this button, because the students will write it later in this course.
What Are Mouse-Event Key Triggers? Mouse-event key triggers are function key triggers whose associated default functionality can also be activated directly with the mouse. Examples The Key-Nxtblk trigger is a mouse-event key trigger, because the NEXT_BLOCK functionality can also be activated using the mouse by clicking in the next block. In this case, a possible Key-Nxtblk trigger will not fire. The Key-Exeqry trigger is not a mouse-event key trigger, because the EXECUTE_QUERY functionality cannot be activated by simply clicking the mouse. It can be activated by the mouse only if a trigger is defined that fires as a result of the mouse action.
Instructor Note Demonstration: Use the LOV Form + Duplication Primary Key (Orders2.fmb) demonstration, and show the code for the CONTROL.EXIT_BUTTON button. Also show the Key-Exit trigger at form level.
Example Exit a Form by clicking [Exit Form] or an Exit button, or by choosing a menu item. 1 Define a Key-Exit trigger at form level. 2 Call DO_KEY by using: a The When-Button-Pressed trigger on the associated Exit button b The menu-item code for the menu item that exits the form using DO_KEY(EXIT_FORM); Interface Control Descriptions If the same functionality is activated by various interface controls, you should also make sure that the controls have the same descriptions.
Interface Control Function key Menu item Button Mouse event Property for Description Show keys description Menu-item label Button label Not applicable Changeable at Run Time? No Yes Yes Not applicable
Summary
Display in Keyboard Help and Keyboard Help Text Key-Fn, Key-Others, and mouse-event key triggers Using key triggers Function keys, buttons, menu items, and mouse events Example: DO_KEY(EXIT_FORM);
Copyright Oracle Corporation, 1999. All rights reserved.
Summary ......................................................................................................................................................
Summary
Understanding Key Triggers They fire when the associated function key is pressed. They are defined like any other trigger. Special properties are Display in Keyboard Help and Keyboard Help Text. Classification of Key Triggers Function key triggers Key-Fn triggers Key-Others Mouse-event key triggers Uses of Key Triggers Disable function keys Replace or extend default behavior of function keys Add function keys using Key-Fn triggers Adjust set of function keys using Key-Others Association with Other Interface Controls Function keys, buttons, menu items, mouse events Keys description, button label, menu-item label
Practice 4 Overview
This practice covers the following topics: Examining the behavior of [Duplicate Record] at run time Redefining [Duplicate Record]
To create a new record before
duplication
To clear primary key items after
Practice 4
1 Create and modify a key trigger.
Open the ORDERS form module and replace the M_SUMMIT menu module with the DEFAULT&SMARTBAR menu. b Run the form and make sure that you understand the default behavior of [Duplicate Record], by invoking it once while the cursor is on a queried record in the S_ORD block and again when the cursor is on a new record. c Redefine [Duplicate Record] so that a new record is created before the record duplication occurs. Redefine [Duplicate Record] at the form level. d In the S_ORD block, redefine [Duplicate Record] in such a way that the Id item is emptied after duplication. This code should be executed in addition to and after the form level code. e In the S_ITEM block, redefine [Duplicate Record] in such a way that the item_id, product_id, description, and price items are emptied after duplication. This code should be executed in addition to and after the form level code. f Save, generate, and test the ORDERS form. If you have time... 2 Disable function keys. a Make sure that only the function keys [Duplicate Record], [Execute Query], [Enter Query], [Create Record], [Clear Block], [Up], and [Down] can be used for the S_ORD master block. All function keys should be available for the S_ITEM detail block. b Test whether you can exit from the form by selecting the [Exit] key in the master block. c Add a form-level Key-Exit trigger to perform the exit functionality of the CONTROL.EXIT_BUTTON item. d Test again whether you can exit from the form by selecting [Exit] in the master block. Explain this behavior. e Modify the When-Button-Pressed trigger of the CONTROL.EXIT_BUTTON item to activate the same functionality when you select the [Exit] function key. Remove the existing code. 3 Create and modify a key trigger. a Create an alert called DELETE_ALERT.
a
Practice 4 ......................................................................................................................................................
For the S_ORD and S_ITEM blocks, redefine [Delete Record] so that the alert is displayed when a record is deleted. Modify the message displayed, depending on the block where the cursor is. c Specify new text to be displayed in the run-time Show Keys help window.
b
5
................................
Objectives
After completing this lesson, you should be able to do the following: Define mouse events Cause a form module to respond to mouse movement Cause a form module to respond to mouse button actions Drag and drop items
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note
Topic Lecture Practice Total Timing 40 minutes 30 minutes 70 minutes
Instructor Note Demonstration for the next page pair: Use the Cursor Style (cursor_style.fmb) demonstration to show the mouse cursor style.
Introduction ......................................................................................................................................................
Introduction
Overview The keyboard, menu, and mouse are the operators tools for interacting with the Forms application. This lesson demonstrates how to write an application that responds to mouse events. Objectives After completing this lesson, you should be able to do the following: Define mouse events Cause a form module to respond to mouse movement Cause a form module to respond to mouse button actions Drag and drop items
Mouse Events
Point at which processing can be influenced Identified by:
Mouse movement Mouse button action
Instructor Note Do not forget to change the cursor style to DEFAULT in case of a trigger failure.
The valid settings for the cursor style property are: BUSY CROSSHAIR DEFAULT HELP INSERTION
When-Mouse-Leave
When-Mouse-Move
Copyright Oracle Corporation, 1999. All rights reserved.
Technical Note Using the When-Mouse-Enter, When-Mouse-Leave, and When-Mouse-Move triggers can affect the performance of your form, because these triggers have the potential to fire frequently. Instructor Note Demonstration: Use the Simple Mouse Events (mouse_event.fmb) demonstration to illustrate a humorous use of the When-Mouse-Enter trigger. You can also use the Mouse Events (mouse.fmb) demonstration to illustrate all the mouse triggers and system variables.
Uses of the Mouse Movement Triggers Use When-Mouse-Move in conjunction with the SYSTEM.MOUSE_X_POS and SYSTEM.MOUSE_Y_POS system variables to return the exact position of the mouse within an item. Use When-Mouse-Leave to update an item value without causing the cursor to navigate out of the current item.
Navigation in a Block
1
7 6
3 4
5
Copyright Oracle Corporation, 1999. All rights reserved.
1 2 3 4
5 6 7
Technical Note The SYSTEM.MOUSE_FORM system variable is NULL if the platform is not a GUI platform. Instructor Note Demonstration: Use the Mouse Events (mouse.fmb) demonstration to illustrate all the mouse triggers and system variables. Demonstration for the next page pair: Use the Mouse Events (mouse.fmb) demonstration to illustrate all the mouse triggers and system variables.
The Mouse Position System Variables Use the following system variables to determine when the mouse has moved, where it has moved from, and where it has moved to.
Variable SYSTEM.MOUSE_FORM Use Identifies the form module that the mouse is currently in SYSTEM.MOUSE_CANVAS Identifies the canvas that the mouse is currently on SYSTEM.MOUSE_ITEM Identifies the item that the mouse is currently in SYSTEM.MOUSE_RECORD Identifies the record number that the mouse is currently in SYSTEM.MOUSE_RECORD_OFFSET Identifies the number of the record that the mouse is currently in, relative to the first visible record; uses a 1-based index SYSTEM.MOUSE_X_POS Identifies the x coordinate of the mouses current position (If the mouse is positioned on a canvas, the x coordinate is measured relative to the top left corner of the canvas. If the mouse is in an item, the x coordinate is measured relative to the top left corner of the item.) SYSTEM.MOUSE_Y_POS Identifies the y coordinate of the mouses current position (If the mouse is positioned on a canvas, the y coordinate is measured relative to the top left corner of the canvas. If the mouse is in an item, the y coordinate is measured relative to the top left corner of the item.)
When-Mouse-Up
When-Mouse-Click click
Technical Note Click and double-click work only if the mouse stays on the item (or canvas) throughout the down-up action.
When-Mouse-Up
When-Mouse-Click When-Mouse-Doubleclick
Firing Sequence for Mouse Button Action Triggers When you double-click an item or canvas, you are potentially causing the following triggers to fire in the order in which they are listed. Similarly, when you click an item or canvas, the triggers that precede the When-Mouse-Click trigger will fire. When-Mouse-Down When-Mouse-Up When-Mouse-Click When-Mouse-Down When-Mouse-Up When-Mouse-Doubleclick
SYSTEM.MOUSE_BUTTON_MODIFIERS
Ctrl
Alt
Instructor Note There are now more useful system variable names for the mouse button state. SYSTEM.MOUSE_BUTTON_MODIFIERS should be used in place of SYSTEM.MOUSE_BUTTON_SHIFT_STATE. The values returned by SYSTEM.MOUSE_BUTTON_MODIFIERS are invariant across all platforms and languages. SYSTEM.MOUSE_BUTTON_SHIFT_STATE returns the string, but in the language of the operating system. SYSTEM.MOUSE_BUTTON_MODIFIERS always returns the same string, regardless of OS language. Demonstration: Use the Mouse Events (mouse.fmb) demonstration to illustrate all the mouse triggers and system variables. Demonstration for the next page pair: Use the Drag and Drop (dragdrop.fmb) demonstration to show an example of drag and drop use. Click an employee number, and drag this employee to a department.
The Mouse Button System Variables Use the following system variables to determine which of the mouse buttons was pressed and which special key, if any, was used.
Variable SYSTEM.MOUSE_BUTTON_PRESSED Use Identifies which mouse button was pressed (values of 1-5, where 1 is the left mouse button) Identifies which special key was pressed to modify the usual mouse button action
SYSTEM.MOUSE_BUTTON_MODIFIERS
(possible values are Shift+, Caps Lock+, Control+, Alt+, Command+, Super+, and Hyper+) If the operator holds down the [Ctrl] and [Shift] keys while pressing the mouse button, SYSTEM.MOUSE_BUTTON_MODIFIERS contains the value Shift+Control+.
Items repositioned
Instructor Note A library named drag.pll is shipped with the product. Use the following steps as a demonstration: 1 Create a new form module and a new text item manually. 2 Attach the PL/SQL library drag.pll to your form. 3 For this item, create a When-Mouse-Down trigger, a When-Mouse-Move trigger, and a When-Mouse-Up trigger. In the When-Mouse-Down trigger, include the following statement:
MOUSE.CLICK;
You can also include code here to change the cursor to indicate that a drag operation is occurring. In the When-Mouse-Move trigger, include the following statement:
IF :SYSTEM.MOUSE_BUTTON_PRESSED =1 THEN MOUSE.MOVE; END IF;
In the When-Mouse-Up trigger, add your application-specific code, which should check where the object has been dropped, and take appropriate action.
What Is Drag and Drop? The drag and drop functionality is the ability for users to move items around the canvas and arrange them in the order they want. Implementing Drag and Drop Functionality You can use the mouse button action triggers (When-Mouse-Down and When-Mouse-Up) and the mouse position system variables to implement drag and drop functionality in your form module. You need to consider the following when implementing drag and drop: Changing the appearance of the item you want to drag and drop: Use the SET_ITEM_PROPERTY built-in and a visual attribute. Changing the appearance of the cursor during the drag and drop process: Use SET_APPLICATION_PROPERTY(cursor_style, value). Holding the name of the item being dragged and dropped.: Use a global variable to store the initial value of SYSTEM.MOUSE_ITEM. Setting the new position, according to the mouse position: Use SET_ITEM_PROPERTY(:global.variablename, position, :SYSTEM.MOUSE_X_POS, :SYSTEM.MOUSE_Y_POS). Repositioning other items that may be affected
Summary
Mouse events Responding to mouse movement
Mouse position system variables Mouse movement triggers
Summary ......................................................................................................................................................
Summary
In this lesson, you saw how to write an application that responds to mouse events. Mouse Events Entry to a canvas or an item Exit from a canvas or an item Move the cursor Click Double-click Up Down Responding to mouse movement Mouse position system variables Mouse Movement Triggers When-Mouse-Enter When-Mouse-Leave When-Mouse-Move Responding to Mouse Button Actions Mouse button system variables Mouse button triggers - When-Mouse-Click - When-Mouse-Doubleclick - When-Mouse-Up - When-Mouse-Down
Practice 5 Overview
This practice covers the following topics: Invoke an editor when the operator double-clicks an item Define mouse-event trigger to display the Help canvas
Practice 5
In this practice, you provide additional functionality in your forms by defining mouse-event triggers. 1 In the CUSTOMERS form, define a mouse-event trigger on S_CUSTOMER.COMMENTS that invokes the items editor when the user double-clicks the item. 2 In the ORDERS form convert the CONTROL.SHOW_HELP_BUTTON button into a display item capable of displaying a single large character. Change the item type property and choose a font that allows large character sizes (such as Times New Roman). Set the font size to 24. Set Bevel to none. Adjust the item size so that one character is visible inside it. Since only the first character of the item name is visible in the Layout Editor, this item appears as S. The items background color should match the toolbar, and its text color should be green. 3 In the ORDERS form, define a When-Mouse-Enter trigger at form level that assigns a value of? to the display item CONTROL.SHOW_HELP_BUTTON. This should occur only when the mouse is in the CV_ORDER canvas. 4 Create a When-Mouse-Enter trigger on CONTROL.SHOW_HELP_BUTTON that uses the SHOW_VIEW built-in to display the CV_HELP. Remove the When-Button-Pressed trigger. 5 Create a When-Mouse-Leave trigger on CONTROL.SHOW_HELP_BUTTON that hides the CV_HELP. Use the HIDE_VIEW built-in to achieve this. Delete the CONTROL.HIDE_HELP_BUTTON button. 6 Save, compile, and run the ORDERS form to test. The stacked canvas, CV_HELP is displayed only if the current item is not obscured. Ensure, at least, that the first entered item in the form is CV_HELP will not obscure. If you have time... 7 Modify the When-Mouse-Enter and When-Mouse-Leave triggers to display the Cv_Help canvas, even if the current item is obscured. You can replace the existing code with the code from the pr5_7_1.txt and pr5_7_2.txt files.
6
................................
Objectives
After completing this lesson, you should be able to do the following: Display a form document in multiple windows Write code to interact with windows Manipulate windows programmatically Manipulate canvas-views programmatically Use large data blocks
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note
Topic Lecture Practice Total Timing 40 minutes 45 minutes 85 minutes
Introduction ......................................................................................................................................................
Introduction
Overview You should already be familiar with setting window and canvas properties at design time. This lesson covers the triggers and built-ins that you can use to manage the properties and behavior of windows and canvases at run-time. Objectives After completing this lesson, you should be able to do the following: Display a form module in multiple windows Write code to interact with windows Manipulate windows programmatically Manipulate canvas-views programmatically Use large data blocks
When-Window-Deactivated Deactivates a window When-Window-Closed When-Window-Resized Closes a window Maintains visual standards
Keeping Track of the Triggered Window The SYSTEM.EVENT_WINDOW system variable contains the name of the last window for which a window-interaction trigger fired. You can use this system variable to perform different actions for different windows in your window-interaction triggers. Note: Help with triggers is available by pressing [Ctrl] + [H] and selecting PL/SQL Reference - Triggers.
Technical Note In Microsoft Windows, you can reference the multiple-document interface (MDI) application window with the FORMS_MDI_WINDOW constant. FORMS_MDI_WINDOW is used with certain built-in functions and procedures that relate to windows.
Technical Note REPLACE_CONTENT_VIEW does not hide the stacked canvas already displayed in the window, whereas SHOW_VIEW and SET_VIEW_PROPERTY (with the Visible property) display the given canvas in front of any stacked canvas. Instructor Note Point out that the GET_ built-ins are the most important ones when writing generic code. Demonstration for the next pages: Use the Tab Pages (tab_page.fmb) demonstration to show those system variables. Click a tab page and press [F1]; a message is displayed. Use the same demonstration to show how to enforce navigation when a user selects a tab page. Use the same demonstration to illustrate the TOPMOST_TAB_PAGE argument. Click the TopMost Tab Page button.
Instructor Note The trigger does not fire if the end user presses [Next Item] + [Tab] to navigate from one field to another in the same block but on different tab pages.
Instructor Note TOPMOST_TAB_PAGE returns only the tab page name, and not the canvas name. To set a property, you must concatenate the canvas name with the page name.
SET_TAB_PAGE_PROPERTY
GET_TAB_PAGE_PROPERTY
Note: The tab page is named using the syntax CanvasName.PageName. Example
DECLARE tp_id Tab_Page; BEGIN tp_id := Find_Tab_Page(Canvas2.TabPage1); IF Get_Tab_Page_Property(tp_id, enabled) =FALSE THEN Set_Tab_Page_Property(tp_id, enabled,property_true); END IF; END;
Other Arguments for Canvas Built-ins If you want to make a tab page the top-most on its underlying tab canvas, you can use the built-in procedure SET_CANVAS_PROPERTY and set the canvas property TOPMOST_TAB_PAGE. You can also get the top-most tab page by using the built-in function GET_CANVAS_PROPERTY.
GET_CANVAS_PROPERTY(canvas_name, TOPMOST_TAB_PAGE) SET_CANVAS_PROPERTY(canvas_name, TOPMOST_TAB_PAGE, page_name)
In the preceding syntax example, page_name is either a constant, in single quotes, or a variable.
Block 2
Block 3
Cursor location
Technical Note You can also maximize the MDI window application with the WINDOW_STATE command line parameter:
ifrun60.exe module=customer.fmx userid=my_name/my_password@my_database window_state=maximize
Instructor Note Demonstration: Use the Window Coding (window.fmb) demonstration to show the two examples described above. Show the When-New-Form-Instance trigger, which includes the code for maximizing the MDI application window. Show the GET_CURSOR_WINDOW program unit.
Locating the Cursor Window The cursor may be located in a nonactive window. In this case, you can use the following GET_CURSOR_WINDOW function to find this window.
FUNCTION get_cursor_window RETURN VARCHAR2 IS BEGIN RETURN (GET_VIEW_PROPERTY(GET_ITEM_PROPERTY( NAME_IN(system.cursor_item),item_canvas), window_name)); END;
Instructor Note Demonstration: Use the Window Coding (window.fmb) demonstration to show cascaded windows with context. Show the Key-Help trigger, which includes the code for cascading windows with context.
Instructor Note Demonstration: Use the Window Coding (window.fmb) demonstration to show a form using the Close option from the Microsoft Windows System menu.
Closing Windows
Use the Close Menu item on the system-menu box to provide the user with a means for closing windows. Because there is no default behavior in Forms when a user chooses the Close Menu item, you must define a When-Window-Closed trigger. The following examples show a form based on departments and employees. The department block and employee block are located in separate windows. The WhenWindow-Closed and When-Window-Activated triggers implement the following functionality: Exiting from the form or hiding the window that is closed by the user (Forms automatically activates another window.) Navigating to the newly activated window Note: The function GET_CURSOR_WINDOW, discussed in an earlier example, is used here. The When-Window-Closed Trigger at Form Level
BEGIN IF :SYSTEM.EVENT_WINDOW = WINDOW1 THEN DO_KEY(exit_form); ELSIF :SYSTEM.EVENT_WINDOW = WINDOW2 THEN HIDE_WINDOW(window2); END IF; END;
Instructor Note Demonstration: Use the large block (Tab_Page.fmb) demonstration to illustrate the example above. The larg_emp.sql file drops and creates the S_LARGE_EMP table.
Summary
Window-interaction triggers SYSTEM.EVENT_WINDOW Built-ins for manipulating windows Built-ins for manipulating canvases Built-ins for manipulating tab canvases
Summary
Windows and blocks
Multiple blocks correspond to
multiple windows.
Window activation does not induce
navigation.
Transaction management is block-
oriented.
Summary ......................................................................................................................................................
Summary
Window-Interaction Triggers When-Window-Activated When-Window-Deactivated When-Window-Closed When-Window-Resized Use the SYSTEM.EVENT_WINDOW system variable to keep track of the triggered window. Built-ins for Manipulating Windows FIND_WINDOW GET_WINDOW_PROPERTY SET_WINDOW_PROPERTY HIDE_WINDOW SHOW_WINDOW MOVE_WINDOW RESIZE_WINDOW Built-ins for Manipulating Canvases FIND_CANVAS, FIND_VIEW GET_CANVAS_PROPERTY GET_VIEW_PROPERTY SET_CANVAS_PROPERTY SET_VIEW_PROPERTY HIDE_VIEW SHOW_VIEW REPLACE_CONTENT_VIEW SCROLL_VIEW Windows and Blocks Windows may contain multiple blocks and blocks may be located on several windows. Forms will not automatically navigate to an item located in an activated window. Transaction management is block-oriented rather than window-oriented.
Practice 6 Overview
This practice covers the following topics: Building a multiple-window form
Using window interaction triggers Using window and canvas-view
built-ins Controlling window size by using window built-ins Enhancing the tab canvas functionality
Copyright Oracle Corporation, 1999. All rights reserved.
Practice 6
1 Manipulate a multiple-window form.
Open the ORDERS form module. b Make sure that when a user closes the orders window by way of the system-menu box, the form is exited. Also make sure that when a user closes the inventory window by way of the system-menu box, the cursor navigates to the orders window. If cursor navigation succeeds, the inventory window should closed. Create a WhenWindow-Closed trigger. You can import the pr6_1b.txt file. c Save, compile, and test the form. d Make sure that a user cannot make any window larger than it was at the startup of the form. You should save the size of the windows at the startup of the form, and create a procedure called CHECK_WINDOW_SIZE that resets the size of the current window if the new width and height are larger than the initial one. Create a When-New-Form-Instance trigger. You can replace the existing code with the code from the pr6_1d1.txt file. Next, create the procedure CHECK_WINDOW_SIZE. You can import the code from the pr6_1d2.txt file. Create a When-Window-Resized trigger that calls the procedure. 2 Manipulate the MDI application window. a Open the CUSTOMERS form module. b At the startup of the form, maximize the MDI application window, and display an appropriate title. You can import the pr6_2b.txt file. If you have time... 3 Open the EMPLOYEES form, and use the CONTROL.HELP_TAB text item to display a hint or description for the current tab page. a Create a When-Tab-Page-Changed trigger to populate this item with an appropriate message for each page. You can import the pr6_3a.txt file. b Test and verify your module. c Modify the When-Tab-Page-Changed trigger to change the label on the Comment tab page. When Comment is the topmost page, change its label to Employee XX, where XX is the employees ID number (emp.id). When any other tab page is topmost, change the label back to Comment. You can import the pr6_3c.txt file.
a
7
................................
Objectives
After completing this lesson, you should be able to do the following: Describe the various data source types Base a data block on a FROM clause query Describe the advantages of using a FROM clause query
Objectives
Base a data block on a stored procedure Return a REF cursor from a stored procedure Return a table of records from a stored procedure Select the appropriate data source for a data block
Instructor Note
Topic Lecture Practice Total Timing 50 minutes 50 minutes 100 minutes
Introduction ......................................................................................................................................................
Introduction
Overview This lesson introduces you to the different data source types that can be used for data blocks. This lesson also provides you with some guidelines for choosing the best data source for the job. Objectives After completing this lesson, you should be able to do the following: Describe the various data source types Base a data block on a FROM clause query Discuss the advantages of using a FROM clause query Base a data block on a stored procedure that returns a REF cursor Select the appropriate data source for a data block
DML
Table
Instructor Note Demonstration: Run the from_clause.sql and from_clause3.sql scripts to illustrate a FROM clause query.
Why Use a FROM Clause Query? FROM clauses are used to perform: Joins Lookups Calculations This is done without having to create a view on the server. FROM clauses can also be used to prototype views and to increase performance. Using a FROM clause as a block data source is similar to using a view based on an updatable join as a block data source. However, a FROM clause provides you with more control, because the presence of a DBA is not required to define the view. Note: The FROM clause produces results that are identical to an updatable join-view from the client side, but for which there is no defined view on the server.
Data block
Jones Clerk 01-Jan-95 Smith Clerk 01-Jan-95 Adams Clerk 01-Jan-95 Clark Clerk 01-Jan-95
Updating
Empno Ename Job 1234 1235 1236 1237 Hiredate Jones Clerk 01-Jan-95 Smith Clerk 01-Jan-95 Adams Clerk 01-Jan-95 Clark Clerk 01-Jan-95
Procedure
Instructor Note Demonstration: Edit the RefCurSpec.sql and RefCurBody.sql scripts to show the code of a stored procedure using a REF cursor.
Instructor Note Demonstration: Edit the TorQuerySpec.sql and TorQueryBody.sql scripts to show the code of a stored procedure using a table of records.
Note See Appendix F, Handling Server-Side Errors, for code details. Instructor Note Demonstration: Edit the TorDMLSpec.sql and TorDMLBody.sql scripts to show the code of a stored procedure using a table of records.
Instructor Note Demonstration: If they do not already exist, create and populate the EMP and DEPT tables using the UTLSample.sql file. Run the TorDMLSpec.sql and TorDMLBody.sql scripts. Create a new form module. Base the block on a stored procedure. The query procedure is emp_pkg.empquery. The insert procedure is emp_pkg.empinsert. The update procedure is emp_pkg.empupdate. The delete procedure is emp_pkg.empdelete. The lock procedure is emp_pkg.emplock.
Instructor Note Demonstration: Use the form created previously to illustrate these properties.
Instructor Note Demonstration: Use the Stored Procedures demonstration to illustrate how to use the same block to display data from different tables. Before the demonstration, run the OrderSpecs.sql and OrderBody.sql scripts.
Data Source Type Restrictions When deciding on a data block source, consider your requirements: Will the block be used only to query records? Will the block be used to perform inserts, updates, and deletes? Will the block be used to perform both query and DML? To decide, you should also consider the functional restrictions for each data source type:
Data Source Table View FROM Clause Procedure Using a REF Cursor Procedure Using a Table of Records Transactional Trigger Allows Query Yes Yes Yes Yes Yes Yes Allows DML Yes Yes No No Yes Yes
Summary
New data sources: Stored procedure (query and DML) FROM clause query (query only) Stored procedures return: REF cursorslimited to a single SELECT statement Table of recordscan be a complex procedure
Copyright Oracle Corporation, 1999. All rights reserved.
Summary
Use the Data Block Wizard to specify: Data source type Procedures for queries, updates, deletes, and locking Master-detail relationships
Summary ......................................................................................................................................................
Summary
New Data Sources Stored procedure (query and DML) FROM clause query (query only) Stored Procedures Return REF cursorslimited to a single SELECT statement Table of recordscan be a complex procedure Using the Data Block Wizard Specify data source type Specify procedures for queries, updates, deletes, and locking Specify master-detail relationships
Practice 7 Overview
This practice covers the following topics: Modifying the EMP block to base it on a nested SELECT statement Enabling DML on the EMP block Creating a package containing a stored procedure to return a Ref cursor Basing a block on the previous stored procedure
Copyright Oracle Corporation, 1999. All rights reserved.
Practice 7
1 Base the EMP block on a subquery.
Open the EMPLOYEES form module. b Set the Query Data Source Type EMP block property to From Clause Query. c In the Query Data Source Name property enter the SELECT statement. Your query should return all the columns from the S_EMP table joined with the columns from the S_DEPT table. Remember to enclose your select SELECT statement in parentheses. You can copy and paste the content of the pr7_1c.txt file. The SELECT statement is:
a
(SELECT e.ID, USERID, LAST_NAME, FIRST_NAME, START_DATE, TITLE, MANAGER_ID, DEPT_ID, SALARY, COMMISSION_PCT, COMMENTS, d.ID NUM, REGION_ID, NAME FROM s_emp e, s_dept d WHERE e.dept_id = d.id)
When a blocks Query Data Source Type is Table, the ROWID of each row is implicitly queried when the row is retrieved from the database. This ROWID value is used in the WHERE clause of any subsequent UPDATE, DELETE, or SELECT FOR UPDATE statements issued by Oracle Forms. When a blocks Query Data Source Type is From Clause Query, the ROWID value is not implicitly retrieved. Therefore, the ROWID value cannot be used in subsequent statements. Instead, Oracle Forms constructs the WHERE clause using the primary key values of each row.
Practice 7 ......................................................................................................................................................
Configure the EMP block so that Oracle Forms will use the primary key values when constructing the WHERE clause. Set the KeyMode property for the EMP block to Updatable. Set the Enforce Primary Key property for the EMP block to Yes. Set the Primary Key property for the Id item to Yes. e Save, run, and test your module. 2 Enable DML on the EMP block without using transactional triggers. a Set the block DML Target Name. b Prevent Oracle Forms from attempting to update the columns from the S_DEPT table. On the Property Palette for the item, set the Query Only property to Yes, and the Update Allowed and Insert Allowed properties to No for the S_DEPT items (NUM, NAME, REGION_ID). c Remove the appropriate transactional triggers. d Save, run, and test your module. If you have time... 3 Create a server-side package containing a procedure to return a REF cursor. Using the code in the pr7_3a.sql file in your labs directory, create the Orders package body and package specification. 4 Modify the Ord_Sum block in the ord_sum.fmb module to base it on the stored procedure. a Open the ord_sum.fmb module. Change the Query Data Source Type of the Ord_Sum block to Procedure. Change the DML Data Target Type to None (this block does not allow any inserts, updates, or deletes). b Set the Query Data Source Name to the name of the stored procedure in the package. c Specify the Query Data Source Columns to match the items in the Ord_Sum block. The column names and types are: ID, Number NAME, Varchar2(255) TOTAL, Number d Specify the procedure arguments. The first argument is the REF cursor that will be used by Forms to populate the block. The second argument is used to pass the value of the list box
(:Choose.View_Type) to the procedure to determine which SELECT statement is used. These arguments should match the arguments to the package procedure. e Add a trigger on the View_Type item so that the data in the Ord_Sum block is updated when the list box value changes. Hint: You need to execute a query in the Ord_Sum block.
5 Save and run your form. Observe the behavior of the record count in the
console and the scroll bar as you scroll through the records. What do you deduce from this behavior?
8
................................
Objectives
After completing this lesson, you should be able to: Recognize which object types are supported Describe how object types are represented within Oracle Developer Create a block based on an object table Create a block based on a relation table with an object or a REF column Populate a REF column with an LOV
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note
Topic Lecture Practice Total Timing 30 minutes 25 minutes 55 minutes
Introduction ......................................................................................................................................................
Introduction
Overview This lesson reviews certain object features of Oracle8 and explains how these objects are displayed in the Object Navigator. Objectives After completing this lesson, you should be able to do the following: Recognize which Oracle8 object types are supported Describe how Oracle8 objects are represented within Oracle Developer Create a block based on an object table Create a block based on a relational table with an object column or REF column Populate a REF column with an LOV
Object Types
Attributes Ship
ORDER po_no custinfo line_items amount
Cancel
Methods
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note These pages review object type fundamentals. Additional object type information can be found in Appendix D, Introduction to Oracle8 Object Features.
Review of Objects
Object tables Object columns Object views INSTEAD-OF triggers
DECLARE BEGIN EXCEPTION END;
Instructor Note These pages review object type fundamentals. Additional object type information can be found in Appendix D, Introduction to Oracle8 Object Features.
Review of Objects
With an object type, you can create object tables, object columns, object views, and INSTEAD-OF triggers. Object Tables After you have declared an object type, you can create objects based on the type. One way to do this is to create a table whose rows are objects of that object type. Rows in an object table are assigned object IDs (OIDs) and can be referenced using a REF type. Object Column Another construct that can be based on an object type is an object column in a relational table. In the object table, the rows of a table are objects. In a relational table with an object column, the column is an object. The table usually has standard columns, as well as one or more object columns. Object columns are not assigned OIDs, and thus cannot be referenced using object REF values. Object View An object view transforms the way a table appears to a user, without changing the actual structure of the table. Object views make relational tables look like object tables. Objects accessed through object views are assigned OIDs, and can be referenced using object REFs. INSTEAD OF Triggers INSTEAD OF triggers provide a transparent way of modifying views that cannot be modified directly through SQL DML statements (INSERT, UPDATE, and DELETE). These triggers are called INSTEAD-OF triggers because, unlike with other types of triggers, the Oracle server fires the trigger instead of executing the triggering statement. The trigger performs update, insert, or delete operations directly on the underlying tables. Technical Note The Database Trigger editor has been enhanced to include the INSTEAD OF triggering event.
References to Objects
Instructor Note These pages review object type fundamentals. Additional object type information can be found in Appendix D, Introduction to Oracle8 Object Features.
Object REFs
When a row in an object table or object view is created, it is assigned automatically a unique identifier called an object Id (OID). This OID value can be stored in attributes of other objects, or columns of other tables. The stored copy of the OID then becomes a pointer, or REF, to the original object. (Object columns are not assigned OIDs and cannot be pointed to by a REF.) In relational databases, primary key values are used to identify records uniquely. In object-relational databases, OIDs provide an alternate method. With relational tables, you can associate two records by storing the primary key of one record in one of the columns (the foreign key column) of another. In a similar way, you can associate two objects by storing the OID of one object in an attribute of another. Or you can associate a row in a relational table to an object by storing the OID of an object in a column of a relational table. The attribute or column that holds the OID is of data type REF. Remember, the object itself is not stored in the table, only the OID value for the object.
Oracle8 in Developer
Supported Oracle8 features Large objects: BLOB, CLOB, NCLOB, BFILE User-defined objects Object table Column object REF column Unsupported Oracle8 features Collection types Stored procedures that return object values
Copyright Oracle Corporation, 1999. All rights reserved.
Object Display
Object Column Object Table
Object REF
Object Type
-- object table
manager_id
In the diagram, the wizard shows all the columns of the object table OO_DEPT_TABLE (ID, NAME, REGION_ID). Select any or all as data block items.
In the diagram, the wizard displays ID, NAME, and REGION_ID as columns you can select as data block items.
As seen in the diagram, the REF column name (DEPT_ID) appears twice in the column selection list. It appears once as a heading for the referenced objects attributes and then again as a pointer. The column is selectable.
Summary
Most Oracle8 object types are supported. Indentations represent nested objects. Blocks can be based on object tables. Blocks can be based on tables with object columns or REF columns. REF columns can be populated with an LOV.
Summary ......................................................................................................................................................
Summary
Oracle Developer supports most, but not all, of the Oracle8 object types. In Oracle Developer, object types are displayed like columns, where indentation shows the nesting of objects. Blocks can be based on object tables. Blocks based on object or relational tables can include object columns or REF columns. REF columns can be populated with an LOV.
Practice 8 Overview
This practice covers the following topics: Creating a block based on an object table Creating a block based on a relational table with an object column Creating a block based on a relational table with a REF column Populating a REF column with an LOV
Practice 8
1 Create a block based on a relational table.
Create a new form called OO_DEPT. b Create a block by using the Data Block Wizard. Base the block on the object table OO_DEPT_TABLE, and include all the columns. Do not enforce data integrity. c Finish following the Data Block Wizard and invoke the Layout Wizard. Select all available items for display, and use a tabular layout with three displayed records and a scroll bar. Do not enter a frame title. d Test and save the form. 2 Create a block based on a relational table with an object column. a Create a form called OBJ_COL. b Create a block by using the Data Block Wizard. Base the block on the relational table REL_EMP_TABLE_OBJCOL. Select the columns ID, FIRST_NAME, and LAST_NAME. Expand the object column DEPT_ID and select the attributes ID and NAME. Note the name that is given to the new item. Do not enforce data integrity. c Finish following the Data Block Wizard and invoke the Layout Wizard. Select all available items for display. Change the prompt for item DEPT_ID to Department ID and DEPT_ID_NAME to Department Name. Use a form layout. Do not enter a frame title. Finish following the wizard. d Examine the properties for the item dept_id_name. Pay particular attention to the database properties. Later, you will compare and contrast these properties with the properties set for a REF column. e Test and save the form. 3 Create a block based on a relational table with an REF column and an LOV to populate the REF column. a Create a form called REF_COL. b Create a block by using the Data Block Wizard. Base the block on the relational table REL_EMP_TABLE_REFCOL. Select the columns ID, FIRST_NAME and LAST_NAME. Do not enforce data integrity. c Note that there are two items called DEPT_ID. The first is expandable and has the term LOOKUP in parenthesis after the name. The second represents the REF column value itself. Expand
a
Practice 8 ......................................................................................................................................................
the first DEPT_ID item and select the attributes ID and NAME. (Do not select the second DEPT_ID item. The REF item is included automatically when the LOV is created.) The Data Block Wizard offers to create an LOV for the REF item dept_id. Select the check box, and select OO_DEPT_TABLE as the source for the LOV. Finish following the Data Block Wizard and invoke the Layout Wizard. Select all available items for display. Do not enter a frame title. (Note that the REF item DEPT_ID is included in the list of items in the Object Navigator but is not included in the list of available items in the Layout Wizard. REF item values are normally not displayed, so by default the REF item is assigned to the Null canvas.) Examine the database properties for the item DEPT_ID_NAME. Pay particular attention to the database properties. Notice that the Query Only property is set to Yes. Select the item DEPT_ID from the Object Navigator, and examine the Canvas property. Also, notice that an LOV and associated record group now exist. Test and save the form, including the LOV.
9
................................
Objectives
After completing this lesson, you should be able to do the following: Define block coordination Coordinate data blocks by using REF relations Describe the characteristics and principles of relation-handling code Implement a coordination-type toggle Force one commit per master record
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note
Topic Lecture Practice Total Timing 30 minutes 30 minutes 60 minutes
Demonstration for the next page pair: Use the Coordination-Type Toggle (Orders3.fmb) demonstration to create explicitly a relation between the S_ITEM and S_INVENTORY blocks.
Introduction ......................................................................................................................................................
Introduction
Overview You have seen how form modules consist of data blocks based on related tables. This lesson shows how you can modify the relationship between two data blocks to affect the way in which deletes are handled and to what extent the data blocks are coordinated at query time. Also, it explains how to create relationships based on object REFs. Objectives After completing this lesson, you should be able to do the following: Define block coordination Coordinate data blocks by using REF relations Describe the characteristics and principles of relation-handling code Implement a coordination-type toggle Force one commit per master record
Relations
Logical objects that handle the relationship between two blocks Created implicitly with a master-detail form module Created explicitly with the New Relation dialog box
Creating a Relation
What Is a Relation? A relation is a Form Builder object that handles the relationship between two associated blocks. You can create a relation either: Implicitly with a master-detail form module Explicitly in the Object Navigator Implicit Relations When you create a master-detail form module, a relation is automatically created. This relation is named in the format masterblock_detailblock, for example, S_ORD_S_ITEM. Explicit Relations If a relation is not established when default blocks are created, you can create your own by setting the properties in the New Relation dialog box. Like implicitly created relations, PL/SQL program units and triggers are created automatically when you explicitly create a relation. Instructor Note The creation of explicit relations was covered in the Oracle Developer: Build Forms I course. Use these pages to review the fact that relations can be created implicitly or explicitly.
Block Coordination
Coordination-causing event Block-coordination phases: Clear phase executed before change of master record Populate phase executed after change of master record Implementation of block coordination: The Copy Value from Item property Relation-handling triggers Relation-handling procedures
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note Explain to students the importance of the Copy Value from Item property for implementing block coordination. Demonstration: Use the Coordination-Type Toggle (Orders3.fmb) demonstration to show the objects used to implement a block coordination.
Block Coordination
To maintain a master-detail relationship, Forms coordinates the master and detail blocks to ensure that only the detail records that belong to the current master record are displayed. Coordination-Causing Events Any event that changes the master record is called a coordination-causing event or a coordination operation. Forms automatically coordinates the master and detail blocks again when you move to another master record. Block Coordination Phases
Phase Clear Description Forms clears all detail blocks before it navigates to the new master record. Possible changes in detail blocks are deleted. If the Clear phase fails, Forms stops coordination processing and does not navigate to the new master record. Forms queries all detail blocks after it has navigated to the new master record, unless the coordination type is Deferred.
Populate
Implementation of Block Coordination Forms implements block coordination through the following elements: The Copy Value from Item property on the foreign-key item in the detail block, which specifies the corresponding primary-key item in the master block Relation-handling triggers, which fire during the Clear and Populate phases of block coordination Relation-handling procedures, which are called from relation-handling triggers Note: The elements above are controlled through the relation object.
Technical Note Relation-handling triggers fire only if you have defined a corresponding relation.
On-Populate-Details
On-Check-Delete-Master
Note: If you specify a cascade-delete foreign-key rule for a relation, Form Builder uses a Pre-Delete trigger to implement this rule. However, this is a commit trigger, not a relation-handling trigger, and can also be used outside the context of relations.
Note: The CLEAR_ALL_MASTER_DETAILS procedure gives you an example of how to recursively walk through a hierarchical tree of blocks. Adding Your Own Code to Relation-Handling Triggers Forms adds comments around the PL/SQL code that it generates for relation handling, for example:
--- Begin default relation program section -BEGIN CLEAR_ALL_MASTER_DETAILS; END; --- End default relation program section --
You can add PL/SQL code to relation-handling triggers before the Begin default relation program section comment or after the End default relation program section comment. Note: Forms will not delete a relation-handling trigger to which you have properly added PL/SQL code.
Technical Note You can use these system variables in the On-Clear-Details trigger only. Assign their values to global variables to broaden the scope.
GET_RELATION_PROPERTY
(*): You can also set those properties using the Set-Relation-Property builtin.
Instructor Note Demonstration: Use the Coordination-Type Toggle (Orders3.fmb) demonstration to show the example described above. Select Query>Deferred.
Instructor Note Demonstration: Use the Commit Per Master (Mascmt.fmb) demonstration to illustrate the example described above.
Summary
Creating relations: Implicitly Explicitly Relation properties: For deletion For coordination Block coordination: Coordination-causing events change the master record Clear and populate
Copyright Oracle Corporation, 1999. All rights reserved.
Summary
Coordinating blocks with REFs Elements involved in block coordination: Copy Value from Item property Relation-handling triggers and procedures Characteristics of relation-handling triggers Obtaining relation-handling information
Copyright Oracle Corporation, 1999. All rights reserved.
Summary ......................................................................................................................................................
Summary
Creating Relations Implicitly, when a block is created through the New Block facility Explicitly, by creating the relation separately from the related blocks Relation Properties For controlling behavior on deletion of master records and coordination of data between blocks Block Coordination Coordination-causing events cause a change of the master record. The two block-coordination phases are the Clear and Populate phases. Base coordination of blocks on REF values. Elements Involved in the Implementation of Block Coordination The Copy Value from Item property Relation-handling triggers and procedures Characteristics of Relation-Handling Triggers On-Clear-Details implements the Clear phase. On-Populate-Details implements the Populate phase. On-Check-Delete-Master implements restricted-delete rules. Principles of Relation-Handling Code The three relation-handling procedures are CLEAR_ALL_MASTER_DETAILS, QUERY_MASTER_DETAILS, and CHECK_PACKAGE_FAILURE. Add your own code to relation-handling triggers before or after comments generated by Forms. Obtaining Relation-Handling Information There are two system variables for relation handling. Built-ins for relation handling can be used to get relation names and to get or set relation properties.
Practice 9 Overview
This practice covers the following topics: Examining and changing relation properties Implementing a coordination-type toggle for a master-detail form Implementing foreign-key delete rules for a master-detail form Creating a relation based on REF values
Copyright Oracle Corporation, 1999. All rights reserved.
Practice 9
1 Open the ORDERS form and examine the properties of the relation
called S_ORD_S_ITEM. a Note the deletion and coordination property values. b Run the ORDERS form and test the way deletes are handled. 2 Implement a query coordination-type toggle. a Add two check boxes to the control block with the following properties:
Property Name Enabled Label Value When Checked Value When Unchecked Check Box Mapping of Other Value Keyboard Navigable Mouse Navigate Data Type Initial Value DataBase Item Canvas b Check Box 1 IMMEDIATE Yes Immediate Y N CHECKED No No CHAR Y No TOOLBAR Check Box 2 AUTO_QUERY No Auto Query Y N UNCHECKED No No CHAR Y No TOOLBAR
Use the Layout Editor to position the checkboxes appropriately in the Toolbar canvas. c Make sure that the first check box enables a user to toggle between immediate coordination and deferred coordination. You can import the pr9_2c.txt file. d Make sure that the second check box enables a user to toggle between automatic query and no automatic query for the detail block. This check box should be disabled if the other check box
Practice 9 ......................................................................................................................................................
indicates immediate coordination. You can import the pr9_2d.txt file. e Test and save the form. If you have time... 3 Add a detail block based on a REF relation to the OO_DEPT table. a Open the OO_DEPT form in the Object Navigator. b Create a new block by using the Data Block Wizard. Base the block on the table REL_EMP_TABLE_REFCOL, and include the id, first_name, last_name, and dept_id REF columns. Do not enforce data integrity, and do not create an LOV. c Create a relationship between the two blocks using the REF value. d Finish following the Data Block Wizard and invoke the Layout Wizard. Select all available items for display, and use a tabular layout with three displayed records and a scroll bar. Do not specify a frame title. e Test and save the form. 4 Synchronize the check boxes at form startup. a Open the ORDERS form module. b Create a procedure called INIT_RELATION_CHECK_BOXES. This procedure synchronizes the IMMEDIATE and AUTO_QUERY check boxes with the current default value. You can import the pr9_4b.txt file. c Call this procedure from the When-New-Form-Instance trigger. 5 Implement foreign-key delete rules. a Open the CUSTOMERS form module. Change the Menu Module property to DEFAULT&SMARTBAR. b Create a procedure called CHECK_DEL_CUS. This procedure displays an error message as soon as a user tries to delete a customer for which matching orders exist. You can import the pr9_5b.txt file. c Call the procedure when a user selects the delete function key. d Save, compile, and run the module.
10
................................
Objectives
After completing this lesson, you should be able to do the following: Describe the different ways of invoking additional forms Open, call, and close forms Navigate between forms
Objectives
Control opened forms and called forms Manage transaction processing for opened forms and called forms Choose the most appropriate method for invoking forms Pass form parameters
Instructor Note
Topic Lecture Practice Total Timing 50 minutes 50 minutes 100 minutes
Introduction ......................................................................................................................................................
Introduction
Overview You have already seen that Oracle Developer applications frequently consist of more than one form. This lesson revisits the topic of multiple form applications and takes a deeper look into the ways in which one form module can invoke another and the effects this has on transaction processing. Objectives After completing this lesson, you should be able to do the following: Describe the various ways of invoking additional form modules Open, call, and close form modules Navigate between form modules Control open form modules and called form modules Manage transaction processing for open and called form modules. Choose the most appropriate method for invoking form modules Pass form parameters
Characteristics of OPEN_FORM
Restricted Not valid in Enter Query mode No savepoint issued Modeless with respect to other opened forms Session run time option: FORMS50_SESSION
Instructor Note Explain that different transaction scopes refers to the SESSION/NO_SESSION parameter of the OPEN_FORM built-in.
Description The file holding the executable module Either ACTIVATE (the default) or NO_ACTIVATE Either NO_SESSION (the default) or SESSION Either NO_SHARE_LIBRARY_DATA (the default) or SHARE_LIBRARY_DATA Either the name (in quotes) or internal ID of a parameter list (This argument is optional.)
Characteristics of OPEN_FORM Is a restricted procedure Causes opened form to be modeless Can start a new database session Using Data Mode to Share PL/SQL Variable Data The data mode parameter can be used to share PL/SQL variable data between forms. Create a package that contains the PL/SQL variables to be shared, and place the package in a library. Attach the library to all the forms that are to share the data. In the OPEN_FORM command, set the data_mode to SHARE_LIBRARY_CODE. Any changes made by one form are visible to the other forms. This method of sharing data between forms is preferable to global variables because the PL/SQL variables benefit from PL/SQLs strong typing and because PL/SQL variables are stored and accessed more efficiently than global variables.
Closing Forms
CLOSE_FORM: form_name form_id Characteristics of CLOSE_FORM: Restricted Not valid in Enter-Query mode CLOSE_FORM or EXIT_FORM Cannot close a form that called another form
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note Explanation for next page pair: Explain that NEXT_FORM stops the execution of subsequent statements in the trigger or program unit. Stress that the When-New-Form-Instance trigger does not fire on navigation into a form unless the form is being started. Point out that the When-Window-Activated trigger should be used for synchronizing forms in a multiple-form application. Demonstration for next page pair: Use the Multiple Form (Customer - Form 1) (Mf_cus.fmb), Multiple Form (Order - Form 2) (Mf_ord.fmb), and Multiple Form (Item - Form 3) (Mf_itm.fmb) files to demonstrate the navigational and validation aspects of multiple-form applications. You can also use the Open/Call_Form (DEPT form) (dept.fmb) and Open/ Call_Form (EMP form) (emp.fmb) to illustrate when the triggers fired.
Closing Forms
Syntax
CLOSE_FORM(form_name); CLOSE_FORM(form_id); Parameter form_name form_id Description The module name of the form (not the .fmx filename) The internal form module ID of the form (of type Form Module)
Characteristics of the CLOSE_FORM Procedure CLOSE_FORM is a restricted procedure that is not valid in Enter Query mode. When the specified form is the current form, CLOSE_FORM is equivalent to EXIT_FORM. You cannot close a form that has called another form with CALL_FORM.
PREVIOUS_FORM
GO_FORM
Navigation and Validation Aspects of Inter-form Navigation In a multiple-form application, each open form has one item that is the current item for that form. When you are navigating between open forms, no validation occurs in the starting form. When you return to the starting form and attempt to navigate within that form, normal validation is enforced. When you are navigating between (current items of) open forms, no triggers fire. The only exceptions are the When-Window-Activated, When-Window-Deactivated, and When-Form-Navigate triggers. Even the navigational triggers do not fire when you are navigating between open forms. If you click a noncurrent item of an open form, triggers that would usually fire, when you are navigating from the current item to the target item, fire. In this case, navigational triggers also fire and validation occurs as required.
Connection
Server
Characteristics of CALL_FORM
Unrestricted Valid in Enter Query mode Savepoint issued Modal with respect to calling form Does not cause navigation and validation Forms called from query-only form are always query-only Exiting a called form
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note Demonstration: Use the Open/Call_Form (DEPT form) (dept.fmb) and Open/ Call_Form (EMP form) (emp.fmb) to illustrate the CALL_FORM built-in.
Characteristics of CALL_FORM Is valid in Enter Query mode Causes Forms to issue a savepoint Causes called form to be modal Does not cause navigation or validation in the initial form Can call a form in Query Only mode Propagates query-only parameter through all subsequent called forms Returns control to the calling form and resumes processing of the PL/SQL code at the statement immediately following the calling statement (This occurs when Forms exits the called form.)
rollback to savepoint Rollback behavior of called forms Call savepoints and post savepoints
Instructor Note Demonstration: Use the Open/Call_Form (DEPT form) (dept.fmb) and Open/ Call_Form (EMP form) (emp.fmb) to illustrate the Post-Only mode.
Do not confuse call savepoints, which are set when a form is called or started, with post savepoints, which are set at the start of a post.
Instructor Note Demonstration: Open the Open/Call_Form (DEPT form) (dept.fmb) and Open/ Call_Form (EMP form)(emp.fmb) demonstrations. Remove the comments in the Key-Exit and Key-Commit triggers.
Adjusting Default Transaction Processing for Called Forms The characteristics of Post-Only mode and the rollback behavior of called forms require that you adjust default transaction processing as follows: Redefine [Commit] so that processing performs a post when the form is called. Redefine [Exit] so that processing does not perform a rollback when the form is called. You may want to adjust the labels of possible buttons and menu items that correspond to [Commit] and [Exit]. Examples Key-Commit trigger at form level:
BEGIN IF GET_APPLICATION_PROPERTY(calling_form) is not null THEN POST; ELSE COMMIT_FORM; END IF; END;
Description The file holding the executable form module Either TO_SAVEPOINT (the default), NO_ROLLBACK, or FULL_ROLLBACK Either NO_QUERY_ONLY (the default) or QUERY_ONLY (This defines whether the called form should run in Query Only mode.) Either NO_SHARE_LIBRARY_DATA (the default) or SHARE_LIBRARY_DATA Either the name (in quotes) or internal ID of a parameter list (This argument is optional.)
Form C
OPEN_FORM
Form D
Form B
S.P.
OPEN_FORM
CALL_FORM
Form F
Form E
Form A+B+E = Call form stack
Copyright Oracle Corporation, 1999. All rights reserved.
Technical Note You can obtain information about the call form stack by using the GET_APPLICATION_PROPERTY built-in with the CALLING_FORM parameter. Instructor Note The slide illustrates the restrictions on using OPEN_FORM and CALL_FORM. In this scenario, Form A calls Form B, Form B then opens Form C, Form C then opens Form D; and Form B then calls Form E. The call is not allowed to navigate to Forms A and B. The current call form stack consists of Forms A, B, and E. A form cannot be called from Form C and D. Changes in any form are rolled back to the savepoint (S.P.) that was set when Form E was called.
Parameter list
Instructor Note Demonstration: Use the Multiple Form (Order - Form 2)(Mf_ord.fmb) demonstration to show the properties of the CUS_ID form parameter.
Example Pass a value for the CUS_ID form parameter to the ORDITEM form by way of the Runform command line. Note that MODULE and USERID are predefined command line parameters.
ifrun60.exe module=orditem userid=scott/tiger cus_id=202
Referencing Form Parameters You can reference form parameters in a way similar to how you would access Forms variables. To reference the parameter contents, use bind-variable syntax: :PARAMETER.parameter_name, where the reserved word PARAMETER is the fixed part. To reference the parameter name, put the fully qualified name between single quotation marks: PARAMETER.parameter_name Example Assign the value of the CUS_ID form parameter to the CUSTOMER_ID item in the ORDER block.
:order.customer_id := :PARAMETER.cus_id;
Parameter Lists
Parameter list
CUS_ID TEXT_PARAMETER 204
) ) )
Technical Note You must define the parameters whose values are being passed to a form in that form at design time.
Parameter Lists
One way to supply form parameter values is to specify a parameter list in the call to the built-in that invokes the form. What Is a Parameter List? A parameter list is a named programmatic construct that lists parameter names (called keys), their types, and their values. You can specify parameter lists in the calls to the following built-ins: CALL_FORM OPEN_FORM NEW_FORM RUN_PRODUCT Two Parameter Types
Type Text Parameter Description A simple parameter with a scalar, noncomposite CHAR value. You must use this type of parameter, unless you want to pass a record group to another Oracle product. A parameter whose value must always be the name of a record group defined in the current form. Data parameters are used to pass data to products invoked with the RUN_PRODUCT built-in. You cannot pass data parameters to forms.
Data Parameter
Default Parameter List Each form includes a built-in parameter list named DEFAULT. The DEFAULT parameter list contains all of the form parameters that were defined in the form at design time. Like any other parameter list, the DEFAULT parameter list can be specified in the call to the built-ins that can invoke a form.
Technical Note You cannot create a parameter list named DEFAULT or one that already exists. Use GET_PARAMETER_LIST and ID_NULL to check whether a parameter list already exists. Instructor Note Use the Multiple Form (Customer - Form 1) (Mf_cus.fmb) demonstration to show the PASS_CUS procedure, which creates a parameter list and adds the CUS_ID parameter. Demonstration for the next page pair: Use the Multiple Form (Customer - Form 1) (Mf_cus.fmb) file to show the methods of passing data between forms in a multipleform application. Show the When-Button-Pressed trigger on the CTL.OPEN_FORM button and explain that the final argument to the OPEN_FORM built-in is the parameter list name. Point out the use of a global variable in the first line of the code.
ADD_PARAMETER
P1 P2 P3
P1 P2 P3
1. If a parameter list exists, destroy it. 2. Create a parameter list. 3. Add a text parameter to a list with the value of an item. 4. Open a form with this parameter list.
Copyright Oracle Corporation, 1999. All rights reserved.
Technical Note Global variables are used more often than parameters for passing data between forms.
Note: You must define the CUS_ID parameter in the ORDITEM form at design time, because each run-time parameter must have a corresponding design-time parameter in the target form. Form Parameters and Global Variables Form parameters can be used only as input parameters; the invoked form cannot return modified form-parameter values to the invoking form. Therefore, global variables are the preferred method for communicating between forms. Advantages of form parameters include: - They have a data type of CHAR, NUMBER, or DATE. - The length of a CHAR parameter can be up to 64 K. - They can be design-time objects. - Global variables are always programmatic constructs of type CHAR(255). They are visible to all the forms in the current Runform session.
Summary
Opening, calling, and closing forms:
OPEN_FORM, CALL_FORM, and
CLOSE_FORM
Multiple database sessions per
connect possible Navigation: NEXT_FORM, PREVIOUS_FORM, and GO_FORM Restrictions on the call form stack
Copyright Oracle Corporation, 1999. All rights reserved.
Summary
Transaction processing Opened forms: Within same or different sessions Called forms: Post-Only mode; a rollback to savepoint Using form parameters and parameter lists Methods for parameter passing Referencing form parameters Text parameters and data parameters Built-ins for parameter lists
Copyright Oracle Corporation, 1999. All rights reserved.
Summary ......................................................................................................................................................
Summary
The Three Built-ins for Invoking Forms OPEN_FORM CALL_FORM NEW_FORM Opening, Calling, and Closing Forms OPEN_FORM CALL_FORM CLOSE_FORM Built-ins for Navigation Between Forms NEXT_FORM PREVIOUS_FORM GO_FORM Controlling Open Forms and Called Forms Together Restrictions on the call form stack Transaction Processing for Open Forms Within the same session or different sessions Transaction Processing for Called Forms Characteristics of Post-Only mode Rollback behavior of called forms: default rollback to savepoint Using Form Parameters Passing parameter values to a form by way of Runform command line or parameter list Referencing form parameters using PARAMETER.parameter_name Using Parameter Lists The two parameter types: text parameters and data parameters The default parameter list named DEFAULT Built-ins for creating and manipulating parameter lists
Practice 10 Overview
This practice covers implementing a button on CUSTOMER to call EMPLOYEE: Performing an automatic query on the EMPLOYEE form based on the current Sales Rep ID in the CUSTOMER form Ensuring that posted changes in EMPLOYEE are not rolled back Ensuring that [Commit] performs a post when EMPLOYEE is called from another form
Copyright Oracle Corporation, 1999. All rights reserved.
Practice 10
1 Produce a multiple form application by linking the CUSTOMERS and
the EMPLOYEES forms. a In the control block of the CUSTOMERS form, create a button called EMPLOYEE_BUTTON. Place it on the CV_CUST canvas, below the Orders button. b Define a trigger for CONTROL.EMPLOYEE_BUTTON that calls the EMPLOYEES form with the current sales representative ID. - Change the Mouse Navigate property of CONTROL.EMPLOYEE_BUTTON to No. - Create a parameter list called SALES. - Add the SALES_ID parameter to the parameter list. The type of this parameter is TEXT_PARAMETER, and it is initialized with the value of the SALES_REP_ID item. - Invoke the EMPLOYEES form by using the CALL_FORM built-in. You can import the pr10_1b.txt file. c Open the EMPLOYEES form module. d In the Object Navigator, create a parameter called SALES_ID. e Add a trigger to ensure that queries on the employee block are restricted by the value of the SALES_ID parameter. Replace the existing code with the code in the pr10_1e.txt file. f Save and compile each form, then run the CUSTOMERS form module. Test the application by exiting the EMPLOYEE form using the menu or the toolbar. If you have time... 2 Transaction processing for called forms: a Make sure that any changes in the EMPLOYEES form that are posted by a user are not rolled back by Forms upon exit. b Make sure that when the CUSTOMERS form calls the EMPLOYEES form, [Commit] performs a post. You can import the pr10_2b.txt file. c Save and compile each form, then run the CUSTOMERS form module and test your application.
11
................................
Objectives
After completing this lesson, you should be able to do the following: Describe the record group object Use record groups Define record groups at design time Control record groups by using built-in functions Define query record groups programmatically Define nonquery record groups programmatically
Copyright Oracle Corporation, 1999. All rights reserved.
Objectives
Manipulate record group rows Define lists of values (LOVs) programmatically Manipulate list items programmatically Implement dynamic list items Add values to combo boxes
Instructor Note
Topic Lecture Practice Total Timing 50 minutes 40 minutes 90 minutes
Introduction ......................................................................................................................................................
Introduction
Overview Record groups are useful constructs for storing structured data, and they can be manipulated at run time. This lesson covers how to create, modify, and delete record groups at design time and programmatically at run time. It also covers how you apply record groups in useful ways, such as for dynamic list items. Objectives After completing this lesson, you should be able to do the following: Describe the record group object Use record groups Define record groups at design time Control record groups by using built-in functions Define query record groups programmatically Define nonquery record groups programmatically Manipulate record group rows Define lists of values (LOVs) programmatically Manipulate list items programmatically Implement dynamic list items Add values to condo boxes
Record Groups
Three record group types:
SOURCE TIME Design Time Run Time Based on a SELECT Statement QUERY QUERY Not Based on a SELECT Statement STATIC NON QUERY
Record Groups
Record groups and LOVs Forms implicitly creates query record groups. Use SET_LOV_PROPERTY to replace default record group.
... ... IF Get_LOV_Property(lov_id,GROUP_NAME) = GROUP1 IF Get_LOV_Property(lov_id,GROUP_NAME) = GROUP1 THEN THEN Set_LOV_Property(lov_id,GROUP_NAME,GROUP2); Set_LOV_Property(lov_id,GROUP_NAME,GROUP2); END IF; END IF; ... ...
Copyright Oracle Corporation, 1999. All rights reserved.
Record Groups
What Is a Record Group? A record group is an internal Forms data structure that is similar to a database table. It can have columns of type CHAR, NUMBER, or DATE, and its data is stored in rows. Record groups exist in local Forms memory, rather than in the database. Three Record Group Types
Type Query Record Group Description A record group with an associated SELECT statement. The columns in the record group derive their properties from the columns in this SELECT statement. The rows in the record group are the rows retrieved by this SELECT statement. This type of record group can be created at design time and at run time. A record group without an associated query. The columns and rows of the record group are defined programmatically at run time and can also be modified at run time. A record group without an associated query. The columns and rows of the record group are defined at design time and cannot be modified programmatically at run-time.
Note: When you create a record group, you cannot specify its type explicitly. The type is implied by when and how you create the record group. Record Groups and LOVs When you create a list of values (LOV) based on a query, Form Builder implicitly creates a query record group. In this case, the columns and rows of the record group are determined by the LOV-SELECT statement. At run time, you can call the SET_LOV_PROPERTY built-in function to replace the default record group of an LOV with another one. Use the GROUP_NAME property.
Instructor Note Demonstration: Use the Record Groups (Code Examples) (rec_grp.fmb) demonstration to show how you create query record groups (CUSTOMER_ID) and static record groups (STATIC_GROUP).
Record group ID
Record group ID
ID
Name
DELETE_GROUP
Copyright Oracle Corporation, 1999. All rights reserved.
DELETE_GROUP_ROW
ADD_GROUP_COLUMN
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note Point out that CREATE_GROUP_FROM_QUERY does not populate the record group. ADD_GROUP_ROW adds an empty row. Row No is an internal number.
DELETE_GROUP
ADD_GROUP_ROW DELETE_GROUP_ROW
GET_GROUP_NUMBER_CELL
Copyright Oracle Corporation, 1999. All rights reserved.
Technical Note POPULATE_GROUP built-in function returns 0 when population succeeds and 1 if population does not succeed.
POPULATE_GROUP_WITH_QUERY
Note: You can convert a nonquery record group into a query record group by using the POPULATE_GROUP_WITH_QUERY built-in function to populate the nonquery record group. Getting Record Group Cell Values
Built-in Function GET_GROUP_CHAR_CELL, GET_GROUP_DATE_CELL, GET_GROUP_NUMBER_CELL Description Returns the value for the record group cell identified by the given record group column and row number (The record group column must be of data type VARCHAR2 or LONG, DATE, or NUMBER, respectively.)
SET_GROUP_SELECTION GET_GROUP_SELECTION
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note Explain the built-ins and describe how with SET_GROUP_SELECTION, if you select rows 2 and 4, the associated selection numbers are 1 and 2. Explain that the record group type (query, nonquery, static) and time of creation (design time or run time) determine which built-in functions are valid for a particular record group.
FIND_COLUMN
Instructor Note Demonstration: Use the Record Groups (Code Examples) (rec_grp.fmb) demonstration to show the code for creating a query record group. Use the DEFINE_QUERY_RECORD_GROUP procedure.
You can replace the associated query of a query record group by calling the POPULATE_GROUP_WITH_QUERY built-in function.
v_errcode := POPULATE_GROUP_WITH_QUERY(v_rg_id, SELECT id, name FROM s_customer where region_id = 1 ORDER BY id);
Instructor Note Demonstration: Use the Record Groups (Code Examples) (rec_grp.fmb) demonstration to show the code for creating a nonquery record group. Use the DEFINE_NON_QUERY_RECORD_GROUP procedure.
You can convert the nonquery record group into a query record group by calling the POPULATE_GROUP_WITH_QUERY built-in function.
Instructor Note Demonstration: Use the Record Groups (Code Examples) (rec_grp.fmb) demonstration to show the code for manipulating record group rows. Use the GET_VALUE_GRPROW function to show the code that you use to search for a specific value in a record group. Explain that this technique can be used with a combo box to determine whether or not the value already exists in the record group.
Instructor Note Demonstration: Use the Record Groups (Code Examples) (rec_grp.fmb) demonstration to show the code for manipulating selected record group rows. Use the SELECT_EVEN_ROWS procedure to show the code for searching for a specific row in a record group. Use the GET_VALUE_GRPSEL function to show the code for looping through the row in a record group. Explain that the even number can be identified by using the MOD function.
The function below illustrates how you can loop through all selected rows of a record group.
FUNCTION get_value_grpsel /* Returns selection number of selected group row that contains the specified value in the given group column. Returns NULL if the value is not found. */ (p_rg_id in RECORDGROUP ,p_gc_id in GROUPCOLUMN ,p_value in VARCHAR2) RETURN NUMBER IS v_grpsel_count NUMBER; v_grprow_no NUMBER; BEGIN --Only loop through the selected group rows. v_grpsel_count := GET_GROUP_SELECTION_COUNT(p_rg_id); FOR v_grpsel_no IN 1 .. v_grpsel_count LOOP --Get row number of selected row. v_grprow_no := GET_GROUP_SELECTION(p_rg_id,v_grpsel_no); IF GET_GROUP_CHAR_CELL(p_gc_id,v_grprow_no) = p_value THEN RETURN(v_grpsel_no); END IF; END LOOP; RETURN(null); END;
Technical Note If a global record group is created from (or populated with) a query while executing a Form A, and the query string contains bind variable references that are local to A (:block.item or :PARAMETER.param), then when Form A terminates execution, the global query record group is converted to a global nonquery record group. The record group retains its data, but a subsequent POPULATE_GROUP is considered an error. Instructor Note Demonstration: Use the Global Record Groups (Orders2.fmb) demonstration to illustrate the use of a global record group. Click the product_lov button to display a list of values form. Press [Ctrl] and click the products that you want. Then click the OK button. The products selected are returned by way of a global record group to the ORDERS form. You can show the When-Mouse-Click trigger of the lov_product form.
POPULATE_LIST
RETRIEVE_LIST
DELETE_LIST_ELEMENT GET_LIST_ELEMENT_COUNT
RETRIEVE_LIST
Using a Record Group with a List Item You can transfer information between a list item and a record group by using the POPULATE_LIST and RETRIEVE_LIST built-in functions. The record group that is used as the second parameter for these functions must satisfy these requirements: The record group must contain exactly two group columns of type CHAR. The first group column must store the list element label. The second group column must store the list element value.
Create group rrom query Populate group Yes Populate list Display first list label
Copyright Oracle Corporation, 1999. All rights reserved.
Success?
No
Instructor Note Demonstration: Use the Record Groups (Code Examples) (rec_grp.fmb) demonstration to show the code of the POPULATE_LIST_WITH_QUERY procedure. Explain that the When-Create-Record trigger is used because it is too late for the When-List-Changed trigger to here. Another option is to use the When-Mouse-Down trigger.
Note: In this example, the customer name is the (visible) list label and the customer ID is the (actual) list value.
Instructor Note Demonstration: Use the Record Groups (Code Examples) (rec_grp.fmb) demonstration to show the code of the ADD_COMBO_BOX_ELEMENT procedure.
Summary
A record group is a data structure similar to a database table. Query, nonquery, and static records Record groups defined at design time Built-in functions for record groups Global record groups
Summary
Uses for record groups: Constructing dynamic SELECT statements Storing or passing data Populating or storing list items Manipulating list items programmatically: Built-in functions for list items
Summary ......................................................................................................................................................
Summary
A record group is an internal Forms data structure that is similar to a database table. Three Record Group Types Query record group Non query record group Static record group Defining Record Groups at Design Time Creating query and static record groups Modifying SELECT statements and column definitions of record groups Built-ins for Controlling Record Groups Creating and deleting record groups Modifying the structure of record groups Populating record groups Getting record group cell values Processing record group rows Finding record group objects Defining a Global Record Group Created at runtime only Visible to all forms in an application Scope parameter Uses for Record Groups Constructing dynamic SELECT statements Storing form configuration information Communicating within a form Passing data to other Oracle products Populating or storing list items Manipulating List Items Programmatically Built-in for list items
Practice 11 Overview
This practice covers the following topics: Converting a text item into a dynamically populated list item Creating a list of values form from which you can select multiple values simultaneously
Practice 11
1 Create a dynamic list item. This functionality avoids having to create a
new item to display the department name. a Open the EMPLOYEES form module. b Create a design time query record group that contains IDs and names of departments. Name your record group DEPT_ID. In the Object Navigator, create a record group named DEPT_ID based on the query below:
SELECT name || in region || TO_CHAR(region_id) Name, TO_CHAR(id) Id FROM s_dept ORDER BY 1
Convert the text item DEPT_ID into a list item, Combo Box Style. Resize it in the Layout Editor. d Create an element in the list. Label: Dummy and Value: 0 e Create a procedure called LIST_FROM_DESIGNTIME_GROUP. This procedure accepts the list item name as an argument and populates the list item dynamically at runtime, using the design-time query record group. You can import the pr11_1e.txt file. f Call the procedure each time a new record is created. You can import the pr11_1f.txt file. g Save, compile, and test the module. If you have time... 2 Create a multirecord select list form. This practice shows how to create a list of values where the user can select multiple values. This lab uses a global record group. a Exit Form Builder. b Run Form Builder and create a new form based on a template named lov_prod_template.fmb. c Examine this new module and save it as lov_product.fmb. Create a When-Mouse-Click trigger at the PROD_LOV_BLK block level that selects or clears a record when a user presses Controlclicks for a product. d Write the code to create a record group if it does not already exist and add columns to the group for each item in the PROD_LOV_BLK block. If the record group exists write the code to
c
Practice 11 ......................................................................................................................................................
retrieve the internal ID for each column in the record group. Write the code to check whether the record selected is already in the record group. If so, loop through each item in the record to keep the visual attribute from being highlighted, and then remove the record from the record group. If the user selects a record that was not already in the group, write the code to add the record to the record group and loop through each item in the block to keep the color highlighted. Use the SELECTED and DESELECTED visual attributes in your code to change the color of a selected or cleared record. You can import the pr11_2d.txt file. e Create the code for the OK button. This button enables the user to exit the form. f Create the code for the Cancel button in the PROD_LOV_BLK block. Create a When-Button-Pressed trigger that deletes the record group before returning to the ITEM block. You can import the pr11_2f.txt file. g In the ORDERS form, modify the When-Button-Pressed trigger for the CONTROL.PRODUCT_LOV_BUTTON. The new code should check the existing products in the S_ITEM block, so that products already ordered do not show up in the list. The trigger then calls the PROD_LOV_BLK form, passing the list of existing products using a GLOBAL variable. You can import the pr11_2g.txt file. h In the LOV_PRODUCT form, create a When-New-Form-Instance trigger to retrieve the list of products excluding the products that exist in the S_ITEM block. You should use the global variable created earlier. You can import the pr11_2h.txt file. i In the ORDERS form, modify the When-Button-Pressed trigger for the CONTROL.PRODUCT_LOV_BUTTON. After you call the form, the code creates records in the S_ITEM block for each row selected in the record group. The code then deletes the record group.You can import the pr11_2i.txt file. Place the new code after the existing code. j Save, run, and test your forms. To select multiple items, select the first item, hold the Control key down, and then select other items.
12
................................
Objectives
After completing this lesson, you should be able to do the following: Include charts in an application Integrate other graphics displays in an application Include reports in an application
Instructor Note
Topic Lecture Practice Total Timing 40 minutes 40 minutes 80 minutes
Introduction ......................................................................................................................................................
Introduction
Overview In this lesson, you will learn how to include other module types in your application, such as charts built using Graphics Builder and reports built using Report Builder. Objectives After completing this lesson, you should be able to do the following: Include charts in an application Integrate other graphics displays in an application Include reports in an application
Instructor Note Demonstration: Step 1: Open the Employee Form (Emp.fmb)demonstration. Display the CANVAS4 canvas. From the Layout Editor toolbar, change the Block popup list from EMP to CONTROL. Using the Chart tool, drag a chart area onto the canvas. (The Employee form is based on the EMP table. If it does not already exist, it can be created by running the utlsample.sql file. (Instructions for this demonstration continue in the next instructor note.)
Instructor Note Step 2: Select Column for the chart type. Step 3: Select the EMP block. (continued)
Chart Type Select the style of chart that you require. The picture on the left of the wizard displays the relevant chart style. The chart subtype options are context-sensitive; the number and style of options change depending on the chart type that you choose. Choose the chart subtype that you require, and then click Next to continue to the next wizard page.
Chart Type Column Bar Pie Line Mixed Description Data is plotted as columns. Data is plotted as horizontal bars. Data is plotted as individual slices showing the relationship of parts to the whole. Data is plotted as points along a line. Data is charted using multiple chart types, such as bar and line.
Data Source The next step in the Chart Wizard is to select the block that contains the data you want to represent in the chart. The data block you select determines the data that is available for assignment to the Category and Value axes of your chart.
Instructor Note Step 4: Select ENAME for the Category axis. Step 5: Select SAL for the Value axis. Save into Disp1.ogd. Run your form.
Category Axis To use the Chart Wizard to map data to your charts Category (X) axis: 1 In the Available Fields list, select the field that you want to map to the Category (X) axis of the chart. 2 Transfer the selected field from the Available Fields list to the Category Axis list. Note
Chart Type Column, Line, Mixed chart Bar chart Pie chart Description Categories appear along the x-axis. Categories appear down the y-axis. Each category represents one segment of the pie.
Value Axis To use the Chart Wizard to map data to your charts Value (Y) axis: 1 In the Available Fields list, select the field that you want to map to the Value (Y) axis of the chart. 2 Transfer the selected field from the Available Fields list to the Value Axis list. Note
Chart Type Column, Line, Mixed chart Bar chart Pie chart Description Values are represented by the height of the column against the y-axis. Values are represented by the length of the column against the x-axis. Values are represented by the size of each segment.
Note: You must transfer at least one field from the Available Fields list to the Category Value list before navigating to the next page.
Filename Execution Mode Communication Mode Data Source Data Block Query Name Data Source X Axis Data Source Y Axis Update on Query Update on Commit
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note The default name of the Query Name property is Genie_Query. The query is created automatically with the structure of the Data Source Data Block.
Technical Note Passing data is applicable only if running against a local server. Instructor Note You cannot run a report based on a block that contains a long column. Demonstration: Open the Customer Form (customers.fmb) demonstration and create a new report object.
Filename Filename Execution Mode Execution Mode Communication Mode Communication Mode Data Source Data Block Data Source Data Block Query Name Query Name
Copyright Oracle Corporation, 1999. All rights reserved.
Reports properties
Instructor Note Demonstration: Set the Execution Mode property to RUNTIME, the Communication Mode to SYNCHRONOUS, and the Report Destination Type to PREVIEW.
Communication Mode
Reports Properties
Property Name Report Destination Type Report Destination Name Description Specifies the type of device that will receive the report output Specifies the name of the file, printer, or Oracle Office username (or distribution list) to which the report output will be sent Specifies the format of your report (Possible values are PDF, HTML, HTMLCSS, or the printer driver to be used when DESTYPE is File.) Name of the remote server on which the report is run Declares additional parameters
Instructor Note Examples of the syntax for RUN_REPORT_OBJECT, FIND_REPORT_OBJECT, REPORT_OBJECT_STATUS, and COPY_REPORT_OUTPUT built-ins are available on the next page. CANCEL_REPORT_OBJECT is not explained, but you can show the syntax by expanding the Built-in Packages node in the Object Navigator, and then STANDARD Extensions node. GET_REPORT_OBJECT_PROPERTY and SET_REPORT_OBJECT_PROPERTY are not explained in detail, because these built-ins are similar to the Get and Set built-ins. Instructor Note Demonstration: Create a button in the Control block. Write a When-ButtonPressed trigger with the following code:
DECLARE v_rep VARCHAR2(100); BEGIN v_rep := RUN_REPORT_OBJECT(<your_report_object_name>); END;
Instructor Note If you want to test the report status when you run a report against a remote server, the Communication Mode report object property must be synchronous.
Running a Report Against a Local Server This example allows the user to run a report against a local server.
DECLARE v_rep repid BEGIN repid v_rep end; VARCHAR2(100); REPORT_OBJECT; := FIND_REPORT_OBJECT(deptrpt); := RUN_REPORT_OBJECT(repid);
Running a Report Against a Remote Server This example allows the user to run a report against a remote server. RUN_REPORT_OBJECT returns a string that uniquely identifies the report on the server. This string could be used to get the report status or copy the output across or terminate the report in case the report is being run asynchronously.
DECLARE v_rep VARCHAR2(100); repid REPORT_OBJECT; rep_status VARCHAR2(20); BEGIN repid := FIND_REPORT_OBJECT(barcode); v_rep := RUN_REPORT_OBJECT(repid); rep_status := REPORT_OBJECT_STATUS(v_rep); IF rep_status = FINISHED THEN MESSAGE(Report Completed); COPY_REPORT_OBJECT_OUTPUT(v_rep,c:\local.pdf); /* Once the report output is copied across successfully depending on the type of the output the file could be displayed using a Web Browser or an OCX control */ HOST(netscape c:\local.pdf); ELSE MESSAGE(Error when running report.); END IF; END;
Summary
Invoking the Chart Wizard Reporting features in Form Builder: Create report objects Run against local or remote server Base reports on data blocks
Summary
Interacting with reports:
RUN_REPORT_OBJECT FIND_REPORT_OBJECT CANCEL_REPORT_OBJECT REPORT_OBJECT _STATUS COPY_REPORT_OUTPUT GET_REPORT_OBJECT_PROPERTY SET_REPORT_OBJECT_PROPERTY
Copyright Oracle Corporation, 1999. All rights reserved.
Summary ......................................................................................................................................................
Summary
In this lesson, you should have learned how to include charts and reports in your application. You should have learned how to invoke the Chart Wizard. Reporting Features in Form Builder Create report objects Run against local or remote server Base reports on data blocks Interacting with Reports RUN_REPORT_OBJECT FIND_REPORT_OBJECT CANCEL_REPORT_OBJECT REPORT_OBJECT_STATUS COPY_REPORT_OUTPUT GET_REPORT_OBJECT_PROPERTY SET_REPORT_OBJECT_PROPERTY
Practice 12 Overview
This practice covers the following topics: Creating a chart to display the total orders for each customer Creating a report based on the S_CUSTOMER block Displaying different report styles
Practice 12
1 Create a chart object by using the Chart Wizard. This chart should
display the total orders for each customer. a Open the CUSTOMERS form module. b Create a new tab page on the TAB_CUSTOMER canvas. Name this page CHART and change the label name. Open the FormBuilder_II.olb object library. Copy the OBJ_CHART object group into the CUSTOMERS form. This object group contains a block named S_ORD. Only one item from this block is visible: TITLE. This item displays a title for the chart. c From the Layout Editor, use the Chart tool to drag a chart area onto the chart tab page. Select Use the Chart Wizard from the New Chart Object dialog box. Do not specify a title for the chart. d Select Column as chart type, Plain as chart subtype. e Specify the S_ORD block as the data block that contains the data you want to assign to chart columns. f Select CUSTOMER_NAME to appear on the Category (X) axis, and TOTAL to appear on the Value (Y) axis of the chart. g Click the Finish button. Save, run, and test your form. To display the chart, click in the Title item on the Chart tab. 2 Create a report object based on the S_CUSTOMER block. This report displays a customer list using a tabular layout. Display only the ID, NAME, COUNTRY, and REGION_ID fields. a Open the CUSTOMERS form. b Create a new report object. This will invoke the Report Builder. Within the Report Wizard: - Choose the report style Tabular. - Select the ID, NAME, COUNTRY, and CREDIT_RATING fields. - Do not select fields to total. - Change labels and widths for your fields. - Select a template for your report. c Save your report and exit Report Builder. d Set the Execution Mode report object property to runtime and the Report Destination Type report object property to screen.
Practice 12 ......................................................................................................................................................
Create a button named CUST_REP_BUTTON into the control block. Display this button on the CV_CUSTOMER canvas. f Create a When-Button-Pressed trigger on the CUST_REP_BUTTON button to run the report. g Change the Query All Record property value to Yes for the S_CUSTOMER block. h Save, run, and test your form. Query a customer record before calling the report. If you have time... 3 Create a new tab page from which the user can run different report layouts. a Open the Form_Builder_II.olb object library. b From the Report tab page, select all the report objects and copy them to the CUSTOMERS form. c Change the filename property to each report so that the path is correct for your environment. d From the Report tab page, select the REPORT block and copy it to the CUSTOMERS form. Organize this block so it is the last block in sequence. e From the Report tab page, select the REPORT tab page object and copy it to the CUSTOMERS form. Organize this tab page so it is the last tab page in sequence. f Save, run, and test your form.
e
13
................................
Applying Timers
Objectives
After completing this lesson, you should be able to do the following: Describe timers Create a timer Modify a timer Delete a timer Handle timer expiration
Copyright Oracle Corporation, 1999. All rights reserved.
Instructor Note
Topic Lecture Practice Total Timing 25 minutes 30 minutes 55 minutes
Explanation for the next page: Point out that using GET_APPLICATION_PROPERTY(timer_name) returns NULL if called from any trigger other than When-Timer-Expired. Demonstration for the next page pair: Use the About... Information at Startup (Customers.fmb) demonstration to illustrate one use of timers. Use the Auto Commit/Rollback After Period of Time to illustrate automatically asking for COMMIT after a period of time.
Introduction ......................................................................................................................................................
Introduction
Overview This lesson covers time-initiated processing; that is, processing that occurs after a certain amount of time has elapsed. The mechanism you use to do this is called a timer and it is created, modified, and deleted at run time. Objectives After completing this lesson, you should be able to do the following: Describe timers Create a timer Modify a timer Delete a timer Handle timer expiration
Timers
What is a timer? Built-ins for timers:
FIND_TIMER CREATE_TIMER SET_TIMER DELETE_TIMER GET_APPLICATION_PROPERTY
(TIMER_NAME)
Copyright Oracle Corporation, 1999. All rights reserved.
Timers
When-Timer-Expired trigger Using timers:
Poll database Periodically query, commit, or
rollback
Show About information at
startup
Copyright Oracle Corporation, 1999. All rights reserved.
Technical Note Timers are not suitable means of shutting down an application. It is the job of the operating system to recognize idle processes and shut them down.
Timers ......................................................................................................................................................
Timers
Typically, Forms processes events that are (originally) initiated by the user. You can use timers when you want Forms to perform a set of actions after a period of time has elapsed. What Is a Timer? A timer is a programmatic construct similar to an internal alarm clock. You can create, modify, or delete timers by means of built-ins. When you create or modify a timer, you can specify the period of time that elapses before the timer expires. Using a trigger, you can specify what actions must be performed at that time. Built-in Functions for Timers
Built-in FIND_TIMER CREATE_TIMER Description Returns the internal timer ID (of data type TIMER) of a timer with the given name Creates a timer with the given name (You can specify the time interval and whether the timer should repeat on expiration.) Changes the settings for the given timer (You can modify the time interval and the repeat behavior.) Deletes the given timer The TIMER_NAME property returns the name of the most recently expired timer.
When-Timer-Expired Trigger This trigger fires when a timer expires; that is, when the specified time interval of the timer has elapsed. Uses of Timers Polling the database to check if a certain event has occurred Performing an automatic query at regular intervals Showing About this... information at form startup Performing an automatic commit or rollback after a specific amount of idle time
Instructor Note Explain that: 1 Timer A is created, and when it expires, it is placed in the timer queue. 2 If no other processing is taking place, then the When-Timer-Expired trigger fires for Timer A. 3 After Timer A has been serviced from the queue, it can begin its next iteration. 4 Timer B (a nonrepeating timer) is created in the meantime. 5 When Timer B expires, it cannot be immediately serviced by the When-Timer-Expired trigger, because a query is taking place. 6 After the query is complete, the When-Timer-Expired trigger can fire for Timer B.
Creating a Timer
Syntax:
CREATE_TIMER (timer_name, milliseconds, iterate) CREATE_TIMER (timer_name, milliseconds, iterate)
Example:
v_timer_id := CREATE_TIMER (hour_alarm, cst_hour); v_timer_id := CREATE_TIMER (hour_alarm, cst_hour);
Creating a Timer
You can create a timer by using the CREATE_TIMER built-in function, which returns type TIMER. Syntax
CREATE_TIMER(timer_name, milliseconds, iterate)
Description The timer name The duration of the timer in milliseconds (Value must be between 1 and 2147483648, approximately 25 days.) Specifies whether the timer should repeat upon expiration (Valid values are REPEATthe defaultand NO_REPEAT.)
Example At form startup, create a timer named HOUR_ALARM that expires every hour.
DECLARE cst_hour constant NUMBER(7) := 3600000; --3600000 is one hour in milliseconds v_timer_id TIMER; BEGIN v_timer_id := CREATE_TIMER(hour_alarm, cst_hour); END;
Modifying a Timer
Syntax:
SET_TIMER (timer_name, milliseconds, iterate) SET_TIMER (timer_name, milliseconds, iterate) SET_TIMER (timer_id, milliseconds, iterate) SET_TIMER (timer_id, milliseconds, iterate)
Example:
Modifying a Timer
You can modify a timer by using the SET_TIMER built-in procedure. Syntax
SET_TIMER(timer_name, milliseconds, iterate) SET_TIMER(timer_id, milliseconds, iterate)
Description The timer name The internal timer ID The duration of the timer in milliseconds (Value must be between 1 and 2147483648approximately 25 daysor must be NO_CHANGE.) Specifies whether the timer should repeat upon expiration (Valid values are REPEAT (default), NO_REPEAT, and NO_CHANGE.)
Example Set the repeat behavior of a timer named HOUR_ALARM without changing the time interval. The trigger name depends on the situation.
BEGIN SET_TIMER(hour_alarm, no_change, no_repeat); END;
Deleting a Timer
Syntax:
DELETE_TIMER (timer_name) DELETE_TIMER (timer_name) DELETE_TIMER (timer_id) DELETE_TIMER (timer_id)
Example:
... ... IF NOT ID_NULL (FIND_TIMER (hour_alarm)) THEN IF NOT ID_NULL (FIND_TIMER (hour_alarm)) THEN DELETE_TIMER (hour_alarm); DELETE_TIMER (hour_alarm); END IF; END IF; ... ...
Copyright Oracle Corporation, 1999. All rights reserved.
Deleting a Timer
You can delete a timer by using the DELETE_TIMER built-in procedure. Syntax
DELETE_TIMER(timer_name) DELETE_TIMER(timer_id)
Description
Note: Forms generates an error if you attempt to delete a nonexistent timer. Example Delete a timer named HOUR_ALARM after first checking that it exists. The trigger name depends on the situation.
BEGIN IF NOT ID_NULL(FIND_TIMER(hour_alarm)) THEN DELETE_TIMER(hour_alarm); END IF; END;
Summary
A timer is a programmatic construct Built-in functions for timers:
FIND_TIMER CREATE_TIMER SET_TIMER DELETE_TIMER GET_APPLICATION_PROPERTY
(TIMER_NAME)
Copyright Oracle Corporation, 1999. All rights reserved.
Summary
Using timers Handling timer expiration:
Timer queue When-Timer-Expired trigger
Summary ......................................................................................................................................................
Summary
A timer is a programmatic construct much like an internal alarm clock. Built-ins for Timers FIND_TIMER CREATE_TIMER SET_TIMER DELETE_TIMER GET_APPLICATION_PROPERTY(TIMER_NAME) Uses of Timers Polling the database to check if a certain event has occurred Performing an automatic query at regular intervals Showing About this... information at form startup Performing an automatic commit or rollback after a specific amount of idle time Handling Timer Expiration When a timer expires, it is put in a first-in-first-out timer queue. The When-Timer-Expired trigger fires once for each timer that expires, but only after Forms has completed any current processing.
Practice 13 Overview
This practice covers the topics: Showing About... information at form startup Periodically checking to see if there are locked records and asking the user to commit or roll back
Practice 13
1 ShowAbout... information at the startup of the form.
Open the CUSTOMERS form module. b Add a window and a canvas to the form that are used to display the two control items. This window could be considered an About... window and should be a modal dialog window. Set the Hide on Exit property to Yes for this window. c Create manually a new control block, called ABOUT. Create two items in the ABOUT block that are used to display the user name and the current date and time. d Show the About... window for a short period of time at the startup of the form. You can import the pr13_1d1.txt file for the When-New-Form-Instance trigger. Add the new code after the existing code. You can import the pr13_1d2.txt file for the When-Timer-Expired trigger. Append the new code to the end of the existing code. If you have time... 2 Automatically ask the users if they want to commit after a set period of time. a Open the CUSTOMERS form module. b At the startup of the form, create a global variable called GLOBAL.LOCKS_PENDING, which indicates at all times whether rows of the S_CUSTOMER table are locked. Append the new code to the end of the existing code. c Create the On-Lock trigger to implement the default lock processing, update the global variable, and create the timer. You can import the pr13_2c.txt file. d Write a When-Timer-Expired trigger to display an alert if locks are still pending after a certain period of time elapses. This alert should ask the user to commit or roll back the changes. You can replace the existing code with the code from the pr13_2d.txt file. Note: You need to create an alert called ASK_SAVE. Define an alert (called ASK_SAVE) of style Caution with a Yes and a No button. Define an appropriate message. e Create the Post-Database-Commit trigger to give the NULL value to the global variable.You can import the pr13_2e.txt file. f Create the On-Rollback trigger to implement the default rollback processing and give the NULL value to the global variable. You can import the pr13_2f.txt file.
a
14
................................
Objectives
After completing this lesson, you should be able to do the following: Use Oracle server functionalities in forms Deal with server-side PL/SQL Recognize which PL/SQL8 features are supported in forms, and which are not Handle Oracle server errors Perform DDL commands by using the FORMS_DDL built-in subprograms
Instructor Note
Topic Lecture Practice Total Timing 25 minutes 30 minutes 55 minutes
Introduction ......................................................................................................................................................
Introduction
Overview This lesson covers the use of Oracle server features in Form Builder applications. You will learn about storing and calling PL/SQL code, handling Oracle server errors, and issuing DDL commands from within forms. Objectives At the end of this lesson, you should be able to: Use Oracle server functionalities in forms Deal with server-side PL/SQL Recognize which PL/SQL8 features are supported in forms Handle Oracle server errors Perform DDL commands by using the FORMS _DDL built-in subprograms
Application partitioning
Copyright Oracle Corporation, 1999. All rights reserved.
PL/SQL8 Support
Oracle Developer Release 6 uses PL/SQL8 in the client and in the server. However, client-side program units currently cannot support Oracle8 objectrelated functionality. The Stored Program Unit editor has been extended in Oracle Developer Release 6 to allow editing of the type body (methods) and type specification (attributes) of Oracle8 user-defined data types. Object Iron Packages The Object Iron is a set of database packages that helps you to access tables containing instances of Oracle8 object types. The packages generate a tablespecific package, which you use to access data from the specified table. After generation, the table-specific package appears under the Stored Program Units node. It contains code that allows you to select, insert, update, delete, and lock records in the specified table. Instructor Note Oracle Developer is backward-compatible with client-side program units built using PL/SQL Version 2. Client-side program units created with previous releases will run against the PL/SQL8 engine with no modification. Although stored program units created with previous releases will run against PL/SQL8, because of syntax incompatibility between PL/SQL8 and PL/SQL Version 2, these stored program units may compile with errors.
Oracle Server
Declarative constraint
Database trigger
Instructor Note Demonstration: Use the Handling of Server Errors (errh.fmb) file to demonstrate causes of Oracle server errors. Show the code in the DEMO_RAISE_ERROR procedure and then drag it to the Oracle server. Create a Before-Insert database trigger on the S_ORD table. Run the form and show an implicit update causing an error by attempting to change the primary key value. Attempt an insert and commit. Use [Display Error] to display the database trigger error. Add comments to the first line of the KeyHelp trigger and remove the comments from the second line. Run the form and press [Help] to show that the explicit insert, followed by commit, also results in the database triggers firing.
Types of DML Statements Declarative-constraint violations and firing of database triggers are in turn caused by DML statements. For error-handling purposes, you must distinguish between the following two types of DML statements:
Type Implicit DML Description DML statements that are associated with base table blocks. Implicit DML is also called base table DML. By default, Forms constructs and issues these DML statements. DML statements that a developer explicitly codes in triggers or program units.
Explicit DML
Oracle Server
Constraint Predefined message DB trigger RAISE_ APPLICATION_ ERROR Stored PU RAISE_ APPLICATION_ ERROR
Instructor Note Stress that the On-Error trigger and the DBMS_ERROR_CODE and DBMS_ERROR_TEXT functions are specifically for handling errors in implicit DML. (Implicit DML consists of the INSERT, UPDATE, and DELETE statements implicitly created when changes to a form are saved.) The PL/SQL functions SQLCODE and SQLERRM are for use with explicit DML. (Explicit DML consists of the INSERT, UPDATE, and DELETE statements explicitly written into PL/SQL blocks in the form.)
Note: Declarative-constraint violations and database triggers may be caused by both implicit DML and explicit DML. Stored program units are always called explicitly from a trigger or program unit. Technical Note The values of DBMS_ERROR_CODE and DBMS_ERROR_TEXT are not automatically reset following successful execution. FRM-Error Messages Caused by Implicit DML Errors If an implicit DML statement causes an Oracle server error, Forms displays one of these FRM-error messages: FRM-40508: ORACLE error: unable to INSERT record. FRM-40509: ORACLE error: unable to UPDATE record. FRM-40510: ORACLE error: unable to DELETE record. You can use ERROR_CODE to trap these errors in an On-Error trigger and then use DBMS_ERROR_CODE and DBMS_ERROR_TEXT to determine the ORA-error code and message. Note: The errors reported by the DBMS_ERROR_CODE and DBMS_ERROR_TEXT built-ins are the same as what a user would see after selecting [Display Error]. Appendix F, Handling Server-Side Errors covers server-side error handling in more detail.
mode
Statement must not contain bind-
variable references
Copyright Oracle Corporation, 1999. All rights reserved.
Description FORMS_DDL issues dynamic SQL statements at run time, including server-side PL/SQL and DDL. Parameter The specified statement can be any string expression up to 32K representing a: PL/SQL block DML statement DDL statement Do not end the PL/SQL block with a slash or the DML or DDL statement with a semicolon. Characteristics FORMS_DDL is an unrestricted procedure that is also valid in Enter Query mode. The specified statement must not contain bind-variable references. However, you can concatenate the values of bind variables into the specified string. The statement executed using FORMS_DDL cannot return results to Forms directly. Use the FORM_SUCCESS built-in to check whether the statement issued using FORMS_DDL executed correctly. Note: Consider using a query record group with a SELECT statement or calling a stored program unit, instead of executing FORMS_DDL.
Instructor Note Demonstration: Use the Handling of Server Errors (errh.fmb) demonstration file to show the code for the CREATE_TEMP_TABLE procedure. This procedure is called from the Pre-Commit trigger. Show the code for the EXEC_PROC procedure. Explain that the Post-Database-Commit trigger does not fire when changes are issued through the FORMS_DDL built-in, because Form Builder is not aware of such changes.
Using FORMS_DDL
The following examples show how you can use the FORMS_DDL built-in function. Example Create a temporary table at the start of a post. Pre-commit trigger at form level:
BEGIN FORMS_DDL(CREATE table temp(n_col number)); IF not FORM_SUCCESS THEN MESSAGE (Table creation failed.); RAISE form_trigger_failure; END IF; END;
Example Execute a procedure with a given name. This is useful if you want to determine dynamically which procedure should be executed in a certain situation.
PROCEDURE exec_proc (p_proc_name IN VARCHAR2) IS BEGIN FORMS_DDL(BEGIN || p_proc_name ||; END;); IF not FORMS_SUCCESS THEN handle_server_error(DBMS_ERROR_CODE,DBMS_ERROR_TEXT); END IF; END;
Note: If the FORMS_DDL built-in fails, Forms sets the DBMS_ERROR_CODE and DBMS_ERROR_TEXT built-ins. Therefore, you can handle Oracle server errors using the HANDLE_SERVER_ERROR procedure discussed earlier. Always test the SYSTEM.FORM_STATUS before calling the FORMS_DDL built-in.
Summary
Oracle server features useful for Form Builder Dealing with PL/SQL code PL/SQL8 supported and unsupported features Trap errors raised by the Oracle server
Implicit DML Explicit DML or stored program units
Summary ......................................................................................................................................................
Summary
Oracle Server Features Useful for Form Builder Declarative integrity constraints Stored program units Database triggers DDL Dealing with PL/SQL Code Store PL/SQL code in - Oracle server - Library - Form Call PL/SQL code from - Database trigger - Form trigger Application partitioning Handling Errors Raised by the Oracle Server Causes: declarative constraints, database triggers, stored program units Trap implicit-DML errors by using DBMS_ERROR_CODE and DBMS_ERROR_TEXT in an On-Error trigger Trap explicit DML errors and stored program unit errors by using SQLCODE and SQLERRM in a WHEN OTHERS exception handler Performing DDL with FORMS_DDL Parameter is a string (less than or equal to 32 K) representing a PL/SQL block or DML or DDL statement.
Practice 14 Overview
This practice covers the following topics: Handling errors caused by declarativeconstraint violation Handling errors caused by stored program units
Practice 14
1 Handle errors caused by declarative constraints violations.
Open the CUSTOMERS form module. This form is based on the S_CUSTOMER table. A primary key constraint is declared on the column Id. b Run the CUSTOMERS form and try to add a new customer with an existing customer number. Assign the new record an Id of 201 and a name of Dummy. What FRM-error message do you get? What Oracle server error message do you get? (Select [Display Error] to see the message.) c Which trigger must you use to trap error messages caused by violation of this constraint? d Which built-in functions must you use to get error messages caused by violations of this constraint? e Trap and replace the default constraint-violation message with your own message. Use the function STRIP_CONSTRAINT_NAME to detect which constraint was violated. You can import the pr14_1e1.txt file to create the function and the pr14_1e2.txt file to replace the existing code in the trigger. Note: The function STRIP_CONSTRAINT_NAME accepts a complete server error message, strips away the error number and prefix, and returns a more readable error message. The details of this function are covered in Appendix F, Handling Server Side Errors. f Save and compile the form. Try to insert a duplicate Id value, and note the displayed message. If you have time... 2 Handle errors caused by stored program units. a Open the CUSTOMERS form module. b Implement immediate primary-key checking in the CUSTOMERS form by creating a procedure called CHECK_PK_CUST. Call this procedure from an appropriate trigger. You can import the pr14_2b1.txt file to create the procedure and the pr14_2b2.txt file to replace the existing code in the trigger. c Run the form and try to add a new customer with an existing customer number. Enter an Id value of 201 and press [Next Item] to fire the When-Validate-Item trigger. What error do you get?
a
Practice 14 ......................................................................................................................................................
Drag the CHECK_PK_CUST procedure to the database under your user account. Delete the local CHECK_PK_CUST procedure in your form. e Examine the stored procedure CHECK_PK_CUST in the Stored Program Unit editor. Explain the errors that are shown. Correct the errors by using RAISE_APPLICATION_ERROR. f Run the form and try to add a new customer with an existing customer number. What FRM-error messages do you get? What Oracle server error message do you get? (Select [Display Error] to see the message.) g Which trigger must you use to trap error messages caused by stored procedures? h Which built-in functions must you use to get error messages caused by stored procedures? i Trap and replace the default error message with your own message. Use the function STRIP_APPLICATION_ERROR to get the application-error text. You can import the pr14_2i1.txt file to create the function and the pr14_2i2.txt file to replace the existing code in the trigger. j Save, compile and test the form.
d
15
................................
Objectives
After completing this lesson, you should be able to do the following: List the reusable components Include the calendar object in an application
Instructor Note
Topic Lecture Practice Total Timing 25 minutes 45 minutes 70 minutes
Introduction ......................................................................................................................................................
Introduction
Overview In this lesson, you will learn about the reusable components that are available with Oracle Developer. You will learn how these components can fit into any application. Objectives After completing this lesson, you should be able to do the following: List the reusable components Include the calendar object in an application
Reusable Components
Im the navigator
Im the calendar
Instructor Note Many of the demonstrations contain objects and techniques that the students may want to copy. They may reuse the icons, images, ActiveX controls, menus, and all other files provided in the demonstrations in their own applications. They may also include the components within a product of their own, including a commercial product that they sell to third parties. There is no license or fee required for any such reuse. These components are provided as is. Oracle Corporation makes no warranty as to their correctness or their fitness for any particular purpose. If they reuse any of these components in their own applications, whether modified or unmodified, they do so entirely at their own risk. Oracle Corporation does not provide any support for these components. ActiveX (OCX) controls are provided solely for demonstration purposes. Oracle does not support these controls and makes no guarantee as to their reliability. For their own applications, Oracle strongly recommends that they purchase supported, commercial controls such as those supplied by our Open Tools Initiative partners. Oracle Corporation retains all copyrights on these demonstrations, components, icons, ActiveX controls, and images.
Reusable Components
Oracle Developer contains a complete set of demonstrations that illustrate the power and productivity of the product. These demonstrations contain many tips and techniques that you can copy and use in your own applications. Reusable Component Definition A reusable component is a generic object (object group, block, PL/SQL library, and so on), that you can reuse in all your applications. You can create your own reusable components (code and object) by using the generic programming characteristics. This release also includes a number of reusable components that enable you to easily and rapidly build applications that provide power and performance while conforming to GUI standards. These components are customizable. Technical Note Some of the demonstrations and reusable components require PL/SQL features that are supported only in Oracle7 release 7.3 or later. If your database does not support these features, certain packages will be created but marked as Invalid. If you try to run a demonstration that requires these objects, you will see a warning that the packages are invalid.
Instructor Note Demonstration: Use the Orders (Orders.fmb) to demonstrate the implementation of the calendar class and the picklist class. Navigate to the DATE_ORDERED item and press [F9] to display the calendar. Click the PRODUCT_LOV button to display the picklist form.
Picklist class
Wizard class
Drag and drop PL/SQL library Form Builder utilities PL/SQL library
Reusable Component Conversion PL/SQL library Window system interface PL/SQL library
Description This PL/SQL library contains procedures to perform complex conversions. This PL/SQL library contains many commonly used routines specific to the Windows environment. The utility consists of a PL/SQL library and a Windows dynamic-link library (DLL) and can be used from any of the Oracle Developer builders. The PL/SQL library uses the ORA_FFI package and can be used as a model for creating your own DLL calls. The utility FFI_GEN is also available to help you generate a PL/SQL interface to DLLs.
The standard object library, stndrd20.olb, contains standard classes and visual attribute groups to help you build applications that conform to a standard look and feel. The standards can be used as provided, or you may choose to extend or modify them for your own requirements. These standards are designed to provide a Windows look and feel. Where appropriate, the objects in the library are set as SmartClasses so that they can be readily applied to the objects that you create in your forms. This object library, appsstds.olb, contains property classes and visual attribute groups that enable you to build modules that have the same look and feel as Oracle Applications. These standards have a Windows look and feel, but they have also been designed for maximum portability. These demonstrations include a number of standard menus that you may want to reuse and customize. Sample icons can be found in ORACLE_HOME\TOOLS\DEVDEM60\DEMO\BIN\ICON. This directory includes all of the icons used in the demonstrations and sample menus.
Creating a Calendar
To create a calendar: 1. Copy or make the Calendar Object Group a subclass. 2. Attach the PL/SQL library CALENDAR.PLL. 3. Create a Key-Listval trigger. 4. Call Date_LOV.Get_Date.
Copyright Oracle Corporation, 1999. All rights reserved.
Example
date_lov.get_date(sysdate,s_ord.date_ordered,240, date_lov.get_date(sysdate,s_ord.date_ordered,240, 60,Order Date,OK,Cancel,TRUE,FALSE,FALSE); 60,Order Date,OK,Cancel,TRUE,FALSE,FALSE);
Copyright Oracle Corporation, 1999. All rights reserved.
Argument display_date return_item v_x_pos v_y_pos v_title v_ok v_cancel v_highlight v_autoconfirm v_autoskip
Description The date to display when the Date List of Values window first appears The name of the block and item to which to return the chosen date Specifies the X coordinate of the Date List of Values window Specifies the Y coordinate of the Date List of Values window Title to display in the Date List of Values window Label for the OK button Label for the Cancel button Specifies that weekend days appear in a different color Specifies that the date immediately be returned when the end user clicks a day Specifies that the input focus moves to the next item in sequence
Summary
Reusable components Calendar class: Create a calendar class Built-in to manipulate the calendar class
Summary ......................................................................................................................................................
Summary
Reusable Components The purpose of a reusable component Reusable components list The Calendar Class Create a calendar Calendar Object Group content Built-in for manipulating the calendar
Practice 15 Overview
Creating a picklist to display and select the products available Adding a calendar on items:
s_ord.date_ordered s_ord.date_shipped
Practice 15
1 Create a picklist by using the picklist class. This picklist enables the end
user to make selections from two lists, one showing the products available and the other showing the objects selected. Note: To reuse the code you wrote in practice 10 question 2, we have provided most of the code by way of an object library. a Create a new form module. b Open the Form_Builder_II.olb object library. c From the Picklist Basic tab page, drag and copy the PICKLIST_BASIC object group to the Object Groups node in your module and release it. Copy the object group, do not subclass the object group. This object group contains a canvas, a window, and a block. The block contains two buttons, with the code to return the products selected in the picklist to the orders form. d From the Picklist Class tab page, copy the PICKLIST object group into your new form module. This object group contains all the objects to implement the picklist. Organize the CONTROL block so it is the last block in sequence. e Attach the picklist.pll library to your form. f Create a When-New-Form-Instance trigger to populate the List_In. Create an instance of the picklist with the CREATE_PICKLIST procedure. Populate the List_in, using the POPULATE_PICKLIST_WITH_QUERY function, with the results of a query that returns the IDs, names, and suggested prices from the S_PRODUCT table. (Retrieve the list of products excluding the products that exists in the S_ITEM block. You should use the global variable from practice 11.) Select the first element in the list by using the SET_PICLIST_SELECTION procedure, and display both lists by using the DISPLAY_PICKLIST procedure. You can import the pr15_1f.txt file. g Save your form using the filename PickList.fmb. Compile your form. h Open the ORDERS form module. i Modify the When-Button-Pressed trigger for the CONTROL.PRODUCT_LOV_BUTTON so that it calls your new form module. Comment out the old CALL_FORM line, it called an LOV from an earlier lab.
Practice 15 ......................................................................................................................................................
Save, run, and test your form. If you have time ... 2 In the ORDERS form, add a calendar on the S_ORD.DATE_ORDERED item and S_ORD.DATE_SHIPPED item. a From the calendar page of the Form_Builder_II.olb object library, copy the calendar object group. b Attach the PL/SQL library calendar.pll, which contains the Date_LOV package, to your module. c Create a Key-Listval trigger on the date ordered item. Add code to display the calendar using the Date_LOV package. You can import the pr15_2c.txt file. d Create a Key-Listval trigger on the date shipped item. Add code to display the calendar using the Date_LOV package.You can import the pr15_2d.txt file. e Save, run, and test your form.
j