This article demonstrates how to return a list of unique values in a particular field in a CRM module.
Why?
My use-case is a data-migration where the records exist in a staging module in CRM but I want to transform/translate one of the column values into the target
How?
So this is my plan:
- Setup a connector to CRM with the scopes ZohoCRM.coql.READ and ZohoCRM.modules.ALL
- Build up a SQL query, or more specifically, a COQL - CRM Object Query Language
- Try using distinct on a single-line text field
- Adapt the query for unique values in a lookup field
I won't demonstrate how to set up a connector as there is plenty of documentation on the Zoho Official Documentation and even on this website so we'll skip to the COQL query. This is what I have:
copyraw
But this returns something like the following (I've reduced the 200 records to about 6 of them):
//
// build up COQL query
v_CoqlQuery = "select distinct Currency from Quotes where Subject!=''";
//
// build up parameters
m_Params = Map();
m_Params.put("select_query",v_CoqlQuery);
//
// invokeUrl
r_Coql = invokeUrl
[
url :"https://www.zohoapis.eu/crm/v2/coql"
type :POST
parameters: m_Params.toString()
connection: "joels_coql_connection"
];
//
// output
info r_Coql;
- //
- // build up COQL query
- v_CoqlQuery = "select distinct Currency from Quotes where Subject!=''";
- //
- // build up parameters
- m_Params = Map();
- m_Params.put("select_query",v_CoqlQuery);
- //
- // invokeUrl
- r_Coql = invokeUrl
- [
- url :"https://www.zohoapis.eu/crm/v2/coql"
- type :POST
- parameters: m_Params.toString()
- connection: "joels_coql_connection"
- ];
- //
- // output
- info r_Coql;
copyraw
Which isn't what I want because it has returned the same currency several times and thinks they're unique/distinct because the IDs of each quote record are different.{
"data": [
{
"Currency": "EUR",
"id": "123456789000000001"
},
{
"Currency": "EUR",
"id": "123456789000000002"
},
{
"Currency": "EUR",
"id": "123456789000000003"
},
{
"Currency": "GBP",
"id": "123456789000000004"
},
{
"Currency": "USD",
"id": "123456789000000005"
},
{
"Currency": "USD",
"id": "123456789000000006"
}
],
"info": {
"count": 200,
"more_records": true
}
}
- {
- "data": [
- {
- "Currency": "EUR",
- "id": "123456789000000001"
- },
- {
- "Currency": "EUR",
- "id": "123456789000000002"
- },
- {
- "Currency": "EUR",
- "id": "123456789000000003"
- },
- {
- "Currency": "GBP",
- "id": "123456789000000004"
- },
- {
- "Currency": "USD",
- "id": "123456789000000005"
- },
- {
- "Currency": "USD",
- "id": "123456789000000006"
- }
- ],
- "info": {
- "count": 200,
- "more_records": true
- }
- }
Having spoken to Zoho and raised with the Zoho Deluge team... Well, they realised they would get the same results, and then suggested looping through all records and creating a distinct list variable... But what if there are 20000+ records?
The advantage of working in a team of Zoho developers, is that "two heads are better than one" does apply more than we think. A colleague of mine suggested adding a group by to the query which works (tested with both the keyword 'distinct' and without it with no difference in the response):
copyraw
Which returns something like the following:
//
// build up COQL query
v_CoqlQuery = "select Currency from Quotes where Subject!='' group by Currency";
//
// build up parameters
m_Params = Map();
m_Params.put("select_query",v_CoqlQuery);
//
// invokeUrl
r_Coql = invokeUrl
[
url :"https://www.zohoapis.eu/crm/v2/coql"
type :POST
parameters:m_Params.toString()
connection:"joels_coql_connection"
];
//
// output
info r_Coql;
- //
- // build up COQL query
- v_CoqlQuery = "select Currency from Quotes where Subject!='' group by Currency";
- //
- // build up parameters
- m_Params = Map();
- m_Params.put("select_query",v_CoqlQuery);
- //
- // invokeUrl
- r_Coql = invokeUrl
- [
- url :"https://www.zohoapis.eu/crm/v2/coql"
- type :POST
- parameters:m_Params.toString()
- connection:"joels_coql_connection"
- ];
- //
- // output
- info r_Coql;
copyraw
{
"data": [
{
"Currency": "EUR",
"id": "123456789000000001"
},
{
"Currency": "GBP",
"id": "123456789000000004"
},
{
"Currency": "USD",
"id": "123456789000000005"
}
],
"info": {
"count": 3,
"more_records": false
}
}
- {
- "data": [
- {
- "Currency": "EUR",
- "id": "123456789000000001"
- },
- {
- "Currency": "GBP",
- "id": "123456789000000004"
- },
- {
- "Currency": "USD",
- "id": "123456789000000005"
- }
- ],
- "info": {
- "count": 3,
- "more_records": false
- }
- }
Amazing! Let's go one further for a lookup field, in this case the account name field on the quotes record:
copyraw
//
// build up COQL query
v_CoqlQuery = "select Account_Name.Account_Name from Quotes where Subject!='' group by Account_Name.Account_Name";
//
// build up parameters
m_Params = Map();
m_Params.put("select_query",v_CoqlQuery);
//
// invokeUrl
r_Coql = invokeUrl
[
url :"https://www.zohoapis.eu/crm/v2/coql"
type :POST
parameters:m_Params.toString()
connection:"joels_coql_connection"
];
//
// output
info r_Coql;
- //
- // build up COQL query
- v_CoqlQuery = "select Account_Name.Account_Name from Quotes where Subject!='' group by Account_Name.Account_Name";
- //
- // build up parameters
- m_Params = Map();
- m_Params.put("select_query",v_CoqlQuery);
- //
- // invokeUrl
- r_Coql = invokeUrl
- [
- url :"https://www.zohoapis.eu/crm/v2/coql"
- type :POST
- parameters:m_Params.toString()
- connection:"joels_coql_connection"
- ];
- //
- // output
- info r_Coql;
Additional
If you wanted the unique values of a picklist/dropdown, then consider an invokeUrl looping through the fields settings in CRM.
Source(s):
- Zoho CRM Developer Docs API v2 - Get Records through a COQL Query
- Merriam-Webster Dictionary - Two heads are better than one
Category: Zoho :: Article: 776



Add comment