Autoguid does not work for Dynamic Sql Service Object
kbt134037
PRODUCTIssue
Recreating the following scenario (or similar) where the NewID (Unique Identifier) is set as default with an AutoGUID file, will result in a "SmartObject property [Column Name] is required property for selected method Create.Value must be set" error as the K2 SmartObject will request the field to have a value which it obtains from the view/form before it can send the request to SQL. This will then generate the GUID therefore it will be blocked from a K2 SmartObject level and result in this error.
Additional information
Recreation steps:
- Create a simple table in SQL, create a column called ID of type Unique Identifier.
- Mark it as a primary key (setting it as unique).
- Set the default value of ID as (newid)().
- Add a service instance for that database, exposing the new table as a service object.
- Add a SmartObject (advanced) via the designer, add the methods and auto create data fields which should create an ID.
- Note that the SmartObject automatically and correctly identifies this as Autoguid.
- Create an Item View, linking to this SmartObject.
- Auto-generate the view fields for ID (which will be a read only label, given it doesn't need to be set).
- Run the view and click "Create."
- An error appears that states the ID was not provided even though it is set as an Autoguid.
Symptoms
An error appears that states the ID was not provided while AutoGuid is used.Resolution
From an SQL perspective you cannot have a primary key set to "not required/to accept nulls" as this will not work. However from the K2 SmartObject perspective the required property there is not the same as the required property from SQL, they are two different required properties although they work together. The required property from the K2 SmartObject, is a K2 required property which expects a value from a K2 level to be passed into the method before it even reaches SQL. On the other side the SQL required properties which is called the NOT NULL is expecting a value that it provides itself as the field is set to NewID() (Unique Identifier) as default.
Therefore should you turn off the required property from the SmartObject level, that does not mean that it is not a required field anymore as from SQL it will still be a required field and will be generated on insert.