How to Update Multiple Parts OnAfterVersion

オフライン

I am currently working on a method that updates the item_number for parts with the Current Revision of the part. This is what I have so far:
(OnAfterVersion)
Innovator inn = this.getInnovator();
Item newItem = inn.newItem("Part", "get");
newItem.setProperty("config_id", this.getProperty("config_id"));
newItem.setProperty("is_current", "1");
newItem.setAttribute("select", "major_rev");
newItem = newItem.apply();
string currRev = newItem.getProperty("major_rev");
string ID = newItem.getID();
string itemNumber = this.getProperty("item_number");
RequestState.Add("newRevision", currRev);
RequestState.Add("newRevisionID", ID);
RequestState.Add("itemNumber", itemNumber);

return this;
(OnBeforeUpdate)
Innovator inn = this.getInnovator();
Aras.Server.Core.InnovatorDatabase conn = CCO.DB.InnDatabase;
string newRevisions = (string) RequestState["newRevision"];
string newItemID = (string) RequestState["newRevisionID"];
string itemNumber = (string) RequestState["itemNumber"];
if (!String.IsNullOrEmpty(newItemID)) {

itemNumber = itemNumber.Remove(itemNumber.Length - 1, 1);
itemNumber = itemNumber + newRevisions;

var sql = "UPDATE INNOVATOR.PART SET item_number='" + itemNumber + "' where id='" + newItemID + "'";
inn.applySQL(sql);

this.setProperty("item_number", itemNumber);

}

return this;

The methods work great until I try to bump two or more parts to the next revision using an eco.
I get the error: An entry with the same key already exists. I'm guess that this is happening cause OnAfterVersion is called for both items before OnBeforeUpdate can run and finish the method. I was wondering if there was a simple work around this?

  • Hi everyone,

    So I actually did find a work around. I appended the config Number to the end of each of the State creating unique states per item. I also changed my second method from OnBeforeUpdate to OnAfterUpdate since OnAfterUpdate has the config Number available. Below is the updated code.

    OnAfterVersion:

    Innovator inn = this.getInnovator();
    Aras.Server.Core.InnovatorDatabase conn = CCO.DB.InnDatabase;
    // Get the most recent version of this item
    Item newItem = inn.newItem("Part", "get");
    newItem.setProperty("config_id", this.getProperty("config_id"));
    newItem.setProperty("is_current", "1");
    newItem.setAttribute("select", "major_rev");
    newItem = newItem.apply();
    string currRev = newItem.getProperty("major_rev");
    string ID = newItem.getID();
    string itemNumber = this.getProperty("item_number");
    string configID = this.getProperty("config_id");
    RequestState.Add("newRevision"+configID, currRev);
    RequestState.Add("newRevisionID"+configID, ID);
    RequestState.Add("itemNumber"+configID, itemNumber);

    return this;

    OnAfterUpdate:

    Innovator inn = this.getInnovator();
    Aras.Server.Core.InnovatorDatabase conn = CCO.DB.InnDatabase;

    string configID = this.getProperty("config_id");
    string newRevisions = (string) RequestState["newRevision"+configID];
    string newItemID = (string) RequestState["newRevisionID"+configID];
    string itemNumber = (string) RequestState["itemNumber"+configID];

    if (!String.IsNullOrEmpty(newItemID)) {
    //throw new ArgumentException(itemNumber+":HI");
    itemNumber = itemNumber.Remove(itemNumber.Length - 1, 1);
    itemNumber = itemNumber + newRevisions;
    var sql = "UPDATE INNOVATOR.PART SET item_number='" + itemNumber + "' where id='" + newItemID + "'";
    inn.applySQL(sql);

    }

    return this;