Sunday, March 15, 2009

Scriptless Siebel - A Challenge

Those who know my professional me, are well aware of the fact that I often act as an advocate against scripting. Let me define scripting vs. adding functionality (that doesn't yet exist) to Siebel CRM.

Personally, I define "scripting" as the attempt to solve requirements such as automation, validation or integration in Siebel CRM by inserting custom code into the event handlers exposed by the Siebel application.

As we all know, Siebel CRM has four object types that expose event handlers:
  • Applet
  • Application
  • Business Component
  • Business Service
I define adding code to the first three object types as "scripting". I consider business services the only place where custom code should reside. One reason for this is that we can apply professional coding concepts such as reusability and encapsulation.

During the past 8 years which I mainly spent either in the front of a Siebel classroom or on various projects, I came to the conclusion that (increasing with the Siebel version number) there are fewer valid reasons to use scripting (objects other than business services) than we all might think.

Siebel 7 introduced so many standard business services and with Siebel 8.1 we currently have so many non-script options (workflow being only one of many) to solve automation, validation or integration requirements.

In a previous post (Close to the Standard) I tried to point out how to add functionality to Siebel CRM while behaving like a standard developer. When standard developers at Oracle engineering need to add new functionality to Siebel CRM, they write business services and orchestrate them in workflows.

So this is the way we should solve requirements in the 3rd millenium:

Write business services (or re-use existing ones, of course)
and orchestrate them (if necessary) using Siebel Workflow.


Now here's my challenge for you:

Please use the comment function to send in requirements from your project experience where you believe that scripting (that is adding code to the Application, Applet or Business Component event handlers) is the only way to solve it.

I will investigate the requirements (for Siebel 8) and I am convinced that there is either a non-script solution or that the functionality can be implemented as a reusable, upgradeable and encapsulated business service.

Is @lex out of his tiny dirty little mind? Well, I have taken over the task of creating a scripting workshop and before I start I would really like to know if I shouldn't rather be doing a scripting alternatives workshop ;-)

Anxiously waiting for your comments


@lex

72 comments:

Anonymous said...

Though my career in Siebel doesn't span 8 years (about half of that) I do agree that there are siginificant more options in the later versions of Siebel then the earlier ones. One idea I had that would be harder to do without the use of script is a virtual business component. I'd love to hear you ideas on this one.

@lex said...

Hi Anonymous,

thanks for your comment.

Virtual business components require a business service "by nature" as their data source. In Siebel 7.7, External Business Components have been introduced which enable us to connect to relational (Oracle, MS SQL Server, DB2) and analytical (Siebel Analytics/Oracle BI Server) data sources without an extra coded business service.

So if your data source is one of the above, use external BCs instead of VBCs. And if your external system is non-relational but capable of dealing with XML you can use the standard XML Gateway business service as the data source for the VBC.

So there are only a few situations left when you really need to write your own business service.

@lex

Nitin Jain said...

Hi Alex,

Nice to see this thread. Much wanted, but missing from the top tech support areas.

Something peculiar that I have been running around with for the past few days.
I need to find whether "String A" exists in another "string B" as a substring or not. Solution that I know of, using indexOf() or the Clib().

Any ideas??

Neel said...

Hi Alex,

I really appreciate your intiative. Here is where I believe that you will have to have scripting on siebel objects.

There are quite a few requirements in our project where you have to take certain input from user and perform certain task.

For example:
Ask user Do you want to do this? (via YES/NO Dialog box) and if user says yes then ask user for his comments and create a notes record with his comments in descripting field.

I have not able to find out any way in siebel to take user input without scripting.

Deadok said...

Hello, @alex.
I totally agree with you about scripts. But what do you say about displaying popup message boxes? Every implementation i met, has such requirenment - display a standard windows warning message "Do you really want to do this?" (for example, there is a button that starts a difficult workflow and user needs to approve this).
The only good way i see is to use browser scripting (black magic, as i call it :)). Of course, i can build a popup applet on VBC or even use a Task UI, but that isn't good idea...

Maybe you know a better way?

@lex said...

Hi Neel and Deadok,

many thanks for your input. I think that the popup dialog topic is worth a separate post but here are questions that typically come to my mind when I am confronted with that requirement:

1. Is the dialog with the user part of a larger business process? If yes, and if the process is worth it, why not go for Task UI (or interactive workflows if you are on Siebel 7)?

2. Are you in the privileged situation of using Siebel Customer Order Management? If yes, then you can use the User Messaging Framework (UMF) which btw only works on some BC classes.

3. How often do you need a user dialog? A quick browser script here and another one there often does the trick but I believe that in most projects there is a lack of "generic" or "framework" thinking. So given the fact that the browser based UI is subject to version changes most often, I would vote for a well-designed "user dialog framework" which involves a minimum amount of browser business services and a maximum amount of server business services.

4. In general, try to think "business service" when you script.

Thanks again for adding value to this thread

@lex

@lex said...

Hi Nitin,

this seems to be a candidate for a function that is frequently needed and therefore it should be implemented either as a workflow (to be used as a subworkflow) or as a business service method.

I always evaluate Siebel Workflow first because it limits the amount of script code. So I can concentrate on producing high-quality code if scripting is really needed.

Thanks for participating and adding value to this thread

@lex

Neel said...

Alex,

Here is another one for you.

We have Opportunities as Parent and Activities (Action BC) as child. Allow users to delete records from an Activities List Applet, only if more than 1 record is present on BC.

There is quite an intresting discussion going on
http://siebelunleashed.com/restricting-record-deletion/

and to me right now it seems like scripting will be better than configuration in this case.

Please let us know your thoughts about it

@lex said...

Hi Neel,

thanks for the contribution.

I have been following the discussion and as I indicated in a comment above, I tend to evaluate Siebel Workflow first, and to me it seems a valid solution to have a workflow query for all activities which have the same Opportunity Id and if the number is 1 then go to a stop step to prohibit the deletion.

I have added this requirement to my tentative list of possible posts.

@lex

Rene said...

We have implemented script to handle pretty simple calculations but the catch is that the calculated values update OTHER RECORDS within that same (child) business component.

I will give a simplified example. Let's assume we are working with the Quote Item business component and there are 5 line item records, with line item numbers of 1, 2, 3, 4, 5. Let's also assume that making updates to the Quantity of certain line items should update the Quantity of other line items:

Line Item Qty
1 40
2 30
3 10
4 = Qty of Line 1 * Qty of Line 3
5 = (Qty of Line 1 / Qty of Line 4) + Qty of Line 3

So a user changing the value of Line Item 1 should automatically update Line Item 4, which should automatically update Line Item 5. Similarly changing the value of Line Item 3 should automatically update Line Item 4 and Line Item 5.

In addition to this, the rules change frequently. So for example Line5 might be modified to say 5 = (Qty of Line 1 / Qty of Line 4) + Qty of Line 3 + 7

When rules change, we don't want to distribute a new SRF.

Rene

@lex said...

Hi Rene,

many thanks for your contribution.

I assume that you can identify the line items by a criteria other than the sequence. But in any case, I have added your requirement to my list and will let you know what my investigation reveals.

many thanks again

@lex

Rene said...

Hi Alex,

Yes, they can be identified by something other than the sequence. For sake of simplicity, I left out the details.

I look forward to your solution! We played around with using Haley which at first glance seemed like a perfect solution, but we were not able to get it to work.

-Rene

Pankaj Juneja said...

Hi Alex, I had requirement in my project where in I was forced to do scripting after thinking a lot to avoid scripting.The requirement was quite simple but there was no config solution which I found in Siebel 7.7

We were sending a Contact Record to external system via HTTP.That contact Record had a field called Work Phone of Dtype_Phone.I guess you might be aware that Dtype_Phones are stored along with Format string which consists of zeroes, if user enterd some space in Phone number like - If User Enters +44123 456 789 then it will be stored in database as -
+44123456789CRLF000 000 000.

Now I was using a WF which use EAI Siebel adapter to get Siebel Message. Then I would convert that into xml and send to external system.External system said to remove those zeroes and send.Though there is a delimitter in form of new line between zeroes and actual number, I was unable to do this task in config.

SO At last I created a business service and created a calculated field. That calculated field would call this BS and give the WOrkPhone field as input and take the new Phone in which zeroes are rmoved as output. Then I added this Calculated field in IO and used EAI siebel Adapter to get this field not actual Work Phone.

Can you please tell ,if this can be done without scripting

@lex said...

Hi Pankaj,

thanks for your comment and the detailed requirement. I will investigate. In the meantime let me say that the solution limits the amount of scripting and uses a business service, so it seems quite valid. Of course it would be better to have no script at all.

Maybe the Siebel community has some input on this.

have a nice day

@lex

JASON LE said...

Hi Alex & Pankaj,

I may have a solution for you guys, it can be done without using script.

http://blog.jasonle.com/2009/01/strip-off-number-format-in-dtypephone.html

Any feedback is welcome
-Jason

@lex said...

Hi Jason,

many thanks for your input. I am very anxious to see your solutions (to the phone number challenge as well as the other goodies you mention on your blog)

keep up the good foot

@lex

cricfan said...

hi
firt of all great site.
Have a requirement.
When defining an assesment template i need to link the attributes to certain fields in the contact entity( all the fields will be either LOV's or numbers.
scores will be linked to each value of the LOV or to a number range in case of a numeric field

Thanks in advance for the help
regards
guru

@lex said...

Hi cricfan,

many thanks for the comment and feedback.

I'll see what I can do but I am not too sure that there is much to offer as assessment templates are somewhat hardcoded.

have fun

@lex

Ben Kennedy said...

Hi Alex,

I have a requirement where I need to round a calulated number with decimals to an integer in the classic way (round up for 5 or greater, else round down).

The only way i can think of acheiving this is using the eScript Math.Round() method.

Do you know of any alternative to scripting this?

Ben

Shiva said...

Hi Alex,

Its been wonderful to read all your postings related to "No" to scripting. Some of your suggestions and solutions based on undocumented business service is amazing. Appreciate your thought of gathering them in the blog.

I have requirement let me know whether is it feasible in Siebel without scripting.

Realignments for accounts and contacts are received in excel periodically. The frequency could also be everyday and let me know is there a way to automate to read this excel perform the realignment process without any scripting.

Shiva

@lex said...

Hi Shiva,

thanks for your feedback and your requirement. Either way you put it: Reading data from excel (e.g. via a VBC) requires scripting because there is no standard business service to integrate with Excel (there is one for CSV files, though).

have fun

@lex

@lex said...

Hi Shiva,

thanks for your feedback and your requirement. Either way you put it: Reading data from excel (e.g. via a VBC) requires scripting because there is no standard business service to integrate with Excel (there is one for CSV files, though).

have fun

@lex

@lex said...

For the benefit of other readers, this is a summary of some e-mails that I exchanged with Ben on his requirement to get a rounded value:

My 1st reply:

If you need to display the rounded value in an applet, it's easy: Use the Display Format
property (example: #.##) and it will automatically round (1000.345 will become 1000.35)

It's not that easy for a (calculated) field (for EAI etc). I would recommend using the InvokeServiceMethod function and call a scripted
business service method which does the rounding using math.round().

Ben's reply:

The calculated value is coming from the Sales Assessment scoring which sums
all the answers to the questions and then divide this figure by number of
questions answered to give an Average Score.

This Average Score needs to be rounded to give an integer as it needs to map
to a text value (good = 1, adequate = 2, etc.).

My reply:

I investigated the Sales Assessment BC and found that it would be good to have a calculated field "Field 1" which uses the Assessment Score field and a MVL to the Sales Assessment Value to do the average score.

Field 2 would use the IIf([Field 1] >= value, "good", etc....) to create the text display (or Icon Map if needed).

If the calculation is more sophisticated I would still prefer a well-written business service method to be called by InvokeServiceMethod.

Of course by obeying the law of good performance

Have a nice day

@lex

@lex said...

@Rene

sorry for the delay.

I investigated your requirement and my first approach was using the Siebel Business Rules (aka Haley). You could try to place most of the logic that changes frequently into Haley and also use custom written business services to implement the things that are too complex to implement in other ways.

hope this helps

@lex

Rene said...

Hi Alex,

We did initially look at Haley, but found it wouldn't do the trick. In the example I gave:

Line Item Qty
1 40
2 30
3 10
4 = Qty of Line 1 * Qty of Line 3
5 = (Qty of Line 1 / Qty of Line 4) + Qty of Line 3

If I changed the value for line 1, how do you force line 4 and line 5 to fire? It appears as if you can only get Haley to "fire" for the row that it is associated with. I opened an SR with Siebel asking if they had any advice and they were unable to provide any. If you can provide any additional way to get Haley to fire for line 4 and line 5 if I change line 1, it would be appreciated.

@lex said...

Hi Rene,

unfortunately my Haley skills are limited. As your requirements includes a "no srf" clause, I think it is still a valid place to store the rules in a central location. Even if you have to combine it with script code (You could use a script or workflow to parse the record set and call the Business Rules Servie for each record, just an idea).

Also, as we are in the order management area here, you could evaluate if the Row Set Transformation Toolkit business service can do anything for you.

However, to finalize this: I would say that your solution will always involve some scripting but it's better to use OOB business services in your script rather than reinventing the wheel (or Haley that is).

Regards

@lex

Anonymous said...

Hi Alex,

I encounted this blog and finally I have a (I hope challenging) question;

1) Requirement: two list columns/controls need to be required. They are not required on the BC, because of interfaces.

2) Requirement: making a multivalue field required.

Can you please have a look how this can be configured without the use of script?

Kind regards,

Remi

Joshua said...

Hi Alex

I love reading your blog, thanks for the information source.

I quite often have a requirement from the client where they would like some automation to occur whan a particular field is updated on a bc. This could be very complicated with a lot of data being created on other related BCs. The client would like the workflow to be executed in real time then would like the current view to be refreshed to show the updated data on the screen. So if new records are created which would exist in MVGs or the current detail view then this should show after the automation.

Also further to this, the automation would be required if that particular field is updated, but the automation should occur after the record is committed. So therefore if the was updated, but then prior to save, the user then set the field back to the original value, nothing should happen because this is not a field update.

I dont know how this could be implemented without script. With script it would be a messy solution which would involve setting a profile attribute flag on the PreSetFieldValue and SetFieldValue to flag that the particular field was updated and what the prior value of that particular field was and then on the WriteRecord script to implement the automation if the profile attribute flag is set. After this script has run on WriteRecord we could execute the FINS Teller UI Navigation Business Service RefreshCurrentApplet method to refresh the current view keeping the current query context in tact.

I dont like this solution and would like to know if you have a better solution within the "Scriptless Siebel" stream.

Regards

Josh

@lex said...

Hi Joshua,

thank you for the requirement and the feedback on my blog. I will investigate this but as you indicate yourself, things can become very complicated very easily...

but let's see. Thanks for your patience in advance

have a nice day

@lex

@lex said...

In response to Joshua's comment:

As your requirement seems very complex, I have just a few thoughts and directions.
As you state, a workflow should be created to carry out the actual work on the data.
The invocation of the workflow could be handled by any "post" event handler (runtime events, scripting or the named method user prop).

Also, if you are on Siebel 8.0 or later you could create a Task UI to guide users through the process.

There are various benefits in Task UI such as the "Defer Write Record" property for the Siebel Operation step which would
allow you more control over the data manipulations.

have a nice day

@lex

@lex said...

In response to Remi's comment:

1)

Use the Field User Prop "Required". It allows you to specify an expression. When the expression evaluates to Y then the field will become required.

The user will see the same error message as for a field with the Required property set to true but the red asterisk will NOT appear in a form applet.

2)

The Employee BC has some special behavior (and user props along with a special C++ class) that enable a required MVField (Position) but I could not implement that on any other BC...

have a nice day

@lex

prasanna said...

Hi,

We have a requirement to update another field on an activity when a primary Staff responsible of an activity is updated. At the moment, On Field update set will not work on Pirmary field. I found a simillar SR in the Meta Link. If we were to achive this, this could only be done thro' script. How would you proceed on this requirement if cannot be done thro script. ofcourse the update should happen real time (WF is so out of question)

Prasanna

@lex said...

Hi Prasanna,

WF is not really out of question for real time requirements, because it integrates nicely with runtime events.

If your diligent investigation shows that a declarative solution is not available, then you should write a business service that accomplishes what you need and (if possible/feasible) use the business service inside a workflow.

this ensures that you can call the logic from any place in the application.

have a nice day

@lex

Tany said...

Hi,

We have a requirement in our project as below:
The requirements is to write the data from siebel to a text file and send this txt file to the external system.
When writing data to text file, the data will be from 2 - 3 BCs in siebel.
Please let me know how to achieve this requirement without using scripting.

Thanks in advance!

@lex said...

Hi Tany,

this is a typical EAI solution involving Integration Objects to pull the data from your BCs using EAI Siebel Adapter, then convert (see below), then write the data to a file using the EAI File Transport business service.

All packed in a workflow.

If your external system requires a data format other than XML, you would have to consider creating a custom business service which converts the output of EAI Siebel Adapter to the format you need.

I also recommend that anyone involved in Siebel EAI takes the "Integrating Siebel Applications" course which will educate you in depth on Siebel EAI.

hope this helps

have a nice day

@lex

Loki said...

Hi Alex,

I appreciate your spectacular initiative to provide scriptless Siebel solutions.
I have a requirement to constrain an Association Applet through configuration.

In the Opportunity applet, the Contact Association applet should display the contacts that are associated with the Account that I have selected for the opportunity.

I have followed the below steps to meet this requirement:
1) Trigger a runtime event on the ChangeRecord event of Opportunity. Here, I will set a profile attribute with the Account Name that I have selected for an opportunity.
2) Provide the below search specification on the Contact Association Applet:
[Account Name in Contact BC] = [value of the profile attribute]

The above approach gave me the desired results, but it's extremely time consuming. It takes a lot of time to open the Contact Shuttle applet when I invoke the MVG.

Please let me know if there is an alternate approach to achieve this requirement.

@lex said...

Hi Loki,

many thanks for your comment.

This has been tried before and I think the only way is via a profile attribute.

Using the link search spec or ParentFieldValue() on the Assoc applet's search spec do not work (I did a quick test).

So there seems to remain a need for scripting, however I would go for Account Id instead of the Account name.

Maybe the astute blog reader community has a better idea, please comment away ;-)

have a nice day

@lex

@lex said...

Hi Loki,

me again.

Sorry, it's late here and I shouldn't be too quick with giving up ;-)

You can set the profile attribute using runtime events. Simply create an action set with an action which uses the "Set Attribute" action type and set your profile attribute to [Account Id].

Associate the action set with the Opportunity BCs ChangeRecord event handler and test.

Worked over here ;-)
Worth a post, I think

Have a nice day

@lex

Loki said...

Hi Alex,

Many thanks for your quick response.
As specified in my previous post, I had followed the same approach that you have mentioned here.
The only concern I had is the time it takes to open the shuttle applet.
So, I just wanted to know if there is any alternate approach which improves the response time.
I feel a script provides a better response time in this scenario rather than going for a profile attribute and including it in the search spec.
May I know your views on this.

@lex said...

Hi Loki,

I just did testing (with the runtime event and using Account Id the applet search spec) against the sample database and I noticed a slight delay in opening the shuttle applet but still acceptable.

I have no other ideas here except - as indicated - to use an Id field rather than the name field because they are usually better indexed.

I will create a separate post on this - please allow me some time ;-)

have a nice day

@lex

Chandu said...

Hi Alex,

Whenever we create a new applet, we get some menu items created by default. We can add some more menu items, if required.
Can we replicate the functionality of the default menu items through a button click. Say, I create a new button on an applet. On clicking it, it should display the total number of records (Record Count) displayed in that applet. Is it possible to achieve this through configuration?
I tried to achieve this requirement by setting the "Method Invoked" property of the control to "RecordCount" as this is the method associated with the command "Record Count (SWE)", but I get the below error when I click the button:
---------------------------
Siebel
---------------------------
Could not find 'Applet' named ' SearchType=Find'. This object is inactive or nonexistent.(SBL-DAT-00144)

---------------------------
OK
---------------------------
Could you please suggest a solution for this.

@lex said...

Hi Chandu,

thanks for the very interesting requirement. I can reproduce the behavior and it seems to be related to the fact that the command object references a popup applet. I tried to set control user props (similar to the Query Assistant button) but a first test failed again.

I would recommend that you use a toolbar button (which references the "Record Count (SWE)" command) for that purpose, so you do not have to put a button on each and every applet.

But I will try to investigate more and maybe one of our readers has a solution for this?

have a nice day

@lex

@lex said...

Hi Chandu,

I found a solution which will be posted soon. Here is a preview: Use ShowPopup for MethodInvoked and set two Control user props for the button (1: Name: Popup | Value: Record Count Applet; 2: Name: Mode | Value: Edit).

have a nice day

@lex

AlexM said...

Hi Alex,
I've had such requirement. I've had to validate a field value on preset event, and validation logic is kind of complex one. I wrote Business Service and provide it with this field value to validate. First I used runtime events to invoke method that was defined as UserProperty "Named Method" on BC which invoked BusService and provide it a field value. But the value was not runtime, it was the previous recorded one. Immediate post change did not figure it out.
Then I've tried to Invoke Service directly from ActionSet, did not help. Tried to use ProfAttributes, also didn't help. I could only get the value, currently written to the field on BCs' PreSet event and Invoke BusService from there.
Could I somehow not to script that event on BC and do it the other way? Thanks.

@lex said...

Hi AlexM,

thanks for your entry. As you describe you have evaluated several scriptless approaches to invoke your custom business service.

It is highly recommendable to implement functionality as a business service - which you did.

If the "final mile" for invoking the business service is a BC event handler script, and you have ensured that there is no other way, it should be fine.

You might want to look into this post on how to pass the runtime event context to a custom business service to see if it can help you find a scriptless solution.

have a nice day

@lex

Yanitta said...

Hi @lex

If we have a multi server setup where the App Object Manager component is available on one particular server but WfProcMgr is not available on this server, it is available on another server dedicated to workflows. If you want to invoke a workflow through a runtime event using scriptless solution but you want to ensure that the workflow is invoked through the WfProcMgr component on the correct server how do you implement this from runtime event on server that does not have WfProcMgr component?

Yanitta said...

Hi @lex

What if you have a custom button which has MethodInvoked = CustomMethod.

If I want to call a workflow from this custom method or call a business service from this custom method can this be done without script? How do you avoid having to write script to prevent the custom method being invoked by the Siebel engine and causing error that Siebel does not recognize the custom method without putting script for CancelOperation on the PreInvokeMethod event script?

Yanitta
http://yanisoftware.com

@lex said...

Hi Yanitta,

thanks for your inquiries:

ad 1) Launching a workflow in WfProcMgr instead of the App OM is possible by using the (Asynchronous) Server Request business service.

Any workflow invoked from a runtime event will run in the current session but using the a/m business service, you can spawn other workflows on different servers.

ad 2) Workflow has an Event Cancel Flag to reproduce that behaviour.

have a nice day

@lex

praveen said...

Hi,

I had a requirement :
Populate with the current date any time the field "Shipment Verified" is changed from null to "Yes".
Populate with null any time the field Shipment verified is changed from "Yes" to null.

please suggest how to achieve this.

@lex said...

Hi Praveen,

there are plenty of examples for such behaviour in the OOB Siebel repository. You might want to check the Order Entry - Orders buscomp. In the BC user properties, there is for example the On Field Update Set 6 user prop which sets the As Of Date field to the current Timestamp() any time the Status field is updated.

You can verify this behaviour in the Sales Orders screen.

It is easy to copy an existing user property, increase the sequence number to the next valid value and modify the user property value to your needs.

hope this helps

@lex

Premjit said...

Hi Alex

Have you ever created a system activity object Postion BC.

I am trying to do so to create activity records whenever I said an email via Outbound Communications Mgr BS.

I do not want to go for workflows or scripting because system activity object is an OOTB feature.

Problem is that Suppose there are two records for Parent BC to send email to; only the first contact gets email.

I tried checking the logs and it says error setting <> for field <>

Please help

Reggie Morgan said...

Hi Alex,

I'm fairly new to siebel,however since I've started working on my current siebel project I've found one situation where I cannot find an alternative to scripting to carry out the task.

So here it is.

When I'm creating a mass mailing list for a marketing campaign, I have an account with several thousand contacts partaining to that account.

My question is how can I add all of these contacts to a list within the List Management applet without having to resort to using script.

(List Mgmt List Member List Applet).

Again since I'm no expert I'm not to sure if there is some sort of vanilla functionality that will enable me to do this, but I've asked a few of my more experienced colleagues and they all point to scripting :D

Anyway Thanks Alex :)

Alexander Hansal said...

Hi Reggie,

if you are using Siebel Industry Applications, you can easily run a query on contacts or accounts and save the result as a target list (using the button at the left of the toolbar). Then you can associate the list with the campaign and load the campaign as usual.

If you're on horizontal, then the target list feature is not available but any query and insert operation within Siebel CRM can be easily accomplished with EAI Siebel Adapter and Integration Objects. So you can create a workflow which does the job.

Scripting should always be the last resort and not a "knee-jerk" reflex when something looks a bit complicated ;-)

have a nice day

@lex

Steve S said...

Alex,

I have a requirement to link employee pictures to employee records. The obvious solution is to use an attachment BC.

However, I'd like to add a couple other pieces of functionality.
1. I'd like to display the picture on the Employee List View.
2. I'd also like the attachments to act like an MVL where a primary picture is selected and that becomes the picture displayed.
3. I want to disallow users from adding anything but image files to the attachments associated to the employee record.

Is there a scriptless solution to for this?

Or is the idea of using attachments the wrong approach?

Alexander Hansal said...

Hi Steve,

just license Fusion HCM (just kidding ;-).

Seriously, if I were to implement such a scenario, I would investigate the existing standard functionality around products and catalogs. There is actually a list applet which displays images in the catalog realm.

Hope this helps you finding a scriptless solution.

have a nice day

@lex

deepsinghal.com said...

Hi,
Just wanted to know if this requirement can be achieved by some script-less solution:

We need to query on S_ORG_EXT_XM for some criteria and display in applet all corresponding S_ORG_EXT records.

I am struck in how to refresh the bus-comp with Account records.

deepsinghal.com said...

Can we display records retieved via Query siebel Operation in an Apllet to the user?

Alexander Hansal said...

Hi deepsinghal.com,

I would create a multi value field on the xm data inside the Account bc. Then you can query easily.

Have a nice day

Alex

deepsinghal.com said...

Thanks!!! Alex for the response. I am new to siebel and is finding thsi post very helpful. But my question is if I query Account records using Siebel Operation in Workflow, Will I be able to render these recors to the User? Say the user presses a button and a workflow is invoked via. Runtime which queries certain records and dispalys the same to user?

Alexander Hansal said...

Hi again,

if the user is viewing an applet on the same BC, the Siebel Operation Query will modify the BC so that the user sees the query results.

have a nice day

@lex

deepsinghal.com said...

Thanks a lot for the update. Can we have this scenario: user see first 10 records and then pressed button to fetch next set and again to fetch next set until all records are displayed and at the end the button gets disabled?

Alexander Hansal said...

Hi again,

what you are describing is Siebel standard functionality...

have a nice day

@lex

deepsinghal.com said...

We usually gets a adhoc request to process a CSV files and import the records in some BC (few of then does not have applet on them).Though I have a script written for it which I run at client side., I want to get it through workflow. I also dont want to user Read CSV files Business service since it requires IO which has to be compiled in SRF. Neither I can use Import functionality. Could you suggest me some other ways to read each record of CSV files and import these using Siebel Operation. I dont want to have a srf dependency. Please suggest.

Alexander Hansal said...

Hi again,

because of the requirement to stay outside of the SRF, the workflow would need to use standard business services like EAI File Transport and Siebel Operations. But it smells like hard work with parsing the file content.

Integration Objects and the Read CSV service are much easier to use but need SRF compilation.

So if you wish to be completely SRF independent, a script seems to be a valid solution.

have a nice day

@lex

Anonymous said...

Hi, We have a requirement to split a Sales Order into multiple request to the same external systems depending on the Line Items on the Order and we should be able to update the Status of the Sales Order depending on the status of the orders sent to the downstream systems. We are trying to figure out a Seamless way of implementing this with reduced scripting. Is there a pointer that you can provide me with respect to the solution options in Siebel 7.8?

deepsinghal.com said...

I need to capture the query fired bu user, modify it for certain criteria nad then execute it. Can I get this done without making changes into the SRF

Alexander Hansal said...

Hi deepsinghal,

If you can implement the logic in a workflow process and invoke it through a runtime event such as prequery on the bc, there is no srf change necessary.


Have a nice day

@lex

Thiago Raphael Ribas said...

Hi @lex!
A new challenge!

We have a Data Validation being invoked through a Runtime Event that fires on PreWriteRecord of BC Service Request. This event also has a conditional expression to only fire on a specific SR Sub Area.

The problem is that this DV should be only invoked when the user tries to create this kind of record. Later that we have to let it be updated.

If we had a PreWriteRecordNew event it would be perfect! But we don't have that on RTE.

I thinked about the IsNewRecordPending BC specialized method, but I guess it can only be invoked via script.

Do you have any idea about how to solve that using good practices?

Tks!

Alexander Hansal said...

Hi Thiago,

thanks for the challenge ;-)

If you really need the DV to run before a new record is created, then I am afraid that script is the exit you have to take, as there is - like you say - on PreWriteRecordNew event handler in RTE.


have a nice day

@lex

Anonymous said...

Hi Alex,

We have a requirement wherein, on copy of an SR using a copy button we need to create an activity for that SR using a workflow which we have created, only for a particular source value of the SR.
Now the challenge here is, we cannot use scripting, run time event or workflow policy to achieve this and Named method is not supported on Service Request BC because of its class.
Is there any another way?

Naresh said...

Hi Alex,

We have an requirement, that whenever a Particular Resource Record is copied, the Status field of the record should be predefaulted to say value 'In Process' for all the status except the Status 'Cancelled'(it should be stamped with status 'Cancelled' for cancelled status). Kindly do let me know, how to implemented the above using configuration.

Regards
Naresh

venkata shashi kiran kurichety said...

Hi Alex,

My requirement is "A & B are 2 Business components & having M:M relation. Need to associate B records to a A record". This is to achieve through workflows only. Could you please help me with the solution.

Rgards,
Sasi
sashi.83@gmail.com