Expand my Community achievements bar.

Announcing the launch of new sub-community for Campaign Web UI to cater specifically to the needs of Campaign Web UI users!

Update columns having a composite primary key

Avatar

Level 2

Hi Experts,

I'm facing an issue while updating a table. Below's the log (Namespace & tablename masked):

05/02/2019 11:33:32 AM QUE-370007 Unable to find key values for element 'TABLE_NAME' (document with schema 'TABLE_NAME')

05/02/2019 11:33:32 AM XSV-350023 Unable to save document of type 'NAMESPACE_:TABLE_NAME'.

05/02/2019 11:33:32 AM SOP-330011 Error while executing the method 'Write' of service 'xtk:persist|xtk:session'.

Key is based on 4 columns & I've verified that, data exits on all those columns & they're unique when put together.

Below is the key declaration xml:

<element label="TABLE_NAME" name="TABLE_NAME">

    <key internal="true" name="PrimaryKey">

      <keyfield xpath="@COL1"/>

      <keyfield xpath="@COL2"/>

      <keyfield xpath="@COL3"/>

      <keyfield xpath="@COL4"/>

    </key>

Below is the update statement:

xtk.session.Write(

            <TABLE_NAME

            xtkschema="NAMESPACE_:TABLE_NAME" _operation="update" _key="@COL1,@COL2,@COL3,@COL4"

             <<columns that required update>>

            />);

Pls. let e know. TIA

4 Replies

Avatar

Level 5

Hi,

in the doc (Elements and attributes  : <key> element) it explicitly says :

"A key is known as composite if it includes several fields (i.e. several <keyfield> children). Do not use a composite key to define a primary key."

I would recommand using the autopk="true" and a creating a unique index constraint for the fields you wanted as a composite primary key :

<dbindex name="myIndex" label="My index on my 4 fields" unique="true">

  <keyfield xpath="@COL1"/>

  <keyfield xpath="@COL2"/>

  <keyfield xpath="@COL3"/>

  <keyfield xpath="@COL4"/>

</dbindex>

Kind regards,

Pierre

What i observed in ACM was that if we created any custom PK (single/composite),

it actually creates an Unique index on the columns.

But having autopk="true" will add another column to the table & if it's a huge table, we're going consume extra space for it.

I was able to solve this by modifying the JS update code.

Thanks for the reply

Avatar

Level 3

Can you help us with solution. I am facing same issue.

Avatar

Level 3

Hello,

I tried the below code, it worked.

var jsonData = {"col1" : "a", "col2" : "b", "col3" : "c", "col4" : "d", "col5" : "e"}

 

var xml = <TABLE_NAME xtkschema="NAMESPACE_:TABLE_NAME" _operation="insertOrUpdate" _key="@Col1,@COL2,@COL3,@COL4" @Col1 ={jsonData.col1} @COL2 ={jsonData.col2} @COL3 ={jsonData.col3} @COL4 ={jsonData.col4} @COL5 ={jsonData.col5}/>;
xtk.session.Write(xml);