I would like to draw your
attention towards one important thing which we keep using in our java codes or Jython scripts but we do not use them properly. This is about getMboSet()
method. As we are aware there are two ways of fetching an Mbo set, either by
using a relationship or MXServer. Improper use of this may lead to performance
issues, poor memory management, etc.
For example, I am working with save
event of Object launch point on WORKODER object. I need to set a value in all
related tasks which are in approved status. There is a relationship between WORKORDER object and WOACTIVITY object which can give me the set of all
related tasks of the workorder which are in approved status. It will be easier
for me to use this relationship to fetch the WOACTIVITY records. Please keep in
mind that when I am accessing the Mbo records using a relationship, it is
included in the same transaction as the parent Mbo Set and if I call a save on
the parent Mbo Set, all MboSets in the current transaction will be saved. So,
the Mbo sets fetched using relationship do not require save to be called
explicitly because their save is called when their parent is saved.
In the above code snippet, I can
also use a setWhere clause to specifically select some of the records, this new
where clause will be appended with the existing where clause of the
relationship and you will have to call a reset() method to execute and update
the resultset obtained using the relationship.
Above script will save the
WORKORDER records and the related WOACTIVITY records in the current
transaction.
Let us consider that the relationship
from WORKORDER object to WOACTIVITY does not exist which may satisfy the search
criteria we are looking for. In this case, we can create one on the fly as
below:
The parameter “$WOTASK” is a
temporary relationship name, “WOACTIVITY” is the child object, and “parent=:wonum
and siteid=:siteid and istask=1 and status=’APPR’ and targcompdate is not null”
is the relationship where clause. The values of :wonum and :siteid will be
taken from the current Mbo record from WORKORDER object.
While fetching MboSets from
MXServer, we have to be careful about a few things.
- Always use setWhere() and reset() methods with this MboSet. The setWhere() method will reduce the number of Mbo records being fetched and reset() method will ensure fetching of data with the where clause.
- If the Mbo set is being fetched only for traversing and not for any addition or update, it is a best practice to set the DISCARDABLE flag as true. If the Mbo set is being fetched for read-only purpose it is a good practice to set the NOSAVE flag as true. These steps will shorten the looping time of the transaction.
- If any setValue method is used for some Mbo record of the MboSet, or any add or update is being done on the Mbo set, it is required to call the save() method on the set. Mbo sets fetched from MXServer needs to be saved before the set is closed otherwise the changes will be lost.
- Always use clear() and close() methods on the Mbo set fetched using MXServer if it is not required anymore. This will release memory and the database resources
Let us consider one example.
Every Saturday, we need to run an escalation to update the actual cost of all
issue transactions of active inventory records of all capitalized items that
have happened between last Monday and Friday. We have written an escalation to
run every Saturday on Inventory Object which calls an Action. Keeping in mind
all the above rules, this action logic is written in an automation script with
Action launch point, below is the sample source code of the script.
No comments:
Post a Comment