Managed Parent Rule Type

Managed Parent Rule Type
calac41
Managed parent rules inserts relationships between a child table and a parent table. The parent object is inserted if it does not already exist.
In this article:
Create a Managed Parent Rule
Prerequisite:
 Your API is connected to an active database that contains at least one table or view.
Follow these steps:
  1. In API Creator, in the Manage section, click 
    Rules
    .
    If your API does not have existing rules, the Welcome to Rules page appears. If your API has existing rules, they are listed on the By entity tab by default.
  2. Click 
    Create a Rule
    .
  3. Select the 
    Managed Parent
     rule type, the entity to which it applies, and then click 
    Create Rule
    .
  4. Define the parameters of the rule, and then click
    Save
    or click 
    Activate and Close
     to return to the list of rules:
    Title
    The title for the managed parent rule. The title for rules does not affect logic processing. To apply a default value, leave this field blank.
    Required:
     No
    Role to parent
    The name of the role to the parent.
    Topics
    The topic associated with this rule.
    Code
    The code for your managed parent rule.
    Active
    Select to activate the rule.
    Default:
     Cleared
     The API must be complete.
    Name
    The name of the managed parent rule. Leave this field blank for the system default.
The managed parent rule is created.
Managed Parent Rule Algorithm
When you insert a child object, managed parent rules insert a parent object if it does not already exist. This rule uses the following algorithm:
  1. You insert a child object. The logic engine checks whether there are any managed parent rules for that entity.
  2. If there are, then for each such rule the following occurs:
    • If the foreign key in the child object is null or incomplete, then nothing happens.
    • If the foreign key in the child object is complete, then the engine looks in the database to verify that the corresponding parent exists.
    • If the parent exists, then nothing happens.
    • If the parent does not exist, API Creator creates the parent and establishes the relationship between the two by copying the attributes used in the foreign key from the child into the new parent.
  3. Optionally, API Creator hands the new parent to your JavaScript code for further initialization.
    You do not need to write any code, unless you want to initialize the parent object beyond what is done automatically.
  4. API Creator inserts the new parent into the database.
 A common way to initialize the foreign key to a managed parent is by using a pre-insert event, for instance:
// Pre-insert event to populate the foreign key to a managed parent
var now = new Date();
row.ts_hour = now.getHours();
row.ts_day = now.getDate();
row.ts_month = now.getMonth() + 1;
row.ts_year = now.getYear();
This works fine, but you cannot use SQL snippets to initialize child columns. For example, if the 
ts_hour
 column participates in a relationship between a parent and child that was established with a managed parent rule, the following code snipet fails:
// THIS IS WRONG and will fail if the ts_hour column participates in a managed parent relationship.
row.ts_hour = SysUtility.sqlSnippetDeferred("hour(now())");
When you insert a child, if some of its columns are initialized with SQL snippets, then 
CA Live API Creator
 does not know the value of these code snippets until the child is inserted. But you cannot insert a child because its (managed) parent does not exist yet, and 
CA Live API Creator
 cannot insert the parent because it does not have the value for the primary key, which are the attributes used in the foreign key from the child. This is a circular dependency which 
CA Live API Creator
 cannot resolve, hence this restriction.
You can access the 
row
,
oldRow
,
logicContext
, and
parent
 variables by providing initialization code. The
row
and
oldRow
variables refer to the child object being modified.
The 
parent
 variable contains the new parent object API Creator is going to insert. You can modify this new parent object before API Creator inserts it through the
parent
 variable. For example, you might need to compute the values for required attributes.
You cannot access the new parent object through the
row
variable.
Processed Prior to Row Logic
Managed parent occurs before row logic. You cannot compute foreign keys using formulas.
For more information about logic execution and generated primary key handling, see Logic Execution.
Common Use Case - Group By
You can store subtotals that are incrementally maintained as updates occur, using the 
GroupBy
 pattern. For example, you can track total sales for each sales rep each month. A common use case is to use managed parents for grouping totals. The managed parent is defined as follows.
For more information about viewing an example of the managed parent rule type, see the Group By Rollup example in the Reactive Logic Tutorial.
You can test this by posting the following to
PartnerOrder
 and verifying that rows are created in
empsales
:
{
  "isReady": false,
  "approving_officer": "G PO.1",
  "salesrep_name": "A. Lincoln",
  "customer": "Gloria's Garden",
  "LineItems": [
    {
      "productName": "Hammer",
      "quantityOrdered": 1
    }
  ]
}