Skip Headers

Oracle® Reports Building Reports 10g Release 2 (10.1.2) B13895-01 |
| Library | Product | Contents | Index

Previous | Next |

# 2 Advanced Concepts

This chapter introduces the concepts for advanced users of Oracle Reports. Each topic in this chapter is also included in the Advanced Concepts section of the Oracle Reports online Help (see Section 3.1.1, "Using the Oracle Reports online Help").

Topics are grouped into the following sections:

- Section 2.1, "Reports"

- Section 2.2, "Web Reports"

- Section 2.3, "Data Model Objects"

- Section 2.4, "Layout Objects"

- Section 2.5, "Parameter Form Objects"

- Section 2.6, "PL/SQL"

- Section 2.7, "Templates"

- Section 2.8, "Output Formats and Capabilities"

- Section 2.9, "Data Sources"

- Section 2.10, "Debugging Tools"

## 2.1 Reports

The topics in this section build on the basic concepts discussed in Section 1.2, "Reports".

- About report titles

- About report sectioning and sections

- About the report unit of measurement

- About the report dimensions

- About conditional formatting

- About nested matrix reports

- About matrix with group reports

### 2.1.1 About report titles

You can add a title to a report in either of the following ways:

- Manually, by creating a boilerplate text object in the margin of the Paper Layout view.

- Typing in the Title field on the Style page of the Report Wizard.

When you use the Report Wizard to add a title and do not select a template for your report output, the title is inserted into the margin of the report with default attributes defined by Reports Builder. You can modify the attributes in the Paper Layout view.

When you use the Report Wizard to add a title, and do select a predefined template or a user-defined template file for your report output, Reports Builder looks for a boilerplate text object named `B_OR$REPORT_TITLE` defined for the selected template:

- If `B_OR$REPORT_TITLE` exists, the title is displayed using the attributes of this object, with the text you typed in the Report Wizard.

- If `B_OR$REPORT_TITLE` is not found, the title is displayed using the attributes defined by the Default properties (under the Title node in the Property Inspector) of the selected template.

  Note: If you do not specify a title in the Report Wizard, the `B_OR$REPORT_TITLE` object is not copied to your report.

For layouts created using the Report Block Wizard, the title is inserted into the new layout as a group title rather than into the margin of the report. In this case, the attributes are set per the Default properties (under the Title node in the Property Inspector) of the selected template, and `B_OR$REPORT_TITLE` is ignored. If you do not select a template, the title uses the default attributes defined by Reports Builder.

See also

Section 3.5.6, "Adding a title to a report"

Section 3.12.5, "Formatting the report title in a template"

Section 2.7.1, "About templates"

### 2.1.2 About report sectioning and sections

Report sectioning enables you to define multiple layouts in the same report, each with a different target audience, output format, page layout, page size, or orientation. You can define up to three report sections, each with a body area and a margin area: the names of the sections are Header, Main, and Trailer. By default, a report is defined in the Main section. In the other sections, you can define different layouts, rather than creating multiple separate reports. If you wish, you can use the margin and body of the Header and Trailer sections to create a Header and Trailer page for your reports.

In the Object Navigator, the report sections are exposed in the Object Navigator under the Paper Layout node as Header Section, Main Section, and Trailer Section.

You can specify the order in which the three sections of a report (Header, Main, and Trailer) are formatted using SRW.SET_FORMAT_ORDER or the Format Order of Sections property. This capability allows Oracle Reports to format any section first to create information that is only known at the time of formatting, such as page numbers, then use that information in the formatting of another section. As an example, this property can be used to create a table of contents. For an example of using SRW.SET_FORMAT_ORDER for this purpose, see Chapter 35, "Building a Paper Report with a Simple Table of Contents and Index" and Chapter 36, "Building a Paper Report with a Multilevel Table of Contents".

For an example of using section-level distribution, see Chapter 37, "Bursting and Distributing a Report". This chapter covers defining distribution of a single section to multiple destinations, using the Repeat On property and a sample `distribution XML` file. For information about advanced section-level distribution and creating your own `distribution XML` file, see the chapter "Creating Advanced Distributions" in the Oracle Application Server Reports Services Publishing Reports to the Web manual.

Examples

Example 1

You can use sectioning and distribution to publish your report output in HTML, and also send a PostScript version to the printer.

Example 2

You can send an executive summary of the report to senior management, and also e-mail detailed breakdowns to individual managers. In this example, a single report with two report sections needs to be created: a portrait-sized summary section and a landscape-sized detail section. Use the Repeat On property to associate the detail section with a data model group that lists the managers and then alter the destination on each instance of the data model group to send the output to the appropriate managers.

See also

Section 2.8.3, "About report distribution"

Section 3.10.1, "Displaying a section layout view"

Section 3.10.2, "Creating a default layout for a section"

### 2.1.3 About the report unit of measurement

A report can be defined using inches, centimeters, or points. The unit of measurement is independent of the device on which you build the report. As a result, you can design reports that will run on any platform on which Reports Builder runs. You can change a report's unit of measurement in these ways:

- Setting the Unit of Measurement property.

- Converting the report using rwconverter, specifying a different unit of measurement with the DUNIT keyword.

- Opening the report in a different environment. For example, if you open a character-mode report, Reports Builder will change the report's unit of measurement to the bit-mapped environment's default. If you then save the report, it will be saved with the new unit of measurement.

### 2.1.4 About the report dimensions

A report page can have any length and any width. Because printer pages may be smaller or larger than your paper report's "page," the concept of physical and logical pages is used. A physical page is the size of a page that is output by your printer. A logical page is the size of one page of your report; one logical page may be made up of multiple physical pages.

For each section (header, main, trailer) of a report:

- you specify the dimensions of the physical page (including the margin) using the Width property and Height property.

- you specify the dimensions of the logical page (report page) in physical pages (printer pages) using the Horizontal Panels per Page property (width) and the Vertical Panels per Page property (height). For example, a Horizontal Panels per Page size of 1 means that each logical page is one physical page wide, and a Vertical Panels per Page size of 2 means that each logical page is two physical pages in height.

In this example, one logical page is made up of six physical pages. The logical page is three physical pages wide and two physical pages high. Consequently, Horizontal Panels per Page size is 3 and Vertical Panels per Page size is 2. If you wanted the logical page to be two physical pages wide and three physical pages high, you would specify a Horizontal Panels per Page size of 2 and a Vertical Panels per Page size of 3.

Figure 2-1 Report dimensions

Description of "Figure 2-1 Report dimensions"

### 2.1.5 About fonts in reports

For detailed information about using and adding fonts in Oracle Reports, including font configuration files, font aliasing, troubleshooting font issues, and font types, refer to the chapter "Fonts in Oracle Reports" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page ().

### 2.1.6 About conditional formatting

Using the Conditional Formatting and Format Exception dialog boxes, you can specify output formatting attributes (font and color) for a selected layout object based on conditions that exist. The conditions that you define are called format exceptions.

You can display the Conditional Formatting dialog box from the Paper Layout view or Paper Design view in any of the following ways:

- Double-click the object to display the Property Inspector. Under the General Layout node, click the Conditional Formatting value field (labeled...).

- Display the pop-up menu (right-click in Windows) for the object.

- Click the object, then choose Format > Conditional Formatting.

The Format Exception dialog box displays when you click New or Edit in the Conditional Formatting dialog box, and enables you to quickly and easily specify output formatting attributes for a selected layout object based on defined conditions. After you specify conditions and formatting for the current layout object in the Format Exception dialog box, the entire definition is exported to a PL/SQL format trigger. If a format trigger already exists for the layout object, the definition in the Format Exception dialog box overwrites the existing trigger code when you confirm the Reports Builder prompt.

You can edit the format trigger manually through the PL/SQL Editor; however, if you subsequently modify the definition using the Format Exception dialog box, Reports Builder displays a prompt to overwrite the existing format trigger.

See also

Section 3.9.1.5, "Applying conditional formatting to a layout object"

### 2.1.7 About nested matrix reports

A nested matrix report is a matrix report in which at least one parent/child relationship appears within the matrix grid.

A nested matrix report has more than two dimensions; therefore, it has multiple dimensions going across or down the page. For example, look at the report below (). Notice that for each year there is a nested list of related departments. Also notice that the list of jobs (the across values) appears only once. Because the job values appear only once, a summary of each category of jobs can be made to line up with the values it summarizes.

Note: In a nested matrix report, where you create a matrix query that has a child matrix query, the fields on which you join should be separated into a separate group in your master matrix. Otherwise, on some platforms, only the first group prints.

For a detailed example, see Chapter 26, "Building a Nested Matrix Report".

See also

Section 2.3.7, "About matrix objects"

Section 1.3.7, "About matrix reports"

### 2.1.8 About matrix with group reports

A matrix with group report is a group above report with a separate matrix for each value of the master group. For example, for each year (master) in the report below there is a unique matrix that contains only that year's departments and jobs. This means that a summary of each job category may not line up with the values it summarizes because the position of each job category in the matrix may vary for each year.

A multiquery matrix with group report is similar to a nested matrix report in that it has more than two dimensions. For example, in the following report, notice that for each year there is a nested list of related departments.

Figure 2-2 Sample matrix with group and nested matrix report

Description of "Figure 2-2 Sample matrix with group and nested matrix report"

The advantage of using multiple queries is that you get a real break, or master/detail relationship, for the nesting groups (for example, notice that in the multiquery example above, Year 80 shows only record 20; with a single query, Year 80 would show all records whether or not they contain data for Year 80). If you want to suppress detail records that do not contain data for a particular master record, you must use multiple queries.

For a complete example, see the example report in Chapter 27, "Building a Matrix with Group Above Report".

See also

Section 2.3.7, "About matrix objects"

Section 1.3.7, "About matrix reports"

## 2.2 Web Reports

The topics in this section build on the basic concepts discussed in Section 1.2.2, "About Web reports".

- About JavaServer Pages (JSPs) and servlets

- About previewing JSP-based Web reports

- About Web links for HTML output

- About Web links for PDF output

- About hyperlinks

- About hyperlink destinations

- About bookmarks

- About application command line links

- About before and after escapes

- About style sheets

See also

Section 1.2.2, "About Web reports"

### 2.2.1 About JavaServer Pages (JSPs) and servlets

JavaServer Pages (JSPs) technology is an extension to the Java servlet technology from Sun Microsystems that provides a simple programming vehicle for displaying dynamic content on a Web page. A JSP is an HTML page with embedded Java source code that is executed in the Web server or application server. The HTML provides the page layout that is returned to the Web browser, and Java provides the business logic.

JSPs keep static page presentation and dynamic content generation separate. Because JSPs cleanly separate dynamic application logic from static HTML content, Web page designers who have limited or no Java programming expertise can modify the appearance of the JSP page without affecting the generation of its content, simply using HTML or XML tags to design and format the dynamically-generated Web page. JSP-specific tags or Java-based scriptlets can be utilized to call other components that generate the dynamic content on the page.

JSPs have the `.jsp` extension. This extension notifies the Web server that the page should be processed by a JSP container. The JSP container interprets the JSP tags and scriptlets, compiles the JSP into a Java servlet and executes it, which generates the content required, and sends the results back to the browser as an HTML or XML page.

A JSP can be accessed and run from a browser-based client, typically over the Internet or a corporate intranet. Unlike traditional client-server applications, JSP applications:

- run on a wider variety of client machines and browsers.

- run on thinner clients, thereby consuming fewer client-machine resources.

- scale to a larger number of simultaneous users.

- require less effort to install and maintain.

When a JSP is called for the first time, it is compiled into a Java servlet class and stored in the Web server's memory. Because it is stored in memory, subsequent calls to that page are very fast, thereby avoiding the performance limitations seen with traditional Common Gateway Interface (CGI) programs, which spawn a new process for each HTTP request.

For additional background information about JSP technology, see the Sun Microsystems Java and J2EE Web site at `http://java.sun.com`.

#### 2.2.1.1 Using JSPs in Oracle Reports

Oracle Reports supports JavaServer Pages (JSPs) as the underlying technology to enable you to enhance Web pages with information retrieved using Reports Builder.

In Oracle Reports, you use JSPs to embed data retrieved using the data model into an existing Web page to create a JSP-based Web report. You can create new JSP reports, or save existing reports as JSP reports. New reports are by default saved as JSP reports. The benefit of saving reports as JSPs is that JSPs are text files that are easy to edit as opposed to, for example, the binary `.rdf` format. When a report is saved as a JSP file, the data model is embedded using XML tags. The entire report can now be defined using XML tags and saved as an XML file.

Using the Oracle Reports custom JSP tags, you can easily add report blocks and graphs to existing JSP files. These tags can be used as templates to enable you to build and insert your own data-driven Java component into a JSP-based Web report. Not only can you edit the HTML or XML code that encapsulates the report block, but you can also edit the report block in the JSP itself, by modifying, adding or deleting their bodies and attributes.

The Report Editor's Web Source view displays the source code for your Web report, including HTML, XML, and JSP tags.

By default, a new JSP created in Reports Builder contains the following:`<%@ page contentType="text/html;charset=ISO-8859-1" %>`If you are creating your JSP outside Reports Builder, you should ensure that it contains similar encoding information.

In prior releases, Oracle Reports introduced Web links that you can add to paper-based reports, which become active when you display your paper report in a Web browser or PDF viewer. For JSP reports, hyperlinks have to be created manually, and if the hyperlinks need to substitute data values, the data values must be provided through the `rw:field` JSP tag. For example:

    <a href="http://server/path/rwservlet?report=department.jsp&p_deptno=<rw:field   id="F_Deptno" src="Deptno"/>">
    <rw:field id="F_Deptno" src="Deptno">10</rw:field>
    </a>

#### 2.2.1.2 Opening or running an encoded JSP-based Web report

If your JSP-based Web report's character encoding (for example, EUC-JP) differs from the character set portion of the NLS_LANG environment variable (for example, JA16SJIS), you will get the following errors:

- When running the JSP file: `REP-6106` or `REP-6104` with `javax.servlet.jsp.JspException (multibyte)``REP-0495 Unable to tokenize the query (singlebyte)`

- When opening the JSP file using Reports Builder: `REP-0069 Internal Error or REP-6106`

To work around this issue, you must ensure that your JSP-based Web report's character encoding matches the IANA encoding corresponding to Reports Builder's character set portion of the `NLS_LANG` environment variable.

For example:

- JSP-based Web report encoding:

  `<%@ page contentType="text/html;charset=EUC-JP" %><META http-equiv="Content-Type" content="text/html;charset=EUC-JP">`

  This JSP file needs to be encoded in the character set (`EUC-JP`).

- Reports Builder encoding:

  `NLS_LANG=JAPANESE_JAPAN.JA16EUC`

  In this example, the JSP-based Web report's encoding (`EUC-JP`) matches Reports Builder's character set portion of `NLS_LANG`; that is, `JA16EUC`.

#### 2.2.1.3 Embedding a character set in a JSP file dynamically

In Oracle Reports, Web report templates are configured for Western European character encoding by default. However, for other languages, you can specify the character encoding for every JSP file by using both the `charset` attribute of the `<Meta>` tag and the `<%@page%>` page directive.

To dynamically associate the appropriate character encoding with the JSP file, you can make the following modifications:

1. Edit the `rw*.html` files and the `blank_template.jsp` file, as follows:

   - Modify the page directive to read: `<%@ page contentType="text/html;charset=``yourIANAencoding``" %>`

     where:

     `yourIANAencoding` is the IANA encoding name that corresponds to the `NLS_CHARACTERSET` portion of the `NLS_LANG` variable.

   - Modify the `<Meta>` tag inside the `<Head>` tag to read:

     `<meta http-equiv="Content-Type" content="text/html;charset=``yourIANAencoding``" />`

2. Edit the `template.xsl` (`ORACLE_HOME``/reports/templates/`) file, as follows:

   - Modify the `<xsl:output>` tag to read:

     `<xsl:output method="jsp" indent="yes" encoding="``yourIANAencoding``" />`

     where:

     `yourIANAencoding` is the IANA encoding name that corresponds to the `NLS_CHARACTERSET` portion of the `NLS_LANG` variable.

   - Add the page directive to the file:

     `<%@ page contentType="text/html;charset=yourIANAencoding" %>`

   - Add or modify the `<META>` tag inside the `` tag:

     `<meta http-equiv="Content-Type" content="text/html;charset=yourIANAencoding" />`

     where:

     `yourIANAencoding` is the IANA encoding name that corresponds to the `NLS_CHARACTERSET` portion of the `NLS_LANG` variable.

See also

Topics "Oracle Reports JSP tags" and "Oracle Reports XML tags" in the Reference section of the Oracle Reports online Help

### 2.2.2 About previewing JSP-based Web reports

You can preview a JSP-based Web report by clicking the Run Web Layout button in the toolbar, or by choosing Program > Run Web Layout, to run the Web Source. Reports Builder displays Web reports in your default browser.

Notes: If Netscape 7.0 is your default browser, and the browser does not display, set the registry key `HKEY_CURRENT_USERS\Software\Oracle\Toolkit\Tkbrowser` to the default browser location. Ensure that the `BrowserName` and the `BrowserPath` keys reflect the correct values. For example: `BrowserName=Netscape 7`; `BrowserPath=C:\Program Files\Netscape\Netscape\Netscp.exe`. If Run Web Layout fails with an error related to the `major.minor` version, you will need to update the environment variables `CLASSPATH` or `REPORTS_CLASSPATH`, as follows: remove the 9.0.x `ORACLE_HOME` specification in the `oc4j.jar` file path (the `oc4j.jar` file path should specify only the 10g Release 2 (10.1.2) `ORACLE_HOME`).

You do not need to have the Reports Server configured to use this functionality. Reports Builder includes an embedded Oracle Container for Java (OC4J) server. Each instance of Reports Builder has its own OC4J server listening on a unique port, so you can have multiple Reports Builder sessions running at the same time. If a port is not specified, Reports Builder automatically looks for a free port in the default range. If you are using the OC4J option to preview a JSP report locally and your JSP depends on external files, such as images, or if you want to check the generated Java files, it is important to understand how Reports Builder handles the temporary files.

A JSP gets converted into a `.java` file and compiled into a class file. When the class file is executed, it will return HTML in a `.html` file. This file and the `.java` and `.class` files are all located in the `$REPORTS_TMP/docroot` directory. `$REPORTS_TMP` can be passed in as a command line parameter to Reports Builder, thus allowing you to override the default location for the docroot directory. The contents of the `docroot` directory are cleaned up when you exit Reports Builder.

Document Root

By default, the Reports Builder document root is the `docroot` directory under the directory specified by the `$REPORTS_TMP` environment variable (for example, `c:/temp/docroot`). The end user can override this default `docroot` from the command line (using the `WEBSERVER_DOCROOT` command line keyword). If your JSP depends on external files, such as images, style sheets, and so on, make sure you copy them into the `docroot` directory. Better yet, you can specify the `WEBSERVER_DOCROOT` command line value to be your document root directory.

Document Root Structure

A JSP gets translated into a `.java` file and compiled into a `.class` file. When the `.class` file is executed, it will return HTML in a `.html` file. This file and the `.java` and `.class` files are all located in the $`REPORTS_TMP/docroot` directory. $`REPORTS_TMP` can be passed in as a command line parameter to Reports Builder, thus allowing you to override the default location for the `docroot` directory. The contents of the `docroot` directory are cleaned up when you exit the Reports Builder.

The `docroot` directory structure looks as follows after running `emp.jsp` (note that we use the default `docroot`, which is `$REPORTS_TMP/docroot`):

    temp
      docroot
        3000                        working directory for instance of the Builder
          default
            defaultWebApp            temporary JSP working directory
              temp
                _pages
                _empxxx.class       compiled Java class
                _empxxx.java         translated Java file
          log                        OC4J log directory
            global-application.log
            server.log
            orion-conf               OC4J configuration files directory
          stderr.log                 debug log when WEBSERVER_LOG=yes
          stdout.log
        3002                         another instance's working directory
        css                          template style sheets
        images                       template images
        WEB-INF
          lib
          reports_tld.jar
        web.xml
        rwerror.jsp                  template error JSP
        empxxx.jsp                   working copy of emp.jsp
        empxxx.html                  resulting output

Usage notes

- The large numbers in generated filenames are simply unique IDs, and have no particular meaning (for example, `emp012345678.jsp`).

- The temporary files created in the docroot directory get cleaned up when you exit Reports Builder.

See also

Section 3.7.16.4, "Displaying report output in your Web browser"

Section 3.7.17.3, "Printing a report from your Web browser"

### 2.2.3 About Web links for HTML output

This topic discusses the Web links that you can add to paper-based reports that will become active when you generate your report to an HTML file and display it in a Web browser.

In most cases, you can define Web links in an object's Property Inspector. You can specify column and field names in the link value to create dynamic links at runtime. If you require more complex implementation of Web links, such as conditional settings, you must specify the link using PL/SQL and the Reports Builder built-in packaged procedure SRW.SET_ATTR.

Reports output in HTML format can include the following types of Web links:

- A link from an object to another object within the same report, or to another HTML or PDF document (see Section 2.2.5, "About hyperlinks").

- An identifier for the destination of a Web link (see Section 2.2.7, "About hyperlink destinations"). The destination can be any printable object (field, boilerplate, frame, and so on) in your report layout.

- A string in a frame of the master HTML document that links to an associated object (see Section 2.2.8, "About bookmarks"). You can associate a bookmark with any printable object (field, boilerplate, frame, and so on) in your report layout. In the formatted report, you can click a bookmark to display the associated object at the top of the window.

- URLs that specify image resources. The URLs must be available to your Web server so that the images can be located when the HTML output is displayed by the server.

- A graph hyperlink to link areas of a graph to specified destinations.

Additionally, your report can include the following headers and footers that use escapes to add HTML tags to your paper-based report:

- a document header (a before report escape) for placing a logo or some standard links at the beginning of an HTML document (see Section 2.2.10, "About before and after escapes").

- a document footer (an after report escape) for placing a logo or some standard links at the end of an HTML document.

- a page header (a before page escape) for placing a logo or some standard links at the beginning of one page or all pages in an HTML document.

- a page footer (an after page escape) for placing a logo or some standard links at the end of one page or all pages in an HTML document.

- a Parameter Form header (a before form escape) for placing a logo or some standard links in the header of the HTML Parameter Form.

- a Parameter Form footer (an after form escape) for placing a logo or some standard links in the footer of the HTML Parameter Form.

### 2.2.4 About Web links for PDF output

This topic discusses the Web links that you can add to paper-based reports that will become active when you run your report to a PDF file and display it in a PDF viewer.

Reports output in PDF format can include the following types of Web links:

- A link from an object to another object within the same report, or to another HTML or PDF document (see Section 2.2.5, "About hyperlinks").

- An identifier for the destination of a Web link (see Section 2.2.7, "About hyperlink destinations"). The destination can be any printable object (field, boilerplate, frame, and so on) in your report layout.

- A string in the bookmark area of the PDF viewer that links to an associated object (see Section 2.2.8, "About bookmarks"). You can associate a bookmark with any printable object (field, boilerplate, frame, and so on) in your report layout. In the formatted report, you can click a bookmark to display the associated object at the top of the window.

- A link that executes a command when clicked (see Section 2.2.9, "About application command line links"). You can associate a command with any printable object (field, boilerplate, frame, and so on) in your report layout. In the formatted report, you can click the object to execute the associated command.

- A graph hyperlink to link areas of a graph to specified destinations.

In most cases, you can define Web links in an object's Property Inspector. You can specify column and field names in the link value to create dynamic links at runtime. If you require more complex implementation of Web links, such as conditional settings, you must specify the link using PL/SQL.

### 2.2.5 About hyperlinks

A hyperlink is an attribute of an object that specifies a hypertext link to either of the following destinations:

- an object identified with a hyperlink destination within the same report

- another HTML or PDF document on the same machine or on a remote Web server

You can set the Additional Hyperlink Attributes property to specify additional HTML to be applied to the hyperlink.

See also

Section 3.6.10.1.8, "Creating a hyperlink using the Property Inspector"

Section 3.6.10.2.7, "Creating a hyperlink using PL/SQL"

### 2.2.6 About graph hyperlinks

A graph hyperlink provides an active link from an area of a graph to a specified destination in a Web report. When end users display the report on the Web (JSP-based, or paper-based PDF or HTML), they can click one or more areas of the graph to drill down to additional linked information.

See also

Section 3.6.8, "Adding a graph hyperlink"

### 2.2.7 About hyperlink destinations

A hyperlink destination is an attribute of an object that identifies the destination of a hypertext link.

See also

Section 3.6.10.1.7, "Creating a hyperlink destination using the Property Inspector"

Section 3.6.10.2.8, "Creating a hyperlink destination using PL/SQL"

### 2.2.8 About bookmarks

A bookmark is an attribute of an object that specifies a string that is a link to the object.

See also

Section 3.6.10.1.10, "Creating a bookmark using the Property Inspector"

Section 3.6.10.2.10, "Creating a bookmark using PL/SQL"

Section 3.6.10.1.11, "Creating a bookmark on break columns using the Property Inspector"

### 2.2.9 About application command line links

(PDF output only) An application command line link is an attribute of an object that specifies a command line to be executed when the object is clicked.

Restrictions

An object that is associated with a application command line link cannot also be the source of a Web link (a hyperlink).

See also

Section 3.6.10.1.9, "Creating an application command line link using the Property Inspector"

Section 3.6.10.2.9, "Creating an application command line link using PL/SQL"

### 2.2.10 About before and after escapes

- A before report escape specifies any text, graphics, or HTML commands that you want to appear at the beginning of your document.

- An after report escape specifies any text, graphics, or HTML commands that you want to appear at the end of your document.

- A before page escape specifies any text, graphics, or HTML commands that you want to appear at the beginning of one page or all pages of your document.

- An after page escape specifies any text, graphics, or HTML commands that you want to appear at the end of one page or all pages of your document.

- A before form escape specifies any text, graphics, or HTML commands that you want to appear at the top of the HTML Parameter Form.

- An after form escape specifies any text, graphics, or HTML commands that you want to appear at the bottom of the HTML Parameter Form.

Limitations

In an after report escape (see Section 2.2.10, "About before and after escapes"), adding an HTML command outside the body does not reflect when the report is generated to spreadsheet output, even though the HTML command is written in output properly. For example: `</body><table><tr><td><B> the text to be bolded </B></td><tr></table> </html>` Adding the HTML command before the closing body tag reflect correctly when the report is generated to soreadsheet output. For example: `<table><tr><td><B> the text to be bolded </B></td><tr></table></body></html>`

For more information about spreadsheet output, see Section 2.8.13, "About spreadsheet output".

See also

Section 3.6.10.1.1, "Creating an HTML document header using the Property Inspector"

Section 3.6.10.2.1, "Creating an HTML document header using PL/SQL"

Section 3.6.10.1.2, "Creating an HTML document footer using the Property Inspector"

Section 3.6.10.2.2, "Creating an HTML document footer using PL/SQL"

Section 3.6.10.1.3, "Creating an HTML page header using the Property Inspector"

Section 3.6.10.2.3, "Creating an HTML page header using PL/SQL"

Section 3.6.10.1.4, "Creating an HTML page footer using the Property Inspector"

Section 3.6.10.2.4, "Creating an HTML page footer using PL/SQL"

Section 3.6.10.1.5, "Creating an HTML Parameter Form header using the Property Inspector"

Section 3.6.10.2.5, "Creating an HTML Parameter Form header using PL/SQL"

Section 3.6.10.1.6, "Creating an HTML Parameter Form footer using the Property Inspector"

Section 3.6.10.2.6, "Creating an HTML Parameter Form footer using PL/SQL"

### 2.2.11 About style sheets

Style sheets (or cascading style sheets) refer to HTML extensions that provide powerful formatting flexibility. With style sheet support, your HTML documents can include any of the following:

- any font size or style

- overlapping objects

- horizontal and vertical lines and rectangles of any color or width

- precise object positioning on a page

- pagination

- printing from a Web browser

- inline image maps

This means that the sophisticated formatting in a report is preserved when you format the report as an HTMLCSS document. Without style sheet extensions, your HTML documents display only basic text formats and imported images. With style sheets, images of highly formatted text can be replaced with text objects of equivalent style, color, and font. Text objects can be positioned to overlay image objects. All text is fully searchable, and fewer images have to be downloaded.

To view an HTML document that takes advantage of style sheets, you must display it in a browser that supports style sheets.

Using external style sheets for HTMLCSS output

Every corporate Web site today uses style sheets to enforce the corporate look-and-feel across Web pages. External style sheets are Cascading Style Sheet (CSS) files that are referenced by these Web pages. End users typically want the same style used in pages on their Web site applied to their Web reports.

In prior releases, applying style sheets and user-defined styles to reports involved manually editing the HTMLCSS output.

Beginning with Oracle Reports 10g Release 2 (10.1.2), you can specify user-defined styles and style sheets for HTMLCSS output using Reports Builder. Styles can be applied to report, field, text, frame, and repeating frame objects using the new properties Style Sheets, CSS Class Name, and CSS ID properties (see the Oracle Reports online Help for descriptions of these properties). The generated HTMLCSS output includes links to the style sheets and the user-defined styles are applied to the objects.

Restrictions

The following elements are not supported by HTML style sheet extensions:

- ellipses, arcs, polygons/polylines, and diagonal lines

- rounded rectangles (formatted as rectangles)

- arrows on lines

- dashes on lines or borders of objects

See also

Section 3.7.16.4, "Displaying report output in your Web browser"

Section 3.7.17.3, "Printing a report from your Web browser"

## 2.3 Data Model Objects

The topics in this section build on the basic concepts discussed in Section 1.7, "Data Model Objects".

- About summary columns

- About formula columns

- About placeholder columns

- About referencing columns and parameters

- About non-linkable queries

- About links versus groups

- About matrix objects

### 2.3.1 About summary columns

A summary column performs a computation on another column's data. Using the Report Wizard or Data Wizard, you can create the following summaries: sum, average, count, minimum, maximum,% total. You can also create a summary column manually in the Data Model view, and use the Property Inspector to create the following additional summaries: first, last, standard deviation, variance.

If your report requires a customized computation, for example, one that computes sales tax, create a formula column (see Section 3.8.10, "Creating or editing a formula column").

Note: For group reports, the Report Wizard and Data Wizard create n summary fields in the data model for each summary column you define: one at each group level above the column being summarized, and one at the report level. For example, if a report is grouped by division, and further grouped by department, then a summary column defined for a salary total would create fields for the sum of salaries for each division and each department group (group-level summaries), and the sum of all salaries (report-level summary).

See also

Section 3.8.11, "Creating a summary column"

### 2.3.2 About formula columns

A formula column performs a user-defined computation on the data of one or more column(s), including placeholder columns. For example, :ITEMTOT *.07 is a formula that performs a computation on one column, while :SAL + :COMM performs a computation using two columns in a record. You create formulas in PL/SQL using the PL/SQL Editor.

Note: Formula columns should not be used to set values for parameters.

See also

Section 3.8.10, "Creating or editing a formula column"

Section 2.6.8, "About formulas"

### 2.3.3 About placeholder columns

A placeholder is a column for which you set the datatype and value in PL/SQL that you define. Placeholder columns are useful when you want to selectively set the value of a column (for example, each time the nth record is fetched, or each time a record containing a specific value is fetched, and so on). You can set the value of a placeholder column in the following places:

- the Before Report trigger, if the placeholder is a report-level column

- a report-level formula column, if the placeholder is a report-level column

- a formula in the placeholder's group or a group below it (the value is set once for each record of the group)

See also

Section 3.8.12, "Creating or editing a placeholder column"

Section 2.6.8, "About formulas"

### 2.3.4 About referencing columns and parameters

You can reference user parameters, system parameters and columns as either bind references or lexical references.

#### 2.3.4.1 About bind references

Bind references (or bind variables) are used to replace a single value in SQL or PL/SQL, such as a character string, number, or date. Specifically, bind references may be used to replace expressions in `SELECT`, `WHERE`, `GROUP BY`, `ORDER BY`, `HAVING`, `CONNECT BY`, and `START WITH` clauses of queries. Bind references may not be referenced in `FROM` clauses or in place of reserved words or clauses.

You create a bind reference by typing a colon (:) followed immediately by the column or parameter name. If you do not create a column or parameter before making a bind reference to it in a `SELECT` statement, Reports Builder will create a parameter for you by default.

Restrictions

Bind references must not be the same name as any reserved SQL keywords. For more information, see the Oracle Server SQL Language Reference manual.

Examples

Example 1: SELECT clause

In the following example, the value of `DFLTCOMM` replaces null values of `COMMPLAN` in the rows selected.

    SELECT CUSTID, NVL(COMMPLAN, :DFLTCOMM) COMMPLAN

      FROM ORD;

Example 2: WHERE clause

The value of `CUST` is used to select a single customer.

    SELECT ORDID, TOTAL

      FROM ORD
      WHERE CUSTID = :CUST;

Example 3: GROUP BY clause

All non-aggregate expressions such as `NVL(COMMPLAN, :DFLTCOMM)` in the `SELECT` clause must be replicated in the `GROUP BY` clause.

    SELECT NVL(COMMPLAN, :DFLTCOMM) COMMPLAN, SUM(TOTAL) TOTAL

      FROM ORD
      GROUP BY NVL(COMMPLAN, :DFLTCOMM);

Example 4: HAVING clause

The value of `MINTOTAL` is used to select customers with a minimum total of orders.

    SELECT CUSTID, SUM(TOTAL) TOTAL

      FROM ORD
      GROUP BY CUSTID HAVING SUM(TOTAL) > :MINTOTAL;

Example 5: ORDER BY clause

The value of `SORT` is used to select either `SHIPDATE` or `ORDERDATE` as the sort criterion. Note that this is not the same as `ORDER BY 1` because `:SORT` is used as a value rather than to identify the position of an expression in the `SELECT` list. Note that `DECODE` is required in this example. You cannot use a bind variable in an `ORDER BY` clause unless it is with `DECODE`.

    SELECT ORDID, SHIPDATE, ORDERDATE, TOTAL

      FROM ORD
      ORDER BY DECODE(:SORT, 1, SHIPDATE, 2, ORDERDATE);

Example 6: CONNECT BY and START WITH clauses

References in `CONNECT BY` and `START WITH` clauses are used in the same way as they are in the `WHERE` and `HAVING` clauses.

Example 7: PL/SQL

    procedure double is begin; :my_param := :my_param*2; end;

The value of `myparam` is multiplied by two and assigned to `myparam`.

#### 2.3.4.2 About lexical references

Lexical references are placeholders for columns or parameters that you embed in a `SELECT` statement. You can use lexical references to replace the clauses appearing after `SELECT`, `FROM`, `WHERE`, `GROUP BY`, `ORDER BY`, `HAVING`, `CONNECT BY`, and `START WITH`. Use a lexical reference when you want the parameter to substitute multiple values at runtime.

You cannot make lexical references in a PL/SQL statement. You can, however, use a bind reference in PL/SQL to set the value of a parameter that is then referenced lexically in SQL, as shown in the example below.

You create a lexical reference by typing an ampersand (`&`) followed immediately by the column or parameter name. A default definition is not provided for lexical references. Therefore, you must do the following:

- Before you create your query, define a column or parameter in the data model for each lexical reference in the query. For columns, you must set the Value if Null property, and, for parameters, you must set the Initial Value property. Reports Builder uses these values to validate a query with a lexical reference.

- Create your query containing lexical references.

Restrictions

- You cannot make lexical references in a PL/SQL statement.

- If a column or parameter is used as a lexical reference in a query, its Datatype must be Character.

- If you want to use lexical references in your `SELECT` clause, you should create a separate lexical reference for each column you will substitute. In addition, you should assign an alias to each lexical reference. This enables you to use the same layout field and boilerplate label for whatever value you enter for the lexical reference on the Runtime Parameter Form.

- If you use lexical references in your `SELECT` clause, you must specify the same number of items at runtime as were specified in the report's data model. Each value you specify for your lexical references at runtime must have the same datatype as its Initial Value.

- If you use lexical references in your `SELECT` clause, the width of the column is derived from the Initial Value property of the parameter. Consequently, you should ensure that the Initial Value of the parameter corresponds to the widest column that you intend to use.

- A Reports Builder link should not depend upon a lexical reference. That is, neither the child column of a link or its table name should be determined by a lexical reference. To achieve this functionality, you need to create a link with no columns specified and then enter the SQL clause (for example, `WHERE`) for the link directly in the query. For example, your parent and child queries might be written as follows:

  Parent Query:

      SELECT DEPTNO FROM EMP

  Child Query:

      SELECT &PARM_1 COL_1, &PARM2 COL_2
        FROM EMP
        WHERE &PARM_1 = :DEPTNO

  Note how the `WHERE` clause makes a bind reference to `DEPTNO`, which was selected in the parent query. Also, this example assumes that you have created a link between the queries in the Data Model view with no columns specified.

- A lexical reference cannot be used to create additional bind variables after the After Form trigger fires. For example, suppose you have a query like the following (note that the `WHERE` clause is replaced by a lexical reference):

      SELECT ENAME, SAL FROM EMP
      &where_clause

  If the value of the `where_clause` parameter contains a reference to a bind variable, you must specify the value in the After Form trigger or earlier. You would get an error if you supplied the following value for the parameter in the Before Report trigger:

      WHERE SAL = :new_bind

  If you supplied this same value in the After Form trigger, the report would run.

Examples

Example 1: SELECT clause

    SELECT &P_ENAME NAME, &P_EMPNO ENO, &P_JOB ROLE

      FROM EMP;

`P_ENAME`, `P_EMPNO`, and `P_JOB` can be used to change the columns selected at runtime. For example, you could enter `DEPTNO` as the value for `P_EMPNO` on the Runtime Parameter Form. Note that in this case, you should use aliases for your columns. Otherwise, if you change the columns selected at runtime, the column names in the `SELECT` list will not match the Reports Builder columns and the report will not run.

Example 2: FROM clause

    SELECT ORDID, TOTAL

      FROM &ATABLE;

`ATABLE` can be used to change the table from which columns are selected at runtime. For example, you could enter `ORD` for `ATABLE` at runtime. If you dynamically change the table name in this way, you may also want to use lexical references for the `SELECT` clause (look at the previous example) in case the column names differ between tables.

Example 3: WHERE clause

    SELECT ORDID, TOTAL

      FROM ORD
      WHERE &CUST;

`CUST` can be used to restrict records retrieved from `ORD`. Any form of the `WHERE` clause can be specified at runtime.

Example 4: GROUP BY clause

    SELECT NVL(COMMPLAN, DFLTCOMM) CPLAN, SUM(TOTAL) TOTAL

      FROM ORD
      GROUP BY &NEWCOMM;

The value of `NEWCOMM` can be used to define the `GROUP BY` clause.

Example 5: HAVING clause

    SELECT CUSTID, SUM(TOTAL) TOTAL

      FROM ORD
      GROUP BY CUSTID HAVING &MINTOTAL;

The value of `MINTOTAL` could, for example, be used to select customers with a minimum total of orders.

Example 6: ORDER BY clause

    SELECT ORDID, SHIPDATE, ORDERDATE, TOTAL

      FROM ORD
      ORDER BY &SORT;

The value of `SORT` can be used to select `SHIPDATE`, `ORDERDATE`, `ORDID`, or any combination as the sort criterion. It could also be used to add on to the query, for example to add a `CONNECT BY` and `START WITH` clause.

Example 7: CONNECT BY and START WITH clauses

Parameters in `CONNECT BY` and `START WITH` clauses are used in the same way as they are in the `WHERE` and `HAVING` clauses.

Example 8: Multiple clauses

    SELECT &COLSTABLE;

`COLSTABLE` could be used to change both the `SELECT` and `FROM` clauses at runtime. For example, you could enter `DNAME ENAME, LOC SAL FROM DEPT` for `COLSTABLE` at runtime.

    SELECT * FROM EMP &WHEREORD;

`WHEREORD` could be used to change both the `WHERE` and `ORDER BY` clauses at runtime. For example, you could enter `WHERE SAL > 1000 ORDER BY DEPTNO` for `&WHEREORD` at runtime.

Example 9: PL/SQL and SQL

    SELECT &BREAK_COL C1, MAX(SAL)

      FROM EMP
      GROUP BY &BREAK_COL;

`BREAK_COL` is used to change both the `SELECT` list and the `GROUP BY` clause at runtime. The Initial Value of the parameter `&BREAK_COL` is `JOB`. At runtime, the user of the report can provide a value for a parameter called `GROUP_BY_COLUMN` (of data type Character).

In the Validation Trigger for `GROUP_BY_COLUMN`, you call the following PL/SQL procedure and pass it the value of `GROUP_BY_COLUMN`:

    procedure conv_param (in_var IN char) is
    begin

      if upper(in_var) in ('DEPTNO','EMPNO','HIREDATE') then

        :break_col := 'to_char('||in_var||')' ;

      else

        :break_col := in_var;

      end if;

    end;

This PL/SQL ensures that, if necessary, a `TO_CHAR` is placed around the break column the user chooses. Notice how in SQL, you make a lexical reference to `BREAK_COL`. In PL/SQL, you must make a bind reference to `BREAK_COL` because lexical references are not allowed in PL/SQL.

#### 2.3.4.3 Differences between bind and lexical references

Bind references are used to replace a single value in SQL or PL/SQL. Specifically, bind references may be used to replace expressions in `SELECT`, `WHERE`, `GROUP BY`, `ORDER BY`, `HAVING`, `CONNECT BY`, and `START WITH` clauses of queries. Bind references may not be referenced in the `FROM` clause. An example is:

    SELECT ORDID,TOTAL

      FROM ORD
      WHERE CUSTID = :CUST

Lexical references are placeholders for text that you embed in a `SELECT` statement, when you want the parameter to substitute multiple values at runtime. You can use lexical references to replace the clauses appearing after `SELECT`, `FROM`, `WHERE`, `GROUP BY`, `ORDER BY`, `HAVING`, `CONNECT BY`, and `START WITH`. You cannot make lexical references in PL/SQL. Before you reference a lexical parameter for a column or table, you must have predefined the parameter and given it an initial value. An example is:

    SELECT ORDID, TOTAL

      FROM &ATABLE

### 2.3.5 About non-linkable queries

A non-linkable query is a detail query that contains column objects that prevent the query from being linked to through a column-to-column link (when you create a column-to-column link, Reports Builder adds a `WHERE` clause to your query). If you attempt to create such a link, a message dialog box displays, which prompts you to choose whether to create a group-to-group query (using the parent groups), or to cancel the operation. A non-linkable query displays the non-linkable query icon in its title bar.

Instead, you can create a group-to-group link (when you create a group-to-group link, Reports Builder does not add a `WHERE` clause to your query) between the two queries and add a `WHERE` clause to the child query's `SELECT` statement, using a bind variable to reference the parent column. See Section 3.8.9, "Creating a data link".

For example, suppose you want to create a column-to-column link between the `ADDRESS.STREET` column in your child query and the `LOC1` column in your parent query. You can create a group-to-group link, and then modify the child query SQL statement to say:

    SELECT * FROM EMP E WHERE E.ADDRESS.STREET = :LOC1

See also

Section 1.7.4, "About data links"

Section 1.7.1, "About queries"

Section 2.3.4.1, "About bind references"

### 2.3.6 About links versus groups

In Reports Builder, data is defined independent of format (layout). Therefore, you should be aware of when to use data links instead of groups.

The layouts of a master/detail report that uses two queries and a data link, and a group report that uses one query and two groups can be identical. Following is an example of a default master/detail report and a group report that query the same data. Notice the difference between the two reports: unlike the group report, the master/detail report displays department 40. This is because the data link in the master/detail report causes an outer-join: the link automatically fetches unrelated data. If you are designing a group report that requires an outer-join, explicitly add it to your `SELECT` statement with (+).

Figure 2-3 Default master/detail and group report that query same data

Description of "Figure 2-3 Default master/detail and group report that query same data"

A master/detail/detail report, as shown in the figure below, is a report that contains three groups of data: for each master group, two unrelated detail groups are displayed. To produce a master/detail/detail report or any variation of it, you must use data links. If you try to produce this report with a control break using a single query and three groups the query will establish a relationship between the two detail groups.

Figure 2-4 Master/detail/detail report

Description of "Figure 2-4 Master/detail/detail report"

See also

Section 1.7.2, "About groups"

Section 1.7.4, "About data links"

### 2.3.7 About matrix objects

A matrix object merely defines a relationship between two repeating frames: it isn't really owned by any object, nor does it own any object. A matrix object is created only for layouts with a Matrix layout style. A report may have multiple matrices within it, provided that the data model contains the necessary groups. Reports Builder creates one matrix object for each pair of intersecting, perpendicular repeating frames.

The repeating frames are the dimensions of the matrix and the matrix object contains the field that will hold the "filler" or values of the cell group. One of the repeating frames must have the Print Direction property set to Down and the other must have the Print Direction property set to Across in order to form a matrix.

Note: When running a JSP-based Web report that includes a matrix object, the JSP `<rw:include>` tag expects the matrix object to format on only one page. However, if the cells in the across repeating frame expand, the column headers of the matrix may be forced onto a second page regardless of the page size. Therefore, these matrix headers will not appear in the report output. Additionally, in this situation, the paper layout does not display correctly as header fields move to subsequent pages where the cell values remain on the first page. To resolve this, it is important to carefully define in the Report Editor the space available to the across repeating frame to allow for displaying the largest values, then set the Vertical Elasticity property of the across repeating frame to Fixed.

Restrictions

- The down repeating frames must be below the across repeating frames in a matrix.

- A matrix object must always be on top of the repeating frames that form it (that is, it must be one or more layers above its horizontal and vertical repeating frames). Reports Builder prevents you from moving the matrix below its horizontal and vertical repeating frames.

- Moving a matrix also causes its two repeating frames to move.

- A matrix object cannot be anchored to another object and other objects cannot be anchored to it (that is, a matrix object cannot be the parent or child object for an anchor).

- To copy a matrix, you must select the matrix and its two repeating frames. If you select the matrix object by itself, nothing will be copied to the paste buffer. If you select the matrix and one of the repeating frames, only the repeating frame is placed in the paste buffer.

- A matrix object can only be resized by resizing its associated repeating frames.

- You cannot use Alignment or Size Objects from the Layout menu on matrix objects.

- The source groups of the repeating frames that make up the dimensions of a matrix must be from the same cross-product group.

- Repeating frames whose source groups are in the same "family" hierarchy (that is, are descendants or ancestors of each other) must have the same Print Direction. Parent-child relationships within a cross-product group are used to create nesting in the matrix. As a result, the repeating frames associated with such groups must print in the same direction on the page.

- You can put a border on a matrix object just as you would any other object, but the width will always be the minimum width possible. You cannot widen the border due to the closeness of the objects in a matrix layout.

Example

Suppose that you have a group named Group1 that contains a column called C_DEPTNO, which gets its values from the database column DEPTNO. A group called Group2, contains column C_JOB, which gets its values from the database column JOB, and column C_DEPTNO1, which is used for linking to Group1's query. A group called Group3 contains a column called SUMSAL, which is a summary of the database column SAL.

                        Job
              Analyst  Clerk  Manager

          10           $1300   $2450
    Dept  20    $6000  $1900   $2975
          30           $ 950   $2850

In this example:

- The Vertical Repeating Frame is the repeating frame that contains Group2 (the job titles).

- The Horizontal Repeating Frame is the repeating frame that contains Group1 (the department numbers).

- The Cross Product Group is Group4 (the group that is the parent of Group1 and Group2).

If you need to build a more complex matrix, you can do so by adding more columns to Group1 and Group2. For example, instead of having Group1 just contain department numbers, it could also contain the locations (LOC) of the departments. The matrix might then look something like this:

                                  Job
     Loc        Dept    Analyst  Clerk  Manager

     New York    10              $1300   $2450
     Dallas      20      $6000   $1900   $2975
     Chicago     30              $ 950   $2850

See also

Section 1.3.7, "About matrix reports"

Section 2.1.7, "About nested matrix reports"

Section 2.1.8, "About matrix with group reports"

Section 3.9.1.3, "Creating a matrix object"

Section 3.8.8, "Creating a matrix (cross-product) group"

Section 3.5.3, "Creating a nested matrix report"

## 2.4 Layout Objects

The topics in this section build on the basic concepts discussed in Section 1.8, "Layout Objects".

- About layout objects

- About layout defaulting

- About images

- About anchors

- About changing colors and patterns

- About resizing objects

- About moving and layering objects in the Paper Layout view

### 2.4.1 About layout objects

Several important concepts and properties apply to layout objects:

- the frequency with which you want the object to appear in the report, specified by the Print Object On property

- how Reports Builder fetches and formats data for instances of repeating frames, specified by the Column Mode property

- whether to keep an object and the object to which it is anchored on the same logical page, specified by the Keep With Anchoring Object property

- whether to try to keep the entire object and its contents on the same logical page, specified by the Page Protect property

- format triggers, which are PL/SQL functions executed before an object is formatted that can dynamically change the formatting attributes of objects

- report layout, generated by defaulting applied by Reports Builder, modified in the Paper Layout view, or created from scratch.

See also

Section 3.5.4, "Creating a default layout for a report"

Section 3.10.2, "Creating a default layout for a section"

Section 2.6.13.2, "About format triggers"

The Properties section of the Oracle Reports online Help

### 2.4.2 About layout defaulting

When you select one of the default layout styles in the Report Wizard, Reports Builder creates the necessary layout objects, based upon the report's data model. For example, if you want to build a mailing label report and have defined an appropriate data model, simply choose the mailing label default style. Reports Builder automatically creates the report's layout objects and displays them in the Layout Model view. You can completely customize any default layout you create. You can cut, copy, paste, move, resize, and edit each layout object that Reports Builder generates for you.

Layout defaulting is governed by the following rules:

- All previously-defined layout objects for the report will be overwritten (including format triggers) unless you define the area in which you wish to create the layout as one which does not already contain layout objects.

- One report can have any number of different formats. For example, you can build a report that has a tabular format on the top of the first page, and a matrix format on the bottom of the same page by creating an additional report layout (see Section 3.5.5, "Creating an additional report layout").

- Once you have created a report layout, any further changes you make to the data model will not automatically be included in the layout. For example, if you create a query after you have created a report layout and then run your report, the data from the new query will not appear in the report output. To incorporate your changes, you need to either redefault or modify the layout.

Reports Builder defaults report layout according to the following rules:

1. Unless otherwise noted, a group with a Print Direction of Across defaults identically to a group with a Print Direction of Down, except that the default format is transposed. To quickly determine the defaulting of an Across group, do the following:

   - Draw the down layout for the group on translucent paper.

   - Turn the page over as if it was a page in a book.

   - Rotate the page counter-clockwise 90 degrees.

2. In form letter reports, all default fields are hidden, and have a Horizontal Elasticity property setting of Variable and a Vertical Elasticity property setting of Fixed. In all other reports, all default fields have a Horizontal and Vertical Elasticity property setting of Fixed.

   Exception: For tabular, form-like, group left/above, and matrix reports, the default for CHAR (if you reduce the default width) and LONG fields have a Horizontal Elasticity property setting of Fixed and a Vertical Elasticity property setting of Variable. As a result, all of the field's value will be displayed, instead of truncated, by word-wrapping any data to the next lines.

   Caution: For form letter and mailing label reports, the default for CHAR (if you reduce the default width) and LONG fields have a Horizontal Elasticity and Vertical Elasticity property setting of Fixed. As a result, the field value will be truncated if the size of the data is greater than the size of the field.

3. Summaries that are owned by the report, not by a group, are allowed in all report layout styles. They are all formatted in the following way:

   - If the layout style is form-like, form letter, or mailing label, the summary is a report column. A report column is formatted like any other database column for that report style.

   - If the layout style is tabular, group left/above, or matrix, and the column on which the summary performs its function is not selected, the summary is a report column. (It is formatted as stated in the bullet above.) Otherwise, the summary is a report summary. It is formatted left-justified at the end of the report, with the label to the left of the field (if there is room).

4. If the layout style is tabular, group left/above, or matrix, a summary is defaulted like a database column if the column it summarizes is not selected. Otherwise, a summary is defaulted like summaries (that is, appearing inside the M_groupname_FTR frames).

5. If the layout style is tabular, group left/above, or matrix, Reports Builder places one summary type per line, in the following order:

   - SUM

   - AVERAGE

   - MINIMUM

   - MAXIMUM

   - COUNT

   - FIRST

   - LAST

   - % OF TOTAL

   - STANDARD DEVIATION

   - VARIANCE

6. If the layout style is tabular, group left/above, or matrix, the summary label will appear to the far-left of the group footer frame (M_groupname_FTR). If there is not room for the full label, the label will be truncated.

See also

Section 3.5.4, "Creating a default layout for a report"

Section 3.10.2, "Creating a default layout for a section"

### 2.4.3 About images

You can add an image to a report by:

- Importing an image from a file into the report layout (paper-based report only). See Section 3.9.8.1.1, "Importing an image".

- Creating a file link object in the Paper Layout (paper-based reports only). See:

  - Section 3.9.8.1.2, "Linking an image object to a file"

  - Section 3.9.8.1.3, "Linking an image object to a URL" (for HTML and HTMLCSS output)

- Selecting a database column in a query (both paper-based and JSP-based Web reports). See:

  - Section 3.8.5, "Selecting an image from the database"

  - Section 3.8.6, "Selecting an image URL from the database" (for HTML output)

The first method (using the Import Image dialog box) provides for including images in the following formats: TIFF, JFIF, BMP, TGA, PCX, PICT, GIF, CALS, RAS, OIF, PCD.

The other two methods (creating a file link object, and selecting a column in the database) provide for including additional formats supported by Oracle Reports, including JPEG (all types, such as Progressive JPEG and Exif JPEG), PNG, BMP, TIFF, GIF, and CGM.

By default, images display in fields so that they appear in the printed report, not only in the Previewer.

Enhanced imaging support is provided by the REPORTS_OUTPUTIMAGEFORMAT environment variable and OUTPUTIMAGEFORMAT command line keyword. The enhancements in imaging support provide the capability to generate complex graphics-intensive reports with high fidelity image output. Additionally on UNIX, the dependency on a windowing system for displaying images is removed; the PostScript printer driver `screenprinter.ppd` provides surface resolution for images.

You can include an unlimited number of image objects without running out of local disk space by using non-caching references. A non-caching reference causes objects to be read from the database only when needed while a report is processing. You must be connected to an ORACLE V7.1 or later database to use this feature.

If you reference a URL for an image, the image is displayed when you format your report for HTML output. For other output formats, the URL text displays in the Paper Design view; in the output destination (for example, a file or PDF document), nothing is displayed. It is your responsibility to verify that the URL exists; Reports Builder does not validate the existence of the resource nor the syntax of the protocol. The size of the object that contains the URL defines the size of the image in the HTML output. Any elasticity properties applied to the object are ignored.

Limitations

- If the input image includes more than 256 colors, and the output image format is set to GIF (with the OUTPUTIMAGEFORMAT command line keyword or the REPORTS_OUTPUTIMAGEFORMAT environment variable), Oracle Reports implements a color reduction to 256 colors to successfully generate the GIF.

- On UNIX, CGM format is not supported in HTML output. This limitation does not apply on the Windows platform.

### 2.4.4 About anchors

Anchors fasten an edge of one object to an edge of another object, ensuring that they maintain their relative positions. For example, you can anchor boilerplate text to the edge of a variable-sized repeating frame, guaranteeing the boilerplate's distance and position in relation to the repeating frame, no matter how the frame's size might change.

Anchors determine the vertical and horizontal positioning of a child object relative to its parent. The child object may be either outside of or contained within the parent.

Since the size of some layout objects may change when the report runs (and data is actually fetched), you need anchors to define where you want objects to appear relative to one another. An anchor defines the relative position of an object to the object to which it is anchored. Positioning is based on the size of the objects after the data has been fetched rather than on their size in the editor. It should also be noted that the position of the object in the Paper Layout view affects the final position in the report output. Any physical offset in the layout is incorporated into the percentage position specified in the Anchor properties.

There are two types of anchors:

- Implicit anchors. At runtime, Reports Builder generates an implicit anchor for each layout object that does not already have an explicit anchor. It determines for each layout object which objects, if any, can overwrite it, then creates an anchor from the layout object to the closest object that can overwrite it. This prevents the object from being overwritten. The implicit anchor functionality saves you from having to define the positioning of each object. Implicit anchors are not visible in the Paper Layout view. However, you can specify in the Object Navigator Options dialog box that the Object Navigator display anchoring information. By default, objects are anchored to the upper left corner of their enclosing object. If this view of the Object Navigator does not show anchoring information for an object, you can assume that the object is anchored to its enclosing object, which might be the frame or the body.

- Explicit anchors. You can create an anchor in the Layout editor using the Anchor tool, dragging from one edge of the child to the one of the parent's edges. Any anchor you create for an object will override its implicit anchoring. Explicit anchors are always visible in the Paper Layout view unless you specify otherwise in the Layout Options dialog box.

Relative positioning of anchors

When you anchor a child object to a parent object, the x and y coordinates of the anchor's attachments are important.

If the parent object is located above or below the child object:

- the vertical distance between the two objects is fixed. For example, in the figure below, the vertical spacing between the parent and Object 1 is fixed.

- the horizontal positioning of the anchor's x-coordinate on the child object is relative to the anchor's x-coordinate on the parent object. For example, in the figure below, the anchor is 50% from the edge of the parent and 75% from the left edge of Object 1. Therefore, when this report is run, Reports Builder will shift Object 1 25% to the left of the center of the parent.

Figure 2-5 Parent object above child object

Description of "Figure 2-5 Parent object above child object"

If the parent object is located to the right or left of the child object:

- the vertical positioning of the two objects is relative. For example, in the figure below, both ends of the anchor are about 80% down from the top edges of the objects. Therefore, when the report is run, Reports Builder will calculate the length of the two objects (as they may expand), calculate the y coordinate that is 80% down for both objects, and position the two objects so that those two points are separated by the amount of space separating them in the Paper Layout view.

- the horizontal positioning between the two objects is fixed. For example, in the figure below, the horizontal spacing between the parent and Object 1 is fixed.

Figure 2-6 Parent object to the right of child object

Description of "Figure 2-6 Parent object to the right of child object"

If you need to position an object outside a repeating frame or frame, but you want the object to be "owned" by the repeating frame or frame (that is, to be formatted when its "owner" is formatted), create an anchor that is attached to an object inside the frame or repeating frame.

Collapsing Anchors

You can create anchors to be "collapsible." Collapsing anchors help avoid unnecessary empty space in your report. Such empty space can occur when the parent object does not print on the same page as the child object, either because the parent and child cannot fit on the same page or because of an assigned Print Condition. A collapsing anchor allows the child object to move into the position that would have been taken by the parent had it printed. The child object will also maintain its relative position as defined by the anchor.

#### 2.4.4.1 Implicit anchoring algorithm

Reports Builder creates implicit anchors at runtime in the body region. The margin algorithm differs slightly.

Body algorithm

1. Determine which objects are not entirely enclosed by a repeating frame of frame (directly or indirectly), or explicitly anchored to an object that is enclosed by a frame or repeating frame (directly or indirectly). We'll call these objects Type A objects. (Type A objects are typically group frames, repeating frames, other objects you create that are not owned by a frame or repeating frame, and so on). An object is considered to be enclosed by another object only if all of the following are true:

   - Both objects belong to the same region (Body or Margin).

   - The outermost of the two objects is a frame or repeating frame.

   - The outermost of the two objects is behind the other object.

   - The innermost of the two objects lies entirely within the borders of the other object.

2. Determine all children objects of a frame or repeating frame (these are the non-Type A objects). We'll call these objects Type B objects.

3. Follow this procedure for Type A and Type B objects independently:

   - Find all objects that are of the same type (for example, Type A), and are on the same layer.

   - Determine which of those objects have potential to "push" other objects of that type. An object has potential to "push" object of that type if it has a Horizontal or Vertical Elasticity setting of Variable or Expand, and a second object is located in its "push path" (that is, in the area in which it can possibly grow). Also, a repeating frame with a Horizontal or Vertical Elasticity setting of Fixed or Contract has a "push path": its Print Direction.

   - Create pairs of objects. Each pair must contain a pusher (that is, the object that will grow) and a pushee (that is, the object that will be pushed). When creating these pairs, a pushee object cannot be a child of an explicit anchor--those objects are ignored.

   - Go through this loop. For each pair, determine the distance in the "push path" between the pusher and pushee. Next, find the pair with the shortest distance. Finally, create an implicit anchor between those two objects using this algorithm:

     If the "push path" direction is Down, anchor the pushee object's top 0% to the pusher object's bottom 0%.

     If the "push path" direction is Across, anchor the pushee object's left 0% to the pushed object's right 0%.

   - That pair is now treated like one object, and the loop continues until either all objects have one anchor, or nothing will push the remaining, unanchored objects.

   - For each remaining, unanchored object, create an implicit anchor from the top-left corner of the object to the top-left corner of the body region.

   - Move to the next layer, and follow the procedure starting at step 1.

Rules:

- If an object is in the "push path" of two other objects and it is equidistant from the other two objects, the implicit anchoring of the object may vary between executions of the report. For example, the drawing that follows shows two cases where this could occur:

Figure 2-7 Object in push path of two other objects

Description of "Figure 2-7 Object in push path of two other objects"

In the first case, M_Sums is in the "push path" of both B_Text1 and R_Ename. Because M_Sums is equidistant from B_Text1 and R_Ename, though, the normal criteria (shortest distance) for determining implicit anchors does not work in this case. Consequently, the formatting algorithm will randomly create an implicit anchor between M_Sums and either B_Text1 or R_Ename at runtime. To avoid this behavior, you could create an explicit anchor between M_Sums and B_Text1 or R_Ename.

In the second case, B_Text3 is in the "push path" of M_Emp. Since the bottom edges of M_Emp and R_Mgr are virtually in the same position, though, B_Text3 could be implicitly anchored to either M_Emp or R_Mgr. Consequently, the formatting algorithm will randomly create an implicit anchor between B_Text3 and either M_Emp or R_Mgr at runtime. To avoid this behavior, you could create an explicit anchor from B_Text3 to one of the objects or remove the explicit anchor between R_Ename and B_Text2. Removing the explicit anchor would cause R_Mgr to be treated as a descendant of M_Emp and, therefore, the implicit anchor would always be created between B_Text3 and M_Emp.

(Note that Case 2 is most likely to occur in character mode, where it is common to have the edges of objects overlap in the Paper Layout view.)

Margin algorithm

Reports Builder creates implicit anchors for all Type B objects in the margin region using the Body algorithm. For each Type A object, however, Reports Builder creates an implicit anchor from the top-left corner of the object to the top-left corner of the margin. No Type A object will be implicitly anchored to another Type A object. (This ensures that Type A objects will not be pushed off the page. However, they may be overwritten by another Type A object, if they are found on the same layer.)

See also

Section 3.9.5.1, "Anchoring objects together"

Section 3.9.5.2, "Viewing implicit anchors"

Section 3.9.5.3, "Moving an anchor"

### 2.4.5 About changing colors and patterns

Color and pattern selections are applied to an entire object (for example, you can apply a color to all the text in the object but not to a segment of the text).

You can change colors and patterns in your report in the following ways:

- In the Reports Builder user interface, use the following tools in the Paper Layout view's tool palette:

  - The Line Color tool is used to customize the color of borders around layout objects.

    Note: The Windows platform does not support a border pattern (that is, patterns for the Line Color tool).

  - The Fill Color tool is used to fill layout objects with colors and patterns.

  - The Text Color tool is used to change the default text color.

  - The Fill/Line/Text Display, the box directly above the three Color tools, shows the currently selected fill, border, and text. The default fill and border for objects created by Reports Builder is transparent, while the default for objects you create is a black, one point line around a white fill.

- In PL/SQL, use the following SRW packaged procedures:

  - SRW.SET_BACKGROUND_BORDER_COLOR

  - SRW.SET_BACKGROUND_FILL_COLOR

  - SRW.SET_FOREGROUND_BORDER_COLOR

  - SRW.SET_FOREGROUND_FILL_COLOR

  - SRW.SET_TEXT_COLOR

  - SRW.SET_FILL_PATTERN

  - SRW.SET_BORDER_PATTERN

- For templates, set the following properties in the template Property Inspector:

  - The Fill Pattern property defines the pattern to use for the space enclosed by the objects. You can define the background and foreground colors of the fill pattern using the Foreground Color and Background Color properties.

  - The Edge Pattern property defines the pattern to use for the borders of the objects. You can define the background and foreground colors of the edge pattern using the Edge Foreground Color and Edge Background Color properties.

    Note: The Windows platform does not support a border pattern.

  - The Text Color property specifies the text color to use for the object(s).

Additionally, you can set color palette preferences to specify how it is used by a report (see Section 3.2.6, "Setting color palette preferences") and modify the color palette to change the definition of individual colors (see Section 3.9.6.5, "Modifying the color palette").

To change the color palette being used by the current report, you can import a new color palette. You can also export the current color palette for use by other reports. (See Section 3.9.6.6, "Importing or exporting a color palette".)

See also

Section 3.9.6.2, "Changing colors"

Section 3.9.6.3, "Changing patterns"

Section 3.9.6.4, "Changing colors and patterns using PL/SQL"

Section 3.9.4.2, "Changing object border attributes"

Topics "Oracle CDE1 color palette", "Default color palette", "Grayscale color palette", and "Pattern color palette" in the Reference > Color and Pattern Palettes section of the Oracle Reports online Help

Topic "SRW built-in package" in the Reference > PL/SQL Reference > Built-in Packages section of the Oracle Reports online Help

Topic "Template properties" in the Properties section of the Oracle Reports online Help

### 2.4.6 About resizing objects

You can resize queries, groups, frames, repeating frames, fields, matrix objects, and boilerplate objects. You cannot resize anchors. However, an anchor is automatically resized if you move one of the objects it anchors.

Caution: When you resize boilerplate text, be very careful that all of the text fits within the object. If font descends (the space left for the lower parts of letters like g and q) do not fit, the line of text will appear in the Report Editor view, but, when the report is run, the line will not appear in the output. When you click a handle and drag it, the two edges that join at the corner will be resized; that is, the object will grow or reduce in both the x and y directions.

See also

Section 3.9.12.1, "Resizing objects"

Section 3.9.12.2, "Making multiple objects the same size"

Section 3.9.11.3, "Adjusting parent borders automatically"

### 2.4.7 About moving and layering objects in the Paper Layout view

In the Paper Layout view, objects must be on a layer above the objects that enclose them. For example, the fields that belong to a repeating frame must be at least one layer above the repeating frame in the Paper Layout view. If not, then they are not considered to be enclosed by the repeating frame any longer and will cause a frequency error at runtime. When you move or group objects in the Paper Layout view, it is possible to change the layering such that you will get frequency errors when you run the report. To avoid this problem, you should take advantage of Confine or Flex mode when moving objects in the Paper Layout view.

See also

Section 3.9.4.3, "Changing the current mode (Confine or Flex)"

Section 3.9.11.7, "Changing object layering"

Section 3.9.11.2, "Moving an object outside its parent"

Section 3.9.11.1, "Moving multiple objects"

Section 3.9.11.6, "Aligning objects"

## 2.5 Parameter Form Objects

The topic in this section builds on the basic concepts discussed in Section 1.9, "Parameter Form Objects".

### 2.5.1 About Parameter Form HTML extensions

Parameter Form HTML extensions enable you to enhance your Runtime Parameter Form with HTML tagged text and JavaScript when your paper reports are run through the Web. To enhance your Paper Parameter Form for displaying on the Web, you can:

- create boilerplate text with HTML tags for adding hyperlinks or any other HTML tagged text to your Parameter Form (see Section 3.9.2.3, "Creating a boilerplate text object for HTML tags").

- insert parameter fields with JavaScript for defining input or select events, such as raising errors when users enter invalid data in a parameter field (see.Section 3.11.12, "Creating HTML Parameter Form input or select events").

- create a Parameter Form header (a before form escape) for placing a logo or some standard links in the header of the HTML Parameter Form (see Section 3.6.10.1.5, "Creating an HTML Parameter Form header using the Property Inspector" to use the Property Inspector, or Section 3.6.10.2.5, "Creating an HTML Parameter Form header using PL/SQL").

- create a Parameter Form footer (an after form escape) for placing a logo or some standard links in the footer of the HTML Parameter Form (see Section 3.6.10.1.6, "Creating an HTML Parameter Form footer using the Property Inspector" to use the Property Inspector, or Section 3.6.10.2.6, "Creating an HTML Parameter Form footer using PL/SQL").

You can access the Parameter Form Builder from the Object Navigator or by choosing Tools > Parameter Form Builder.

See also

Section 1.2.2, "About Web reports"

Section 1.9.4, "About Parameter Forms for Web reports"

Section 2.2.3, "About Web links for HTML output"

## 2.6 PL/SQL

The topics in this section discuss the use of PL/SQL in Reports Builder.

- About the PL/SQL Editor

- About the Stored PL/SQL Editor

- About the Syntax Palette

- About program units

- About stored program units

- About external PL/SQL libraries

- About attached libraries

- About formulas

- About group filters

- About REF CURSOR queries

- About DML and DDL

- About built-in packages

- About triggers

### 2.6.1 About the PL/SQL Editor

The PL/SQL Editor enables you to create and edit PL/SQL program units.

Usage notes

When you make changes to a program unit, dependent program units lose their compiled status, which is indicated by an asterisk (*) after their name under the Program Units node in the Object Navigator. You can navigate to those program units directly in the PL/SQL Editor using the Name list to recompile them.

Restrictions

- If you delete a PL/SQL package, function, or procedure, you must also delete all references to it in your report. Otherwise, you will get an error when you compile, generate, or run the report.

- PL/SQL package, function, and procedure names must be unique within the report and may not duplicate the names of any columns, groups, queries, or printable objects.

See also

Section 3.13.2.3.1, "Editing features in the PL/SQL Editor"

### 2.6.2 About the Stored PL/SQL Editor

The Stored PL/SQL Editor enables you to create and edit stored PL/SQL program units in a database (listed under the Database Objects node in the Object Navigator).

See also

Section 3.13.3.2, "Creating a stored program unit"

### 2.6.3 About the Syntax Palette

The Syntax Palette is a programming tool that enables you to display and copy the constructs of PL/SQL language elements and built-in packages into the PL/SQL Editor and Stored PL/SQL Editor.

See also

Section 3.13.2.4, "Inserting syntax into the PL/SQL Editor"

### 2.6.4 About program units

Program units are packages, functions, or procedures that you can reference from any PL/SQL within the current report.

Note: Program units cannot be referenced from other documents. If you want to create a package, function, or procedure that can be referenced from multiple documents, create an external PL/SQL library (see Section 3.13.5.1, "Creating an external PL/SQL library").

For a detailed example of using PL/SQL in a report, see Chapter 39, "Building a Report that Includes PL/SQL".

Restrictions

- If you delete a PL/SQL package, function, or procedure, you must also delete all references to it in your report. Otherwise, you will get an error when you compile, generate, or run the report.

- PL/SQL package, function, and procedure names must be unique within the report and may not duplicate the names of any columns, groups, queries, or printable objects.

Example: Referencing a PL/SQL function in formulas

Suppose that you have a report with the following groups and columns:

    Groups    Columns         Summary
    -----------------------------------------
    RGN       REGION
              RGNSUMSAL       SUM(DEPTSUMSAL)
              COSTOFLIVING

    DEPT      DNAME
              DEPTNO
              DEPTSUMSAL      SUM(EMP.SAL)

    JOB       JOB
              HEADCOUNT       COUNT(EMP.EMPNO)

    EMP       ENAME
              EMPNO
              SAL
              COMM

Given these groups and columns, you might create multiple formulas that apply the cost of living factor (`COSTOFLIVING`) to salaries. To avoid duplication of effort, you could create the following PL/SQL function and reference it from the formulas:

    function CompSal(salary number) return number is
    begin
      return (salary*CostofLiving);
    end;

Following are some examples of how you might reference the PL/SQL function in formulas:

    CompSal(:RGNSUMSAL)

    or

    CompSal(:SAL) + COMM

See also

Section 3.13.3.1, "Creating a local program unit"

### 2.6.5 About stored program units

Stored program units (also known as stored subprograms, or stored procedures) can be compiled separately and stored permanently in an Oracle database, ready to be executed. Once compiled and stored in the data dictionary, they are schema objects, which can be referenced by any number of applications connected to that database.

Stored program units offer higher productivity, better performance, memory savings, application integrity, and tighter security. For example, by designing applications around a library of stored procedures and functions, you can avoid redundant coding and increase your productivity.

Stored program units are stored in parsed, compiled form. So, when called, they are loaded and passed to the PL/SQL engine immediately. Also, they take advantage of shared memory. So, only one copy of a program unit need be loaded into memory for execution by multiple users.

Because stored program units run in ORACLE, they can perform database operations more quickly than PL/SQL that is local to your report. Therefore, in general, use stored program units for PL/SQL that performs database operations. Use local program units for PL/SQL that does not involve database operations. However, if you are on a heavily loaded network with very slow response time, using stored program units may not be faster for database operations. Similarly, if your server is significantly faster than your local machine, then using local program units may not be faster for non-database operations.

See also

Section 3.13.3.2, "Creating a stored program unit"

### 2.6.6 About external PL/SQL libraries

External PL/SQL libraries are collections of PL/SQL procedures, functions, and packages that are independent of a report definition. By attaching an external library to a report, you can reference its contents any number of times. For example, you could reference a procedure in an attached library from both a Before Report trigger and a format trigger. This eliminates the need to re-enter the same PL/SQL for each application.

When you associate an external PL/SQL library with a report or another external library, it is called an attached library.

See also

Section 3.13.5.1, "Creating an external PL/SQL library"

### 2.6.7 About attached libraries

Attached libraries are external PL/SQL libraries that you have associated with a report or another external library. When an external library is attached, you can reference its packages, functions, and procedures from within your report. For example, if you attached an external library name MYLIB to your report and it contained a function named ADDXY, then you could reference ADDXY from any PL/SQL in the report.

External PL/SQL libraries are independent of a report definition.

Usage notes

Local PL/SQL executes more quickly than a reference to a procedure or function in an external PL/SQL library. As a result, you should only use external PL/SQL libraries when the benefits of sharing the code across many applications outweigh the performance overhead.

Restrictions

- If Reports Builder cannot find a library that you specify in the Attached Libraries list, a warning will be raised when you accept the dialog box, save the report, or open the report. If you try to run the report or compile the PL/SQL in it, an error will be raised.

- The Attached Libraries list is saved. The next time you open the report or library the list will have the same contents it did when you last saved the report.

- If an external library references another library, you must attach both libraries to the report even if the first library already has the second one attached.

See also

Section 3.13.5.5, "Attaching a PL/SQL library"

### 2.6.8 About formulas

Formulas are PL/SQL functions that populate formula or placeholder columns. You can access the PL/SQL for formulas from the Object Navigator, the PL/SQL Editor, or the Property Inspector (that is, the PL/SQL Formula property).

A column with Datatype property set to Number can only have a formula that returns a value of datatype `NUMBER`. A column with Datatype property set to Date can only have a formula that returns a value of datatype `DATE`. A column with Datatype property set to Character can only have a formula that returns a value of datatype `CHARACTER`, `VARCHAR`, or `VARCHAR2`.

Restrictions

- You can read and assign values to a column in a formula, if the column is a placeholder or parameter column; you cannot change the value of database columns (values retrieved from the database). For example, you can use the value of a column called `COMP` in a condition (for example, `IF :COMP = 10`) and you can directly set its value in an assignment statement (for example,`:COMP:= 15`).

- A formula can only make reference to columns that are in the same or a higher group in the group hierarchy. For example, a formula for a report-level column can only reference other report-level columns.

- Formulas are calculated such that any column referenced in the formula will be calculated first. To do so, Reports Builder builds a dependency list, to guarantee proper ordering of calculations. Note that circular dependencies, in which a column references another column which in turn references the first column, either directly or indirectly, are not allowed.

- When using `SRW.DO_SQL`, we recommend that you do not read database values that are updated or inserted in the same report. There is no guarantee of the exact time Reports Builder will fetch records from the database for formatting the output. Reports Builder does internal "data look-ahead" to optimize performance. Thus, a particular record might already have been accessed before an update is issued to the same record. Reports Builder builds internal dependency lists which guarantee that events, such as invocation of user exits, calculation of summaries, and so on, happen in the correct order. However, Reports Builder cannot guarantee these events will be synchronized with its internal data access or with the formatting of data.

Examples

Example 1: Adding values

The following example populates the column with the value of the salary plus the commission.

    function salcomm return NUMBER is
    begin
      return(:sal + :comm);
    end;

Example 2: Using conditions

The following code adds the commission to the salary if the value for the commission is not null.

    function calcomm return NUMBER is
    temp number;
    begin
      if :comm IS NOT NULL then
        temp := :sal + :comm;
      else
        temp := :sal;
      end if;
      return (temp);
    end;

See also

Section 2.3.2, "About formula columns"

Section 3.13.4.3, "Creating or editing a formula column"

Section 3.13.4.4, "Creating a placeholder column"

### 2.6.9 About group filters

A group filter determines which records to include in a group. You can use the packaged filters, First and Last, to display the first n or last n records for the group, or you can create your own filters using PL/SQL. You can access group filters from the Object Navigator, the Property Inspector (the PL/SQL Filter property), or the PL/SQL Editor.

The function must return a boolean value (TRUE or FALSE). Depending on whether the function returns TRUE or FALSE, the current record is included or excluded from the report.

Difference between group filters and Maximum Rows to Fetch property

The Maximum Rows to Fetch property restricts the actual number of records fetched by the query. A group filter determines which records to include or exclude, after all the records have been fetched by the query. Since Maximum Rows to Fetch actually restricts the amount of data retrieved, it is faster than a group filter in most cases. If you set the Filter Type property to Last or Conditional, Reports Builder must retrieve all of the records in the group before applying the filter. Also, you should be aware that when using Maximum Rows to Fetch for queries, it can affect summaries in other groups that depend on this query. For example, if you set the Maximum Rows to Fetch property to 8, any summaries based on that query will only use the 8 records retrieved.

Restrictions

- Group filters cannot be added to groups if the Filter Type property is set to First or Last.

  Group filters cannot be added to cross-product groups.

- The function that you enter for a group filter can only depend upon the following columns:

  - a database column owned by the group's query or a query above it in the data model hierarchy

  - computed columns (formulas or summaries) that depend on unrelated queries (that is, computed columns that do not depend upon columns in the group, the group's ancestors, or the group's descendants)

- In a group filter, you can read the values of Reports Builder columns and parameters of the correct frequency, but you cannot directly set their values. For example, you can use the value of a parameter called COUNT1 in a condition (for example, IF :COUNT1 = 10), but you cannot directly set its value in an assignment statement (for example, :COUNT1:= 10). Note also that the use of PL/SQL global variables to indirectly set the values of columns or parameters is not supported. If you do this, you may get unpredictable results. You also cannot reference any page-dependent columns (that is, Reset At of Page) or columns that rely on page-dependent columns in a group filter.

Example

    function filter_comm return boolean is
    begin
      if :comm IS NOT NULL then
        if :comm < 100 then
          return (FALSE);
        else
          return (TRUE);
        end if;
      else
        return (FALSE); -- for rows with NULL commissions
      end if;
    end;

See also

Section 3.13.4.2, "Creating or editing a group filter"

### 2.6.10 About REF CURSOR queries

A `REF CURSOR` query uses PL/SQL to fetch data. Each `REF CURSOR` query is associated with a PL/SQL function that returns a cursor value from a cursor variable. The function must ensure that the `REF CURSOR` is opened and associated with a `SELECT` statement that has a `SELECT` list that matches the type of the `REF CURSOR`.

Usage notes

- Oracle Reports supports only strongly typed `REF CURSOR`s. For example:

      type c1 is REF CURSOR RETURN emp%ROWTYPE;

- When you make a `REF CURSOR` query the child in a data link, the link can only be a group to group link. It cannot be a column to column link.

- If you use a stored program unit to implement `REF CURSOR`s, you receive the added benefits that go along with storing your program units in the Oracle database.

- You base a query on a `REF CURSOR` when you want to:

  1. more easily administer SQL.

  2. avoid the use of lexical parameters in your reports.

  3. share data sources with other applications, such as Form Builder.

  4. increase control and security.

  5. encapsulate logic within a subprogram.

Furthermore, if you use a stored program unit to implement `REF CURSOR`s, you receive the added benefits that go along with storing your program units in the Oracle database.

For more information about `REF CURSOR`s and stored subprograms, refer to the PL/SQL User's Guide and Reference.

Examples

Example 1: Package with `REF CURSOR` example

    /* This package spec defines a REF CURSOR
    ** type that could be referenced from a
    ** REF CURSOR query function.
    ** If creating this spec as a stored
    ** procedure in a tool such as SQL*Plus,
    ** you would need to use the CREATE
    ** PACKAGE command.
    */

    PACKAGE cv IS
    type comp_rec is RECORD
      (deptno number,
       ename varchar(10),
       compensation number);
    type comp_cv is REF CURSOR return comp_rec;
    END;

Example 2: Package with `REF CURSOR` and function

    /* This package spec and body define a ref
    ** cursor type as well as a function that
    ** uses the REF CURSOR to return data.
    ** The function could be referenced from
    ** the REF CURSOR query, which would
    ** greatly simplify the PL/SQL in the
    ** query itself. If creating this spec
    ** and body as a stored procedure in a
    ** tool such as SQL*Plus, you would need
    ** to use the CREATE PACKAGE and CREATE
    ** PACKAGE BODY commands.
    */

    PACKAGE cv IS
    type comp_rec is RECORD
      (deptno number,
       ename varchar(10),
       compensation number);
    type comp_cv is REF CURSOR return comp_rec;
    function emprefc(deptno1 number) return comp_cv;
    END;

    PACKAGE BODY cv IS
    function emprefc(deptno1 number) return comp_cv is
      temp_cv cv.comp_cv;
    begin
      if deptno1 > 20 then
        open temp_cv for select deptno, ename,
        1.25*(sal+nvl(comm,0)) compensation
        from emp where deptno = deptno1;
      else
        open temp_cv for select deptno, ename,
        1.15*(sal+nvl(comm,0)) compensation
        from emp where deptno = deptno1;
      end if;
      return temp_cv;
    end;
    END;

Example 3: `REF CURSOR` query

    /* This REF CURSOR query function would be coded
    ** in the query itself. It uses the cv.comp_cv
    ** REF CURSOR from the cv package to return
    ** data for the query.
    */
    function DS_3RefCurDS return cv.comp_cv is
      temp_cv cv.comp_cv;
    begin
      if :deptno > 20 then
        open temp_cv for select deptno, ename,
        1.25*(sal+nvl(comm,0)) compensation
        from emp where deptno = :deptno;
      else
       open temp_cv for select deptno, ename,
       1.15*(sal+nvl(comm,0)) compensation
       from emp where deptno = :deptno;
      end if;
      return temp_cv;
    end;

Example 4: `REF CURSOR` query calling function

    /* This REF CURSOR query function would be coded
    ** in the query itself. It uses the cv.comp_cv
    ** REF CURSOR and the cv.emprefc function from
    ** the cv package to return data for the query.
    ** Because it uses the function from the cv
    ** package, the logic for the query resides
    ** mainly within the package. Query
    ** administration/maintenance can be
    ** done at the package level (for example,
    ** modifying SELECT clauses could be done
    ** by updating the package). You could also
    ** easily move the package to the database.
    ** Note this example assumes you have defined
    ** a user parameter named deptno.
    */

    function DS_3RefCurDS return cv.comp_cv is
      temp_cv cv.comp_cv;
    begin
      temp_cv := cv.emprefc(:deptno);
      return temp_cv;
    end;

See also

Section 3.8.1.9, "Creating a query: REF CURSOR Query tool"

### 2.6.11 About DML and DDL

If you want to use Data Manipulation Language (DML) or Data Definition Language (DDL) in your PL/SQL, you can use the SRW.DO_SQL built-in procedure. Note that SRW.DO_SQL should only be used for DML and DDL; you should not use it to fetch data. For more information on DML and DDL, see the Oracle Server SQL Language Reference manual.

Because of Oracle Reports' processing model, it is recommended that you only use DDL in the Before Parameter Form and After Parameter Form triggers. DML can be entered any place that accepts PL/SQL.

Any DML or DDL that will reported on with this report's processing should be done in (or before) the After Parameter Form trigger. Consistency cannot be guaranteed in the Before Report trigger, since Oracle Reports may have to start some work on data cursors before that trigger based on the definition of the report. One thing Reports Builder always does before the Before Report trigger is to describe the tables involved and open cursors. Any change to the tables after that will not be seen by the report.

See also

Section 2.6.13.1, "About report triggers"

### 2.6.12 About built-in packages

A built-in package is a group of logically related PL/SQL types, objects, and functions or procedures. It generally consists of two parts: the package spec (including data declarations) and the package body. Packages are especially useful because they allow you to create global variables.

Oracle provides several packaged procedures that you can use when building or debugging your PL/SQL-based applications. Your PL/SQL code can make use of the procedures, functions, and exceptions in the Reports Builder built-in package (SRW), and numerous Tools built-in packages, as described below.

#### 2.6.12.1 About the Reports Builder built-in package (SRW)

Reports Builder is shipped with a built-in package (SRW), a collection of PL/SQL constructs that include many functions, procedures, and exceptions you can reference in any of your libraries or reports.

The PL/SQL provided by the SRW package enables you to perform such actions as change the formatting of fields, run reports from within other reports, create customized messages to display in the event of report error, and execute SQL statements.

You can reference the contents of the SRW package from any of your libraries or reports without having to attach it. However, you cannot reference its contents from within another product, for example, from SQL*Plus.

Constructs found in a package are commonly referred to as "packaged" (that is, packaged functions, packaged procedures, and packaged exceptions).

See also

Topic "SRW built-in package" in the Reference section of the Oracle Reports online Help

#### 2.6.12.2 About the Tools built-in packages

Several client-side built-in packages are provided that contain many PL/SQL constructs you can reference while building applications or debugging your application code. These built-in packages are not installed as extensions to the package STANDARD. As a result, any time you reference a construct in one of the packages, you must prefix it with the package name (for example, TEXT_IO.PUT_LINE).

The Tools built-in packages are:

- DDE

  Provides Dynamic Data Exchange support within Reports Builder components.

- DEBUG

  Provides procedures, functions, and exceptions for when debugging your PL/SQL program units. Use these built-in subprograms to create debug triggers and set breakpoints with triggers.

- EXEC_SQL

  Provides procedures and functions for executing dynamic SQL within PL/SQL code written for Reports Builder applications.

- LIST

  Provides procedures, functions, and exceptions you can use to create and maintain lists of character strings (VARCHAR2). This provides a means of creating arrays in PL/SQL Version 1.

- ORA_FFI

  Provides a foreign function interface for invoking C functions in a dynamic library.

- ORA_JAVA

  Provides an interface for invoking Java classes from PL/SQL.

- ORA_NLS

  Enables you to extract high-level information about your current language environment. This information can be used to inspect attributes of the language, enabling you to customize your applications to use local date and number format. Information about character set collation and the character set in general can also be obtained. Facilities are also provided for retrieving the name of the current language and character set, allowing you to create applications that test for and take advantage of special cases.

- ORA_PROF

  Provides procedures, functions, and exceptions you can use for tuning your PL/SQL program units (for example, examining how much time a specific piece of code takes to run).

- TEXT_IO

  Provides constructs that allow you to read and write information from and to files. There are several procedures and functions available in Text_IO, falling into the following categories:

  - file operations. The FILE_TYPE record, the FOPEN and IS_OPEN functions, and the FCLOSE procedure enable you to define FILE_TYPE variables, open files, check for open files, and close open files, respectively.

  - output (write) operations. The PUT, PUTF, PUT_LINE, and NEW_LINE procedures enable you to write information to an open file or output it to the PL/SQL Interpreter.

  - input (read) operations. The GET_LINE procedure enables you to read a line from an open file

- TOOL_ENV

  Enables you to interact with Oracle environment variables by retrieving their values for use in subprograms.

- TOOL_ERR

  Enables you to access and manipulate the error stack created by other built-in packages such as DEBUG.

  In addition to using exceptions to signal errors, some built-in packages (for example, the DEBUG package) provide additional error information. This information is maintained in the form of an "error stack".

  The error stack contains detailed error codes and associated error messages. Errors on the stack are indexed from zero (oldest) to n-1 (newest), where n is the number of errors currently on the stack. Using the services provided by the TOOL_ERR package, you can access and manipulate the error stack.

- TOOL_RES

  Provides a means of extracting string resources from a resource file with the goal of making PL/SQL code more portable by isolating all textual data in the resource file.

The following packages are used only internally by Oracle Reports. There are no subprograms available for external use with these packages.

- ORA_DE

  Contains constructs used by Reports for private PL/SQL services.

- STPROC

  Calls subprograms stored in the database. Calls to this package are automatically generated.

- JNI

  Facilitates calling Java from PL/SQL.

See also

Topics for each of the Tools built-in packages under in the Reference > PL/SQL Reference > Built-in Packages section of the Oracle Reports online Help

### 2.6.13 About triggers

Triggers check for an event. When the event occurs they run the PL/SQL code associated with the trigger.

Report triggers are activated in response to report events such as the report opening and closing rather that the data that is contained in the report. They are activated in a predefined order for all reports.

Format triggers are executed before an object is formatted. A format trigger can be used to dynamically change the formatting attributes of the object.

Validation triggers are PL/SQL functions that are executed when parameter values are specified on the command line and when you accept the Runtime Parameter Form.

Database triggers are procedures that are stored in the database and implicitly executed when a triggering statement such as `INSERT`, `UPDATE`, or `DELETE` is issued against the associated table.

#### 2.6.13.1 About report triggers

Report triggers execute PL/SQL functions at specific times during the execution and formatting of your report. Using the conditional processing capabilities of PL/SQL for these triggers, you can do things such as customize the formatting of your report, perform initialization tasks, and access the database. To create or modify a report trigger, you use the Report Triggers node in the Object Navigator. Report triggers must explicitly return TRUE or FALSE.

Oracle Reports has five global report triggers. You cannot create new global report triggers. The trigger names indicate at what point the trigger fires:

- Before Report trigger: Fires before the report is executed but after queries are parsed.

- After Report trigger: Fires after you exit the Paper Design view, or after report output is sent to a specified destination, such as a file, a printer, or an e-mail ID. This trigger can be used to clean up any initial processing that was done, such as deleting tables. Note, however, that this trigger always fires, whether or not your report completed successfully.

- Between Pages trigger: Fires before each page of the report is formatted, except the very first page. This trigger can be used for customized page formatting. In the Paper Design view, this trigger only fires the first time that you go to a page. If you subsequently return to the page, the trigger does not fire again.

- Before Parameter Form trigger: Fires before the Runtime Parameter Form is displayed. From this trigger, you can access and change the values of parameters, PL/SQL global variables, and report-level columns. If the Runtime Parameter Form is suppressed, this trigger still fires. Consequently, you can use this trigger for validation of command line parameters.

- After Parameter Form trigger: Fires after the Runtime Parameter Form is displayed. From this trigger, you can access parameters and check their values. This trigger can also be used to change parameter values or, if an error occurs, return to the Runtime Parameter Form. Columns from the data model are not accessible from this trigger. If the Runtime Parameter Form is suppressed, the After Parameter Form trigger still fires. Consequently, you can use this trigger for validation of command line parameters or other data.

Order of report trigger execution

The order of events when a report is executed is as follows:

1. Before Parameter Form trigger is fired.

   Note: If the Parameter Form is used on the Web, the Before Parameter Form trigger fires twice: once when the Parameter Form is displayed, and a second time when the parameters are submitted. This is because Oracle Reports executes in a stateless fashion. There is no session to return to, so the Before Parameter Form trigger has to fire the second time to ensure that the parameters selected on the Parameter Form and passed on the command line are valid.

2. Runtime Parameter Form appears (if not suppressed).

3. After Parameter Form trigger is fired (unless the user cancels from the Runtime Parameter Form).

4. Report is "compiled".

5. Queries are parsed.

6. Before Report trigger is fired.

7. SET TRANSACTION READONLY is executed (if specified with the READONLY command line keyword or setting).

8. The report is executed and the Between Pages trigger fires for each page except the first one. (Note that data can be fetched at any time while the report is being formatted.) COMMITs can occur during this time due to: SRW.DO_SQL with DDL, or if ONFAILURE=COMMIT, and the report fails.

9. COMMIT is executed (if READONLY is specified) to end the transaction.

10. After Report trigger is fired.

11. COMMIT/ROLLBACK/NOACTION is executed based on what was specified with the ONSUCCESS command line keyword or setting.

Usage notes

- In steps 4 through 9, avoid DDL statements that would modify the tables on which the report is based. Step 3 takes a snapshot of the tables and the snapshot must remain valid throughout the execution of the report. In steps 7 through 9, avoid DML statements that would modify the contents of the tables on which the report is based. Queries may be executed in any order, which makes DML statements unreliable (unless performed on tables not used by the report).

- If you specify READONLY on the command line, you should avoid DDL altogether. When you execute a DDL statement (for example, with SRW.DO_SQL), a COMMIT is automatically issued. If you are using READONLY, this will prematurely end the transaction begun by SET TRANSACTION READONLY.

- As a general rule, any processing that will affect the data retrieved by the report should be performed in the Before Parameter Form or After Parameter Form triggers. (These are the two report triggers that fire before anything is parsed or fetched.) Any processing that will not affect the data retrieved by the report can be performed in the other triggers.

- Consistency is guaranteed if you use DML or DDL in (or before) the After Form Trigger. However, consistency is not guaranteed in the Before Report trigger, since Oracle Reports may have to start work on data cursors before that trigger based on the definition of the report. Before the Before Report trigger, Oracle Reports describes the tables involved and opens cursors. Any change to the tables after that will not be seen by the report.

Restrictions

- If you are sending your report output to the Paper Design view or Previewer, you should note that some or all of the report triggers may be fired before you see the report output. For example, suppose that you use SRW.MESSAGE to issue a message in the Between Pages trigger when a condition is met. If there are forward references in the report (for example, a total number of pages displayed before the last page), Oracle Reports may have to format ahead to compute the forward references. Hence, even though you have not yet seen a page, it may already have been formatted and the trigger fired.

- In report triggers, you can use the values of report-level columns and parameters. For example, you might need to use the value of a parameter called COUNT1 in a condition (for example, IF :COUNT1 = 10). Note, though, that you cannot reference any page-dependent columns (that is, a column with a Reset At property set to Page) or columns that rely on page-dependent columns.

- In the Before and After Parameter Form, and Before and After Report triggers, you can set the values of parameters (for example, give them a value in an assignment statement, :COUNT1 = 15). In the Before and After Report triggers, you can also set the values of report-level, placeholder columns.

- In the Between Pages trigger, you cannot set the values of any data model objects. Note also that the use of PL/SQL global variables to indirectly set the values of columns or parameters is not recommended. If you do this, you may get unpredictable results.

- A lexical reference cannot be used to create additional bind variables after the After Parameter Form trigger fires. For example, suppose you have a query like the following (note that the `WHERE` clause is replaced by a lexical reference):

  `SELECT ENAME, SAL FROM EMP &WHERE_CLAUSE`

  If the value of the `WHERE_CLAUSE` parameter contains a reference to a bind variable, you must specify the value in the After Parameter Form trigger or earlier. You would get an error if you supplied the following value for the parameter in the Before Report trigger. If you supplied this same value in the After Parameter Form trigger, the report would run.

  `WHERE SAL = :new_bind`

See also

Section 3.13.3.5, "Creating a report trigger"

Section 3.13.3.6, "Deleting a report trigger"

#### 2.6.13.2 About format triggers

A format trigger is a PL/SQL function executed before an object is formatted. A trigger can be used to dynamically change the formatting attributes of the object. For example, you can use a format trigger to cause a value to display in bold if it is less than zero. Another example is to use a format trigger to use scientific notation for a field if its value is greater than 1,000,000.

A format trigger can fire multiple times for a given object, whenever Reports Builder attempts to format the object. Consider the case where Reports Builder starts to format the object at the bottom of a page. If the object does not fit on the page, Reports Builder stops formatting and reformats on the following page. In this case, the format trigger will fire twice. It is therefore not advisable to do any kind of "persistence" operation, such as logging, in this trigger.

The Reports Builder SRW built-in package contains PL/SQL procedures with which you can quickly change the format attributes of an object. These include procedures to:

- change the border pattern and color of an object

- change the interior pattern and color of an object

- change the font size, style, weight, spacing, and justification of a field or boilerplate text

- change the format mask of a field

- access a field's value

Examples

See the topic "Format trigger" in the Reference section of the Oracle Reports online Help.

See also

Section 3.13.4.1, "Creating or editing a format trigger"

#### 2.6.13.3 About validation triggers

Validation triggers are PL/SQL functions that are executed when parameter values are specified on the command line and when you accept the Runtime Parameter Form.

Note: For JSP-based Web reports, the Runtime Parameter Form displays when you run a report in Reports Builder, but does not display in the runtime environment. If parameters are not specified on the Runtime Parameter Form, the validation trigger returns false and generates error message `rep-546 Invalid Parameter Input error`. Thus, you need to provide the parameters in an alternate way, as described in Section 1.9.4, "About Parameter Forms for Web reports".

Validation triggers are also used to validate the Initial Value property of the parameter. Depending on whether the function returns TRUE or FALSE, the user is returned to the Runtime Parameter Form.

Example

See the topic "Validation trigger" in the Reference section of the Oracle Reports online Help.

See also

Section 3.11.4, "Validating a parameter value at runtime"

#### 2.6.13.4 About database triggers

Database triggers are procedures that are stored in the database and implicitly executed when a triggering statement such as INSERT, UPDATE, or DELETE is issued against the associated table. Triggers can be defined only on tables, not on views. However, triggers on the base table of a view are fired if an INSERT, UPDATE, or DELETE statement is issued against a view.

A trigger can include SQL and PL/SQL statements that execute as a unit, and can invoke other stored procedures. Use triggers only when necessary. Excessive use of triggers can result in cascading or recursive triggers. For example, when a trigger is fired, a SQL statement in the trigger body potentially can fire other triggers.

By using database triggers, you can enforce complex business rules and ensure that all applications behave in a uniform manner. Use the following guidelines when creating triggers:

- Use triggers to guarantee that when a specific operation is performed, related actions are performed.

- Use database triggers only for centralized, global operations that should be fired for the triggering statement, regardless of which user or database application issues the statement.

- Do not define triggers that duplicate the functionality already built into Oracle. For example, do not define triggers to enforce data integrity rules that can be easily enforced using declarative integrity constraints.

- Limit the size of triggers (60 lines or fewer is a good guideline). If the logic for your trigger requires much more than 60 lines of PL/SQL code, it is better to include most of the code in a stored procedure, and call the procedure from the trigger.

- Be careful not to create recursive triggers. For example, creating an AFTER UPDATE statement trigger on the EMP table that itself issues an UPDATE statement on EMP causes the trigger to fire recursively until it has run out of memory.

For additional information about how triggers are used in applications, see the Oracle Application Developer's Guide. See the Oracle Concepts Manual for more information about the different types of triggers.

See also

Section 3.13.3.7, "Creating a database trigger"

## 2.7 Templates

The topics in this section discuss the use of templates in Reports Builder.

- About templates

- About template attributes

- About applying templates

- About inheritance in templates

- About the Template Editor

### 2.7.1 About templates

Templates define common characteristics and objects that you want to apply to multiple paper-based reports. For example, you can define a template that includes the company logo and sets fonts and colors for selected areas of a report.

When you use the Report Wizard to create a paper-based report, you use the Templates page of the wizard to apply a template (.tdf file) to the report. The Templates page lists the default templates, as well as any templates that you have created.

Note: If the list of templates does not appear, make sure that the REPORTS_PATH environment variable includes the location of the templates (for example, `ORACLE_HOME``\reports\templates`).

When you choose a template, objects in the margin area of a template are imported into the same locations in the current report section, overwriting any existing objects. The characteristics (formatting, fonts, colors, and so on) of objects in the body area of the template are applied to objects in the body area of the current report section. Any template properties, parameters, report triggers, program units, and attached libraries you have defined are also applied. You can apply different templates to each section of the report. However, if you are applying one of the default templates, you cannot combine two report blocks that use different default templates in a single report. All of your report blocks in any one report must use the same default template.

If you later apply another template to a report, the existing template objects will be deleted in the current report section.

See also

Section 3.12, "Define a Template"

### 2.7.2 About template attributes

In the Layout Body area of a template, you can define Default and Override attributes under the following Object Navigator nodes:

- Frames, which contains the following:

  - a Section Frame node, which defines attributes for the parent frame surrounding the currently selected section.

  - a Headings Frame node, which defines attributes for the parent frame surrounding the column headings.

  - a Fields Frame node, which defines attributes for the parent frame surrounding the fields.

  - a Summaries Frame node, which defines attributes for the parent frame surrounding the summaries (totals).

- Field Labels/Headings, which contains the following:

  - a Character node, which defines attributes for the labels or column headings of character fields.

  - a Number node, which defines attributes for the labels or column headings of number fields.

  - a Date node, which defines attributes for the labels or column headings of date fields.

- Fields, which contains the following:

  - a Character node, which defines attributes for character fields.

  - a Number node, which defines attributes for number fields.

  - a Date node, which defines attributes for date fields.

- Summary Labels, which contains the following:

  - a Character node, which defines attributes for the labels of summaries on character fields.

  - a Number node, which defines attributes for the labels of summaries on numeric fields.

  - a Date node, which defines attributes for the labels of summaries on date fields.

- Summaries, which contains the following:

  - a Character node, which defines attributes for summaries on character fields.

  - a Number node, which defines attributes for summaries on number fields.

  - a Date node, which defines attributes for summaries on date fields.

Default attributes

The Default node in the Object Navigator defines the default visual attributes (formatting, fonts, colors, and so on) for all report styles. If you want to define attributes for individual report styles, you do so under the Override node. When you apply a template to a report, all Default attributes are applied to the report, except for attributes that are localized under the Override node.

Override attributes

Under the Override node in the Object Navigator, you can define attributes for individual report styles. Each report style contains one or more sections that map to groups in the report:

Single-section report styles: Tabular, Form, Mailing Label, Form Letter

Multiple section report styles: Group Left, Group Above, Matrix, Matrix with Group

For the report styles that support multiple groups, you can create additional sections as needed. Sections are mapped to groups as follows:

Same number of groups as sections: one-to-one mapping (the first section is mapped to the first group, the second section to the second group, and so on).

More groups than sections: one-to-one mapping until the next-to-last section. Then, all subsequent groups are mapped to the next-to-last section, and the last group is mapped to the last section. If only one section exists, all groups are mapped to it.

More sections than groups: one-to-one mapping until the next-to-last group. Then, the last group is mapped to the last section.

See also

Section 3.12.2, "Defining default template attributes"

Section 3.12.3, "Defining override template attributes"

### 2.7.3 About applying templates

When you apply a template to a report, all of the following objects, properties, and attributes from the template are applied to the current report section:

- parameters and their validation triggers

- physical page size

- logical page size

- character/bitmap mode

- margin position

- panel print order

In addition, all of the layout objects in the margin of the template are copied into the same location in the current report section.

Usage notes

- The template will be applied to the current section of the report (the section displayed in the Paper Layout view) by default. If no section is displayed, the template will be applied to the Main Section of the report by default. If you select the node for the entire report in the Object Navigator, the template will be applied to the Main Section of the report by default. To apply the template to a specific section of your report, select the node for that section in the Object Navigator.

- You can apply different templates to each section of the report. However, if you are applying one of the default templates, you cannot combine two report blocks that use different default templates in a single report. All of your report blocks in any one report must use the same default template.

See also

Section 3.12.4, "Applying a template to a report"

### 2.7.4 About inheritance in templates

In templates, Sections, Frames, Fields, Labels, Headings, and Summaries properties all may inherit their values.

Default properties

The Default properties inherit the values preset by Reports Builder. When a property is set to its default Reports Builder value, the icon next to it in the Property Inspector is a small circle. Default properties become localized when you change their values, or select them and click the Localize Property button in the toolbar. When a property is localized, the icon next to it changes to a square. To return the properties to their inherited values, select the properties and click the Inherit Property button in the toolbar.

Override properties

The properties of Override Sections inherit their values from the Default properties. When a property inherits from a Default property, the icon next to it in the Property Inspector is an arrow. Properties in the Override Sections become localized when you change their values, or select them and click the Localize Property button in the toolbar. When a property is localized, the icon next to it changes to an arrow with a red cross through it. To return the values of properties in the Override Sections to their inherited values, select the properties and click the Inherit Property button in the toolbar.

### 2.7.5 About the Template Editor

The Template Editor is a work area in which you can define objects and formatting properties for your templates. It is similar to the Paper Layout view of the Report Editor. You can create, delete, and modify objects (for example, page numbers, text, and graphics) in the margin area. You cannot create and delete objects in the body area, but you can modify the properties of body objects in the Property Inspector (Tools > Property Inspector).

The Report Style list enables you to view the layout for a selected report style. To define default settings for all report styles, you can choose Default from the Report Style list. To make changes for an individual report style, you can select that report style from the Report Style list to specify settings that override the default.

Access

You can access the Template Editor in the following ways:

When creating a new template:

- Choose File > New > Template.

- In the Object Navigator, click the Templates node, then click the Create button in the toolbar.

When displaying an existing template:

- From the Window menu, choose a window displaying Template Editor Paper Layout view.

- In the Object Navigator, double-click the view icon next to the Paper Layout node for a template.

## 2.8 Output Formats and Capabilities

The topics in this section discuss the various output formats and capabilities in Reports Builder.

- About format order

- About batch reporting

- About report distribution

- About pluggable destinations

- About event-driven publishing

- About switching the printer tray

- About XML in reports

- About HTML and HTMLCSS output

- About HTML formatting

- About PDF output

- About RTF output

- About delimited output

- About spreadsheet output

- About text output

- About creating an ASCII (character-mode) report

### 2.8.1 About format order

In prior releases, Oracle Reports formatted the sections of a report in sequential order: Header section, followed by Main section, followed by Trailer section. This release introduces the capability to change the order in which the three sections of a report are formatted.

Note: Regardless of the order in which the report sections are formatted, the output order is unchanged: Header section first, then Main section, then Trailer section.

The format order can be set in either of the following ways:

- Format Order of Sections property

- SRW.SET_FORMAT_ORDER built-in procedure (if defined, overrides the Format Order of Sections property setting)

This feature is useful for formatting any report section first to retrieve information that is known only at the time of formatting, such as page numbers, then using that information in the formatting of a previous section.

For example, to create a table of contents (TOC) for a report, you can format the Main section first and use report triggers to build a table containing the TOC entries. When the first element for the TOC is formatted, a trigger fires and creates a row in the TOC table containing the TOC entry and the page number. After the Main section has completed formatting, the format order setting can define that the Header section is formatted next. The Header section can contain a report block based on the TOC table. After formatting, you can output your report with a TOC (the Header section), followed by the report body (the Main section), followed by the Trailer section.

For the steps to create a TOC for a report, see the example reports in Chapter 35, "Building a Paper Report with a Simple Table of Contents and Index" and Chapter 36, "Building a Paper Report with a Multilevel Table of Contents".

A note about page numbering:

The page numbering of a report follows the format order. For example, in a report with a Header section of 2 pages, a Main section of 8 pages, and a Trailer section of 3 pages, with Format Order set to Main-Trailer-Header, the page numbering will be as follows in the report output: 12, 13 (Header pages, which were formatted last), 1, 2, 3, 4, 5, 6, 7, 8, (Main pages, which were formatted first) 9, 10, 11(Trailer pages, which were formatted second).

### 2.8.2 About batch reporting

If it is not necessary to examine report output in the Previewer (for example, you may have to generate large volumes of output from a fully-tested report or run several reports in succession), you can run your report in batch using `rwrun`. This leaves you free to pursue other tasks while your reports are running.

You can run reports in batch mode from the command line, or use a command file to specify arguments. A command file can save you a great deal of typing if you wish to run several reports using the same set of arguments.

You can also use the Reports Server to batch process reports by specifying `BACKGROUND=YES` on the command line (valid for `rwclient`, `rwcgi`, or `rwservlet`) to run reports asynchronously (the client sends the call to the server, then continues with other processes without waiting for the report job to complete; if the client process is killed, the job is canceled).

See also

Section 3.7.2, "Running a report from the command line"

Section 3.7.3, "Running a report using a command file"

The Reference > Command Line section of the Oracle Reports online Help (for information about `BATCH` and `BACKGROUND`)

### 2.8.3 About report distribution

Report distribution enables you to design a report that can generate multiple output formats and be distributed to multiple destinations from a single run of the report. You can create distributions for an entire report, and for individual sections of the report. For example, in a single run of a report, you can generate HTML output, send a PostScript version to the printer, and also e-mail any or all sections of the report to a distribution list.

To distribute a report, you first define the distribution, then enable the distribution, as described in Section 3.7.12, "Distributing a report to multiple destinations".

For an example of using section-level distribution, see Chapter 37, "Bursting and Distributing a Report". This chapter covers defining distribution of a single section to multiple destinations, using the Repeat On property and distribution XML file.

Usage notes

- You cannot mix character mode and bit-mapped output in one report. The `MODE` system parameter can only be set to one value per the entire report (`DEFAULT`, `BITMAP`, or `CHARACTER`).

Examples

Example 1

You can use sectioning and distribution to publish your report output in HTML, and also send a PostScript version to the printer.

Example 2

You can send an executive summary of the report to senior management, and also e-mail detailed breakdowns to individual managers. In this example, a single report with two report sections needs to be created: a portrait-sized summary section and a landscape-sized detail section. Use the Repeat On property to associate the detail section with a data model group that lists the managers and then alter the destination on each instance of the data model group to send the output to the appropriate managers.

See also

Section 2.1.2, "About report sectioning and sections"

Section 3.14.19, "Tracing report distribution"

"Creating Advanced Distributions" in the Oracle Application Server Reports Services Publishing Reports to the Web manual.

#### 2.8.3.1 About the DST file

As an alternative to defining the distribution for a report or report section in the Distribution dialog box, you can also create a DST file and specify its name on the command line with the DESTINATION keyword to distribute the report.

Note: This method is supported for backward compatibility; the preferred and recommended method of distributing reports is with the Distribution dialog box or using XML, as described in the chapter "Creating Advanced Distributions" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page (`http://www.oracle.com/technology/documentation/reports.html`).

If a DST file is specified on the command line, the distribution that it defines overrides the distribution defined using the Distribution dialog box.

Note: If you trace report distribution to identify distribution errors (see Section 3.14.19, "Tracing report distribution"), the trace file format is very similar to the DST file, so you can cut and paste to generate a DST file from the trace file.

The format of each line of a DST file is as follows:

    dist_ID: output_def

where

`dist_ID` is an identifier for a distribution destination.

`output_def` is a series of `rwrun` or `rwclient` command line keywords that specify the distribution definition. In addition, the following parameter is valid:

LEVEL specifies the scope of the distribution.

Values for LEVEL

`REPORT` means that the distribution applies to the entire report.

`Header_Section` means that the distribution applies to the header section only.

`Main_Section` means that the distribution applies to the main (body) section only.

`Trailer_Section` means that the distribution applies to the trailer section only.

Default

`REPORT`

Example

The definition in this example sends report output to an HTML file, 3 copies of the main section to a printer, and the header section to a PDF file.

    ;dst file (specified with the DESTINATION keyword on the command line)
    DEST1: DESNAME=testdst1.HTM DESTYPE=file
    DESFORMAT=HTML COPIES=1 LEVEL=Report
    DEST2: DESNAME=\\luna\2op813 DESTYPE=printer
    DESFORMAT=BITMAP COPIES=3
    LEVEL=Main_Section
    DEST3: DESNAME=SECTION1.pdf DESTYPE=file
    DESFORMAT=pdf COPIES=1
    LEVEL=Header_Section

See also

Section 2.1.2, "About report sectioning and sections"

### 2.8.4 About pluggable destinations

Pluggable destinations can be used to distribute any content that an engine (not only the Oracle Reports engine) has created in the Reports Server's cache. Oracle Reports provides the following out-of-the-box destinations:

- Web

- printer

- e-mail

- file

- OracleAS Portal

- FTP

- WebDAV

You can also define access to your own custom destination by using the Oracle Reports Java APIs to implement a new destination component in the Reports Server. You can choose for your jobs to use an out-of-the-box destination or your customized destination to determine the destination for the output in the cache.

For information and steps to implement and register a destination class, then use the destination with Oracle Reports, see the Oracle FTP Destination tutorial available on the Oracle Reports Plugin Exchange on the Oracle Technology Network (OTN): on the Oracle Reports 10g page (`http://www.oracle.com/technology/products/reports/index.html`), click Plugin Exchange.

Note: Currently there is no support for FTP and WebDAV destinations from the Reports Builder environment. However, these destinations are supported from the Reports Runtime and the Reports Server environments.

See also

"Configuring Destinations for OracleAS Reports Services" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page ().

### 2.8.5 About event-driven publishing

Event-driven publishing enables you to set up a report to execute when a certain action has been performed. For example, when an employee submits an expense report, new data is being inserted into the database. When this insert event (for example, a database trigger or an Advanced Queuing (AQ) message) occurs, a report is sent to the employee's manager through their portal page or e-mail notifying them to approve/reject this expense report.

With Oracle Reports 10g (9.0.4), event-driven publishing functionality was enhanced to make report objects available inside Oracle Workflow.For detailed information, refer to the chapter "Event-Driven Publishing" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page ().

### 2.8.6 About switching the printer tray

Using the Before Report, Between Pages, or format triggers, you can switch to different printer trays as your report formats. This enables you to easily print pages of the same report on different sheets of paper (for example, letterhead, forms, colored).

You can determine the names of the printer trays defined for your printer in the Page Setup dialog box, then use SRW.SET_PRINTER_TRAY to set the printer tray as desired.

See also

Section 3.7.17.5, "Switching the printer tray"

### 2.8.7 About XML in reports

Oracle Reports uses XML (Extensible Markup Language) in the following ways:

- XML tags are used to define Web-based reports (see the topic "Oracle Reports XML tags" in the Reference section of the Oracle Reports online Help).

- XML is used to define tag-delimited, structured information.

- XML is a supported pluggable data source (PDS). For more information, see Chapter 44, "Building a Report with an XML Pluggable Data Source".

XML is a form of encoding text formats that can be read by many different applications. The XML tags can be used to output information or as a basis for building a pluggable data source to exchange electronic data with a third-party application (EDI).

You may change the XML properties that control XML output for your report at three levels: report, group, and column. Note that in any Reports Builder-generated XML file, your output mimics the data model, structured by groups and columns. For information on how to view your changes in XML output, see Section 3.7.7, "Generating XML output".

For detailed information about using XML for report distribution and customizing reports through XML, see the chapters "Creating Advanced Distributions" and "Customizing Reports with XML" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page ().

See also

Section 3.7.7, "Generating XML output"

Section 3.7.1, "Running and dispatching a report from the user interface"

The XML PDS section of the Oracle Reports online Help

### 2.8.8 About HTML and HTMLCSS output

Reports Builder can generate report output to Hypertext Markup Language (HTML) and Hypertext Markup Language with a Cascading Style Sheet (HTMLCSS) files, containing the formatted data and all objects. HTML is a form of encoding text formats that can be read by many different Web page developing software packages, such as Microsoft Front Page, and Web browsers. You can use the software's editing and graphics features to modify and enhance your report output. When you generate your report output to an HTML or HTMLCSS file, you can distribute the output to any HTML destination, including e-mail, printer, OracleAS Portal, and Web browser.

Note: This topic discusses the HTML generated when you run a paper-based report to an HTML or HTMLCSS file. This is unrelated to HTML that might be generated when you run a JSP-based Web report (when you click the Run Web Layout button in the toolbar, or choose Program > Run Web Layout).

Usage notes

- 10g Release 2 (10.1.2) introduces HTMLCSS enhancements, which include the capability to apply style sheets and user-defined styles to your report or report objects for HTMLCSS output, using the following new properties:

  - Style Sheets property

  - CSS Class Name property

  - CSS ID property

- Also new in Oracle Reports 10g Release 2 (10.1.2) is support for HTML formatting in all bitmap output supported by Oracle Reports (including PDF, RTF, HTML, HTMLCSS, and PostScript), as described in Section 2.8.9, "About HTML formatting".

- Beginning with Oracle Reports 10g Release 2 (10.1.2), HTML and HTMLCSS output pass HTML 4.01 syntax checkers.

  Note: If you modify your report's Before Report Value property or After Report Value property, you must make sure that you specify valid HTML. If the HTML is not valid, the generated HTML report output may not pass HTML 4.01 syntax checkers.

- You can preview your HTML or HTMLCSS report output in your Web browser by choosing File > Preview Format > Paginated HTML (or Paginated HTMLCSS).

- Bookmarks cause multiple HTML files to be created. One master file is created with two frames: one for bookmarks and one for the report output. One HTML file is created for each of these frames. The master document filename is the name specified in the DESNAME parameter. The bookmark filename is `desname` `b.htm`. The report output filename is `desname` `d.htm`.

- Linked images, image fields, and graphs in a report cause GIF files to be created and referenced from the HTML document. Note that even if the linked boilerplate or image field refers to an external GIF file, a new GIF file is generated.

- If an image is stored in the database, one GIF file may be generated for each occurrence of the image in the report. If an image is stored in a file (for example, imported images, linked boilerplate, or image fields that reference files), only one GIF file will be generated per image regardless of how many times it is repeated in the report.

- Any GIF image files generated for HTML output have a number sequence (for example, `desname` `0.gif`... `desname` `17.gif`).

- A comment block in the master document contains the names of all of the files that are associated with the master document.

- HTML has seven sizes for text. The font sizes in the report are mapped according to the following table. Note that the user can override the size specified in the HTML file from their browser.

Table 2-1 Report to HTML font sizes

Report font size | HTML font size
--- | ---
less than 8 | 1
8 through 9 | 2
10 through 12 | 3
13 through 15 | 4
16 through 20 | 5
21 through 30 | 6
more than 30 | 7

Note: If the font used in the report is non-proportional, TeleType mode is turned on for the generated HTML file.

- HTML does not have the concept of a page. A separator line is placed between each page of the report. Depending upon the browser, you may or may not need to scroll to see the entire report page. Furthermore, if you print the HTML document from your browser, the printer will not necessarily print the separator lines at the bottom of each page. If you do not want the separator line or you want to use a different separator line, you can use SRW.SET_AFTER_PAGE_HTML to change it.

- For HTMLCSS, graphics and text can be overlapped.

- Once you have generated your report to an HTML or HTMLCSS file, the data model and looping tags are removed and replaced with the data. You can open the HTML or HTMLCSS file in Reports Builder, but it will be a static text file and not a report.

- For information about paginating HTML or HTMLCSS output, see Section 2.8.8.1, "About HTML page streaming".

Restrictions

- Objects cannot overlap one another. For example, you could not have text on top of an image.

  - If objects overlap slightly (two characters or less), then the underneath object is truncated to prevent overlap.

  - If objects overlap significantly (or one is completely on top of the other), then the underneath object is removed altogether. In this case, any linking information of the removed object is transferred using the same rules as if it were a frame (see the rules about frames below).

  - Text always takes precedence over horizontal lines, regardless of which is on top. This prevents the line underneath a column label from eliminating the label text.

- When multiple output files are generated (for example, when bookmarks are used), any file except the master file will be overwritten without confirmation. For example, GIF files and bookmark files would be overwritten without prompting.

- Report frames are not visually represented in the HTML output. Any fill or border attributes of frames do not appear in HTML output.

- If the frame in a report is the target of a link or a bookmark, that attribute is transferred to the visible object nearest to the upper left corner of the frame in HTML output. If the frame object is a hyperlink, that attribute will be transferred to all the child (interior) objects that are not hyperlinks. If the hyperlink attribute cannot be transferred to the child objects, the frame's hyperlink is lost.

- The only drawn object supported in HTML is a solid, black, horizontal line. The line width specified in the report may be honored depending upon the browser. All other drawn objects (for example, rectangles or circles) in the report layout will not show up in the HTML output. Space for these drawn objects is reserved, but there is no visible representation in the HTML output.

- Background (fill) and border (line) colors/patterns for text are not available in HTML. Bold, italic, underline, and foreground (text) color are supported if the browser supports them.

- The PDF action attribute is ignored for HTML output.

- Any browser customizations that have been made will affect how the generated HTML is displayed.

See also

Section 1.2.2, "About Web reports"

Section 2.2.3, "About Web links for HTML output"

Section 3.7.5, "Generating HTML or HTMLCSS output"

Section 3.9.2.3, "Creating a boilerplate text object for HTML tags"

Section 3.9.2.7, "Linking an HTML text object to a file"

Section 3.8.4, "Selecting HTML tags from the database"

#### 2.8.8.1 About HTML page streaming

HTML page streaming enables you to display individual pages of your HTML/HTMLCSS report output in your Web browser, without having to download the entire report. From the first page of the report, you can navigate to any page in the rest of the report. When you click a bookmark or hyperlink with a destination:

- within the report, the frame that contains the current page will update with the destination page.

- outside the report, the entire base frame (including the bookmark frame, the page, and the navigation frame) will reload.

Navigation controls

You can specify the navigation controls script for a report in either of the following ways:

- with PL/SQL (SRW.SET_PAGE_NAVIGATION_HTML in a Before Report trigger)

- in the Report Property Inspector with the Page Navigation Control Type and Page Navigation Control Value properties

Output file names

With HTML page streaming, each page is formatted as a separate HTML document. If your HTML file is named `myreport.htm` and there are no bookmarks, the new files are named as follows:

- `myreport.htm` (for the base frame)

- `myreportb.htm` (for the bookmark file, present only if bookmarks are used in the HTML files)

- `myreport_1.htm` through `myreport_`n.htm (for the pages)

- `myreportj.htm` (for the navigation JavaScript)

Scope of HTML output

To specify HTML to be displayed on only the first (header) or last (footer) pages of your report, set the Before Report or After Report properties or use the `SRW.SET_BEFORE_REPORT_HTML` or `SRW.SET_AFTER_REPORT_HTML` PL/SQL procedures. To specify global HTML to apply to the entire report, such as background colors or images, set the Before Page properties or `SRW.SET_BEFORE_PAGE_HTML` PL/SQL procedure. The Reports Builder-generated HTML logo appears only on the last page of your report.

Enabling page-streamed output

To enable page streaming when you format your report as HTML or HTMLCSS output, you must specify `PAGESTREAM=YES` on the command line. This option cannot be set using the Reports Builder user interface.

See also

Section 3.7.16.5, "Displaying individual pages of HTML report output"

Section 3.6.10.1.12, "Adding navigation controls for HTML page-streamed output using the Property Inspector"

Section 3.6.10.2.11, "Adding navigation controls for HTML page-streamed output using PL/SQL"

### 2.8.9 About HTML formatting

Oracle Reports allows a variety of fonts, styles, and colors for text objects in your reports. Through the use of the `SRW` built-in procedures (see the Reference section of the Oracle Reports online Help), you can allow end users to change text attributes at runtime to a whole object, but not to a section of the text (for example, different formatting for different parts of a text object). In prior releases, if a column contained rich text content, such as formatting instructions embedded within the text, this formatting was not interpreted or applied in the report output. While this limitation could be overcome by using HTML tags for formatting and setting the object's Contains HTML Tags property to Yes, the formatting could be seen only in HTML or HTMLCSS output; for reports generated to other output formats (for example, PDF, RTF, PostScript), the HTML tags themselves were shown in the output.

Oracle Reports 10g Release 2 (10.1.2) introduces text formatting enhancements that allow you to use a defined set of HTML formatting tags to format text style (bold, italics, underline, and strikethrough) and text attributes (font name, font color, and font size), and generate formatted text objects in all bitmap output formats supported byOracle Reports when the objects' Contains HTML Tags property is set to Yes.

The text objects can have static values as in boilerplate text objects, or dynamic values as in field objects or text file link objects. A boilerplate text object can also have dynamic values if it references a field object or a report-level column. For boilerplate text, the formats specified at design-time are merged with rich text formats obtained at runtime. This feature also supports multibyte text containing HTML tags.

In the Paper Design view or Paper Layout view, you can choose the objects to which HTML formatting should be applied by setting their Contains HTML Tags property to Yes. If you run the report from the command line with `CONTAINSHTMLTAGS=NO`, Oracle Reports will not interpret the HTML tags for the report, regardless of the object's Contains HTML Tags property setting. For HTML and HTMLCSS ouput, the browser will interpret the HTML formatting tags; for other output formats, the HTML tags themselves will appear as is in the report output.

The following HTML tags are interpreted by Oracle Reports if they appear in a boilerplate text, text file link, or field object. Any HTML tags or attributes not listed appear as is in non-HTML/HTMLCSS report output.

Table 2-2 Supported HTML tags

Tag | Result
--- | ---
`<b>` `<strong>` | Text enclosed in either of these tags will be bold. For example:If the text is formatted as `<b>my format</b>` the output will appear as my format
`<i>` `<em>` | Text enclosed in either of these tags will be italics. For example:If the text is formatted as `<i>my format</i>` the output will appear as my format
`<u>` | Text enclosed in this tag will be underlined. For example: If the text is formatted as `<u>my format</u>` the output will appear as my format
`<s>` `<strike>` | Text enclosed in either of these tags will be struck through. For example: If the text is formatted as `<s>my format</s>` the output will appear with a line struck through it.
`<span>` | Generic style container, used to specify font family, size, and color attributes, as described in Table 2-3. For example: `<span style="font-family:Times New Roman; font-size:10pt; color:rgb (255,0,0);">my format</span>` the output will appear in Times New Roman font, size 10 point, in red color.

The following are the supported properties for the `span` tag's `style` attribute:

Table 2-3 Supported properties for style attribute of span tag

Property | Result
--- | ---
`font-family` | This property specifies the font name. Oracle Reports provides support for specifying only one font name. If you specify a comma-separated list containing more than one font name, Oracle Reports uses the system default font (usually Courier, or its equivalent) to render this tag, without generating a warning. For example: `font-family: Arial`
`font-size` | This property describes the size of the font.CSS level 2 specifies the following options for this property: `absolute_size`|`relative_size`|`length`|`percentage` Oracle Reports provides support for only `absolute_size` and `length`. where: `absolute-size` is: `xx-small | x-small | small | medium | large | x-large | xx-large` `xx-small` is 7 points `x-small` is 8 points `small` is 10 points `medium` is 12 points `large` is 14 points `x-large` is 17 points `xx-large` is 20 points `length` is: `font_size` `px |` `font_size` `pt` For example: `font-size:xx-large font-size:12pt`
`color` | This property describes the color of the enclosing element's text content. Oracle Reports supports the following options for this property: ```color_name``|#``rgb``|#``rrggbb``|rgb(``r_integer``,` `g_integer``,` `b_integer``)|rgb(``r_value%``,` `g_value%``,` `b_value%``)``` where color names and rgb equivalents are as follows: aqua: `#0FF`black: `#000`blue: `#00F` fuchsia: `#F0F` gray: `#7F7F7F` green: `#007F00`lime: `#0F0`maroon: `#7F0000`navy: `#00007F`olive: `#7F7F00`purple: `#7F007F`red: `#F00` silver: `#C0C0C0`teal: `#007F7F`white: `#FFF`yellow: `#FF0` For example: `color:aqua color:#FB0 color:#0FACED color:rgb(100, 245, 33) color:rgb(23%, 45%, 87%)` Note: For `rgb(x, x, x)` specification, color intensity must be specified in percentage (`0-100`) or rgb integer (`0-255`). Any value higher than the allowable range is set to the maximum value. A negative value for any color intensity is invalid. You may mix the percent and rgb integer values for colors; for example: `<span style="color:rgb(100%, 125, 3%)">` is equivalent to: `<span style="color:rgb(255, 125, 8)">` or `<span style="color:rgb(100%, 49%, 3%)">`

Usage notes

- The supported output formats are: PDF, RTF, HTML, HTMLCSS, and PostScript.

- HTML formatting supports interleaving and nesting of tags. For example, if you open an italics tag, it is applied to the point of its corresponding closing tag. If a tag is opened several times, it must be closed the same number of times for its effect to cease.

- Format attributes are not inherited across instances of a text object of the same name or type (for example, if they are enclosed in a repeating frame). If, however, a text object contains multiple lines, formatting instructions are inherited across the lines of this object only.

- This feature supports HTML tags that are hard-coded or referenced in a boilerplate text object. The tags can also be retrieved from a table column with a field object. A file link object that points to a text file which in turn contains HTML tags is also supported.

- Oracle Reports tries to find the closest match according to the following criteria for fonts with the same character set:

  font face > font size > font style > font weight > font width

  If Oracle Reports cannot match the font face, it will try to match the font size; if it cannot match the font size, it will try to match the font style; and so on. For the font lookup alogrithm, refer to the chapter "Managing Fonts in Oracle Reports" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page (). In font lookup, it is possible that the font used does not have all the required attributes (such as style, size, and so on) embedded in data. In this case, the unavailable font attributes do not appear in the report output.

Limitations

- A tag must be specified in its entirety on a single line. If the tag continues to the next line, it is not supported.

  For example:

  `My<b >format</b>`

- Only one font name can be specified in the `span` tag's `style` attribute `font-family` property.

  For example:

  `font-family:Arial`

  If you specify a comma-separated list containing more than one font name, Oracle Reports uses the system default font (usually Courier, or its equivalent) to render this tag, without generating a warning.

- Entities such as `&quot;` are not supported.

  For example:

  `<span style="font-family: &quot;Courier New&quot;;">my format!</span>`

  You must use literal double quote (") instead.

Examples

Example 1: Inline font change

In a boilerplate text object, you can specify the text boilerplate as follows:

`<b>My</b>text`

With the Contains HTML Tags property set to Yes, the formatted output will look like this:

My text

Example 2: Single line text with multiple formats

Assume a span of text (in a boilerplate object or database column) that formats on one line, such as:

`<b>My <span style="font-family:Courier">HTML</span></b><u><span style="font-family:Times New Roman">Formats</span></u>`

With the Contains HTML Tags property set to Yes, the formatted output will look like this:

My `HTML` Formats

Example 3: Multiline text with multiple formats

Assume a span of text that formats on multiple lines, such as:

`Line 1: <i>My<span style="font-family:Courier">Line 2: HTML</span></i><span style="font-family:Times New Roman><u>Line 3: Formatting</u></span>.`

With the Contains HTML Tags property set to Yes, the formatted output will look like this:

Line 1: My `Line 2: HTML` Line 3: Formatting.

Note in the preceding example that the formats are maintained in successive lines.

See also

Section 3.7.5, "Generating HTML or HTMLCSS output"

Section 3.9.2.3, "Creating a boilerplate text object for HTML tags"

Section 3.9.2.7, "Linking an HTML text object to a file"

Section 3.8.4, "Selecting HTML tags from the database"

### 2.8.10 About PDF output

Reports Builder can generate report output to PDF files, containing the formatted data and all objects. When you generate your report output to a PDF file, you can distribute the output to any PDF destination, including e-mail, printer, OracleAS Portal, and Web browser.

Document taxonomy (classification) for PDF output is provided by the report properties Title, Author, Subject, and Keywords, which assist in cataloging and searching a report document.

With font subsetting, the PDF file includes the font information needed to render the PDF, regardless of the availability of that font on the machine used to view the report. PDF font subsetting works for single byte, multibyte, and Unicode fonts, and is the preferred method of creating multibyte reports.

Oracle Reports 10g Release 2 (10.1.2) includes enhancements to PDF output:

- Direct subsetting of True Type fonts (as a Type0 font), no longer converting to Type3 fonts. As a result, PDF output is clearer, smoother, searchable, and accessible.

- Improved True Type Collection (TTC) support, allowing you to use the zero-based index to indicate the specific TTC font file to pick up. In prior releases, Oracle Reports picked up the first font file in the True Type Collection (TTC).

For detailed information about PDF enhancements and capabilities in Oracle Reports, which include compression, font aliasing, font subsetting, font embedding and accessibility tags, refer to the chapter "PDF in Oracle Reports" in the Oracle Application Server Reports Services Publishing Reports to the Web manual, available on the Oracle Technology Network Oracle Reports Documentation page ().

Usage notes

- You can preview your PDF report output in your Web browser by choosing File > Preview Format > PDF.

- If you are building a multibyte report for multibyte languages, such as Chinese or Japanese, and you need to alias the font in PDF output, you need the CID fonts named within the Acrobat 4.0 packs. Otherwise, you do not need the CID fonts in the Acrobat 4.0 packs.

- Oracle Reports does not support Windows UDC for PDF output. For the user-defined characters to be printed or rendered, all the glyphs must be within a single TTF or TTC file.

- Graphics and text can be overlapped.

- The foreground color of the object will be used as the fill color (regardless of a specified pattern).

- You can modify the PDF file, if you have:

  - the fonts used in your report installed on your machine.

  - a PDF writer.

Restrictions

- For PDF output, the bit-mapped drivers (for example, PostScript) for the currently selected printer are used to produce the output.

See also

Section 1.2.2, "About Web reports"

Section 2.2.4, "About Web links for PDF output"

Section 3.7.6, "Generating PDF output"

### 2.8.11 About RTF output

Reports Builder can generate report output to Rich Text Format (RTF) files, containing the formatted data and all objects. RTF can be read by many different word processing software packages, such as Microsoft Word. You can use the software's editing and graphics features to modify and enhance your report output. When you generate your report output to an RTF file, you can distribute the output to any RTF destination, including e-mail, printer, OracleAS Portal, and Web browser.

Usage notes

- Graphics and text can be overlapped.

- Text can only be rotated by 90-degree variations.

- As with PDF output, the foreground color of the object will be used as the fill color (regardless of a specified pattern).

  Note: When you view the report in Microsoft Word in Office 95, you must choose View > Page Layout to see all the graphics and objects in your report.

See also

Section 3.7.8, "Generating RTF output"

Section 3.7.1, "Running and dispatching a report from the user interface"

### 2.8.12 About delimited output

Oracle Reports can generate report output that includes a delimiter to delimited files (for example, files that contain comma-separated or tab-separated data), which are easily imported into spreadsheets or for use with word processors.

Oracle Reports provides two options for generating delimited output:

- Delimited: uses the paper layout to generate the output.

- DelimitedData (for use when you have problems running large volume reports with Delimited): does not take into account the paper layout, and directly runs off the data model (that is, all fields that are available in the data model will appear in the output, not only those that are displayed in paper layout).

You can specify a delimiter (a character or string of characters) to separate the data (boilerplate or field objects) in your report output in either of the following ways:

- On the command line using the `DELIMITER` keyword.

- In the Delimited Output dialog box or DelimitedData Output dialog box (displayed with File > Generate to File > Delimited or File > Generate to File > DelimitedData) in Reports Builder.

Note: If you do not specify a delimiter, the default delimiter is a tab.

You can further distinguish the cells by using a cell wrapper. A cell wrapper can consist of any series of characters, such as a comma or parentheses.

For example, if the data in your report output include the same character as the delimiter (for example, a comma), you can use the parentheses cell wrapper to distinguish each cell:

    (1,000,000),(3,6000),(543),(2,003,500)…

Usage notes

DelimitedData output:

When you generate a report to DelimitedData output, only data (as defined by the report data model) displays in the output. Any formatting changes defined in the layout are not reflected in the DelimitedData output.

You can set the following column properties to alter column names and exclude columns from the DelimitedData output file:

- The XML Tag property can be used to enter a column alias.

- The Exclude from XML Output property can be used to exclude the column from the DelimitedData output.

To generate report output that preserves the report layout information, see Section 2.8.13, "About spreadsheet output".

Delimited output:

When you generate a report to Delimited output, the data displays according to the positions of the objects in the Paper Layout view.

- If you place A above or to the left of B (where A and B are any boilerplate or field objects) Reports Builder displays each instance of A before each instance of B in every line of output.

Figure 2-8 Delimited output of A above B

Description of "Figure 2-8 Delimited output of A above B"

- If you create a frame that contains a boilerplate object (A) and encloses a repeating frame that contains a field object (B), each instance of A displays with each instance of B.

Figure 2-9 Delimited output of frame enclosing repeating frame

Description of "Figure 2-9 Delimited output of frame enclosing repeating frame"

- In the previous layout, if you add another frame that contains a boilerplate object (C) and encloses another repeating frame that contains a field object (D), A displays for every instance of B, and then C displays for every instance of D.

Figure 2-10 Delimited output of two frames enclosing repeating frames

Description of "Figure 2-10 Delimited output of two frames enclosing repeating frames"

- If you create a matrix in your report, be sure to align your objects carefully according to the grid in the Layout Model view. If the objects are not aligned, Reports Builder may interpret the extra space as an extra row or column and disrupt your report output.

- If you create a boilerplate object outside of a matrix, each instance of the boilerplate repeats with every row (not column) of the matrix. Note that boilerplates contained in the matrix will not be repeated with field objects outside of the matrix.

Figure 2-11 Delimited output of boilerplate outside matrix

Description of "Figure 2-11 Delimited output of boilerplate outside matrix"

Restrictions

- If the text file contains a field labeled `ID` (in uppercase) as the first field, you will be unable to open the file in Microsoft Excel. The following delimited output causes an error in Excel:

  `ID, name, title, dept`

  If you want to generate delimited output that contains an `ID` field, try changing the database column name to lowercase (that is, `id`), or re-arranging the order of the fields.

- Distribution and bursting are not supported in delimited output. You cannot specify a `DELIMITED` or `DELIMITEDATA` output format in a `distribution.xml` file or in the Distribution dialog box.

See also

Section 3.7.10, "Generating delimited output"

Section 3.7.1, "Running and dispatching a report from the user interface"

Section 1.2.2, "About Web reports"

### 2.8.13 About spreadsheet output

Beginning with 10g Release 2 (10.1.2), Oracle Reports introduces a new output format, which enables you to generate output from paper layout report to HTML files that can be directly opened with Microsoft Excel 2000. Using the new `DESFORMAT=SPREADSHEET`, you can:

- Generate report output to spreadsheet format from existing paper layout reports saved in any format (`.rdf`, `.xml`, `.jsp`), using `rwrun` or Reports Server clients (`rwcgi`, `rwclient`, `rwservlet`). See the Example below.

- Preserve the rich layout formatting such as colors, fonts, conditional formatting, graphs, and images.

Note: `DESFORMAT=SPREADSHEET` behavior is the same as the functionality of the `rw:include` JSP tag. Spreadsheet output is not paginated; no page setup information is written in the output, and it is formatted as a single worksheet. Spreadsheet output is driven by the layout; the reports ouput displays objects that are in the body area of each section (Header, Main, and Trailer) of the paper layout, and does not format any content in the margin, header, or footer areas.

Prerequisites

- Microsoft Excel 2000 (on the client machine for viewing the output). Note that this software is not needed on the machine where OracleAS Reports Server is running.

Usage notes

- To change the name of the output worksheet, set the report's Title property.

- Only bitmapped reports can be generated to spreadsheet output; you cannot generate a character-mode report to spreadsheet output.

- The following paper layout objects are supported in spreadsheet output:

  - text (boilerplate and field)

  - images (any format), including images that are imported, linked, or stored in the database

  - imported drawings, as well as CGM and OWF drawings

  - graphic lines

- The following paper layout objects are not supported in spreadsheet output: graphic arc, polygon, rectangle, rounded rectangle, stretchable line, and OLE external object (for reports developed prior to Oracle9i Reports (9.0.2) ). Space for these drawn objects is reserved, but there is no visible representation in the output. This limitation does not apply to horizontal lines.

- The following font attributes are supported in spreadsheet output: size, face, color, style (italic, oblique, underline, overstrike, outline, shadow), weight (bold, normal, extra bold, extra bold, ultra bold).

- The following Web report properties are supported in spreadsheet output:

  - Hyperlink property

  - Hyperlink Destination property

  - Additional Attributes (HTML) property (for Parameter Form fields)

  - Table Attributes (HTML) property (for frames and repeating frames)

  - Alternative Text property (for images)

  - Contains HTML Tags property (for boilerplate text or field objects that include HTML tags)

- The following report taxonomy properties are supported in spreadsheet output:

  - Title property

  - Author property

  - Subject property

  - Keywords property

- Graphs embedded in spreadsheet output are static image files, and are not interactive. Thus, the Graph Hyperlink property is not supported in spreadsheet output.

- For reports that support globalization, the metadata for `direction` and `charset` must be provided in a before report escape, because this information is not written to the generated output by default. For example, you can define a before report escape as follows:

      <html>
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=&encoding">
      <body dir=&Direction bgcolor="#ffffff">

- The frames and repeating frames defined in the paper layout are translated to tables in the output. You can specify table attributes such as `cellspacing`, `cellpadding`, and `width` using the Table Attributes (HTML) property for frames and repeating frames.

- For reliable formatting of spreadsheet output, the whole layout area should be enclosed in a frame. This prevents the possibility of parallel objects displaying in different vertical positions, one below the other.

- The order of the report sections (Header, Main, and Trailer) is preserved in spreadsheet output; that is, the Header section output appears first, followed by the Main section, followed by the Trailer section.

- If boilerplate objects or fields are not contiguous to each other; that is, if there is a gap between their boundaries, this might result in empty cells in the spreadsheet output.

- The Oracle Reports color palette is used while designing the report. When you generate your report output to spreadsheet output, Microsoft Excel will show the closest matching color from its color palette.

- If you rotate a boilerplate object in the paper layout, the object will appear horizontal in the spreadsheet output.

- The following cell properties are not supported in spreadsheet output: background pattern, border color, and border pattern.

- Images included in the paper layout of the report will appear in the spreadsheet output only if the Reports Server is running in non-secure mode. In the case of a secure Reports Server, images will not appear in the spreadsheet output. This is because generating images in the output involves multiple calls to the Reports Server (one call per image). Once the user is authenticated, Oracle Reports passes the user's identity between the browser and the secure Reports Server using cookies. However, Excel does not support cookies. As a result, the call to the secure Reports Server seems like a call from an non-authenticated user. Thus, the Reports Server refuses to pass on the images. As a workaround, you can generate the spreadsheet output from a secure Reports Server to a URL using WebDAV.

- Summary and formula columns will be shown as values, not as dynamic Excel formulas. Also, the page-level summary columns are reduced to report-level summary columns, since there is no page concept in Excel.

- If you set the Vertical Elasticity property of a frame to Fixed, the output in Excel will show only as many records as could appear on the first page of the paper output. Since Excel does not have a page concept, it is not able to "overflow" the remaining rows to the next "page".

- Since spreadsheet output is not paginated, only the before report escape and after report escape are supported (see Section 2.2.10, "About before and after escapes").

- In an after report escape, adding an HTML command outside the body does not reflect when the report is generated to spreadsheet output, even though the HTML command is written in output properly. For example: `</body><table><tr><td><B> the text to be bolded </B></td><tr></table> </html>` Adding the HTML command before the closing body tag reflects correctly when the report is generated to spreadsheet output. For example: `<table><tr><td><B> the text to be bolded </B></td><tr></table></body></html>`

- Spreadsheet format is supported in `rwservlet` or `rwcgi` commands such as `SHOWJOBS`. It is also supported in Enterprise Manager's job queue, and in Oracle Portal's access object definition.

Restrictions

- It is not possible to generate spreadsheet output directly from Reports Builder. Instead, on the command line, you can run the report using `rwrun` or Reports Server clients (`rwcgi`, `rwclient`, `rwservlet`), with `DESFORMAT=SPREADSHEET`. You cannot store `DESFORMAT=SPREADSHEET` as a system parameter value in the report definition (`.rdf` file).

- Distribution and bursting are not supported in spreadsheet output. You cannot specify a `SPREADSHEET` output format in a `distribution.xml` file or in the Distribution dialog box.

Example

To generate the paper layout of your report to Microsoft Excel output through a URL (using `rwservlet`), you can type a command on the command line that includes the following:

    http://hostname:port/reports/rwservlet?report=report_name
      +server=server_name+userid=db_connect_string+destype=file
      +desformat=spreadsheet+desname=C:\temp\myexcel_output.htm

Note: Microsoft Office 2000/2002/2003 supports Hypertext Markup Language (HTML) as a native file format. Spreadsheet output relies on producing HTML output, which can be understood by Microsoft Excel as a file with valid Excel format.

Other capabilities for generating spreadsheet output

In addition to the new spreadsheet output functionality, you can also generate spreadsheet output as implemented in releases prior to Oracle Reports 10g Release 2 (10.1.2), in the following ways:

- Generate a report to delimited output, as described in Section 3.7.10, "Generating delimited output":

  Advantage: Delimited output can be generated from existing paper layout reports saved in any format (`.rdf`, `.xml`, `.jsp`), either directly from Reports Builder, or by running the report from the command line.

  Disadvantage: Only data (as defined by the report Data Model), no layout information, displays in the output.

- Deploy a report with the Reports Server under OC4J to display it in Microsoft Excel inside your Web browser, using either of the following methods:

  - When you do not have an existing paper layout: open an Excel HTML template file in Reports Builder, add the data, save the report as a JSP file, then deploy the report. This method enables you to use JSP coding to include dynamic Excel formulas (not just static values of Reports summary and formula columns), dynamic graphs (not just static Reports graph images). For the steps to implement this method, see the example available on the Oracle Technology Network (OTN): on the Oracle Reports 10g page (`http://www.oracle.com/technology/products/reports/index.html`), click Getting Started to display the Getting Started with Oracle Reports home page. In the list of topic sections on the left, click Index. In the Collateral Type list, choose Demonstrations, and click Search. In the list that displays, click Generating Excel Output with Oracle Reports.

  - When you do have an existing paper layout: starting with a paper layout report, edit the Web Source view to add a `rw:include` tag to include the group frame of your paper layout in the Web source view as JSP code, save the report as a JSP file, then deploy the report. For the steps to implement this method, see Chapter 29, "Building a Report for Spreadsheet Output".

  Advantage: You can use rich formatting such as colors and fonts so that you generate report layout, not just data, in Microsoft Excel output inside a Web browser.

  Disadvantages: You must add custom JSP coding to get the output in Excel. The report can only be run through the JSP engine and not through `rwservlet`, thus this method can only display the Microsoft Excel output inside a Web browser.

See also

Section 3.7.11, "Generating spreadsheet output"

For choosing the appropriate delimited output solution for given requirements, see "Displaying Report Output in Microsoft Excel" in Appendix D, "Troubleshooting OracleAS Reports Services" in the Oracle Application Server Reports Services Publishing Reports to the Web manual.

### 2.8.14 About text output

Reports Builder can generate report output to text files, containing the formatted data and all objects. When you generate your report output to text, and the running mode is character (MODE=CHARACTER, or MODE system parameter Initial Value property set to Character), the result is pure text output, which can be read by many different applications. If the running mode is bitmap (MODE=BITMAP, or MODE system parameter Initial Value property set to Bitmap), the result is PostScript output, which can be read and rendered only by PostScript-compatible applications (such as a PostScript printer).

See also

Section 3.7.9, "Generating text output"

### 2.8.15 About creating an ASCII (character-mode) report

To create a character-mode report, you first create a bit-mapped report, then convert that report to an ASCII (character-mode) report. The process will create a new character-mode version of your bit-mapped report; the original bit-mapped report remains unchanged.

After conversion, many of your fields and text objects may need to be resized. Also, graphical objects such as images and drawings will not be included in your character-mode report. The following lists summarize what is supported in each output format:

Table 2-4 Supported items in bit-mapped and character-mode reports

Bit-mapped | Character-mode
--- | ---
Images | Boxes
Colors | Horizontal lines
Drawings | Vertical lines
Ellipses/Circles | ASCII text
Italicized text | Boldface text
Diagonal lines | Underlines
Bit-mapped patterns |
Multimedia objects |

See also

Section 3.5.9, "Creating an ASCII (character-mode) report"

Section 3.2.5, "Setting properties for an ASCII (character-mode) report"

Section 3.7.1, "Running and dispatching a report from the user interface"

## 2.9 Data Sources

Oracle Reports enables you to access any data source. See Section 3.15.2, "Accessing non-Oracle data sources".

The topics in this section discuss information related to accessing other data sources in Reports Builder.

- About database roles

- About Oracle Net Services

- About user exits

- About the Oracle Call Interface (OCI)

See also

The Pluggable Data Sources section of the Oracle Reports online Help, including the topics:

- About pluggable data sources

- Adding a pluggable data source

- Connecting to a pluggable data source

- Adding online Help to a pluggable data source

- Pluggable data source interface definition

- Troubleshooting PDS problems

### 2.9.1 About database roles

Database roles provide a way for end users to run reports that query tables to which they do not have access privileges. For example, a report may query a table that includes sensitive information such as salary data, even though the final report does not display this data.

Database roles are checked in the runtime environment only. If a table requires special access privileges, end users without those privileges cannot run a report that retrieves data from that table. However, if a database role is defined for the report, end users with privileges for that role can run the report using Reports Runtime (`rwrun`).

Note: To run a report for which a database role is defined, the end user must run the .rdf file, not the .rep file. When running multiple reports, Reports Runtime automatically switches to the role defined for the current report.

If you try to open a report in Reports Builder for which a database role has been defined, you will be prompted for the role password. Typically, only the report designer and DBA have this information.

See also

Section 3.16.1, "Setting a database role"

### 2.9.2 About Oracle Net Services

Oracle Net Services is Oracle's remote data access software that enables both client-server and server-server communications across any network. It supports distributed processing and distributed database capability. Oracle Net Services runs over and interconnects many communication protocols. Oracle Net Services is backwardly compatible with Net8 and SQL*Net.

### 2.9.3 About user exits

In prior releases, user exits provided a way to pass control from Reports Builder to a program you have written, which performs some function, and then returns control to Reports Builder. You could write ORACLE Precompiler user exits, OCI (ORACLE Call Interface) user exits, or non-ORACLE user exits to perform tasks such as complex data manipulation, passing data to Reports Builder from operating system text files, manipulating LONG RAW data, supporting PL/SQL blocks, or controlling real time devices, such as a printer or a robot.

Now, you can call Java methods using the ORA_JAVA built-in package and the Java Importer. This reduces the need to have user exits in a report and allows for a more open and portable deployment. You may also use the ORA_FFI built-in package, which provides a foreign function interface for invoking C functions in a dynamic library. With the availability of these new built-in packages, the use of user exits is being deprecated in Oracle Reports, though makefiles will still be supplied to permit you to continue to work with existing user exits.

### 2.9.4 About the Oracle Call Interface (OCI)

In prior releases, the Oracle Call Interface (OCI) provided a set of standard procedures that you could call in your 3GL programs to call Oracle Reports executables. These procedures (written in C) were shipped with the Reports Builder, Reports Runtime, and Reports Converter executables. For example, to run a Reports Builder report from a Pro*FORTRAN program, you could add a RWCRRB procedure call to your program to run the report using the Reports Runtime executable.

Now, the OCI is obsolete. Instead, use the rwclient.exe command line interface or the JSP tag library.

## 2.10 Debugging Tools

The topics in this section discuss debugging reports in Reports Builder.

- About the debugging process

- About the PL/SQL Interpreter

- About the Source pane

- About debug commands in the PL/SQL Interpreter

- About debug actions

- About the current execution location

- About the current scope location

- About debug levels

- About modifying code at runtime

### 2.10.1 About the debugging process

Debugging an application is an iterative process in which application errors are identified and corrected. In general, quickly identifying and locating failing code is essential to successfully debugging your application.

See also

Section 3.14.1, "Debugging a report"

Section 3.14.2, "Running a report in debug mode"

### 2.10.2 About the PL/SQL Interpreter

The PL/SQL Interpreter is your debugging workspace, where you can display source code, create debug actions, run program units, and execute Interpreter commands, PL/SQL, and SQL statements.

By default, two panes are always open in the PL/SQL Interpreter: Source pane and Interpreter pane.

Debugging features include the following:

- Direct manipulation debugging: insert debug actions and inspect program data by directly manipulating displayed source text.

- Dynamic execution feedback: Reports Builder automatically displays and tracks the current PL/SQL source location as program execution is interrupted by debug actions or incrementally advanced during program stepping.

- Browsing of interrupted program state: once execution has been interrupted, it is possible to browse the current stack, browse and modify variable state, and execute arbitrary PL/SQL statements. All information is accessed symbolically (that is, by name as opposed to by address or number).

### 2.10.3 About the Source pane

The PL/SQL Interpreter's Source pane displays a read-only copy of the program unit currently selected in the Object Navigator pane.

The numbers along the left hand margin correspond to the line numbers of the displayed program unit.

In addition, the symbols described below may appear in the margin.

Table 2-5 Symbols in the margin of the Source pane

Symbol | Description
--- | ---
| | Specifies the current source location.
=> | Specifies the current scope location.
- | Specifies the current execution location (if different from the current scope location).
B(n) | Specifies the location of a breakpoint, where n is the corresponding debug action ID. It appears in the line number column.
T(n) | Specifies the location of a trigger, where n is the corresponding debug action ID. It appears in the line number column.

### 2.10.4 About debug commands in the PL/SQL Interpreter

The following commands are available when using the PL/SQL Interpreter:

Table 2-6 PL/SQL Interpreter Commands

Command | Description
--- | ---
CREATE | Creates a new library that can be stored in either the file system or the current database.
DELETE | Deletes: libraries that reside in the current database library program units program units
DESCRIBE | Inspects a variable or parameter that is local to the current scope location. The description includes the name, type, and value of the specified local.
EXPORT | Writes the source of one or more program units to a text file.
LIST | Displays the source text for program units, triggers, and debug actions.
LOG | Saves a transcript of PL/SQL Interpreter input and output to the specified log file.
RESET | Returns control to an outer debug level without continuing execution in the current debug level.
SET | Changes the current scope location to a specified frame of the stack. You can specify relative motion from the current stack frame to any other frame, or move to a particular subprogram on the stack. There are several ways to invoke SET: select a frame entry in the Object Navigator enter the SET command in the PL/SQL Interpreter
SHOW | Lists the name, type, and value of all variables and parameters at the current scope location.

### 2.10.5 About debug actions

The PL/SQL Interpreter can be invoked from report code (triggers, user-named program units, libraries, and so on) by creating debug actions in the code. These are instructions that track the execution of PL/SQL program units so they can be monitored.

Each debug action you create is automatically assigned a unique numeric ID. While debugging, you can refer to this ID to browse, display, or modify a specific debug action with Reports Builder debug commands.

You can display detailed information about one or more debug actions, including its ID, source location, and whether or not it is enabled. You can temporarily disable specific debug actions and then re-enable them later if necessary.

There are two types of debug actions: breakpoints and debug triggers.

Breakpoints suspend execution at a specific source line of a program unit, passing control to the PL/SQL Interpreter.

Create breakpoints to identify specific debugging regions. For example, create a breakpoint at lines 10 and 20 to debug the code within this region.

With breakpoints, suspension occurs just before reaching the line on which the breakpoint is specified. At this point, use the PL/SQL Interpreter's features to inspect or modify program state. Once satisfied, resume execution with the GO or STEP commands, or abort execution using the RESET command.

Debug Triggers are a general form of debug action that associate a block of PL/SQL code with a specific source line within a program unit. When a debug trigger is encountered, Reports Builder executes the debug trigger code.

Create a debug trigger to execute a block of PL/SQL code provided at debug time in any of the following cases:

- When program execution reaches a single line in a program unit (for example, the current source location, line 5, line 23, and so on).

- Every time the PL/SQL Interpreter takes control (that is, whenever it suspends program execution due to a breakpoint, program stepping, and so on).

- At every PL/SQL source line being run.

Debug triggers are especially useful as conditional breakpoints. You can raise the exception DEBUG.BREAK from within a trigger. For example, the debug trigger shown below establishes a conditional breakpoint on line 10 of `my_proc`, which will be reached only if the local NUMBER variable `my_sal` exceeds 5000:

    PL/SQL>line 10 is
    +> IF Debug.Getn('my_sal') > 5000 THEN
    +> Raise Debug.Suspend;
    +> END IF;

#### 2.10.5.1 About creating a debug action

You can create debug actions (breakpoints and debug triggers) in the PL/SQL Interpreter in the following ways:

- choosing Program > Breakpoint or Program > Debugging Triggers on the Reports Builder menu bar while a program unit is open in the PL/SQL Interpreter

- right-clicking in the Source pane of the PL/SQL Interpreter and choosing Breakpoint or Debug Trigger

- inserting debug actions in the Object Navigator pane

- entering commands in the Interpreter pane

When you create a debug action, attach the breakpoint or debug trigger to a program unit source line that is "executable." A source line is considered executable if it contains one or more statements for which the PL/SQL compiler generates code. For example, source lines containing assignment statements and procedure calls are executable, while source lines containing comments, blank lines, declarations, or the NULL statement are not executable.

See also

Section 3.14.3, "Setting a breakpoint"

Section 3.14.4, "Setting a debug trigger"

### 2.10.6 About the current execution location

The current execution location specifies the next PL/SQL source line to be executed. It corresponds to what is commonly referred to as the program counter, or PC.

When control passes to the PL/SQL Interpreter while running a program (for example, when a breakpoint is encountered or following a step operation), the Source pane in the PL/SQL Interpreter automatically displays the source line associated with the current execution location.

Use the LIST command in the Interpreter pane to manually display the current execution location.

For example, entering:

    .LIST PC

will list the current execution location in the Source pane.

### 2.10.7 About the current scope location

The current scope location dictates where the PL/SQL Interpreter looks for local variables and parameters. It corresponds to the current execution location of one of the PL/SQL subprograms on the stack.

Each time a program unit's execution is interrupted (for example, by a debug action), the scope location is initialized to the execution location of the subprogram at the bottom of the stack.

Once execution has been interrupted, you can change the current scope location to another frame on the stack. This enables you to view local variables in another subprogram in the call chain.

See also

Section 3.14.14, "Displaying the current scope location"

### 2.10.8 About debug levels

When a debug action interrupts program execution, the PL/SQL Interpreter takes control and establishes what is known as a debug level. At a debug level, you can enter commands and PL/SQL statements to inspect and modify the state of the interrupted program unit as well as resume execution.

Since any PL/SQL code interactively entered at a debug level may itself be interrupted (for example, by encountering another breakpoint), it is possible for debug levels to nest. To facilitate distinguishing one debug level from another, the levels are numbered. The most deeply nested level is assigned the highest number. Numbering starts at zero with the outermost level.

The 0th or outermost level is commonly referred to as top level. Top level has no associated program state since it is the outermost level at which program units are originally invoked. When code invoked from top level is interrupted, debug level 1 is established. Similarly, interrupting code invoked from debug level 1 establishes debug level 2, and so on.

The PL/SQL Interpreter command prompt reflects the current debug level. When the PL/SQL Interpreter enters levels below top level, the prompt includes a prefix containing the current debug level number. For example, the PL/SQL Interpreter command prompt at debug level 1 appears as:

    (debug 1)PL/SQL>

### 2.10.9 About modifying code at runtime

At runtime, you can modify and compile any program unit, menu item command, or trigger that is not on the current stack.

Note: To modify an item on the current stack, first clear the stack by issuing the RESET command.

Although runtime code modification is not communicated back to Reports Builder, you can interactively test possible fixes, before returning to implement the eventual fix.

See also

Section 3.14.13, "Modifying code at runtime"