Thursday, May 29, 2014

May Repost: Take a Walk on the Wildcard Side

This is another oldie but goodie, written 5 years ago. Enjoy!

***

It's a very embarrassing moment in the life of a Siebel guy or gal when he or she finds records in the database that shouldn't be there at all.

I am talking about records like these:


It happened to all of us, doesn't it? Instead of querying, you create a new record with the query criteria as data.


The question is now, how can you find (and possibly eliminate) these "quericates"?
Simply querying for [Name] LIKE "*" OR [Name] LIKE "?" obviously won't work.

Here is the solution: Escaping wildcards using the backslash \ character.

The following is a query to retrieve all accounts who have an asterisk in their name:


[Name] LIKE "*\**"

That is one asterisk as a wildcard for any character, then the asterisk itself (escaped with \) and another wildcard for any character.


Works with other wildcards (?) too.

BTW: If you have keywords like AND or OR, or parantheses in your data, you can query for them using a single or double quote at the beginning or use the LIKE operator.

Example 1: LIKE "*AND*" will retrieve all accounts that have the word AND in their name.

Example 2: "Woolworth*(* will retrieve all accounts that start with Woolworth and have an open bracket in their name (note the double quote at the beginning of the query string.

have a nice day

@lex

Monday, May 26, 2014

Migrating Open UI Configuration to Oracle Sales Cloud - A Test Case

Thanks to Jan Peterson for this article

Oracle Sales Cloud has made some significant progress in the past 18 months and has become a very compelling offering. Alex has posted a summary of the R8 release a while ago. Simplified UI is - in my humbled opinion - the biggest improvement of recent releases. It has been introduced with R7 and significantly improved as part of R8.  As part of the R8 release, the configuration capabilities have been significantly enhanced. As I had a bit of time, I decided to test if more complex Open UI configuration examples can be migrated to Simplified UI. The short answer - at least for the example I picked - is "yes".

I have recently posted an article about arbor, a jQuery plug-in that allows to display complex relationship hierarchies. In the Open UI example we used it to display relationships of a contact. For Simplified UI, I picked opportunities as an example. Below a screenshot of the final outcome that shows a opportunity and its related recurring revenue items, contact and resources:


The configuration framework for Simplified UI in R8 is very powerful. Different options exist to achieve the outcome depicted above. As REST-web service support hasn't made it into  R8 I read Angelo Santagata's blog article with interest. Angelo is a Technology Evangelist working for Oracle. In the article Angelo presents a REST facade for Oracle's Sales Cloud.

I was keen to see how this works and decided to use it for my experiment:
  1. I downloaded and installed JDeveloper 11.1.2.4.0 and followed the description in Angelo's article to set up the facade. Angelo recommends to use Oracle Java Cloud - Oracle's Java PaaS service. It seems to be one of the less known facts that Oracle has a comprehensive offering in this space. While the recommendation is definitely correct I decided to use the integrated Weblogic server that comes as part of JDeveloper instead. Apparently this is a valid option for a small test case - for everything beyond a simple test case Java Cloud is the recommended option.
  2. Taking the original Open UI PR, removing all Open UI specifics and migrating it to a standalone html page turned out to be surprisingly painless. Plugging in the call to the REST facade and extracting the returned information was also straight forward, especially as JQuery provides easy API's for this use case.The final html-file can be downloaded here
  3. I deployed the standalone html page to the local web server that comes with Weblogic following the instructions given here. As the files gets embedded via an iFrame into Sales Cloud and Sales Cloud is using SSL-encryption the web page needs to get exposed via SSL.
  4. Eventually the HTML file needed to be embedded in Sales Cloud using the Application Composer. As the HTML page expects the current opportunity as a parameter we have to write a very simple Groovy-statement to pass the id:
Application Composer

Summary

While Sales Cloud doesn't have the depth and breadth of configuration capabilities of Open UI (yet?) it provides comprehensive options to tailor the user experience. As the Open UI capabilities come with some complexity, the Sales Cloud configuration framework is easy to master. In addition, combining Sales Cloud with a Java-based PaaS service - such as Oracle's Java Cloud - opens up a new world of opportunities.

have a nice day

Jan

Thursday, May 22, 2014

Siebel Open UI: Format All the Lists - Part 2

In continuation of our mini-series, we will today explore an example solution for a generic physical renderer extension for list applets in Siebel Open UI.

As discussed in the previous part, the solution we want to achieve is that we can define a list of fields which should be conditionally formatted if they are exposed as columns on a list applet. The implementation uses custom applet user properties which are exposed to the physical renderer by a custom presentation model extension.

Today, the focus is on the physical renderer. Before we start, let me reiterate that many ways lead to Rome and the solution presented below is purely educational and should you intend to use it in any environment, including production environments, you do so at your own risk.

Implementing a Physical Renderer for Conditional Formatting

We start with the usual procedure of creating a physical renderer extension file and registering it with a test applet (e.g. the Opportunity List Applet). Remember that the Oracle class for list applet PRs is JQGridRenderer, so this is the correct call for SiebelJS.Extend():

SiebelJS.Extend(ConditionalFormatListPR, SiebelAppFacade.JQGridRenderer);

As the formatting takes place when the data is present in the applet, the BindData method is the one we must override, as this method populates the grid cells with the actual data and is called frequently enough (e.g. after a record is updated or during scrolling) for a first prototype.

The following shows the example implementation of the BindData method:

Click to enlarge.
The code accomplishes the following:
  • Initialize variables with the values of the applet user properties by using the PM�s Get method.
  • Verify that a list of fields is actually defined for the applet. If yes, the code continues. If not, the else block is reached and a console message is logged.
  • Split the comma separated lists into arrays using the split function.
  • Use the GetColMap method of the object returned by the GetColumnHelper method to get a list of columns and their respective business component field names. Note that the two methods used here are specific to physical renderers for list applets and are not documented.
  • Iterate through the array of fields. For each field, a second loop iterates through the column list and tries to locate a column associated with that field. When a column is found, the ConditionalFormat method (to be implemented below) is invoked and the name of the column as well as the accompanying threshold value are passed as arguments.
The following is the first part of the custom ConditionalFormat function which actually handles the formatting.

Click to enlarge
This part of the custom function does the following:
  • Get the current record set from the GetRecordSet property, i.e. all records currently visible in the list applet.
  • Get the applet placeholder which will be used to identify the applet and its child elements.
  • Get the column map for the applet.
  • Retrieve the business component field name for the current column from the column map.
  • Access the column header using the jQuery $() function.
  • Use the jQuery click() event handler to specify a function which is executed when the end user clicks the column header. This function uses the event object to determine whether the CTRL key has been pressed while clicking. If this is the case, the click event handler function uses the stopImmediatePropagation() method to prevent the click event from �bubbling�, i.e. attracting other event handlers.
  • For demonstration purposes, a simple prompt() dialog is used to solicit the new target value from the end user. This could be replaced by a more comfortable jQuery dialog or similar in a real production setting. Finally, the click event handler function invokes the ConditionalFormat method (recursively) to refresh the formatting.
  • By adding an img tag to the existing column header HTML code, the function effectively provides a visual cue to the end user that the column and its header have a special purpose. The example code also modifies the title attribute to produce a tooltip message.
Now that we have all variables initialized and the column header modified, we can implement a loop through the record set to take care of each cell's background color:

Click to enlarge.
This final loop does the following:
  • Retrieve the pseudo row identifier (1,2,3 and so forth).
  • Select the current row using the jQuery find method.
  • Select the grid cell for the column.
  • Retrieve the cell�s value, which is actually the formatted and localized value.
  • Use the replace function to remove characters like $, % or commas from the value string (watch out for localization issues here, the example is for the ENU locale).
  • Convert the string to a floating point number.
  • Calculate the share of the current value in percent of the target (threshold) value.
  • Calculate the green and red color components for the current share. The algorithm increases the green value until the share reaches 50% and then reduces the red value. This results in a red/yellow/green color gradient.
  • Use the calculated color to set the background of the cell with the jQuery css() method. For compatibility reasons the example code shows how to set a solid background as well as use the vendor specific linear-gradient CSS rules. A browser which understands the linear-gradient rule will apply it, other browsers will show a solid background.
After correctly associating this physical renderer example with a test list applet which has the necessary user properties defined, we can verify that the behavior is expected. Here is a screenshot of the sales order list applet after specifying the NRC Total field for conditional formatting.

Click to enlarge.
After the test with a single list applet, we can modify the manifest administration to use the DEFAULT LIST APPLET entry for a physical renderer. Be aware that even the slightest error in the custom code could render any list applet unusable, including the ones you would need to undo your changes. If you find yourself in this undesirable situation, either rename the custom JavaScript file, so the browser can't download it or use the High-Interactivity client to access the Manifest Administration view.

Summary

The educational example in this and the previous article demonstrates the possibility of writing generic presentation model and physical renderer extensions for list applets. By externalizing as much code as possible we can limit the amount of code to achieve a consistent behavior across all UI objects of the same type.

Full Code Examples

The full code examples (for IP 2013 or higher) are available for download:


have a nice day

@lex

Monday, May 19, 2014

Siebel Open UI: Format All the Lists - Part 1

In an attempt for a real-life scenario of customizing the appearance of all list applets in a Siebel Open UI enabled application, I would like to introduce you to a coding experiment for conditional formatting of list columns.

As usual, let's see what we want to achieve:

Click to enlarge.
As you can see from the above screenshot, the Opportunity List Applet has two columns - Revenue and Probability % - which are conditionally formatted depending on their value. End users are able to use CTRL+click on the column header to display a prompt where they can enter a target value to influence the background color of the cells.

This solution should be applicable to all list applets. In this and the following post, I will lay out the steps to achieve a generic solution for the requirement presented above. The example solution focuses on numeric columns but can be easily applied to other data types as well.

The following are the main ingredients:

  • Applet User Properties
  • Custom Presentation Model
  • Custom Physical Renderer

Today, we'll focus on the first two points:

Using Custom Applet User Properties in Siebel Open UI

As a frequent reader of this blog, you are aware of the ClientPMUserProp applet user property introduced with Innovation Pack 2013. This user property is used by Oracle to define standard applet behavior such as drag and drop to and from list applets or collapsible/expandable headers.

We can also define our own custom user properties and - as they will be forwarded to the Open UI framework - can use them in the browser-side code to control the behavior of our customizations.

To implement the conditional formatting example, I chose to define two custom user properties:

  • CF Field List: A comma separated list of business component fields which - should they be exposed as list columns - will be conditionally formatted.
  • CF Threshold List: A comma separated list of numeric values which defines the default target values for the respective fields.

To add these user properties to an applet, we have to edit the applet in Siebel Tools and do the following:

  1. Open the list of Applet User Properties for the applet.
  2. Create three new user property records as follows:



Name
Value
ClientPMUserProp
CF Field List, CF Threshold List
CF Field List
Primary Revenue Amount,Primary Revenue Win Probability
CF Threshold List
500000,50

The above settings apply to any list applet using the Opportunity business component, for example the Opportunity List Applet.

Here is a screenshot documenting the work:

Click to enlarge.
We have to consider that when the ClientPMUserProp user property is already defined for an applet, we must add our new user properties to the list, using commas as the separator. Alternatively, the user property can be sequenced, so we can define multiple instances like ClientPMUserProp1, ClientPMUserProp2 and so forth.

With this technique we can define a list of fields which should be conditionally formatted and the default target value for any list applet. Of course the field names must match exactly those of fields available in the applet's BC.

Ah, and yes, don't forget to compile the applet(s).

Accessing Custom User Properties in a Presentation Model

Any user property defined in the ClientPMUserProp value will be propagated to the property set used to set up the presentation model of the UI object.

As Siebel Bookshelf states, we can currently do this with individual controls, applets or views. To be able to access the values of the custom user properties, we must extend the presentation model and override the Setup method of the custom PM. This is because the Setup method receives a reference to the current object's property set.

The following code shows the Setup method of a custom presentation model extension class, accessing the user properties we created above.

Click to enlarge. Example code for IP 2013 (8.1.1.11)
The screenshot shows the full code with the important lines highlighted.

As you can see, we use a reference to the Oracle-defined set of constants to retrieve the name of the property set containing the applet user properties (SWE_APPLET_PM_PS). This is a recommended practice to avoid issues should Oracle engineering decide to change the naming convention in a future release.

Then we can use the GetProperty method of the property set to retrieve the values of the two custom user properties we created in the first step in Siebel Tools and store them as "local" PM properties so that we can easily access them from the physical renderer.

The custom presentation model must be administered in the manifest as usual and associated with a test list applet (recommended) and later with the DEFAULT LIST APPLET entry (IP 2013 and later). For testing purposes it is recommended to use a single test applet and use SiebelJS.Log() to print the user property values to the browser's JavaScript console.

The Story so far

With the above configurations, we have set the foundation for writing a generic physical renderer extension for list applets which evaluates the user properties and formats the respective list columns accordingly.

Please stay tuned for the second part of this mini-series where we will discuss a possible approach for this solution.

have a nice day

@lex

Wednesday, May 14, 2014

Siebel Open UI Developer's Handbook - Announcement

It is not without some parental joy that we announce a new Siebel CRM book to be published this winter.

Together with three of the most distinguished Siebel Open UI experts, this humble writer is currently working on putting together useful information and case studies for the upcoming book:

In this book, you will:
  • Learn all about the Siebel Open UI Architecture
  • Learn to create custom Presentation Models and Physical Renderers
  • Learn advanced techniques for Open UI customization
  • Understand how to apply custom styles and themes
  • Customize and deploy Siebel Mobile Applications
  • Integrate Siebel Open UI with external applications
  • and more (see below)
As a frequent reader of this blog, you know that the book authors are truly committed to sharing information:
  • Duncan Ford
  • Alexander Hansal
  • Kirk Leibert
  • Jan Peterson
We expect the book to be published in Winter 2014/2015 and plan to align it with Siebel CRM Innovation Pack 2014. We are happy to announce as well that you can participate in shaping the book's content and get notified when it is available by filling in a simple form.

Please feel encouraged to grab this opportunity and create a book designed by and for the Siebel developer community.

have a nice day

@lex

Monday, May 12, 2014

Oracle Launches Customer 2 Cloud Program

In his Siebel Observer publication, Bruce Daley informs us that Oracle changes its policies to allow Siebel support fees to be applied to Cloud products.



***

Oracle Corporation (NYSE: ORCL)  has announced new licensing policies that make it easier to exchange Siebel shelf ware for other CX products. Called the Customer 2 Cloud program, the new policies hope to overcome some of the common financial and technical problems Oracle customers experience in transitioning from Oracle on-premise software to Oracle software-as-a-service Cloud products. The Customer 2 Cloud program allows Oracle HCM and CRM customers to exchange some of their on-premise support budget for new Oracle Cloud products.

"The Customer 2 Cloud program helps organizations get their hands on the latest technology," says Rod Johnson, group vice president, Oracle Applications and Industries Solutions Group. "This program aims to remove the financial and integration challenges that can impact a company's adoption."

Oracle Customer 2 Cloud program is open to Oracle CRM and Oracle HCM customers that are running Oracle's Siebel, Oracle E-Business Suite, Oracle's PeopleSoft and Oracle's JD Edwards EnterpriseOne solutions on-premise. Oracle customers also have the flexibility to shift to a hybrid model with both on-premise and cloud applications.

Customers can convert their existing on-premise support budget to subscribe to Oracle Customer Experience Cloud and Oracle Human Capital Management Cloud services within the same product family. For example, a customer with on-premise seats for Oracle Siebel eService can transfer those seats to Oracle Marketing Cloud.

For more information about the details of the program see http://www.oracle.com/us/corporate/features/customer2cloud/index.html

***

This article was originally published on the Siebel Observer web site.

have a nice day

@lex

Friday, May 9, 2014

Rittman Mead BI Forum 2014: Day 3

This year's BI Forum in Brighton is a wrap. Here is a quick account of what wisdom and knowledge was shared by the speakers on the final day.

The first slot was by Truls Bergensen on how will of Endeca fit in to the Oracle BI topography.

Next it was Nicholas Hurt and Michael Rainey demonstrating how to replace OWB/Streams with ODI/GoldenGate to achieve real-time data warehousing.

Then it was cloud time again as Matt Bedin went through a demo of the imminent Oracle BI Cloud.


The afternoon saw Gianni Ceresa talking about Essbase within and without OBIEE and TED-style talks by Marco Klaassens and Christian Berg.

The final talk of the conference was Alistair Burgess on tuning TimesTen with aggregate persistence.

And while everyone is heading home let me thank the good people at Rittman Mead for another truly impressive and well-organized conference.

As someone who "grew up" with the Oracle BIEE stack since Siebel Systems acquired nQuire, the broad variety of topics such as GoldenGate, ODI, Endeca, etc. proves that the OBIEE landscape has evolved into much more than just Answers and Dashboards.

Oracle and its partners do a great job to integrate all the different technologies and push them to the cloud.

have a nice day

@lex

Thursday, May 8, 2014

Rittman Mead BI Forum 2014: Day 2

The second day of this year's installation of Rittman Mead's BI Forum in Brighton saw some impressive content and brilliant presentation. These speakers kept the audience engaged.

Emiel van Bockel showed how you can achieve sub-second response times for thousands of concurrent users querying against hundreds of millions of rows in just two years and with just one Exalytics box.

Oracle's Chris Jenkins took the crowd for a deep dive into TimesTen for Exalytics.

Robin Moffatt told us there are no silver bullets but a lot of golden rules when it comes to measuring and optimizing OBIEE Performance in the real world.
Coming soon to a screen near you: The Oracle BI Cloud. Adam Bloom of Oracle did a "behind the scenes" talk about this soon-to-be addition to the Oracle Cloud.

Following 15 minute TED-style talks and some refreshements, Andrew Bond and Stewart Bryson closed the day with a presentation on Big Data architecture for the enterprise.

As is customary for Rittman Mead events, delegates enjoyed a gala dinner. The location was - interestingly enough - St Georges Church in Brighton.

Rittman Mead BI Forum 2014: Day 2

The second day of this year's installation of Rittman Mead's BI Forum in Brighton saw some impressive content and brilliant presentation. These speakers kept the audience engaged.

Emiel van Bockel showed how you can achieve sub-second response times for thousands of concurrent users querying against hundreds of millions of rows in just two years and with just one Exalytics box.

Oracle's Chris Jenkins took the crowd for a deep dive into TimesTen for Exalytics.

Robin Moffatt told us there are no silver bullets but a lot of golden rules when it comes to measuring and optimizing OBIEE Performance in the real world.
Coming soon to a screen near you: The Oracle BI Cloud. Adam Bloom of Oracle did a "behind the scenes" talk about this soon-to-be addition to the Oracle Cloud.

Following 15 minute TED-style talks and some refreshements, Andrew Bond and Stewart Bryson closed the day with a presentation on Big Data architecture for the enterprise.

As is customary for Rittman Mead events, delegates enjoyed a gala dinner. The location was - interestingly enough - St Georges Church in Brighton.

Wednesday, May 7, 2014

Rittman Mead BI Forum 2014: Day 1

This year's BI Forum in Brighton, UK has started with a Big Data masterclass with Lars George from Cloudera titled "Hadoop, HBase, NoSQL and What These Mean for Oracle BI&DW Developers"


Lars' knowledge is encyclopedic to say the least. The crowd gasped as he presented the vast array of funny-named tools that have evolved around HDFS and hadoop over the past 10 years.

For anyone, including of course BI and DW developers, with a professional interest in crunching data in large volumes or at high speed or both, the hadoop ecosystem provides us with a vast array of tools such as Pig, Flume, Hue, Parquet, Squoop, Impala, HBase or Oozie, just to name a view. All of which (and more) Lars managed to present in uncanny depth and breadth of detail.

For those among you with further interest, you might want to peruse the search engine of your choice as well as the virtual machines available from Cloudera or Oracle to get started.

Cloudera also provides a live playground environment via the internet.

The evening of day one saw the crowd relaxing at the drinks reception and listening to Oracle's Matt Bedin delivering the traditional keynote under the - traditional as well - NDA. But let's say this much: Interesting times ahead ;-)

If you can't make it to the BI Forum this year, check out the delegates' tweets (#biforum2014)

have a nice day

@lex

Siebel Mobile Web Client Statement of Direction 2014

If you or your customers are using the Siebel Mobile Web Client along with Siebel Remote technology, you should log in to My Oracle Support as soon as your time allows and get the latest Statement of Direction (SOD) document which lays out Oracle's plans for this technology as well as the future roadmap for Siebel Mobile Disconnected Applications.
Image source: Siebel Systems training material
The document is numbered 1663459.1 and can be found here (My Oracle Support account required).

have a nice day

@lex

Tuesday, May 6, 2014

Rittman Mead BI Forum 2014 in Brighton

It's this time of the year again when the good people at Rittman Mead gather the most prolific BI experts in Brighton and Atlanta. This humble writer also secured a seat at the UK event which starts this Wednesday.


Day 1 will be a Masterclass on Hadoop with George Lars and the following two days are filled with BI goodness and expert talks such as TimesTen, Performance Tuning and Cloud Analytics.

Apart from the doubtless magnificent content, I am especially looking forward to meet the world's leading BI experts in person.

As usual, I will report to you via blog posts and tweet live from the event.

have a nice day

@lex

Monday, May 5, 2014

Siebel CRM Patch Set 7 for Innovation Pack 2013 is Available

Last Saturday, Oracle made the latest patch set 8.1.1.11.7 / 8.2.2.4.7 available for download on My Oracle Support.


Apart from various bugfixes, including the Open UI and Mobile Applications realm, the patch set includes changes to the eScript ST engine which are described in document 1668366.1.

As usual, the patch set comes with a button that says "Read Me" which leads you to the installation guide which also contains descriptions of the resolved issues.

(All links require a valid account for My Oracle Support)

have a nice day

@lex

Thursday, May 1, 2014

Siebel Open UI: A Form Apart

Time for another Open UI adventure. In this article, I would like to show you the results of an experiment.

If you watch the Siebel Open UI space attentively, you are sure aware of the introduction of presentation models and physical renderers for views in monthly patch 8.1.1.11.3. And this is exactly what I tried.

What I had in mind was a way to select a record in a list applet of a parent list view (e.g. the "My Accounts" view) and to view details about the record in a form nearby. Of course there is a form applet at the bottom of the view, but what if the end user has clicked the Show More button in the list and needs the information on some other location on her or his screen.

Let's see a screenshot of my experimental solution:

Click to enlarge
 As you can see, the form applet is no longer bound to the bottom of the view. It (or to be more precise, its content) is now displayed in a jQueryUI dialog so the end user is free to move it around, resize it or close it.

What can not be seen on the above screenshot is that the dialog content is refreshed when the user selects a different record in the list.

Another benefit of this solution is that we reuse the existing form applet layout, so we can use Siebel Tools to design the form instead of having to create a form "on the fly". Thus, we save a lot of lines of code.

And here are the steps to implement this (remember, you must apply at least patchset 8.1.1.11.3 for this to work).

1. Create and register a custom view physical renderer extension

Physical renderers (PRs) for views are not really different from PRs for applets. Here is the template I created to get started quickly:

Click to enlarge
If you compare the above code with an applet PR, you'll find that it has the same methods apart from the SetRenderer method.

As fellow Open UI journeyman Jan has pointed out in a previous article, a view PR's Init and Setup method are invoked before the preload event. The SetRenderer method is called after preload but before postload. The EndLife method is called when the user leaves the view.

To register a view PR, you follow the same steps as for any custom file. But of course you choose a view instead of an applet in the manifest administration view. The screenshot below shows my two "victim" views, namely the Quote List View and the Account List View.

Click to enlarge
Both views are now associated with my custom physical renderer file.

2. Implementing the "form in a dialog"

The following code shows the SetRenderer method with my approach to display the form applet of a parent list view in a jQueryUI dialog.

Part 1. Click to enlarge

Part 2. Click to enlarge
The code does the following:

  1. Get the applet map of the current view.
  2. Loop through the applet map, store business component names and count list and form applets.
  3. For the form applet, get the presentation model and the element id.
  4. If the view has only one list and only one form applet which are based on the same BC, we have a parent list view and can start creating the dialog.
  5. To get the form applet's content, I refer to the table.GridBack selector which represents the main content table of a form applet without the title and buttons.
  6. The HTML of the main form is wrapped within a DIV element for easier identification.
  7. Now we can use the jQueryUI dialog widget to create the dialog proper.
  8. To ensure the dialog content is matching the current record, we attach to the ShowSelection method of the form applet PM.
  9. When the ShowSelection method is executed, we can loop through the form applet's controls and populate their identical twins in the dialog with the formatted field values.
  10. Finally we set the dialog fields to read-only and hide the original form applet.

Summary

Using a custom physical renderer for a view, we can release content displayed in that view and display it in various ways. The above example showed how to accomplish a "floating form applet" in a parent list view.

And because you were patient with me and imbibed the article until here, you can now download the full code example:

View PR Template
Floating Form PR

have a nice day

@lex