Friday, 30 August 2013

Description of my book on Oracle APEX 4.2 reporting

Oracle APEX 4.2 reporting is designed to bring the best of the reporting world for intermediate –advanced readers. The book is available at It is designed to expose APEX developers to other reporting solutions, inform them about the strengths of each of these and to enable them to use these technologies in APEX. The book also assists designers who wish to use APEX with their existing heterogeneous enterprise so that their existing code is reused and effort in building better business intelligence systems is minimized. The table of contents of the book can be found at Let me briefly walk you through the contents of the book.

The objective of the first chapter is to quickly introduce the reader to the technology and then deep dive into understanding the fabric of the tool. The chapter also helps the reader to set the environment which is used throughout the book.
The chapter starts with a discussion on the various features of APEX. This is to give a heads up to the readers about the features offered by the tool and to inform them about some of the strengths of the tool. In order to understand the technology better, we discuss the various web server combinations possible with APEX, namely the Internal mod_plsql configuration, external mod_plsql configuration and listener configuration. While talking about the Internal mod_plsql configuration, we see the steps to enable XMLDB HTTP Server to accept http requests. In Internal mod_plsql configuration, Oracle uses a DAD defined in EPG to talk to the database. So we try to create a miniature APEX of our own by creating our DAD and by using it to talk to the database and also invoke functions that generate HTML which is sent to the web server. We then move on to learn about External mod_plsql configuration. We discuss the architecture of External mod_plsql configuration and talk about the roles of configuration files such as dads.conf and httpd.conf. We also have a look at a typical dads.conf file and draw correlations between the configurations in internal and external mod_plsql configuration. We then move on to discuss about wwv_flow_epg_include_mod_local procedure that can help us use the DAD of apex to call our own stored PL/SQL procedures.  We then have a detail chat about APEX Listener which is a JEE alternative to mod_plsql and is Oracle’s direction for the future.

Once we are through with understanding the possible configurations, we see the steps to setup our environment. We use APEX Listener configuration and see the steps to install APEX engine, create Weblogic domain, set APEX Listener in the domain and create an APEX workspace.

With our environment in place, we straight away get into understanding the anatomy of APEX by analyzing various parts of its URL. This discussion includes a natter on the session management, request handling, debugging, error handling, the use of tkprof for tracing an APEX page execution, cache management and navigation and value passing in APEX. We also try to understand the design behind the zero session id in this section.

Topics discussed till now would have given the reader a brief idea about the technology so we dig in a little deeper and understand the mechanism used by APEX to send web requests to its PL/SQL engine in the database by decoding APEX page submission. We see the use of wwv_flow.accept procedure and understand its role in page submission. We try to draw an analogy of an APEX form with a simple HTML to get a thorough understanding about the concept of HTML forms in and its role in APEX page submissions.

The next logical thing after page submission is to see the SQL and PL/SQL queries and blocks reaching the database. We turn on the database auditing and see the OWA web toolkit requests flowing to the database as soon as we open an APEX page.

We then broaden our vision by quickly knowing about some of the lesser known alternatives of mod_plsql.

We end the chapter with a note of caution and try to understand the most valid criticisms of the technology by understanding SQL Injection and Cross site scripting.

After going through the architecture we straight away spring in to action and begin the process of learning to build reports in APEX. The objective of this chapter is to help the reader understand and implement the most common reporting requirements along with introducing some interesting ways to frame analytical queries in Oracle. The chapter also hugely focuses on methods to implement different kinds of formatting in APEX classic reports.

We start the second chapter with creating the objects that will be used throughout the book and installing the reference application that contains the supporting code for the topics discussed in the second chapter.

We then focus on the process of setting up an authentication mechanism. We discuss External table authentication in this chapter and then move on to see the mechanism of capturing environment variables in APEX. A screenshot of captured variables is shown below.
These variables can help us set some logic related to a user’s session and environment. The variables also help us capture some properties of the underlying database session of an APEX session. We capture variables using USERENV namespace, DBMS_SESSION package and owa_util package.

After having a good idea of the ways and means to capture environment variables, we build our understanding of developing the search functionality in a classic APEX report. This is mostly a talk about APEX classic report features and we also use this opportunity to see the process to enable sorting in the report columns and to create a link that helps us download the report in CSV format.

We then discuss various ways to implement group reports in APEX. A screenshot of the report showing the groups is shared below.
The discussion on group report shows a way to implement it purely by using APEX’s feature and then talks about getting similar results by using Oracle database feature. We talk about APEX’s internal grouping feature and Oracle grouping sets
The section also shows the first use of JavaScript to manipulate report output. It also talks about a method to use SQL query to create the necessary HTML which can be used to display a data column in a classic report on the browser. We take the formatting discussion further by looking at a few advanced ways of highlighting report data using APEX’s classic report features and by editing APEX templates.

After trying our hand at formatting, we try to understand the mechanism to implement Matrix reports in APEX. A screenshot of a bunch of Matrix reports is shared below.
We use matrix reports to understand the use of database features such as the with clause, the pivot operator and a number of string aggregation techniques in Oracle. The discussion on string aggregation techniques includes the talk on listagg function, wm_concat function and the use of hierarchical queries for this purpose. We also see the first use of APEX items as substitution variables in this book. We will see more use of APEX items as substitution variables to solve vexed problems in other parts of the book as well. We do justice with the front end by talking about the use of JQuery, CSS and APEX Dynamic Actions for making important parts of the data stand out. We comprehend the implementation of handlers such as this.affectedElements and the use of JQuery functions such as this.css() in this section. We also see advanced formatting methods using APEX templates. We end this part of the discussion by creating a matrix report using APEX Dynamic Query report region.

Hierarchical reports are always intriguing because of the enormous ability to present the relations among different rows of data and because of the use of hierarchical queries in a number of unrelated places to answer business queries.
We reserve a discussion on Oracle’s hierarchical queries for a later part of the section and start it by understanding the implementation of hierarchical reports by linking values in APEX using drilldowns. We see the use of APEX items as substitution variable to create dynamic messages. Since we have devised a mechanism to drill down, we should also build a ladder for the user to climb up the hierarchical chain. Now the hierarchical chain for every person will be different depending on his position in the organization, so we build a mechanism to build dynamic bread crumbs using PL/SQL region in APEX. We then talk about two different methods of implementing hierarchical queries in APEX. We talk about the connect by clause first and then continue our discussion be learning the use of recursive with clause for hierarchical reporting. We end our discussion on hierarchical reporting by creating APEX’s Tree region that displays hierarchical data in the form of a tree.

Reports are often associated with supporting files that give more information about the business query. A typical user might want to upload a bunch of files while executing his piece of task and the end user of his action might want to check out the uploaded files. To understand the implementation of this requirement, we check out the various ways to implement the uploading and downloading files in APEX.

We start our discussion by devising the process of uploading files for employees listed in oehr_employees table. The solution of uploading files involves the implementation of dynamic action to capture the employee id of the employee on whose row the user has clicked. It shows the use of APEX items as substitution variables for creating dynamic labels and the use of JavaScript to feed one APEX item based on another. We extensively talk about the implementation of JQuery in Dynamic Actions in this section as well. Finally we check out the use of APEX’s file browse item along with WWV_FLOW_FILES table to capture the file uploaded by the user.

Discussion on methods to upload files is immediately followed by talking about the ways to download these files in APEX. We nest the use of functions such as HTF.ANCHOR and APEX_UTIL.GET_BLOB_FILE_SRC for one of the ways to download a file and also talk about the use of dbms_lob.getlength along with APEX format mask for downloading files. We then engineer our own stored procedure that can download a blob stored in the database as a file. We end this discussion by having a look at APEX’s p process which can also be used for downloading.

AJAX is the mantra of the new age and we try our hand at it by implementing soft deletion in APEX. We see the mechanism of refreshing just the report and not reloading the page as soon as the user clicks to delete a row. We use JavaScript along with APEX page process and APEX templates to achieve this objective.

Slicing and dicing along with auditing are two of the most common requirements in the reporting world. We see the implementation of both of these using both the traditional method JavaScript with page processes and the new method of using Dynamic Actions. We extend our use case a little further and learn about a two way interaction between JavaScript function and page process. We learn to pass values back and forth between the two.

While most Business intelligence and reporting solutions are a one way road and are focused on data presentation, Oracle APEX can go a step further and can give an interface to the user for data manipulations as well. To understand this strength of APEX, we have a look at the process of creating tabular forms in APEX. We extend our understanding of tabular forms to see a magical use of JQuery to convert certain sections of a report from display-only to editable text boxes.

We move our focus from implementing interesting and tricky front end requirements to framing the queries to display complex data types. We use string aggregation methods to display data in a column containing a varray.
Time dimension is one of the most widely used dimension in reporting circles and comparing current performance with the past records is a favorite requirement of most businesses. With this in mind, we shift our focus to understand and implement time series reports in APEX. We start our discussion by understanding the method to implement a report that shows the contribution of each business line in every quarter. We implement this by partitioning dimensions on the fly. We also use analytical functions such as ratio_to_report, lead and lag in the process of creating time series reports. We use our understanding of time dimension to build a report that helps a user compare one time period to the other. The report gives the user the freedom to select the time segments which he wishes to compare. We then outwit a limitation of this report by using query partition clause for data densification.

We bring our discussion on reports based on time dimension to an end by presenting a report based on modal clause to you. The report serves as an example to show the enormous possibilities to code by using the modal clause in Oracle.

We wrap up the chapter by understanding the mechanisms which can be used to implement data level security in APEX. This discussion includes the use of both VPD and traditional query filters.

Chapter 3 is all about interactive reports and dynamic reporting. While the second chapter was more about data presentation using complex queries and presentation methods, this chapter is about taking the presentation part a step ahead by creating more visually appealing interactive reports.

We start the discussion of this chapter by talking about the ins and outs of Interactive Reports. We postmortem this feature of APEX to learn about every possible way of using the Interactive Reports for making more sense of the data.  The chapter has a reference application of its own which shows the code in action.

We start our discussion by exploring various features of Actions menu in Interactive Reports. The discussion is on search functionality, Select Columns feature, filtering, linking and filtering interactive reports using URLs, customizing Rows per page feature of an IR, using Control Break, creating computations in IR, creating charts in IR, using the Flashback feature and a method to see the back end flashback query, configuring the email functionality for downloading a report and for subscription of reports and methods to understand the download of reports in HTML, CSV and pdf formats.

Once we are through with understanding the Actions menu, we move on to understand the various configuration options in an IR. We talk about the Link section, the Icon View section, the Detail section, the Column Group section and the Advanced section of the Report Attributes page of an IR. While discussing these sections we understand the process of setting different default views of an IR for different users.

Once we are through with our dissection of an IR we put our knowledge to action by inserting our own item in the Actions menu of an IR using Dynamic Actions and JQuery.

We continue our quest for finding newer formatting methods by using different combinations of SQL, CSS, APEX templates and JQuery to achieve unfathomable results. The objectives attained in this section include formatting a column of an IR based on another column, Using CSS in page header to format APEX data, Changing the font color of alternate rows in APEX, Using a user-defined CSS class in APEX, Conditionally highlighting a column in IR using CSS and jQuery and Formatting an IR using region query.

After going through a number of examples on the use of CSS and JQuery in APEX, we lay down a process to do any kind of changes in an IR. We present this process by an example that replaces one of the icons used in an IR with a different icon.

APEX also has a number of views for IR which can be used for intelligent programming. We talk about an example that uses apex_application_page_ir_rpt view show different IR reports on user request. The following is a screenshot of this example.
After a series of discussion on Interactive Reports, we move on to find a solution to an incurable problem of IR. We see a method to put multiple IR on the same page and link them as master-child reports. The following is a screenshot of multiple IR on an APEX page.
We had seen an authentication mechanism (external table authentication) and data level authorization in chapter 2. We use this chapter to see object level authorization in APEX. We see the method to give different kinds of rights on the data of a column in a report to different user groups.

After solving a number of problems and learning a number of things, we create a visual treat for ourselves. We create an Interactive report dashboard using Dynamic actions. This dashboard presents different views of in IR as gadgets on a separate APEX page. The following is a screenshot of an Interactive Report Dashboard.

We conclude this chapter by looking at advanced ways of creating dynamic reports in APEX. We look at the use of table function in both native and interface approach and we also look at the method to use APEX collections for creating dynamic IRs in APEX.

Chapter 4 is all about advanced reporting and pretty graphs. Since we are talking about advanced reporting, we see the process of setting LDAP authentication in APEX. We also see the use of JXplorer to help us get the necessary DN for setting up the LDAP authentication. We also see the means to authenticate an LDAP user using PL/SQL in this section. This chapter also has a reference application of its own that shows the code in action. The following is a screenshot of getting the DN from JXplorer.

We start the reporting building in this chapter by creating sparkline reports. This report uses JQuery for producing the charts. Following is a screenshot of sparkline report.
We then move on to use another JQuery library to create a report with Slider. This report lets the user set the value of the salary of any employee using a slider. Following is a screenshot of a report with slider.

We then get into the world of HTML Charts. We start our talk by looking at the various features of creating HTML chart regions in APEX. We understand a method to implement Top N and Bottom N chart reports in HTML charts. We understand the APEX’s method to implement HTML charts and use it to create an HTML chart by writing our own piece of code.
We extend this technique of generating HTML from region source a little further by using XMLTYPE to create the necessary HTML for displaying a report.

We take our space ship into a different galaxy of the charts world and see the use of Google Visualizations for creating charts in APEX. Following is a screenshot of a region that uses Google's Visualization API

We then switch to AnyChart which is a flash charting solution and has been tightly integrated with APEX. It works on an XML and we talk about customizing this XML to produce different results. 

We put our knowledge to action by creating a logarithmic chart and changing the style of a few display labels in APEX. We continue our discussion on AnyChart and use the example of Doughnut Chart to understand advanced ways of using AnyChart in APEX. We use our knowledge to create Scatter chart, 3D stacked chart, Gauge chart, Gantt chart, Candlestick chart, Flash image maps and SQL calendars. Following is a screenshot of Flash image maps.

We move out of the pretty heaven of AnyChart only to get into another beautiful space of understanding the methods of displaying reports with images in APEX. We implement Reports with images using APEX’s format mask and also using HTF.IMG with APEX_UTIL.GET_BLOB_FILE_SRC function.

We then divert our attention to advanced JQuery for the creation of Dialog box and Context menu in APEX. We create a master-detail report using dialog boxes where the child report is shown in the Dialog box. Following is a screenshot of the dialog box region.

We close our discussion in this chapter by talking about creating wizards in APEX and a method to show different kinds of customized error messages for problems appearing at different points of a Page process.

Chapter 5 is all about Advanced APEX. The topics discussed in this chapter fall into a niche category of reporting implementations. This chapter has 2 reference applications of its own that shows the code in action.

We start this chapter by creating both client side and server side HTML image maps in APEX. These maps are often used where regular shapes are involved.

We then see the process of creating PLSQL Server Pages (PSPs). PSPs are similar to JSP and are used for putting PL/SQL and HTML code in a single file. Loadpsp, a command line utility, converts this file into a stored procedure with the necessary calls to owa web toolkit functions. We have a look at the whole process in action.

The other utility we check out is loadjava. This utility helps us load a Java class as a database object. This utility is helpful if some of the Java classes are required for code processing.

We had seen the use of AnyChart in the previous chapter and this chapter introduces you to FusionCharts. We create a Funnel Chart using FusionChart in this chapter.Following is a screenshot of the funnel chart.
We also use our knowledge of PL/SQL region in APEX to create a Tag Cloud.

We then stroll into the world of APEX plugins. We understand the interface functions for plugins. We discuss the concepts and then use them to develop an Item type plugin and a Dynamic action plugin. We understand the process of defining a Custom Attribute in a plugin and then see the process of using it in APEX.

We move on to learn about Websheets and their various features. We acquaint ourselves with the interface of web sheet applications and understand the concept of sharing web sheets. We also create a few reports in a websheet application and see the process of importing and using an image in websheets. We then spend some time to learn about data grids in web sheets and the method to create them. We have a look at the Administration and View dropdowns in a websheet application.

We get into the Administration mode and understand the process of configuring the sending of mails to Gmail server from APEX.

We extend our administration skills further by understanding the ways to download an APEX application using utilities like oracle.apex.APEXExport.

Reporting and OLAP go hand in hand so we see the method of using OLAP cubes in APEX. We see the process of modeling a cube and understand the mechanism to use its powerful features.

We then have a talk about Oracle Advanced Queues that can enable us to do reliable communication among different systems with different workloads in the enterprise and gives improved performance.

We spend a brief time to understand some of the other features of APEX which might not be directly related to reporting but are good to know. Some of these features include Locking and unlocking of pages in APEX, Database Object Dependencies report, Shortcuts, Dataloading wizard and APEX views.

We bring this exclusive chapter to an end by discussing about the various packages that enable us to schedule background jobs in APEX and by discussing various other APEX and Database API which can help us in the development process.

Chapter 6 begins a new phase of our journey. Since we have explored most of the reporting features of APEX we set our eyes on other technologies that can serve as extensions of APEX. We talk about creating reports in them and then using these reports in APEX. This chapter has 2 reference applications of its own that shows the code in action.

We begin this chapter by exploring some of the PL/SQL wrappers that can help us do pdf printing. The chapter begins by discussing the process of writing code that can help us print pdf reports using both PL/PDF and PL_FPDF. We then move on to see less cost intensive measures and understand the process of coding that can help us generate RTF, XLS, CSV and HTML documents without any separate printing engine.

We move from no engine to explicit engines and see the process of deploying Apache cocoon and Apache fop on weblogic and using them for printing reports in most known formats in APEX. Following is a screenshot that shows a part of the configuration for Apache Cocoon

While cocoon and fop were used for report printing, the reports were themselves in APEX. We now check out technologies such as Eclipse BIRT and Jasper reports. We understand the process of installing these technologies, creating reports in them and then using them in APEX through Restful web services. Following screenshots are collected from Eclipse BIRT.

Chapter 7 takes us to a whole new world. We talk about OBIEE and BI Publisher in this chapter. These tools have been the face of Oracle’s business intelligence solution and are loaded with all kinds of reporting features. The primary objective to introduce these technologies to you and to show their integration with APEX is to help you understand the strengths of each of these technologies and to enable you to use them with APEX, whenever required. This chapter also has a reference application of its own.

We start our discussion in this chapter by talking about Oracle Fusion Middleware architecture since OBIEE is a part of it. We then spend some time to understand the wiring of OBIEE, its various components and their uses. The talk includes discussion on BI server component and the BI presentation server component. After understanding the basics we move on to see the process of creating a simple report in OBIEE. We learn about various OBIEE features such as selection steps, filters, hierarchies in the process.

We then switch from development mode to observation mode and have a look at some of the features that OBIEE shows in its sample repository and web catalog. We check out a typical OBIEE dashboard, understand KPI (Key Performance Indicators) and KPI watchlists. The following is a screenshot of a typical OBIEE dashboard.
We then pay some attention to create an action in OBIEE. Actions are OBIEE’s way of scheduling and delivering reports. We understand OBIEE map view which helps us use external maps provided by Google and Navteq.
This enables us to overlay our BI data on top of the maps to produce best in class location intelligence solutions. We skim over OBIEE’s strategy management feature that helps us to link business objectives and presents them in a number of solutions such as Strategy tree, Strategy wheel, Cause and effect map and Strategy map.

We end our discussion of the features of OBIEE by looking at the process of configuring an smtp server for OBIEE and understanding the delivery of emails by scheduling an OBIEE agent and monitoring it through OBIEE Job manager.

Once we have a good idea about the possibilities with OBIEE, we start looking at the process of integrating OBIEE with APEX. We start by using the web service approach and have a look at the iBotService of OBIEE that can help us trigger an agent in OBIEE from APEX and hence enable us to deliver OBIEE reports by emails. We also look at OBIEE’s HTMLViewService which enables us to fetch OBIEE reports at APEX end using AJAX.

Finally, we have a look at a less secure method to use OBIEE in APEX. We check out the process of using OBIEE’s goURL for linking it with APEX. The credentials and all the necessary information required by OBIEE are passed from APEX in the URL in this method. iFrames in APEX can also use goURL and we have a discussion on this part as well.

After having a good discussion about OBIEE we have a look at another interesting technology called BI Publisher. BI Publisher is not a new name for APEX developers since it has historically been used for report printing with APEX.

We have a brief talk about the tool and then nose-dive into the process of creation of a report in BI Publisher. The book is shipped with all kinds of code to make your life easier. We start by understanding the process of creating a data model in BI Publisher and then use the MS Word plugin of BIP to create a template. We put both these pieces together to create a BI Publisher report.

Once our report is ready, we look at the process of scheduling this report and delivering it by email.

We then move into an exclusive zone in BI Publisher. We talk about the creation of Bar code reports in BIP.
Note that we haven’t discussed these reports yet in any of the technologies so far so this type of report makes BI Publisher unique. We then take our BI Publisher development skills to a whole new level by looking at the possibilities of coding dynamic reports in BIP. This talk includes discussion on changing columns on the fly, changing groupings on the fly, changing sort order and much more.

Once we have seen some of the good reporting features of BI Publisher, it is time for us to get into the integration. We start this discussion with the traditional method of using the convert servlet of BI Publisher for report printing. In this method, the data and the template required by BIP to print the report are stored at APEX end and BIP just severs as a printing engine.

We then move on to see the use of BIP’s werbservice for integration with OBIEE and finally check out a less secure method of using BIP’s guest folder method for using BIP reports in APEX.

Chapter 8 is one of my favorites. Till now, we have been talking about using webservices in APEX but this teaches us about the creation of different types of webservies. The spectrum includes the use of PL/SQL to Resource Templates of APEX Listener to BPEL for the creation of webservices. Not only this, the chapter also talks about using statistical tools such as Oracle R for predictive analysis in APEX and the use of Google API to help us import the data from external servers for advanced analytics.

We start the discussion of this chapter with talking creating the necessary ACL and assigning the right grants to schemas. We then set XMLDB services which help us to project stored procedures and functions as web services. We then have a look at parsing the response of an invocation to a stored procedure using XMLDB services. The stored function which is invoked is such that it returns different columns of a single record. We then device a function that is capable of returning a bunch of records and we parse its response and display the result in a report region. We also see the process of passing APEX items as inputs to XMLDB services. We see a report region that uses XMLTable for parsing the web service response. Until now, we had been handling stored procedures and functions through XMLDB webservices but now we fire queries on tables using native web service and parse its response.

We then move on to see the process of configuring and creating RESTful web services using Resource Templates. The Resource Templates return JSON objects as response and we use see a method to parse the response in our report regions.

Finally, we look at a process of creating a RESTful PL/SQL webservice using DADs. We see the process of passing arguments to this webservice by using RESTful webservice reference in APEX. We also have a look at the method to parse the response of this webservice.

BPEL is a glue that can hold a variety of technologies together in an heterogeneous system. It also has a unique feature called Human Workflows and its associated worklist that can help us code complex business decision processing systems and can help us transfer the job from the workstack of one user to the workstack of another. It is these wide applications of the technology that made us look into the various possibilities in BPEL and to find ways to use them in APEX. We use this part of the text to install, configure and create both synchronous and asynchronous processes in BPEL which can then be used in APEX just like any other SOAP webservice. We also have a detail discussion on using BPEL Human Workflows and have presented an example to use it.

Once we are through with BPEL we have a short section dedicated to understanding the creation of reports in SAP Crystal reports and using them in APEX. We also have short sections dedicated to the migration of data and code from MS Access to APEX and from Oracle Forms and Reports to APEX.

We bring our discussion of this chapter to an end by elaborately discussing about the use of Oracle R and Google API in APEX. The talk on Oracle R implements a use case of finding the best places to place ATM machines in an area of interest and to get a png image that shows the plot of the points suggested by Oracle R for placing the ATM machines in the area of interest.

The discussion on Google API on the other hand is about using the google Places API for finding the latitude/longitude information of important landmarks such as bus stops, airports etc. The process described in this section fetches the information from the API, parses it and presents the extracted information as an output of a SQL query. The code i.e. the SQL query that triggers the request to fire the Google API also sends the desired landmark type (for example: bus stop, airport) and the desired city to the Google API. Following screenshot shows the parsed response of Google's Places API.
The parsed information from the response can then be combined with our BI information to find the correlation of landmarks with the location of our retail store. This is however a use case and the process can be applied to get the data from a number of other Google APIs. The data can be used in APEX for a variety of analysis.

Chapter 9 is all about tuning. The chapter informs you about the best development practices and also introduces you to some of the database tools that can be used for the purpose of tuning the code.

The development best practices section discusses v(),page and region caching, pagination scheme, tuning of like comparison and many more.

Similarly, the talk on database tools includes a natter about most of the features of the database that can help you hunt a bottle neck and eliminate it.

In a nut shell, book is intended for all those who believe that making technologies work in harmony and using their strengths to meet the objectives is a potent challenge. This book is for you if you wish to spring into the action of APEX development from the time you hold this book in your hand. The book is designed for innovative architects and enthusiastic developers.

The following are a few links of the book - Book’s listing on - Publisher's Page - Article about the book on Publisher’s page. - Link on - Link on - Link on Barnes and Noble - Link on - Link on Brillions - Link o itunes - Link on - Link on riidr  - Link on OReilly

1 comment:

Damir Vadas said...

Thx for quick info for who hasn't bought your book yet.