<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bryan Thompson - Oracle Consultant &#187; Technical</title>
	<atom:link href="http://www.bryanthompsononline.com/oracle/category/technical/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bryanthompsononline.com/oracle</link>
	<description>A forum for sharing Oracle knowledge!</description>
	<lastBuildDate>Sun, 30 May 2010 15:56:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Setting Organization Context in Oracle R12</title>
		<link>http://www.bryanthompsononline.com/oracle/2009/02/03/setting-organization-context-in-oracle-r12/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2009/02/03/setting-organization-context-in-oracle-r12/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 02:37:00 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[R12]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2009/02/03/setting-organization-context-in-oracle-r12/</guid>
		<description><![CDATA[For those of you who are trying to set the organization context within your SQL sessions or custom programs, there&#8217;s a new API you must call in R12.
The previous way of setting organization context in 11i was to execute the following statement:
dbms_application_info.set_client_info(ORG_ID); 
However, in R12, the new way of setting the organization context is as [...]]]></description>
			<content:encoded><![CDATA[<p>For those of you who are trying to set the organization context within your SQL sessions or custom programs, there&#8217;s a new API you must call in R12.</p>
<p>The previous way of setting organization context in 11i was to execute the following statement:</p>
<blockquote><p><em>dbms_application_info.set_client_info(ORG_ID); </em></p></blockquote>
<p>However, in R12, the new way of setting the organization context is as follows:</p>
<blockquote><p><em>mo_global.init(&#8217;AR&#8217;);<br />
mo_global.set_policy_context(&#8217;S',ORG_ID); </em></p></blockquote>
<p>The â€˜S&#8217; parameter indicates a single organization context. Replace ORG_ID with the ID of the operating unit you wish to use. You can also set a context for multiple operating units by setting the security profile. This is done by executing the following statement:</p>
<blockquote><p><em>mo_global.set_org_access(NULL,SECURITY_PROFILE_ID,&#8217;ASO&#8217;); </em></p></blockquote>
<p>Replace SECURITY_PROFILE_ID with the ID of the appropriate security profile.  &#8216;ASO&#8217; represents the application short name associated with the responsibility you&#8217;ll be using.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2009/02/03/setting-organization-context-in-oracle-r12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pricing Qualifiers &#8211; How They Work and Creating Your Own Part II</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/09/12/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own-part-ii/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/09/12/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own-part-ii/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 18:30:16 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Advanced Pricing]]></category>
		<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/09/12/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own-part-ii/</guid>
		<description><![CDATA[In my last Qualifier article, I delved into the inner workings of Qualifiers in Advanced Pricing by walking through a quick demo of how to setup a Qualifier to reference Descriptive Flexfield data on a sales order transaction. In this article, I'd like to touch on how some Qualifiers require more advanced PL/SQL techniques to retrieve transactional data. For example, the "Customer Party ID" is tied to QP_SOURCING_API_PUB.GET_PARTY_ID function call because the Party ID isn't stored directly in the G_HDR record structure. With that said, lets walk-thru the creation of a Qualifier that requires us to create our own PL/SQL function reference...]]></description>
			<content:encoded><![CDATA[<p>In my last Qualifier article, I delved into the inner workings of Qualifiers in Advanced Pricing by walking through a quick demo of how to setup a Qualifier to reference Descriptive Flexfield data on a sales order transaction. In this article, I&#8217;d like to touch on how some Qualifiers require more advanced PL/SQL techniques to retrieve transactional data. For example, the &#8220;Customer Party ID&#8221; is tied to QP_SOURCING_API_PUB.GET_PARTY_ID function call because the Party ID isn&#8217;t stored directly in the G_HDR record structure. With that said, lets walk-thru the creation of a Qualifier that requires us to create our own PL/SQL function reference.</p>
<p>Let&#8217;s say that we have a requirement to qualify Modifier discounts against specific customer account numbers. Oracle provides us with a Qualifier for a customer&#8217;s Party ID, but does not provide a Qualifier for account number &#8211; we&#8217;ll need our own custom API to accomplish this.</p>
<p>Before we start, let&#8217;s not forget that a sales order could have multiple customer&#8217;s associated with the transaction. Remember that we can have up to three customers on a sales order that represent the selling, billing, and shipping organizations (there are even more when factoring in deliver to and installed at, but for this example let&#8217;s focus on the main three). The business requirements behind the discount could determine that we only need one of the three, but let&#8217;s assume that discounts could be applied to any of the selling, billing, and shipping customers. Hence, we&#8217;ll need three Qualifiers to represent each.</p>
<p>Let&#8217;s start by navigating to Setup &gt; Attribute Management &gt; Contexts and Attributes to choose our Context and create our core Attribute information. Since this Attribute will be mapped to a value stored on the customer master record, it&#8217;s most appropriate to place our attribute under the Customer context.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual1.png" /></p>
<p>Next, let&#8217;s add three Attribute records under the Attributes block with the appropriate Codes, Names, and Descriptions that will represent our sold to, bill to, and ship to customer account numbers. I&#8217;ve also decided to use a seeded Customer Account Value Set to validate our attributes against a valid list of customer account numbers.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual2.png" /></p>
<p>Lastly, we&#8217;ll need to assign an available column. As in my previous example, I&#8217;d recommend selecting a column that is a distance away from the last column that is being used to avoid any conflicts (in case Oracle decides to introduce new qualifying attributes in the future).</p>
<p>Now let&#8217;s navigate to Setup &gt; Attribute Management &gt; Attribute Linking and Mapping to map our Customer Account attributes. Select Order Fulfillment for Pricing Transaction Entity and Qualifier Context for Context Type, choose Customer as the Context, and click the Link Attributes button.</p>
<p>Once the Link Attributes form is open, we&#8217;ll add three new records for our Attributes. Since customer information is stored on the header AND line detail of a sales order transaction, our Level will be Both, followed by Attribute Mapping as our Attribute Mapping Method since we&#8217;re going to be referencing a PL/SQL function to retrieve our customer account number values.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual3.png" /></p>
<p>After saving your changes, we&#8217;ll want to begin mapping all three attributes. Let&#8217;s start with the Customer Sold To Account Number by clicking on the corresponding record and clicking the Attribute Mapping button. Once the Attribute Mapping form appears, select the ONT reference record for Order Management.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual4.png" /></p>
<p>Since we indicate Both as our reference level, we&#8217;re required to provide mapping references for both the Header and Line Source setups. At this point we know that our Source Type will be a PL/SQL API for each, but now here comes the hard point &#8211; exactly what PL/SQL will enable us to retrieve the Customer Sold To Account Number?</p>
<p>Going back to our Customer Party ID example, we see that this Qualifier is mapped to an Oracle seeded function called QP_SOURCING_API_PUB.GET_PARTY_ID.</p>
<blockquote><p><span style="font-size: 8pt; font-family: Courier New">QP_SOURCING_API_PUB.GET_PARTY_ID(OE_ORDER_PUB.G_HDR.sold_to_org_id) </span></p>
<p><span style="font-size: 8pt; font-family: Courier New">QP_SOURCING_API_PUB.GET_PARTY_ID(OE_ORDER_PUB.G_LINE.sold_to_org_id)<br />
</span></p></blockquote>
<p>We&#8217;ll need to create our own similar function in order to retrieve the sold to customer account. At a table level, since the order header (OE_SALES_ORDER_LINES_ALL) and order lines (OE_SALES_ORDER_LINES_ALL) contain direct references to the sold to customer (SOLD_TO_ORG_ID), and since the customer account number is stored directly in the customer master view (HZ_CUST_ACCOUNTS), we can build an almost identical query compared to what the seeded Customer Party ID function.</p>
<p>So given the SOLD_TO_ORG_ID of the sales order transaction, we can create a function that accepts SOLD_TO_ORG_ID as a parameter and retrieves the customer account number. We&#8217;ll need to build our own package which includes this function, so I created a package called <span style="background-color: white">XQP_SOURCING_API_PU</span>B. This package will contain all of our custom functions needed to retrieve custom Qualifier values:</p>
<blockquote><p>              </p></blockquote>
<blockquote><p><span style="color: blue; font-family: Courier New; background-color: white">CREATE </span><span style="color: blue; font-family: Courier New; background-color: white">OR </span><span style="color: blue; font-family: Courier New; background-color: white">REPLACE </span><span style="color: blue; font-family: Courier New; background-color: white">PACKAGE </span><span style="color: blue; font-family: Courier New; background-color: white">BODY</span><span style="color: black; font-family: Courier New; background-color: white"> APPS</span><span style="color: blue; font-family: Courier New; background-color: white">.</span><span style="color: black; font-family: Courier New; background-color: white">XQP_SOURCING_API_PUB </span><span style="color: blue; font-family: Courier New; background-color: white">AS</span></p></blockquote>
<blockquote><p><span style="color: blue; background-color: white">FUNCTION</span><span style="color: black; background-color: white"> GET_SOLD_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">p_sold_to_org_id </span><span style="color: blue; background-color: white">IN </span><span style="color: blue; background-color: white">NUMBER)</span><br />
<span style="color: blue; background-color: white">RETURN </span><span style="color: blue; background-color: white">varchar2</span><br />
<span style="color: blue; background-color: white">IS</span></p>
<p><span style="color: black; background-color: white">l_sold_to_account_number </span><span style="color: blue; background-color: white">varchar2(</span><span style="color: maroon; background-color: white">30</span><span style="color: blue; background-color: white">);</span></p>
<p><span style="color: blue; background-color: white">CURSOR</span><span style="color: black; background-color: white"> get_sold_to_account_number_cur </span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">l_sold_to_org_id </span><span style="color: blue; background-color: white">NUMBER)</span><br />
<span style="color: blue; background-color: white">IS</span><br />
<span style="color: blue; background-color: white">SELECT</span><span style="color: black; background-color: white"> account_number</span><br />
<span style="color: blue; background-color: white">FROM</span><span style="color: black; background-color: white"> hz_cust_accounts</span><br />
<span style="color: blue; background-color: white">WHERE</span><span style="color: black; background-color: white"> cust_account_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> l_sold_to_org_id</span><span style="color: blue; background-color: white">;</span></p>
<p><span style="color: blue; background-color: white">BEGIN</span></p>
<p><span style="color: blue; background-color: white">OPEN</span><span style="color: black; background-color: white"> get_sold_to_account_number_cur </span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">p_sold_to_org_id</span><span style="color: blue; background-color: white">);</span><br />
<span style="color: blue; background-color: white">FETCH</span><span style="color: black; background-color: white"> get_sold_to_account_number_cur </span><span style="color: blue; background-color: white">INTO</span><span style="color: black; background-color: white"> l_sold_to_account_number</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">CLOSE</span><span style="color: black; background-color: white"> get_sold_to_account_number_cur</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">RETURN</span><span style="color: black; background-color: white"> l_sold_to_account_number</span><span style="color: blue; background-color: white">;</span></p>
<p><span style="color: blue; background-color: white">EXCEPTION</span><br />
<span style="color: blue; background-color: white">WHEN </span><span style="color: red; background-color: white">OTHERS </span><span style="color: blue; background-color: white">THEN</span><br />
<span style="color: blue; background-color: white">RETURN </span><span style="color: blue; background-color: white">NULL;</span></p>
<p><span style="color: blue; font-family: Courier New; background-color: white">END</span><span style="color: black; font-family: Courier New; background-color: white"> GET_SOLD_TO_ACCOUNT_NUMBER</span><span style="color: blue; font-family: Courier New; background-color: white">;</span></p></blockquote>
<blockquote><p><span style="color: blue; background-color: white">END</span><span style="color: black; background-color: white"> XQP_SOURCING_API_PUB</span><span style="background-color: white">;</span></p></blockquote>
<p>Let&#8217;s compile and confirm that our PL/SQL runs successfully. We need to also be sure to include the package specification before compiling the above source.</p>
<p>Now that we have our function, we need to complete our Attribute Mapping setup by including in the User Value field the PL/SQL reference to this function both in the Header and Line setups. Our function accepts the SOLD_TO_ORG_ID as a parameter, so by using the G_HDR and G_LINE record structures, we can pass this value as our parameter.</p>
<blockquote><p><span style="color: black; background-color: white">XQP_SOURCING_API_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">GET_SOLD_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">OE_ORDER_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">G_HDR</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">sold_to_org_id</span><span style="background-color: white">)</span></p>
<p><span style="color: black; background-color: white">XQP_SOURCING_API_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">GET_SOLD_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">OE_ORDER_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">G_LINE</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">sold_to_org_id</span><span style="background-color: white">)</span></p></blockquote>
<p>Finished! Let&#8217;s go to the Tools file menu and select &#8220;Build Attribute Mapping Rules&#8221; to confirm our setups are correct.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual5.png" /></p>
<p>We&#8217;ve successfully built our Sold To Customer Account Qualifier, but we still need separate PL/SQL functions for the customer bill to and ship to account Qualifiers. On the OE_ORDER_HEADERS_ALL and OE_ORDER_LINES_ALL tables we have a reference to the BILL_TO_ORG_ID and INVOICE_TO_ORG_ID columns, but these ID&#8217;s refer to the site usage records in HZ_CUST_SITE_USES. With that said, our queries for these functions will be slightly different than the sold to function.</p>
<blockquote><p><span style="color: blue; background-color: white">FUNCTION</span><span style="color: black; background-color: white"> GET_SHIP_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">p_ship_to_org_id </span><span style="color: blue; background-color: white">IN </span><span style="color: blue; background-color: white">NUMBER)</span><br />
<span style="color: blue; background-color: white">RETURN </span><span style="color: blue; background-color: white">varchar2 </span><span style="color: blue; background-color: white">IS</span></p>
<p><span style="color: black; background-color: white">l_ship_to_account_number </span><span style="color: blue; background-color: white">varchar2(</span><span style="color: maroon; background-color: white">30</span><span style="color: blue; background-color: white">);</span></p>
<p><span style="color: blue; background-color: white">CURSOR</span><span style="color: black; background-color: white"> get_ship_to_account_number_cur </span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">l_ship_to_org_id </span><span style="color: blue; background-color: white">NUMBER)</span><br />
<span style="color: blue; background-color: white">IS</span><br />
<span style="color: blue; background-color: white">SELECT</span><span style="color: black; background-color: white"> c</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">account_number</span><br />
<span style="color: blue; background-color: white">FROM</span><span style="color: black; background-color: white"> hz_cust_acct_sites </span><span style="color: blue; background-color: white">a,<br />
</span><span style="color: black; background-color: white">hz_cust_site_uses b</span><span style="color: blue; background-color: white">,<br />
</span><span style="font-size: 8pt; color: black; font-family: Courier New; background-color: white">hz_cust_accounts c</span><br />
<span style="color: blue; background-color: white">WHERE</span><br />
<span style="color: blue; background-color: white">a.</span><span style="color: black; background-color: white">cust_acct_site_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> b</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">cust_acct_site_id</span><br />
<span style="color: blue; background-color: white">AND</span><span style="color: black; background-color: white"> b</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">site_use_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> l_ship_to_org_id</span><br />
<span style="color: blue; background-color: white">AND</span><span style="color: black; background-color: white"> b</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">site_use_code </span><span style="color: blue; background-color: white">= </span><span style="color: red; background-color: white">&#8216;SHIP_TO&#8217;</span><br />
<span style="color: blue; background-color: white">and </span><span style="color: blue; background-color: white">a.</span><span style="color: black; background-color: white">cust_account_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> c</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">cust_account_id</span><span style="color: blue; background-color: white">;</span></p>
<p><span style="color: blue; background-color: white">BEGIN</span><br />
<span style="color: blue; background-color: white">OPEN</span><span style="color: black; background-color: white"> get_ship_to_account_number_cur </span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">p_ship_to_org_id</span><span style="color: blue; background-color: white">);</span><br />
<span style="color: blue; background-color: white">FETCH</span><span style="color: black; background-color: white"> get_ship_to_account_number_cur </span><span style="color: blue; background-color: white">INTO</span><span style="color: black; background-color: white"> l_ship_to_account_number</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">CLOSE</span><span style="color: black; background-color: white"> get_ship_to_account_number_cur</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">RETURN</span><span style="color: black; background-color: white"> l_ship_to_account_number</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">EXCEPTION </span><span style="color: blue; background-color: white">WHEN </span><span style="color: red; background-color: white">OTHERS </span><span style="color: blue; background-color: white">THEN</span></p></blockquote>
<blockquote><p>              </p></blockquote>
<blockquote><p><span style="color: black; background-color: white" /><span style="color: blue; background-color: white">RETURN </span><span style="color: blue; background-color: white">NULL;</span><br />
<span style="color: black; background-color: white" /><span style="color: blue; background-color: white">END</span><span style="color: black; background-color: white"> GET_SHIP_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">;</span></p>
<p><span style="color: blue; background-color: white">FUNCTION</span><span style="color: black; background-color: white"> GET_INVOICE_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">p_invoice_to_org_id </span><span style="color: blue; background-color: white">IN </span><span style="color: blue; background-color: white">NUMBER)</span><br />
<span style="color: blue; background-color: white">RETURN </span><span style="color: blue; background-color: white">varchar2</span><br />
<span style="color: blue; background-color: white">IS</span></p></blockquote>
<blockquote><p><span style="color: black; background-color: white">l_invoice_to_account_number </span><span style="color: blue; background-color: white">varchar2(</span><span style="color: maroon; background-color: white">30</span><span style="color: blue; background-color: white">);</span></p></blockquote>
<blockquote><p><span style="color: blue; background-color: white">CURSOR</span><span style="color: black; background-color: white"> get_bill_to_account_number_cur </span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">l_invoice_to_org_id </span><span style="color: blue; background-color: white">NUMBER)</span><br />
<span style="color: blue; background-color: white">IS</span><br />
<span style="color: blue; background-color: white">SELECT</span><span style="color: black; background-color: white"> c</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">account_number</span><br />
<span style="color: blue; background-color: white">FROM</span><span style="color: black; background-color: white"> hz_cust_acct_sites </span><span style="color: blue; background-color: white">a,<br />
</span><span style="color: black; background-color: white">hz_cust_site_uses b</span><span style="color: blue; background-color: white">,<br />
</span><span style="font-size: 8pt; color: black; font-family: Courier New; background-color: white">hz_cust_accounts c<br />
</span><span style="color: blue; background-color: white">WHERE </span><span style="color: blue; background-color: white">a.</span><span style="color: black; background-color: white">cust_acct_site_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> b</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">cust_acct_site_id</span><br />
<span style="color: blue; background-color: white">AND</span><span style="color: black; background-color: white"> b</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">site_use_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> l_invoice_to_org_id</span><br />
<span style="color: blue; background-color: white">AND</span><span style="color: black; background-color: white"> b</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">site_use_code </span><span style="color: blue; background-color: white">= </span><span style="color: red; background-color: white">&#8216;BILL_TO&#8217;</span><br />
<span style="color: blue; background-color: white">and </span><span style="color: blue; background-color: white">a.</span><span style="color: black; background-color: white">cust_account_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> c</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">cust_account_id</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">BEGIN</span><br />
<span style="color: blue; background-color: white">OPEN</span><span style="color: black; background-color: white"> get_bill_to_account_number_cur </span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">p_invoice_to_org_id</span><span style="color: blue; background-color: white">);</span><br />
<span style="color: blue; background-color: white">FETCH</span><span style="color: black; background-color: white"> get_bill_to_account_number_cur </span><span style="color: blue; background-color: white">INTO</span><span style="color: black; background-color: white"> l_invoice_to_account_number</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">CLOSE</span><span style="color: black; background-color: white"> get_bill_to_account_number_cur</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">RETURN</span><span style="color: black; background-color: white"> l_invoice_to_account_number</span><span style="color: blue; background-color: white">;</span></p>
<p><span style="color: blue; background-color: white">EXCEPTION </span><span style="color: blue; background-color: white">WHEN </span><span style="color: red; background-color: white">OTHERS </span><span style="color: blue; background-color: white">THEN</span></p></blockquote>
<blockquote><p><span style="color: blue; background-color: white">RETURN </span><span style="color: blue; background-color: white">NULL;</span></p></blockquote>
<blockquote><p><span style="color: blue; background-color: white">END</span><span style="color: black; background-color: white"> GET_INVOICE_TO_ACCOUNT_NUMBER</span><span style="background-color: white">;</span></p></blockquote>
<p><span style="background-color: white" />Let&#8217;s also include these functions in our <span style="background-color: white">XQP_SOURCING_API_PU</span>B package and compile our functions.</p>
<p><span style="color: black">After confirming successful compilation, we can add similar function references in the Attribute Mapping setups for the Bill To Customer Account and Ship To Customer Account Qualifiers.<br />
</span></p>
<blockquote><p><span style="color: black; background-color: white">SCHQP_SOURCING_API_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">GET_SHIP_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">OE_ORDER_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">G_HDR</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">ship_to_org_id</span><span style="background-color: white">)</span></p>
<p><span style="color: black; background-color: white">SCHQP_SOURCING_API_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">GET_SHIP_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">OE_ORDER_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">G_LINE</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">ship_to_org_id</span><span style="background-color: white">)</span></p>
<p><span style="color: black; background-color: white">SCHQP_SOURCING_API_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">GET_INVOICE_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">OE_ORDER_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">G_HDR</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">invoice_to_org_id</span><span style="background-color: white">)</span></p>
<p><span style="color: black; font-family: Courier New; background-color: white">SCHQP_SOURCING_API_PUB</span><span style="color: blue; font-family: Courier New; background-color: white">.</span><span style="color: black; font-family: Courier New; background-color: white">GET_INVOICE_TO_ACCOUNT_NUMBER</span><span style="color: blue; font-family: Courier New; background-color: white">(</span><span style="color: black; font-family: Courier New; background-color: white">OE_ORDER_PUB</span><span style="color: blue; font-family: Courier New; background-color: white">.</span><span style="color: black; font-family: Courier New; background-color: white">G_LINE</span><span style="color: blue; font-family: Courier New; background-color: white">.</span><span style="color: black; font-family: Courier New; background-color: white">invoice_to_org_id</span><span style="color: blue; font-family: Courier New; background-color: white">)</span></p></blockquote>
<p><span style="color: black">Once we&#8217;ve entered the references into the User Value fields, let&#8217;s build the attribute mapping rules for each to confirm the setups are successful.<br />
</span></p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual6.png" /><br />
<span style="color: black"><br />
All finished! Now if you go to Modifier setup form, you should see Sold To Customer Account Number, Bill To Customer Account Number, and Ship To Customer Account Number as available Qualifiers under the Customer context.<br />
</span></p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual7.png" /><br />
<span style="color: black"><br />
Without a doubt, the combination of Qualifier Attribute Mapping setups with PL/SQL creates flexible functionality for establishing how and when pricing Modifiers should be applied &#8211; empowering the implementer to meet the most complex of discounting and surcharge requirements.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/09/12/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own-part-ii/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>R12 Order Management &#8211; What&#8217;s changed?</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/09/11/r12-order-management-%e2%80%93-what%e2%80%99s-changed/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/09/11/r12-order-management-%e2%80%93-what%e2%80%99s-changed/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 00:40:29 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Order to Cash]]></category>
		<category><![CDATA[R12]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/09/11/r12-order-management-%e2%80%93-what%e2%80%99s-changed/</guid>
		<description><![CDATA[Good question. I'm in the process of figuring this out myself. However, here are a few things I do know based on my research and my recent R12 engagement...]]></description>
			<content:encoded><![CDATA[<p>Good question. I&#8217;m in the process of figuring this out myself. However, here are a few things I do know based on my research and my recent R12 engagement.</p>
<p><strong>Multiple Operating Unit Access</strong> &#8211; In 11i, a responsibility could only be tied to a single operating unit. However, in R12, responsibilities can be assigned to one or more operating units by assigning the responsibility to a security profile. This is a great enhancement for businesses where users require multi-organization access.</p>
<p><strong>Credit Card Entry Enhancements </strong>- An additional field has been added to the order entry screen to capture the security code typically located on the back of a credit card. Additionally, the credit card number is encrypted at the database level and stored within the Payments (formally iPayments) module. I&#8217;ll put out a more detailed article that talks about the drastic changes to the iPayments module.</p>
<p><strong>Reoccurring Charges </strong>- Functionality has been added to the TSO (Telecommunications Service Ordering) module which allows reoccurring billings. This is perfect for subscriptions and other like services.</p>
<p><strong>Partial Period Revenue Recognition</strong> &#8211; A joint OM and AR enhancement, partial period revenue recognition is a set of new revenue recognition rules in AR which allow for revenue recognition on a daily basis. Previously in 11i revenue recognition could only be done on a monthly basis.</p>
<p><strong>Pay Now or Pay Later</strong> &#8211; Upfront billing in Order Management can now be done and can be configured based on pricing charges, taxes, deposits, installment billing, and prepayments.</p>
<p><strong>Mass Scheduling Changes</strong> &#8211; The scheduling concurrent request can now pick up lines that have errored in the scheduling workflow activity. It also can now pick up lines that are in Entered status &#8211; both converted and manually entered orders.</p>
<p><strong>Customer Acceptance Process </strong>- Oracle R12 now provides the ability to introduce a customer acceptance step prior to invoicing. By setting up a deferral reason in AR, invoicing can be deferred until acceptance has been captured.</p>
<p><strong>Tax Updates</strong> &#8211; Additional tax fields have been added to the order entry screens that provide more flexibility with Vertex.</p>
<p><strong>Architectural Changes to Inventory </strong>- in 11i, Discrete and Process Inventory modules were entirely separate entities. Oracle has converged these modules into one data structure, where functionalities from both modules have combined to be available to both. This doesn&#8217;t mean much from an OM perspective, but technical changes have been performed to the Pick Release and Ship Confirmation processes to work with the new combined inventory model.</p>
<p><strong>Architectural Changes to OM, Install Base, and Service Contracts Integration</strong> &#8211; My understanding is that there is no functionality changes, but from a technical standpoint Oracle has implemented a best practice approach  to OM to Install Base and OM to Service Contracts touchpoints to ensure API calls are used rather than direct queries.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/09/11/r12-order-management-%e2%80%93-what%e2%80%99s-changed/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Pricing Qualifiers &#8211; How They Work and Creating Your Own</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/07/21/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/07/21/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 18:11:23 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Advanced Pricing]]></category>
		<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/07/21/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own/</guid>
		<description><![CDATA[Oracle Advanced Pricing allows you to create discounts, surcharges, and other promotions (called Modifiers) that can be applied against sales orders both manually and automatically. Often there are requirements for Modifiers to only apply in certain situations. For example, promotions on specific products or product lines, discounts on customer types, additional charges on international shipments, etc. So in addition to creating Modifiers, Qualifiers can be used to reference specific attributes of a sales order, product, customer, etc. to determine if the Modifier qualifies for the sales transaction. 

Oracle provides a wide array of Qualifiers to evaluate a sales transaction, but situations often arise where Qualifiers are needed for attributes that aren't available out of the box. However, with a few configurations and little bit of PL/SQL knowledge, you can create your own Qualifier attributes. ]]></description>
			<content:encoded><![CDATA[<p>Oracle Advanced Pricing allows you to create discounts, surcharges, and other promotions (called Modifiers) that can be applied against sales orders both manually and automatically. Often there are requirements for Modifiers to only apply in certain situations. For example, promotions on specific products or product lines, discounts on customer types, additional charges on international shipments, etc. So in addition to creating Modifiers, Qualifiers can be used to reference specific attributes of a sales order, product, customer, etc. to determine if the Modifier qualifies for the sales transaction.</p>
<p>Oracle provides a wide array of Qualifiers to evaluate a sales transaction, but situations often arise where Qualifiers are needed for attributes that aren&#8217;t available out of the box. However, with a few configurations and little bit of PL/SQL knowledge, you can create your own Qualifier attributes.</p>
<p>But before we begin, it helps to look at some commonly used Qualifiers to see how they&#8217;re configured, and ultimately how Oracle is able to source the information. Let&#8217;s start by going to the Oracle Pricing Manager responsibility, navigate to Setup &gt; Attribute Management &gt; Contexts and Attributes. From this form, we&#8217;ll be able to see the starting point from where the Qualifier attributes are created.</p>
<p>Click the Search (flashlight) icon and select context type of Qualifier Context and code of Order. After you make the selection, you&#8217;ll see the seeded qualifying attributes listed under the Attributes block of the form.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual1.png" /></p>
<p>As an example, let&#8217;s look at the Order Type attribute, which represents the Order Type field of the sales order header. Here you&#8217;ll see the basic information that is associated with this Qualifier, most notably the Column Mapped, which indicates where in the Qualifier attribute structure to store the referenced value, and the Value Set, which is used to validate this value. The Value Set is important because when assigning this Qualifier to a Modifier, this is the Value Set that will be used to validate the input accepted when comparing this Qualifier to a value. In this case, when we reference the Order Type qualifier, the &#8220;QP_ORDER_TYPES_ALL&#8221; value set will only compare this qualifier to valid order types; not line types, random text, numeric inputs, etc.</p>
<p>To see how this attribute is mapped to the actual Order Type field on the sales order, we need to return back to the menu and navigate to Setup &gt; Attribute Management &gt; Attribute Linking and Mapping. Enter Order Fulfillment for Pricing Transaction Entity and Qualifier Context for Context Type. You&#8217;ll notice that the same listing of contexts is displayed under the Contexts block.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual2.png" /></p>
<p>Select the ORDER code record and click the Link Attributes button. A form will display a listing of all the same attributes we saw from the Contexts and Attributes form, but with information as to where the Attributes are sourced from.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual3.png" /></p>
<p>Looking at the Order Type attribute, you&#8217;ll see that Level for this attribute is BOTH. This indicates that the Order Type can be referenced from the header or the line details of the corresponding transaction. Other options for Level include LINE, which indicates that the source is at the line detail level, and ORDER, which indicates the attribute can be sourced at header level of the transaction.</p>
<p>Next to the Level is the Attribute Mapping Method, which indicates the method in which the Attribute is sourced. In this case, the method for Order Type is ATTRIBUTE MAPPING, which indicates a more technical reference is required to source this value (i.e. PL/SQL, system variable, etc.). Other Attribute Mapping Methods include RUNTIME SOURCE, indicating that the attribute will be populated by the QP_CUSTOM package, and USER ENTERED, indicating that the value will be populated by the user (this is more common for Pricing Attributes rather than Qualifier Attributes).</p>
<p>To see the kind of Attribute Mapping reference that exists for Order Type, click on the Attribute Mapping button. What you&#8217;ll see is a listing of mapping setups for the Order Type attribute broken down by application. Oracle accepts an attribute mapping by application because from a data structure standpoint, the reference to Order Type can be different in Order Management then other modules like Telesales, Service Contracts, etc.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual4.png" /></p>
<p>To view the source mapping for Order Management, click on the record indicating ONT for request type and take note of the settings for Header Level and Line Level Attribute Mappings on the bottom half of the form. Here&#8217; you&#8217;ll see the actual PL/SQL references that are being made to retrieve the Order Type. Note the Seeded/User Source Type and Seeded/User Value String settings for each:</p>
<p>Reference Type:        PL/SQL API<br />
User Value:                OE_ORDER_PUB.G_HDR.order_type_id</p>
<p>This shows us that this attribute is sourced via a PL/SQL API and calls the PL/SQL string OE_ORDER_PUB.G_HDR.order_type_id. The G_HDR record structure is seeded by Oracle and contains data for the sales order header transaction that is being actively processed and evaluated. It is accessible globally from where the Pricing Engine is executing the PL/SQL code contained in the User Value field. So by accessing this global record structure, Oracle was able to map the Order Type transaction ID to the Order Type attribute &#8211; making this information available to Qualifier and Modifier setups in Advanced Pricing.</p>
<p>Other more advanced Qualifier examples exist which show direct calls to seeded PL/SQL functions. Starting again from the Setup &gt; Attribute Management &gt; Attribute Linking and Mapping navigation path, check out the Party ID located under the CUSTOMER context and take a look at the User Value String under the same Link Attributes form we were just in.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual5.png" /></p>
<p>Since the customer party ID cannot be directly sourced from sales order transaction, Oracle had to develop a quick function call that references the SOLD_TO_ORG_ID of the sales order to retrieve the Party ID from the HZ table structure (QP_SOURCING_API_PUB. GET_PARTY_ID). Notice that since customer information is stored on both the header and the lines of a sales order transaction that Oracle utilizes the G_HDR and G_LINE global record structures to pass the sold to customer information to the seeded API.</p>
<p>QP_SOURCING_API_PUB.GET_PARTY_ID(OE_ORDER_PUB.G_HDR.sold_to_org_id)</p>
<p>QP_SOURCING_API_PUB.GET_PARTY_ID(OE_ORDER_PUB.G_LINE.sold_to_org_id)</p>
<p>Opening up a TOAD session and running the describe command on the QP_SOURCING_API_PUB package shows the details of this function in addition to other functions developed by Oracle to retrieve other data mapping sources used by other seeded Qualifiers.</p>
<p>Given what we&#8217;ve seen so far, the configuration aspect of a Qualifier is quite simple, but it takes just a bit of PL/SQL knowledge to actually map your Qualifier to a source. You don&#8217;t quite need to be an expert per say, but have just enough technical know-how to be &#8220;dangerous&#8221;.</p>
<p>Now that we have a decent idea of the inner workings of a Qualifer, let&#8217;s walk through the steps again and try to create our own. Say for example that a business requirement has come up which calls for a discount to be applied based on a value stored in a Descriptive Flexfield segment (we&#8217;ll pretend it&#8217;s ATTRIBUTE10 of the sales order header).</p>
<p>We first begin by navigating to Setup &gt; Attribute Management &gt; Contexts and Attributes to choose our Context and create our core Attribute information. Since this Attribute will be mapped to a value stored on the sales order header, it&#8217;s most appropriate to place our attribute under the Order context.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual6.png" /></p>
<p>Next, let&#8217;s add a record under the Attributes block and provide our Attribute with a Code, Name, and Description.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual7.png" /></p>
<p>After identifying our Attribute, we&#8217;ll need to choose our Value Set. Let&#8217;s assume that this is a Yes/No field that will be validated against the &#8220;QP: Yes/No&#8221; value set. We&#8217;ll also need to assign an available column. I&#8217;d recommend selecting a column that is a distance away from the last column that is being used to avoid any conflicts (in case Oracle decides to introduce new qualifying attributes in the future).</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual8.png" /></p>
<p>Now let&#8217;s navigate to Setup &gt; Attribute Management &gt; Attribute Linking and Mapping to map our newly created Attribute to a source. Let&#8217;s again select Order Fulfillment for Pricing Transaction Entity and Qualifier Context for Context Type, choose ORDER as the Context, and click the Link Attributes button.</p>
<p>Once the Link Attributes form is open, we&#8217;ll add a new record to map our Attribute. By selecting the list of values for the Code, our new attribute should appear in the list. If our attribute is the only attribute under the Order context that is not mapped, it should default to our Attribute automatically.</p>
<p>Assuming that we&#8217;ll want this Qualifier accessible from the header and line details of a sales order transaction, we&#8217;ll select BOTH as our Level, followed by Attribute Mapping as our Attribute Mapping Method.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual9.png" /></p>
<p>Save your changes, and click on the Attribute Mapping button. Since our Qualifier is referencing the Flexfield segment within the Order Management module, let&#8217;s again select the ONT reference record, but this time populate &#8220;Advanced Pricing&#8221; for the Application Name.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual10.png" /></p>
<p>Moving along to the Header and Line Level setups, we want to indicate that our User Source Type will be a PL/SQL API for both, followed by the appropriate PL/SQL string in the User Value String field.</p>
<p>You might be asking, &#8220;How do we determine what PL/SQL string to use?&#8221;</p>
<p>If we refer back to the Order Type attribute example, the G_HDR record structure is the global structure that is populated with the current sales order header transaction data. If you&#8217;re familiar with the OE_ORDER_HEADERS_ALL table, you&#8217;ll know that all we need to do is reference G_HDR.ATTRIBUTE10 to retrieve our Flexfield segment. Since we&#8217;re referring to the Flexfield segment stored on the order header, the User Value String values for both the Header and Line Levels will be the same.</p>
<p>OE_ORDER_PUB.G_HDR.attribute10</p>
<p>This example was fairly straight forward since the Flexfield segments are easily identifiable and stored directly in the G_HDR record structure. However, if in other situations you&#8217;re unsure of which column actually stores the data you wish to reference, you may have to query data against the OE_ORDER_HEADERS_ALL or OE_ORDER_LINES_ALL tables to determine where your data is stored. And in cases where the value isn&#8217;t found in these tables, then you may have to develop a custom API similar to how the Party ID Qualifier is implemented (I&#8217;ll post an example of how to do this in a future article).</p>
<p>Now that we&#8217;re finished with our setups, we can save our changes.</p>
<p>After saving your work, let&#8217;s navigate to the Tools file menu and select Build Attribute Mapping rules. This will compile our Attribute Mapping setups with our PL/SQL reference in place. If any typos or incorrect syntax is made in the User Value, you&#8217;ll find out from the results of the compilation.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual11.png" /></p>
<p>Assuming that you&#8217;ve enter the PL/SQL string correctly, you should receive a message indicating the Attribute Mapping Rules have been built successfully.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual12.png" /></p>
<p>Upon clicking OK closing the Attribute Mapping form you may receive the following warning message:</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual13.png" /></p>
<p>Oracle is screaming at us because we chose to only map our attribute for the Order Management application and not the other applications that are listed under the Application Types. For the purposes of this demonstration, we can click OK and be done with hit. However, if you&#8217;re organization is utilizing Advanced Pricing from elsewhere (Service Contracts, Telesales, etc.), then I would recommend that you also provide source mappings for those dependent applications as well.</p>
<p>Sweet! Now you have a Qualifier that references a sales order header Flexfield attribute! You should now be able to view this Qualifier when setting up List or Line Qualifiers from the Modifier setup form as shown below.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual14.png" /></p>
<p>Now even though we&#8217;ve built and compiled our attribute mapping, Oracle may still warn you that the Qualifier you&#8217;ve reference hasn&#8217;t been mapped. If this is the case, you can run the Build Attribute Mapping Rules concurrent request and this should take care of the issue.</p>
<p>As I mentioned, this Qualifier serves as a good example for when the data is readily accessible via the G_HDR or G_LINE global record structures, but stay tuned for another example which will show how we can create our own custom PL/SQL function to source an Attribute.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/07/21/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Implementing Export Compliance in Oracle</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/05/30/implementing-export-compliance-in-oracle/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/05/30/implementing-export-compliance-in-oracle/#comments</comments>
		<pubDate>Sat, 31 May 2008 02:38:11 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Order to Cash]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/05/30/implementing-export-compliance-in-oracle/</guid>
		<description><![CDATA[In the United States there are numerous international embargo laws in place that restrict U.S. based corporations from selling to countries that are deemed a threat by the government. Cuba, Iran, and North Korea are all examples of countries which no one in the U.S. can conduct business with. These laws can change often depending on the political atmosphere or whoever happens to be in office, making it difficult for organizations who sell or distribute products globally to not only adhere to the laws, but to also adapt their audit procedures when a change to policy occurs.]]></description>
			<content:encoded><![CDATA[<p>In the United States there are numerous international embargo laws in place that restrict U.S. based corporations from selling to countries that are deemed a threat by the government. Cuba, Iran, and North Korea are all examples of countries which no one in the U.S. can conduct business with. These laws can change often depending on the political atmosphere or whoever happens to be in office, making it difficult for organizations who sell or distribute products globally to not only adhere to the laws, but to also adapt their audit procedures when a change to policy occurs.</p>
<p>For corporations which conduct sales in the U.S. and in other locations across the world, the complexity increases because every country has their own set of embargo laws. For example, a U.S. based company cannot sell to an Iranian company because of U.S. regulation, but on the other hand, if the same organization has a location or distribution warehouse in France, their French location could sell to that same Iranian customer. Granted, this situation is also dependent on the citizenship of the individual conducting the sale &#8211; an employee sitting at a desk in France can&#8217;t make the same sale to Iran if they hold U.S. citizenship.</p>
<p>By now I think you get the point &#8211; keeping track and enforcing export compliance procedures can be quite complex. If your business operates an international sales organization and has difficulty enforcing and adapting to the ever changing embargo regulations at a global level, then the Oracle Export Compliance module, in conjunction with Kewill export compliance screening, can provide just the tools you need to ensure your sales organization remains compliant.</p>
<p><strong>A Brief Look at the Technology<br />
</strong></p>
<p>Out of the box, Oracle provides a workflow process in Order Management that establishes an XML based connection to a selected 3<sup>rd</sup> party compliance screening service. Kewill, a commonly used screening service in the Oracle community, maintains an elaborate database of the latest export compliance regulations. Upon entering and booking a sales order, Oracle sends various information about the sale order transaction to Kewill, who then accepts and evaluates the sale based on the most current and up-to-date export compliance laws.</p>
<p>Once Kewill determines whether or not the sale is compliant, the results are sent back to Oracle Order Management. If the result is found to violate export compliance laws, the sales order goes on export compliance violation hold and awaits review by an individual in the organization who is given the property authority to either process the order or cancel the sale.</p>
<p>Additionally screening can be performed during the pick release and shipment confirmation processes to ensure that changes that are made to a sales order after booking are also captured and screened prior to sending the product out the door.</p>
<p>The technology around the communication between Oracle and Kewill services is fairly straightforward, but the actual screening performed by Kewill can be quite complex. As I mentioned earlier, international embargo laws vary country, so to deem a transaction compliant there are many pieces of information to consider. What country is the customer located? Do the billing and shipping locations for the customer differ? Or is the billing customer entirely different than the shipping customer?</p>
<p>What about your facilities &#8211; is the location of your shipping warehouse different than the location from where the order is being processed? Does the citizenship of the individual entering the transaction qualify to make the sale?</p>
<p>As you can see, the situation can get quite complex. How these questions are answered determines the set of export compliance laws that need to be evaluated. Lucky for you, Oracle Export Compliance and Kewill takes care of this complexity for you.</p>
<p>For more information regarding the Oracle Export Compliance product visit <a href="http://www.oracle.com/products/export/index.html">http://www.oracle.com/products/export/index.html</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/05/30/implementing-export-compliance-in-oracle/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tax on Freight &amp; Special Charges in Order Management</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/02/29/tax-on-freight-special-charges-in-order-management/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/02/29/tax-on-freight-special-charges-in-order-management/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 15:27:56 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Advanced Pricing]]></category>
		<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Order to Cash]]></category>
		<category><![CDATA[Receivables]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/02/29/tax-on-freight-special-charges-in-order-management/</guid>
		<description><![CDATA[One of the fundamental flaws in Oracle Order Management (OM) is the inability to include tax on freight and special charge modifiers that are setup in Advanced Pricing (QP).  There's just no way to do it out of the box.  Even if you use the Oracle suggested work around, which is to add freight as a line item to a sales order, it's still a manual process and defeats the purpose of being able to include and calculate freight automatically the way you can through a charge modifier.  ]]></description>
			<content:encoded><![CDATA[<p>One of the fundamental flaws in Oracle Order Management (OM) is the inability to include tax on freight and special charge modifiers that are setup in Advanced Pricing (QP).   There&#8217;s just no way to do it out of the box.   Even if you use the Oracle suggested work around, which is to add freight as a line item to a sales order, it&#8217;s still a manual process and defeats the purpose of being able to include and calculate freight automatically the way you can through a charge modifier.  </p>
<p>Oracle does provide the ability to recognize freight as revenue, which in turn calculates tax on the charge, but this doesn&#8217;t happen until the order has been interfaced to Receivables (AR). For some corporations, that calculation needs to happen at the time of order entry.   Additionally, some clients who utilize iPayment to authorize a credit card charge in OM and apply the fully transact the charge when the order is interfaced to AR will also encounter issues because the authorized amount, which doesn&#8217;t include the tax on freight, is less than the actual charge amount on the AR side, causing the credit card transaction to fail entirely.  </p>
<p>Needless to say, it&#8217;s a pain, and a blatant functionality gap.   However, with a slight customization, a semi-acceptable solution can be found by harnessing some of the functionalities available in Advanced Pricing.</p>
<p>Going back to Oracle&#8217;s recommended solution of adding an order line item for freight if it is to be taxed &#8211; the main issue with this work around is that it&#8217;s not automatically added to the order.   For high-volume order entry environments, this is an absolute necessity.   One of the great advantages of modifiers in Advanced Pricing is the ability to allow charges and adjustments to be automatically applied to an order based on qualifying events.   This is an important piece of functionality that is lost using Oracle&#8217;s line item workaround.</p>
<p>However, there is a functionality in Advanced Pricing, often not used, that can automate the entry of an order line.   The &#8220;get item&#8221; functionality under the &#8220;Promotion&#8221; modifier type allows you to add items to a sales order based on the qualifiers you set.   This functionality is typically used for a &#8220;buy one, get one free&#8221; scenario, but can be used in this situation to add a freight order line automatically to a sales order.</p>
<p>The only setback to this functionality is that the pricing capabilities are limited.   When setting up a &#8220;get item&#8221; modifier, you cannot attach a formula.     The functionality only allows you to obtain a fixed list price from a price list or generate a new price.   This may be OK if you&#8217;re organization charges a fixed amount for freight, but for those who calculate freight based on the selling amount, this is very bad.   Out of the box, there is no way to get around this.   Even applying a modifier on top of the order line that is added by the &#8220;get item&#8221; modifier doesn&#8217;t work, because when the line item is added, the Calculate Price Flag is set to &#8220;Partial Pricing&#8221;.   What &#8220;Partial Pricing&#8221; means is that it will obtain the price that is established in the &#8220;get item&#8221; setup, but it will neglect any modifiers or adjustments applied to that order line.   The only way around this is to manually set the Calculate Price Flag to &#8220;Calculate Price&#8221;, then re-price the line.  </p>
<p>While setting the Calculate Price Flag manually works, this defeats the purpose of adding the freight line automatically to the order.   The point of this exercise is to add the line with the price automatically calculated so that there&#8217;s no need for the users to perform this step in a high volume order entry environment.   This is where that &#8220;slight&#8221; customization as I mentioned earlier comes in.</p>
<p>If setting the Calculate Price Flag to &#8220;Calculate Price&#8221; after the line has been automatically added solves the issue, then why not have a concurrent request, which runs as often as the business desires, perform this action so that the price of the freight order line is correctly calculated?   This is exactly what we did with my last client and it ended up working quite well, but with one little exception.</p>
<p>Being that this is a line item, there is no way to prorate the freight in the event there is partial or multiple shipments for a given order.   Depending on the nature of your business, this may not be acceptable.   There&#8217;s a couple of way to address this:</p>
<ul>
<li>Restrict partial shipments from occurring by enabling header level invoicing or utilizing fulfillment sets.   This will ensure that all line items are fulfilled before issuing an invoice.   However, if you&#8217;re organization requires that an invoice be generated for each shipment, this would not be an acceptable solution.</li>
<li>If the first option doesn&#8217;t fit your business model, you can place an automatic invoicing hold on the freight line item that is only released when the entire order is shipped.   What this does is allow items that are shipped partial to generate an invoice, but delays the billing of freight until the last shipment is made.   The automatic hold can be done as a hold source, but releasing the hold would need to be another one of those &#8220;slight&#8221; customizations you would need.   However, if you&#8217;re organization needs to include freight charges with every delivery, this solution wouldn&#8217;t work for you either.</li>
<li>If neither of the above option is acceptable, and you need the whole shebang, than a more complex customization is needed that splits the freight item for each shipment.   So for example, you have a 10 line item sales order where your freight charge is $50.   During the first shipment, 5 of the 10 lines are shipped out there door.     What the customization would do is split the freight line item into two lines 0.5 quantities, which in affect would split the price in half.   Only one of the split lines would be processed with the shipment, the other split line would be placed on hold.   For this to happen, you&#8217;re item would need to be setup as &#8220;OM Divisible&#8221; enabled, which indicates that fractional quantities are allowed.</li>
</ul>
<p>Getting around this issue is not easy, but can be possible.   If you&#8217;d like to obtain a copy of my code which resolves the pricing issues with adding line items automatically using the &#8220;get item&#8221; functionality, feel free to contact me.</p>
<p>Also, to find out how to calculate freight, charges, or adjustments based on the total order amount, check out this article.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/02/29/tax-on-freight-special-charges-in-order-management/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>There&#8217;s More to Outsourcing than Just Cutting Costs</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/01/21/there%e2%80%99s-more-to-outsourcing-than-just-cutting-costs/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/01/21/there%e2%80%99s-more-to-outsourcing-than-just-cutting-costs/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 23:08:05 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Insourcing]]></category>
		<category><![CDATA[Outsourcing]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/01/21/there%e2%80%99s-more-to-outsourcing-than-just-cutting-costs/</guid>
		<description><![CDATA[These days it's standard practice for American based companies implementing software systems to send technical development overseas to countries like India, Singapore, and China. If you walk around the corner of your office, you may find a small offshore team crammed into a cubical gathering and reviewing technical requirements to be distributed to resources located on the other side of the world. In almost all cases, the outsourcing model is adopted in an effort to cut down on development costs. On the surface it makes sense - why pay a US based contractor the high salary when an offshore resource can perform the same work for a fraction of the cost? Several years ago, many IT executives considered this question to be a no-brainer and would have immediately adopted the offshore model. But while all their concentration was focused on cutting costs, project managers neglected other important variables in the offshore equation, and as a result there have been few successes and far too many failures in adopting the outsourcing model within the IT industry. If you're an executive evaluating the cost benefits of the offshore model, there are other factors to take into consideration.]]></description>
			<content:encoded><![CDATA[<p>These days it&#8217;s standard practice for American based companies implementing software systems to send technical development overseas to countries like India, Singapore, and China. If you walk around the corner of your office, you may find a small offshore team crammed into a cubical gathering and reviewing technical requirements to be distributed to resources located on the other side of the world. In almost all cases, the outsourcing model is adopted in an effort to cut down on development costs. On the surface it makes sense &#8211; why pay a US based contractor the high salary when an offshore resource can perform the same work for a fraction of the cost? Several years ago, many IT executives considered this question to be a no-brainer and would have immediately adopted the offshore model. But while all their concentration was focused on cutting costs, project managers neglected other important variables in the offshore equation, and 
<table align="left" border="0" cellpadding="0" cellspacing="0">
<tr><td>
<script type="text/javascript"><!--
google_ad_client = "pub-4516530845610319";
//200x200, created 12/11/07
google_ad_slot = "2730876339";
google_ad_width = 200;
google_ad_height = 200;
//--></script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</td></tr>
</table>
as a result there have been few successes and far too many failures in adopting the outsourcing model within the IT industry. If you&#8217;re an executive evaluating the cost benefits of the offshore model, there are other factors to take into consideration.</p>
<p>For starters, you must evaluate the skills and expertise that is required from the technical resources that are needed. Generally speaking, most offshore developers I&#8217;ve worked with have an outstanding technical background. They know and understand database architecture, coding standards and syntax, and have an expertise in the many software tools that are necessary to get the job done. Irrespective of citizenship or other factors, these skill sets alone are great for development work on small, independent software systems where there are minimal dependencies. Some examples of an independent software environment could be:</p>
<ul>
<li>A small to mid-size business running a custom-built, homegrown system.</li>
<li>A standalone software system used to collect and report on transactions specific to a department and/or sub-division.</li>
</ul>
<p>If your software system fits this profile, than an offshore resource could most certainly meet your needs.</p>
<p>Where additional precaution is needed is in the implementation of a company-wide ERP system. When doing any kind of customizing to an enterprise software application, it&#8217;s critical that the technical resources you seek not only have sound technical skill sets, but also a strong functional understanding of the application. The technical resource at minimum should know:</p>
<ul>
<li>How the application module was designed to work out-of-the-box.</li>
<li>The inter-dependencies of the modules. In other words, how a particular module fits into the entire application framework.</li>
<li>The adverse affects of changing module design based on these inter-dependencies.</li>
</ul>
<p>Now I&#8217;m willing to admit that it&#8217;s unrealistic to expect a technical guru to write complex code all while he or she is reciting the user documentation, but general functional knowledge is a definite requirement to ensure that you&#8217;re project staff and offshore resources can communicate on the same wavelength.</p>
<p>I&#8217;ve observed that the services provided by an offshore outfit are usually sound from a technical standpoint. However, from a functional standpoint, the level of expertise is up for debate. When first introduced to the model, many experts (including myself) had the expectation that the technical resources provided would have some degree of functional knowledge of the respective system. This expectation often led to a major misunderstanding of what an offshore outfit is able to offer. What was thought to be a team of techno-functional resources turned out to be a team of highly skilled coders with less than desirable knowledge of the application.</p>
<p>Anyone who has worked in the ERP world knows that communication is key to running an effective software implementation project. If this line of communication breaks, a rippling effect is sent throughout the entire team &#8211; placing the quality of work and the success of the project at risk. If the project staff and the outsourcing group do not have the same collective understanding of the functional requirements, a severe breakdown in communication between these groups occurs and results in technical objects not being delivered according to the communicated (or understood) specification. I like to call this the Techno-Functional Gap, and without a doubt, it is the main reason why the outsourcing model has failed.</p>
<p>Before making the decision to go offshore, it&#8217;s extremely import to consider how the techno-functional gap will be bridged among your project staff and the offshore resources. Ultimately what you want to avoid is a purely functional consultant with no technical background writing design specifications for an offshore programmer without any functional knowledge of the application. Both resources may have their respective strengths, but if a common understanding cannot be met, there&#8217;s an increased risk of the requirements being poorly communicated by your staff or misunderstood by the outsourcing group.</p>
<p>An easy way to measure this risk is to first evaluate the skill sets of your current staff. Depending on how weak or strong the technical background of your staff is determines the kind of functional background that&#8217;s needed from your offshore resources. By building a skill set matrix which rates your staff&#8217;s functional and technical strengths, your organizational needs become more clear. So for example:</p>
<table width="90%" border="1">
<tr>
<td>  </td>
<td><strong>Module</strong></td>
<td><strong>Functional Rating</strong></td>
<td><strong>Technical Rating</strong></td>
</tr>
<tr>
<td>Resource #1</td>
<td>Finance</td>
<td>9 &#8211; Strong</td>
<td>7 &#8211; Above Average</td>
</tr>
<tr>
<td>Resource #2</td>
<td>Sales</td>
<td>10 &#8211; Strong</td>
<td>1 &#8211; Poor</td>
</tr>
</table>
<p>  </p>
<p>In the above chart I took two example project resources: one from the sales team and one from the finance team. I then attempted to rate each of their functional and technical skill sets on a scale of 1 to 10, where 10 indicates strong knowledge and 1 represents little to none.</p>
<p>Looking at this chart, we see our finance resource has a very strong functional background with above-average technical skills. Therefore, we may be able to settle for an offshore resource with minimal functional skill sets. On the other hand, we see that our sales consultant has a strong functional background, but has no technical experience. With no technical background, we must be cautious in our choice of offshore developers to pair up with our sales resource. For this resource, it would be wise to find a developer that has average to strong functional knowledge of the system.</p>
<p>This is a very basic example, but it shows how effective this technique can be in ensuring that the project staff is paired up with the appropriate outsourcing resources.</p>
<p>For complicated or critical custom components that will be vital to your business process, I would suggest pairing up resources that have overlapping techno-functional skills. Matching resources with overlapping skill sets will ensure a seamless communication of requirements and effective coordination in testing the complexities of the customization. Simply put, for high-risk technical objects, it&#8217;s better to over-communicate than to under-communicate.</p>
<p>In addition to skill set pairing, I would also make sure that a collaborative work environment is put in place so that the project team and outsourcing groups can seamlessly share, distribute, and organize project deliverables amongst each other.</p>
<p>In the past, I&#8217;ve seen many clients allow the outsourcing partner to take full responsibility in managing and versioning all deliverables, from documentation to technical objects, as way a way to reduce overhead and take advantage of the cost effective labor. However, like the skill set gap, the collaboration gap creates another disconnect between the developers and the project staff. This led to the internal team having several issues with:</p>
<p>Assessing documentation and other deliverables.  </p>
<ul>
<li>Identifying the state of the test environments and knowing which instance had the code ready for testing.</li>
<li>
<div>Identifying code versions and knowing which version of the code they were testing.</div>
</li>
</ul>
<p>These uncertainties usually led to the project team managing their own versions of the documentation and code. Then, as you would suspect, this led to confusion among both groups as to who had the latest version.</p>
<p>Remember, having an offshore group isn&#8217;t just about assigning technical development to a separate group sitting at a 14 hour plan ride away; it&#8217;s about assigning the project team and the outsourcing group joint responsibility to meet the requirements outlined by the business. It&#8217;s a <em>collaborative effort</em> &#8211; and being this is a collaborative effort, it&#8217;s important to provide the work environment necessary for both groups to work as a single, integrated unit.</p>
<p>It&#8217;s important to ensure that some kind of tool or shared network space is in place so that all information associated with the offshore efforts is easily accessible to your staff and the outsourcing partner. There are many tools out there to help streamline the collaborative process. From my past experience, Microsoft SharePoint has proven to be a great tool that allows you to organize your deliverables by team, milestone, etc. through an easy to use web interface. The application allows you to grant access to members of the project so that documents are controlled both from a rights and versioning standpoint. Now I&#8217;m only using SharePoint as an example and I&#8217;m not trying to sell you the application. However, whatever tool you choose to implement, it&#8217;s important that everyone from the team has access to this collaborative workspace and follows all organizational and versioning policies instituted within the team.</p>
<p>So far I&#8217;ve discussed the importance of establishing open communication and a collaborative work environment between your staff and the outsourcing partner to minimize the immediate risks, which are misinterpreted requirements and poorly designed custom objects leading to failures within the project and exposed risks to the business if implemented. But in addition to the immediate risks, the long term (or post project) risks also need to be evaluated. Remember, in most cases, the point of bringing on an outsourcing partner is to utilize their resources for the short-term. Once the implementation project is completed, the idea is to relieve the offshore resources and allow your internal project staff to continue supporting the system.</p>
<p>However, if clear communication and group collaboration is not in place, then you may want to extend that contract with your outsourcing partner for much longer than you originally anticipated. If you&#8217;re internal staff is not up-to-speed with the work performed by the offshore team, than your group will not be able to effectively support any customizations to the system without the involvement of the outsourcing partner. Too many times in my career have I seen outsourcing contracts extended not because delays to the project schedule, but because the client was not prepared to take on the responsibilities of supporting and maintaining the system.</p>
<p>So in addition to communication and collaboration, a knowledge transfer plan needs to be in place to ensure that your staff is given the information and tools necessary to continue supporting the work delivered by your offshore resources. Do not make this effort secondary to all other activities that may appear to take higher priority. This should be a dedicated phase within your project schedule and should be accounted for in the budget. The less time you set aside for knowledge transfer, the more time you will most likely need to sign up for offshore support. Also keep in mind that the more integrated your project team and the outsourcing partner become, the less time it should take to transfer knowledge. On the flip side, if the work of the outsourcing group was performed independently with no interaction with your staff, then knowledge transfer will most likely be a nightmare.</p>
<p>Like anything in business, it&#8217;s not just about cutting costs, but being able to cut costs without sacrificing the quality of work or exposing your organization to potential risk. Outsourcing can be a working, efficient component of your ERP project team so long as the appropriate offshore resources are paired with your staff, the lines of communication are open, and an environment is provided to promote group collaboration. When evaluating your offshore options, make sure to take all these factors into consideration. You may find that the cost risk or the overhead in building an integrated environment may far exceed hiring some permanent hands. Most importantly, it&#8217;s important that your IT organization practices what you preach. In other words, do not expect to bring your business into an integrated EPR system environment if your project organization cannot operate as an integrated entity itself.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/01/21/there%e2%80%99s-more-to-outsourcing-than-just-cutting-costs/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Interfacing Oracle to Your Legacy WMS &#8211; A Good Idea?</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/01/10/interfacing-oracle-to-your-legacy-wms-a-good-idea/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/01/10/interfacing-oracle-to-your-legacy-wms-a-good-idea/#comments</comments>
		<pubDate>Thu, 10 Jan 2008 18:11:34 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Inventory]]></category>
		<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Order to Cash]]></category>
		<category><![CDATA[Shipping Execution]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/01/10/interfacing-oracle-to-your-legacy-wms-a-good-idea/</guid>
		<description><![CDATA[Over the years I've been involved with several Oracle implementations where the decision was made to retain the existing warehouse and inventory management systems in place of Oracle WMS. Perhaps your organization had made a similar decision knowing that the existing warehouse solution was best suited for your operations. Not to say that Oracle WMS is the best warehouse management solution out there - because it may very well not be. In fact, it may be true that your Legacy inventory system is the best fit for your business. Not only may it be the best fit, but keeping the existing system in place also eliminates any risk involved in changing the systems of what can be a fragile inventory and shipping operation. In other words, if it ain't broke, don't fix it - right?]]></description>
			<content:encoded><![CDATA[<p>Over the years I&#8217;ve been involved with several Oracle implementations where the decision was made to retain the existing warehouse and inventory management systems in place of Oracle WMS. Perhaps your organization had made a similar decision knowing that the existing warehouse solution was best suited for your operations. Not to say that Oracle WMS is the best warehouse management solution out there &#8211; because it may very well not be. In fact, it may be true that your Legacy inventory system is the best fit for your business. Not only may it be the best fit, but keeping the existing system in place also eliminates any risk involved in changing the systems of what can be a fragile inventory and shipping operation. In other words, if it ain&#8217;t broke, don&#8217;t fix it &#8211; right?</p>
<p>Perhaps, but before you go down this path there is another factor that should be taken into consideration: ensuring the order fulfillment process as a whole remains seamless and intact. What is the impact to the order entry, scheduling, pick release, on-hand availability and reservation processes if an interface is built to an outside WMS? The answer to this question is especially important in a high-volume environment where your organization fulfills hundreds to thousands of orders a day.</p>
<p>Generally, when an interface between Oracle (or any order processing system for that matter) and a Legacy WMS is built, a division of duties is established. Oracle is given the responsibility to capture orders and release these orders for shipment when ready. The Legacy WMS system is responsible for accepting shipment requests, processing these 
<table align="left" border="0" cellpadding="0" cellspacing="0">
<tr><td>
<script type="text/javascript"><!--
google_ad_client = "pub-4516530845610319";
//200x200, created 12/11/07
google_ad_slot = "2730876339";
google_ad_width = 200;
google_ad_height = 200;
//--></script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</td></tr>
</table>
shipments, and sending the results of the shipment back to Oracle. Essentially, the Pick Release process in Oracle is the &#8220;throw&#8221; to Legacy WMS, and the Ship Confirmation step is the &#8220;catch&#8221;.</p>
<p>Since the nature of both system&#8217;s responsibilities require access to inventory data, your organization must understand that not only are you building a shipping interface, but you are committing to maintain two sets of inventory data that may require several interfaces. Oracle will need access to on-hand balance and reservation information so that order processors have insight to product availability and so that the system knows what orders are eligible for shipment. The Legacy WMS will of course require inventory data to maintain on-hand balance and deduct balances upon shipment. <em>Oracle inventory data, to a degree, will need to be in synch with inventory data in Legacy.<br />
</em></p>
<p>To what degree must be decided. Your organization may determine that both sets of inventory do not require real-time synchronization. For example, you may decide that manual adjustments made to inventory in Legacy may only need to be interfaced through a daily polling process that posts these updates to Oracle. If this direction is taken, then you will need to decide how your shipping interface will handle exceptions that may result from an on-hand balance delta between Oracle and Legacy inventory.</p>
<p>How can an inventory delta occur? Well, let&#8217;s say at the time we place an order for an item in Oracle there is 1 quantity available for reservation. However, during the day a warehouse worker reviews the item and determines that it fails to meet quality standards and as a result he/she performs a manual transaction in the Legacy WMS to issue that quantity to scrap. Because Oracle is unaware that this transaction occurred, the interface will continue to release the ordered item for shipment &#8211; even though there isn&#8217;t enough quantity on-hand in Legacy.</p>
<p>In this situation, you will need to ensure that this situation (among many others) can be handled by the interface. From a business prospective, a decision needs to be made to determine how exactly this delta should be handled. For example, you may want to leave the interfaced transaction in an error status and continue to retry until inventory is made available. Or you may want to cancel the transaction entirely. Whatever that action may be, it&#8217;s important that there is visibility to these kinds of inventory deltas.</p>
<p>If your organization decides that Oracle inventory and Legacy inventory requires real-time synchronization, your interface will <em>still</em> need the ability to handle situations that result in inventory deltas. Let&#8217;s face it &#8211; we&#8217;re all human. Any level of time and effort that is put into a real-time interface could still result in situations unaccounted for. And as best practice, an error handling procedure should still be implemented, especially in an environment where you require real-time synchronization.</p>
<p>Attempting to identify all scenarios that require a communication between Oracle and the Legacy WMS can get pretty crazy. Here are some examples of scenarios that would need to be included:</p>
<ul>
<li>Order cancelations in Oracle</li>
<li>Shipment cancelations in Legacy</li>
<li>Manual inventory transactions in either system</li>
<li>Inventory location transfers, but this is only important if your organization is utilizing hard reservations at order time, <em>which in this case you should seriously rethink using an interface.<br />
</em></li>
<li>Split and partial shipment scenarios</li>
</ul>
<p>We could go on and on with the list of scenarios to cover &#8211; these are just a small fraction of what can occur. And as I mentioned, even if you think you&#8217;ve listed all scenarios, you <em>still</em> need an error resolution process.</p>
<p>I can&#8217;t stress more the importance of error resolution in the event of an inventory delta. Whether it&#8217;s an automated or manual solution is not important, but the most important point is making sure that if an unidentified inventory delta situation occurs that the interface can be capture and handle this error. At minimum, if the error cannot be handled, at least provide the tools necessary to bring visibility to the situation. Trust me &#8211; there is nothing worse than going live with an interface and experiencing errors that were unaccounted for.</p>
<p>This all may come off as something you probably learned in a beginner&#8217;s course for software design, but I&#8217;ve seen and witnessed the aftereffects of an unsuccessful inventory interface launch with some very reputable clients. What results is the very situation that the client wanted to avoid in the first place &#8211; a chaotic situation that requires the involvement of lots of time and resources that the organization did not budget for but has no choice to deploy in order to fix an interface that is the backbone of their business.</p>
<p>Some brief examples I&#8217;d like to shareâ€¦</p>
<p style="margin-left: 36pt"><strong><em>Example #1<br />
</em></strong></p>
<p style="margin-left: 36pt"><em>Working with a life sciences client to implement Oracle Order Management a few years back, the organization decided to keep their existing mainframe inventory system with the idea of avoiding risk and cutting costs. The consulting group at the time recommended against this decision, but the client continued on and even decided to take on the effort using internal resources.<br />
</em></p>
<p style="margin-left: 36pt"><em>In a nutshell, the core exchange of the interface was centered on the Pick Release and Ship Confirmation processes. Testing was lackluster and didn&#8217;t cover all scenarios such as partial line shipments or order cancelations. More importantly, there lacked a substantial volume test.<br />
</em></p>
<p style="margin-left: 36pt"><em>What resulted at go-live was a disaster. Because of the bugs around partial line shipping, some orders were shipped two, three, and occasionally four times over. It took a team of 10-12 people during go-live to identify the dozen situations that were causing the Pick Release failures and shipping issues. Overall, it had taken a year+ to stabilize the situation and resulted in an exceeded IT budget and sales losses to the client. A team still exists today in maintaining and monitoring this interface.<br />
</em></p>
<p style="margin-left: 36pt"><strong><em>Example #2<br />
</em></strong></p>
<p style="margin-left: 36pt"><em>A publishing organization implementing Oracle decided to build an interface to their existing warehouse system. Aside from its age, this system was a beta version of the vendor&#8217;s product. It was heavily customized and interfaced to dozens of other order processing systems already. Cost and risk were definitely a factor.<br />
</em></p>
<p style="margin-left: 36pt"><em>Results at go-live were also poor. Multiple or no shipments were occurring. Since shipment sets in Oracle were not in synch with the activity that occurred in the legacy system, it caused many issues. An extensive amount of resources were needed to help stabilize the situation. Over time, the client became limited to the amount of functionality that could be used in Oracle. For example, for an order that had several shipping locations, separate orders had to be created for each shipment vs. establishing different shipping addresses at the order line level.<br />
</em></p>
<p style="margin-left: 36pt"><em>Additionally, the client implemented a daily process that &#8220;synchronizes&#8221; the Oracle on-hand balances with Legacy on-hand balances if a delta occurs (scary). Overall, it has taken nearly 2 years to stabilize the situation and currently has resources dedicated to the effort today.<br />
</em></p>
<p>As you can see, clients typically downplay the risk exposed to the rest of the fulfillment process when implementing an inventory interface to &#8220;protect&#8221; the shipping operation. Even worse, these organizations had made the decision to keep the legacy WMS because it was determined that the implementation effort in replacing the system was to costly compared to building the interface. Looking at this short-term, this may be true. But like most system interface projects, the cost of maintaining such a beast can greatly exceed the cost of implementing a new WMS over time (at least based on my experience).</p>
<p>If you&#8217;re an organization that is the process of deciding upon an inventory and shipment interface or a new WMS, I hope you can take the above situations into consideration. In going with the direction of an interface, you must also take into account:</p>
<ul>
<li><strong>Increased Go-Live Risk</strong> &#8211; In case the situation gets ugly, you&#8217;ll need extra time and resources to correct and stabilize the situation. Also will need to factor in any impact to the business and sales it may cause.</li>
<li><strong>A New Department </strong>- The interface itself will be a unique process that will require several individuals who understand and are familiar with the process and include expertise in both the Oracle and Legacy inventory systems.</li>
<li><strong>Difficulty or Inability to Upgrade/Change </strong>- Being that the interface will be a delicate process requiring much involvement from both systems at a technical level, any changes to the table structure on the Oracle side as a result of an upgrade or customization could result in breaking this interface. Likewise, any changes done to the legacy side could also adversely affect this interface. With that said, expect all upgrade efforts to your system to exponentially increase.</li>
</ul>
<p>My position should be pretty clear from all my ranting &#8211; DON&#8217;T DO IT! Or at least if you do, thoroughly evaluate the alternative of implementing a new WMS. Hopefully through the experiences I&#8217;ve shared, you&#8217;ll find that both options are exposed to the same level risk, but that the long term cost benefits of implementing a new WMS will prevail.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/01/10/interfacing-oracle-to-your-legacy-wms-a-good-idea/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Finally! An OE_Order_PUB.Process_Order Script That Works!</title>
		<link>http://www.bryanthompsononline.com/oracle/2007/12/06/finally-an-oe_order_pubprocess_order-script-that-works/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2007/12/06/finally-an-oe_order_pubprocess_order-script-that-works/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 22:22:03 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2007/12/06/finally-an-oe_order_pubprocess_order-script-that-works/</guid>
		<description><![CDATA[Recently I was looking for any working example of the OE_Order_PUB.Process_Order API to use for a volume test I wanted to setup.  The idea would be to identify a base script that with minimal changes could be used to create and book a mass amount of sales orders.  I scoured Metalink and Google, and for the longest time I could not identify a single working example.  Many authors claimed to have posted an OE_Order_PUB.Process_Order script that, with slight modifications, are working examples, but this never was the case.  There was always syntax or incorrect API parameter issues with each script I encountered...]]></description>
			<content:encoded><![CDATA[<p>Recently I was looking for any working example of the OE_Order_PUB.Process_Order API to use for a volume test I wanted to setup.   The idea would be to identify a base script that with minimal changes could be used to create and book a mass amount of sales orders.   I scoured Metalink and Google, and for the longest time I could not identify a single working example.   Many authors claimed to have posted an OE_Order_PUB.Process_Order script that, with slight modifications, are working examples, but this never was the case.   There was always syntax or incorrect API parameter issues with each script I encountered.</p>
<p>
<table align="left" border="0" cellpadding="0" cellspacing="0">
<tr><td>
<script type="text/javascript"><!--
google_ad_client = "pub-4516530845610319";
//200x200, created 12/11/07
google_ad_slot = "2730876339";
google_ad_width = 200;
google_ad_height = 200;
//--></script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</td></tr>
</table>
However, after a few more hours of searching, I was able to find a good, fairly working example on Metalink note 292743.1.   While this example was presented to show how to create an RMA order header using OE_Order_PUB.Process_Order, the script can be easily modified to create orders of all types simply by choosing an order type ID that is of type ORDER or RETURN depending on your requirement.  </p>
<p>Additionally, to create a sales order header, at minimum you&#8217;ll need to specify a customer, price list, currency and any required descriptive flexfield values dictated by your setups.   You may also need a customer purchase order number if you&#8217;re order type has been setup to require it before booking.   The code excerpt below shows this information along with other required data that is needed to produce an order header:</p>
<blockquote><p>l_header_rec.operation := OE_GLOBALS.G_OPR_CREATE;<br />
l_header_rec.order_type_id := 100000;<br />
l_header_rec.sold_to_org_id := 1000;<br />
l_header_rec.price_list_id := 100;<br />
l_header_rec.pricing_date := SYSDATE;<br />
l_header_rec.transactional_curr_code := &#8216;USD&#8217;;<br />
l_header_rec.flow_status_code:=&#8217;ENTERED&#8217;;<br />
l_header_rec.cust_po_number := &#8216;123&#8242;;<br />
l_header_rec.attribute1   := &#8216;ABC&#8217;;</p></blockquote>
<p>The script also doesn&#8217;t create any order lines, so this code would also have to be added.   All that the OE_Order_PUB.Process_Order API needs to create an order line is an ordered item, quantity, and any required descriptive flexfield values that may be needed.</p>
<blockquote><p>l_line_tbl(1).inventory_item_id := 201775;<br />
l_line_tbl(1).ordered_quantity := 1;<br />
l_line_tbl(1).attribute1 := &#8216;ABC&#8217;;</p></blockquote>
<p>At the beginning of the script you will also need to add an API call to dbms_application_info.set_client_info to set the organization context as well as initializing the user, responsibility, and application under which the order(s) will be created.</p>
<blockquote><p>dbms_application_info.set_client_info(100000);<br />
â€¦<br />
fnd_global.apps_initialize(l_user, l_resp, l_appl);</p></blockquote>
<p>Since I want this script to create not just one order, but many orders, I needed to insert a loop into the script with parameters that let me control how many orders to create, and whether to enable or disable debug.   For good performance and to avoid exceeding any buffer limitations, a debug &#8220;switch&#8221; is a good things to have, especially when creating hundreds or even thousands of sales orders.    </p>
<blockquote><p>l_debug_level number := 0;   &#8212; OM DEBUG LEVEL (MAX 5)<br />
l_no_orders number := 100;       &#8212; NO OF ORDERS<br />
â€¦<br />
for i in 1..l_no_orders loop &#8212; BEGIN LOOP<br />
â€¦<br />
if (l_debug_level > 0) then<br />
       DBMS_OUTPUT.PUT_LINE (&#8217;debug message here&#8217;);<br />
end if;<br />
â€¦<br />
end loop; &#8212; END LOOP</p></blockquote>
<p>With these modifications in place, I now have a working script that will create a mass amount of sales orders for the volume test I need.   I hope this comes in handy for you!</p>
<hr />
<div id="code">DECLARE                              </p>
<p>l_api_version_number NUMBER := 1;<br />
l_return_status VARCHAR2(2000);<br />
l_msg_count NUMBER;<br />
l_msg_data VARCHAR2(2000);</p>
<p>/*****************PARAMETERS****************************************************/<br />
l_debug_level number := 0;   &#8212; OM DEBUG LEVEL (MAX 5)<br />
l_org number := 1000;                 &#8212; OPERATING UNIT<br />
l_no_orders number := 100;       &#8212; NO OF ORDERS<br />
l_user number := 10;           &#8212; USER<br />
l_resp number := 100;         &#8212; RESPONSIBLILTY<br />
l_appl number := 660;             &#8212; ORDER MANAGEMENT</p>
<p>/*****************INPUT VARIABLES FOR PROCESS_ORDER API*************************/<br />
l_header_rec oe_order_pub.header_rec_type;<br />
l_line_tbl oe_order_pub.line_tbl_type;<br />
l_action_request_tbl oe_order_pub.Request_Tbl_Type;</p>
<p>/*****************OUT VARIABLES FOR PROCESS_ORDER API***************************/<br />
l_header_rec_out oe_order_pub.header_rec_type;<br />
l_header_val_rec_out oe_order_pub.header_val_rec_type;<br />
l_header_adj_tbl_out oe_order_pub.header_adj_tbl_type;<br />
l_header_adj_val_tbl_out oe_order_pub.header_adj_val_tbl_type;<br />
l_header_price_att_tbl_out oe_order_pub.header_price_att_tbl_type;<br />
l_header_adj_att_tbl_out oe_order_pub.header_adj_att_tbl_type;<br />
l_header_adj_assoc_tbl_out oe_order_pub.header_adj_assoc_tbl_type;<br />
l_header_scredit_tbl_out oe_order_pub.header_scredit_tbl_type;<br />
l_header_scredit_val_tbl_out oe_order_pub.header_scredit_val_tbl_type;<br />
l_line_tbl_out oe_order_pub.line_tbl_type;<br />
l_line_val_tbl_out oe_order_pub.line_val_tbl_type;<br />
l_line_adj_tbl_out oe_order_pub.line_adj_tbl_type;<br />
l_line_adj_val_tbl_out oe_order_pub.line_adj_val_tbl_type;<br />
l_line_price_att_tbl_out oe_order_pub.line_price_att_tbl_type;<br />
l_line_adj_att_tbl_out oe_order_pub.line_adj_att_tbl_type;<br />
l_line_adj_assoc_tbl_out oe_order_pub.line_adj_assoc_tbl_type;<br />
l_line_scredit_tbl_out oe_order_pub.line_scredit_tbl_type;<br />
l_line_scredit_val_tbl_out oe_order_pub.line_scredit_val_tbl_type;<br />
l_lot_serial_tbl_out oe_order_pub.lot_serial_tbl_type;<br />
l_lot_serial_val_tbl_out oe_order_pub.lot_serial_val_tbl_type;<br />
l_action_request_tbl_out oe_order_pub.request_tbl_type;</p>
<p>l_msg_index NUMBER;<br />
l_data VARCHAR2(2000);<br />
l_loop_count NUMBER;<br />
l_debug_file VARCHAR2(200);</p>
<p>&#8211; book API vars<br />
b_return_status VARCHAR2(200);<br />
b_msg_count NUMBER;<br />
b_msg_data VARCHAR2(2000);</p>
<p>BEGIN</p>
<p>dbms_application_info.set_client_info(l_org);</p>
<p>/*****************INITIALIZE DEBUG INFO*************************************/</p>
<p>if (l_debug_level > 0) then<br />
       l_debug_file := OE_DEBUG_PUB.Set_Debug_Mode(&#8217;FILE&#8217;);<br />
       oe_debug_pub.initialize;<br />
       oe_debug_pub.setdebuglevel(l_debug_level);<br />
       Oe_Msg_Pub.initialize;<br />
end if;</p>
<p>/*****************INITIALIZE ENVIRONMENT*************************************/<br />
fnd_global.apps_initialize(l_user, l_resp, l_appl); &#8212; pass in user_id, responsibility_id, and application_id<br />
/*****************INITIALIZE HEADER RECORD******************************/<br />
l_header_rec := OE_ORDER_PUB.G_MISS_HEADER_REC;<br />
/*****************POPULATE REQUIRED ATTRIBUTES **********************************/</p>
<p>l_header_rec.operation := OE_GLOBALS.G_OPR_CREATE;<br />
l_header_rec.order_type_id := 100000;<br />
l_header_rec.sold_to_org_id := 1000;<br />
l_header_rec.price_list_id := 100;<br />
l_header_rec.pricing_date := SYSDATE;<br />
l_header_rec.transactional_curr_code := &#8216;USD&#8217;;<br />
l_header_rec.flow_status_code:=&#8217;ENTERED&#8217;;<br />
l_header_rec.cust_po_number := &#8216;123&#8242;;<br />
l_header_rec.attribute1   := &#8216;ABC&#8217;;</p>
<p>  </p>
<p>/*****************INITIALIZE ACTION REQUEST RECORD*************************************/</p>
<p>l_action_request_tbl(1) := OE_ORDER_PUB.G_MISS_REQUEST_REC;<br />
/*****************INITIALIZE LINE RECORD********************************/</p>
<p>l_line_tbl(1) := OE_ORDER_PUB.G_MISS_LINE_REC;<br />
l_line_tbl(1).operation := OE_GLOBALS.G_OPR_CREATE;<br />
l_line_tbl(1).inventory_item_id := 201775;<br />
l_line_tbl(1).ordered_quantity := 1;<br />
for i in 1..l_no_orders loop &#8212; BEGIN LOOP</p>
<p>/*****************CALLTO PROCESS ORDER API*********************************/</p>
<p>OE_Order_PUB.Process_Order( p_api_version_number => l_api_version_number,<br />
p_header_rec => l_header_rec,<br />
p_line_tbl => l_line_tbl,<br />
p_action_request_tbl => l_action_request_tbl,<br />
&#8211; OUT variables<br />
x_header_rec => l_header_rec_out,<br />
x_header_val_rec => l_header_val_rec_out,<br />
x_header_adj_tbl => l_header_adj_tbl_out,<br />
x_header_adj_val_tbl => l_header_adj_val_tbl_out,<br />
x_header_price_att_tbl => l_header_price_att_tbl_out,<br />
x_header_adj_att_tbl => l_header_adj_att_tbl_out,<br />
x_header_adj_assoc_tbl => l_header_adj_assoc_tbl_out,<br />
x_header_scredit_tbl => l_header_scredit_tbl_out,<br />
x_header_scredit_val_tbl => l_header_scredit_val_tbl_out,<br />
x_line_tbl => l_line_tbl_out,<br />
x_line_val_tbl => l_line_val_tbl_out,<br />
x_line_adj_tbl => l_line_adj_tbl_out,<br />
x_line_adj_val_tbl => l_line_adj_val_tbl_out,<br />
x_line_price_att_tbl => l_line_price_att_tbl_out,<br />
x_line_adj_att_tbl => l_line_adj_att_tbl_out,<br />
x_line_adj_assoc_tbl => l_line_adj_assoc_tbl_out,<br />
x_line_scredit_tbl => l_line_scredit_tbl_out,<br />
x_line_scredit_val_tbl => l_line_scredit_val_tbl_out,<br />
x_lot_serial_tbl => l_lot_serial_tbl_out,<br />
x_lot_serial_val_tbl => l_lot_serial_val_tbl_out,<br />
x_action_request_tbl => l_action_request_tbl_out,<br />
x_return_status => l_return_status,<br />
x_msg_count => l_msg_count,<br />
x_msg_data => l_msg_data);</p>
<p>/*****************CHECK RETURN STATUS***********************************/</p>
<p>if l_return_status = FND_API.G_RET_STS_SUCCESS then<br />
       if (l_debug_level > 0) then<br />
               dbms_output.put_line(&#8217;success&#8217;);<br />
       end if;<br />
       commit;<br />
       OE_ORDER_BOOK_UTIL.COMPLETE_BOOK_ELIGIBLE(1.0,<br />
       FND_API.G_FALSE,<br />
       l_header_rec_out.header_id,<br />
       b_return_status,<br />
       b_msg_count,<br />
       b_msg_data<br />
       );<br />
       commit;<br />
else<br />
       if (l_debug_level > 0) then<br />
               dbms_output.put_line(&#8217;failure&#8217;);<br />
       end if;<br />
       rollback;<br />
end if;</p>
<p>end loop; &#8212; END LOOP</p>
<p>/*****************DISPLAY RETURN STATUS FLAGS******************************/<br />
if (l_debug_level > 0) then<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;process ORDER ret status IS: &#8216; || l_return_status);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;process ORDER msg data IS: &#8216; || l_msg_data);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;process ORDER msg COUNT IS: &#8216; || l_msg_count);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;header.order_number IS: &#8216; || to_char(l_header_rec_out.order_number));<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;header.return_status IS: &#8216; || l_header_rec_out.return_status);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;header.booked_flag IS: &#8216; || l_header_rec_out.booked_flag);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;header.header_id IS: &#8216; || l_header_rec_out.header_id);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;header.order_source_id IS: &#8216; || l_header_rec_out.order_source_id);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;header.flow_status_code IS: &#8216; || l_header_rec_out.flow_status_code);<br />
end if;</p>
<p>/*****************DISPLAY ERROR MSGS*************************************/<br />
if (l_debug_level > 0) then<br />
       FOR i IN 1 .. l_msg_count LOOP<br />
       Oe_Msg_Pub.get(<br />
       p_msg_index => i<br />
       ,p_encoded => Fnd_Api.G_FALSE<br />
       ,p_data => l_data<br />
       ,p_msg_index_out => l_msg_index);</p>
<p>       DBMS_OUTPUT.PUT_LINE(&#8217;message is: &#8216; || l_data);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;message index is: &#8216; || l_msg_index);<br />
       END LOOP;<br />
end if;<br />
if (l_debug_level > 0) then<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;Debug = &#8216; || OE_DEBUG_PUB.G_DEBUG);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;Debug Level = &#8216; || to_char(OE_DEBUG_PUB.G_DEBUG_LEVEL));<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;Debug File = &#8216; || OE_DEBUG_PUB.G_DIR||&#8217;/'||OE_DEBUG_PUB.G_FILE);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;****************************************************&#8217;);</p>
<p>       OE_DEBUG_PUB.DEBUG_OFF;<br />
end if;</p>
<p>END;</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2007/12/06/finally-an-oe_order_pubprocess_order-script-that-works/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>IE 7 and IBM Password Manager Software Conflicts with JInitiator</title>
		<link>http://www.bryanthompsononline.com/oracle/2007/08/23/ie-7-and-ibm-password-manager-software-conflicts-with-jinitiator/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2007/08/23/ie-7-and-ibm-password-manager-software-conflicts-with-jinitiator/#comments</comments>
		<pubDate>Thu, 23 Aug 2007 21:52:06 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2007/08/23/ie-7-and-ibm-password-manager-software-conflicts-with-jinitiator/</guid>
		<description><![CDATA[I recently bought a Lenovo IBM ThinkPad T61 notebook pre-installed with Windows XP SP2, Internet Explorer 7, Office 2007, and all the other IBM software bells and whistles. So far I've been quite happy with my purchase, however, I was disappointed to find several issues with IE and IBM factory software that caused my Internet Explorer session to crash when attempting to launch Oracle JInitiator. Upon clicking an apps link I get the infamous "Internet Explorer has encountered a problem and needs to close" error...]]></description>
			<content:encoded><![CDATA[<p>I recently bought a Lenovo IBM ThinkPad T61 notebook pre-installed with Windows XP SP2, Internet Explorer 7, Office 2007, and all the other IBM software bells and whistles. So far I&#8217;ve been quite happy with my purchase, however, I was disappointed to find several issues with IE and IBM factory software that caused my Internet Explorer session to crash when attempting to launch Oracle JInitiator. Upon clicking an apps link I get the infamous &#8220;Internet Explorer has encountered a problem and needs to close&#8221; error.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2007/08/082307_2151_IE7andIBMPa1.gif" /></p>
<p>What good is a new laptop if I can&#8217;t use the tools to do my job!</p>
<p>Fortunately, after hours of tweaking, I was able to narrow down the root cause to two main issues:</p>
<p><strong>Internet Explorer 7 Quick Tabs Conflict<br />
</strong></p>
<p>The new Quick Tabs introduced in IE 7 do not play well with many Java-based applications &#8211; one of them being JInitiator. After my IE sessions continued to crash, I began randomly playing with the IE view settings and found that disabling the Quick Tabs bar solved the problem. To disable Quick Tabs, open an Internet Explorer 7 session and navigate to View &gt; Quick Tabs.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2007/08/082307_2151_IE7andIBMPa2.png" /></p>
<p>After disabling Quick Tabs, close your browser session and start a new one. Assuming this is your only software conflict, this should do the trick. Unlessâ€¦</p>
<p><strong>ThinkPad Security Solution Conflict</strong></p>
<p>Lenovo offers the ThinkVantage Productivity Center with all their notebooks. One of the neat features of the Productivity Center is the Client Security Solution. Not only does this solution allow 
<table align="left" border="0" cellpadding="0" cellspacing="0">
<tr><td>
<script type="text/javascript"><!--
google_ad_client = "pub-4516530845610319";
//200x200, created 12/11/07
google_ad_slot = "2730876339";
google_ad_width = 200;
google_ad_height = 200;
//--></script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</td></tr>
</table>
you to store passwords to all your applications and websites safely and securely, but it auto-logs into the apps for you too. Couple this with the new finger print reader and you have an amazingly effective, yet secure, password manager.</p>
<p>Unfortunately, an IE 7 add-on that the Client Security Solution uses to capture and store Internet based login information conflicts with JInitiator. The only apparent fix for this is to disable the Password Manager feature of the Client Security Solution entirely.</p>
<p>To do this, click the big blue ThinkVantage button on your notebook &#8211; the Productivity Center menu will appear.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2007/08/082307_2151_IE7andIBMPa3.png" /></p>
<p>Next, hover over ThinkVantage Technologies, then select Client Security Solution &#8211; the solution menu window will appear. Click the Password Manager and you should see a screen like this:</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2007/08/082307_2151_IE7andIBMPa4.png" /></p>
<p>Clicking the &#8220;Disable&#8221; button will shutdown the manager.</p>
<p>Next, we need to disable the IE 7 add-ons that were installed by the Client Security Solution. To do this, open an IE 7 session and navigate to Tools &gt; Manage Add-ons &gt; Enable or Disable Add-ons. The Manage Add-ons window will appear.</p>
<p>In the manager you will notice two Lenovo-based add-ons:</p>
<ul>
<li>CPwmIEBrowserHelper Object</li>
<li>ThinkVantage Password Manager</li>
</ul>
<p>Select each of these add-ons and click the &#8220;Disable&#8221; radio button below so that both add-ons show up under the &#8220;Disabled&#8221; list as such:</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2007/08/082307_2151_IE7andIBMPa5.png" /></p>
<p>Once you&#8217;ve finished, click OK, close all of your applications, and restart your notebook. After you log back into Windows, open an Internet Explorer session and try logging back into Oracle Apps. Again, assuming there are no other software conflicts with JInitiator, this should do the trick.</p>
<p>It&#8217;s unfortunate that all the features of IE 7 and ThinkVantage can&#8217;t be fully utilized, but like all initial software release, these kind of bugs usually happen and eventually get resolved through patches, upgrades, etc. Maybe Windows, Oracle and IBM can collectively provide a fix so that all three applications can play nicely together.</p>
<p>Did I just write that?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2007/08/23/ie-7-and-ibm-password-manager-software-conflicts-with-jinitiator/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
