X

It's All About the Platform.

Recent Posts

A New Mechanism For Using Direct Page Links (Deeplinks)

You may have spotted a 'Deep Links' menu item under the Administration section of the Navigator menu. This opens the page below, showing a collection of pages. These are pages within Core HCM product family who are the first to adopt a new deeplink framework. The existing deeplink mechanisms (discussed here) remain, therefore just leverage the capability that is available for the pages you wish to link to. As you can see from the url at the bottom of the screen, there is a simple pattern to the resulting links: fndSetup/faces/deeplink?objType=[thePageName] Pages are registered in an internal database table against an Object Type (the objType above) which is used in the URL. The registry entry can include support for an Action, such as add, edit, or create, along with support for parameter values.  This means your links can contain not only top-level pages but also take users directly to context-aware processes. As an example this same framework has been used to provide the new direct links in Object Workflow approvals supported for Sales Cloud, as mentioned here in the release notes. The 'Deep Links' page (screenshot above) is simply a listing of pages for reference, and it is not possible to create new registrations or change page registrations at this time. If you find pages which cannot be linked-to, using this or the existing deeplink methods, please log this enhancement requirement for Oracle Support to get the page registered in this new framework.  

You may have spotted a 'Deep Links' menu item under the Administration section of the Navigator menu. This opens the page below, showing a collection of pages. These are pages within Core HCM product...

Application Composer

How To Create Handy Reference Data Sections On Object Pages

Customizations are rarely standalone features which operate in isolation to the rest of the application, they usually need to include contextual information for users to be able to take accurate decisions. In fact many customizations are simply additions and enhancements to the core features, and having access to related data is essential. So let's consider some options to support this using customizations done in Oracle Sales Cloud, using Application Composer. Something seen in the Opportunities and Accounts standard pages is the use of Sub Tabs. As below there are different types you can add to your custom layouts. The first, the "Related Object" option, uses existing relationships between the object-in-focus and other objects in the system. This, however, does not allow you to reuse the relationships created using Dynamic Choice List fields. To use the Related Object option you must create an explicit (new) Relationship. Once created your users then have to explicitly associate records inside the sub-tab itself - meaning it does not provide an option for displaying context data for records which may be already associated. Another option is to use the "Context Link" subtab type. Here at design-time you specify the criteria to use to query the data for display. We looked at this feature in detail in this article. This can work in some cases, however the query does not work on a Primary Key - Foreign Key relationship and as such you end up querying records based on Strings (such as names), which may be duplicated or slightly mismatched. As such this also may not always be suited for displaying extra contextual information. The final option - and the focus of this article - is not to use a sub-tab at all, but to have a Field Group on the layout which contains Formula fields. Each of the field use an implicit relationship created by a Dynamic Choice List as part of the object. Let's illustrate this using an example; a Specialist (custom object) is a record which identifies a person (Resource) who works closely with a particular customer (Account). The specialist record has a few fields of its own as supplemental data, however is essentially holding the relationship between Account and Resource standard objects. When users view the Specialist records, they want to also see the contact data from the associated Account record. This allows them to have all the people involved on one screen, for use in setting up meetings and sales calls. The following shows the fields which make up the Specialist custom object. Notice that each of the Contact XXXX fields are Formulas. These simply leverage the Dynamic Choice List (which I unimaginatively called 'Account') which lists values from the Account object (OrganizationProfile). The Formula fields pull data from the Primary Contact and Preferred Contact fields on the Account object. The expression used for the formulas are like this:  return nvl(ObjectB_Obj_c?.myField_c,'No data'); As you can see the "_Obj_c" extension represents the relationship between the primary object and the secondary object as defined by the Dynamic Choice List. Read more on relationships here. As you can see using nvl() function prevents empty spaces on the resulting form (and potential NullPointerExceptions raised when the value is used in further calculation). Here is a real example taken from the Specialist object. Two items of note here: Don't forget to set the Depends On list of values to the Dynamic Choice List value that controls the relationship. This ensures it updates the fields if it should get altered on the page. Ensure the Formula Type (Text, Number, Date) matches the source field your are using (e.g. PreferredContactEmailAddress above), else you'll get format problems and errors. Finally rather than displaying these contextual fields inline with the other object fields, it makes sense to put these together in a Field Group. As shown below this is easily done within the sub tab configuration page. Here can also also define collapse the group by default, meaning users only expand the group to see the fields if needed - a good space saving option. The resulting page looks like this, where the header has the core data and contextual data is in the expandable field group. Obviously going beyond just displaying existing values, you could use the formula fields to perform calculations on the referenced values, such as displaying specialist 'fees' that are reduced using the discount rates currently setup for that specified account.       

Customizations are rarely standalone features which operate in isolation to the rest of the application, they usually need to include contextual information for users to be able to take accurate...

Integration and PaaS

Using Visual Builder Cloud Service with Oracle SaaS Applications

Further to our original introduction article on an early version of this interesting platform service, we thought it would be good to provide an update covering new features of likely interest to existing Oracle Cloud Applications developers. You've also no doubt noticed the tool has a new name, from Application Builder Cloud Service (ABCS) to Visual Builder Cloud Service (VBCS). Core Features The core parts of the service remain the same; development of hosted enterprise applications in a low-code environment. To keep the content here concise, please review our original article or take a look at a nice demo illustrating the integration with the Account object from Oracle Sales Cloud. The key here is that custom Business Objects are added and stored inside VBCS, and they use REST services to work with the Business Objects in Oracle Cloud Applications.   Business Rules Within your Business Objects you can define your own business rules. This exists for local custom objects in VBCS, and is used for the business logic layer of the application functionality, underlying that implemented in the UI. You may recognize much of the functionality here to that found in Application Composer, and indeed they both work over the same platform. Business rules are comprised of Triggers, Object and Field Validators and Object Functions. The development process has a Trigger Designer which allows you to not only define individual triggers but to visualize and combine them into clear sequences. As shown below, the trigger designer shows all triggers based on their definitions and helps ensure business objects are processed in flows that meet business requirements. The triggers have several actions available, including running Groovy script code, update or delete a record, can call another function, can send an email, can start a business process (stored in Oracle Process Cloud Service). In this way they combine the Object Workflow and Trigger functionality found in Application Composer. Triggers support conditional execution, and the declarative Conditions Builder allows the selection of an object field and a condition (i.e. operator and value). Using multiple conditions (AND / OR) and combining them into 'groups' allows it to meet more complex requirements. When you're designing your trigger you can also pick to declare the trigger condition in pure groovy code, and as such it has the full flexibility. Validators and Object Functions are short groovy scripts that return a Boolean value, which is then linked to a user defined error message. They are identical to the Field and Object Validation Rules found in Application Composer. One enhancement of note is the inclusion of an active checkbox, allowing your to turn-off validation when required (useful during development and data migrations). Object Functions exist to support more extensive groovy scripting requirements, so that more modular coding can be used. Web services can also be exlictly defined and used in your scripts. Also a logging feature for groovy scripting exists. Again all of these equate to the same features found in Application Composer. Processes VBCS includes the ability to define one or more process flows to support end user tasks and approvals. This feature leverages a prebuilt integration with Oracle Process Cloud Service, and its initial configuration is done in the Administration menu under Associated Service Instances. Note that the two services must exist within the same identity domain. The features exposed inside Process functionality are equivalent those those from Oracle Process Cloud Service as described here. Processes are fired from either the VBCS UI component actions (such as those for a button) or in the Business Rules (i.e. triggers) defined for the object. The process and business object/s work together through a REST connection defined automatically by the system during the creation of the process. Processes are versioned and explicitly deployed when ready for use. Each process also includes role definition features, separate to those in Cloud Applications, to support grouping the allowable actions. An example might be 'managers' who can execute upon approval requests. Processes support the creation of UI forms and task list pages, so that users can also interact with the process independently from the business objects when required. Additionally a combination can be used where a Task Action component can be added to an existing business object page, to support inline user actions. Extensions In addition to what you can develop inside VBCS, it is possible to install externally built packages and files to support your run-time application. There are several types: UI Components - built using the Oracle JavaScript Extension Toolkit (JET) Composite Component Architecture (CCA) Resources - your own Javascript libraries. Business Object Providers - for direct integration with external web services. Themes - for changing the look and feel using CSS. These extensions can also be shared between VBCS applications, such as a common theme. Extensions are based on JavaScript technologies (including HTML, CSS, and JSON) and are defined based on a Empty Extension Template as a base skeleton structure. Once built they are packaged and imported as a zip file. Application Data Since the data in VBCS is contained in its own database environment, the Data Designer feature allows you to both define the structures used and their properties (based on Relationships, Business Objects and Fields). Once defined, the Data Designer also lets you browse/add/edit/delete individual records. Each VBCS application has a life-cycle state (Development, Staging, Live) and holds an independent database for storing records for each of these. This helpfully means no need to clear out development or testing data. Additionally you can Import and Export your larger volumes of data - supporting both append or replace update methods. This can be done using CSV or excel files, or even data stored in another of your VBCS databases (e.g. moving your seed data from Stage to Live). Responsive and Mobile Development VBCS provides out-of-the-box responsive designed UI pages, automatically adjusting page components to suite the client screen size. In addition there are explicit configurations you can make to specify your preferences when rendering screens and components on smaller devices. VBCS also has a distinct Mobile Designer feature which allows the creation of mobile-only apps. This uses the same concepts as development in VBCS, centering around business objects, however is entirely declarative. It leverages the same tooling that you may have seen in Oracle Mobile Cloud Service, known as Oracle Mobile Application Accellerator. The resulting app runs inside the Oracle MAX App, which has to be installed on all client devices (iOS or Andriod). Embedding in Oracle Cloud Applications Once you've created an extension to your Oracle Cloud Applications in VBCS, you'll want to get it to your users. You can have a hyperlink in your Oracle Cloud Applications page that opens a second browser window with the VBCS application, but you'll need to deal with the normal back-button / user-session challenges. Better is to embed the VBCS application inside your Cloud Application. As per the screenshot below, this is explicitly supported, and also permits cross pollination of account/roles (inside the same cloud identity domain). You can optionally remove the header title bars and navigation from the VBCS application, so the embedded result looks much cleaner. This is done by specify a URL parameter ("nonav") in the embed URL that you'd use in the host Cloud Application. Furthermore to support the seamless flow to-and-from Cloud Applications, translation support exists in VBCS, offering a downloadable JSON file of all strings used, and support for re-upload with your related language entries. Learn More About VBCS This whistle-stop tour of a few features does not do justice to many of the capabilities of VBCS, for example the Page Designer and the Javascript extension options. As such please review the following resources which cover many more of the features: VBCS Documentation Books (including API documentation): Product User Guide documentation The VBCS Oracle Community forum Oracle expert Shay Smeltzers blog on VBCS The VBCS YouTube channel with >20 videos of specific 5minute demonstrations. If you've either used or are using VBCS for your extensions to Oracle Cloud Applications, we'd love to hear your stories. Please get in touch via the comments below and we'll share some lessons and concepts in future articles.

Further to our original introduction article on an early version of this interesting platform service, we thought it would be good to provide an update covering new features of likely interest...

Page Composer

Working With Recent Updates To The Page Composer User Interface

This article provides a few tips-and-tricks on working with the updated user interface for Page Composer - the tool for adjusting the properties of page components in Oracle ERP, SCM and HCM Cloud Applications. There are no significant changes in the features supported, however a familiarization with the new layout may help when attempting specific customizations. We've had a few questions on it, so hopefully sharing with the community will help others. Let's first look at adding new content. As you may already be aware, adding new components is only possible in selected "landing pages", where core functionality can not be obstructed. An example is the homepage, where you'll see the buttons for adding content and configuring pane layouts appear when you click on the Add Content tab. The new layout seems to allow you to attempt to add components from the Page Composer Catalog (which is now hiding in a left-hand side pane by default) to a page which doesn't support them. When you do this you will see the following message. Go back to the Add Content tab and see if the page can be used, looking for a container box pane and the buttons shown above. Next let's look at editing component properties. This is where you'd use Expression Language (or literal values) to customize how that component looks or performs. Using the Select tab, you will be able to access the following Edit Component popup, for those components which support customization. Alternatively you can use the Structure tab (now hidden in a pane at the bottom of the window) to access the structure hierarchy. Notice the Dock action which helpfully sticks the pane in place. By clicking the 'cog+pencil' toolbar button you can get a full list of component properties. Note that not all properties will support your custom values, and on the whole those intended for customization are shown in the simplified equivalent popup shown above. If the structure pane toolbar buttons are disabled then the component cannot be customized, usually to prevent disrupting the core page functionality. If you have a business case for customizing an additional page or component then please contact Oracle Support to get the enhancement raised. Another common question is how to access data. Every page has a list of "bindings" available for use, as explained in this article. Again the data available is page-specific, and there is no directory or documentation for this, so simply look into the page before designing your customization. In addition there are some common webcenter variables available, such as generalSettings and securityContext to get common values like username or job role. For more hints and tips on page composer take a look at this whitepaper and also the links in this article.

This article provides a few tips-and-tricks on working with the updated user interface for Page Composer - the tool for adjusting the properties of page components in Oracle ERP, SCM and HCM...

Using the Public Unique Identifier (PUID)

This document sequencing feature allows you to configure a uniquely identifiable field on your Oracle Sales Cloud business objects. You can specify both a fixed prefix and a number/character system (or radix). PUID is a configuration which applies to existing fields, and without PUID setup these are already populated with a unique 15 digit numerical value. Example fields are ActivityNumber, OpportunityNumber and PartyNumber (for Accounts). This value can now be configured using a PUID to help support specific business requirements. There are two ways to set this up. Common Setup Two Profile Options can be set to default values for prefix and radix. These are accessible using the Setup and Maintenance task 'Manage Public Unique Identifier Profile Options' as shown below. The values set here apply the same for ALL objects with a PUID field. The prefix is simply a text string. The radix lists a set of value patterns you can use. For more details on the Radix value options take a look at the example tables in this documentation page. Interestingly the radix list comes from lookup ZCA_PUID_ENCODING which could be extended by adding your own Lookup-Type entry and all the associated Lookup-Code values. Business Object Setup If you wish to have a PUID configuration for a specific Business Object, then you can use the Setup and Maintenance task "Manage Public Unique Identifier Sequence Generation". As you can see below, once you select a Business Object you can then define the values it will use. These will supersede the Profile Options defaults mentioned above.   Example First I have created a PUID Sequence definition for the Opportunity object. As shown below, the Opportunity Number field now has a value based on the settings above. Coming Soon In Release 13 the support for PUID is extended to each one of your Custom Objects. This is done through the addition of a Record Number standard field, whose values are set using the exact same configurations discussed above.

This document sequencing feature allows you to configure a uniquely identifiable field on your Oracle Sales Cloud business objects. You can specify both a fixed prefix and a number/character system...

Creating Child Custom Object Records Using RESTful Services

As shown below on the Custom Objects page in Application Composer it says all child custom objects provide access to their REST Resource "Via Parent", but what does this mean exactly and how do you work with this? In essence it means the child object records have to be queried (and created, updated, or deleted) always in the context of a single parent record. So for example if you created Opportunity 210511 then to work with Opportunity Revenue Lines you'd have to specify which parent record that applies, in this case 210511.  This makes sense because child records exist only for their parent record and you cannot create a reusable child record that can be referenced by more than one parent (for that you'd create another top level Object and a Relationship). Querying Children To find the child records you include the Primary Key ID field value in the rest resource URI, after the object API name. Then the /child/ folder and finally the Collection Name you specified when creating your child object. Let's use an example to illustrate this, based on custom objects. My parent custom object is FishingKit_c and has a child object Rod_c which forms the collection name RodCollection_c. To return all the child records of my 'Carp Fishing UK' FishingKit record, I first determine it has the ID 300000009209985. This is shown in the response when it was first created, or I can see this by querying it using a simple REST request as explained here. The following would be then be URI that I would issue my GET request to return the child records: /salesApi/resources/latest/FishingKit_c/300000009209985/child/RodCollection_c Here is the same using a Windows REST Client program to illustrate use:   Creating Children As you'd probably imagine, the POST request to create records is done to the same child collection URL based on a single parent record ID. /salesApi/resources/latest/FishingKit_c/300000009209985/child/RodCollection_c Obviously the payload needs to include Required fields as a minimum, so as shown below in my simple case this is just the RecordName. Oh and don't forget media type: application/vnd.oracle.adf.resourceitem+json. Update and delete operations are exactly the same, always including the parent record ID in the Resource URI.

As shown below on the Custom Objects page in Application Composer it says all child custom objects provide access to their REST Resource "Via Parent", but what does this mean exactly and how do you...

Notes from the UK Oracle User Group Annual Conference 2017

As long time readers will know, every year we attend the UK Oracle User Group conference. As the largest gathering of Oracle professionals outside the USA, it's a great opportunity (local to me) to meet people and discuss ideas, thoughts and plans. Again this year it ran in Birmingham and with the Applications specific stream (aka Apps17) alongside the Technology stream (aka Tech17), it allowed attendees to dip into both as they see fit. Applications sessions were split into the following categories and you can view the three day agendas here. Applications Technology     Business & Strategy     Cloud Financials and HCM     Oracle E-Business Suite HCM and Financials     PeopleSoft Customer Experience Business Analytics Similarly you could identify yourself as being part of a particular community using the free badges provided, as illustrated by the photo below. These were a useful ice-breaker when networking during the session breaks in the exhibition hall (the adjacent photo).      Our Sessions One phrase I heard a few times was that the move to Cloud Applications is an "exercise in Change Management" - meaning the optimization of existing business processes to meet the best practice standards baked into Cloud Applications. This harmonized nicely with my session related to trying to move customizations to the cloud. Here I share a simple methodology in approaching this challenge filled with common sense practices to help drive success. You can download the slides here. My second session was related to integration with Oracle Cloud Applications, a topic of much interest for Applications customers with heavily integrated existing systems. Indeed one attendee explained in the session they have over 300 integration's from their E-Business Suite ERP system. My session went thought the different options, with a particular focus on explaning the web-service based integration - but only after pre-built opportunities are considered. Again a focus on simplicity and a common-sense approach here. Use this link to download this sessions slides. In addition we led two round-tables which we found well attended and lead to interesting group discussions. What was interesting was the mix of Oracle Partner / SI particpants and end users - something that brought input from multiple perspectives. As an Oracle Employee I found this very valuable and came away with lots of ideas of things we could do to help. Innovation Excitement around new technologies actually spilled over from the Technology stream into some of the Applications stream too, which was great to see. This seemed to suggest both the increased maturity of the technologies involved as well as the speed of adoption thanks to Cloud delivery. For example our colleague David Haimes from the Cloud Financials development team did a session on Blockchain and how this may fit into Oracle Applications of the future. You can read more about this from his blog here. Another session I enjoyed was Lucas Jellema's interesting demo of using Twitter (to illustrate a point) and then Apache Kafka as the event-driven integration platform. This is a common requirement for Applications customers and the use of Kafka is something Oracle is behind in many of it's new platform services, such as the Oracle Event Hub. Machine learning was also strongly represented, with a real Application examples driven from technologists such as Oracle's Grant Ronald in his sessions related to Chatbots in the CX world. Read more about these fascinating opportunities and see demos here and here. Up Next The UKOUG are hosting an Oracle Cloud Applications event day in London during April 2018. We'll be there and hopefully get a speaking slot. If you're local the Call for Papers is open now (Dec 2017) and we'd certainly welcome any ideas for topics you'd like us to cover too.

As long time readers will know, every year we attend the UK Oracle User Group conference. As the largest gathering of Oracle professionals outside the USA, it's a great opportunity (local to me) to...

Application Composer

Fusion Cloud Applications Release 13 - Highlights For Developers

Generic Features The following new features all apply to Release 13 of Fusion Cloud Applications.  Multiple Homepage Styles You now have new options to tailor the look-and-feel of the homepage. This includes a homepage layout tab and support for a panel view or a banner view under the Appearance feature.  In addition, under the Structure feature you can now reorder and rename all custom Pages added to the homepage. Enhanced Setup and Maintenance Under what is also known as Functional Setup Manager lies an enhanced set of configuration features under a 'My Enterprise' section. This provides Offerings and Opt-in features that allow you to enable the functionality that is applicable to your organization, as-and-when they are introduced. In addition product functionality is now presented in a hierarchy to show the dependencies. Read more about this here. SmartText for Engagement Cloud For users of the Service side of Oracle Engagement Cloud (i.e. Service and Sales functionality together). To aid service agents working on service requests, SmartText allows predefined blocks of text to be included in messages and description fields. It supports the merge of run-time data (e.g Severity below)) for dynamic and personalized information and a complete reuse/sharing capability to be controlled as desired. Simplified Version Naming A name method of identifying a particular release is now being used. This helps easily identify quarterly updates by adding a reference to the related year and calendar quarter. This takes the last two digits of the year (2017), and an A, B, C, or D based on the four calendar quarters. For example, the screenshot below shows the current (Sep 2017) from the Sales Cloud Documentation. Application Composer Features The following features are specific to Oracle Sales Cloud and products that include the use of Application/Data Composer, as discussed here. Consolidated Object Display Hierarchy As you can see below, all Objects are all displayed together by default. From this view you can then filter them by 'tag' - show just those related to Sales (generally the transactional objects) and those related to Service (the common setup objects). Dynamic Filtering Criteria on Dynamic Choice List fields and relationships Custom Dynamic Choice List (DCL) fields can now include a very finely filtered list of records. This allows you to include just the most relevant records to the current context. This new powerful feature allows you to define bind variables based on the contextual data for your filter. Full details on this can be found in this video fro our Youtube channel. Links to Records in Approval Notifications As shown below, notifications now include hyperlinks to the specific records to which they apply. This simple feature requires no setup and simply increases user productivity. Delete support for UI Metadata within a Sandbox A small use useful addition is the ability to delete unpublished layouts, field groups or subtabs from within your sandbox. Groovy Debugger This tool allows you to quickly analyze your scripts to help troubleshooting and enhancement. It reduces the need to repeatedly execute scripts and to monitor the run-time log messages output. The best way to explain is through an simple illustration. First I created an onCreate Object Trigger on my new custom object called 'Vehicle'. Clicking the Custom Objects link (tree node) in the left-hand window of Application Composer, shows all custom objects in a table. From here I click my Vehicle object and press the debug button on the toolbar, shown below. This launches the debugger in a separate browser window. The debugger launches In a second browser window. Next a break-point is set by clicking the line number in the code window. Notice the red star on line 2 in the screenshot below. Next in the normal user interface and hit the Create button on the Vehicle page. The debugger refreshes itself (in the separate window) and shows the Stack and Variables data at my break-point. Notice the normal user UI waits at the breakpoints, so use the debugger toolbar icons (step in/out/over) for navigating multiple breakpoints. Object Workflow has a Groovy Action New in Release 13 is the option to add to Object Workflows the execution of a groovy script. The script is predefined as a generic Object Function and is selected to be called from within an Object Workflow. The Object Workflow always executes in the context of the object record, so the groovy works with run-time data as well as include the normal CRUD operations performed on queried data. Obviously execution happens away from the user interface so there is no interaction with the User Interface, however your handled messages will be written to the run-time message log. Metadata Configuration Report This new report provides a comprehensive view of all your Application Composer customizations. It includes everything published (not sandbox content) in the environment, by all users. It has a full summary at the top, followed by object-specific configurations including all properties of fields, triggers, validation rules, object workflows, object functions and more. Once generated it can be downloaded as a HTML or XLSX file and reviewed and stored offline to follow best practice configuration management. Provisioning Rule for Sales Restricted User Role The security role of Sales Restricted User Resource is an easy way to allow users read-only or limited-edit access to your Sales information. This can now be included in a Provisioning Rule for automatic assignment to users through the Sales Restricted job role. Support Conditionally-Required and Conditionally-Updateable properties on Standard Fields This popular feature used to control the use of custom fields is now available for standard fields. As such you can add a groovy condition to dynamically set the 'required' and 'updatable' properties of all fields. The following video demonstrates this feature.   Mass Update of Fields It is now possible for users to update multiple fields at once, saving time making voluminous changes. This is configurable in Application Composer for each Layout. The following demo illustrates how this works.  

Generic Features The following new features all apply to Release 13 of Fusion Cloud Applications.  Multiple Homepage Styles You now have new options to tailor the look-and-feel of the homepage. This...

Groovy

Using The Updatable Field Constraint: How To Lock Down Fields After Record Creation

Using Application Composer it is easy make a field available to capture data when records are created, but to then make it read-only thereafter. Consider the following use-case. An Offer record (a new custom object) should initially capture data such as the originating user, authorization details, and valid start date. These fields should not be changed once submitted. They're useful to show to users but are never editable. The solution given here is based around using a combination of the getPrimaryRowState API (states were discussed in this article) and the Updatable field property. Our example is short and simple, and I've seen other ways of achieving similar using Validation Rules - but they commonly result in more costly event-based processing and complex user-interactions. So looking deeper initially we have the Valid From Date field. As you can see it already has a validation rule on it, so we might not want to add more. To this field we add the following expression on the Updatable constraint. The isNew() call returns TRUE - making the field accessible - when the record is being created. After that it always returns FALSE such as upon field update. As such, after the record creation it looks like this, locked from editing by users. Note that this constraint applies through the User Interface pages only, and the field value can be updated by other groovy code you write.

Using Application Composer it is easy make a field available to capture data when records are created, but to then make it read-only thereafter. Consider the following use-case. An Offer record (a new...

Groovy

Groovy Tuesday: Implementing The Logic For Error Messages In Validation Rules

It was mentioned in previous articles that the Object and Field Validation Rules needs to return a Boolean to control when the user sees the message. This could be slightly confusing for first time users, since when the groovy expressions returns a TRUE then no error message will show, and if it returns a FALSE then the validation rule fails and the error message is shown. This may be the opposite logic of other systems from where new Sales Cloud users might be migrating. This means if the implementation includes introducing the rules they need re-engineering to the opposite logic. Luckily there is a quick way of doing this. Let's take an example seen recently in the comments. The requirement was to validate that the AddressLine1 and AddressLine2 fields of the Address standard object (used in Accounts) are limited to a maximum of 30 characters. In this case it is easy to think of the rule as "if address is greater than 30 characters show the error". This, however needs reversing to match the Boolean result in Validation Rules (i.e. return FALSE). As such there are two options: A) Write the rule based on the same logic as is commonly known, but then negate the whole thing with an exclamation mark (!) initially: !((Address1.length()> 30) || (Address2.length()>30)) B) Rethink the rule in the negative case, in this case it would be to show the error when the Address fields are less than 30 characters in length: (Address1.length()<30) || (Address2.length()<30) Here is the result, just for illustrative purposes, both groovy expressions producing the same result:

It was mentioned in previous articles that the Object and Field Validation Rules needs to return a Boolean to control when the user sees the message. This could be slightly confusing for first time...

Application Composer

See How Easily You Can Extend The Use Of Addresses On Customer Account Records

Introduction In addition to our previous article on setting up new Address Formats using Setup and Maintenance tasks, the following article looks at display options on the Sales Cloud Account pages. As shown below, out-of-the-box an Account record only supports displaying a single Address record at a time. This however, might not be the real-world situation, where a single customer Account may have addresses to use for different products and services they purchase, as well as for other purposes such as centralized administration and financial control. Rather than supporting this by having multiple Accounts records for a single logical customer (each with a single address), an alternative choice is to make a configuration to allow users to view, add and set (as primary) several different address records on one Account record. Multi-Address Configuration On first glance (and based on the articles in this blog) one might think this is enabled in Application Composer under the Address standard object. However because this Common component is not exposed as a standalone object in Sales Cloud pages, it has no customizable pages of its own at all, as shown below. Another considered option might be under the Account custom tabs, however again this is not exposed as a fully customizable sub-tab region. The answer - relatively unusual for Sales Cloud - is to use Page Composer to make the related ADF page components visible. Use the following steps to enable multiple addresses for Accounts. 1. To do this you will need a custom Details Layout on your Account object pages. If you're still using the Standard Layout then you should duplicate it and add a new Layout. 2. In the new layout, under the Profile tab, find the "Show" link under Multiple Addresses. Click and it changes to the word "Hide". Save the layout. Note the Primary Address region also available for Show/Hide on this page. When selected this enables a region which displays all the fields for the selected primary address record - useful for quick editing. That said, it is recommended to show either Primary Address (single addresses) or Multiple Address, and not both at the same time. 3. Now on reopening the Account profile tab you'll see the change in the page, supporting a single Primary Address with details shown when selected, along with the table of multiple addresses and button to add (and delete) others. Showing More Address Fields You might also wish to show more data associated with an address.  This is relatively simple using the following process: 1. Start from the Edit Account page (any record) in Sales Cloud. 2. Click [Your Name] (top right of the screen) - Settings and Actions - Administration - Customize Pages. Select the SITE level. 3. Now navigate to the Account Address popup. This is shown when clicking the address hyperlinked text. 4. Click "Select" in the Page Composer toolbar and hover over the fields region on the popup. When colored blue, click to edit and select the Edit Components option. 5. As shown above, use the check-boxes to display (and reorder) the Child fields as required. Address Types One notable absence from the extra items for display above is the Address Type. Note that this field actually controls some downstream functionality. Out-of-the-box this field is hidden and the value defaults-in for all new address records based on Profile Option "Default Address Type for Account". To allow the use of other address types open the same pop-up in Page Composer and click the narrow region just above the fields region, as shown below. When you select Edit Component from here you'll find Child fields that includes Type. Once enabled this appears as shown above, with a list of values accessible to all users. As mentioned, other values for Address Type can be useful to display useful address information to support the sales process, such as where to send invoices.

Introduction In addition to our previous article on setting up new Address Formats using Setup and Maintenance tasks, the following article looks at display options on the Sales Cloud Account pages. As...

Groovy

Using Custom Profile Options For Configuration Values In A Sales Cloud Extension

This is another short worked-example of something that we've seen used in customizations and extensions. In this use-case the new functionality requires a reference configuration value (or values) to be set by an administrator. This value is then retrieved in code as required. Examples include integrated system connection information stored as Third Party Application entries under Setup and Maintenance - Topology, and reference data stored as rows in special configuration Custom Objects. In this simplified example we'll store values for commission rates. We'll then use them in a custom field to display the prospective bonus for the sales person on each lead. First we setup a new profile using the Manage Profile Options task under Setup and Maintenance. We enter a unique name and ensure the Application and Module values match the intended usage, else the value will always return null.  In this example we want a static default commission rate, plus the option to add user specific values for our best sales people. As such we configure the profile to support two levels; SITE values that apply for everyone, plus USER values that can supersede them. Once saved we can then get our administrator (or sales manager) to add the actual rates as profile values.   Next under Application Composer we add a Potential Bonus custom field to the Sales Lead object. This is a Number Formula field using the following to multiply the Deal Amount field value by the profile value: def val = nvl(DealAmount,0) import oracle.apps.fnd.applcore.Profile def prf = nvl(Profile.get("XX_REWARD_RATES"),0) def result = val * prf return result This Potential Bonus field is then displayed on the Page Layout for users to see, and hopefully motivate them to sell more. As you may note from the final value above, it used a reward rate of 0.7 from the USER level (since they are jjefferson), whereas if this was unset then it would have used the default SITE level value of 0.2. If profile values are changed then the new value will be used when the user next logs back in.

This is another short worked-example of something that we've seen used in customizations and extensions. In this use-case the new functionality requires a reference configuration value (or values) to...

Groovy

Accessing Product Groups and Items Via Groovy

Developing customizations that include the product-items and product-groups associated with Sales Cloud objects (Opportunities) is possible through the use of a specific set of artifacts exposed in Application Composer. This article looks at the three main methods for this. Firstly access groups/items currently associated with the in-context object. This is the easiest method, where Product Groups and Items details are accessible via Related Objects and Collections. As such if you consult the Groovy Palette you'll see these, such as below for Opportunities.  Which exact object to use will depend on the data you need to access. Secondly access data that is not currently assigned to the in-context object, using the NewView method on one of the available View Objects. The following example is from a Formula Field which looks up a custom field on the Product Group that matches the query. def vo = newView('ProductGroupDetailBase') if (vo.first() == null){  return "nothing" } else { println('groups found') def vc = newViewCriteria(vo) def vcr = vc.createRow() def vci = vcr.ensureCriteriaItem('ProdGroupId1')  vci.setOperator('=') vci.setValue(nvl(custField_c, 0)) vc.insertRow(vcr) vo.appendViewCriteria(vc) vo.executeQuery()  while(vo.hasNext()){    def p = vo.next()    return nvl(p.GroupCustomNote_c, 0) } } Finally, you could define and use Web Services for accessing all product groups and items. The following notes give some good examples Oracle Fusion Product Hub Web Services - details About Commonly Used Web Services (Doc ID 2009590.1) Using Web services - sample payloads to query, create, update, and delete items. (Doc ID 1915263.1) Using ItemServiceV2 Web Service to find an Item (Doc ID 2004319.1) Product Web Service Questions (Doc ID 1591950.1)

Developing customizations that include the product-items and product-groups associated with Sales Cloud objects (Opportunities) is possible through the use of a specific set of artifacts exposed in...

Groovy

Working With Reference Data In A Custom Extension

Introduction and Use-Case This article provides a fictitious example of one possible option for integrating data from an external system with Oracle Sales Cloud. It's intended to highlight particular considerations involved and provide an illustration. Let's setup a simple use-case. Our business users would like to see some financial performance data when dealing with their customers. This will help them make more informed decisions when managing customer account records. The financial data is held in a secondary proprietary accounting system.  The information required is summary-like data, and as such aggregation and calculation will be required on the source data. The source accounting data is quite complex and the number of records will most likely be high. Users want this extra information available in-context, ideally inside the Account details page in Sales Cloud, and have asked for fast performance and no additional navigation. This extra financial data is for reference-use only, and no creation or update will ever be made to this data from Sales Cloud. Examples of what users would like to see include: Largest Ever Spend Average Spend Average Spend Last Year Number of Orders Last Year Implementation Choices One option might be to setup a live web service call to the secondary financial system to get the accounting data for display. As mentioned the existing system is proprietary and it's unlikely the exact set of services needed is already available, meaning more development as well as some security concerns in adding API's to this system. In addition, with a need for multiple calculated values on the page, each web service call and subsequent processing will have a performance overhead. As such this option may not be the best choice here. A second option to get live data is to create a UI mash-up where a sub-tab is added to the Account object page layout. This has an iFrame region that embeds the user interface of the secondary financial system. This solution is also unsuitable because the need is just for a few data points and not actually financial system access for the sales users. A final option is to get the results of specific queries on the financial system into Sales Cloud. In this use-case the users do not actually require live data, as such a query can be executed on a regular interval to refresh the data shown (e.g. daily). The query can simplify and denormalize the complex data structures in the financial system (e,g, headers-lines) into a single business object records. It can ensure only the appropriate data is included and that is it executed only by an authorized user. As such this implementation was chosen for use. Let's look at how this was actually done. Data Adding and Importing Firstly a custom object - Invoice_c - is created in Sales Cloud to hold the imported data. In this example we have just a few fields for use in the calculations needed. Note that the Customer field is a Dynamic Choice List on the Account object. This is because it will ensure the existing customer names are used, and it allows access to both the customer name String and the PartyId stored as the foreign key in the auto-generated Customer_Id_c field.  The implementation does NOT include generating any 'Pages' for this custom object, as it's just for reference data storage. We do not want anyone creating or updating this reference data through any methods outside our integration solution - like through a UI page. In the initial population of a high volume of records into this object we use the File-based Loader process. This is described in detail in these articles. Incremental loads can be done using the SOAP or REST custom object web services. First a process queries the financial system to get new data and outputs the records as pre-prepared JSON files. The files are then used by a second process to perform HTTP POST requests to the REST resource at /salesApi/resources/latest/Invoice_c/ with MediaType as application/vnd.oracle.adf.resourceitem+json. An example single record payload is: { "RecordName" : "Invoice for April 17", "InvDate_c":"2017-04-18", "Customer_c":"Oracle1", "Paid_c":"Y", "OrderID_c":"12347", "TotalAmountUSD_c":"2200.50" } Now the data is there, we need to display it. Field Creation To meet users needs several Formula Fields are added to the Account object, and displayed in the Details page layout. The fields query the Invoice object records, do simple calculation, and display the result. Formula fields do not actually store resulting values and re-calculate whenever the field is displayed on a page. As such a Field Group was used to reduce the UI clutter and ensure the very latest values are shown when the calculations fire when the group is expanded. Note that the default state for Field Groups is expanded, as such this was deselected in the creation screen so it is collapsed by default. It should be noted that all formula fields do fire when the page is first rendered, even when inside a collapsed field group. As such performance must be optimized at all times. Here is our Account page with the Financial Data group and values shown. Formula Fields The four fields shown above include the following groovy scripts. Invoice Average (Lifetime). The script used here instantiates the Invoice_c view object and uses a simple ViewCriteria query based on matching the current customer Account and ensuring the invoices are paid. It then cycles through the results summing the invoice amount values. Finally it divides by the record count and presents in a rounded two decimal value. Note care is taken to check for null values where an Account has no invoices yet. def amt =0.00 def vo = newView('Invoice_c') def thisAcctid = PartyId vo.appendViewCriteria("Customer_Id_c = ${thisAcctid} AND Paid_c = 'Y'") vo.executeQuery() def num = vo.getEstimatedRowCount() while(vo.hasNext()) {   def curInv = vo.next()   amt = amt + nvl(curInv.TotalAmountUSD_c,0)  } if(num>0){   def rslt= (amt / num)   return Math.round(rslt * 100) / 100  } return 0 Invoice Average (Last Year). This is mostly the same, with a condition to check the record InvDate matches the current year. It is not possible to convert the year inside the viewCriteria string therefore it is done later. def amt =0.00 def count=0 def vo1 = newView('Invoice_c') def thisAcctid = PartyId vo1.appendViewCriteria("Customer_Id_c = ${thisAcctid} AND Paid_c = 'Y'") vo1.executeQuery() while(vo.hasNext()) { def curInv = vo.next() if(year(nvl(curInv.InvDate_c,9999)) == year(today())){   count++   amt = amt + nvl(curInv.TotalAmountUSD_c,0)  } } if(count>0){  def rslt= (amt / count)  return Math.round(rslt * 100) / 100 } return 0 Largest Invoice (Lifetime). Using the same query we simply sort the resulting rows by TotalAmount / descending and get the data from the first record. Because we also (helpfully) return the OrderID_c value in the result of this script it was implemented as a Text Formula field. def vo = newView('Invoice_c') def thisAcctid = PartyId vo.appendViewCriteria("Customer_Id_c = ${thisAcctid} AND Paid_c = 'Y'") vo.setSortBy('TotalAmountUSD_c desc') vo.executeQuery() def curInv = vo.first() if(curInv){  def txt = nvl(curInv.TotalAmountUSD_c,0) + ' for OrderID ' + nvl(curInv.OrderID_c,'none')  return txt } return "None" Invoice Count (Last Year). This simple script combines elements of those above, querying records and counting when the year values match. def count=0 def vo1 = newView('Invoice_c') def thisAcctid = PartyId vo1.appendViewCriteria("Customer_Id_c = ${thisAcctid} AND Paid_c = 'Y'") vo1.executeQuery() while(vo1.hasNext()) {  def curInv = vo1.next()   if(year(nvl(curInv.InvDate_c,2000)) == year(today())){   count++   } } return count Extra Security Whilst not mentioned in our use-case requirements, it is possible that not everyone should be able to see this financial data. As such field level data security could be applied in the formula field scripts. The simplest implementation is a preliminary groovy condition to check the users job role, and if not appropriate return an empty string. This technique is discussed here and an example might be: def secCtx = adf.context.getSecurityContext() def rslt = secCtx.isUserInRole('ZCA_SENIOR_ACCOUNT_MANAGER') if(rslt==true){   ...scripts above... } return ""  

Introduction and Use-Case This article provides a fictitious example of one possible option for integrating data from an external system with Oracle Sales Cloud. It's intended to highlight particular...

Groovy

Querying Custom Object Records Using RESTful Web Service Calls In Groovy Scripts

Our existing examples of using API calls in groovy focus on SOAP style web services, therefore this article provides a basic example of working with the recently added support for REST. This illustrative example queries internal custom object records. The basic features of groovy REST support is well covered by the Application Composer documentation, and we will articles with examples of creating, updating, and deleting records.  Setup  Defining web services is similar for both SOAP and REST, done using the Common Setup - Web Services feature in Application Composer. Before this a decision needs to be made in the way in which you can pass a criteria to your RESTful service. The first option is by defining the URL Resource parameters inside the Web Service definition. For example the following definition which signifies that we will pass the CustomerName parameter in the adf.webservices.myWSName(getParams) GET call script. As you can see below the Resource URL definition includes the returned fields list and a limit on rows returned. Note the notation of parameter with the double hashtags. https://[crm-host]/salesApi/resources/latest/Invoice_c/?q=Customer_Id_c=##CustomerId##&limit=5&fields=RecordName,Customer_c,TotalAmountUSD_c  The second - and the one recommended in most cases - is to define the generic service resource endpoint and then pass query (q=) parameters as a map in the GET request call. This means fewer web service definitions and scripts that contain specific use-cases. As such below example service definition can be used by multiple scripts to query the Invoice_c custom object using its RESTful service. Note: In addition pre-built queries - known as finders - are available on selected standard objects. Scripting In this example a custom Formula Field exists on the Account standard object which will lookup custom object records (Invoices) for the matching Account. Below queries the Invoice object using the Customer (Account) field, which is a Dynamic Choice List. Because of this field type we need to use the associated foreign key field Customer_id_c for our query (as the display value is not queryable). The script passes the run-time value (PartyId) taken from the users current Account object record. def conn = adf.webServices.Invoices def custName = PartyId def myMAP = ['q':'Customer_Id_c='+custName] conn.dynamicQueryParams = myMAP def rslt = conn.GET() def val = rslt.items[0].RecordName return val This very simple illustrative script returns just the RecordName field from the first matching Invoice record in the response Map object. This is shown on the screen as below: Clearly a more meaningful script would iterate through the records and process them according to business logic. For more on using the response data see articles using Regex and ArrayLists. Troubleshooting If you get generic HTTP errors when testing, attempt the same request using a REST client (like POSTMAN) and investigate the raw response for more detailed error messages. You may notice the Groovy Palette shows yellow warning messages from the type checking process, but these can be ignored as the API's used are valid. For more details on RESTful groovy features review the excellent related documentation.

Our existing examples of using API calls in groovy focus on SOAP style web services, therefore this article provides a basic example of working with the recently added support for REST. This...

Application Composer

Updated Whitepaper: Performance Best Practices for Extending Oracle Sales and Engagement Cloud

Back in November 2015 we shared the first edition of the whitepaper entitled 'Customizing Oracle Sales Cloud Using Application Composer - Performance Best Practices'. This then became My Oracle Support document 2170121.1. What is interesting is that the content has evolved over time, based on best practices collected from real observation. The content was also reorganized based on the logical workflow of a customization project, as: Before Implementation: Custom Objects, Custom Attributes, Page Customizations On Implementation: Sandboxes, Using Scripts, Security After Implementation: Analysis and Resolution of Performance Issues, Logging, Migration  The following table highlights the additional content added to the original document: Date Additions Apr 2017 Added a Field Groups topic in the “Performance Best Practices for Page Customizations” section.    Added use cases 10 and 11 with poor and good implementation examples in Examples of Efficient Trigger Implementations section. Mar 2017 Added use cases with poor and good implementation examples in Examples of Efficient Trigger Implementations section.  Feb 2017 General Security Recommendations: Added general best practice when customizing roles.    Data Security Predicates: Added more best practices along with several examples illustrating efficient and inefficient predicates/sub queries. Jan 2017 Added Performance Best Practices for Custom Objects section    Added Examples of Efficient Trigger Implementations Dec 2016 Added Examples for Updatable/Required Groovy Expressions  Nov 2016 Added one recommendation to the Saved Searches list.   Added new section for Dynamic Choice List Data Filters best practices. Oct 2016 Performance Best Practices for Parallel Development (Sandboxes)   Performance Baseline Measurements (for Page Customizations)   Performance Baseline Measurements (for Security)   Migration Between Environments  Sep 2016 Data Security Predicate section: Added information Aug 2016 Shuttling Fields    Dynamic Layouts and Custom Sub Tabs   Defining Object Triggers   Defining Object Workflows   Performance Best Practices for Security As such this document forms a significant reference guide for all Application Composer projects and will continue to be updated as new features and recommendations become available.  

Back in November 2015 we shared the first edition of the whitepaper entitled 'Customizing Oracle Sales Cloud Using Application Composer - Performance Best Practices'. This then became My Oracle...

Application Composer

Using Account Ticker and RSS Feeds in Oracle Sales Cloud Mobile

Stock Symbol  If you enter the Stock Symbol value for your customer Account records, the Sales Cloud Mobile App will show this and hyperlink it so that it shows details from Yahoo finance. Note that adding the stock symbol value is by default done in the More Details pages (desktop UI) but could be exposed on the simplified pages by customizing the Layout - ensuring this data is completed and the mobile app has this useful feature. As shown below when you tap the ORCL hyperlink the second screen appears with detail.   Note that you can change from the seeded Yahoo finance page by changing the same Enterprise Applications setup as done for News Feeds, described below.   News Feeds  In the same way the mobile app has a bottom icon bar where News Feeds is available, when the stock symbol is entered. This takes the stock symbol and uses it in a URL to get the latest news feeds. Here is how this looks: In the past the feed source configuration was controlled by Profile Option "RSS Feed Source" where a URL was entered. This changed in Release 10 and if not completed as below will result in blank pages in the mobile app (as mentioned in this forum post). Use the following configuration steps for this feature: Login to the homepage with an Applications Implementation Administrator user (this may require Cloud Operations involvement). From the navigator menu, go to Setup and Maintenance homepage. To the far right is a pop-out panel with hover-over text 'Tasks' Access the Manage Topology and Register Enterprise Application. Search for Zms as shown below. Set the values for Server Protocol to https and URL to something like https://news.google.com/news?output=rss&q=   

Stock Symbol  If you enter the Stock Symbol value for your customer Account records, the Sales Cloud Mobile App will show this and hyperlink it so that it shows details from Yahoo finance. Note that...

Quickly Change Any User To Have Read-Only Access

The use-case for this is where a user requires short-term access to the system but should not be able to actually create or change data. Examples might be as-yet-untrained new hires, auditors checking data, and help-desk staff doing restricted troubleshooting. This feature is certainly NOT an alternative to the proper custom security implementation. As shown below the long-term solution is to use the Security Console to create a dedicated view-only Job (or Duty) Role with Functional Security Policies associated with the respective seeded View privileges, along with limiting Data Security Policies using View actions. For creating view-only roles in Release 11 and before (without the Security Console) see this example article. Configuration Turning this on is simply done by setting a Profile Option. Use the Navigator menu to open the Setup and Maintenance page and select the Manage Administrator Profile Values task. From here search for the Read Only Mode (FND_READ_ONLY_MODE) profile. As shown below, this can only be set at the USER level and you select the related user (by username login) and set the Profile Value to 'Enabled' to turn the read-only feature on. Now when this user logs in they get a global header banner making it very clear they are restricted to read-only access. As the text states, this setting applies for every application feature. So if the user tries to create a record, they will still get access to the create screen (unlike the security implementation) however then they press Save the following popup message is shown. As you can see the settings sits over the users functional access based on their assigned Job Roles and is simply the underlying technology preventing create, update, and delete operations. As such it's a useful admin feature to turn-on and off when it suits.

The use-case for this is where a user requires short-term access to the system but should not be able to actually create or change data. Examples might be as-yet-untrained new hires, auditors checking...

Importing Lookups For Use In List of Value Fields

Overview Standard lists of values are supported by data held inside the applications database, in a structure called a Lookup. An example might be a status field, countries, or units of measure. A lookup is composed of a Type and one or more Codes. The Type is the parent definition of the list, such as giving it a title for a list of Cars. The Codes are the values shown in the drop down list, such as Saloon, Estate, Sports etc. This common mechanism has existed in other Oracle Applications for many years. Creating the data for lookups is done via either in the Navigator:Setup and Maintenance > Manage Common Lookups task or for Sales Cloud inside Application Composer under Create Field - Fixed-Choice-List screen. These are fine if just one or two short lookups are needed, however during implementation it may be likely that several custom lookups are required, and as such there is an import process available for this task. The lookup import supports loading files with multiple Lookup Types and multiple Codes at once, meaning two large files (one for Types and one for Codes) can be used. The process runs asynchronously to the user session, allowing it to be started without holding up further work. The import supports create and update activities, allowing Lookups to be added or adjusted as needed. Deletion is not supported via the import process at this time. The import feature is accessible from the following menu under Setup and Maintenance:   Uploading Files All data files must first be loaded to the Oracle Webcenter Content server inside Fusion Cloud Applications. This is most easily done using the Navigator - Administration - File Import and Export. Other options exist such as using the Content Server API's to programmatically load files. Example Lookup Type First load your Lookup Types. This is done in a separate file to the codes and this text file must have the following format: LookupType|Meaning|Description|ModuleType|ModuleKey RBCAR_CODES|Car Body Types|Standard Car Body|APPLICATION|FND The value for LookupType (max 30 characters) must be uppercase and both it and Meaning (max 80 characters) are required fields. The optional Description can be up to 240 characters. The ModuleType is required and should always be set to the value 'APPLICATION' and the required value for ModuleKey can be obtained by replacing the intended application name in the following query. Use this query in a new BI Publisher data model to check the seeded data. If you are using Applications Composer then the ModuleKey value is 'ZCX': SELECT B.MODULE_KEY, T.USER_MODULE_NAME FROM FND_APPL_TAXONOMY B, FND_APPL_TAXONOMY_TL T WHERE B.MODULE_ID = T.MODULE_ID AND T.USER_MODULE_NAME ='CRM Application Composer' The data file is uploaded to the content server using the File Import and Export feature mentioned above. From here the file is processed using the Import menu item on the Manage Common Lookups page shown above. The status popup will start by showing a title of 'Processing' and should finish with 'Success' as shown below. If the file cannot be found on the content server it will show as 'Error'. Note that this 'Success' message means the file was 100% downloaded from the content server and was processed, but you must always check the log to verify if there were any data problems in the processing. Assuming no errors where found, check that the new Lookup Type exists in the Manage Common Lookups page.     Loading Lookup Codes Once the Lookup Type is loaded then the values - or Lookup Codes - can be imported also. This is done in a separate file, with the following structure: LookupType|LookupCode|DisplaySequence|EnabledFlag|StartDateActive|EndDateActive|Meaning|Description|Tag RBCAR_CODES|S|1|Y|11/12/2014|1/5/2019|Saloon|Car with trunk|Tag1 RBCAR_CODES|E|2|N|1/1/2014|1/11/2019|Estate|Car with large trunk|Tag2 RBCAR_CODES|R|3|N|11/12/2012|1/7/2019|Sports|Sports Car|Tag3 RBCAR_CODES|Bl|4|Y|11/12/2012|1/7/2019|MPV|Family Car|Tag4 RBCAR_CODES|G|2|5|11/12/2012|1/7/2019|SUV|Four Wheel Drive|Tag5 Here LookupType (30 characters) and Meaning (max 80 characters) are required fields. Once this second file is upload to the content server, the Import menu from the Manage Common Lookups page is again used. This time the Lookup Code File field is used to accept the file name, as shown below.   Once successfully processed, and the log file confirms records were created, re-querying the page will show the resulting lookup code values, as shown below. The Log File The following is an example of loading lookup codes for the vehicles (trucks, bikes, planes) file. As you can see it shows the processing flow and final summary of records created, updated, or in error.   INFO: Import data file account : crm/partner/import INFO: Import data file name : lookupsCodesVehicles.txt INFO: Found the file with fileId : 35108 INFO: Successfully downloaded the import data file INFO: Lookups Data upload process started at : Mon Apr 03 09:49:27 UTC 2017 TYPE=COMMON_CODE INFO: File Name :/tmp/lookupsCodesVehicles.txt_35108_1491212967 INFO: File Type:COMMON_CODE INFO: Loader Obj init done: type:COMMON_CODE INFO: Headers List: [LookupType, LookupCode, DisplaySequence, EnabledFlag, StartDateActive, EndDateActive, Meaning, Description, Tag] INFO: Header Validation Passed INFO: File Processing Completed INFO: Lookups Data uploading process completed at Mon Apr 03 09:49:28 UTC 2017 INFO: Time taken to complete processing: 0 seconds INFO: ---------------------------------------------- INFO: Total records count :11 INFO: Error records count :0 INFO: Inserted records count:7 INFO: Updated records count :4 INFO: ---------------------------------------------- If any records fail the detailed error messages will be shown in this file. All lines are processed, and there is no option to halt upon the first error. For large loads it is recommended to download the log and keep it is not accessible from the import afterwards. This may also be useful for reloading changes. Volume Loading As you would expect, the process supports loading multiple Type and Code values in single files. Here is an example with two files showing this: It is possible to load both Types and Codes files together in one go, since the Lookups Import popup accepts both filenames. Note that if any of the Lookup  Types data fails, then obviously so will all related Codes. You can check the lookup data imported from a BI Publisher report using a new data model based on querying the view FND_LOOKUPS. In the import process there is also support for Set ID enabled lookups. Here the codes file has an additional column ReferenceGroupName which takes the SetId internal name value.  

Overview Standard lists of values are supported by data held inside the applications database, in a structure called a Lookup. An example might be a status field, countries, or units of measure. A...

Integration and PaaS

Platform Services: The Oracle Mobile Cloud Service

One of our guest articles looks at the Oracle Mobile Cloud Service, and this refresher includes updates and some of the new Oracle Cloud Applications related features. The following is the opening screen in the Mobile Cloud Service, showing the wide range of features it offers.   Illustrative Example As with most of our articles, we will look at this in the context of a worked example. Firstly a mobile backend is configured. This acts as the central host for a discrete set of shaped API's (as RESTful services) and supports features like push notifications. This sits between complex back-office systems and the mobile client applications, simplifying integration and allowing for discrete administration and monitoring. A common use-case is where RESTful services do not yet exist in back-office systems, but mobile access to data is required.  As you can see below the mobile backend is configured as needed and then all subsequent work is done in the context of this environment. Next comes the creation of a Connector to the Fusion Applications environment. As you can see there is pre-built support for Fusion Applications and Integration Cloud environments, along with defining custom REST or SOAP connectors. The connector definition is wizard-driven, accepting the /describe URL for an existing Fusion Applications service and allowing you to configure which Resources you'd like to implement.   The connector can be tested to ensure it communicates successfully and returns the expected results. This is done all without a single line of code. Next the connector has to be 'wrapped' in a Custom API definition. This is most easily done using the New Express API feature, as shown below. As you can see, under the API Name field in grey is the resulting endpoint that your mobile app will eventually use. The resource is identified by modelling based on Sample Data you provide as a JSON document. For Fusion Applications the easiest way to get this is to make a browser request to GET all records and just use the first record JSON for your sample data. From this the fields are automatically derived, as shown below. This can be edited as required. Next the generated end-points are shown, based on the resources (objects) you have included in the API. This is not quite the end, since while the API looks usable it has not been linked to the connector yet. This is done through the API Implementation - the code which makes the API's work.  The implementation file are uploaded to the system for use. The Oracle Mobile Cloud Service offers support for JavaScript to handle the business logic in the implementation, and in this case it is used to call the connector for each operation the Custom API has.  As shown below Oracle Mobile Cloud Service offers a downloadable 'Scaffold' code definitions to make this part a little easier. The downloaded scaffold file contains a package.json for your reference JS library definitions, a readme.md file with instructions, the main JavaScript .js files with stub code (example below), and a samples.txt file with some usage examples.   Each JavaScript method callback is then added to the .js file and will have the follow pattern for calling the Connector. service.get('/mobile/connector/MySalesCloudEnv', function(req,res) {     var queryObject={};     queryObject.param1='param1';     queryObject.param2= param2';     req.oracleMobile.connectors.MySalesCloudEnv.get("leads", null, {qs: queryObject}).then(         function(result){             res.send(result.statusCode, result.result);         },         function(error){             res.send(500, error.error);         }     ); });   In the .js file are also any custom functions and method handlers (using POST) that might be required. The implementation files are then packaged, zipped and uploaded to the same page. Once complete you can test the API, and once satisfied publish it to the Service Catalog for use. Let's look now at building the client app inside the Mobile Cloud Service, using a feature called Mobile Application Accelerator (or MAX). The example below shows the steps, or you could watch this quick video. MAX currently supports the creation of iOS, Android, Windows or Web (HTML5) mobile client applications and as with most PaaS features is predominantly wizard-driven development. The simple process uses selection of the most-likely design upon which you can fine-tune to meet specific needs. As shown below the creation of the pages is driven from templates and offer common layout types. After layout selection MAX moves into the declarative IDE for adding components to the page and setting their properties. As shown below components are bound to data services exposed as the Custom API's in the service catalog. In this example the pie chart added to the Leads Analysis place is linked to the Sales Lead upon which it will get it's data. As part of the Add Data process you select the object(s) it offers and can filter the records using a query based on the parameters defined by the object and how they correspond to values from current user session, the device (like geolocation), the page, or simply a fixed value.     The additional properties of the chart are completed and it is ready for use. Any additional pages and their components are configured, along with the navigation flows between them. Finally the app client can be tested online using the preview mode. This includes testing the user login and real data from the API's configured for use. The app is then managed under the Client Management feature where it is linked to a profile to control its push notifications and distribution. The final app distribution can be provided to users as a URL or a QR code. Summary Oracle Mobile Cloud Service provides functionality to create and management most needs for mobile applications. It includes support for connecting to Oracle Fusion Cloud API's and for declarative-driven development of client apps. As such where an organization using Oracle Cloud Applications needs custom mobile client applications (that differ from those already provided) then this service offers a broad range of inclusive features. Read more about Oracle Mobile Cloud service in the excellent documentation, the latest news in their blog, or view the informative videos on their own YouTube channel.  

One of our guest articles looks at the Oracle Mobile Cloud Service, and this refresher includes updates and some of the new Oracle Cloud Applications related features. The following is the...

Groovy

Formatting Your Values in Groovy Scripts

  When working with script values there may be occasion when you want the output to include a well-formatter number, such as a price, or a date and time value. This may present a problem because the values are often treated as one type, such as a String for Text Formula fields and therefore any other formatting will not get applied. This often leads to hard to understand values. Fortunately Application Composer groovy allows access to the underlying Formatter class to allow you to convert these specific values in your scripts. Let's look at a simple example to understand how this works. We add a number field called Estimate Sale to the Lead object. This accepts any number and up to 4 decimal places. As a number field it will be formatted correctly, however if we use the value in a Text Formula field then it will not get the formatting. In the first screenshot below look at Formula1 which is missing the thousands comma as expected by the number format for my English language session. In this illustration a second Text Formula field (Formula2) is added and includes the following code: def val = EstimateSale_c def fmt = new Formatter(adf.context.locale) def ret = (val != null) ? fmt.format('%,.2f', val) : null return ret As you can see from this the Formatter object is instantiated and accepts the current user locale (using the adf.context.locale function). This Formatter object is then used to convert the 'val' variable value through its format() method. This accepts some Formatter class specific arguments that define the way the formatting is done. In the example the % means a literal and the second parameter .2f indicates to use two decimals (including rounding). In the screenshot below the users session language (under Preferences) was set to French. Note the respective number formatting (based on locale) is now used in Formula2: The Formatter class can also be used to format dates, again based on the locale. Here you can specify day, month, year and time from the original string value and pick out the parts needed. Again this relies on the arguments passed to the format() class. Finally, the format() method also supports character conversion too, so could be used to pad values to fit a standard, or change values based on a condition. 

  When working with script values there may be occasion when you want the output to include a well-formatter number, such as a price, or a date and time value. This may present a problem because the...

Application Composer

Release 12: Migrating Sales Account Customizations

You might have received the email below from Oracle with the subject: Action Required: Complete the Migration of Sales Account Object to Account Object . This email is auto-generated based on an environment scan looking for Sales Account object customization. If you have already performed the migration described here then you can ignore it. If not then please read on. With Release 12 the Sales Account object is longer usable in the system, since its features were already replaced in Release 9 with the more powerful combination of Account, Contact and Household objects. There has been a grace period for the migration to the new platform to be performed however. Support for extending the Sales Account object actually ceased in Release 11, however Application Composer did allow access for late-migration purposes. As you can see from the Release 11 (left) and 12 (right) comparison below, there are now no options to customize the Sales Account object at all.   One reason you might not have done the migration yet is the use of custom Sales Account child objects on desktop pages and/or exposing custom objects in the desktop tree view UI. The well-established use of custom objects under the Account object and user migration to the Simplified UI (where Sales Account is not exposed in Release 12) now mean these features do not represent insurmountable reasons to delay migration further. The Migration Process  The migration of customizations from Sales Account to Account or Contact is a process which involves both Oracle Cloud Services and your own Application Administration team. It is comprised of the following discrete stages:   Upon request (via a SR) Oracle will automatically recreate Sales Account custom fields and custom child objects under the Account (or Contact) object. All field types can be automatically migrated, including dynamic choice lists, formulas, and percentages. Your administrator will need to do manual migration of other customizations related to Sales Account. Upon a second request (via the SR) Oracle will automatically migrate the corresponding data from the Sales Account object to the Account object. Your request for migration (in the SR) should be as detailed as possible, however there is a verification step to confirm the list of fields, child objects and data that you want migrated.    Manual Migration Parts The custom field definitions (including all associated properties and constraint expressions) and the child object customizations get automatically migrated in Stage 1. All other customizations that might be related to Sales Account need to be manually recreated in a clean dedicated sandbox. This is defined as Stage 2. Here the 'Customization Migration' feature could be used if test and production match perfectly, however this bypasses the sandbox so is of higher risk. One of the most common manual steps is for the user interface. These parts are not automatically migrated and will need to be adjusted for all related layouts for Simplified, Desktop, Mobile and Outlook pages. Indeed for layouts it is recommended to take screenshots of the user's interface and the back-end page definitions (in Application Composer) for the Sales Account object before any migration starts, and to use these when replicating. The following lists the other areas to look for Sales Account related customizations that will need manual migration. Saved searches Server scripts Object workflows Relationships Custom reports and subject areas Global search Web services File import Security Note that retired custom Sales Account fields are automatically prefixed with 'Do not use:' text to prevent users from adding data post-migration via an unedited layout page. Data Migration Stage 3 of the process is moving data across. The data migration step can only happen once all customizations are published. After the data migration has been run, no more updates to Sales Account data can be migrated. As such all use of Sales Account must be halted, ideally be making it impossible from the UI, scripts, or web services. As mentioned above updating web services, mappings for import, and reports/subject area need to be done before data migration. This ensures queries, updates and reporting is done against the right data set. It is also important to ensure that all required Sales Account custom fields have default values, to avoid validation errors later on. References This article provided a quick overview and highlighted some key points on this migration process, however the following documents cover the precise steps involved: This migration is also mentioned in the Performing Your Release 12 Upgrade document, as it was in prior releases. The one page Migration Impact Summary document. The comprehensive 35 page Migrating Sales Account Customizations Guide   Most importantly the last document has an appendix entitled "ATTRIBUTE MAPPINGS"which illustrates how Sales Account fields map across to Account or Contact fields. This is how data will get moved across and as such is important to know so that your layouts and scripts use the corresponding values.      

You might have received the email below from Oracle with the subject: Action Required: Complete the Migration of Sales Account Object to Account Object . This email is auto-generated based on an...

Integration and PaaS

Platform Services: Integrating With The Oracle Data-as-a-Service Cloud

Introduction The Oracle Data-as-a-Service Cloud (DaaS) is comprised of a set of services that provide access to a large data-set to support business analysis and operations. In this article we'll look at the Data-as-a-Service for Sales - a specific solution that is part of the Oracle DaaS Cloud. Similar services are being developed for other business operations, and we'll review them as they become available. This service offers a curated resource for the data in existing sales applications to be 'validated' and 'enriched', checking and adding new information to business records. The data in the Oracle DaaS Cloud originates from multiple sources, such as Dunn and Bradstreet, and focuses around organizational information. Today it includes more than 245 million records, and of course will continue to evolve. In essence the Oracle DaaS Cloud offers the raw data, along with a set of easy-to-use access methods. In this article we'll look at two pre-built solutions for Oracle Sales Cloud, plus the API's to use for building custom access solutions. The screenshot below shows a simple search done directly in the DaaS Cloud user interface, and indicates the wealth of information it contains. The Oracle DaaS Cloud is offered based on the data interrogation usage. As such the homepage (below) dashboard shows use based on the various methods of access. Consult the web pages for more on options. Configuration As two separate cloud services, both the source DaaS environment and the Sales Cloud environment need configuring to work together. The setup is done in both and this short section covers the essentials. You can also see this explained and demonstrated in this video. Firstly you should activate your new DaaS environment, just the same as as any Oracle Cloud service - as per the steps explained here. Once activated you should login to the environment and check it can be used online by simply searching for some data (see the first screenshot in this article). Additionally you should create a new user in this environment for use as part of the integration. This user needs the role 'Data Service Client AppID' that is specifically for use in integration. Again make sure you login to the application with this user (resetting the password) to verify it's working fine. Next in your Sales Cloud environment, visit Setup and Maintenance from the navigator. Search for a task named 'Manage Sales Cloud to Data Cloud Integration'. This simple page is where you specify the DaaS environment to use. As shown in the screenshot below you provide: The URL of your DaaS instance. This can be obtained from the post-activation e-mail or on the My Services page. It should not have a post-fix directory or endpoint (e.g. https://mydataservice-myidentitydomain.data.us2.oraclecloud.com) Select oracle/wss_username_token_over_ssl_client_policy as the Security Policy. Enter the new DaaS user name and password that you created. The next step is to check the data mappings in both Sales Cloud and in DaaS. The mapping ensures the requests from Sales Cloud search and match the right data, and the data returned is placed into the correct fields. Luckily this is all setup for you with seeded maps, however can be adjusted as required. One example might be where you've added custom fields to the Account object and want them populated by DaaS (more here). In Sales Cloud this is accessible from the Setup and Maintenance task 'Manage Social Data and Insight Cloud Attribute Mapping and Enrichment Preferences'. The screen below shows the mapping for Account, with the same for Contact data to the bottom. Whilst not included below the DaaS user interface has a very similar mapping functionality. In addition if you are using Customer Data Management (CDM) features like Enterprise Data Quality then some additional setups are required. The full configuration instructions can also be found in the Sales Cloud instructions, in the DaaS instructions and seen in this video.   Address Validation Once the setup is complete you are ready to use the DaaS for Sales built-in functionality. The "Oracle Address Verification Cloud Service" matches partial addresses under both Accounts and Contacts records and returns attribute values providing data improvement. Read more here. As an example, the following new record is created with a partial address.   After clicking the Verify Address button, the following pop-up is shown with data from the Oracle DaaS Cloud data-set, showing the results based on a search using existing fields. In this case it matched only one record and so this is offered. Note that the blank Postal Code is then populated.         You can also see another demo video here. Enrich Accounts and Contacts Also within DaaS for Sales is the "Oracle Social Data and Insight Cloud Service" which provides access to more than 345 million global company and contact records. The service provides the ability to browse, search (and save your searches) and to export data from a multi-faceted criteria, including industries, companies, size (revenue or employees), or job titles. Read more here. Looking at Sales Cloud Accounts (both customers and prospects) the Oracle DaaS data-set offers support for 136 attributes for each record. The example below shows the Account page in sales cloud with additional attributes exposed using a new customized layout created in Application Composer. By clicking the Enrich Account menu item the query request is submitted to the DaaS environment.   The request search returns two matching records from the Oracle DaaS environment. A pop-up form appears and shows (up to three) matches and allows the user to see the current value on the record and what it will be replaced by.     The correct record is selected and the enrich button then puts the data into the Account page in Sales Cloud.   In addition to Account, users can use the DaaS for Sales service to populate the new Account with Contact data. Again a built-in feature in Sales Cloud (once the setup is enabled) allows the following menu in the Edit Account - Contacts tab. As mentioned above, the same "enrichment" process exists for individual Contact records also. Here the process will lookup a persons details in Oracle DaaS Cloud and bring back extra data not already on the Sales Cloud Contact record. The process returns a result pop-up the same as that above for Account data. The existing/data cloud values are shown and a record choice is made. The Contact profile page then gets updated inline.   Using The API's Directly   This section introduces a few simple examples of using the DaaS API. Both an Address Verification API and an Enrichment API exist, and this section just provides an appreciation of some of the functionality. Firstly the API is based on RESTful web services standards, allowing requests/responses to be easily handled from a range of client applications. The following screenshot shows the use of the basic Account search API being used in the SOAPUI utility program. The DaaS Cloud API documentation includes listing of all attributes supported for Companies (Accounts) and Contacts, giving their data types and if they can be used for querying. Account Search To highlight specific parts from the example above, the request JSON payload is passed as a HTTP POST to the following:   Host endpoint: https://[myhost].data.us2.oraclecloud.com  Resource: /data/api/v3/search Significantly the Authorization Type must be set to Preemtive.   The following is the same request payload example used above: {"objectType":"Companies","query":"oracle","offset":"0","limit":"10","facetLimit":"10", "returnFields":["location.city", "location.state"]}  The provides the following response (cut short for space). You'll notice only the attributes specified in the returnFields in the request are provided. With 136 possible attributes this helps keep payloads small. {"totalHits":"183","parties":[ {"@type":"company","id":"RE5CLDE0NDcwOTE5MywxLDE=","city":"Redwood City","state":"CA", "attributes":[{"name":"location.city","value":"Redwood City"}, {"name":"location.state","value":"CA"}]}, {"@type":"company","id":"RE5CLDg3NjcyNjI2NiwxLDE=","city":"Torrington","state":"CT", "attributes":[{"name":"location.city","value":"Torrington"}, {"name":"location.state","value":"CT"}]}, {"@type":"company","id":"RE5CLDM2Mjg2Mzc2OCwxLDE=","city":"Winston Salem","state":"NC", "attributes":[{"name":"location.city","value":"Winston Salem"}, {"name":"location.state","value":"NC"}]}, {"@type":"company","id":"RE5CLDA3OTgzNjI2NywxLDE=","city":"Oracle","state":"AZ", "attributes":[{"name":"location.city","value":"Oracle"}, {"name":"location.state","value":"AZ"}]}, ... There are a number of similar parameters to control responses and examples are given in each of the API documentation.   Contact Search Similarly an equivalent request can be made looking for Contact (objectType=People). The request below has examples of more parameters including to use preconfigured filters that limit the data based on attribute value. {"objectType":"People","offset":"0","limit":"10","facetLimit":"0", "defaultFilters":[{"filterName":"Enterprise Companies","filterValue":"N"}, {"filterName":"Medium Companies","filterValue":"Y"}, {"filterName":"Small Companies","filterValue":"Y"}, {"filterName":"Defunct Companies","filterValue":"Y"}, {"filterName":"Out Of Business","filterValue":"Y"}]} It is also possible to export data for use in batch / offline loading programs (verses real-time updates). If this is of interest consult the API documentation and review this export companies example.     Address Verification The following screenshot shows an example of calling the Address Verification API (addressclean), passing some address details in the request payload and returning matching (correct) details in the response.     Other API's In addition to the basics above, there are numerous other service resources which have use-cases in custom integration solutions. These include The AllDataService provides ad-hoc access to the data. This may be a single record query or an volume of records as an export job. The EnrichService service provides a matching set of records when the request includes a text file of records by which to query. It returns a job number and a second API can be used to get the job file with the data. The AdminFiltersService allows the manipulation of the default filters used for querying. The JobResource and VersionService provide administration of existing jobs and the currently available service versions. As mentioned throughout, for more details on using the native API's consult the documentation links given above.    

Introduction The Oracle Data-as-a-Service Cloud (DaaS) is comprised of a set of services that provide access to a large data-set to support business analysis and operations. In this article we'll look...

Insights from the 'Journey To The Cloud' Conference

The UK Oracle User Group held a one day conference entitled 'Journey To The Cloud' where the community came together to discuss what is involved in adopting Cloud Applications and for those already there to share their experiences. Here is the agenda for the day, with the sessions I attended highlighted (large size): Keynote Oracle's HCM Cloud Evangelist Andy Campbell delivered an interesting keynote. The theme was 'change', starting with some thought provoking examples of where steps (and people) have been taken out of a modernized process (citing Roborace and Amazon Dash) and how this future vision has implications for today's businesses. Another example of change was how the personal information on LinkedIn (available for free) is most likely much more detailed and up-to-date than most in-house HR systems. He gave examples of where the opening of self-service HR has shown up to 30% of records were updated immediately because data was wrong. The session transitioned into looking at peoples productivity, comparing the very gradual increase over the last few years with the exponential rate of technology increase, showing the clear -and growing - gap between the two. Andy went on to look at Cloud Applications, with specific reference to how point-solutions proved initially popular but that the industry now shows a trend toward cloud application 'suites' due to the significant overhead of integration. Andy's final slide was on something that is actually taught at my children's junior school - the fixed/growth mindset - and how modern business leaders should ensure they foster continuous improvement into their IT strategy. Our Session - How To Migrate Your Customizations To The Cloud In an extension of our usual remit of showing how to customize and extend Fusion Cloud Applications, this time we added a methodology to help those implementing think carefully about customization and to adopt a comprehensive migration approach. This focused around the flow in the diagram below. First understand what you have today; what is used, by who, when, how much, and what for. This starting position allows you to understand if you might be able to immediately eliminate some customization. From that you build your future vision; how you'd like to see your application services evolve. Again a chance to understand what users really want and why - because migration should not be a replication of today but a big improvement. Then comes the creation of a map to get from A to B. This part covered demonstrating the customization solutions available inside the SaaS applications as well as extension features available in the Oracle PaaS services. Finally the 'Extend' part allows reflection on opportunities for further enhancement, beyond looking at the the business needs and into business development and adoption of new capabilities. I was pleased that the session was very popular (with people left standing in the aisle!), and seemed to be well received.  Let me know in the comments if you'd like the slides (the file is too large to load here), however I am also working on publishing the content separately. Other Attended Sessions The first session I attended was given by our friend and colleague Andy McGhee from the Oracle HCM Centre of Excellence who provides direct assistance to specific customer projects. He first illustrated the typical implementation roadmap, with an emphasis on post-implementation proactive service management. I noted his advice to keep records on early solution analysis and design, to avoid key considerations getting missed later on. He gave an example of doing 'catch-up' of missing data migration that can prove problematic. Another note I made was to ensure implementation includes reporting needs in the project plan, and not leave it out and as such becomes another catch-up task Interestingly Andy explained how when he visits customers he often leads with showing the Business Process diagrams upon which the application functionality is based, and can be found in MyOracleSupport Note 1542019.1. This help reduces misunderstanding and sets expectations. Andy continued to offer lots of great advice on owning and managing a cloud environment, such as setting up a Cloud Manager role to ensure accountability of ongoing testing, administration and integration. He also referenced the popular HCM Talk Radio podcasts (where we collaborated in the past), with new content almost weekly. The second session was under the more technical track and explained the Platform-as-a-Service components used to extend Oracle Cloud Applications (PaaS4SaaS). Despite having looked at this ourselves, there is always more to learn and good to hear others points-of-view. The session was given by Debra Lilley, UK OUG board member and VP of cloud services for Certus Solutions Ltd. The focus was around the findings from a workshop held last year between partners Certus and eProceed, and the Oracle User Experience team. Here the objective was to build an app using PaaS services which complements Oracle Cloud Applications. Key takeaways included; power of the RDK for ADF development, the need for more APIs in Cloud Applications, no browser redirects, and most significant the lack of business process customization. It was reassuring to hear confirmation that several of the considerations have been addressed since the workshop. In a general PaaS landscape overview it was interesting to hear that the extensive catalog (>30) is being rationalized into complementary suites, to make it easier to understand what you need. A final note I made was that Debra proposed that the adoption of cloud is maturing to more organizations looking to replace existing systems, compared to customers adopting cloud to access new applications and functionality they did not have before. The third session was a real customer - the University of Birmingham - and their road map to adopting Cloud Applications. While they were at the start of their actual implementation it was interesting to hear about the procurement process they followed and the massive scope of the systems they were replacing. They cited over 200 ancillary applications around their core business applications (like finance and HR) and how the rapid growth of their business has contributed to the need to bolt on more and more just to keep pace. As such they reached a tipping point where the cost of managing and developing more additions is beyond what they can justify. It was interesting to hear how they did not use the traditional first step of documenting user requirements, but went to top-tier vendors to understand what their solutions offer out-of-the-box and see if that could fit with their business. This big change to the usual process I heard again a few times during the day. During the session I noted a great phrase - 'swivel chair integration' - for how when systems do not currently work together employees pass messages to colleagues sitting next to them. While Birmingham University had worked on the cloud project for more than a year it was interesting how they understood that even at the end of their implementation it was 'the end of the beginning' as they would need to continuously manage and optimize their Oracle Cloud services.   The fourth session was actually re-titled to "CRM is not a system" and led by Fred Wilkinson from Oracle partner BPI OnDemand. This broader reaching session gave some great propositions to consider. The main drive was that typical CRM systems are architected based around the internal departments of the organization - and not around the customer experience at all. They drive internal improvements but give less focus on improving the process for the customer. He gave examples such as self-service help which is often cost saving driven. One good example is Tesla who have 70% of their customers who buy their cars without a test drive. He also looked at the value of the data organization hold, citing the $8bn valuation of General Motors who own factories, parts, labour etc compared to $50bn for Uber who have hardly any non-digital assets. He also proposed that discussions of social data and big data is often focused on Twitter, LinkedIn or Facebook, but there are over 3 million other data sources out there. Fred went on to propose three tenets of successful CRM projects; People, Data, Process and Advocacy. This session was big on thought-provocation and certainly allowed attendees to think past where they are today.   The final session was "Why does mobile need a cloud" delivered by Grant Ronald, Director of Product Management for mobile at Oracle. Always a popular presenter grant explained the Mobile Cloud Service and showed demos of some of it's components including the Mobile Backend as a Service (MBaaS) for setting up and managing mobile-ready API's and the Mobile Application Accelerator (MAX) for low-code development of mobile apps. In just a few minutes he had a working mobile client and you can see him do very similar in these great mobile cloud service videos. Grant went on to look at future technologies, including an exciting demo of the Oracle Chatbot platform introduced at OpenWorld last year. Grant demonstrated - from a personal banking use-case - how you can issue instructions to artificial 'personas' using the same chat client you use with your friends (Facebook messenger was used) and the back-end systems will interpret the instruction (using Natural Language Processing), execute the task, and reply with a human-like confirmation (or questions if it's not sure). It was a great demo and glimpse into the future.   Panel  As the last event of the day there was a panel session for open Q&A. I was lucky enough to be invited onto the panel and we had a broad range of questions put forward. Each panel member responded with their own take on the questions which gave a very rounded and complete answers. Questions where on a broad range of topics, from specific technologies and products to wider queries about the top benefits of adopting cloud applications. It was a good opportunity for anything left unsaid and proved popular with topics taken off-line also. Summary The day proved well attended and the depth of the presentations I saw seemed to satisfy the needs of attendees. Hopefully this will become an annual event and we'll certainly be there to support it.

The UK Oracle User Group held a one day conference entitled 'Journey To The Cloud' where the community came together to discuss what is involved in adopting Cloud Applications and for those already...

February in Review

Let's take a look at what happened in the month of February.  We published two additional articles in our R12 updates series: Release 12: Improvements to Importing Custom Object Records Release 12: Using RESTful Web Services to Load Attachments on Custom Objects   To see the entire series, use the release12 tag. Release 12 is now available in the Cloud; new customers are getting it as their environments are provisioned, and Cloud Operations is working with existing customers to schedule the upgrade of existing stage and production pods. Our colleague Edward Dewolf also concluded his own six part R12 updates series.  It's a blog that's well worth bookmarking (or tracking via RSS). Richard's post on using JSTL functions in page customizations is the result of several questions we have seen on our community forum and in blog comments. If you are looking for ways to manipulate string values in page composer expressions, check it out. In our series about Platform services (PaaS) we took a look at the BI and Data Visualization Services and how they can be used to work with Fusion Cloud Applications such as Sales Cloud. Other posts in February cover these topics: Managing Custom Child Object Data With File Based Loader Understanding Web Services Through Specification Formats Backing Up and Migrating BI Reports and Analytics Our community Q&A forum saw a lot of interesting questions on a wide variety of topics.  Do not hesitate to visit it if you have problems or questions, but we would also love to see each and every one of you jump in with answers and suggestions. Oracle's Applications UX (User Experience) was on the road to offer workshops to customers and partners.  Check out their trip reports on the Usable Apps blog;  Designing and Building Oracle PaaS Cloud Applications: Never the Same Experience Twice Using the Oracle Applicatiosn Cloud UX ADF Rapid Development Kit to Design Smartly and Build Simply UX Magazine also recognized the Oracle Applications User Experience team by awarding it the 2016 "Best In-House Team" award.  Congratulations to our colleagues for this awesome accomplishment!  And finally, a new Youtube Channel from the Cloud Marketplace team is worth subscribing to.  If you are a customer, you might find useful add-ons to enhance your Cloud solutions.  If you are a developer, it might offer you inspirations and ideas for offerings that you can create to benefit our joint customers.

Let's take a look at what happened in the month of February.  We published two additional articles in our R12 updates series: Release 12: Improvements to Importing Custom Object Records Release 12:...

Groovy

Using Sorting In Groovy Queries

In addition to the other features we've looked at when using the NewView() features for querying data using groovy, there is another useful option to mention - sorting of the returned rows. By using the setSortBy() method you specify the attribute upon which your query will order the returned records. This also supports multiple sort attributes and asc/desc keywords. Note that the set setSortBy() method is inherited from the underlying ViewObject class and there are restrictions on the methods inherited, for example the similar setOrderByClause() cannot be used.  Also be aware that the sorting occurs in-memory (synchronously in the users session) and as such if there are a great many rows returned it may result in performance issues. As such always use a ViewCriteria and even limit the number of rows returned as shown in the example below. For more details and other examples of setSortBy() consult the groovy scripting guide. Illustrative Example Users want to see the titles of the most recent Opportunities a customer has open, so they can track recent activity. Rather than click on the Opportunities tab in the Accounts page, they'd like this information on the front page. As such we added a custom Formula Field to the Accounts object, and used a groovy script to run a query. Here is how it looks: The query matches the Account name on the opportunities to ensure a small data set is returned. Then it uses the setSortBy() method to organize them by the creation date - in a descending order. Finally it ensures only the first 5 records are fetched from the database. After executing the query, it then returns the values as a concatenated string to the formula field. def myString = "" def myComp = UniqueNameAlias def vo = newView('OpportunityVO') def vc = newViewCriteria(vo) def vcr = vc.createRow() def vci = vcr.ensureCriteriaItem('TargetPartyName')     vci.setOperator('=')     vci.setValue(myComp)    vc.insertRow(vcr)    vo.appendViewCriteria(vc)    vo.setSortBy('OptyCreationDate desc')    vo.setMaxFetchSize(5)    vo.executeQuery()  while(vo.hasNext()) {   def row = vo.next()   myString = row.Name + '\n' + myString  } return myString  

In addition to the other features we've looked at when using the NewView() features for querying data using groovy, there is another useful option to mention - sorting of the returned rows. By...

Updated: Oracle Customer Connect

As mentioned in previous articles, Oracle provides a dedicated portal for its Applications customers to learn and share knowledge. Also supported by numerous Oracle experts, the Customer Connect site has just undergone a few enhancements that we're excited to share. Firstly the site has been re-titled, to Oracle Cloud Customer Connect, again emphasizing its focus on Cloud solutions. This also comes with a new easy-to-remember URL as https://cloud.oracle.com/community. As a reminder this is in addition to the MyOracleSupport Communities and the OTN Communities where our own Q&A forum exists. Secondly, the Customer Connect site now has a Oracle Supply Chain Management (SCM) Cloud community area, offering the same set of events, forums and resources as other application product families. Thirdly there is an ongoing increase in the webinar Events held via this portal, both from Oracle and community experts from the field. Looking quickly at March 2017, there are activities across all product families covering topics including; latest feature reviews, upgrade planning, integration solutions, and security enhancements. Finally, along with general customization guidance (including references to our material), Cloud Customer Connect now includes 28 solution-specific forum posts, under the heading HCM Customization Solutions. Each has a PDF step-by-step guides on how to create a commonly needed customization. This includes things like how to show/hide specific page components, embedding additional content, and setting up flexfields. These are specific to Oracle HCM Cloud pages and include the following functional areas: New Person and Manage Person Page Workforce Modeling Embed OTBI Reports in Spotlight SmartNav and Org Chart My Team Page Manager Resources Dashboard Enable HCM Infolets Expression Language Resources Directory and its Org Chart Personal Information Contacts and My Information Contacts These great step-by-step guides are short and exceptionally clear. So while we focus on technologies and customization platforms, it's great to be able to see these product-specific solutions shared. In summary, the above features supported by active Q&A forums, rich resources and a complete site search feature, ensure this portal remains of high valuable.

As mentioned in previous articles, Oracle provides a dedicated portal for its Applications customers to learn and share knowledge. Also supported by numerous Oracle experts, the Customer Connect site h...

BI

Backup and Migrate your BI Reports and Analytics

When working on customizing and developing with BI, it's useful to take an off-line snapshot of your bespoke reports as a backup. This article shows you how, using the generic BI 'archive' feature. Additionally the same feature provides the ability to quickly migrate (from TEST to PROD) and even share your report definitions with your community. Importantly the same archive process supports all your development using BI Analytics, BI Dashboards and BI Publisher reports. Additionally this process supports BI Folders and all their contents. This means when using a logical folder structure you can migrate and backup all your bespoke BI items in one go.   In the screenshot below we have the AccOpts analysis that is a simple pie chart showing the count of opportunities across customer accounts. This is currently stored in the /Shared/Custom folder. In the BI Catalog console, in the left-hand sidebar you'll notice a selection of Tasks. This includes the Archive option.     Clicking this simply downloads the selected item as a '[name].catalog' file to the local PC. Now moving to a second environment, locate the desired destination directory and click the Unarchive link in the tools region (appears when an item is not selected). The following pop-up is then shown, and from which you select the file from your PC. The file imports and loads immediately, and as shown below runs with the local data.     If you'd like to see more on this, check out this video from BI expert Edward Dewolf. Extra Feature Note: in the same Tasks region there is an 'RSS' item. This is useful when multiple people are working on BI, offering visibility into who is creating what inside a folder.

When working on customizing and developing with BI, it's useful to take an off-line snapshot of your bespoke reports as a backup. This article shows you how, using the generic BI 'archive' feature....

BI

Platform Services: The Oracle BI and Data Visualization Cloud Services

  Why Are These Interesting? All Oracle Fusion Cloud Applications have comprehensive embedded BI capabilities, whether that's Oracle Transactional Business Intelligence (OTBI) for building analytics or BI Publisher (BIP) for designing report output. What the BI platform cloud services add is the opportunity to go deeper - to try to understand why a particular signal was raised by the embedded features. The key areas of added value are: Extending the analysis of existing analytics and reports, looking at data in new ways. Combine with data from multiple data sources. Provide a end users with non-technical visualization and analysis capabilities   What Are The BI Cloud Services? In this article we will focus on three related offerings: At the broadest level is the Oracle BI Cloud Service, an enterprise solution for reporting and analytics. This provides full access to an Oracle BIEE environment with all its catalog management, administration and powerful authoring features. It also includes a database schema for hosting your source data. Oracle Data Visualization Cloud Service is part of the Oracle BI Cloud Service, and is also available standalone. The Data Visualization Cloud Service supports professionals and managers with dynamic visualizations to help explore root causes and assess business impacts. The self-service nature of this tool hides any technical implementation, allowing everyday business data to be easily modeled and visualized. It includes extensive automation in the visualization creation process, providing easy-to-use options to make the most sense of the data available. The tool focuses on enabling meaningful insights by blending data and offering a smarter information discovery though a narrative of visualizations based on a common context. All visualizations offer an interactive user experience, such as being able to highlight specific data points and make them the focus, without any re-editing. The Data Visualization Cloud Service comes with support for sharing findings between users and for use on mobile devices. Finally, the Oracle Data Visualization Desktop offers end users the same easy-to-use analysis features as the Data Visualization Cloud Service, deployed locally on a desktop machine. This option may be useful where just a few users wish to take advantage of these features, or where cloud adoption is not yet possible.   BI Data Sources  The ability to tap into multiple data sources in combination with your Fusion Cloud Applications is of high significance, and as such let's look at this is more detail. Firstly if you already have extract and export programs providing datasets for reporting then the BI Cloud services offer support to work with local files. The system supports uploading csv or xlsx files of up to 50MB. Each file forms a unique data source for interrogation. Learn more about using spreadsheet based visualizations in this video.   For the majority of cases users want some access to live data. Technical implementations of such may include getting data through a BI web service connection, and use with the BI Cloud service is explained in these articles on importing reports and analyses from the A-Team's related series. Other technical options for data source creation exist around using Oracle Data Integrator with BI Cloud and using BI Applications Configuration Manager, mentioned here. However, there is a simpler solution available. This is a live Oracle Applications connection defined and managed within the BI Cloud Service (available in all solutions). By defining your data source based on an Oracle Applications connection, it links the two BI Server environments to allow direct communication. Example The following screenshots show connecting the BI Data Visualization Cloud Service to an existing Fusion Cloud Application environment (not product specific) and mixing that as a Data Source with data from other systems.You can see other examples of this here. 1. First define the Data Source as "From Oracle Applications". From this the remote BI server host and a username and password are entered. Once connected, you define the detail of the Data Source within that connection. This can be based on logical SQL issued against the BI repository (i.e. not to the database), or simply based on on an existing analysis or report (show below). Next in the wizard define the columns to use and their properties.   Now having created the Data Source, it is available to form the basis of a new Visual Analysis (VA) Project.     In this example, we defined a second Data Source from an uploaded Excel file, such as this:   Now each Data Source is connected together so the data can be used in one visualization. The matching columns are simply selected in the popup, as shown below. Now we can go ahead and create a Visual Analysis (VA) Project that includes our Data Sources. From this users select a visualization type and drag-and-drop the data from the Data Sources. After setting a few properties and adding any custom formulas required the visualization is complete.   Now the fun starts. From here business users leverage the built-in interactive features to understand the significant parts shown in the visualization. As shown below, on-the-fly you can take just one click to do things like adjust time series, drill, sort, filter, and fix on a narrow 'marquee' dataset. You can also add more individual visualizations to create a narrative that explains your findings, and which can be shared with others as a live presentation, saved, or exported for use offline. See these videos for more general use examples. Coming soon is the ability to accessing the OTBI Subject Areas for your Fusion Cloud Applications from the Data Visualization Cloud Service. This will be part of Oracle Data Visualization Content Packs, composed of pre-built visualizations aimed as specific job roles, such as the VP of HR. If you're interested in looking at these content packs now, they are already available for installation with the Data Visualization Desktop. Summary In additional to Oracle BI Cloud Service's enterprise features, the Data Visualization Cloud Service (and desktop) allows users to mashup data from additional data sources and perform in-depth analysis without specialist BI Authoring skills. So while we've looked at how Fusion Applications Cloud Service customers can leverage the built-in BI capabilities for their own custom analytics and reports, where there is a desire to look even deeper at the data these Oracle cloud platform services offer great potential.  

  Why Are These Interesting? All Oracle Fusion Cloud Applications have comprehensive embedded BI capabilities, whether that's Oracle Transactional Business Intelligence (OTBI) for building analytics or...

Integration and PaaS

Understanding Web Services Through Specification Formats

This short article introduces the specifications used to describe the Oracle Fusion Applications Cloud web services. We've had related questions on our forum so this is a getting-started explanation for applications administrators and developers who may be new to working with web services. SOAP Web Services For SOAP web services the specifications follow the industry-standard Web Service Description Language (WSDL) format to describe the operations and messages of each service. This includes protocol details, security information and parameters. Each WSDL file commonly references related WSDL documents and provide references to the message data, known as a Service Data Object (SDO). These SDO's are defined in XML Schema Definition (XSD) format and there is usually one for the main service message and others for each child object. For example, the Sales Cloud 'Activity' service has the top level WDSL document accessible at the following URL:  https://[YourCRMhost]/appCmmnCompActivitiesActivityManagement/ActivityService?WSDL Within this is a reference to the data passed to/from this service is defined by the Activity SDO available at: https://[YourCRMhost]/appCmmnCompActivitiesActivityManagement/ActivityService?XSD=/oracle/apps/crmCommon/activities/activityManagementService/Activity.xsd  This Activity object has three child objects - Assignee, Contact and Objectives. These have their own XSD documents referenced from the parent: https://[YourCRMhost]/appCmmnCompActivitiesActivityManagement/ActivityService?XSD=/oracle/apps/crmCommon/activities/activityManagementService/ActivityAssignee.xsd https://[YourCRMhost]/appCmmnCompActivitiesActivityManagement/ActivityService?XSD=/oracle/apps/crmCommon/activities/activityManagementService/ActivityContact.xsd https://[YourCRMhost]//appCmmnCompActivitiesActivityManagement/ActivityService?XSD=/oracle/apps/crmCommon/activities/activityManagementService/ActivityObjectives.xsd" RESTful Web Services RESTful web services currently exist for Fusion Cloud Application products Project Portfolio Management, Global Human Resources, and Sales. As shown in the Oracle API Catalog they also exist for many other Oracle Application products, including Service Cloud, CPQ Cloud, Eloqua & Responsis Marketing Cloud. Whilst commonality will occur, this article focuses on the two specifications that apply for understanding Fusion Cloud Application REST services. 1. Describe Format Each web service provides a 'describe' endpoint URL which offers a descriptive document. This is an Oracle ADF way to understand a service, and is explained here as 'The describe for the RESTful web service allows you to identify the shape and actions allowed on an ADF RESTful web service. It returns a JSON object that contains the attributes, actions, and links defined in the REST resource definition'. All Fusion Cloud Application RESTful services have such a describe document and is simply available by adding /describe to the service endpoint URL, such as: http://[YourHCMhost]/hcmCoreApi/resources/latest/emps/describe  Note here the use of /latest/ (or a specific release number) in the URL. 2. Open API Format This is a language-neutral specification format for RESTful APIs. The format is an open industry standard and explained further on this GitHub page. Each Fusion Cloud Applications web service is defined in OpenAPI format on the Oracle API Catalog site. For example the Employees service has the following text which returns the related JSON file: OpenAPI Definition {···}. Swagger is a tool to parse and manage the OpenAPI format information, and is used by the Oracle Documentation. The inputs into the Swagger tool can be found for each service under the 'download' feature on the following sites: HCM REST Services Sales REST Services Projects REST Services Common REST Services An example of using the Swagger client is available in the second half of this article.

This short article introduces the specifications used to describe the Oracle Fusion Applications Cloud web services. We've had related questions on our forum so this is a getting-started explanation...

January in Review

Our Content In January we published an article illustrating the use of Context-link type tabs, to allow additional access to Sales Cloud data. Similar to our previous cheatsheet series, we looked in depth at the Resource standard object available in Sales Cloud, highlighting it's structure and features for use in customization, extension and integration. As part of our platform cloud series, we introduced the Oracle Process Cloud Service (PCS) and looked its features which may be of use for Fusion Cloud Applications users. In co-ordination with the readiness content and documentation, in January we begun publishing details on new features for customizing and integrating with Fusion Cloud Applications Release 12. Specific articles include General UI Customization Features, Service Request Management, Object Workflow and Custom Subject Areas, Referencing Parent Object Values In Groovy, Joining Custom and Standard Subject Areas, Changes to Standard Object Default Layouts, Descriptive Flexfields Get Groovy and Application Composer Access Requirements. From Other Teams This article from the Oracle A-team demonstrates how to integrate the Oracle Document Cloud Service with Oracle ERP Cloud (Projects). It uses a intermediate integration services deployed to the Oracle Java Cloud (JCS-SX) platform to work with the Document Cloud services to create a new folder for use with a particular project record. The result is shown use the resulting weblink to perform a redirect for the iFrame of the project 'documents' tab. The article includes use of the JWT token exchange to handle security, and refers to the similar article written in the context of Sales Cloud. Our friends in the Oracle Applications User Experience team shared their 2017 vision in this article, with interesting focus on visual and smart UX, mobile, and extensibility. Shay from the Oracle Development tools group provided this article and video on using the Application Builder Cloud Service (ABCS) to extend your HCM Cloud environment. Finally Edward Dewolf published an article on Historical Opportunity Reporting that explains how you can create custom snapshots of sales data (via a profile option and ESS job) to allow for additional reporting based on time.

Our Content In January we published an article illustrating the use of Context-link type tabs, to allow additional access to Sales Cloud data. Similar to our previous cheatsheet series, we looked in...

Application Composer

Release 12: Using RESTful Web Services to Load Attachments on Custom Objects

The following video illustrates how to retrieve attachments and how to add attachments to custom objects in Oracle Sales Cloud REST Service Security There are four HTTP methods that can be used in conjunction with the RESTful services of a custom object and it's attachments. These methods all map to a security privilege on the custom object. These mappings are: HTTP GET method maps to the read security privilege HTTP POST method maps to the create security privilege HTTP PUT method maps to the update security privilege HTTP DELETE method maps to the delete security privilege If a user only has read privileges to a custom object, that user will only be able to execute a GET Request against that custom object using the RESTful API. If a user has create and read privileges to the custom object they will be able to execute GET and POST HTTP methods using the RESTful API but not the PUT method and so on. Authentication Depending on the security privileges set up in the custom object, the user making the REST service calls has to be authenticated. This previous blog article illustrates how to use JWT for authentication to access Oracle Sales Cloud RESTful services. HTTP Headers and URL To submit the HTTP request a HTTP header also needs to be set. Content-Type = application/vnd.oracle.adf.resourceitem+json. The URL that displays the list of attachments is composed of the following elements: https://<HOST>/salesApi/resources/<API_VERSION>/<CUSTOM_OBJECT>/<DATA_ROW_ID>/child/Attachment Uploading and Downloading Attachment File Contents The attachment list contains links that allow attachment files to be streamed to REST clients. Further information on this can be found in the Oracle Fusion Middleware documentation on which Sales Cloud is built. Click here to read more on this subject. Attachments to be uploaded to Custom Objects using the RESTful API have to be base64 encoded and added to the FileContents parameter in the body of the request. Further Information Here is some further information that might be useful to understand the concepts covered in this article. Fusion Applications Attachments blog articles REST API for Oracle Sales Cloud documentation REST Service security in Oracle Sales Cloud documentation JWT Token use in Sales Cloud blog article Consuming RESTful Web Services using the ADF REST Framework documentation  

The following video illustrates how to retrieve attachments and how to add attachments to custom objects in Oracle Sales Cloud REST Service Security There are four HTTP methods that can be used in...

Application Composer

Release 12: Application Composer - Access Requirements

Introduction Application Composer allows developing Custom Objects in Oracle Sales Cloud. This article highlights the permissions needed to build and test Custom Objects using Application Composer. The following are the high level steps to build and test a Custom Object. Create and Publish Sandboxes Access Application Composer Create and Update Custom Object definition Verify Custom Object UIs and validations Grant Custom Object access to users Application Composer Permissions The following table highlights the various permissions needed to build and test custom objects using Application Composer.   Purpose Permission 1 The pre-requisite to build custom objects using Application Composer is to have permissions to Manage Sandboxes. Sandboxes can be managed from the following menu entry:       To manage Sandboxes, the following privilege must be granted to the user. Name View Administration Link Code FND_VIEW_ADMIN_LINK_PRIV 2 To access Application Composer from the Navigator -> Tools menu. To access Application Composer, the following privilege must be granted to the user. Name Manage Extensible Object Code ZCX_MANAGE_EXTENSIBLE_OBJECT_PRIV 3 To create a new custom object. Without this data security policy, a user will be able to view and edit existing custom objects in an active sandbox but will not be able to create new objects. Custom Object Creation will give the following message when this data security policy is not granted. “The object Entity cannot be created because of an error. Contact your help desk.(ZCX-3075001)"   To create a new custom object, the following data security policy must be granted to the user (via a role) Role Any role that is granted to the user. Object Application Object Condition For all Customer Relationship Management Application Objects for Business Object Application Objects for Table FND_OBJECTS Actions Read; Update; Delete; Manage Application Objects; 4 To access and verify the UI generated for a custom object by the developer. To test the custom objects in an active sandbox, the following role must be granted to the user. Release 10 and Release 11 (APM: Authorization Policy Manager) (Application Role in “crm” application stripe) Name Sales Administrator Code ORA_ZBS_SALES_ADMINISTRATOR_JOB   Release 12 (*) (Security Console) Name Custom Objects Administration Code ORA_CRM_EXTN_ROLE 5 Once a custom object has been developed and tested, the final step is to grant access to the custom object to appropriate users. Access to custom object can be define via Custom Object -> Security option. Release 10 and Release 11 (Using APM: Authorization Policy Manager) All roles in the “crm” application stripe with role category as CRM_ENTERPRISE_DUTY are allowed to be granted access to custom objects. Release 12 (Security Console) Custom Roles with role category as “CRM – Job Roles” are allowed to be granted access to custom objects.   (*) Fusion Applications Release 12 comes with seeded security definitions that are in a read-only (locked) mode. The seeded roles represent a reference implementation and cannot be modified by customers. Hence access to custom objects can no longer be granted to the seeded “Sales Administrator” job role. A new “unlocked” role called “Custom Objects Administration” is delivered as a place holder role that will be automatically granted access to all custom objects created using Application Composer. Out of the box Access Out of the box, the permission to develop and test Custom Objects are granted to the following two roles . Customer Relationship Management Administrator Custom Objects Administration Access to develop custom objects: Out of the box, the seeded job role “Customer Relationship Management Administrator” job role is granted the following App composer access: View Administration Link Manage Extensible Object Data Security Policy (Read, Update, Delete and Manage Application Object actions on Customer Relationship Management Application Objects) Access to test custom object UIs: Out of the box, the role “Custom Objects Administration” is granted default access to every custom object. Navigate to the Security Link of any custom object. By default, “Custom Object Administration” role will be granted full access to the custom object. Please note that the “Customer Relationship Management Administrator” job role grants access to all functional setups in Oracle Sales Cloud application. To ensure your custom object developers do not get full access to all Oracle Sales Cloud setup tasks, please create a custom role with the ability to develop and test custom objects only. The following section illustrates an example of how to create custom roles to support custom object development and testing. Custom Job Role Example To restrict access to just build and test custom objects, a custom Job role must be created and granted the above permissions explicitly. For example, you can choose to create two roles: 1. “Customization Developer” with all of the above listed access. · This user will be able to create new custom objects and test them 2. “Customization Tester” role without the Data Security Access · This user will be able to test custom objects but cannot create new custom objects. View of function security access of Customization Developer role from Security Console View of data security access of Customization Developer role from Security Console   References Application Composer Documentation Security Console Documentation

Introduction Application Composer allows developing Custom Objects in Oracle Sales Cloud. This article highlights the permissions needed to build and test Custom Objects using Application Composer. The...

Groovy

Release 12: Descriptive Flexfields Get Groovy

New in Release 12 is the inclusion of the Groovy expression platform into Descriptive Flexfield (DFF) setups. This applies across application products and is used in the default value property, and most significantly as custom validators on the flexfield. As illustrated by our overview articles, Descriptive Flexfields are defined under Setup and Maintenance, under task Manage Descriptive Flexfields. From this page you search and edit one flexfield type and define the way in which you want it to work. One groovy option is found under the Default Value property, which can be defined based on a dynamic expression. Additionally, under the 'Global Segments Validators' section you can define a script to validate the global segment value entered. If you are familiar with Sales Cloud, you will notice (below), this works just like a Field Rule in Application Composer, in that it should resolve with a Boolean result upon which it determines whether to display the Error Message text to the end user or not.   Clicking the Validator Expression icon shows the Groovy Expression Builder. You'll notice it includes support for many built-in also functions. It should be noted that the code should be a simple expression (not attempts at CRUD operations) and that direct access to other attributes and data is not possible. If you're new to using Groovy checkout our getting started whitepaper and other articles.

New in Release 12 is the inclusion of the Groovy expression platform into Descriptive Flexfield (DFF) setups. This applies across application products and is used in the default value property, and...

Application Composer

Release 12: Changes to Standard Object Default Layouts

Related to new user interface customization features, this article looks at changes in Application Composer layouts.  In Release 12 every standard object now has a "Standard Layout". This contains preconfigured elements which illustrate how you may wish to display the related information. These Standard Layouts are not editable, but do allow duplication into additional "Custom Layouts" upon which changes can be made. This differs from previous releases where standard objects had a "Default Layout" with some prebuilt configurations and were directly customizable. In the first screenshot below the Account object in Release 11 has a seeded "Default Layout" which is directly editable. In the second screenshot the post-migration Release 12 view has the non-editable "Standard Layout" and a second "Default custom layout" which contains the customization. This new model allows for quick implementation of professionally designed pages, and the separation of customization. As shown, all upgraded customized "Default Layouts" become additional custom layouts.  Note that you cannot deactivate the new Standard Layouts, therefore where custom layouts with viewing conditions (such as Role, Record Type or an Advanced Expression) that are not met the Standard Layout will be used. Since Standard Layouts are provided by Oracle they may be change with upgrades, and as such layout design should account for this possibility.  

Related to new user interface customization features, this article looks at changes in Application Composer layouts.  In Release 12 every standard object now has a "Standard Layout". This contains...

Application Composer

Release 12: Joining Custom and Standard Subject Areas

From Release 12 onward Custom Subject Areas are enhanced with easier navigation to add fields, defaulting in implicit facts, as well as support for M:1 related objects. In addition custom objects can be used in combination with Standard Objects within which a natural hierarchy exists, such as customer accounts. This means reports may include custom data values at whichever level of the internal hierarchy. For example: A particular customer may exist within a hierarchy of accounts, where child organizations purchase different item types. As such it is useful to maintain the hierarchy within Oracle Sales Cloud reports, and include related custom data. This can be done using the following process flow: 1. The report developer uses a seeded Subject Area for their standard object report and selects the hierarchy fields to use, usually named as Level 1, Level 2, Level 3 and so on. 2. They add another subject area to the report, this time selecting a custom object which already has a relationship with the standard object. 3. Now the developer simply drags-and-drops the custom object fields they wish to use alongside the hierarchy fields.  Below is a video example using the custom "AccountProjectLines_INT" object with the Account, however the support for hierarchies extends to Resource, Partner, Contact and Territory standard objects. Note that all the mapping is automatically created internally, therefore the process for end users is simply selecting the fields they wish to use.

From Release 12 onward Custom Subject Areas are enhanced with easier navigation to add fields, defaulting in implicit facts, as well as support for M:1 related objects. In addition custom objects can...

Groovy

Release 12: Referencing Parent Object Values In Groovy

This article shows a quick example of accessing attributes on a parent record while creating child records. This is very useful for setting dynamic defaults and pre-populating fields. In this example we have a parent Promotional Tools custom object. This has a child object, Tool Fees.  Our requirement is to set the Price on the fee based on the parent object type value already selected. In our example we have PromotionalTools_c as a cutom object with ToolFee_c is the child object. To set the value for the fee price in the Default Value property of the fee we can enter the following expression. if(PromotionalTools_c?.ToolType_c = = 'BANKACCOUNT'){ return 100}   Alternatively this could also be done using an After Create trigger on the child object, using the setAttribute() keyword on the ToolFeePrice_c field. def parentType1 = PromotionalTools_c?.ToolType_c if(parentType1 = ='BANKACCOUNT'){  setAttribute('ToolFeePrice_c',100) }               Both options produce the same result, with the Price defaulting in as 100 when the parent object Type is Bank account.   Obviously we could just default in values from the parent, or use more complex logic to set dynamic values. This example is just intended for illustration. Many To Many Relationships In the example above we used a simple one-to-many relationship, however it should be noted that the ability to reference another object also applies should you be using a many-to-many relationship. For example we have a "Projects" custom object which has a many-to-many relationship with the "Accounts" standard object, since one project might include multiple accounts and one account might be used in multiple different projects. To permit this we created a many-to-many relationship using an intersection object named "Association". As such when we wish to get the Account primary address within groovy written on the Projects object, we can use the following reference successfully. Organization_Tgt_OrganizationToAssociation_c_Src?.PrimaryAddressCity       

This article shows a quick example of accessing attributes on a parent record while creating child records. This is very useful for setting dynamic defaults and pre-populating fields. In this...

Application Composer

Release 12: Application Composer - Service, Object Workflow and Custom Subject Areas

Service With Release 12 comes the Sales Cloud feature for Service Request Management to support your customers and perform related processing. This is also exposed in Application Composer with a new application container. It provides two Standard Objects for development work; 'Service Request' (with children) and 'Queue'. As shown there is full support for creating custom objects, custom fields, scripts, and the exact same features as held within the existing Sales and Common application containers.   Object Workflow It is now possible to define components of Object Workflow approval flows dynamically by passing additional run-time-related data related to the process. These are passed into the approval composite BPEL flow and used in routing of the approval. As shown in the video below, the additional data is known as extra 'resource' and includes fields on the record such as Created By, Last Updated By, their manager. It also supports groups of users, such as direct reports and subordinates of the Created/Updated By user. This extends the power of Object Workflow approvals beyond specific named users and groups.   Object Hierarchy support in Custom Subject Areas To report against objects which have internal hierarchies is now supported. This includes aggregated analysis of Account, Partner, Territory and Resource object hierarchies. Your reports can now join standard and custom subject areas together supporting any internal hierarchies for more complete reporting. The following video gives an overview.      

Service With Release 12 comes the Sales Cloud feature for Service Request Management to support your customers and perform related processing. This is also exposed in Application Composer with a new...

Release 12

Release 12: General UI Customization Features

  Homepage Personalization and Additional Pagination Dots It is now possible to configure the Navigator menu and Springboard at the user-level, using personalization. This is accessed via the three-squares icon on the top right of the homepage and shows a simple representation of the current structure with checkboxes, as show below: Additionally the homepage can have additional dots enabled to extend the pages beyond additional Infolets. These blank pages can be used in Page Composer to add custom components like HTML, iFrames, Images, and BI content.Note below the fourth white dot is a blank page, which in page composer can have custom content added. Button Overflow If you've ever added more than one button to a simplified layout then you'll notice when included on the same lines as the existing Save, Save and Close, and Cancel buttons it gets quite crowded and title text ends up truncated. As such in R12 when the space is limited a dropdown becomes available with the additional buttons exposed. An example is shown below. Faster Developer Navigation using Favorites and Recent Items Using links stored in your Favorites and Recent Items list you can quick move between customization and user pages.With Release 12 the context of your location in Application Composer is accessible, allowing for more direct links. As shown below, this makes for quick navigation while developing your customizations. Here we have a link to the Product Lines runtime page in our favorites whilst also having a link to the Product Line: Fields page in Application Composer in Recent Items. Dynamic Landing Pages The landing pages for custom and standard objects are comprised of a list of records table and a search feature. These can already be adjusted - allowing selection of fields for use, however in Release 12 they can be configured as multiple layouts. This means they can be applied for specific job roles, so that different types of users see the fields they care about most. This is done in the Pages feature in Application Composer, and you'll immediate see that layout management is available at the top, in addition to the creation and edit pages. One note is that the roles you can select are - by default-  listing only custom roles. You can see and use the reference roles using the checkbox on the page. Interestingly the Reusable Regions section for custom objects is also enhanced by the addition of dynamic layouts as well. This is interesting because as explained in this post the search pages for records can now by tailored by job function. Video Demonstration The following shows the creation of a simplified landing page layout used for Sales Representatives. Sandbox Control In addition to the privilege to control sandbox publication we already have, in Release 12 it is included in a dedicated job role. This becomes FND_SB_PUBLISH_BUTTON_PRIV - Application Sandbox Publish Button View Privilege FND_SB_PUBLISH_BUTTON_DUTY - Application Sandbox Publish Button View Duty Similarly the protection on sandbox Import features now has the following dedicated privilege and role: FND_SB_IMPORT_LINK_PRIV - Application Sandbox Import Link View Privilege FND_SB_IMPORT_LINK_DUTY - Application Sandbox Import Link View Duty Both of these duty roles are inherited by the reference Job Roles of Application Administrator and Application Developer.    

  Homepage Personalization and Additional Pagination Dots It is now possible to configure the Navigator menu and Springboard at the user-level, using personalization. This is accessed via the...

Application Composer

Querying and Adding Supplementary Data As Tabs In Oracle Sales Cloud

A few times we seen the question of how to display supplementary applications data on a new page. Without invasive design-time ADF development, the most common solution is to add a BI report and create an extra link, tab or frame to expose it. This works just fine in most cases, however if you are using Sales Cloud and would like to interact with the supplementary data also (e.g. make immediate edits), then you can use a specific type of tab to your simplified pages. As shown below, one of the types of tab you can add in Application Composer is called a "Context link" and the inline help text describes this as: 'A context link subtab displays data from any object. To query for the desired set of data, apply search criteria including run time values of the current object'.     So let's look at ways this could this be useful.      Snack Buyers In our illustrative example, our Snacks custom object has a field to hold the name of the Buyer who is responsible for purchasing more of a particular type of snack. As shown below this field is based on the Resource standard object, listing sales users. Upon creating the tab a Search Criteria is used to filer the data shown on the tab. In this case it is based on the Resource Name field on the object matching the Buyer field on the current (snack) object. As such the data now becomes dynamic, based on the run-time context. The result is that we have a second tab on the Snack record user interface, showing more details about the person who is the buyer. This allows users to find them to order more of their favorite snack.     Note that in the configuration is is possible to enable Create, Edit and Delete options, displaying under the Actions button. As such this allows this inline work in a separate window, but returning to the existing context.   Unrelated Data This example shows how to use the relationship created by the Dynamic Choice List lookup to the Resource Object, and therefore could have been done using the Related Object type of sub-tab. The definition of the Context link however states "any object". As such it does not limit you to related objects at all, but can show data from any Custom or Standard Object records in the system (across Application containers). Shown below, the new tab will display all the Resource object records that have a custom field that flags them as Buyers, allowing you to find alternative people to source your favorite snack.       Although probably rarely realistic, the query may include data from the Snack object record that just happens to match values in a field on the tab target object, again without needing any a formal relationship between them. A simplified example might be a list of Lead records where the buyer name is the same. As such this simple, but flexible tab creation allows you to provide supplementary information to users to support their work.

A few times we seen the question of how to display supplementary applications data on a new page. Without invasive design-time ADF development, the most common solution is to add a BI report and...

Integration and PaaS

Platform Services: Process Cloud Service

Introduction As part of our Oracle Cloud Platform series this article introduces Oracle's Process Cloud Service, illustrating how this can be used to extend the seeded Oracle SaaS Application business processes. Note the use of the word 'extend' and no mention of customization here, the seeded business processes in Fusion Cloud Applications can be configured by administrators, but not changed by developers. The use of Process Cloud Service supplements the seeded processes with additional features. PCS Overview If you have ever used the on-premises Oracle Fusion Middleware BPM product (overview video) on your own servers, or it as accessible from Object Workflows in Oracle Sales Cloud, then you will be familiar with the concepts and basic features of the Process Cloud Service. In essence it is designed for declarative development and execution of your companies business processes and approvals. The most commonly used example is a travel approval application. The Oracle Process Cloud Service expands the on-premise software with fresh UI's and features that complement use in a cloud deployment. The majority of the development is done in a 'composer' where you setup the overall application, and define its constituent component including; forms, processes, decisions and rules, and business objects. As shown below the declarative process is carefully directed though common options and pre-built templates. Run-time deployment, execution and monitoring of those processes occurs outside the composer, in the 'workspace' part of Process Cloud. Web Forms Essential to most processes is the capture of request information, which then feeds into one or more processes. For the majority of cases in Process Cloud the request is submitted using a form. The forms are built using simple drag-and-drop features, supporting numerous containers and components. As shown below the Palette offers common form component types through which properties are set using a simple IDE-like screen.   The component properties can be defined with specific values or with dynamic expressions, using an inline editor for building formula. The web forms are then made accessible to end users, either by direct links or embedded in other portal sites and applications.  Process Development As shown below a process begins by accepting the data from the form and the nodes in the flow perform actions based on the values. Processes are defined against swimlanes to define the actors (user types), then BPMN 'element' nodes are added and linked together. There are extensive element types grouped into Human, System, or Events. Human tasks include submit and approve via notifications, System elements can fire sub-process, send messages or call services, and Event (and Gateway) elements define the start/end of paths, setup triggers, and control routing. For every element the properties are configured as the process is constructed. The following example shows a completed process for travel approval, showing the swimlanes, the starting web form, conditional routing based on amount, and human interactions based on manager and supervisor roles. Business Objects and Rules To support simplified and consistent data modelling, Process Cloud allows you to define common business object types. This is similar to creating Custom Objects in Application/Data Composer. These objects allow you to build multiple forms and processes against a well-defined data structure. It also helps ensure clarity and consistency when multiple processes may be working on the same data records at once. Business rules are similarly predefined criteria upon which new processes can be modeled. Process Management     Beyond development, the Process Cloud workspace offers various options for configuration and run-time administration. These include: Sandbox / Deploy - run process in a self-contained sandbox environment for testing. Although similar this is unrelated to Fusion Cloud Applications sandboxes. Analytics and Troubleshooting features - for monitoring and reporting on activity, and investigating problematic or stuck processes. Import/Export - reuse pre-built processes and models between environments.   Integration Architecture Notes In addition to using webforms, you can get information from external sources to use in a process using a SOAP and REST web service connector feature. Using a system service task you can use GET and POST operations to interact with your remote records as required. Supporting data is stored locally within PCS, and there is also a REST API for interacting with Process Cloud directly. It should be noted that Oracle SOA Cloud Service is recommended where requirements include things like; integration between many different systems, relationships between those integrations, complex process executions, and extensive data manipulation and transformation. The use of processes based on predefined SaaS users and roles requires federation between the two identity stores, or the use of the Oracle Identity Cloud service. It should be noted Oracle Process Cloud has a native mobile app to support processes runtime use, and with many easy-to-use features and off-line support the mobile use-case forms a strong business driver. SaaS Options At the time of writing there are two ways in which to use Process Cloud with your Fusion SaaS Applications. 1) Embedded - include the process cloud web form as an iFrame in your SaaS application pages. As explained in the video below, process cloud provides the option to embed forms, plus a suite of JavaScript components for live integration with your other design-time applications also. 2) Service Calls - keeping the web form on an external portal and integrating with the SaaS application through service calls. Define and use the appropriate REST or SOAP based calls within the workflow process, allows access to for SaaS services to create, update, and delete records. The diagram below taken from this article provides an example, defining a service connector to the Fusion SCM product and making service calls to invoke the appropriate operations to create and interrogate sales orders. Summary Oracle Process Cloud offers declarative creation and managed execution of new business processes to extend your operational needs. These can be integrated with Oracle Fusion Cloud Applications through embedded web forms and/or making web service calls. Find out more using the process cloud Oracle Documentation.

Introduction As part of our Oracle Cloud Platform series this article introduces Oracle's Process Cloud Service,illustrating how this can be used to extend the seeded Oracle SaaS Application business...

December in Review

Here is a review of content published in December that you may find useful. Our Content This month we released the following articles: Populating Fixed and Dynamic Choice Lists Programmatically - which explains how to setup choice lists in Application Composer Exporting, Updating and Deleting Data from Objects using the File Based Loader - a video and article illustrating how to further use the File Based Loader that continues our data loading series. Direct Data Access In Fusion Cloud Applications - an article that shows the different ways that data can be extracted from Fusion Applications. Other Content There are a few articles released this month by the A-Team that might be of interest as well: PCS Web Form Tips and Tricks – part 1, 2 & 3 - a series on using web forms in the Process Cloud Service Three articles on loading data into BI using web services. The first on the Big Data Preparation Service. The second on Loading Data using SOAP and the last on Data Analysis. Bulk import of sales transactions into Oracle Sales Cloud Incentive Compensation using Integration Cloud Service - an article that describes how to bulk import sales transaction data into Sales Cloud Publishing business events from Supply Chain Cloud’s Order Management through Integration Cloud Service useful for anyone trying to integrate Supply Chain Management with other applications Loading Identity Data Into Oracle IDCS: A Broad High-level Survey - An overview of the Identity Cloud Service, to help understand how to manage authorization and authentication. Edward Dewolf wrote an article on Historical Opportunity Reporting that explains how an opportunity evolves over time, may be of interest. Events in December The notable event in December was UKOUG. Here is an article summarising information from the event that may be useful.

Here is a review of content published in December that you may find useful. Our Content This month we released the following articles: Populating Fixed and Dynamic Choice Lists Programmatically - which...

Application Composer

All About The Resource Object

This article looks in detail at the Resource object available in Oracle Sales Cloud. It has been created to aid the understanding on how this Common Standard Object can be used in customization and extension projects. What Is A Resource? A Resource is a HCM person (which may or may not be a User that can log in) identified as a participant in the Sales application, and as such can be assigned to business objects. An example might be a member of an Opportunity team or an Account owner. Resource Setups This extra ‘identification’ is done during the HCM person provisioning step, under which a Resource Role is selected and gets applied as the internal HR Assignment Status becomes active.  The User Details page below shows the Employment Information used in HCM together with the Resource Information section used by Oracle Sales Cloud to identify this additionally as a resource record. The Resource Roles (such as Sales Administrator or Sales Manager) are then used to build a hierarchy under which the Sales functionality will operate.  The creation of a Resource Organization hierarchy is detailed in the Oracle documentation, and outside the focus of this document. Also in the Manage Users page, under ‘Autoprovision Roles’ there is also a dedicated 'Resource' job role. It is this, in combination to a Resource Roles for use in an Organization Hierarchy, define the User as a Resource record. The 'Resource' job role ensure access to the Resource Directory pages, as shown below. Additional Resource Roles can be added, with Manager or Member as the main types used in the hierarchy.  This is done using the "Manage Resource Roles" task from Setup and Maintenance through the following edit role screen: Customizing a Resource Record As with all Standard Objects, custom fields can be added to the Resource. In the example below a custom checkbox entitled “Event Organizer” has been added. Resource details, and therefore their Custom fields, are exposed on the Resource Directory - Resource Details page. Note that this is a Desktop UI page and there is no equivalent simplified UI page for Resource details. The page layout still allows all types of custom field and sub-tabs for related/child objects also. File-based Resource Administration The ‘Employee Resource’ import object is available for defining Resources from a file. This is an extension to the standard import of HCM workers (and users) but relies on the same HCM file-based loader. Read more about using this here. The file-based loader import (and export) can be very useful in data migration, and supports the population of custom fields added to the object (after the object ‘generation’ process to update the import object definition). As shown below the mapping within the import requires the use of multiple target internal objects – with Worker Profile and Resource Profile as required (linking the HCM Person to the Resource Role), plus optional data for Address, Resource Organization, and Resource Team. The Resource SOAP Services To interact with Resource records using SOAP-based web services there are two options: TheSalesAccountResourceService. This allows the management of Resource records that are associated to one specific Account. Exposes attributes including; PartyName, RoleName, ResourcePrimaryOrgName, SalesAccountPartyId, ResourceId (same as PartyId), SalesAccountPartyId (the PartyId of one specific Account). The service has find, create, update, and delete operations, however is in context of a particular Sales Account (customer) therefore these requests also require ResourceId and SalesAccountId (along with LockAssignmentFlag). Read more about this here. The WSDL at: http://crm-[YourHost]/crmCommonSalesParties/SalesAccountResourceService?WSDL The ResourceService. This allows standalone management of Resource records. The service has find, create, update, and delete operations. It accepts the Resource SDO, along with related objects. Read more about this here. The WSDL can be found at: http://crm-[YourHost]/foundationResources/ResourceService?WSDL Reminder: All customizations need to be published from their sandbox before they will be available in SOAP web services. The Resource RESTful service It is also possible to interact with Resource records using the REST-based web service. The 'resources' RESTful resource provides GET operations for querying one or all resource records. At this time the service does not support create, update or delete. The service is available at: http://crm-[YourHost]/crmCommonApi/resources/11.1.11/resources This exposes attributes including: PartyId (also used to get individual records), PartyName, PartyNumber, ResourceProfileId, ResourceType, Usage, and all custom fields. Read more about it here. Resource Groovy Examples The following provides some illustrative examples of interacting with Resource records within Application Composer groovy scripts. a) Find and update the current users resource record   def myID = adf.util.getUserPartyId() def vo = newView('Resource') def searchExpression = "PartyId = " + myID vo.appendViewCriteria(searchExpression) vo.executeQuery() def oneItem = vo.first() oneItem.setAttribute('EventOrganizer_c',"Y")     b) Query and update a subset of resource records def vo = newView('Resource') def searchExpression = "Manager ='jjefferson'" vo.appendViewCriteria(searchExpression ) vo.executeQuery() while(vo.hasNext()){   def oneItem = vo.next()   oneItem.setAttribute('EventOrganizer_c',"Y") }   c) Query all resource records and conditionally update some def vo = newView('Resource') vo.executeQuery() while(vo.hasNext()){ def oneItem = vo.next() if(oneItem.PrimaryOrganization =='Global Organization'){ oneItem.setAttribute('EventOrganizer_c',"Y") } } Note that for performance reasons it is recommended to query a subset of Resource records and update those (b) rather than query all records and iterate what could be a massive dataset (c). The Resource Object Attributes Similar to our cheatsheet for other Sales Cloud Objects, this section provides a list of all the available attributes (fields) for the Resource standard object.

This article looks in detail at the Resource object available in Oracle Sales Cloud. It has been created to aid the understanding on how this Common Standard Object can be used in customization...

Direct Data Access In Fusion Cloud Applications

Our forum and blog comments have seen repeated questions about executing ad-hoc queries against the Fusion database in an Oracle Cloud (SaaS) environment. As such this article provides a summary of the options available. Let's start discussing the most common question - 'can I setup direct SQL access?' At the time of writing direct client connections to issue queries to the applications database are not possible for Oracle Cloud Applications, due to the robust security layers in place. As such tools like SQL Developer cannot be used. However, you can access most of the applications data through specific supported features and published API's. This article looks at these options. Web Services This is the recommended mechanism for getting, creating, updating and deleting small to medium volumes of records by remote systems. We've written about both the RESTful and SOAP services in this blog, plus they are documented in the Oracle API Catalog (for REST) and (for SOAP) in product-specific documentation books, such as the one for common objects. Angelo Santagata from the Oracle A-Team provided the following summary of API support across the products (R11) in his recent PaaS4SaaS presentation at the UKOUG conference. ** Controlled Availability. Bulk refers to file based loader, see below. BI Subject Areas When creating custom reports and analytics fields are selected from the huge catalog of Subject Areas. This abstracts the complexity of using the underlying data model, making report creation fast and simple. As such this is the recommended path for creating reports, and with every release the Subject Areas are expanded to include more data. It is not possible to define entirely new subject areas in Fusion Cloud Applications (outside of supporting custom objects in Application Composer), as it requires deep OBIEE administrator access which opens up the possibility of making unsupported changes and untested configurations. Based on subject areas, reports and analytics are commonly developed to deliver rich HTML-based visual data insights. The flexibility of the BI authoring tools also allows XML and CSV as output formats, and combined with scheduling and web service accessibility it opens use-cases beyond simple visual consumption by human users. An example might be providing a data file of new suppliers registered in the system over the past quarter to issue agreement letters using a secondary system. BI Publisher This is frequently the go-to tool for getting data from an environment, especially when coming from E-Business Suite where this tool originated. In addition to using BI Subject Areas for creating reports, this tool allows for SQL statements to be issued when creating a new Data Model upon which to build a report layout. Using the documentation for tables and views (E.g. financials) together with the data model diagrams (we republished) specialists can build detailed custom reports. Obviously testing should be undertaken upon upgrade, as internal data models may be subject to change. Again BI Publisher supports raw data formats such as XML and CSV (in addition to visual equivalents like PDF) and web service access (video), scheduling, and output delivery features - shown below. Read more here. File Based Loader Export Across all products there is a standard mechanism for importing and exporting data to/from business objects. The file based loader has broad support for most record types (including customizations) shown in the user interface. Below is the main configuration screen, showing the selection of opportunity object data to be exported. Once scheduled and submitted the result is a zip of CSV files, one for each object included (the parent and its children). The features are explained in more detail in this series of articles with explanations and detailed video demonstrations. Product-specific Options Many products have specific business processes that include options for sharing data with external systems. Examples are running payroll or calculating tax. One such product with multiple options is HCM, and under the Data Exchange icon there are options for different types of data. More detail on each of these is provided in the HCM administration guide. Similar administration guides exists for each product family. ADFdi and Export-to-Excel ADF Desktop Integration (ADFdi) is also part of the ADF framework offering Excel spreadsheet templates to validate entry of large volumes of data into Oracle Cloud Applications. The integration provided with ADFdi includes not only transaction records, but also populated pick lists of valid values, applications validation during data entry, error messages, and immediate submission of transactions directly from Excel. While the focus of ADFdi is on data entry from Excel, the provided templates are populated with live data and could be used to support external interrogation needs. It is a flexible system that is an alternative way to work with applications records remotely. Check product-specific features for support for ADFdi and for general information consult this Common features guide. In addition to ADFdi there are some tables which support the option to Export to Excel. This is predominantly supported in the Classic / Desktop UI however this is accessible in-context using the "show more details" menu item. The example below is from the Accounts object record where an advanced search provides a very specific data set downloaded after just a few clicks. Oracle BI Applications Configuration Manager Also known as 'Oracle BI Cloud Connector Console' this standalone tool embedded within Fusion Cloud Applications allows you to extract data for use with secondary BI systems, such as Oracle BI Cloud or an on-premise OBIEE data warehouse. It is possible to refine the seeded extract definitions and schedule regular extracts (using ESS). The results are forwarded to an Oracle Cloud Storage target or put on to the internal Webcenter Content (UCM) server which can be accessed directly. The administration screens are accessible for admin users from the following URL and full details in given in the documentation. https://[yourCloudAppsBIdomain].com/biacm Summary This article explains how data access requirements can be met without direct SQL access. Clearly this is a big paradigm-shift from running on-premises applications and takes some time to get used to, however every day existing Oracle Cloud Applications customers use the solutions above. Selecting the right solution, or using a combination of options, will provide access to the data in Fusion Cloud Applications. It is also worth considering why direct SQL access is not practical. Reasons include, but are not limited to: Security - the applications database is at the heart of the system and Oracle Cloud Applications provide multi-layered security including firewalls, advanced networking and physical security measures. Assured Consistency - the cloud model shifts the IT burden from the customer to Oracle, meaning Oracle is responsible for stability, data integrity and for seamless upgrades. Only validated and validating APIs (such as web services) can guarantee this data integrity. Any direct data updates to the tables could violate that and destabilize the environment. Scalability - Our cloud services must scale, as we meet the needs of thousands of customer environments. This is especially important with modern rapid update cycles happening several times a year. Please share any additional suggestions or experience of data-access related solution in the comments below.

Our forum and blog comments have seen repeated questions about executing ad-hoc queries against the Fusion database in an Oracle Cloud (SaaS) environment. As such this article provides a summary of...

Application Composer

Exporting, Updating and Deleting Data from Objects using the File Based Loader

Introduction This video illustrates how to export, update and delete data from Oracle Sales Cloud using the File Based Loader. It follows on from the previous blog article - Loading Custom Object Data using the File Based Loader. Here is the video:   Exporting Data Exporting data using the File Based Loader is done through the Setup and Maintenance Task called Manage File Export Activities. The process generates a zip file containing csv files of the exported objects when the task has executed successfully. Whilst multiple objects can be exported in the same batch, in this example only the Common Custom Object is exported. The csv output format can be configured, but in the example in the video, defaults were used. Updating Data The Record ID field is the unique identifier that allows the update and delete action to be performed on specific rows of data. From Release 12 the Record Name field can also be used for the same purpose. The csv file should contain all the field values that need to be updated along with the relevant RecordID or Record Name (from release 12) for each row of data that needs to be updated. The csv file can be imported using the Setup and Maintenance task called Manage File Import Activities to import the data in the same way as if the content was being updated for the first time. During the Mapping process all the irrelevant fields can be safely ignored by selecting the check box at the right of each row of mapping fields section. Deleting Data Deleting data using the File Based Loader is done using the Setup and Maintenance task called Manage File Import Activities using a csv file with three columns for each row of data that needs to be deleted. The columns are RecordID, Record Name and Action Code. The Action Code value is always DELETE for deletion of a row of data. The other two columns are necessary to identify the row that needs to be deleted. There are constraints when deleting rows of data worth noting. When deleting data from certain objects, the data is simply hidden from view and not deleted from the database. The Account object is one such example. This type of delete is known as a Soft Delete of data. More information about Delete Functionality can be found in the - Deleting Records Using File-Based Import: Explained section in the documentation. Point to Note In the Create Export Process Definition:Enter Basic Information Page is the Parent Object field. See screenshot: The Parent Object field drop down selection list contains a list of Standard Objects and a list of applications within which custom objects can be created in Application/Data Composer. In the environment used in the example in the video, there is a Common application and a Sales application. Therefore there were two options in the drop down list called Common Custom Object and Sales Custom Object which will need to be selected based on which application the custom objects live in. In the next screen called Configure Export Objects the custom objects within the chosen application can be selected for export. The Screenshot below shows what I mean here: Further Information File Based Loader for Sales Cloud documentation Oracle Sales Cloud File Based Data Import and Export (Doc ID 1564536.1) support article File Based Loader for Fusion Product Hub blog article

Introduction This video illustrates how to export, update and delete data from Oracle Sales Cloud using the File Based Loader. It follows on from the previous blog article - Loading Custom Object Data...

November in Review

Here is a review of content published in November that you may find useful. Our Content This month we released the following articles: The Job Roles and Privileges Controlling Customization Features an article on how to setup security to access customization features. Using Approval Groups in Object Workflow illustrates how to setup approval groups for use in object workflows. Loading Custom Object Data using The File Based Loader a video and blog article on how to import custom object data using the File Based Loader How To Filter Your Object Record Look-ups an article that illustrates how to restrict lookup list values appropriately. Useful Parameters When Working With RESTful Service Records highlights some additional and maybe not so obvious parameters used when using RESTful Web services. Other Content There are a couple of articles released this month by the A-Team that might be of interest as well: Using OpenID Connect to delegate authentication to Oracle Identity Cloud Service - an article that illustrates how to use the Oracle Identity Cloud Service to authenticate an application. BICS Data Sync – Running Post Load Procedures Against DBCS and Oracle RDBMS an article on post loading data into the BI Cloud Service BICS Data Sync – Running Post Load Procedures against a Schema Service DB an article that describes how to load data from a schema service db into BI Cloud Service. Automated unit tests with Node.JS and Developer Cloud Services testing applications on the Developer Cloud Service IDCS OAuth 2.0 and REST API on how to integrate with the Identity Cloud Service using OAuth 2.0 Loading Data into Oracle BI Cloud Service using BI Publisher Reports and REST Web Services - loading data into the BI Cloud Service. Edward Dewolf this month has written a few articles that may be of interest: Groovy One Liners about simply extending Sales Cloud using Groovy. Standard Reports and Dashboards an article about the reporting features in Sales Cloud Account Activity Timeline an article on the time line report in Oracle Sales Cloud Lastly I discovered this video R11 Security Workshop that illustrates how to modify a Financials Role using the Security Console in Fusion Applications.

Here is a review of content published in November that you may find useful. Our Content This month we released the following articles: The Job Roles and Privileges Controlling Customization Features an...

UK Oracle User Group Conference 2016

Hosted at the international conference centre in Birmingham UK, this conference attracts not only UK users but those from across Europe, resulting in the largest Oracle conference outside the USA. The event covers pretty much all of Oracle products, with Apps focus on Business Analytics, Business & Strategy, Cloud, Digital CX, Oracle E-Business Suite and PeopleSoft. The conference is co-located with JDE16 & Tech16, and attendees were allowed to mix-and-match the sessions they attended. Interesting Observations and Knowledge The following are my notes from the sessions I attended and activites I took part in. Obviously just a drop-in-the-ocean, but perhaps there is some useful information in here. Extensions I attended a PaaS4SaaS related session run by Oracle partners who worked on the related partner enablement workshops using the Cloud Applications Rapid Development Kit from the Oracle User Experience team. The objective was to build an extension to a SaaS product, using Oracle PaaS services. Overall the message was of success, with a final 8/10 score given to the capabilities at that time (they have since improved further). Interesting notes were: The customization requirement was occasionally possible through configuration of the embedded business process flows in the SaaS Cloud Applications. Since there is no access to customize the underlying SOA Composite application controlling the flow, Oracle Process Cloud can used to supplement the flows, but not change them entirely. Effective use of the File Based Loader to import data from source systems, especially for high-volumes and where direct web services do not exist. The use of custom BI Publisher reporting to supplement data queries proved useful. The use of SOA Cloud service supports the need for custom business processes and rules. This can be readily integrated to update Fusion Cloud Applications records through web service calls. I attended a session on Application Builder Cloud Service (ABCS), against which the development use-case was driven by an Oracle HCM Cloud related functional requirement. This was simply for a custom application that was small and discrete which needed to record data against a companies employees - stored in HCM Cloud. The focus was that this work did not have the justification for a full IT development project, and needed to be constructed by business users with as little coding as possible. They also said their users needed this to be one-click-away from HCM Cloud and to be a seamless visual experience (i.e. look the same). As such the live-demo saw ABCS define a RESTful web service connection to the employees service in an HCM Cloud instance, and declaratively build a single page application that used this service to look-up employee names. The emphasis was on the master employee data remaining in HCM Cloud for 100% consistency. Integration There were many sessions on 'integration', including demonstrations and explanations of: Oracle SOA Cloud - for full BPEL Composite Application development. Oracle Process Cloud - for BPM process development. Oracle Integration Cloud - for enabling and routing of point-to-point predefined integration using mostly declarative development. Oracle Managed File Transfer - for moving files between systems in a systematic and secure way. Oracle API Platform Cloud - for defining and securing your suite of APIs. Based on the Oracle API Catalog this new tool will be released soon. I noted the addition of orchestration features to Oracle Integration Cloud (photo below), allowing you to define a more detailed process by which the integration will work. Also a large amount of work has gone into Integration Analytics for almost all the tools mentioned above, where existing tools like Oracle Stream Explorer and Business Activity Monitoring have been re-engineered for the cloud into new and complementary functionality to help your understand and manage your integration in real-time. Also a new cloud service called 'Oracle Self-Service Automation Cloud' is being developed that allows low-code integration and simple business process automation based on consumer-type API's, such as those from Google, Facebook and Linkedin. This is based on defining a recipe that sets up a schedule/event-action-target sequence, with lots of pre-built plug-ins and configurations available. Looks interesting and support for Fusion Cloud Applications was mentioned. Another small feature I heard about was the Integration Cloud Service 'agent'. This utility package installs on an on-premise application such as E-Business Suite, and listens for events then connects the system to the Oracle Integration Cloud. The packaged agent runs on a fixed host and port and means that network administrators can enable the integration traffic without the potential risks of allowing broader external access to the on-premise system.  Business Influences and 'Cloud-Speed' Engagement During one integration session I heard a story from an Oracle partner where the solution chosen for a customer was influenced heavily by the expected throughput. This was not related to performance however, but from a financial perspective. They explained that with SOA Cloud Service the number of point-to-point connections was not a factor in the subscription pricing, whereas for a solution like Integration Cloud Service it is. It was interesting to hear some business operational influences on the solution design, verses just a technology perspective. In the same session it was noted that the typical RFP process for partner engagement with a customer takes more time than new feature development these days. As such Oracle Partners sometimes have to base their proposals on the Oracle road-map for a particular solution, allowing them to offer the best options for their project needs. The key phrase, which I liked, was that the RFP process needs bringing up to 'cloud speed'. Private Cloud I was interested to hear about the Oracle Cloud Machine and how it brings the standard Oracle Compute, Database, Java and Integration Cloud services on-premise. This also benefits from Oracle's own system management services too, providing the complete cloud experience whilst keeping your data and systems located in a physical location of your choosing. Interesting for public sector and other industries where overseas data storage is prohibited. Round-tables I ran two round-table sessions which looked at BI+Customizations and Effective Support, both of which where well attended and included some great conversation. The topics covered were of a broad range, but included data access options, cloud marketplace solutions, problem resolution methodology, personalizations. In discussing customizations one attendee recalled doing the 444th customization to a single E-Business Suite system and we obviously then discussed migration (and rationalization) options. Outsourcing Process Adherence I heard about Oracle Policy Automation (OPA), a mature toolset that allows you to define consistent and efficient business rules as natural language sentences, including local language support. These are then integrated with packaged applications like E-Business Suite, Peoplesoft, and Oracle Service Cloud and Sales Cloud. Stories of how a university admissions application processes went from five days to less than one, and how bank fraud checks improved by multiple factors really impressed me. The simplicity of the tool helped create very real improvements in Customer Experience (CX) - especially as guided interviews in Oracle Service Cloud (RightNow). Coding and Hands-on Did you know JavaScript is actually an Oracle trademark? I listened how this language has exploded past the 'students only' scene, and how supporting projects ECMA and TypeScript are related. I learned a little about the most popular JS frameworks, and especially Oracle JET (an overview coming from us shortly) as a framework-of-frameworks specifically designed for enterprise use. I learn how ABCS and Oracle Mobile Cloud solutions like MAX and RMAD use this JavaScript toolkit. Check out the related videos available at http://bit.ly/jetmooc. I attended the Oracle Cloud Labs, a hands-on space devoted to guided exercises on Oracle's latest PaaS services. I had a go at the Oracle Process Cloud tutorial and will publish my insights soon. In Conclusion Beyond this I met old colleagues, attended other sessions, and generally learned lots. I met lots of Oracle Partners, discussing how Oracle's Cloud solutions (and the Developer Relations team) can help them. Oh did I forget to mention that I picked up the Best Oracle Speaker award too! The Hour of Code In the same week as the UKOUG Conference, I again help my local school run an Hour of Code event. This is based on a global initiative from Code.org - a not-for-profit organization devoted to improving computer science education. One of 156,853 global sessions, with more than 300 million children taking part that week, I help run sessions for children across ages 6 to 11. It is always rewarding and the level of excitement and enthusiasm is something rarely seen in adult courses and tutorials. We used the themed exercises (above) to write block-based code solutions to progressive little challenges. The supporting JavaScript could be seen behind these blocks also. The children loved it and so did I. There were definitely quite a few pupils with signs of joining our industry in years to come. The exercises are always available so if you've got kids and they've not tried it, get them to give it a go.

Hosted at the international conference centre in Birmingham UK, this conference attracts not only UK users but those from across Europe, resulting in the largest Oracle conference outside the USA. The...

Application Composer

Populating Fixed and Dynamic Choice Lists Programmatically

This article explains how to get and set the values for your custom lists-of-values (otherwise known as choice lists) as added using Application Composer or Data Composer. Dynamic Choice Lists My object has a new custom field - Owner - defined as a Dynamic Choice List against the standard Resource object. The field API name is EvOwner_c and shows the values based on my selection in the 'List Selection Display Value' when creating the field (in this case Resource Name). As such the EvOwner_c field is used to get the current selected value (such as 'Richard'). However this field is not used when performing create, update and delete actions against this field. When you view all the fields available for the object you will find an additional complementary field, with the format [name]_Id_c. In my example it is EvOwner_Id_c. This stores the primary key value of the related object records. So for my object I can see the EvOwner_Id_c has a value of 300000002522027 - which is the key value for the current selected value ('Richard'). As such when you programmatically create or update records with dynamic choice lists you only need to populate the [name]_Id_c field. Once saved, you will find the sister [name]_c field automatically gets assigned the related correct value for display on the page. Fixed Choice Lists In a similar way, fixed choice lists display one value to users whereas programmatically you work with a different value. To perform create, update and delete operations on records with fixed choice lists then you work with the Lookup Code values and not the Meaning value which is shown to users. The UI components take care of presenting the user the meaning value at run-time, whereas it is only the lookup code that is stored in the database. Here is an example of a lookup definition, showing Meaning and Lookup Codes. For multi-select fixed choice lists the lookup code values are stored as comma separated values in the database column. The rendering process takes care of showing the related meaning values, semi-colon separated. For example here is a multi-select fixed choice list on a page: When you query this record using a RESTful web service you will see the JSON response has "MultipleStatus_c": "A,CH,C,M". As such all record creation (and updates) are done using comma separated lookup code values. Deriving Usable Values When creating new records or updating existing ones with lists of values (choice lists) you'll need to know what values to pass in. As we have seen both choice list types accept internal values (lookup codes and Id's) and not the values shown on the user interface. For RESTful web services you can query a record and find a links section at the bottom of the response records. This provides URL endpoints to access collections for each LOV that is used, both dynamic and fixed choice lists. For example the following provides access to the potential EvOwner_c records (Resource object records) which can be interrogated with another GET request.   }          "rel": "lov",          "href": "https:/[YourHost]/crmCommonApi/resources/11.1.11/rbEvent_c/300000007558150/lov/LOVVA_For_EvOwner_c",          "name": "LOVVA_For_EvOwner_c",          "kind": "collection"       } Additionally the following provides the endpoint for a GET request to get all the potential Fixed Choice List values available for the EventType_c field.             {          "rel": "lov",          "href": "https://[YourHost]/crmCommonApi/resources/11.1.11/rbEvent_c/300000007558150/lov/LOVVA_For_EventType_c",          "name": "LOVVA_For_EventType_c",          "kind": "collection"       } Note these collections are instance-specific, meaning that they are available from the context of a target record (i.e. have an Id in the endpoint URL). Enhancement request 26175708 is open to get a more generic endpoint to access this data. For other programmatic methods of record creation and update, other preparatory online interrogations, data extracts, and existing record queries can be used to derive the possible values.

This article explains how to get and set the values for your custom lists-of-values (otherwise known as choice lists) as added using Application Composer or Data Composer. Dynamic Choice Lists My object...

Web Services

Useful Parameters When Working With RESTful Service Records

Supplementing our existing article on querying records using RESTful services let's look how a few extra features can help in integration. These features apply to all services in Fusion Cloud Applications, including custom object services. Record Limit By default 25 records are returned in the REST response payloads. This may not be all values however, and is clear when you see the hasMore=true value shown at the top of the payload. You can actually change this by specifying the limit parameter in the request URL. This parameter accepts a number, up to 500 which is the internal upper limit set in the ADF runtime environment. For example, get up to 200 records: [URL]/crmCommonApi/resources/11.1.11/resources?limit=200 Starting Point Potentially useful in combination with the limit parameter above, the offset parameter can use used to return records from one particular starting point. It accepts a number from which to begin returning records. Note this is an index, so the first record is 0 (not 1). For example, return the second set of 50 records: [URL]/crmCommonApi/resources/11.1.11/resources?limit=100&offset=50 Return Only Specific Fields Rather than getting the whole response payload, it is possible to get just the data you need. By including the fields parameter in the URL you can ensure a small discrete response is returned. This equates to the <findAttributes> element used in the findCriteria part of a similar SOAP service request. For example, get the PartyId and PartyName of up to 50 resources: [URL]/crmCommonApi/resources/11.1.11/resources?limit=50&fields=PartyId,PartyName Query   As discussed in depth within this article, searchable attributes can be specified in the request URL with a filtering condition. For example, return the PartyName of the resource with a specified Id: [URL]/crmCommonApi/resources/11.1.11/resources?Fields=PartyName&q=PartyId=300000000691539   Result Count Used with query parameters, by specifying the totalResults parameter you add an extra value at the end of the response that has a count of matching records. This actually duplicates the same as the count value already shown at the start of every response. For example, show the number of resources with surname 'Bingham': [URL]/crmCommonApi/resources/11.1.11/resources?q=PersonLastName='Bingham'&totalResults=true Sorting It is possible to get your results sorted by one or more specified fields. The field name is appended with postfix :asc or :desc to specify the order. Multiple sort attributes are supported, used with comma separation. For example, get the results of a query descending by PartyNumber: [URL]/crmCommonApi/resources/11.1.11/resources?q=PersonLastName='Bingham'&orderBy=PartyNumber:desc

Supplementing our existing article on querying records using RESTful services let's look how a few extra features can help in integration. These features apply to all services in Fusion Cloud...

Application Composer

How To Filter Your Object Record Look-ups

Let's start with an example. We want to associate standard Customer Accounts with our custom Projects. We want the list of Accounts we pick when creating our Project to be reduced to only those already marked as "Project Enabled" - a custom checkbox field on the Account object. In this article we'll look at achieving this using different relationships. Multiple Records Associating multiple Accounts to one Project can be best achieved using a Many-to-Many Relationship. This is because if you use a choice-list it creates a one-to-many relationship, which might seem adequate however because each Account permits only one project (using the FK field on the Account) we cannot link one Account to more than one Project. The result is that as soon as we assign the Account to a second Project it is lost from the first Project! So first we explicitly create the many-to-many relationship. In our example we have the intersection object named 'Association'. Within the 'create relationship' page the Data Filter button allows us to specify a query condition. As you can see we have selected the Projects Enabled field from the Account (target) and set the condition so that it only includes records where this is checked (with a value of Y). Now we use this relationship, and the created intersection object, to build the user interface. Under the Pages tab of the Project object we edit the Details layout and add a subtab. We base this on a Related Object, and select the intersection object (named 'Association'). This automatically knows it is part of a many-to-many relationship and knows to allow display of the target object (Account) records. The resulting page has the new subtab showing the Accounts allocated to our project records through the intersection object. As you can see below when selecting records to add it is a short list, allowing us to only see those with the Projects Enabled checkbox checked. Single Records In the same way we can limit the object record values shown in lookup lists-of-values used to assign a single value from a related object. These are based on the one-to-many relationships that underpin Dynamic Choice Lists (DCL's) and the extact same Data Filter feature is available. The following shows a similar example, where a new DCL field provides a list of Account records, limited to those where the Project Enabled checkbox is checked. Note here the actual checkbox is shown, as opposed to specifying a 'Y' value.  Video Demonstration The following video provides additional examples of filtering using the Data Filter feature within both many-to-many and one-to-many relationships.    

Let's start with an example. We want to associate standard Customer Accounts with our custom Projects. We want the list of Accounts we pick when creating our Project to be reduced to only those...

Application Composer

Loading Custom Object Data using The File Based Loader

Introduction This blog article and accompanying video is a walk through detailing how to import data into Oracle Sales Cloud using the File Based Loader (FBL). The focus here is on importing data into Custom Objects and Standard objects with custom fields. The following video illustrates the process: Security Role Requirements To Import and Export data the following roles are necessary: Sales Administrator (ORA_ZBS_SALES_ADMINISTRATOR_JOB) Master Data Management Application Administrator (ORA_ZCH_MASTER_DATA_MANAGEMENT_APPLICATION_ADMINISTRATOR_JOB) To further understand how Job Roles and Duty roles are related have a look at this blog article written by the Oracle A-Team. CSV Template The columns in the CSV template are mapped when setting up an import task in the File Based Loader. Therefore the columns can be of any name as long as each column can be mapped to a field in the custom object. By definition these column names need to be unique. File Based Loader Size Limitations The File Based Loader has the following limitations: 100,000 record import limit per batch import. Maximum 5 concurrent import activities Maximum file size for an import file is 250mb Further Information Fusion Applications Roles Concepts blog article File Based Loader for Sales Cloud documentation Oracle Sales Cloud File Based Data Import and Export (Doc ID 1564536.1) support article File Based Loader for Fusion Product Hub blog article

Introduction This blog article and accompanying video is a walk through detailing how to import data into Oracle Sales Cloud using the File Based Loader (FBL). The focus here is on importing data into...

Application Composer

Using Approval Groups in Object Workflow

Introduction In this article we take a look at using Oracle Business Process Management (BPM) as part of the Object Workflow customization feature found inside Oracle Sales Cloud. There are already a number of overview articles, so let's see how to use Approval Groups with Serial and Parallel mechanisms. We'll also mention the option of using the Supervisor Hierarchy structure also. Create an Approval Group This is done in the BPM Worklist application, most easily accessed using the Setup and Maintenance screens found in the Navigator menu. From here, search for task ' Manage Approval Groups for Customer Relationship Management'. From the Worklist landing page, click Administration in the top right of the screen, which will take you to the URL [YourEnv]/integration//worklistapp/faces/administration.jspx. As shown below, from here there is an Approval Groups tab. Click the plus button to add a group. Always use the static option, as dynamic groups require additional code (the 'class' parameter) which is not supported at this time. Name your approval group CRMCommonApprovalGroup. This is essential as the seeded processes will look specifically for a group with this name. You may notice that you must find users by login username when adding members to your group. The ability to associate Job Roles with approvals is under review in Enhancement Request 25090414. Adding the Approval Process To use the new Approval Group you'll need to adjust the seeded business process which expects usernames passed through the 'approvers' input parameter. Exit your sandbox and select the Business Processes feature in Application Composer. Click new to add a process flow. As shown below, give it a name and select ExtnBusinessProcessComposite as the base template. Once opened, in the visual flow editor delete the existing approval (green) human task. Drag-and-drop a new Human Task into the same point as the one you just deleted. Right-click your new task node and select Implement.   Select the type as SerialApprovalGroupApproval from the popup, as shown below.  For using parallel approvals you would select ParallelApprovalGroupApproval and for supervisor hierarchy use SerialSupervisorHierarchyApproval. Note that the others mechanisms in this popup are not supported. Next you will right-click again and add the Data Association. This is wiring the input/output parameters between the process flow and the human workflow approval. Using the Expression Editor (below) complete the three inputs as taskTitle --> title, taskOwner --> taskOwner, and taskOwner --> errorAssignee. Also configure the output as outcome --> taskOutcome.   Save your new process.  Finally this is deployed into the server ready for use. Use the home menu to select the deploy project option.   Once successfully deployed, you are able to select your new modified Business Process flow when creating an Action inside the Object Workflow feature. Note that you should leave the approver input parameter blank, as it will always use your new group named CRMCommonApprovalGroup. Obviously if you are not using a Approver Group, then the default process flow will accept the 'approvers' from input parameter field. You may pass multiple usernames to the flow, all within single quotes and values comma separated. In the case of parallel approvals, replace the Human Workflow and implement the ParallelGivenUserNameApproval task. Approval Routing There are different rules used by each the different approval mechanisms. These are: In serial approvals the first member receives the notification. If they approves it, the next member in the group receives it. This continues until there are no more members and the approval is complete. If any member rejects it, then the whole flow stops and the status is rejected. Parallel approvals are controlled by the votingPercentage parameter. This controls how many group members need to approve for the process to complete. For example 50% means if half the group approve then the flow is completed and the status is approved. Supervisor Hierarchy mechanism uses the existing manager structure to route the approval. It accepts a starting approver, and the number of levels up the management chain it should flow. Once all levels are actioned then the flow is complete. Approval Status Values Once the flow returns the completion status back to the object workflow, the value is put in a custom field on the object. This is configured in the input parameter heldEntityStatusField. It is important to define the related custom field carefully - specifically setting the Updatable constraint to 'false' using an expression. This allows it to be read-only for end users, but manipulated by your approval process. If not users can overwrite the status, or the field will never change. You can define a default value (so it's not null) as this will be replaced with the outcome. Additionally you can set your own text values for use by the Object Workflow. These are defined in the lookup type ZCX_HOLD_STATUS. The default values are: APPROVALPENDING, APPROVED, and REJECTED and you can edit the meaning texts as you see fit. Additional Resources Our related articles on BPM and Approvals. The Object Workflow section of the Customizing Sales Cloud documentation.  

Introduction In this article we take a look at using Oracle Business Process Management (BPM) as part of the Object Workflow customization feature found inside Oracle Sales Cloud. There are already a...

October in review

Here is a review of content published in October that you may find useful. Our Content This month we released the following articles: Direct Links in Fusion Applications an article on how to link to pages within Fusion Applications. Controlling How Users Search For Custom Object Records shows how to display view object data in Fusion Applications. Groovy Tuesday: Performing Validation When Creating Records an explanation on how Groovy script validation works in Application Composer. Caching REST Service Data in Oracle Sales Cloud explains how the ETag parameter helps optimize the use of Fusion Applications REST services. Other Content The A-Team also released the following articles this month that may be of interest as well: Extracting Data from Oracle Business Intelligence 12c Using the BI Publisher REST API details how to generate reports from data held within Oracle Business Intelligence. Oracle ATG Commerce IaaS/Cloud provisioning shows how to setup ATG, a highly customizable, configurable framework for building and supporting Web sites, particularly those used for e-commerce. ODI on Compute Cloud Service: Step by Step Installation shows how to upload data into the Oracle Compute Cloud Service. Using Process Cloud Service REST API Part 1 is useful for integration with the Oracle Process Cloud Service. Cloud Security: Seamless Federated SSO for PaaS and Fusion-based SaaS for anyone who wants to integrate Single Sign On across applications. A First Look at the New Web Form in PCS a brand new home-grown web form in replacement of the Frevo based web form. Installing Data Sync in Compute for Cloud to Cloud Loading into BICS The Data Sync tool provides the ability to extract from both on-premise and cloud data sources. Publishing update events from SCM cloud R11 using BI publisher reports and scheduled job on Oracle cloud illustrates how to integrate SCM cloud, BI Publisher reports and Oracle Cloud. Edward Dewolf released a two part series on Groovy. The first called Groovy Introduction and the second called Groovy One-liners . He also released an article on Learning how to copy paste from BI reports.

Here is a review of content published in October that you may find useful. Our Content This month we released the following articles: Direct Links in Fusion Applications an article on how to link to...

Security

The Job Roles and Privileges Controlling Customization Features

In the Security Console you can access the 'Simulate Navigator' feature which exposes the particular privileges that control the menu items. At the same place you can see which reference roles include those privileges, so roles can be copied-and-edited to closer meet your own needs. In the Security Console, search for any role. Then using the contextual menu, select the Simulate Navigator as shown below. The Simulate Navigator screen is a mock-like navigator menu that shows all the possible items (based on your implementation) and if the selected role provides access. A lock indicates this role cannot access the feature, no lock means it can. If you see a yellow alert icon it indicates that an EL expression set in the Structure feature also has some bearing to access also. Each of the items in the navigator-like screen can be clicked and the resulting pop-up menu allows you to see the Roles or the Privileges which control it. This is shown here. You can also find a full video demonstration of this feature here. The data displayed will help you fine-tune your own job roles as required. Administration and Customization Related Features The following reference table shows how features we commonly discuss are secured using the base reference implementation. Use this to tailor your own role implementation so the right people can access the right tools.    Feature Controlling Privilege Related Reference Job Roles Appearance View Administration Link, Manage Themes [Product] Application Administrator, Application Developer, Application Implementation Administrator, Application Implementation Consultant, Application Administrator Announcements Customize Help Topics [Product] Application Administrator, Application Developer, Application Implementation Administrator, Application Implementation Consultant, Application Administrator Structure Manage Navigator Menu Structure, View Administration Link [Product] Application Administrator, Application Developer, Application Implementation Administrator, Application Implementation Consultant, Application Administrator Application Composer Manage Extensible Object Product Data Steward, Master Data Management Application Administrator, Contract Setup, Contract Setup Custom, Customer Relationship Management Application Administrator Page Integration Manage Horizontal Extensions Application Administrator Projects Custom Objects Manage Project Management Custom Objects None Innovation Management Custom Objects Setup Product Innovation None Migration Manage Incoming Customization Set, Manage Outgoing Customization Set Application Developer, Application Administrator Developer Connect Manage Web Service Information Customer Relationship Management Application Administrator, Integration Specialist, Application Developer Security Console View Role, Edit Role, Create Role Security Management, Security Reporting File Import and Export Manage File Import and Export Various 'manager, 'specialist', and 'administrator' roles (including Application Administrator) Audit Reports View Sales Audit History, View Audit History [Product] Application Administrator, Internal Auditor Setup and Maintenance Setup and Maintain Applications Authenticated users Mobile Application Designer Access BI Mobile Application Designer None   The details above may change between releases, however these are accurate at the current time applying to Release 11 and 12.

In the Security Console you can access the 'Simulate Navigator' feature which exposes the particular privileges that control the menu items. At the same place you can see which reference roles include...

Direct Links in Fusion Applications

Introduction This blog article illustrates how to create direct links (aka deeplinks) to various pages of Oracle Fusion Applications. If you would like to do this in Oracle Sales Cloud please take a look at this blog article as the process is slightly different. Below are examples of direct links from Oracle HCM and from Oracle Financials to illustrate the commonality between the way the function works in Fusion Applications. Direct Linking in HCM When navigating to the Person Management screen the link looks like this:: https://<HOST_NAME>/hcmCore/faces/FndOverview?fnd=%3B%3B%3B%3Bfalse%3B256%3B%3B%3B &fndGlobalItemNodeId=itemNode_workforce_management__person_management &_adf.no-new-window-redirect=true &_adf.ctrl-state=1b532wjs56_5 &_afrLoop=6435279788503 &_afrWindowMode=2 &_afrWindowId=xkhwjhcv9# The URL has been formatted for easy reading. Apart from the base URL the only parameter that is important is fndGlobalItemNodeId this is id of the required page. In this case the id is itemNode_workforce_management_person_management is the id of the Person Management page. All the other parameters in the link are session data and will be automatically generated once the user has authenticated. A bookmarkable URL to Person Management would look like this: https://<HOST_NAME>/hcmCore/faces/FndOverview? fndGlobalItemNodeId=itemNode_workforce_management_person_management When a user navigates to the bookmarkable URL an authentication check will be performed and the user redirected to an authentication screen if they are not already logged in. Direct Linking in Financials The following example is from Oracle Financials and will show how the principle is the same across Fusion Applications. The following is the link to the General Accounting Dashboard: https://<HOST_NAME>/ledger/faces/FndOverview? fnd=%3B%3B%3B%3Bfalse%3B256%3B%3B%3B &fndGlobalItemNodeId=itemNode_general_accounting_general_accounting &_afrLoop=74469752345823 &_afrWindowMode=0 &_afrWindowId=aut6jcgb0 &_adf.ctrl-state=16zuoct0f5_1 The bookmarkable link without any session data would be like: https://<HOST_NAME>/ledger/faces/FndOverview? fndGlobalItemNodeId=itemNode_general_accounting_general_accounting As you can see the same principle applies. Further IDs can be found by using the user interface and navigating to relevant pages. Further Information Direct page link Fusion help documentation Blog article on Direct links and Deeplinking in Oracle Sales Cloud

Introduction This blog article illustrates how to create direct links (aka deeplinks) to various pages of Oracle Fusion Applications. If you would like to do this in Oracle Sales Cloud please take a...

September in Review

Here is a review of content published in September that you may find useful. Our Content This month we released the following articles: Querying Data Using The Simplified View Criteria: Tips and Tricks - querying view objects using Groovy. Limitations in View Object Filtering in Groovy Script - an article that follows on from the above article and illustrates how to use view object filtering efficiently. Rounding Numbers and Decimal Places in Numerical Fields - an article that illustrates how to round numbers in Groovy based on precision settings on numerical fields. Securing Objects in Application Composer - explains how to secure Custom Objects so the correct people get access. Validation of Groovy in Application Composer - explains what happens when Groovy script is saved and/or validated in Application Composer. OpenWorld 2016 Oracle OpenWorld took place in September. Here are some highlights that you might find useful. The Rapid Development Kit for mobile and JET were demonstrated in breakout sessions by the Applications User Experience team, as detailed here. There were a number of sessions on Fusion Applications Sales Cloud. This blog article was written just before OpenWorld but explains the Sales Cloud sessions that took place. Another OpenWorld topic that might be of interest is the Integration Cloud Service with a nice summary provided by an Oracle partner here. Last month we also published our our recommended sessions. Other Content The A-Team also released the following articles this month that may be of interest as well: Integration Design Pattern – Synchronous Facade for Asynchronous Interaction - to understand the difference between Asynchronous and Synchronous interaction which is particularly useful when trying to implement web services. A pattern for managing segments across Oracle apps - this article is about the segmentation of data between different applications and how that relates to Fusion Applications. The A-Team also released the following content about another PaaS service, the Oracle BI Cloud Service. Loading Oracle Service Cloud (RightNow) Data into BICS with Data Sync Loading SalesForce Data into BICS with Data Sync Loading Data from Generic JDBC Sources into BICS Uploading CSV files to BICS Visual Analyzer and Data Visualization Cloud Service Edward Dewolf released an article on credible BI Report generation which is useful to ensure quality reports and analyses.

Here is a review of content published in September that you may find useful. Our Content This month we released the following articles: Querying Data Using The Simplified View Criteria: Tips and Tricks -...

Application Composer

Controlling How Users Search For Custom Object Records

We recently put together a simple demo application for training purposes and this included the requirement to assign custom object records to a standard object. In our scenario the end user needed to use a specific search criteria to find the right custom object records. This requirement is supported through a link at the bottom of the "Custom Object: Pages" feature, under the title of Reusable Regions. Example Illustration Let's use an example to show how this works. Our fictitious business has decided they want to track all Customer Events. This has been very simply implemented in Sales Cloud as a new (top level) Custom Object 'Events'. We want our Events to be sharable between accounts, hence we did not use a child object. Our functional design dictates that events should be associated with each specific customer Account as required, normally when the invite has gone out. As such we have customized the Accounts pages, adding a new subtab based on the Event as a related object. This allows us to associated Events with Accounts. Our design also says that our user wants to search Events only by the name (the RecordName field) or the person who runs it (the CreatedBy field). There are other fields on the Event - such as Start Date and Long Description - but from usability A/B testing putting these in the search led to poor performance. To achieve our very specific search configuration we need to edit the Event custom object in Application Composer. On the Pages node there is a Reusable Regions section, under which there is 'Edit Search and Select Dialog'. On opening this we get the following page, allowing us to shuttle the fields we want to use whenever there is a need to search for an Event record. This is saved and when we go to our Accounts and add an Event using the subtab we get the associated dialog. As you can see this matches our requirement perfectly. The end result is a quick way to pick the Events to associate with our Account, as shown here. 

We recently put together a simple demo application for training purposes and this included the requirement to assign custom object records to a standard object. In our scenario the end user needed to...

Groovy

Groovy Tuesday: Performing Validation When Creating Records

Checking The Record State When running validation that applies only to new records, consider using the function getPrimaryRowState().isNew().This returns a Boolean value, using 'true' for new records and otherwise 'false'. For example, imagine you want to ensure the myCreateDate_c Date field is never in the past for new records, you could use the following. If you do not add the getPrimaryRowState call then all existing records created in the past will fire this validation, causing a big problem. !(getPrimaryRowState().isNew() && myCreateDate_c < today()) All validation rule expressions represents the normal operating state and if this state fails to meet the rule provided (i.e. returns false) the associated error will be shown. As such for the above expression we have wrapped the whole line in !(...) to reverse the logic. This is because there is no function that opposes isNew() as reviewed in this article covering record state. Using Formulas Formula fields execute every time the data is shown on the page, and whenever that data is adjusted. As such none of the fields used in the formula should have no value entered (i.e. null). Obviously this situation is pretty common on the record creation page. To solve this you have two choices: Wrap every data reference with the nvl() function, and supply an appropriate default value. Do not show any formula fields on the create record page which assume data entry. For example: We have a forumla field Age_c which subtracts today() from the myCreateDate_c field. The StartDate_c value is null initially on the create record page - assuming you do not give it a default value or expression. As such the Age_c formula should use nvl(myCreateDate_c,today()) to avoid a NullPointerException.  Alternatively you can simple remove Age_c from the create page laout, and it will not execute the formula. In this case, the formula has little value on the create page (since all records are 0 days old), and therefore this is the simplest solution.

Checking The Record State When running validation that applies only to new records, consider using the function getPrimaryRowState().isNew().This returns a Boolean value, using 'true' for new records...

Web Services

Caching REST Service Data in Oracle Sales Cloud

Introduction This blog article is about how the ETag value can be used in conjunction with the If-None-Match HTTP header parameter to cache web content between a client application and Fusion Applications RESTful web services. When developing integration code between a client application and the Fusion Applications RESTful interface it's important to keep the data on the client updated as much as possible without unnecessarily using network bandwidth resources Fusion Applications REST services can be utilized by different types of devices including mobile where data , battery and CPU usage are at a premium and efficient use of all three is important. The ETag value and If-None-Match HTTP header parameter provide a mechanism by which only new or updated content is downloaded to the client application. ETag HTTP Header The Entity Tag, also known as the ETag, is a unique id that represents a version of a resource. When a client application makes a request for a resource the first time the ETag is sent in the header as a response. To keep the client application updated with the latest data, the client application would need to periodically resubmit a HTTP request for each of the resources, that without caching, would then re-download the latest version of each resource whether it's different or not. Clearly an inefficient waste of resources on both the client and server applications. However, by using the same polling mechanism and by sending the ETag in the header, only content that has changed will be returned in the response. If the content has not changed then a HTTP status code of 304 Not Modified will be returned instead. The ETag is the id that is used by the web application to verify what version of the resource is held by the client and whether it is old or not. In a custom object in Oracle Sales Cloud it is generated from the Last Modified date. When a custom object data record is updated, the last modified date will also be updated which would mean a new ETag for that row of data. If the custom object is updated using REST then the ETag would also be returned in the body of the response after the update to the custom object has been submitted. If-None-Match HTTP Header The If-None-Match header field is described in rfc7234 as: A request containing an If-None-Match header field (Section 3.2 of [RFC7232]) indicates that the client wants to validate one or more of its own stored responses in comparison to whichever stored response is selected by the cache. If the field-value is "*", or if the field-value is a list of entity-tags and at least one of them matches the entity-tag of the selected stored response, a cache recipient SHOULD generate a 304 (Not Modified) response (using the metadata of the selected stored response) instead of sending that stored response. In other words the If-None-Match parameter makes the HTTP response conditional based on it's value which in this case is the unique ETag. It's requesting that the application only return the http body content if the content has changed. Otherwise send back a HTTP status 304. Not Modified response. Oracle Sales Cloud example The following example shows how the ETag has been implemented in Fusion Applications. Here are the HTTP headers for a GET request for a custom object in Sales Cloud. GET /crmCommonApi/resources/latest/contacts/35063 HTTP/1.1 Host: crm-<FA_ENVIRONMENT>.oracleoutsourcing.com Content-Type: application/vnd.oracle.adf.action+json Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsIng1dC I6ImctdnBaYjZTb2lKS1lubER1NUd2SEYwYWFTayJ9.eyJleHAiOjE0NzU2OTE wMzgsImlzcyI6Ind3dy5vcmFjbGUuY29tIiwicHJuIjoicGV0ZXIubWFub2hhc mFuQG9yYWNsZS5jb20iLCJpYXQiOjE0NzU2NzY2Mzh9.BY4LBdAdz7rD5b0RBk 3ZB5E4Vd_LP2p9iFBlHJlz8ehE5f6TdWvRxvPWKPX4oFpD56yCa4s-KqYXjCKM 2N6Utb9shq9TUdrYqfawl_WUjBmATf93Sq72O31aMRf70NOT9-w-JkSGbILdJ6 CSCIRGbwI6GFhTAu3Irg2u5ba3rYo The above headers show how we retrieve a contact object with id - 35063. It's a GET request and therefore has no body in the request. The response headers are below with the ETag in bold: Cache-Control →no-cache, no-store, must-revalidate Connection →keep-alive Content-Encoding →gzip Content-Language →en Content-Length →1715 Content-Type →application/json Date →Tue, 04 Oct 2016 13:07:31 GMT ETag →"ACED0005737200136A6176612E7574696C2E41727261794C697374788 1D21D99C7619D03000149000473697A6578700000000877040000000A73720011 6A6176612E6C616E672E496E746567657212E2A0A4F7818738020001490005766 16C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02 00007870000000077371007E0002000000057371007E0002000000027372001B6 F7261636C652E6A626F2E646F6D61696E2E4E756C6C56616C75655899C1C58DAA BEEB02000149000A6D53514C54797065496478700000000C71007E000871007E0 0087371007E00020000000171007E000878" Link →;rel="self";kind="item";name="contacts" Location → Server →Oracle-Application-Server-11g Vary →Accept-Encoding X-ORACLE-DMS-ECID →005FWayCfGh3r273VJnJB80001VE000Sx1 As you can see from the header the ETag is returned in the response. The HTTP status code is 200. To check if the content has been changed by another user before downloading it again, the ETag is placed in the request header in the If-None-Match parameter. Here are the headers that would be used when checking for a new version of the contact: GET /crmCommonApi/resources/latest/contacts/35063 HTTP/1.1 Host: crm-<FA_ENVIRONMENT>.oracleoutsourcing.com Content-Type: application/vnd.oracle.adf.action+json Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsIng1dC I6ImctdnBaYjZTb2lKS1lubER1NUd2SEYwYWFTayJ9.eyJleHAiOjE0NzU2OTE wMzgsImlzcyI6Ind3dy5vcmFjbGUuY29tIiwicHJuIjoicGV0ZXIubWFub2hhc mFuQG9yYWNsZS5jb20iLCJpYXQiOjE0NzU2NzY2Mzh9.BY4LBdAdz7rD5b0RBk 3ZB5E4Vd_LP2p9iFBlHJlz8ehE5f6TdWvRxvPWKPX4oFpD56yCa4s-KqYXjCKM 2N6Utb9shq9TUdrYqfawl_WUjBmATf93Sq72O31aMRf70NOT9-w-JkSGbILdJ6 CSCIRGbwI6GFhTAu3Irg2u5ba3rYo If-None-Match: "ACED0005737200136A6176612E7574696C2E41727261794C 6973747881D21D99C7619D03000149000473697A6578700000000877040000 000A737200116A6176612E6C616E672E496E746567657212E2A0A4F7818738 02000149000576616C7565787200106A6176612E6C616E672E4E756D626572 86AC951D0B94E08B0200007870000000077371007E0002000000057371007E 0002000000027372001B6F7261636C652E6A626F2E646F6D61696E2E4E756C 6C56616C75655899C1C58DAABEEB02000149000A6D53514C54797065496478 700000000C71007E000871007E00087371007E00020000000171007E000878" Cache-Control: no-cache The HTTP response code to the above request is HTTP status 304 Not Modified as the ETag has been validated by Oracle Sales Cloud to be the same as the latest version. Since only headers are sent back and forth in this request the CPU, data and power use are more efficient compared with unnecessarily downloading the unchanged resource again. The functionality described in this article should be useful to anyone integrating between a client application and Oracle Fusion Applications to optimize performance of both the client application and Oracle Fusion Applications pod by reducing the overhead of unnecessary requests for data from Oracle Fusion Applications. Further Information ETag information RFC7234 HTTP 1.1 Caching - proposed standard for HTTP caching Oracle Sales Cloud REST service header documentation

Introduction This blog article is about how the ETag value can be used in conjunction with the If-None-Match HTTP header parameter to cache web content between a client application and Fusion...

Groovy

Limitations in View Object Filtering in Groovy Script

Introduction This blog post considers different aspects of filtering View Object data in Groovy script. It follows on from this blog article which is about querying records in View Objects. View Criteria filter expressions are a convenient way to filter data result sets in view objects. There are some considerations, that are useful to note when executing them from within Groovy. The following sections detail these considerations in an attempt to explain how to best use view criterias when querying view objects using Groovy.. View Criteria Usage Overview The following is an example of view criteria usage from the Oracle Sales Cloud documentation. It illustrates how to query records from a view object and is here to refresh your memory on how to use view criterias in the first place: /* * Query all 'Working'-status trouble tickets assigned to a staff member with id 100000000089003 */ // 1. Use the newView() function to get a view object def vo = newView('TroubleTicket_c') // 2. Append a view criteria using a filter expression vo.appendViewCriteria("AssignedTo_Id_c = 100000000089003 and Status_c = 'Working'") // 3. Execute the query vo.executeQuery() // 4. Process the results if (vo.hasNext()) { def row = vo.next() // Do something here with the current result row } Here are some considerations when using view criterias. Field Names and Operators When creating a groovy expression to build a bind value for use in the view criteria, only a field name is allowed on the left side of an operator. In the above example 100000000089003 = AssignedTo_Id_c would not be allowed in the expression but AssignedTo_Id_c = 100000000089003 would be, even though they are both the same. Calculated Expressions and Operand Values When using a View Criteria, any expression functions have to be evaluated and stored within variables before the variables can be referenced from within the View Criteria expression values. For example the View Criteria expression ResolutionPromisedDate_c <= today() + 3 will not work within a view criteria expression because the date is being calculated from within the expression. Instead the value for today has to be evaluated first def thisDay = today() and then it can be referenced in the view criteria bind value expression ResolutionPromisedDate_c <= thisDay+3. Field Names and Operand Values When querying records it's not possible to filter only the rows where two columns have the same value. For example an expression like HomePhoneNumber_c = WorkPhoneNumber_c is not allowed because it uses a field name on the right hand side of the operator. A clause such as this will be ignored at runtime, resulting in no effective filtering. Further filtering would have to be performed within Groovy after the view criteria has been applied. For example when looping over the results for display the variables can be compared and the row displayed on the condition that HomePhoneNumber_c = WorkPhoneNumber_c. Related Object Fields and Filter Expressions It is not possible to reference fields of related objects directly in the filter query expression. For example the following view criteria filter expression would not work: def vo = newView('<OBJECT_API_NAME>'); vo.executeQuery(); def row = vo.getCurrentRow(); def vo2 = newView('<OBJECT2_API_NAME>'); vo2.appendViewCriteria("Status_c = row.getAttribute('<FIELD_NAME>')"); The <FIELD_NAME> field would have to be evaluated prior to appending the view criteria and use the already-computed value as a literal operand value. The following would work: def vo = newView('<OBJECT_API_NAME>'); vo.executeQuery(); def row = vo.getCurrentRow(); def att = row.getAttribute('<FIELD_NAME>'); def vo2 = newView('<OBJECT2_API_NAME>'); vo2.appendViewCriteria("Status_c = att"); Variable Types When creating a view criteria expression, only the following data types can be used within the expression: Text, Number, Date, and Datetime. An attempt to use other data types as the value of a bind variable may result in errors or in the criteria's being ignored. Further Information Here are some links to related information to help understand this functionality further: Our blog article on Simplified ViewCriteria Expressions Our blog on Simplified View Criteria Documentation on View Criteria Expressions Programmatically Accessing View Objects using Groovy blog article

Introduction This blog post considers different aspects of filtering View Object data in Groovy script. It follows on from this blog article which is about querying records in View Objects. View...

Groovy

Querying Data Using The Simplified View Criteria: Tips and Tricks

As we looked at in our original article, the new mechanism for querying data in groovy helps all developers build efficient customization scripts with reduced complexity. Illustrative Example In this illustrative article we've added a custom Formula field to the Opportunities object which queries and totals the Sales Lead records. Our queries include a value from the opportunity shown on the screen, such as the selected Account (shown below) or the Owner. Wildcards The result above is obtained using the following script, illustrating how you can use the LIKE operator and a % wildcard in your query.   def ActID = TargetPartyName def vo = newView('Lead') def searchExpression = "CustomerPartyName like '" + ActID +"%'" vo.appendViewCriteria( searchExpression ) vo.executeQuery() def rslt = vo.getEstimatedRowCount() return rslt AND and OR In the following example, we edited only the searchExpression value adding an OR operator as well. The AND operator can be used in the same way. def searchExpression = "CustomerPartyName like '" + ActID +"%' OR CustomerPartyName is null" The result shows more Lead records since it includes any without a customer. String Substitution When building complex queries you may have multiple variables involved, and you can very cleanly use substitution in your query string, reducing the append syntax which clutters the UI and can lead to mistakes. For example, in our query above, we could search Leads based on the Owner ID and reference the ActID variable which stores this. def ActID = OwnerResourcePartyId  //get ownerID from the opportunity def searchExpression = "OwnerId = ${ActID}" The result returns a count of 16 leads for Richard Bingham.    Multi-line & Escape Character By using the triple quote delimiter (three double-quotes """) you can include carriage returns in your scripts. This also allows you to use single and double quotes inside your string variable also. The following example shows this: def searchExpression = """OwnerId = ${ActID} and Name like 'My "Special" Lead' """   The result shows the single lead with the "Special" text in the name.   Nested Sub-queries At this time it is not possible to use nested sub-queries against related child objects, such as using a View Criteria query to check if Sales Lead Products lines exist on a parent Sales Lead. Video Demonstration The following video from our YouTube channel shows lots of examples, as described above. Further Reading The Groovy Scripting Guide outlines the simplified view criteria options here.

As we looked at in our original article, the new mechanism for querying data in groovy helps all developers build efficient customization scripts with reduced complexity. Illustrative Example In this...

Groovy

Rounding Numbers and Decimal Places in Numerical Fields

Introduction This blog article is about the use of decimal places also known as Arithmetic Precision, in Oracle Application Composer. Decimal Places in Numerical Fields Arithmetic precision in Oracle Fusion Applications relates to the number of decimal places displayed and stored in numeric fields. For example, distance measured in kilometers can be displayed and stored with three decimal places to show distance to the nearest metre: 300.124km is 300,124 metres. When a new record is created, values with a greater number of decimal places that are entered are rounded off to the allowed number of decimal places predefined in the field at the time the record is saved. For example if a new distance of 478,525.124245 is input into the distance field described above, the value stored would be 478,525.124 as the input value would be rounded down. Here is a screen shot of the Edit screen of a field called Distance highlighting where the number of decimal places is configured. If a third of the distance needed to be automatically calculated and displayed, the value 478,525.124 would have to be divided by 3 and then could be displayed in a Text Field using Groovy script. The result below shows both the un-rounded and rounded result of dividing the above by 3. 1/3 of the distance = 159508.3746666667 1/3 of the distance (rounded) = 159508.375 Groovy Script Function Here is the code that displays the above: // Retrieve the maximum number of decimal places for the Distance_c field def curObj = newView('myObject_c'); def attr = curObj.findAttributeDef("Distance_c"); def maxDecimalPlaces = attr.getScale(); // Divide the Distance value by three java.math.BigDecimal oldNum = Distance_c; def newDistance = Distance_c / 3; // Create a MathContext Object for rounding off values java.math.MathContext mc = new java.math.MathContext( newDistance.precision() - newDistance.scale() + maxDecimalPlaces, java.math.RoundingMode.HALF_DOWN); // Round off the new distance value def output = newDistance.round(mc); // Display new values rounded and not rounded def displayOutput = "1/3 of the distance = "+newDistance+ "\n" + "1/3 of the distance (rounded) = " + output; return displayOutput; To retrieve the number of decimal places from the Distance field we have to retrieve the AttributeDef object by creating a handle to the ViewObject using the newView Groovy function. The AttributeDef.getScale() method retrieves the value. The Distance_c value is divided by three and assigned to a variable using the def keyword. Groovy automatically creates a BigDecimal value which is why we didn't have to explicitly specify that. All numerical fields are BigDecimal values. The MathContext class is the engine that performs the rounding in this example. The constructor that we used above to instantiate the MathContext is MathContext(int setPrecision, RoundingMode setRoundingMode). The two parameters here define how rounding will be executed. The first parameter setPrecision is the number of digits to round to. The second parameter setRoundingMode determines what rules to follow when rounding. RoundingMode.HALF_DOWN rounds towards the "nearest neighbor" unless both neighbors are equidistant, in which case the value is round down. The RoundingMode javadoc contains more information on the different rounding modes. The way that setPrecision parameter newDistance.precision() - newDistance.scale() + maxDecimalPlaces is understood by looking at all three parameters and their place. The value newDistance.precision() is the BigDecimal.precision() function which returns the number of digits in the un-scaled value which is the total number of digits in the newDistance value. In the example above this is 16. The value newDistance.scale() is the BigDecimal.scale() function which returns the number of digits to the right of the decimal point, which in the example above is 10. By subtracting the scale() value from the precision() value we are able to retrieve the number of digits to the left of the decimal point which in this example is 6. Adding the maxDecimalPlaces value of 3 makes a total of 9 which is the total number of digits that the newDistance needs to be rounded to - 159508.375. Once the MathContext object is instantiated then the rounding operation is performed by executing the - newDistance.round() function. The code in the example after this point is for displaying the output. Incidentally when using the "\n" within the middle of a String in groovy will display in following line if the String is displayed in a multiline text box. Another point to note is that all the methods in the java.math.BigDecimal and java.math.MathContext classes are available for use in Oracle Sales Cloud.   Precision in Currency Fields A note about the behavior of rounding and decimal places in currency fields is that it is different to normal numerical fields because it is dependent on the currency type not simply on the fact that it's a currency field. For example the number of maximum decimal places used in USD is 2 as opposed to the number of decimal places used in JPY is 0. This is because there is no smaller unit of currency than ¥1 unlike in USD. When entering a currency value into a currency field this will always result in the rounded value being stored based on the currency. However to retrieve the precision values in Groovy is not possible at present. Further information Currency documentation Currency codes - ISO 4217 Precision in the Currency Field in Oracle Sales Cloud MathContext javadoc BigDecimal javadoc RoundingMode javadoc

Introduction This blog article is about the use of decimal places also known as Arithmetic Precision, in Oracle Application Composer. Decimal Places in Numerical Fields Arithmetic precision in Oracle...

Groovy

Validation of Groovy in Application Composer

Introduction This blog article outlines the process that occurs when user entered Groovy script is validated, which occurs at the time the Validate button is pressed or the Save and Close button is pressed the Application Composer Groovy edit window. Background When a user creates or edits a Groovy script in application composer, the script needs to be validated before it can be saved. Validation consists of three different areas: Syntax checking Type checking Security checking Syntax Checking Syntax checking involves validating the names of Groovy keywords, checking code layout structure and validating opening and closing parentheses are matched correctly. This is achieved by pre-compiling the Groovy script in Java. The failures caught by the compiler are then presented in the Application Composer user interface. When a brace is not terminated correctly the offending line reported by the compiler/validator could be after the last line of code in Application Composer. The actual error is further up the page. Here is an example: In the above example the if clause defined in line 3 is not terminated with a closing brace. The error message complains that a closing brace is expected in line 12 which doesn't exist. Type Checking Groovy has an underlying Type checking feature that informs the compiler of variables and methods created in Groovy script. When the validation process is executed, the compiler is able to validate these variables and methods as well. This validation feature is available in Release 11 in Fusion Applications and maybe new to some, as it was not available previously. More infomation on the underlying Groovy Type checking feature can be found here. If a variable defined in Groovy script doesn't exist then an error is thrown during the validation process, an example of which is below:     In the example above, the error is because the type checking element of validation indicates that there is no such variable called nom. The The warning is because the validation could not find the constructor for the java.util.HashMap class that is referenced in the Groovy script. Because the compiler is aware of the variable declared in Groovy script it is also able to determine if the variable has been used correctly. Here is an example: In the example above the Type checking feature of Groovy validation fails because the date field num1 cannot be added to the String variable str as they are incompatible types. This blog article describes this point in more depth. Security Checking Security checks during validation only allow classes and methods that are explicitly enabled for execution in Oracle Sales Cloud to execute at run time. A whitelist of available methods and variables are available in the Oracle Sales Cloud Documentation. Furthermore this blog article is an overview of whitelist functionality in Oracle Fusion Applications. All Groovy script written in Application Composer is considered un-trusted. This means the following: All underlying Java methods that Groovy functions can call have to be listed as runnable by un-trusted scripts. A check is made against any called method that it exists in the list. View Objects that can be accessed from a Groovy script have to be explicitly configured for programmatic access in the application. A check is made that only those that have been explicitly allowed for programmatic access are available for access in Application Composer. Not all the methods in oracle.jbo.ViewObject, for example, are available for execution from within a Groovy script in Application Composer. The getQuery() method is one such example. Left only to the compiler this method would pass validation as it's a valid method. However the security check prevents this method from being executed. Here is the resulting error message: oracle.jbo.ExprSecurityException The method getQuery on class example.jedi.fwkext.TestModelViewObjectImpl is not permitted. The CurrencyVO is an example of a View Object that is not programmatically available in Application Composer. When it is referenced the Application Composer has no knowledge of it and validation fails. Here is what happens: Further Information Understanding Whitelist Functionality in Oracle Fusion Applications Oracle Sales Cloud Allowed Classes and Funtions in Groovy Groovy Tuesday: Understanding Validation Warnings Groovy Semantics documentation

Introduction This blog article outlines the process that occurs when user entered Groovy script is validated, which occurs at the time the Validate button is pressed or the Save and Close button is...

August in Review

Here is a review of content published in August that you may find useful. Our Content Our Groovy Tuesday series continued with the following articles: Groovy Tuesday: Finding Foreign Keys and Collections for Related Objects - an article that shows how to access foreign key fields to access data from a parent object. Groovy Tuesday: Working With Checkbox Fields - how to programmatically utilise checkboxes in Groovy. Groovy Tuesday: Enforcing Child Record Rows Are Always Created - This article illustrates how to maintain data integrity on child objects when creating new data in parent objects. We also released the following on: The Oracle API Catalog for RESTful Services - an introduction to the new Oracle API catalog with particular attention to RESTful web services. Using Child Objects in Application Composer - an overview of the relationship between parent and child objects in Oracle Sales Cloud and how to use them. Oracle OpenWorld 2016 is happening this month in San Francisco. Here are Our Recommendations of interesting sessions that you may want to attend. Other Content The A-Team also released the following articles this month that may be of interest as well: Cloud Security: Using Fusion Application Web Services with Message Protection an article that illustrates how to securely use Oracle Fusion Applications web services. Configuring HTTPS between Integration Cloud Service and Java Cloud Service - an article that shows how to communicate from the Integration Cloud Service to the Java Cloud Service using https to secure communication. Using SSH for Data Sync Loads to BI Cloud Service (BICS) - an article that illustrates how to load data into the BI Cloud service from an on premise environment using an SSH tunnel. Using ODI Loading Knowledge Modules on the Oracle Database Cloud Service (DBCS) - shows how to use Loading Knowledge Modules in Oracle Data Integrator. The Oracle Cloud User Experience team has been busy preparing for Open World 2016 and have written an open invitation to their session on User Experience in Oracle Applications. Edward Dewolf has written a four part series on the new BI tool called the Oracle Data Visualization Cloud Service:     Data Visualization Cloud Service Adding Excel Data Sources Making visualizations look good Presenting the Story Navigator  

Here is a review of content published in August that you may find useful. Our Content Our Groovy Tuesday series continued with the following articles: Groovy Tuesday: Finding Foreign Keys and Collections...

Our Recommendations for OpenWorld 2016

As is tradition on this site, with Oracle OpenWorld nearly here (September 18–22), here are our top picks from 2000+ strong Session Catalog. In addition to the sessions given below, there hands-on labs which are great to playing with new tools, the keynotes are always available on-demand, and you can find product specific programs for Development, CX, HCM and ERP. We've grouped these into logical collections, and just use the [SesssionID] in the catalog search to see more details. Integration Oracle Integration Strategy: Cloud, API Analytics, Integration, and Process [CON6867] Integrating Your Oracle HCM, ERP, and CX Clouds with Your On-Premises Applications [CON7012] What's New in Oracle Integration Cloud Service [CON7328] Connecting SaaS Apps to the Cloud and On-Premises Apps with Oracle Integration Cloud Service [CON7329] Cloud Integration Best Practices: Customer Panel [CON7367] Oracle Integration Cloud Service: Simplifying Connections Between Applications [HOL7639] Connect Oracle Customer Experience Cloud to Your Ecosystem of Apps and Services [CON6925] Paas for SaaS Oracle Cloud Platform: Success Patterns with Software as a Service [CON7009] Empower Oracle SaaS Line-of-Business Users to Innovate with Oracle PaaS [CON7011] Extending Oracle HCM Cloud with Oracle Platform as a Service [CON4836] Leverage Oracle PaaS to Enrich Your Oracle and Non-Oracle SaaS [CON7007] Customization  Personalize Your Customer Experience Cloud with Oracle Platform as a Service [CON6923] Visual Application Development and Data Mashups for Busy Professionals [CON7296] Oracle ERP Cloud UX Extensibility: From Mystery to Magic [CON7312] Dashboards and Custom Application Development for Oracle Customer Experience Users [CON2891] Oracle Sales Cloud Customization, Configuration & Integrations Demonstration [THT7084]  Development A Guide to Cloud-Based Agile Development Methodology Adoption [CON1947] Simplified Multichannel App Development for Business Users [CON2884] Real-World Case Studies: Application Development and Deployment in Oracle Cloud [CON7107] No Code Required: Application Development and Publishing Made Easy [HOL7402] Zero Code Development of Mobile Apps for Oracle SaaS Applications [HOL7633] Hands-on Lab: Learn the Basics of Oracle JavaScript Extension Toolkit [HOL5278] Oracle Application Development Framework and Oracle JavaScript Extension Toolkit in the Cloud [CON6649] Oracle Cloud: Application Development and Deployment Strategy and Roadmap [CON7104] Security Secure Oracle SaaS and PaaS with Oracle Identity Cloud Service [CON6958] Securing Data Between the Cloud and On Premises for Optimal Customer Experience Solutions [CON6927] Extending Oracle Identity Cloud Service to Fit You [CON6964]

As is tradition on this site, with Oracle OpenWorld nearly here (September 18–22), here are our top picks from 2000+ strong Session Catalog. In addition to the sessions given below, there hands-on...

Groovy

Groovy Tuesday: Enforcing Child Record Rows Are Always Created

  We've seen questions where there is a need to ensure a parent object record is always accompanied by at least one child record row. This might be a business rule that requires at least one revenue line on an opportunity parent, or (as in the example here) some other custom object related use-case. This article shows how this can be achieved. First of all despite expectations this is not done using an Object Validation Rule. This is because the record creation page (or layout) does not include child object tabs and so when you press "Save and Continue" the error is shown and you can never get to actually enter child lines. As such the way to enforce child rows is to add a 'modify' Trigger, which means records without lines initially on the create page, but when you go to the "Save and Continue" page (which is the edit page) to complete the details it is never updated without lines. When used in combination with a layout which deliberately ensures users have to go to the edit page to complete the record properly, you can enforce child rows are added to new records. Let's use a specific example and show the related code. We have a Sales Tools custom object, used for recording internal tools available for use when working leads and opportunities. This has a child custom object - Tool Resources - which is collateral and items used to ensure each tool can be used successfully. An example might be Printed Brochures which have resources such as a link to the ordering procedure, or the print-shop telephone number. We create a Sales Tools record - Marketing Posters, but don't create any child resources to go with it. This is shown below in the generated UI and the child object tab. Now we add a modify trigger on the parent Sales Tools object. This looks up the current record using the Id. This is followed by some checks for multiple rows which in this case shouldn't be needed on the Id primary key field, but are included should you use another field. Then the Related Collection is used to return all the child Tool Resources rows. We check if the number of rows is zero and if so ensure that the warning is shown. If there are child rows we do nothing. def ThisRec  = newView('SalesTools_c').findByKey(key(Id),1); def ThisRow = ThisRec.size() == 1 ? ThisRec[0] : null if (ThisRow != null) { def ThisItems = ThisRow.ToolResourcesCollection_c def NumLines = ThisItems.count('Id') if (NumLines == 0) {    adf.error.warn(null)   } return true } As mentioned, here we use a warning message, which shows the error text (entered in the error message field on the trigger definition page) but still allows the commit. The alternative - and probably what is really wanted - is to throw an error which stops the commit and blocks the user from proceeding until they've entered child item records (or cancelled the page). This is done using adf.error.raise(null) as a replacement, and the resulting screen is shown: While this example does not have many custom fields on either object, it illustrates the script and the results. As mentioned before, combine this with a layout to ensure users go to the edit page to complete the records fields properly, and therefore enforcing your new custom logic is used.

  We've seen questions where there is a need to ensure a parent object record is always accompanied by at least one child record row. This might be a business rule that requires at least one revenue...

Application Composer

Using Child Objects in Application Composer

Our original article covers all Relationship types does cover the use of child objects, however this sort article draws out a few keys facts which may influence your implementation decisions when initially modelling your custom objects. This may be helpful because at first glance the 'Create Child Object' feature of Application Composer may seem to fit your needs, however there are factors which you should be aware of which may mean you needs may be better suited to explicitly Reference relationships (between top level objects). The following table provides a summary of the properties of the different types:     Property Custom Child Object (Parent-child relationship) Custom Top-Level Object (Reference relationship)  Comments  Cascade Delete For reference relationships they could be implemented in script, such as explained here.  One-to-Many record rows Both accessible in code via Related Collections as explained here. One-to-One records rows Could be implemented as a onCreate Trigger and remove the create option from child subtab layout. More natural for reference objects. Multiple Parents Top level objects can have many user-defined reference relationship. Grandchildren Only one level of children is supported by Child objects, whereas reference relationships allow for more complex modelling. Independent Security Both types allow access based on job role. Available in Dynamic Child Lists Only top-level objects are available for use in dynamic choice lists. Available in Custom Subject Areas Both show as 'children' in the creation page. Delete or Change the Relationship Reference relationships have no impact if simply not used.  Illustrative Example Consider the following to illustrate some points above. A top-level custom object - Sales Tools - is created. This has a custom child object - Tool Resources. It is also related to the Standard Object 'Opportunity', so you can associate several Sales Tools to one Opportunity record. This is done via an explicitly created Reference relationship with Sales Tools as the target (shown below).   The result shown below, a Parent-child and a Reference relationship. Both are 1:M, and you can see the Cascade Delete only applies to the Parent-child object.   In the Relationships page (under Common Setup) you will not find the child object (Tool Resource) available for either the Source or Target objects. Additionally as you can see you cannot create a 1:1 relationship for either.   Other Relationships  In addition there are two further relationships available. Many-to-many relationships are discussed here, and relationships defined by the creation of a Dynamic Choice List (of type 'Lookup') are similar to a reference relationship in their properties, with no strict dependencies between the two objects as they are intended for 1:M queries only. Consult the original article for more on these both.        

Our original article covers all Relationship types does cover the use of child objects, however this sort article draws out a few keys facts which may influence your implementation decisions...

Groovy

Groovy Tuesday: Working With Checkbox Fields

  One of the custom field types we've not looked into in detail so far is the checkbox. This simple field is a useful option for adding custom flags to be set on your objects, and upon which custom code can be conditionally fired. In this article we look at using checkboxes in more detail and note some of the important considerations. Default Value Checkboxes are one of the field types you can add to any custom or standard object.     When defining the checkbox field you set the constraints and properties. At first glance you may notice the absence of a Required property - which is actually logical since a checkbox always has a value (checked or unchecked). The Default Value property is often important for checkboxes, and the page allows you to choose values Yes (for checked) or No (for unchecked), as shown here: Stored Value and Script Usage   The actual value stored in the database for checkboxes are single characters 'Y' for checked or an 'N' for unchecked. As such getting the value using groovy returns the same Y/N values. As you would expect, to set the box to checked/unchecked you assign the value (using setAttribute()) as a 'Y' or 'N'. For example the following code is written in a Priority Score formula field based on an Active checkbox field on the pages shown below. def baseLine = 100 return (rb_ActiveFlag_c == 'N' ? baseLine -30 : baseLine + 60) As such, unchecked the formula shows: When checked the formula shows:       Object Workflows In Object Workflow if you create a Field Update action against a checkbox field you have the option to choose values of True (meaning checked) or False (meaning unchecked). In the screenshot below the checkbox field is named 'Special' and you see the possible values. Despite the difference in values on the UI here, the stored values remain Y/N. Web Services  In web service definitions for your business objects all checkboxes are declared as Boolean types. In the SOAP service object definition this can be found in the respective XSD document as follows: <xsd:element minOccurs="0" name="rb_SpecialCB_c" type="xsd:boolean"/>  Note the definition is only available once the field is published from the sandbox:  In RESTful web services, the object definition can be found in the /describe document. Again in my 'Special' checkbox field (rb_SpecialCB_c) this is shown as: { "name" : "rb_SpecialCB_c", "type" : "boolean", "updatable" : true, "mandatory" : true, "queryable" : true, "allowChanges" : "always", "precision" : 10, "defaultValue" : false, "title" : "Special", "controlType" : "check_box", "maxLength" : "10", "properties" : { "TOOLTIP" : null, "fnd:OSN_ENABLED_ATTR" : "true", "description" : null, "AttributeType" : "Checkbox", "JboValueMapProperty" : "oracle.jbo.valuemaps.BooleanYNPropertySet", "AUTOSUBMIT" : "true", "ExtnCustom" : "Y" }, "lov" : { "childRef" : "LOVVA_For_rb_SpecialCB_c", "attributeMap" : [ { "source" : "value", "target" : "rb_SpecialCB_c" } ], "displayAttributes" : [ "name" ] }        },  Note you can see custom fields on REST service objects without the sandbox publication. Also see the internal JboValueMapProperty which translates a Boolean to a Y/N value. 

  One of the custom field types we've not looked into in detail so far is the checkbox. This simple field is a useful option for adding custom flags to be set on your objects, and upon which custom...

Integration and PaaS

Platform Services: Integration Cloud Service

    Introduction As part of our Oracle Cloud Platform series this article introduces Oracle's Integration Cloud Service (ICS), illustrating how this can simplify developing complex integrations down to a set of declarative configuration tasks.   The Elements Oracle Integration Cloud provides simplified integration capabilities by defining the following core parts to building a discrete solution:   Connections - here the end-points of the integration are defined, and can be reused as required. These may be connections to cloud or on-premises applications. It is here you set the URL Properties and Security definitions, and connections can be quickly setup and safely tested. Integrations - connections are only useful when part of an integration flow. You map you connections to source or target in an integration. Within each integration, you define your field-to-field mapping to move data.  Packages - several integrations can be grouped and administered collectively. Monitoring - tables, charts and graphs provide monitoring and analysis features, with drill to show any errors and the details or specific payload messages.     Connections When definition your connection you choose what kind of connection this will be. Whilst native connections are possible, the most common case is to use a prebuilt adapter which understand the remote system and allows for easy and reliable connectivity.  In addition you can define your own connection through an 'agent' program which can be installed on the remote on-premise system and knows how to work with integration cloud service, reducing the need for custom development. More on the setup of agents can be found in this article from the A-Team. The list of currently available adapters is constantly increasing, but at this time it includes support for:    Rest and SOAP Web Service Adapters for custom apps Oracle E-Business Suite Oracle Fusion ERP Cloud, HCM Cloud and Sales Cloud Oracle Eloqua (Marketing Cloud) Oracle RightNow (Service Cloud) Oracle Messaging Cloud Service Third party applications including Salesforce, SAP, Netsuite This article takes a detailed look at implementing the E-Business Suite adapter. Additionally you can create your own adapters, using the SDK - more on existing and custom adapters can be found here. Integrations You define your integration based on the available connections. It's a simple drag-and-drop of connections to become Source and Target. When you do this the adapters will register the request/response processes included in the connection for you. For each integration you add Operation details to the integration - defining which business object(s) will be sent by the source and what they will do on the target.      Mapping   The next step is to define how attribute values will be mapped for each process (request/response) between the source and target. This is done using visual editor, as shown below. For especially heterogeneous objects, there is support for up to four target objects you can map fields to. Additionally detailed value transformation is possible using a broad selection of mapping Functions and Operators as shown below. You can also see the source XSL statements to the right. Lookups Related to mapping, defining lookups in Integration Cloud Service provides the possibility to map source fields to one central set of standard values. These use the underlying SOA Suite feature known as Domain Value Maps (DVM) and allow for simple, reusable value conversions.  Triggering Events Another key step is to define when this integration will be triggered. There are two options: Pick from the options available based on the adapter used.  Use a custom code call to the RESTful services of the Integration Cloud Service to run a flow. Using the first option, once the connection is setup it uses the details (for Fusion Applications to interrogates the SOA server) to display the events available for use. Here is an example from Sales Cloud. At this time you cannot create new events yourself in Oracle Fusion Cloud Applications, but more are being added all the time. Contact support to raise an enhancement if your object event is not yet available.   Summary Whilst this article does not cover all the features and options in Integration Cloud Service, it provides a taster of this platform service and how it could complement your existing Fusion Cloud Applications portfolio. Further Reading   Technical walk-throughs are available from the A-Team in these articles. There is a great FAQ available The Help Center documentation for Integration Cloud Service The Oracle Integration blog has many useful articles and links.     

    Introduction As part of our Oracle Cloud Platform series this article introduces Oracle's Integration Cloud Service (ICS), illustrating how this can simplify developing complex integrations down to a...

July in Review

Here is a review of content published in July that you may find useful. Our Content Our Groovy Tuesday series continued with the following articles: Groovy Tuesday: Understanding the source for UserProfile API - using current user attributes that are available in Groovy. Groovy Tuesday: Using Multiple Catch Blocks in Groovy Script - effective error handling in Groovy. Groovy Tuesday: Error Messages from Validation Rules - how to present the user with effective error messages in the user interface. We also released the following on: Platform Services: Oracle Java Cloud Services - an introduction to the Java Cloud Service (JCS-SX). The Citizen Developer and the Cloud Developer - how declarative development influences the customization work. A Profile Options Reference - common profile options used in Fusion Applications to control development tasks. Hiding and Reordering Tabs and Sub-tabs - simple ways to adjusting the user interface tabs to meet your needs. Other Content The A-Team also released the following articles this month: Oracle Sales Cloud REST APIs – Handling Child Objects - how to use the Sales Cloud RESTful API to access child objects. Integrating Oracle Mobile Cloud Service with Oracle IoT Cloud Service - using the Mobile Cloud Service with the Oracle IoT Cloud Service. Accessing and Analyzing Twitter Feeds with Oracle Stream Analytics (Part 2) - how to use Oracle Stream Analytics to access Twitter and develop related analytics. Edward Dewolf this month released an article on the Track Race, illustrating the many reporting options in Oracle Sales Cloud. The Oracle Applications User Experience team wrote about leveraging the Oracle PaaS4SaaS tools to build new products and services, in their article entitled Startups: Your Oracle PaaS4SaaS Cloud Pivot Enabler is Here. This includes a video interview with our friend Peter Care of FXLoader. 

Here is a review of content published in July that you may find useful. Our Content Our Groovy Tuesday series continued with the following articles: Groovy Tuesday: Understanding the source...

Groovy

Groovy Tuesday: Finding Foreign Keys and Collections for Related Objects

There are places to easily see the foreign key fields for your related custom objects, allowing you to write groovy scripts to access the parent record from the child. We looked at deriving the field name in this article previously, however on the Standard Fields page (Release 11) for the child object you will find the foreign key fields listed, always ending in "_Id_c". Obviously this corresponds to the Record Id (Id) on the parent. In the example below, it shows the AccountProject_Id_c field on the child AccProjItem object. Querying the other way (from parent to child), the child object has a Related Collection which to use (defined on creation page) and is now visible in the Groovy Palette, under Fields tab. The following example shows how to use this to get access to the rows through a simple groovy script. In this case we Sum them all and return a parent field (AP_Budget_c) with the total of row values subtracted. It's a simple Formula Field on the parent which takes the parent budget field and reduce it by all child cost item lines.   def items = nvl(AccProjItemCollection_c,0) def total =0 while(items.hasNext()){    def oneItem = items.next() total = total + oneItem?.AP_CostUSD_c }  return (AP_Budget_c - total)  

There are places to easily see the foreign key fields for your related custom objects, allowing you to write groovy scripts to access the parent record from the child. We looked at deriving the field...

Groovy

Groovy Tuesday: Understanding the source for UserProfile API

Further to our original article that looked at the UserProfile API, we were recently asked where this data is stored. The API allows you to access attributes associated with the current user, something very useful in scripts. To use this you need to be aware of which layer of data associated with a user this comes from. A common misconception is that this is the HCM User-Employee record, however this is not the case. The UserProfile API accesses the underlying user record, as exposed in Oracle Identity Management (OIM). You can access this as: Either use Setup and Maintenance and the Manage Job Roles task, or go directly tohttps://login-[yourSaaSEnv].com/oim/faces/pages/Self.jspx. You'll need the "FND_IT_SECURITY_MANAGER_JOB" job role to access this console. Click Administration (on the top right). Find your user and edit the Attributes tab. Under Other User Attributes you'll find various attributes which match to the calls available in the UserProfile API. Example One common application for use is in Validation Rules - ensuring data entered complies with certain user aspects. For example, we might wish to only show a field on a page if the user is associated with a particular Department. In the related groovy script we can use the getUserProfile function to get the Department value. def myVal = 'Dept: ' + adf.context.getSecurityContext()?.getUserProfile()?.getDepartment(); For illustration, instead of using myVal in a conditional expression, the following shows the value in my Formula1 field.   An Alternative Solution In Sales Cloud users are commonly associated with a 'Resource' abstract role and some additional sales organization related attributes (commonly Resource Role, Reporting Manager, Organization) and then become known as individual Resources. This extended user object is fully supported by Application Composer - via the Resource Standard Object. As such you can query these records (using the newview feature) and get data from the objects fields. There is a detailed example script in this article, showing how to find the Resource record for the current user (via a call to getUserPartyId) and check an attribute (UtilityField_c) value.  

Further to our original article that looked at the UserProfile API, we were recently asked where this data is stored. TheAPI allows you to access attributes associated with the current user, something...

Application Composer

Hiding and Reordering Tabs and Sub-tabs

Introduction The following article expands on this introduction where we considered the creation of custom pages and tabs. The two different tab types (examples show below) are: 1. Context insensitive tab for use with new pages. These are created via Page Integration Wizard. 2. Tabs created inside existing Sales Cloud object records. These are created via Application Composer and are actually known as subtabs.     Hiding and Sorting Tabs First let's look at the type 1 above. Whilst these are outside the object record context, they are still associated with a page. In the screenshot below the page is Opportunities, but this could have been a new custom page. The tabs are added and deleted using the Page Integration Wizard, as shown below.   The actual hide and reordering is done in the Structure feature, outside of the Page Integration Wizard. Here we enter into the object page, we can see the related Visible and Order features shown below.    For our second type - within Application Composer object records - it is quite common that many subtabs already exist. As such ordering and hiding them may be useful. In the Application Composer - Pages feature there is an icon showing two vertical arrows, this allows subtab configuration, including recording and shuttling items so they are not displayed. This same page allows creation of new custom tabs supporting various type of context-sensitive and independent content. Related video demonstrations can be found on the FA Developer Relations YouTube channel.

Introduction The following article expands on this introduction where we considered the creation of custom pages and tabs. The two different tab types (examples show below) are:1. Context insensitive...

A Profile Options Reference

The following small table represents configurations related to customization, extension and integration, as implemented as Profile Options. This reference collection combines many mentioned in-context elsewhere on this site, together with a few little known settings that you may have occasional use for.  All are accessible from the Setup and Maintenance feature found in the Navigator, and search using task name 'Manage Administrator Profile Values' to open the related page.  Profile Code Description Example / Supported Values FND_CLASSIC_INTERFACE Allow the user to see only the Desktop UI and not the Simplified UI. Y/N FND_PAGE_COMPOSER_SOURCE_VIEW Allows Source-View in Page Composer for desktop pages. Y/N FND_USER_SANDBOX Each specific users current 'active' sandbox. [Sandbox Name] ZCX_ENABLE_CSA_SANDBOX_Y_N Enable sandbox for custom subject area creation. Y/N FND_DISABLE_DATA_SECURITY_SANDBOX Disable the Data Security sandbox option. Y/N FND_ALLOW_MANUAL_METADATA_UPDATES Enable the delete and import buttons in the Manage Customizations page. Y/N FND_USE_FILMSTRIP Use the filmstrip of icons on simplified pages. Y/N FND_EXPAND_FILMSTRIP Default for filmstrip of icons on simplified pages. Y/N FND_CSM_BI_DISABLE Remove BI content from the Customization Set Migration. Y/N If you notice something missing from this list, please let us know.

The following small table represents configurations related to customization, extension and integration, as implemented as Profile Options. This reference collection combines many mentioned in-context...

Groovy

Groovy Tuesday: Using Multiple Catch Blocks in Groovy Script

Introduction This blog article illustrates how to use multiple catch blocks in Groovy script to catch Exceptions instead of a single catch block, so that an appropriate response can be applied based on the error. It builds on our previous article entitled Handling Script Problems Gracefully. Background Sometimes a groovy function could error for a number of different reasons. It is often necessary to inform the user of the reasons for failure. In Groovy errors often result in an Exception being generated. These Exceptions indicate what type of error has been thrown. The try catch functionality in Groovy allows the capture and handling of each type of Exception differently. Use Case Consider a use case where a field x has multiple uses. x is a field of type String and is not a required field. x can be any character. Once x is captured, the field is then re-used in another field but this time as an Integer. To facilitate this the value x needs to be parsed into an Integer. Whilst this is a simplistic use case, it illustrates the point of this article. Generally speaking Groovy scripts can fail in a number of different places based on how complicated the script is. In parsing x to convert it to the Integer value y, there are two possible problems that will prevent successful parse. The first is that the value is null and the second is that the value is not a number. The Groovy script below handles each case separately presenting the user with the relevant error message in the user interface. Here is the Groovy script: def y = -1; try{ x = x.trim(); if (x.length()==0) x= null; y = Integer.parseInt(x); } catch (NumberFormatException nfe){ throw new oracle.jbo.ValidationException('x is not a number. Exception message:' + nfe.getMessage()); } catch (NullPointerException npe) { throw new oracle.jbo.ValidationException('x is null. Exception message:' + npe.getMessage()); } return y; The String parameter x is passed into this script. If x is a string with multiple spaces then it's trimmed and then set to null so that we can trigger the NullPointerException in this case. In our example the NullPointerException is generated when an attempt is made to trim the whitespace. The error message x is null. Exception message:Cannot invoke method trim() on null object is displayed on the screen. If x="thirty" for example, it contains non-whitespace characters and an attempt will be made to parse the value into an Integer and set y equal to that value. If the value cannot be parsed successfully because the String value doesn't equate to an Integer then the NumberFormatException is thrown and the following error message x is not a number. Exception message:For input string: "thirty" is displayed in the user interface. Additional Content For further information have a look at the following: Blog Article on Using Warning and Error Messages in Groovy Transaction Management in Groovy Handling Script Problems Gracefully Understanding Common JBO Exceptions in Groovy Scripts Groovy-lang documentation on try/catch/finally functionality.

Introduction This blog article illustrates how to use multiple catch blocks in Groovy script to catch Exceptions instead of a single catch block, so that an appropriate response can be applied based on...

The Citizen Developer and the Cloud Developer

Introduction This article follows up on a recent article from our Applications User Experience team, where the role of Citizen Developer was considered. Using this same context, this article looks deeper at specific features of the Oracle Cloud Applications and Platform. If you have not heard the term before Gartner originally used it as "A citizen developer is a user who creates new business applications for consumption by others using development and run-time environments sanctioned by corporate IT.". The general profile of a citizen developer is that they are business experts with little or no coding skills, and rely on declarative tooling to build features which meet specific business requirements. This article takes a tour through several development-like tools in the Oracle Cloud and illustrates how the building process becomes easier thanks to innovative usability designs and product feature sets. So whilst development still needs technical know-how and solid solution design, the actual build process becomes less arduous. In Oracle Fusion Cloud Applications Firstly many of the features for making the applications work the way you want are not customization or developer-like features all all. The functional setups and administrative options (mainly under Setup and Maintenance) allow clear definition of how the related feature will operate. Some examples are: Define Profile Options Values Dynamic and Extensible Flexfields Product-specific rules, such as HCM's Fast Formulas Approval and notification configurations in the BPM Worklist Additionally there is a wealth of UI Tailoring features provided that offer developer-like customization with zero-coding required. Adjusting run-time properties of page components using Page Composer, including the use of simple dynamic expressions. Changing Labels via User Interface Text feature Changing Look-and-feel using the Appearance and Structure functionalities. Adding custom UI pages/tabs content using the Page Integration Wizard. Custom BI analytics, including Infolets and print reporting. Stretching deeper into true customization development, the Application Composer / Data Composer tool provides the following for products where it is provisioned: Declarative extend and define new business objects to store new information. Add conditional logic and processing to your business object interactions. Use low-code expression building or short scripting (groovy) in your development. In Oracle Platform Services Let's now look at some of the complementary services provided by the Oracle PaaS Cloud and how these could be considered more accessible to the profile of no-code or low-code citizen developers. Oracle Integration Cloud allows your to define your system connections and the integration detail with based on source-to-targets mapping, using a simple drag and drop interface, as shown below. Additionally you can add dynamic transformation code using XPath expressions (details). Oracle Process Cloud has a 'Process Composer' interface for building flows by dragging-in components and setting properties. The supporting Business Rules development is also declarative. Oracle Application Builder Cloud Service is a declarative environment for the rapid building of responsive applications. It is also supported by options to extend the out-of-the-box components and actions with custom JavaScript. Development on the Oracle Database Cloud (Schema Service) - through its Application Express interface - is very declarative and for many simple requirements can be considered a low-code application development environment. Is This Citizen Development? In practice organizations will never allow every 'citizen' business user the capability to create their own unique applications, but the dissemination of some of this work back to selected experts may have benefits. Here are some commonly stated considerations that may influence the approach in different organizations. For Reducing "Shadow IT" where desktop spreadsheets, database applications, and free cloud services are used to bypass involving the IT department. Strong knowledge of requirements and business processes, where traditional development has historically encountered challenges. The traditional business analyst can do some of the development. Auto-generation of code and definitions will reduce human mistakes, offer lower perceived complexity, and should be less costly to both create and maintain. Tighter control on technologies, implementation options, and overall design. Against Without prior planning that could be a lack of control (and documentation/audit) on the adjustments made across a poorly community. Without control there may be fragmentation of applications within business silos, increasing operational complexity. Many applications require some amounts of dynamic logic or expression. This may require a specific skillset. Over-simplified or reduced-capacity tools may have fewer options to meet business requirements. As illustrated by the article examples above, in the Oracle Cloud Applications and Platform Services the advent of simplified user experiences means that developers are simply benefiting from easier-to-use tools. It doesn't mean the tools are suddenly not developer tools any longer, it's just now they are much less complex to use. This provides developers on the Oracle Cloud many benefits, not least of which are big gains in productivity. Summary This article illustrates the new user experiences that developers will encounter when working with Oracle Cloud Platform and Applications. That is not to say the developer role has changed significantly, but the reduced complexity provides more time for solution design and other essential tasks. In this light perhaps the term used should be Cloud Developer rather than Citizen Developer.

Introduction This article follows up on a recent article from our Applications User Experience team, where the role of Citizen Developer was considered. Using this same context, this article looks...

Integration and PaaS

Platform Services: Oracle Java Cloud Services

 Introduction As part of our Oracle Cloud Platform series this article introduces Oracle's Java Cloud Services (JCS), including specific focus on Java Cloud Service - SaaS Extension (JCS-SX). We'll look at the high-level features for running your custom JavaEE applications in the context of an extension and complement to an Oracle Fusion Cloud Applications portfolio. Many lower-level technical integration use-cases have already been covered by Jani's articles beginning with 'Java Cloud Service: ...' and can be found here. Use Cases Consider the following simple situations to understand when and why the Java Cloud Services may be used. Existing Applications: An organization often has ancillary application services which support their core business operations. Many of these applications may be JavaEE applications (due to its prevalence) and are most likely to be integrated with many other applications. As part of the implementation of Oracle Cloud Applications for core business processes, the supporting Java applications can be readily redeployed to the Oracle Java Cloud. New Applications: There may be occasion where business requirements are industry or company specific, supporting particular processes deemed essential to daily operations. In this case the out-of-the-box functionality may not stretch to support those needs to the depth required, and as such an extra piece of functionality is required. Developed using the Oracle platform tools, custom applications can look and work in a way that is indistinguishable to Cloud Applications. Since these auxiliary applications need an application server, the Oracle Java Cloud is the logical run-time environment. Key Features - JSC-SX Let's drill into some specific capability of the Oracle Java Cloud. Let's first look at the Java Cloud Service - SaaS Extension (JCS-SX), the service recommended for most Oracle Cloud Applications users.  Within the JCS-SX package you get a Java run-time environment and a database environment, as shown below. Additionally (behind the scenes) you also have an identity management service managing the LDAP services for the administration of users and roles - done using the Cloud administration pages. Optionally you can configure shared identity domain between your custom and Cloud Applications, as discussed here. The database environment is only accessible to applications deployed in the associated Java Cloud service, not through any direct client connections. As shown below, the Service Console for the database service is Oracle Application Express, providing administration and developer features where your data model and records can be managed. If you open the Service Console for the Java environment, you get a page similar to those found in Enterprise Manager, showing summary information. Note the JNDI name for the database, and the View Log Messages link to see runtime logs from both your own loggers and the WebLogic server. This same page also provides application deployment features, such as stop-start, deploy, delete, and redeploy. It has basic performance charts, and shows libraries available for use. From here you can also monitor the administration jobs, such as result from redeployment and restart. As intended, the JCS-SX environment is a simple-to-manage preconfigured robust Java run-time, to be used alongside Oracle Cloud Applications. It is currently available in three sizes, based on the number of managed servers, memory, storage, and data transfer required. For more detail on the current options and to sign up for a trail, visit the website or review the related JCS-SX documentation.   Java Cloud Service In a few circumstances, the JCS-SX option might not quite have all the options you need. Perhaps your application runs in a very specific way, has specific availability and resource needs, or uses a specific set of code dependencies that require extra configuration. In this case the Oracle Java Cloud (JCS) is likely to be suitable. Let's look to illustrate some basic differences between the two services, without covering every last detail. Note that there is also another option, Java Cloud Service - Virtual Image - a JCS environment sized for use just with test and development environments. First our overall JCS package has two WebLogic service environments available, one for version 12c and another for 11.1.1.7. This initial page shows the overall specifications as we have it configured right now. From here if we look into one environment (version 11.1.1.7),  we see the detailed configuration, showing the admin and managed server instances and, like JCS-SX, the associated database environment. Looking under the Administration side-tab, we see configuration and activity in areas such as backups, patching and load balancing. We can also directly access all the Service Consoles from the menu here (including get/create SSH keys) to deploy applications, monitor performance, and manage the Java run-time environment. These administration consoles and their features will be well known to those already working with Oracle WebLogic Server environment, and are outside the basic scope of this article. There are many recommended documents and rich demo videos showing the completion of common tasks in the JCS environment in this page. If you need more details please take a look. Summary This article demonstrated the basic features of Oracle's Java Cloud services and illustrates some key differences between the options available. If you have specific questions please use the links in the article for more detail.

 Introduction As part of our Oracle Cloud Platform series this article introduces Oracle's Java Cloud Services (JCS), including specific focus on Java Cloud Service - SaaS Extension (JCS-SX). We'll...

June in Review

Here is a review of content published in June that you may find useful. Our Content Our Groovy Tuesday series continued with the following articles: Understanding Validation Warnings - is about the change in the Groovy Script editor with particular attention to warnings, errors and type checking. Using Bind Variables To Reissue View Object Queries - illustrates how to use the underlying bind variable feature found in Oracle ADF in Oracle Sales Cloud Groovy. Generating Direct URLs To Object Workarea Pages - shows how to programatically generate urls to an object record so that it can be linked to. We also released the following on: PaaS Services Explained: The Most Common SaaS Use Cases - begun a series of articles on how PaaS can be used with Fusion Applications. Platform Services: Application Builder Cloud Service, which is about how the Application Cloud Service can be used to extend and complement an Oracle Fusion Cloud Applications portfolio. Extending Currency Functionality in Oracle Sales Cloud Application Composer illustrates how to use and extend currency fields in Oracle Sales Cloud. Using Custom Formulas and Conditional Formatting in BI is an article illustrating how BI can be customized showing how custom analytics can include condensed and highlighted information. Firing Actions From Custom BI Analytics and Dashboards - illustrates how to trigger actions when a user navigates around inside BI report. Translating Your Application Composer / Data Composer Customizations - an article on translating regionalised language content in Application Composer. Other Content There are a couple of articles released this month by the A-Team that might be of interest as well: Fusion Applications : Priming the Server Startup - This article is about pre-caching data so that the server is not overloaded immediately after startup. Integrating with Sales Cloud using SOAP web services and REST APIs (Part 3) - is about using REST and SOAP services in Sales Cloud. The Usable Applications team demoed the latest User Interface at the AMIS Beyond the Horizon Oracle conference in the Netherlands and then wrote about it here. Edward Dewolf this month has written a few articles that may be of interest: Reusing Reports in BI which illustrates how to use reports multiple times. Households is an overview of the Households functionality of Oracle Sales Cloud. Coopetitors is about using Oracle Sales Cloud to contain parties who are both a Customer and a Competitor. Account Networks illustrates how different Accounts can be grouped together in Oracle Sales Cloud.

Here is a review of content published in June that you may find useful. Our Content Our Groovy Tuesday series continued with the following articles: Understanding Validation Warnings - is about the...

Groovy

Groovy Tuesday: Error Messages from Validation Rules

The Validation Rules feature is found under Server Scripts for each object in Application Composer for Sales Cloud, and at the same place in Data Composer for Projects Cloud and Innovation Management Cloud. The facts in this article can be quickly summarized as: Object Rules fail when the result is false or null Field Rules fail when the result is false only. Let's consider a use-case to illustrate why this is useful to know: Imagine you have a rule which, in some corner-case that wasn't envisioned, may not return a result. An example might be where when records are created the user does not enter any data in some fields which are being interrogated in a specific way. The related rules fire and the users gets the Object Validation error messages, but not those from the Field Validation. Let's look at a simplified example which shows this. Here are two validation rules, a Field Rule and an Object Rule. Both just print to the run-time messages log and therefore do not return any result. When the end user tries to work with the related object and field, they see only the Object Rule error message. This is because the Field Rule only shows the error when the result is explicitly false, i.e. the rule fails. Obviously the action to take is to ensure all rules explicitly return either a true or false result, and to ensure your UI design means users can always interact appropriately with the fields that are being validated (e.g. make them required).

The Validation Rules feature is found under Server Scripts for each object in Application Composer for Sales Cloud, and at the same place in Data Composer for Projects Cloud and Innovation Management...

Integration and PaaS

Platform Services: Application Builder Cloud Service

Introduction As part of our Oracle Cloud Platform series, this article looks at Oracle Application Builder Cloud Service (ABCS) and how it can be used to extend and complement an Oracle Fusion Cloud Applications portfolio.   A Use Case   Imagine business leaders came with the requirement that they needed a new application for mobile managers. These users needed to create, update, and delete records from multiple data sources, including some you already work with in Fusion Applications. They do not need new business logic, special rules or any data new, just the ability to perform simple and quick operations based on existing functionalities.  When on-the-go they need only a tiny subset of functionality they have when at their desks, working with the full application suites, such as Oracle Fusion Cloud Applications. Oh and they want it to look and work how they already know, and do not want a full blow development project - such as would be required to custom code a native mobile app. Key Features Here are a few select features we noted as providing especially high value to Fusion Cloud Applications users:   RESTful connectivity to remote data services. This could be on-premise applications, Oracle platform such as the Schema Cloud Service, or to the business objects in Oracle Fusion Cloud Applications. With the creations of loosely coupled connections between services and data object definitions, a combination of data from different sources can easily be included in one application. Many opportunities to leverage existing designs and investments in Oracle cloud platforms and applications, providing extension while maintaining a seamless user experience. Code-free development to build responsive user interfaces for desktop, tablet and mobile devices. The dislocation of business logic and data services from the user interface layer allows applications to be quickly developed upon existing complex data structures and model layers. Resulting applications can be accessed standalone via a URL and also embedded directly within Fusion Cloud Applications pages.   Illustrative Examples  The following screenshot of ABCS shows the definition of the Business Object defined by drag-and-drop upon a resource from a RESTful service connection. It is this business object which is then available in the user interface for binding components. The table below is bound to the above object, allowing users to create, update, and delete records quickly and simply. All the buttons and action menus are provided out-of-the-box and with absolutely no coding required. ... Video Demonstration   The following video provides an end-to-end simple example of working with ABCS features to extend Oracle Fusion Cloud Applications. The example uses a custom object from Oracle Sales Cloud, but would work with any RESTful services that are available.

Introduction As part of our Oracle Cloud Platform series, this article looks at Oracle Application Builder Cloud Service (ABCS) and how it can be used to extend and complement an Oracle Fusion...

Application Composer

Extending Currency Functionality in Oracle Sales Cloud Application Composer

Introduction This blog article continues our series on the currency functionality in Application Composer. The previous blog article looked into currency related java classes and how they can be used in Application Composer. This article looks into how the currency field type works in Application Composer. It also looks into a Groovy function that can be used to calculate exchange rates between two currencies in Oracle Sales Cloud Application Composer. Supposing there is a need to track opportunities in different currencies, a local currency that the opportunity is being handled in, a corporate currency in which all opportunities across the world are accounted and another currencies can all be tracked in Sales Cloud. The functionality described in this article will illustrate how this can be done. Background The Corporate Currency is common across all regions for that Organisation and is typically the currency in which all accounting is performed. For example an Opportunity in Canada has a local currency of CAD but will be accounted for in USD as the Corporate Currency is USD. Because exchange rates fluctuate over time, the USD amount in the example above, needs to be recorded at the time of exchange. This is why there are some extra properties in currency type fields, one of which records the exchange rate between the local currency and the corporate currency at the time a record is saved. In this example that would be the rate of exchange between CAD to USD. This allows easy calculation of the USD amount at some future date using todays exchange rate. This is why there is a Currency Code field on all objects that have or allow currency fields. You may have noticed this field in your own environment in the list of fields when editing or creating Page layouts in Application Composer (more detail on this is below). The Currency Code field is a drop down list of available currency codes. More information on this is found here. Walkthrough Above we talked about an opportunity in Canada for an Organisation who's Corporate Currency is USD. Below is that example in more detail. The custom field below is called Amount which is of the type currency: The Alternative Amounts is a custom field of type text formula that executes the Groovy script as shown below: java.util.Date nowDate = new java.util.Date(); java.sql.Date now = new java.sql.Date(nowDate.getTime()); def localCurrency = java.util.Currency.getInstance(CurrencyCode); def localCurSymbol = localCurrency.getSymbol(java.util.Locale.getDefault()); def euroRate = adf.util.getCurrencyRate(CurrencyCode,"EUR",now); def eur = java.util.Currency.getInstance("EUR"); def eurSymbol = eur.getSymbol(java.util.Locale.UK); def euroVal = Amount_c * euroRate; def euroCurrencyCode = eur.getCurrencyCode(); def corpCur = java.util.Currency.getInstance(CorpCurrencyCode); def corpCurSym = corpCur.getSymbol(java.util.Locale.UK); def corpVal = Amount_cCurcyConvRate * Amount_c; def corpCurCode = corpCur.getCurrencyCode(); return "Local Amount = " + localCurSymbol + Amount_c +" "+ CurrencyCode + "\nEuro Rate="+ euroRate + " " + eurSymbol + euroVal + " " + euroCurrencyCode + "\nCorporate Currency Code = " + CorpCurrencyCode + " Corp Cur Rate="+ Amount_cCurcyConvRate + "\n"+ corpCurSym + corpVal + " " + corpCurCode; When editing page layouts in Application Composer we can edit a group of fields and add the Amount field and the Currency Code field to the user interface as seen below: When we fill out a row we can see the effect of the Groovy Script above in the user interface below: Groovy Functionality Breakdown The script above contains references to the various properties of the Amount field. Firstly there is the currency value and currency code. In our example these variables are Amount_c and CurrencyCode respectively. As mentioned above, the Corporate Currency has been setup and in the environment used in this example is USD. In Groovy we can reference the curency code using the keyword - CorpCurrencyCode. We can call a function to retrieve the exchange rate so that we can convert from the value entered in this field to the corporate currency. The rate is referenced as <Variable_NAME>CurcyConvRate which in our case it is referenced as Amount_cCurcyConvRate. From this we can calculate the value of this field in the Corporate Currency. As mentioned above exchange rates are date specific so by default the exchange rate will be whatever the exchange rate was on the day the field was updated and will be stored with the record at the time it was saved. adf.util.getCurrencyRate - Groovy Function There is a Groovy function called adf.util.getCurrencyRate that takes three parameters and calculates an exchange rate. The parameters are: a String value of the currency code of the source currency, a String value of the currency code of the destination currency and lastly a java.sql.Date value on which the exchange is to take place. The following can be used to calculate the current java.sql.Date value: java.util.Date nowDate = new java.util.Date(); java.sql.Date now = new java.sql.Date(nowDate.getTime()); After this the following code can be executed: adf.util.getCurrencyRate(CurrencyCode,"EUR",now); The script retrieves the conversion rate from the local currency of that record in Euros. This example also contains references to currency symbols that was discussed in a previous blog post. Further Information Setting up Currencies in Oracle Sales Cloud documentation Guest Post: How FXLoader Integrates Oracle PaaS and SaaS Currency Fields Explained documentation Uploading Files For Integration: Developer Options blog post

Introduction This blog article continues our series on the currency functionality in Application Composer. The previous blog article looked into currency related java classes and how they can be used...

Groovy

Groovy Tuesday: Understanding Validation Warnings

With Release 11 obvious visual enhancements were made to the groovy coding palette. The redesign included only a few obvious new features, however was complemented with an additional layer of validation - known as Type Checking. Existing coders will be familiar with this, where in essence the compiler verifies that the code object definitions match with their usages. A simple example might be the following:  def myValue = now() + "Hello" Resulting the following warning message which explains that a Timestamp class does not, by definition, expect to be passed a plus sign and a String:  Warning(1,18) : Cannot find matching method java.sql.Timestamp#plus(java.lang.String). Please check if the declared type is right and if the method exists.  You know the type checker is involved here because the error mentions "Please check if the declared type is right...". The implementation is such that these warnings do not prevent you from using the code entered, they are simply advisories that indicate a possible mistake. The code can still be saved. Two other examples of when this may show are; using applications-internal functions and working with nvl(). The following function allows you to get the partyId for the current user, useful when creating new standard object records. As you can see a similar warning is shown.         Likewise using the nvl() function with a number field also raises a type checker warning, based on the datatype definitions and actual usage. Here the error has slightly different wording but the reason remains the same:   Warning(2,14) : Cannot call bc4j.null.gs#nvl(java.lang.Object <T>, java.lang.Object <T>) with arguments [java.math.BigDecimal, int] As mentioned, these are all validation warnings and code can still be submitted and used at run-time without error.   

With Release 11obvious visual enhancements were made to the groovy coding palette. The redesign included only a few obvious new features, however was complemented with an additional layer of...

BI

Using Custom Formulas and Conditional Formatting in BI

This is a quick-and-simple illustration of two BI features for use when creating custom analytics in Fusion Cloud Applications. The features are core parts of the underlying Oracle BI platform, and as such are highlighted for Fusion Cloud Applications users and developers who may be new to this toolset.  Adding Custom Formulas When creating a new analysis you commonlu want to include only the most valuable information in your output, and not a long table of rows or even a proportional graphic which does not provide a specific value. As such the creation process frequently requires some calculation and aggregation on the raw data available. Even using the BI Composer wizard-like steps for creating a new analysis you can include formulas on your criteria values. As shown below, the wizard does not include a steps to setup complex formulas, but if you click the pencil icon in the top right you can refine your column value, entering an actual formula in the field.  In the results you can see the simple COUNT() function applies. Going further when using the full BI Analysis authoring screens then you have access to the formula creation features as shown below. There is extensive help on syntax in these screens, including built-in validation. What is especially useful is the fact you can copy the resulting formula string from here and paste it into the BI Composer popup above, allowing you to reuse and share a common formula without all users having to have access to the full authoring screens.   Click here for larger view.    Applying Conditional Formatting    First we define the conditions on the Column Properties dialogue, shown below (again accessed from the Criteria tab, under the 'cog' icon). We add a condition and as you can see there are many different formatting options you can include, not just color. This includes the use of custom CSS classes also. Then we specify the criteria when the new format will apply. Finally we verify we have our conditions setup how we want. Note that they execute sequentially order, top-down, so the order you define can be important in the final result. In our example we'll just change the color based on value range. Finally we check the 'Results' tab and verify it shows the colors as expected. You can read more about conditional formatting in the Oracle BI documentation.      

This is a quick-and-simple illustration of two BI features for use when creating custom analytics in Fusion Cloud Applications. The features are core parts of the underlying Oracle BI platform, and as...

BI

Firing Actions From Custom BI Analytics and Dashboards

This article looks at building in a event-like action using a feature from the Oracle BI Enterprise Edition environment embedded in all Fusion Cloud Application environments. We consider this from an applications context and you can drill into much more detail using the related BI documentation mentioned at the end. To not overlook an assumption, be aware that the process described applies to BI Analytics and not to BI Publisher reports. Analytics are designed to include these kinds of user interactions, whereas reports are intended to be more static for use in record keeping and printing. The first big question is likely to be "So what actions can I fire from BI?". To whet your appetite below is the related menu. We'll look at how to get to this menu and what the options do in the remained of this article.   How To Add An Action Actions can be added to specific analytics and also to dashboards. They can be invoked when a user clicks on almost anywhere on the BI-generated output, including on a value, a cell, a text label, or a chart. The actions may also be used standalone, put into a region of their own where they form a kind of custom menu. The features and general creation process is the same in all cases. The first step is to create an analytic on which to add the interaction. In this example we simply use a Performance Tile View to display a total count of Opportunity records using the related Subject Area. Here is how that looks. To expose this we added an Infolet and pick our new analytic from the Content Catalog. As shown below, this displays the total fine, however we want to take the user to our special portal page if they click on it. Of course we could take them to another BI report, an applications page via a deeplink, or have done something else, however the intent here is to clearly show the creation process. In the Criteria tab on the BI Edit Analysis screen we open the Column Properties dialogue, as shown below. This provides many options - especially around formatting - but also an Interaction tab. Here we see the options to use Actions to define what happens when a user clicks the column and its value.   As shown above you need to select the Primary Interaction for the Column as 'Drill' else the value will not be hyperlinked. Once set, you configure the Value (within the column) with one or more Action Links. Clicking the plus icon here is where the menu above appears, showing all the Action types you can add. In this example we chose Navigate to a Web Page. As part of this (and most other action types) you can configure the transmission of run-time parameters. The following screen shows how you enter your URL and optionally Define Parameters to use. Notice the values can be from a user-entered prompt, from a variable, or simply from a column value from the analytic's own criteria. Once defined and saved, we can refresh our infolet and see how the value becomes hyperlinked and our custom action is available. As you may imagine, if you define multiple actions on the single column value they will show as a small menu to the user.       What the Actions Do     Note that because the Action Framework is in the BI technology not all action types can be configured for use in a Fusion Applications and Software-as-a-Service environment. Invoke a HTTP Request: uses the exact same configuration screen as the URL request above, allowing you to define the same parameters. Invoke a Web Service: This requires a SOAP-based service with a WSDL URL from which is determines the services and operations/methods available. As the name suggests, this is an invoke option only, with no support for storing or displaying a response. The following is the configuration page (which can also be done in BI Administration screens), although as just mentioned this would be used in a set (or create/update) type of activity, rather than to get information as the service used here suggests.   ADF Contextual Events: are used for working with ADF page development, to pass data between the page and the analysis. This does not apply in a SaaS environment and is not an option at this time. Invoke a Java Method: allows the selection of methods within an EJB already defined in the BI Administration pages. Since the context here is SaaS and not on-premise this is not an option at this time. Invoke a Browser Script: allows the selection one of the JavaScript functions available on the page. Using deep customizations such as Narrative Views it is possible to add custom functions to BI pages and dashboards. We will look at this in a subsequent article. Navigate to BI Content: allows you to select an existing analytic or dashboard from the Content Catalog to be redirected to. Navigate to a Web Page: described above. Note that you can save an action you define for reuse in several places also. This can be a time-saver and would help reduce mistakes and maintenance. Action Options The following dialog is available from the Options button within the Action configuration screens. It allows the control of how the action gets fired by users, adding or removing extra checks and options, such as to open URL's in a new window.     Useful References The following documentation guides provide detail on how all the actions feature works. Again not every feature or option may be exposed for use in a SaaS environment and if you are uncertain then please check with Oracle Cloud Support. Fusion Middleware User's Guide for Oracle Business Intelligence Enterprise Edition - Chapter 10: Working With Actions Fusion Middleware Integrator's Guide for Oracle Business Intelligence Enterprise Edition - Chapter 5: Using Actions to Integrate Oracle BI EE with External Systems

This article looks at building in a event-like action using a feature from the Oracle BI Enterprise Edition environment embedded in all Fusion Cloud Application environments. We consider this from an...

Groovy

Groovy Tuesday: Using Bind Variables To Reissue View Object Queries

This is a newer feature which allows you to rerun a VO-based query in your scripts supplying a different criteria value each time. This reuse reduces the code size and slightly reduces system overhead of instantiating a new view object for each query. The usage is based around two helper functions added to the ViewCriteria method. These are described below, with colors that match the example: addBindVariable() - which creates a bind variable or parameter. This accepts the View object and a String for the name. setBindVariable() - which gives the bind variable a value. This accepts the View object, the variable name, and a value. Once setup the bind variable can be used just like they are in the database, prefixed by a colon (:myBind) Example Let's look at the usage in a simple an illustrative example. We've got a few opportunities we can query.     So we add an object function script which queries the opportunities using a ViewCriteria and uses a bind parameter "myName" and using the set function it will find two records as shown above. def vo = newView("OpportunityVO") addBindVariable(vo,"myName") setBindVariable(vo,"myName","Opportunity June A") vo.appendViewCriteria("Name = :myName") vo.executeQuery() def myCount = vo.getEstimatedRowCount() println('First total rows is:'+ myCount) In the same script we can change the criteria, shown below, and reexecute the query. This then prints out that it returns just one record. setBindVariable(vo,"myName","Books For Sale") vo.executeQuery() myCount = vo.getEstimatedRowCount() println('Second total rows is:'+ myCount)    

This is a newer feature which allows you to rerun a VO-based query in your scripts supplying a different criteria value each time. This reuse reduces the code size and slightly reduces system overhead...

May in Review

Here is a review of content published in May that you may find useful. Our Content Our Groovy Tuesday series continued with the following articles: Using the newValue and oldValue functions - describes how to monitor the changes in fields during update giving opportunity to peform adequate field validation. Simplified ViewCriteria Expressions - how to simplify the script needed to execute queries on ViewObjects in the latest release. Working With Line Breaks - which explains how to display data across multiple lines Using the Currency Java Class in Groovy - illustrating how to display currency symbols and currency code based on a chosen locale Working with NewView Row Records - describes and consolidates methods to manipulate objects. For those of you who are new to Application Composer we released an article and associated video on Application Composer Series: An Overview of Application Composer. We released an article on PaaS services PaaS Services Explained: The Most Common SaaS Use Cases which is the first in a series of articles demonstrating key features and functions of Oracle PaaS services. We learned how to save searches in How To Create A Saved Search List To Show All Records and how to use layouts to create conditionally aware user inferfaces: Creating Conditional Layouts in Application Composer - part 1 and  Creating Conditional Layouts in Application Composer - part 2. We released this article Using JWT Tokens to Call Back from a Third Party Application into Sales Cloud which explains how to create a loose integration between Sales Cloud and a third party application. We discussed how to translate labels and strings in Translating Your Application Composer / Data Composer Customizations. If you want to use BI Publisher previously OER could be used to retrieve the data model. However since OER was retired we provided Logical and Relational Data Model Diagrams For Fusion Applications data to support running BI Publisher reports. How To Include Web Services Data In Reports is another article to help in running reports. Finally we also released an article on How To Import User Profile Option Values which is a useful way to set default user values. Other Content The A-Team released the following articles this month which may be of interest: Fusion Applications : Priming the Server Startup - some useful tips to increase performance by performing pre-caching of artifacts after server startup. Creating custom Fusion Applications User Interfaces using Oracle JET - gives the reader a tutorial style document on how to build a hybrid application using data from Oracle Fusion Sales Cloud in Oracle JET, Oracle's new mobile toolkit. Java API for Integration Cloud Service - explains how to use a Java API to use Integration Cloud Service REST Services.Using Oracle Data Integrator (ODI) to Bulk Load Data into HCM-Cloud - which illustrates how to bulk load data into HCM. Oracle Data Integrator (ODI) for HCM-Cloud: a Knowledge Module to Generate HCM Import Files - also shows how to import bulk data into HCM but with particular importance shown to parent child relationships within records to maintain data integrity.

Here is a review of content published in May that you may find useful. Our Content Our Groovy Tuesday series continued with the following articles: Using the newValue and oldValue functions - describes...

Groovy

Groovy Tuesday: Generating Direct URLs To Object Workarea Pages

In the Groovy Palette you will find a few additional Global Functions provided out of the box. One of these is getObjectURL which is available to allow scripts to readily identify a page URL for a given object type and object ID. This allows you to add a link to a page which is a direct link to edit another object. Here is the function: This feature supports Standard Objects and all top-level Custom Objects - basically objects that have a workarea page from which a URL can be generated. Here is a simple example, added to my Opportunity object to demonstrate the value generated:  def MyoptyID = OptyId def url = adf.util.getObjectURL('Opportunity', MyoptyID) println("Object url is: "+url)  This results in the following output in the runtime messages log: Object url is: https://[myinstance].com:443/sales/faces/mooOpportunityHome?fnd=%252FWEB-INF%252Foracle%252Fapps%252Fsales%252FopptyMgmt%252Fopportunities%252Fui%252Fflow% 252FOpportunityMgmtFlow.xml%2523OpportunityMgmtFlow%3BOptyId%253D300000129380024% 253BByPassSetContext360%253DY%3B%3B%3Bfalse%3B256 The URL here takes the user directly to the Edit Opportunity page as below: As mentioned above, the primary use-case would be to add a link to another related object, where you can derive the ID through the relationship (or via a ViewCriteria query) and pass in the object type. For example you could use adf.util.getObjectURL('Account', PartyId) to create a link which allows you to edit the related Sales Account object. Again use within Custom Objects is also supported.

In the Groovy Palette you will find a few additional Global Functions provided out of the box. One of these is getObjectURL which is available to allow scripts to readily identify a page URL for a...

Application Composer

Translating Your Application Composer / Data Composer Customizations

  As an extension to our previous article on translating customizations, we recently came across the need to support different languages for customizations made in Application Composer. As such this article looks at the options available. Options List The following table summarizes how to translate the various UI visible parts of a customization made using Application Composer. The example below demonstrates the key items from this.   Customization Translation Method Object Page Headings and Texts Done using the User Interface Text feature Field Labels and Help Texts Done using the User Interface Text feature Rule and Trigger Error Messages Done using the User Interface Text feature Confirmation Popup Messages Done using the User Interface Text feature Custom 'Throw Exception' Messages Use custom code, discussed here. General Applications Help Text Language support within the embedded editable help features.   Illustrative Example   First we created a simple custom object called TargetXYZ. The odd name was used to help illustrate the changes. The requirement is for English and French users to be able to work with records created for this object. As such we need to ensure the UI for our French users is complete. Our starting position is shown below. So while most of the generic labels and buttons are fine, we'll want the word 'Target' to be its French equivalent 'Cible' across the board.   Initially we change the logged in session language (to French), then go into the User Interface Text feature. From here we search using the object name (TargetXYZ) and replace it with the session language-specific equivalent, as shown below.      The system finds multiple places where the record name is used within a text string. This is saved and applied in our sandbox.   Having changed several usages of the string, it is most of what we want. We need to do similar for the custom field names on the object also (where the object name wasn't used). Our object just had one extra field - Target Observation - as you can see the RecordName field was included above. As such we submitted another change, in the French session. Note 'observation' is the same word in both French and English.   With all the text adjustments made, below shows the complete translation of the Summary page for our French users (the same applies to the Create and Edit pages): One last thing, we also need to translated the related menu item. The Global Navigator check-box is selected in the UI Text search pop-up and a related translation is submitted, as given below.   As mentioned above, if we had custom rules and triggers which had error messages defined, these could also be found in the User Interface Text feature and a French equivalent entered.   Bulk Translation At this time there is no option to upload a file with many translated texts, as you might like if you have an especially large customization with many objects and fields. As such the steps above need to be followed and if you are interested in this as a new feature please request Oracle Support to add your justifications to Enhancement Request 23534696 for review.

  As an extension to our previous article on translating customizations, we recently came across the need to support different languages for customizations made in Application Composer. As such this...

Integration and PaaS

Platform Services: The Most Common SaaS Use Cases

Introduction This article summarizes our selection of the Oracle Cloud Platform Services (PaaS) with specific focus on use with an existing Oracle Cloud Applications (SaaS) environment. In other content the term PaaS4SaaS has been used for this context. This is the first of a series of articles in which we will use examples to demonstrate some of the key functions and features inside the Oracle PaaS services, and indeed many will be derived from real implementations. Again the focus is on getting value for use with an existing Oracle Fusion Cloud (SaaS) environment, as opposed to a general feature overview. Clearly all services evolve of time, and as such the information provided is accurate at the time of writing, and where possible links to updated content will be provided. Use-Cases In order to organize this series of articles, and at the same time portray the most-common use of each of the services, we've selected the following four broad categories within which to place each of the PaaS service offerings. Build custom extension applications Host your existing extension applications Integrate your existing custom and packaged applications Enhance your solution by adding ready-to-go features.     Obviously there may be some overlap between categories with some services. The following table shows how the PaaS Services which are mostly likely to complement a SaaS environment fit into the categories above. Service Categorization  The following table illustrates the 'primary intent' of our selection of Oracle Cloud Platform Services.   Service Name and Description Build- Host- Integrate- Enhance Mobile Builder Cloud Service - build mobile back-end components for custom mobile applications.       Application Builder Cloud Service - declarative development of web applications.       Database Schema Service - single database schema with the Application Express (APEX) toolset.       BI Cloud Service - build rich analytics based on data uploads.       Sites Cloud Service - used in concert with Document Cloud Service to build micro-websites.       Java Cloud Service SaaS Extension - a Java EE run-time environment for custom applications. Designed for use SaaS.       Application Container Cloud Service - Java SE and Node.js run-time environment.       Integration Cloud Service - SOA-based declarative mapping of integration flows based on prebuilt connectors.       Messaging Cloud Service - JMS and RESTful architecture for push/pull messaging between distributed applications.       Process Cloud Service - SOA-based business process workflow creation.       SOA Cloud Service - use BPEL and associated SOA Suite components to build process-driven solutions.       Social Network Cloud - social collaboration services for business users.       Document Cloud Service - content management and collaboration facilities for business users.         Many of the services above include hosting of the result, however for clarity we've not mentioned this. Also since the focus is on PaaS we are not including Oracle JDeveloper/ADF as a row, although the resulting web applications may be deployed to Oracle Java Cloud Service/SX and programmatically integrated with Fusion Cloud Applications. Subsequent articles will look inside the services listed in this table.

Introduction This article summarizes our selection of the Oracle Cloud Platform Services (PaaS) with specific focus on use with an existing Oracle Cloud Applications (SaaS) environment. In other content...

Groovy

Groovy Tuesday: Using the newValue and oldValue functions

This article looks at some tips-and-tricks when working with previous and current field values. The Basics The oldValue and newValue keywords are simplified built-in functions (listed under Global Functions) rather than complex API calls, as such accept no parameters or require no special syntax. They work only on the current field and apply within the Field Rules feature, itself always returning a Boolean true or false result. For example on the DealSize field on the standard Lead Object let's add a rule. We'll begin with a simple rule which checks the entered amount is greater than 100. If it is not, returning false, the associated Field Rule error message text is shown. newValue > 100   Conditional Rules Field Rule scripts do not support complex IF statements and expect to resolve from just a few simple criteria. As such thought has to go into the rules as they cannot conditionally be applied easily. The solution to this is to have multiple rules on the same field, since they will all get executed sequentially until one fails. Calculation and Increments To illustrate more on newValue and oldValue, let's add another rule which says you cannot increase the DealSize more than double. Here is the simple rule script: (oldValue / newValue) > 0.5 Here is the related message we defined when we more-than-double the Deal Size value: One observation is that oldValue is re-evaluated and stored after the rule is successfully executed, i.e. returns true. As such this example rule can actually be bypassed using small gradual increases that never individually go over doubling the value. Rule Use Cases It would make no sense having a rule like our example applied on the create record page, where out-of-the-box the field value will be null initially. Field Rules have no option to pick a context, so we need to have something in code. As such you could have your rules include a test on the record state using the related API's available. Note that the isModified() method only applies once a change is made, therefore on the edit screen the following statement will work better: && (!getPrimaryRowState().isNew()) Accurate Messaging and Avoiding Rules Whenever the rule returns a false the single error message will show. As such care should be taken to ensure the text applies to all possible outcomes. In the example above, if the rule runs in the Create Record page then it will show the error message whatever the values entered, and in fact the new record can never be committed! One solution is to hide the field from the Create page, as Field Rules are NOT executed for fields not displayed on the UI.  Watch for the NullPointerException In addition on our Rule we should add a nvl() call on the oldValue to avoid a NullPointerException from those new records where the field has no value yet. We'll add a business rule that says if there is no value yet, assume a value of 10 and apply the change rule based on that. So it would pass a value of 15 but fail a value of 21 (!getPrimaryRowState().isNew()) && ((nvl(oldValue,10) / newValue) > 0.5) In our case we also get a NullPointerException if we remove the value from the field on the page, as the newValue now becomes null and the divide will cause the error. As such all calculations using newValue and oldValue should include nvl() function wrappers.  

This article looks at some tips-and-tricks when working with previous and current field values. The Basics The oldValue and newValue keywords are simplified built-in functions (listed under Global...

Oracle

Integrated Cloud Applications & Platform Services