Sunday, August 28, 2011

How to bypass Signal on Order Object while doing Quote to Order conversion using AutoOrderSalesQuote signal with Dynamic Pricing in Place

 

We have dynamic pricing enabled in our environment with additional custom discounting defined for Quote and we convert Quote to Order just for integration purpose. When we convert quote to order - we are seeing following error message in log file all time. Sometime this stops whole execution.

Log file Error:-
Error invoking service "Context Service" method 'GetRowSetData'
Field: 'Additional Discount Flag' does not exists in definition for business component 'Order Entry – Orders'

GUI Error:-
img1
Note:- Additional Discount Flag is custom field added for one of additional discounting.

Upon analysis we found that CalculatePriceAll signal is invoked and this error occurred.

There are following option to bypass CalculatePriceAll function on Order Entry - Orders which we use as placeholder for integration so no changes are required/expected on Order object.

Option I - AutoOrderSalesQuote uses "QuoteToSalesOrder" as a data map. Navigate to Administration -Application > Data Map Administration and select QuoteToSalesOrder. In Data map component select header and select "Skip Order Management Signals"  on Destination Business component in Advance option.
img2

For us this option I was configured whereas it did not worked as we had customization in Dynamic Pricing.

Option II - Add appropriate condition to skip the signal. Navigate to Administration - Order Management > Signal > Query "CalculatePriceAll" and click on "Lock" > drill down on Workspace

img3
img4

Option III - Modify "PSP Driver Workflow Process" workflow process with following details.
Screen shot before configuration
IMG5

Configuration
1. Add "Mode" as process property in WF Property
2. I designed more add conditional step with default pointing to "End Step" and conditional branch to "". Condition to use "Mode" = "Quote"


img6

We chose option III as first two options were not working due to customization in pricing and we did use Order object as placeholder for integration.

 

: : :   E n j o y   : : :     :- )

Monday, August 22, 2011

View Siebel Repository details in Siebel Client Application

 

IF you not aware, Siebel Tools works on Siebel's BO, BC, Screen, View concept. E.g. To find where Business component definitions are stored, select a Business component object in Tools and select Help > About View from Tools menu.

image

Upon selection it will popup the details wherein you will find Business object, business component, views etc as below.

image

If this information is available in Siebel Tools then we should be able to use this information and display within Siebel Client application. This was needed as we have Business Intelligence team who is somewhat familiar with Siebel Tools details. By making this information available in Siebel Client we are making team's job simpler.

To show one example, I have configured Application object for Siebel Client. To achieve this, I created two applets one for Application and second for screen tabs, added this applets to View,View to newly created Screen and Screen to one of Siebel Sales Enterprise (Application object). Finally add newly created view to user's responsibility. Final outcome will be similar to below screen shot.

image

Note:- If you use views found using Help > About view, it will not appear in Siebel Client. I tried the same and felt it is internally managed or due to repository views, secondly applet are having special class so web layout does not show anything inside Siebel Tools.

I have attached project export for reference, you job is only adding screens to existing application and view to user’s responsibility. Similarly you can built/expose all Tools objects inside Siebel Client. Only one thing to care – create applets as read only by setting “No Delete”, “No Insert”, “No Merge”, “No Update” to True as well as make views read-only at responsibility level.

Attachment:- Click here to Download Project Sif

 

: : :   E n j o y   :-)     : : : 

Wednesday, August 17, 2011

Assignment Manager Crash and SBL-GEN-03001: Error allocating DynArrCreate Organization Skill Item


Approximately year back we faced this issue where Assignment Manager was crashing with "SBL-GEN-03001: Error allocating DynArrCreate Organization Skill Items" as error.Upon more analysis I found that this is memory related issue caused by huge orphan records in "S_BU_SKILL_IT". In our environment we are creating Organization Assignment condition and skill items  almost on daily to support business requirement. Process we followed programmatically is delete  organization conditions and recreate organization assignment condition as per latest data.
To be very specific, orphan records are due to cascade delete was set to None on "Organization Skill/Organization Skill Item" instead of "Delete".
Since this happened in production we had following option to choose from.
  • Short Term:
    Delete records in S_BU_SKILL_IT which does not have reference in S_BU_SKILL. There is vanilla configuration which does not delete records from Organization Skill Item (S_BU_SKILL_IT) when Organization Skill (S_BU_SKILL) is deleted. 
    • Stop Assignment Manager and Batch assignment manager.
    • Build pl/SQL script to delete records wherein there is no reference to s_bu_skill.
    • Once delete is done. Delete rule cache for assignment manager
    • Restart Assignment Manager and Batch Assignment Manager
  • Long Term:
    Configuration change to set Cascade delete property to "Delete" for link "Organization Skill/Organization Skill Item"
Due to urgency we took short term approach and created pl/sql process to delete records from s_bu_skill_it and used below code to perform the operation and later on we pushed configuration change as well to resolve issue permanently.


declare
   cursor src is
              select row_id  from siebel.s_bu_skill_it a  where bu_skill_id  not in (select row_id from siebel.s_bu_skill b where b.ROW_ID = a.BU_SKILL_ID) ;
    v_cnt number :=0;
    v_recipients varchar2(200) := 'email_address';
    conn utl_smtp.connection;
    v_err_msg varchar2(200);
begin
     FOR cur1 IN src LOOP
        EXIT WHEN src  %NOTFOUND;
             delete from siebel.s_bu_skill_it where row_id = cur1.row_id;
             v_cnt := v_cnt +1 ;
             if v_cnt > 100000 then
                commit;
                v_cnt :=0;
             end if;
     end loop;
     commit;
commit;
exception
    when others then
        commit;
        v_err_msg :=substr(SQLERRM, 1, 200);
        DBMS_OUTPUT.PUT_LINE(v_err_msg);
end;

Call stack during crash:

sslcshar +0x190dc = SSstring::operator=() +0xc
sslcshar +0x25235 = CCFMiscUtil::GetAssertOnErrorList() +0x25
sslcshar +0x37f61 = scfErrorBase::LogError() +0x91
sslcasgn +0x41a2c = GetWLObjName() +0x9d0c
sslcasgn +0x4492b = StartRules() +0xfab
sssaasgn +0x2245 = CSSAsgnBase::operator=() +0x1095
sssaasgn +0x2f5c = CreateSmiMThreadObj() +0x3bc
sssaasgn +0x57c7 = ReqCompCleanup() +0x27
siebmtsh +0x96ec = SmiCleanupDetTask() +0x118c
siebmtsh +0x273c6 = SmiRegisterThrdCleanUpFunc() +0x2546
kernel32 +0x2f23b = ProcessIdToSessionId() +0x209
Other References : Doc ID 1103948.1