Advanced Crystal Analysis Designer Tools

Chapter 19, "Creating Crystal Analysis Reports," introduced the most traditional and common multidimensional or OLAP analytic objects with the Worksheet and Charting objects. Crystal Analysis provides four other analytic objects that can be used to enhance and extend end-user interactivity with the involved reports past the traditional boundaries of other OLAP Client products. The next few sections introduce their powerful capabilities.

Using Dimension Explorer Objects in Crystal Analysis

The Dimension Explorer gives users direct control of the view of a cube from outside of the worksheet. This object, shown in Figure 20.1 with all options turned on, enables users to dynamically change cube orientation (that is, which dimensions or on what axes) and member selection across one or all dimensions.

Figure 20.1. The Dimension Explorer and its components enable end-user manipulation of the report's data from outside the worksheet object.

graphics/20fig01.jpg

Changes that take place within Dimension Explorer directly affect the other analytic objects on the same page (such as a Worksheet or Chart). Table 20.1 highlights the different components of the Dimension Explorer, and their functions and typical uses. Configure these by right-clicking to access the Properties menu of the involved Dimension Explorer.

Table 20.1. Dimension Explorer Components and Sample Usage Cases

Dimension Explorer Component

Function

Sample Usage Case

Favorites

Toggles the display of the Favorite node and the Favorite set-up function on the toolbar.

Favorites provides report end users with the capability to create their own custom favorite groups. These groups are then subsequently available for rapid personalized access. This would likely be only turned off for a novice user group that might become overwhelmed with too much power too quickly.

Dimension bar

Enables users to select the different dimensions in the data source including all non-hidden and hidden row, column, and sliced dimensions.

You can turn this off if you only want the end user to be able to affect a designer specified dimension. Alternatively, it can be left available to give an end user a single place to select members and member-sets from all dimensionseven hidden dimensions.

Pivot control

Provides a compact area where the end user can reorient the row, column, and slice dimensions.

Generally provided as a compact alternative to the same capability in the worksheet. Open to the report designer's preference.

Toolbar

Provides numerous user tools to expedite member set selection on involved dimensions. These include user shortcuts to member set selections, display modes, favorite group set-up, and an advanced search utility.

You can turn this off if you do not want to provide end users with the access to the advanced member selection capabilities. It should be left on when the end users will be selecting their own member-sets.

Border

Toggles the display of a border on the Dimension Explorer object.

This is an aesthetic decision made according to the report designer's preference.

Root node

Toggles the display of the dimension's root node.

Can be safely turned off based on report designer preference as long as the dimension bar is displayed to highlight the current dimension.

Allow Context Menus

Toggles the right-click menu option on the Dimension Explorer for end users. Access to a multitude of dimension functions can be accessed through the right-click menus.

This would be turned off if the end user was not intended to access the variety of provided dimension-related functions. This includes dimension swapping, member selection, favorite group creation, and display options. One important note here is that the menus are either on or off; there is unfortunately no means (yet) to restrict access to a subset of the context menu items.

As you might have surmised, the Dimension Explorer does not provide any new functionality over the worksheet introduced in the last chapter but it does provide another method of deploying a good degree of dimension exploration and reorientation functionality to the end user. Figure 20.2 highlights a Crystal Analysis report presenting a Dimension Explorer based off the sample KPI cube provided by Crystal.

Figure 20.2. A Crystal Analysis report showing a Dimension Explorer with three Favorite groups defined and one selected to drive the appearance of the corresponding Chart object.

graphics/20fig02.jpg

TIP

The Pivot Control and Member Selection capabilities of the Dimension Explorer can provide a report design option for designers who want to restrict end user's capabilities. By including these within a Dimension Explorer on a report page, end users will be able to manipulate dimensions and member selections in a report but will not be able to access any of the remaining worksheet functionality covered in the previous chapter (such as Calculations, Filtering, Sorting, Exception Highlighting, Formatting, and so on).

As discussed in Chapter 19, the chart in Figure 20.2 reflects the viewpoint of the page on which it is located. With the Dimension Explorer, you relieve the requirement of needing a worksheet on the same report page as a chart to make it interactive because the content of the chart can be driven exclusively through the Dimension Explorer. Try to re-create this report yourself, complete with new Favorite Groups called Customer Satisfaction and FinanceRevenue Related.

NOTE

In addition to enabling end users to create favorite member groupings and selections, Crystal Analysis provides support for Server-side Named Sets created in Microsoft SQL Server Analysis Services. The Named Sets, which are themselves server-defined custom member groupings (such as Top 10 Selling Products), appear under a new Server node found under the Favorites node in the Member Selector.

 

Using the Slice Navigator Objects

The Slice Navigator object enables users to explore and edit the current viewpoint's slice dimensions and their associated members. The Slice Navigator, shown in Figure 20.3, is best thought of as an in-line parameter selection mechanism for the Crystal Analysis Report.

Figure 20.3. The Slice Navigator object and its components.

graphics/20fig03.jpg

Changes that take place within the Slice Navigator directly affect the other analytic objects on the same page (such as a Worksheet or Chart). Table 20.2 highlights the different components of the Slice Navigator and their functions and typical uses. These are configurable by right-clicking the Properties menu of the involved Slice Navigator.

Table 20.2. Slice Navigator Components and Sample Usage Cases

Slice Navigator Component

Function

Sample Usage Case

Panel Button

Toggles the display and function of the Panel Button drop-down icon. This button provides access to the same member selector dialog covered in Chapter 19 and related to the Worksheet object.

Generally turned off if the Slice Navigator is only being used to display the sliced dimension current members (that is, the non-row or -column). Often turned on to enable end users to access member selection from this object.

Member Names

Toggles the display of the currently selected member names beside the actual dimension name.

Generally turned off only if the membername was visible elsewhere on the report.

Border

Toggles the display of a border on the slice navigation object.

This is an aesthetic decision made according to the report designer's preference.

Tile Panels

Toggles the display of the Slice Navigator Dimensions as either horizontally or vertically stacked.

If the Report Page has limited vertical space, use the Tile Panels option to stretch the slice navigator horizontally. If there is limited horizontal space, turn the Tile Panels off to stack the sliced dimensions panels vertically.

Allow Context Menus

Toggles the right-click menu option on the Slice Navigator for end users. Access to a multitude of dimension and member-related functions is available through the right-click menus.

This would be turned off if you don't intend for the end user to access the dimension and member related functions. This includes dimension swapping, member selection, and display options. One important note here is that the menus are either on or off; unfortunately, there is not yet means to restrict access to a subset of the context menu items.

Use the Slice Navigator on Crystal Analysis Report Pages when you want to present a locked-down worksheet or chart view (that is, no dimension reorientation) yet still want to enable the end user to edit the parameters around the fixed display (that is, edit the sliced dimension members). Figure 20.4 highlights a report page based on the Crystal Sample KPI cube with the slice navigator providing a parameter selection capability that drives the chart and worksheet display.

Figure 20.4. Here is a Crystal Analysis report with the Slice Navigator driving a Viewpoint reflected on the corresponding Chart and Worksheet objects.

graphics/20fig04.jpg

 

Using Analysis Button Objects

Analysis Buttons enable end users to rapidly analyze data and move between different analytic viewpoints at the click of a button. The simple user interface that Analysis Buttons provide brings the power of OLAP and multidimensional data sources to the masses.

Analysis Buttons enables single-click provision of any of the following capabilities to end users:

  • Changing the current viewpoint of the Worksheet and chart objects on a single report page.
  • Moving to another page in the application and controlling the viewpoint of the Worksheet or chart objects on the new report page.
  • Flexible Drill-down on user-selected members from the worksheet object.
  • Executing actions that can open other Crystal Analysis or Crystal Report reports, third-party applications, Web pages, e-mail notes, and so on. The Actions section later in this chapter covers these capabilities.

Figure 20.5 shows a familiar sample report that has been enhanced with the provision of three Analysis ButtonsCustomer Satisfaction, FinanceRevenue Related, and All KPIs.

Figure 20.5. This is a Crystal Analysis report with three Analysis Buttons driving the viewpoint reflected on the corresponding Chart and Worksheet objects.

graphics/20fig05.jpg

Each of the three Analysis Buttons provides the end user with a single-click method of changing the viewpoint on the associated worksheet and chart objects (after the Crystal Analysis report has been locked down or published to Crystal Enterprise). The report designer provides this capability by right-clicking on the Analysis button after it has been added to a report page. Figures 20.6 and 20.7 highlight the Analysis Button Properties dialog accessed by right-clicking on an Analysis Button and selecting Properties.

Figure 20.6. The Analysis Button Properties dialog is where you name the Analysis Button and select a transition page or action.

graphics/20fig06.jpg

Figure 20.7. On the Dimensions tab of the Analysis Button Properties dialog, you can select a dimension member based on the involved analysis button.

graphics/20fig07.jpg

Table 20.3 describes the various properties, functions, and uses that can be set for Analysis buttons.

Table 20.3. Analysis Button Components and Usage Cases

Analysis Button Component

Function

Sample Usage Case

Analysis Button TabButton Caption

Enables you to specify the label to be displayed on the Analysis Button.

To present the end user with a clear button label that indicates the button's purpose.

Analysis Button TabModify the View on the Target Page, then move to that Page

Enables you to specify the report page onto which the involved action button takes the user when he or she clicks it.

By specifying the same report page that the Analysis Button resides on, the end user can change the viewpoint of a single report page dynamically and rapidly.

By specifying a different page, the end user can navigate among the different report pages in a Crystal Analysis report and pass data context amongst themand have all that logic wrapped up within the button.

Analysis Button TabLaunch an Action

Enables you to specify the action that is launched when the user presses the involved Analysis Button. Actions are covered in detail later in this chapter.

When actions are defined for a report, Analysis Buttons can be used to launch them. This powerful function enables you to link to external applications (such as a product ordering system), email systems, other Crystal Analysis Reports, or formatted Crystal Reports.

Dimensions TabAction

The Dimensions tab enables you to specify the members for each of the dimensions in the Targeted Viewpoint (the new Viewpoint after the Analysis Button has been clicked). There are many options for specifying these Members:

Use these specifications to encapsulate selection logic for the target viewpoint of an Analysis Button. These Analysis Buttons are then used to provide easy-to-use in terfaces for non-power analyst end users.

 

Use Source MembersCopies the member selection from the originating viewpoint.

Useful when you intend to keep a dimension's members the same both pre and post-Analysis Button press. This is often the case because it is common to embed the logic to change only one dimension at a time in an Analysis Button.

 

Use Target MembersUses the viewpoint of the targeted report page.

Useful when the targeted report page contains a predefined set of members for a dimension that should not be affected.

 

Drill Down (Single, No Parent)A Focused Drill-down on a selected member from the worksheet.

Useful for encapsulating focused drill-down functionality into an Analysis Button.

 

Drill Down (Single, Keep Parent)Similar to a Focused Drill-down with the exception that Parent member is kept in the viewpoint.

Useful for encapsulating the combination of focused drill-down functionality with keeping the Parent member into an Analysis Button.

 

Drill Down (Multiple, No Parent)A Focused Drill-down on selected members from the works heet.

Useful for encapsulating focused drill-down functionality on multiple members into an Analysis Button.

 

Drill Down (Multiple, Keep Parent)Similar to a Focused Drill-down on multiple members with the exception that Parent members are kept in the viewpoint.

Useful for encapsulating the combination of focused drill-down functionality on multiple members with keeping the Parent members into an Analysis Button.

 

As Selected (only one accepted)Displays only the selected member (selected by the end user from the worksheet).

Useful for providing users with focused user-driven Analysis Buttons.

 

As Selected (multiple accepted)Displays only the selected members (selected by the end user from the worksheet).

Useful for providing users with focused user driven Analysis Buttons. An example might enable the end user to select which products to analyze more deeply.

 

Specified Member(s)Displays a predefined (by the report designer) set of members.

Useful for providing users with focused Analysis Buttons based on predefined views (such as Product Sets or Time Periods).

 

Range based on Selected MemberDisplays a predefined range of members on either side of a user-selected member.

Useful for providing users with a navigation mechanism to move through time dimensions in a user-driven focused method (for example, showing three months of data on either side of a selected member).

Dimensions TabParameter

The Dimensions Tab Parameter Column enables you to specify parameters for both the Specified Member(s) and Range Based on a Selected Member Dimension Column options. Specified members are selected through a traditional Member Selector dialog and ranges are specified by X:Y where X specifies the number of periods before the selected member and Y afterward.

Both parameter selection options enable you to provide predefined viewpoint navigation logic embedded within an Analysis Button.

CAUTION

Unlike the Member Selector dialogs accessed through the Worksheet, Dimension Explorer, and Slice Navigator, the Member Selector dialog box accessed from the Specified Members option does not provide access to Favorites or Named Sets (a Microsoft SQL Server capability described earlier in this chapter). As such, be careful when re-creating these lists through this Member Selector to ensure they reflect the member lists you are targeting.

TIP

Often, a report contains multiple Analysis Buttons all providing only slightly different functions to the end user. To facilitate Report Design, make sure to use the Copy and Paste functions accessible from the right-click menu on the Analysis Buttons.

 

Using Text Box Objects

The Analytic Objects covered to this point have highlighted the powerful function that Crystal Analysis provides on top of multidimensional (for example, OLAP) data sources. The last object available for use in Report Design is the text box and is exclusively focused on report formatting. Figure 20.8 shows a variation of the sample reports worked on in this chapter with some strategically placed text boxes added for aesthetic affect.

Figure 20.8. Add text objects to a KPI report.

graphics/20fig08.jpg

Standard formatting capabilities are provided through the Text Box properties dialog, which you can access by right-clicking on the involved text box.

Creating Parameters with the Parameter Manager

Similar to the Crystal Reports parameters discussed in Chapter 5, "Implementing Parameters for Dynamic Reporting," Crystal Analysis also provides you with a rich parameter capability. These parameters enable you to re-use a single report/application across multiple user groups or users with different filtering requirements. Crystal Analysis parameters can be set for the following:

  • The underlying cube (for example, the report data source)
  • The selected member of an active or hidden sliced dimension
  • The selected set of members ('member-set') for any of the row or column dimensions
  • The opening page of the report

For more information on Crystal Reports parameters, p. 129

To add any of these parameters to a report, first use the Parameter Manager shown in Figure 20.9 to define the parameters. You can access this from the Tools menu.

Figure 20.9. The Crystal Analysis Parameter Manager enables you to add parameters to their Crystal Analysis reports.

graphics/20fig09.jpg

Each parameter is specified through five pieces of information in the Parameter Manager: a parameter name, the chosen parameter type (Cube, Member, Memberset, or Page), the default value for the parameter, a prompting toggle, and prompting text (description). All of these are rather intuitive except for the prompting toggle that is used to specify that end users should be prompted for the report when they view it through Crystal Enterprise. If this is turned off, users will not be prompted for a parameter and the last saved value for that value in the report will be used.

The second step to using parameters in a Crystal Analysis Report is to configure any dimensions that are to use the incoming parameters (Members or Memberset parameters only) as filters for their associated member selection. You specify this in the Member Selector for the involved dimensions. Figure 20.10 shows this selection for the Location Dimension on the sample report from this chapter. The parameters that have been created previously are found and selected under the Special Members node.

Figure 20.10. Existing parameters can be specified as active filters in the Dimension Member Selector of the involved dimensions.

graphics/20fig10.jpg

CAUTION

Be careful to test the parameters that you have implemented both in the Crystal Analysis Design Environment and in the Crystal Enterprise Web Delivery environment. Often, the product behavior can be somewhat surprising when you use prompting.

After a parameter has been configured, you make it active for end users by either locking the report in the designer or publishing to Crystal Enterprise. Figure 20.11 displays a report that has been published to Crystal Enterprise and selected by the viewer for viewing. Note the selection screen that has prompted the user for parameter input that is used for filtering the underlying Crystal Analysis report.

Figure 20.11. The Set Parameters dialog and Associated Member Selector dialog on a Web-published Crystal Analysis Report within Crystal Enterprise.

graphics/20fig11.jpg

TIP

When publishing Crystal Analysis reports in Crystal Enterprise to maturing or beginning users, it is often instructive to select the ActiveX Viewer for Report Viewing because the DHTML Crystal Analysis Viewer requires typed input for the parameters in special OLAP syntax that new users might find confusing. If ActiveX is against corporate policy or preference, an alternative implementation option is to customize a parameter selection interface and programmatically call the Crystal Analysis reports with the user-selected parameters.

 

Creating Actions with the Actions Manager

Crystal Analysis actions are a powerful new feature of Crystal Analysis version 10. They enable a Crystal Analysis designer to predefine named operations for report users accessed from four different areas: from dimension headings, from individual members of a dimension, from specific data cells, or from Analysis Buttons. Actions enable end users to kick off other Web pages, link into other applications, initiate e-mail to colleagues, and launch other applications such as Crystal Reports or other Crystal Analysis reports. These links can be made with flexible context awareness of exactly where on the report they were kicked off from (that is, which product member the cursor was on when the action was kicked off).

NOTE

In previous versions of Crystal Analysis, actions defined on a Microsoft SQL Server were supported in much the same way that these new Crystal Analysis actions are supported. In version 10, both SQL Server actions and the new Custom Crystal Analysis actions are supported and accessed in the exact same way. More information on SQL Server actions can be found in the documentation for Microsoft SQL Server Analysis Services.

Actions are accessed in Crystal Analysis by either right-clicking any dimension, dimension member, or data cell, or by clicking an Analysis Button tied to an action, as described earlier in this chapter. If an action is available on the right-clicked report section, the Actions menu option is enabled and access to all defined actions is provided.

A good example of an action could be based on a product dimension and be called Display Detailed Product Information. This might display a detailed Crystal Report based off some relational data from the product master tables and be nicely formatted for printing. An alternative example on the same dimension could be an Order Inventory action based on a product dimension's member. This action would link into the corporate procurement Web site and dynamically pass in the Product ID or Name.

In both the Crystal Analysis designer and the ActiveX Rich Client Web Viewer of Crystal Enterprise, each action appears in the Actions submenu. In the Web (DHTML) client the actions are displayed in a dialog. Figure 20.12 shows an action being called in the DHTML Web Viewer, using the KPI dimension of the sample KPI cube.

Figure 20.12. Invoke an action from the DHTML worksheet in Crystal Enterprise.

graphics/20fig12.jpg

Actions are created in the Crystal Analysis Designer using the Action Manager accessible from the Tools menu. The Action Manager shown in Figure 20.13 enables you to Add, Delete, Copy, Edit, and Import Actions from other existing Crystal Analysis reports. Figure 20.13 shows the New Action dialog and Table 20.4 describes the key components of an action.

Figure 20.13. Create a new action in Crystal Analysis with the Action Manager, which you access from the Tools menu.

graphics/20fig13.jpg

KPI = " + GetName(*) + "

Table 20.4. Action Components and Descriptions

Action Component

Description

Name

The name of the action that shows up to end users in their Action menus. Clear and active descriptions of actions are recommended.

Applies To

There are five options where actions might apply:

Nothing These actions might only be launched from a Crystal Analysis button and cannot include any MDX or Crystal OLAP Syntax

Cube These actions might also only be launched from a Crystal Analysis button but can include any MDX or Crystal OLAP Syntax for dynamic context pass-through

Dimension The action can only be launched from a specified dimension heading

Dimension Members The action can only be launched from member titles within a specified dimension

Data Cells The action can only be launched from a Worksheet Data Cell

Dimension

Enables you to specify the Dimension where the involved action is available. This option is only available for Dimension and Dimension Member actions.

Type

HTML or URL. URL actions open the specified URL in a Web browser. HTML actions render the specified HTML in a Web browser.

Template

The HTML or URL content is the template. The Check Template button on this dialog checks the validity of any involved MDX or Crystal OLAP Syntax in the template. It ignores everything that is kept within double quotesit does not check URL or HTML syntax. Lastly, the Syntax Editor provides an easy-to-use interface for adding MDX and Crystal OLAP functions and fields into the template. MDX and Crystal OLAP Syntax are introduced later in this chapter. A few examples shown here highlight the use of the context wildcard '*'. URL with MDX:

 
"http://finance.yahoo.com/q?d=t&s=" + *.Name

URL with Crystal OLAP Syntax:

"http://finance.yahoo.com/q?d=t&s=" + GetName(*)

HTML with Crystal OLAP Syntax:

"
" E-mail URL with MDX: "mailto:MakeMeRich@broker.com?subject=Buy Some" + graphics/ccc.gif [Equity].*.Name

NOTE

Remember that actions that apply to nothing cannot use any MDX or Crystal OLAP Syntax within their HTML or URL template. This means that these actions cannot take data context with them to their launched application. To pass in data-driven context at a report level, use the Applies to Cube option.

As alluded to in the last entry of Table 20.4, you can use an asterisk to make an expression context-aware. The use of the asterisk and context depend on where the action was launched. The most common usage of the context asterisk is on Member and Data Cell actions.

For actions launched from a Member, the context asterisk holds the place of the Member from which the action was launched. For example, with MDX, *.Name returns the name of the Member from which the action was launched. With Crystal OLAP Syntax, the expression would look like this: GetName({*}).

For actions launched from a data cell, the context asterisk specifies the column or row member to which the data cell belongs to. Each cell belongs to multiple dimensions, so you must specify the dimension you want. For example, with MDX, [KPI].*.Name returns the name of the member in the Products dimension that corresponds to the cell from where the action was launched. With Crystal OLAP Syntax, the expression would look like this: GetName({KPI@*}).

Finally, the following HTML example shows how to specify the column, row, and sliced dimension members corresponding to a specific data cell:

Listing 20.1. HTML Code Highlighting Context Placeholders for All Dimensions

"

KPI = " + [KPI].*.Name + "

Business Unit = " + [Business Unit].*.Name + "

Time Period = " + [Time].*.Name + "

Measures = " + [Measures].*.Name + "

Location = " + [Location].*.Name + "

"

The calling interface and the results of this action, known as Display Data Cell Context in the samples, are displayed in Figure 20.14.

Figure 20.14. Calling a Data Cell action and the resulting HMTL page showing the context of the selected cell. This context could be used to drive external applications.

graphics/20fig14.jpg

graphics/20fig14_01.jpg

graphics/20fig14_02.jpg

Although the Edit, Delete, and Copy commands in the Action Manager are quite intuitive, the Import Action option is a little more novel. The Import capability enables you to copy actions from any other Crystal Analysis report maintained in the Crystal Enterprise system. To complete an import, log on to Crystal Enterprise and navigate to the desired Crystal Analysis Report. Upon selection of the report, you are prompted to select one or more of the actions that exist in that report to import. The imported actions now become part of the current report.

Part I. Crystal Reports Design

Creating and Designing Basic Reports

Selecting and Grouping Data

Filtering, Sorting, and Summarizing Data

Understanding and Implementing Formulas

Implementing Parameters for Dynamic Reporting

Part II. Formatting Crystal Reports

Fundamentals of Report Formatting

Working with Report Sections

Visualizing Your Data with Charts and Maps

Custom Formatting Techniques

Part III. Advanced Crystal Reports Design

Using Cross-Tabs for Summarized Reporting

Using Record Selections and Alerts for Interactive Reporting

Using Subreports and Multi-Pass Reporting

Using Formulas and Custom Functions

Designing Effective Report Templates

Additional Data Sources for Crystal Reports

Multidimensional Reporting Against OLAP Data with Crystal Reports

Part IV. Enterprise Report Design Analytic, Web-based, and Excel Report Design

Introduction to Crystal Repository

Crystal Reports Semantic Layer Business Views

Creating Crystal Analysis Reports

Advanced Crystal Analysis Report Design

Ad-Hoc Application and Excel Plug-in for Ad-Hoc and Analytic Reporting

Part V. Web Report Distribution Using Crystal Enterprise

Introduction to Crystal Enterprise

Using Crystal Enterprise with Web Desktop

Crystal Enterprise Architecture

Planning Considerations When Deploying Crystal Enterprise

Deploying Crystal Enterprise in a Complex Network Environment

Administering and Configuring Crystal Enterprise

Part VI. Customized Report Distribution Using Crystal Reports Components

Java Reporting Components

Crystal Reports .NET Components

COM Reporting Components

Part VII. Customized Report Distribution Using Crystal Enterprise Embedded Edition

Introduction to Crystal Enterprise Embedded Edition

Crystal Enterprise Viewing Reports

Crystal Enterprise Embedded Report Modification and Creation

Part VIII. Customized Report Distribution Using Crystal Enterprise Professional

Introduction to the Crystal Enterprise Professional Object Model

Creating Enterprise Reports Applications with Crystal Enterprise Part I

Creating Enterprise Reporting Applications with Crystal Enterprise Part II

Appendix A. Using Sql Queries In Crystal Reports

Creating Enterprise Reporting Applications with Crystal Enterprise Part II



Special Edition Using Crystal Reports 10
Special Edition Using Crystal Reports 10
ISBN: 0789731134
EAN: 2147483647
Year: 2003
Pages: 341

Flylib.com © 2008-2020.
If you may any questions please contact us: flylib@qtcs.net