Hello everyone!
Welcome back to another post in the Kaizen series.
What is a Subform?
A subform is a secondary form or a table that enables you to include multiple line items into a primary form. Every line item is a subform record.
Your CRM data are often inter-dependent. Often, you may have the necessity to associate multiple items to a single record. In the technical lingo, we call these "line items".
Consider we have a Students module to store student records. Apart from the data like name, age, date of birth, email ID, courses opted for etc, we may want to have information such as the languages a student knows and the proficiency level in that language. So, Languages can be a subform in the Students module, and Language and Proficiency can be the two fields in that subform.
Therefore, every row in this subform that holds the language and the proficiency is a subform record or a line item.
Here is how the subform looks in a record in the Students module.
Note
The Subform API is available only in the Enterprise and Ultimate editions of Zoho CRM.
Let us see how to insert, update, and delete these subform records through the APIs.
Subform APIs
- Insert Subform Records
- Update Subform Records
- Get a Subform
- Delete Subform Records
1. Insert Subform Records
Details Required:
a. API Name of the subform.
b. API name of the subform fields.
a. API name of the subform
- Make a Get Modules API call. The response displays the details of all the available modules.
- Search for the module in which you have created the subform. In our case, it is Students.
- Look for the value of the key "generated_type" as "subform".
- The value of the key "api_name" gives the API name of the subform. In our case, it is Languages.
b. API name of the subform fields
- Make a Get Fields Metadata API call to the subform module (crm/v2/settings/fields?module=Languages).
- Search for the field label. The value of the "api_name" key for the fields in the subform are the API names. Here, they are Proficiency and Language.
- Note down the "json_type" that represents the type of value the subform fields accept. Here, they are pick lists that accept string values.
To insert subform records:
Request URL: {{api-domain}}/crm/v2/Students
Request method: POST
Sample Input
{
"data": [
{
"Name":"Allan John",
"Languages1": [
{
"Proficiency": "Native",
"Language": "English"
},
{
"Proficiency": "Professional",
"Language": "French"
}
]
}
]
}
|
Response:
Note
- A module can have a maximum of two subforms for all editions except Ultimate. The Ultimate edition can have a maximum of five subforms.
- Every module can have a maximum of 200 subform records with each subform having a maximum of 100 records.
- A maximum of five aggregate custom fields are available for a subform.
Possible Errors
The "details" key in the response gives you an idea of where the error occurred. This key contains the API name of the field that has incorrect input and other necessary information in other keys.
HTTP Status and Error Code
| "details" key
| Reason for error
| Handling
|
400 - INVALID_DATA
| "details" : {
"api_name":"sub_form_api_name",
"expected_data_type":"jsonarray"
}
| Invalid input for subform.
| Construct proper subform data and send it in the request body.
|
400 - INVALID_DATA
| "details" : {
"expected_data_type":"data_type",
"api_name" : "name_of_field",
"index" : "subform_array_index",
"parent_api_name":"subform_api_name"
}
| You have input Invalid data type for the field.
| Use parent_api_name, index, and api_name to identify the invalid field and use expected_data_type to construct a proper value.
|
400 - INVALID_DATA
| "details" : {
"api_name" : "subform_api_name",
"info" : "Maximum of 100 records allowed"
}
| A subform can only have a maximum of 100 records.
| Do not associate further records to the mentioned subform.
|
2. Update Subform Records
Now that we have created a subform, every subform row is a record with a unique ID.
Let us now update the subform entries we just added to the Languages subform in the Students module.
The changes we are making are:
a. Adding a subform entry for the Language "Spanish" with Proficiency as "Professional".
b. Updating the Proficiency of the Language "French" to "Native".
Details required:
Record IDs of the subform records that you want to update. Make a Get Subform Data API call to the Student record you want to update the subform in.
The request to update the subform is
Request URL: {{api-domain}}/crm/v2/Students/3652397000002125005
Request method: PUT
Sample Input
{
"data": [
{
"Languages": [
{
"Proficiency": "Professional", //new subfrom record
"Language": "Spanish"
},
{
"id":"3652397000002125020", //ID of the subform record that you want to update
"Proficiency": "Native",
"Language": "French"
},
{
"id":"3652397000002125019" //ID of the subform record that does not need any change
}
]
}
]
}
|
Response:
Note
- You must specify the record IDs of the subform records you want to update and also the ones you do not want to update.
- If you do not specify their IDs, the system deletes those records from the subform.
Possible Errors
HTTP Status and Error Code
| "details" key
| Reason for error
| Handling
|
400 - INVALID_DATA
| "details" : {
"api_name":"sub_form_api_name",
"expected_data_type":"jsonarray"
}
| Invalid input for subform.
| Construct proper subform data and send it in the request body.
|
400 - INVALID_DATA
| "details" : {
"expected_data_type":"data_type",
"api_name" : "name_of_field",
"index" : "subform_array_index",
"parent_api_name":"subform_api_name"
}
| You have input invalid data type for the field.
| Use parent_api_name, index, and api_name to identify the invalid field and use expected_data_type to construct a proper value.
|
202- INVALID_DATA
| Message: the id given seems to be invalid
| 1. Either the record ID or the subform record ID is invalid, (or)
2. User does not have the permission to the mentioned record.
| 1. Check the record ID sent in the API request URL or in the request body (or)
2. Check the subform record ID sent in the request body.
|
3. Get a Subform
In the response, the key Parent_Id gives the name and ID of the record that the subform record is associated to.
Request URL: {{api-domain}}/crm/v2/Languages
Request method: GET
Response:
You can also get the subform details when you fetch a record from the module the subform is created in.
Request URL: {{api-domain}}/crm/v2/Students/3652397000002125005
Request method: GET
The response is as below.
4. Delete Subform Records
Specify only the IDs of the subform records that you want to retain. The system deletes the other subform records whose IDs you have not specified.
We hope you found this post useful. Stay tuned for more!
Write to us at support@zohocrm.com if you have any questions, or let us know in the comment section.
Cheers!