cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
Showing results for 
Search instead for 
Did you mean: 

Community Tip - Need to share some code when posting a question or reply? Make sure to use the "Insert code sample" menu option. Learn more! X

Update Entries in nested Infotables

AS_10340651
12-Amethyst

Update Entries in nested Infotables

Hello There,

 

i have an Infotable that contains a nested infotable. Let's call them parent and child infotable. I'm able to add anything to the parent and update if i want. For the child infotable i'm somehow limited. I'm only able to add entries with AddRow() but update is not possible.

 

This is the code i'm using for testing that:

 

 

// check if an entry already exist and apply to the variable named project
let project = Things["test.outer.DT"].QueryDataTableEntries({
	query: {
               "filters": {
                    "type": "And",
                    "filters": [
                        {
                            "type": "EQ",
                            "fieldName": "timeStamp",
                            "value": timeStamp
                        },
                        {
                            "type": "EQ",
                            "fieldName": "position",
                            "value": position
                        }
                    ]
                }
	} /* QUERY */
});

// create empty holder for the outer DT
let values = Things["test.outer.DT"].CreateValues();
// create empty holder for the inner DT
let versionData = DataShapes["test.inner"].CreateValues();
// create empty holder if no entries exist at the inner DT
let innerValues = new Object();

// check if an entry already exist and apply it to values if so
if(project.getRowCount()){
	values 		= project;
}else {
    values.timeStamp 				= timeStamp;
    values.position 				= position;
    // versionData is the nested Infotable
    values.versionData 				= versionData; 
}

// check if the inner Infotable has an entry
entry = Resources["InfoTableFunctions"].Query({
t: values.versionData /* INFOTABLE */,
query: {
            "filters": {
                "type": "EQ",
                "fieldName": "versionName",
                "value": versionName
            }
        }
});

// if the inner Infotable has an entry change the property state to hit
if(entry.getRowCount()){
    entry.state = "hit";
    Resources["InfoTableFunctions"].UpdateQuery({
        t: values.versionData /* INFOTABLE */,
        query: {
            "filters": {
                "type": "EQ",
                "fieldName": "versionName",
                "value": versionName
            }
        } /* QUERY */,
        values: entry /* INFOTABLE */
    });
    
}else{
    innerValues.versionName = versionName;
    innerValues.State	    = State; 

    // add the new entry to the inner Infotable
    values.versionData.AddRow(innerValues);
}

// update the hole entry at the outer Infotable
Things["test.outer.DT"].AddOrUpdateDataTableEntry({
	values: values /* INFOTABLE */
});

 

 

 

Everything works beside the "UpdateQuery". I tried with "AddOrUpdateDataTableEntry" on values.versionData but i get there an error since it is no real existing Infotable. After few testings and tries i found this: update nested Infotable but i dont get why it doesn't work. 
Or is Thingworx not designed for nested Infotables even when it's possible?

in entry i have the changes but UpdateQuery does not update anything.

 

1 ACCEPTED SOLUTION

Accepted Solutions

Okay, who ever will use this UpdateQuery should know that this command is actually a copy command and not an update command (thanks for the wrong and confusing naming). 

That means, if you use it, then the return of UpdateQuery will be a changed copy of the matched query. while the original table is untouched.

 

i use now this workaround 

values.versionData.rows.toArray().forEach((row,e) => {
   if(row.versionName == versionName){
      row.State	= State; 
   }
}

and then the "AddOrUpdateDataTableEntry" will actually do the rest.

View solution in original post

1 REPLY 1

Okay, who ever will use this UpdateQuery should know that this command is actually a copy command and not an update command (thanks for the wrong and confusing naming). 

That means, if you use it, then the return of UpdateQuery will be a changed copy of the matched query. while the original table is untouched.

 

i use now this workaround 

values.versionData.rows.toArray().forEach((row,e) => {
   if(row.versionName == versionName){
      row.State	= State; 
   }
}

and then the "AddOrUpdateDataTableEntry" will actually do the rest.

Top Tags