Use of macros in IBM Cognos 8 Report Studio

Exclusive offer: get 50% off this eBook here
IBM Cognos 8 Report Studio Cookbook

IBM Cognos 8 Report Studio Cookbook — Save 50%

Over 80 great recipes for taking control of IBM Cognos 8 Report Studio with this book and eBook

$35.99    $18.00
by Abhishek Sanghani | May 2010 | Enterprise Articles IBM

Cognos Report Studio is widely used for creating and managing business reports in medium to large companies. It is simple enough for any business analyst, power user, or developer to pick up and start developing basic reports. However, when it comes to developing more sophisticated, fully functional business reports for wider audiences, report authors will need guidance.

In this article, by Abhishek Sanghani, author of IBM Cognos 8 Report Studio Cookbook, we will show you  that even though macros are often considered a Framework Modeler's tool, they can be used within Report Studio as well. These recipes will show you some very useful macros around security, string manipulation, and prompting.

(Read more interesting articles on Compiere here.)

Introduction

This article will introduce you to an interesting and useful tool of Cognos BI, called 'macros'. They can be used in Framework Manager as well as Report Studio.

The Cognos engine understands the presence of a macro as it is written within a pair of hashes (#). It executes the macros first and puts the result back into report specification like a literal string replacement. We can use this to alter data items, filters, and slicers at run time.

You won't find the macro functions and their details within Report Studio environment (which is strange, as it fully supports them). Anyways, you can always open Framework Manager and check different macro functions and their syntaxes from there. Also, there is documentation available in Cognos' help and online materials.

Working with Dimensional Model (in the"Swapping dimension" recipe). In this article, I will show you more examples and introduce you to more functions which you can later build upon to achieve sophisticated functionalities.

We will be writing some SQL straight against the GO Data Warehouse data source. Also, we will use the "GO Data Warehouse (Query)" package for some recipes.

Add data level security using CSVIdentityMap macro

A report shows the employee names by region and country. We need to implement data security in this report such that a user can see the records only for the country he belongs to. There are already User Groups defined on the Cognos server (in the directory) and users are made members of appropriate groups.

For this sample, I have added my user account to a user group called 'Spain'.

Getting ready

Open a new list report with GO Data Warehouse (Query) as the package.

How to do it...

  1. Drag the appropriate columns (Region, Country, and Employee name) on to the report from Employee by Region query subject.

    Use of macros in IBM Cognos 8 Report Studio

  2. Go to Query Explorer and drag a new detail filter.
  3. Define the filter as:

    [Country] in (#CSVIdentityNameList(',')#)

    Use of macros in IBM Cognos 8 Report Studio

  4. Run the report to test it. You will notice that a user can see only the rows of the country/countries of which he is a member.

How it works...

Here we are using a macro function called CSVIdentityNameList. This function returns a list of groups and roles that the user belongs to, along with the user's account name. Hence, when I run the report, one of the values returned will be 'Spain' and I will see data for Spain.

The function accepts a string parameter which is used as a separator in the result. Here we are passing a comma (,) as the separator.

If a user belongs to multiple country groups, he will see data for all the countries listed in the result of a macro.

There's more...

This solution, conspicuously, has its limitations. None of the user accounts or roles should be same as a country name, because that will wrongly show data for a country the user doesnot belong to. For example, for a user called 'Paris', it will show data for the 'Paris' region. So, there need to be certain restrictions. However, you can build upon the knowledge of this macro function and use it in many practical business scenarios.

Using prompt macro in native SQL

In this recipe, we will write an SQL statement straight to be fired on the data source. We will use the Prompt macro to dynamically change the filter condition.

We will write a report that shows list of employee by Region and Country. We will use the Prompt macro to ask the users to enter a country name. Then the SQL statement will search for the employee belonging to that country.

Getting ready

Create a new blank list report against 'GO Data Warehouse (Query)' package.

How to do it...

  1. Go to the Query Explorer and drag an SQL object on the Query Subject that is linked to the list (Query1 in usual case).

    Use of macros in IBM Cognos 8 Report Studio

  2. Select the SQL object and ensure that great_outdoor_warehouse is selected as the data source.

    Use of macros in IBM Cognos 8 Report Studio

  3. Open the SQL property and add the following statement:

    select distinct "Branch_region_dimension"."REGION_EN" "Region" ,
    "Branch_region_dimension"."COUNTRY_EN" "Country" , "EMP_EMPLOYEE_
    DIM"."EMPLOYEE_NAME" "Employee_name"
    from "GOSALESDW"."GO_REGION_DIM" "Branch_region_dimension",
    "GOSALESDW"."EMP_EMPLOYEE_DIM" "EMP_EMPLOYEE_DIM",
    "GOSALESDW"."GO_BRANCH_DIM" "GO_BRANCH_DIM"
    where ("Branch_region_dimension"."COUNTRY_EN" in
    (#prompt('Region')#))
    and "Branch_region_dimension"."COUNTRY_CODE" = "GO_BRANCH_
    DIM"."COUNTRY_CODE" and "EMP_EMPLOYEE_DIM"."BRANCH_CODE" = "GO_
    BRANCH_DIM"."BRANCH_CODE"

  4. Hit the OK button. This will validate the query and will close the dialog box. You will see that three data items (Region, Country, and Employee_Name) are added to Query1.
  5. Now go to the report page. Drag these data items on the list and run the report to test it.

How it works...

Here we are using the macro in native SQL statement. Native SQL allows us to directly fire a query on the data source and use the result on the report. This is useful in certain scenarios where we don't need to define any Framework Model. If you examine the SQL statement, you will notice that it is a very simple one that joins three tables and returns appropriate columns. We have added a filter condition on country name which is supposed to dynamically change depending on the value entered by user.

The macro function that we have used here is Prompt(). As the name suggests, it is used to generate a prompt and returns the parameter value back to be used in an SQL statement.

Prompt() function takes five arguments. The first argument is the parameter name and it is mandatory. It allows us to link a prompt page object (value prompt, date prompt, and so on) to the prompt function. The rest of the four arguments are optional and we are not using them here. You will read about them in the next recipe.

Please note that we also have an option of adding a detail filter in the query subject instead of using PROMPT() macro within query. However, sometimes you would want to filter a table before joining it with other tables. In that case, using PROMPT() macro within the query helps.

There's more...

Similar to the Prompt() function, there is a i macro function. This works in exactly the same way and allows users to enter multiple values for the parameter. Those values are returned as a comma-separated list.

Making prompt optional

The previous recipe showed you how to generate a prompt through a macro. In this recipe, we will see how to make it optional using other arguments of the function.

We will generate two simple list reports, both based on a native SQL. These lists will show product details for selected product line. However, the product line prompt will be made optional using two different approaches.

Getting ready

Create a report with two simple list objects based on native SQL. For that, create the Query Subjects in the same way as we did in the previous recipe. Use the following query in the SQL objects:

select distinct "SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_LINE_EN" "Product_
line" , "SLS_PRODUCT_LOOKUP"."PRODUCT_NAME" "Product_name" , "SLS_
PRODUCT_COLOR_LOOKUP"."PRODUCT_COLOR_EN" "Product_color" , "SLS_
PRODUCT_SIZE_LOOKUP"."PRODUCT_SIZE_EN" "Product_size"
from "GOSALESDW"."SLS_PRODUCT_DIM" "SLS_PRODUCT_DIM",
"GOSALESDW"."SLS_PRODUCT_LINE_LOOKUP" "SLS_PRODUCT_LINE_LOOKUP",
"GOSALESDW"."SLS_PRODUCT_TYPE_LOOKUP" "SLS_PRODUCT_TYPE_
LOOKUP", "GOSALESDW"."SLS_PRODUCT_LOOKUP" "SLS_PRODUCT_LOOKUP",
"GOSALESDW"."SLS_PRODUCT_COLOR_LOOKUP" "SLS_PRODUCT_COLOR_LOOKUP",
"GOSALESDW"."SLS_PRODUCT_SIZE_LOOKUP" "SLS_PRODUCT_SIZE_LOOKUP",
"GOSALESDW"."SLS_PRODUCT_BRAND_LOOKUP" "SLS_PRODUCT_BRAND_LOOKUP"
where "SLS_PRODUCT_LOOKUP"."PRODUCT_LANGUAGE" = N'EN' and "SLS_
PRODUCT_DIM"."PRODUCT_LINE_CODE" = "SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_
LINE_CODE" and "SLS_PRODUCT_DIM"."PRODUCT_NUMBER" = "SLS_PRODUCT_
LOOKUP"."PRODUCT_NUMBER" and "SLS_PRODUCT_DIM"."PRODUCT_SIZE_CODE"
= "SLS_PRODUCT_SIZE_LOOKUP"."PRODUCT_SIZE_CODE" and "SLS_PRODUCT_
DIM"."PRODUCT_TYPE_CODE" = "SLS_PRODUCT_TYPE_LOOKUP"."PRODUCT_TYPE_
CODE" and "SLS_PRODUCT_DIM"."PRODUCT_COLOR_CODE" = "SLS_PRODUCT_COLOR_
LOOKUP"."PRODUCT_COLOR_CODE" and "SLS_PRODUCT_BRAND_LOOKUP"."PRODUCT_
BRAND_CODE" = "SLS_PRODUCT_DIM"."PRODUCT_BRAND_CODE"

This is a simple query that joins product related tables and retrieves required columns.

How to do it...

  1. We have created two list reports based on two SQL query subjects. Both the SQL objects use the same query as mentioned above. Now, we will start with altering them. For that open Query Explorer. Rename first query subject as Optional_defaultValue and the second one as Pure_Optional.

    Use of macros in IBM Cognos 8 Report Studio

  2. In the Optional_defaultValue SQL object, amend the query with following lines: and

    "SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_LINE_EN" = #sq(prompt ('Product
    Line','string','Golf Equipment'))#

  3. Similarly, amend the Pure_Optional SQL object query with the following line:

    #prompt ('Product Line','string','and 1=1', ' and "SLS_PRODUCT_
    LINE_LOOKUP"."PRODUCT_LINE_EN" = ')#

  4. Now run the report. You will be prompted to enter a product line. Don't enter any value and just hit OK button. Notice that the report runs (which means the prompt is optional). First, list object returns rows for 'Golf Equipment'. The second list is populated by all the products.

How it works...

Fundamentally, this report works the same as the one in the previous report. We are firing the SQL statements straight on the data source. The filter condition in the WHERE clause are using the PROMPT macro.

Optional_defaultValue

In this query, we are using the second and third arguments of Prompt() function. Second argument defines the data type of value which is 'String' in our case. The third argument defines default value of the prompt. When the user doesn't enter any value for the prompt, this default value is used. This is what makes the prompt optional. As we have defined 'Golf Equipment' as the default value, the first list object shows data for 'Golf Equipment' when prompt is left unfilled.

Pure_Optional

In this query, we are using fourth argument of Prompt() function. This argument is of string type. If the user provides any value for the prompt, the prompt value is concatenated to this string argument and the result is returned.

In our case, the fourth argument is the left part of filtering condition that is, 'and

.

'and "SLS_
PRODUCT_LINE_LOOKUP"."PRODUCT_LINE_EN" ='.

So, if the user enters the value as 'XYZ', the macro is replaced by the following filter:

and

"SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_LINE_EN" = 'XYZ'

Interestingly, if the user doesn't provide any prompt value, then the fourth argument is simply ignored. The macro is then replaced by the third argument which is in our case is 'and 1=1'.

Hence, the second list returns all the rows when user doesn't provide any value for the prompt. This way it makes the PRODUCT_LINE_EN filter purely optional.

There's more...

Prompt macro accepts two more arguments (fifth and sixth). Please check the help documents or internet sources to find information and examples about them.

Adding token using macro

In this recipe, we will see how to dynamically change the field on which filter is being applied using macro. We will use prompt macro to generate one of the possible tokens and then use it in the query.

Getting ready

Create a list report based on native SQL similar to the previous recipe. We will use the same query that works on the product tables but filtering will be different. For that, define the SQL as following:

select distinct "SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_LINE_EN" "Product_
line" , "SLS_PRODUCT_LOOKUP"."PRODUCT_NAME" "Product_name" , "SLS_
PRODUCT_COLOR_LOOKUP"."PRODUCT_COLOR_EN" "Product_color" , "SLS_
PRODUCT_SIZE_LOOKUP"."PRODUCT_SIZE_EN" "Product_size"
from "GOSALESDW"."SLS_PRODUCT_DIM" "SLS_PRODUCT_DIM",
"GOSALESDW"."SLS_PRODUCT_LINE_LOOKUP" "SLS_PRODUCT_LINE_LOOKUP",
"GOSALESDW"."SLS_PRODUCT_TYPE_LOOKUP" "SLS_PRODUCT_TYPE_
LOOKUP", "GOSALESDW"."SLS_PRODUCT_LOOKUP" "SLS_PRODUCT_LOOKUP",
"GOSALESDW"."SLS_PRODUCT_COLOR_LOOKUP" "SLS_PRODUCT_COLOR_LOOKUP",
"GOSALESDW"."SLS_PRODUCT_SIZE_LOOKUP" "SLS_PRODUCT_SIZE_LOOKUP",
"GOSALESDW"."SLS_PRODUCT_BRAND_LOOKUP" "SLS_PRODUCT_BRAND_LOOKUP"
where "SLS_PRODUCT_LOOKUP"."PRODUCT_LANGUAGE" = N'EN' and "SLS_
PRODUCT_DIM"."PRODUCT_LINE_CODE" = "SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_
LINE_CODE" and "SLS_PRODUCT_DIM"."PRODUCT_NUMBER" = "SLS_PRODUCT_
LOOKUP"."PRODUCT_NUMBER" and "SLS_PRODUCT_DIM"."PRODUCT_SIZE_CODE"
= "SLS_PRODUCT_SIZE_LOOKUP"."PRODUCT_SIZE_CODE" and "SLS_PRODUCT_
DIM"."PRODUCT_TYPE_CODE" = "SLS_PRODUCT_TYPE_LOOKUP"."PRODUCT_TYPE_
CODE" and "SLS_PRODUCT_DIM"."PRODUCT_COLOR_CODE" = "SLS_PRODUCT_COLOR_
LOOKUP"."PRODUCT_COLOR_CODE" and "SLS_PRODUCT_BRAND_LOOKUP"."PRODUCT_
BRAND_CODE" = "SLS_PRODUCT_DIM"."PRODUCT_BRAND_CODE"
and
#prompt ('Field','token','"SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_LINE_
EN"')# like #prompt ('Value','string')#

This is the same basic query that joins the product related tables and fetches required columns. The last statement in WHERE clause uses two prompt macros. We will talk about it in detail.

How to do it...

  1. We have already created a list report based on an SQL query subject as mentioned previously. Drag the columns from the query subject on the list over the report page.

    Use of macros in IBM Cognos 8 Report Studio

  2. Now create a new prompt page.
  3. Add a value prompt on the prompt page. Define two static choices for this.

    Display value Use value
    Filter on product line "SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_LINE_EN"
    Filter on product name "SLS_PRODUCT_LOOKUP"."PRODUCT_NAME
  4. Set the parameter for this prompt to 'Field'. This will come pre-populated as existing parameter, as it is defined in the query subject.
  5. Choose the UI as radio button group and Filter on Product Line as default selection.
  6. Now add a text box prompt on to the prompt page.
  7. Set its parameter to Value which comes as a choice in an existing parameter (as it is already defined in the query).
  8. Run the report to test it. You will see an option to filter on product line or product name. The value you provide in the text box prompt will be used to filter either of the fields depending on the choice selected in radio buttons.

    Use of macros in IBM Cognos 8 Report Studio

IBM Cognos 8 Report Studio Cookbook Over 80 great recipes for taking control of IBM Cognos 8 Report Studio with this book and eBook
Published: June 2010
eBook Price: $35.99
Book Price: $59.99
See more
Select your format and quantity:

(Read more interesting articles on Compierehere.)

How it works...

The data type (second argument) of Prompt() function determines how the value is returned. For string type, the value is returned within a single quote. However, there is a data type called 'Token'. When you use this, function accepts a string value and puts it literally within the expression, that is, without quotes.

Here we have used this functionality to dynamically change the field on which filter is applied. The two possible tokens are defined in the USE VALUE of the radio button. Depending on the user's choice, one of the token will be placed in the query and will form the left part of filter expression.

Right part of the filter is a standard string parameter. Whatever value the user types in the text box prompt will be wrapped in single quotes and then placed in the SQL statement.

Effectively, the resulting expression will be something like this:

"SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_LINE_EN" = 'XYZ'

Using prompt and promptmany macros in query subject

This recipe will show you that macros can be used with standard query subjects as well.

Getting ready

Create a simple list report based on GO Sales Data Warehouse (Query) package. Insert Product line, Product name, Product color, and Product size as the columns.

How to do it...

  1. Go to Query Explorer and open the query used by list.
  2. Add a detail filter with following definition:

    [Product line] = #prompt('ProductLine')#

  3. Add another detail filter as follows:

    [Product name] in #promptmany('Product')#

  4. Run the report to test it. You will see two mandatory prompts. The one for Product line will let you enter one value. Whereas the other one will be on product and it will allow you to enter multiple values.

How it works...

This is the same Prompt() macro which we used in prior recipes with native SQLs. As you can see, macros can be used in standard query subjects. You can utilize them in filters, data items, and slicers.

The strength of this feature is seen when you use the other macros like substitute, CSVIdentityNameList, TimeStampMask, and so on in data item and slicer.

Showing the prompt values in report based on security

This recipe combines the techniques learned in prior recipes to achieve a business requirement. A report shows sales data by country and product line. Users can choose to see data for one or more countries.

However, we need to implement a security mechanism such that a user can choose only those countries to which he is supposed to have access. This is determined by the user groups he belongs to.

Getting ready

Create a simple list report with Country, City, Product line, and Sales Quantity as columns.

How to do it...

  1. We will start by adding a filter for countries. For that, go to Query Explorer and insert a new detail filter. Define it as:

    [Country] in ?Countries?

    Use of macros in IBM Cognos 8 Report Studio

     

  2. Now, add a new prompt page. Drag a value prompt on to it.
  3. Follow the prompt wizard to set the following:

    • Link it to existing parameter called 'Countries'.
    • Create a new query for this prompt and call it 'Countries'.
  4. Go to Query Explorer and open the Countries query subject.
  5. Add a detail filter and define it as:

     

    [Country] in
    (#CSVIdentityNameList(',')#)

    Use of macros in IBM Cognos 8 Report Studio

  6. Run the report to test it. You will see that you can see only those countries in the value prompt to which the user is supposed to have access. For my account, I can see only 'Spain' as I have set the membership accordingly.

How it works...

This recipe simply combines the technique we learnt in prior recipes. We use CSVIdentityNameList() macro to retrieve the user group information.

We use this macro in the prompt query in order to restrict the values coming through in the value prompt. Whatever values are selected by users are then passed as a standard parameter for filtering to the report query.

String operations to get it right

 

A report is required to show sales by date and product lines. This report should show data only for current month (full month).

Getting ready

Create a simple list report with Date, Product line, and sales Quantity as columns.

Use of macros in IBM Cognos 8 Report Studio

How to do it...

  1. Open Query Explorer. Go to the query used by the list object.
  2. Add a new detail filter and define it as:

    (_first_of_month($current_timestamp),'yyyy-mm-dd')# and
    #timestampMask(_last_of_month($current_timestamp),
    'yyyy-mm-dd')#

  3. Run the report to test it. Unfortunately, the GO Sales database doesn't hold data for year 2010. However, if you insert rows for current month in the database, you will see that they are retrieved by the report.

How it works...

Here I am introducing you to four new elements usable in macros. First one is a session parameter called current_timestamp. Session parameters are accessed in macro by putting a dollar sign ($) before them. $current_timestamp returns the current date and time on the Cognos server.

Then we use functions called _first_of_month() and _last_of_month(). These functions accept the date-time value and return corresponding first and last days of the month. For example, if today's date is 21st Jan 2010, then #_first_of_month($current_timestamp)# will return 1st Jan 2010.

Finally, we use the timestampMask() function to mask the time part and return date in required format. This function takes several format strings as second argument and we are passing yyyy-mm-dd for that.

This way we are using macros to determine the date range for current full month. We use them to filter the data in our detail filter.

You can use this concept to build up your own logic using different macro functions to achieve required functionalities, that are not available as standard in Cognos Report Studio.

There's more...

I would highly recommend checking out the other macro functions using Framework Manager.

Use of macros in IBM Cognos 8 Report Studio

FM gives you a ready list of available functions, their descriptions, and a place to quickly try and test them.

Showing user name in footer

Let's examine two more session parameters which are very useful in real-life reports. Reports are often printed and handed over to other members/teams to have a look. For a person who is looking at a printed report, the most important thing is to know the time when the report was run. That is why we usually put the timestamp in the report footer.

However, it is useful to record who ran the report. This helps us to go back to the person in case of any queries. This recipe shows you how to display the user's name and the machine on which report was run in the footer.

Getting ready

Pick up any of the existing reports.

How to do it...

  1. Go to Query Explorer and create a new query subject called User.
  2. In that query subject, add a new data item. Call it Machine and define it as:

    #sq($machine)#

  3. Then add another data item and call it as User. Define it as:

    #sq($account.
    defaultName)#

    Use of macros in IBM Cognos 8 Report Studio

  4. Now go to the report page. Select anything on the page. Using ancestor button, select the whole Page object.
  5. For this, amend the Query property and link the page to User query subject.

    Use of macros in IBM Cognos 8 Report Studio

  6. Now drag the User and Machine data items from 'Insertable objects' pane on the report footer.
  7. Run the report to test it.

    Use of macros in IBM Cognos 8 Report Studio

How it works...

Here we are using two session parameters, namely $account.defaultName and $machine. They are accessible within macro and a macro has to be written within a query subject. Hence, we create a new query subject to define these two items. Then we link the page with it and drag the items on the report footer.

The session parameter $machine has been introduced recently in Cognos Report Studio. It was made available from version 8.3 onwards.

There's more...

If the user directory is properly set up, you might be able to access more user information, such as email id, given names and surname.

Use of macros in IBM Cognos 8 Report Studio

Please take your time to examine other session parameters using Framework Manager.

Summary

In this article we have learned

  • Add data level security using CSVIdentityMap macro
  • Using prompt macros in native SQL
  • Making prompts optional
  • Adding a token macro
  • Using prompt and PromptMany macros in query subjects
  • Showing the prompts in a report based on security
  • String operations to get it right
  • Showing a user name in the footer

If you have read this article you may be interested to view:


IBM Cognos 8 Report Studio Cookbook Over 80 great recipes for taking control of IBM Cognos 8 Report Studio with this book and eBook
Published: June 2010
eBook Price: $35.99
Book Price: $59.99
See more
Select your format and quantity:

About the Author :


Abhishek Sanghani

Abhishek Sanghani was born in India and attended Mumbai University, where he majored in Computer Engineering. He began his career in 2004 as a Business Intelligence and Cognos Consultant, and has worked with leading IT and financial services companies since then.

He pursued Finance Management along with his work in the field of Cognos and BI, successfully progressing and winning awards and certifications year-on-year. Presently, he is working in the United Kingdom, utilizing his skills of Cognos, SQL, BI, and data warehousing. In his free time, he writes technical blogs and also provides training/seminars on demand.

He first authored Packt Publishing's book IBM Cognos 8 Report Studio Cookbook, which was well received worldwide. He has recently composed a video course called IBM Cognos 10 Report Studio Fundamentals, which is available on the www.packtpub.com website for download as well as online streaming.

Books From Packt


Oracle Database 11g – Underground Advice for Database Administrators
Oracle Database 11g – Underground Advice for Database Administrators

IBM Lotus Notes and Domino 8.5.1
IBM Lotus Notes and Domino 8.5.1

IBM Cognos 8 Planning
IBM Cognos 8 Planning

IBM WebSphere eXtreme Scale 6
IBM WebSphere eXtreme Scale 6

Application Development for IBM WebSphere Process Server 7 and Enterprise Service Bus 7
Application Development for IBM WebSphere Process Server 7 and Enterprise Service Bus 7

Microsoft Silverlight 4 Business Application Development: Beginner’s Guide
Microsoft Silverlight 4 Business Application Development: Beginner’s Guide

Microsoft Dynamics AX 2009 Programming: Getting Started
Microsoft Dynamics AX 2009 Programming: Getting Started

Oracle Coherence 3.5
Oracle Coherence 3.5


Your rating: None Average: 5 (1 vote)

Post new comment

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
u
H
D
L
v
S
Enter the code without spaces and pay attention to upper/lower case.
Code Download and Errata
Packt Anytime, Anywhere
Register Books
Print Upgrades
eBook Downloads
Video Support
Contact Us
Awards Voting Nominations Previous Winners
Judges Open Source CMS Hall Of Fame CMS Most Promising Open Source Project Open Source E-Commerce Applications Open Source JavaScript Library Open Source Graphics Software
Resources
Open Source CMS Hall Of Fame CMS Most Promising Open Source Project Open Source E-Commerce Applications Open Source JavaScript Library Open Source Graphics Software