For Zoho Services only:


I'm actually part of something bigger at Ascent Business Solutions recognized as the top Zoho Premium Solutions Partner in the United Kingdom.

Ascent Business Solutions offer support for smaller technical fixes and projects for larger developments, such as migrating to a ZohoCRM.  A team rather than a one-man-band is always available to ensure seamless progress and address any concerns. You'll find our competitive support rates with flexible, no-expiration bundles at https://ascentbusiness.co.uk/zoho-services/uk-zoho-support.  For larger projects, talk to our experts and receive dedicated support from our hands-on project consultants at https://ascentbusiness.co.uk/zoho-services/zoho-crm-implementation.

The team I manage specializes in coding API integrations between Zoho and third-party finance/commerce suites such as Xero, Shopify, WooCommerce, and eBay; to name but a few.  Our passion lies in creating innovative solutions where others have fallen short as well as working with new businesses, new sectors, and new ideas.  Our success is measured by the growth and ROI we deliver for clients, such as transforming a garden shed hobby into a 250k monthly turnover operation or generating a +60% return in just three days after launch through online payments and a streamlined e-commerce solution, replacing a paper-based system.

If you're looking for a partner who can help you drive growth and success, we'd love to work with you.  You can reach out to us on 0121 392 8140 (UK) or info@ascentbusiness.co.uk.  You can also visit our website at https://ascentbusiness.co.uk.

Zoho Analytics: Create a Monitoring System with Images

What?
This is an article to remind me how I did this for a customer and images help visualize the health of the system.

Why?
The use-case here is to build a system which monitors a Zoho App for when records were last modified and if a synchronization process starts to fail, there should be images or icons warning or advising of failures.

How?
The key trick to use here the ability for Zoho Analytics to display different images based on a criteria or a value within a data table. As documented in an earlier article, put the URL of the image, then change it's format to show the image and not the URL text. In this example, we are using images uploaded in the Zoho Analytics image library but you would need images either uploaded in Analytics or a publicly accessible image without a user wall.

Pre-amble
Have all the images you want to use ready for uploading into the system stored on your device. A URL (as in an image hosted on another website) can be used so you might skip the first section here where I demonstrate how to upload photos to be hosted by the Zoho Analytics app.

Uploading the images to be hosted by Zoho Analytics
So first steps are login to Zoho Analytics and go into the workspace you want to create the monitoring system. Preferably use the workspace that has the data to check. For demo purposes, I'm going into the CRM Reports workspace > Click on "Create" > Then select "Dashboard":
Zoho Analytics: Create a Monitoring System with Images -

Then in the top right of the dashboard, I'm going to click on the "Widget" button:
Zoho Analytics: Create a Monitoring System with Images -

On the data column, I'll select any query and any field. It doesn't matter which one here, as long as I can get to the 3rd tab of the widget (it becomes enabled once you've completed enough on the 1st tab):
Zoho Analytics: Create a Monitoring System with Images -

I'll click on the 3rd tab called "Settings" then on the sub-tab "Image", and click on the button labeled "Choose Image":
Zoho Analytics: Create a Monitoring System with Images -

I'll select "My Library" and click on the square with a plus sign on it to select images from my device:
Zoho Analytics: Create a Monitoring System with Images -

Now I can select the image(s) I want to upload (unfortunately only 1 at a time):
Zoho Analytics: Create a Monitoring System with Images -

Create an Image Table
At this stage, I'm going to create a table that holds the URLs of the images I want to use but if the image is hosted elsewhere, then this step is completely optional. Click on "Create" and select "New Table / Import Data":
Zoho Analytics: Create a Monitoring System with Images -

One of the last options on the "Import Your Data" page is "Enter Data Right Away":
Zoho Analytics: Create a Monitoring System with Images -

You'll be presented with a table of about 10 columns called "Untitled-1". I enter some labels in the first column. These will be keys later on to link my report to so keep them short without any special characters. I then saved this table with the name "Joels Image Library". I think I closed it and reopened it but now I want a 2nd column. So I click on the "Add" button and select "Add Column" > I called the column "ZohoAnalytics Image URL" and gave it the data type of "URL":
Zoho Analytics: Create a Monitoring System with Images -

Now to copy over the image URLs, I duplicated my web-browser tab (right-click on the browser tab if using Google Chrome and select "Duplicate"). I then arranged the two browser windows side-by-side so that I could copy the image address from the library to the 2nd column in my data table. So in the duplicate browser, go to modify a widget again and get to the "Choose Image" > "Image Library" (as mentioned in earlier steps), then right-click on the image and select "Copy Image Address", and paste it into the cell alongside the status key in the data table:
Zoho Analytics: Create a Monitoring System with Images -

Done all those. Now again this is completely optional, but I want to have the URL of the image alongside this 2nd column so I'm going to add a 3rd column to my data table which is simply a copy of what was in column 2:
Zoho Analytics: Create a Monitoring System with Images -

In the textarea / multi-line box, and to the right of it, I click on the "ZohoAnalytics Image URL" value to copy it into the textbox:
Zoho Analytics: Create a Monitoring System with Images -

Great! Now the next step makes the value into an image. Even if this is filled with URLs for images stored on remote websites, it helps to preview the images. Right-click on the header of the 2nd column and select "Format Column":
Zoho Analytics: Create a Monitoring System with Images -

I changed the alignment to center, changed "Display As" to "Image", and set the image dimension to "64 x 64":
Zoho Analytics: Create a Monitoring System with Images -

I should end up with something like this:
Zoho Analytics: Create a Monitoring System with Images -

Create a query table with images
Irrespective of where the images are hosted, you can now write a SQL (more precisely an ANSI-SQL / ZohoSQL) query which is something like:
copyraw
SELECT
		 "Modified Time",
		 if(to_date("Modified Time")  > sub_date(to_date(now()), 1), 
		 	'https://analytics.zoho.eu/clientapi/imageLibrary/fetchImage?ZDBFILEID=12345000012345678&ZSOID=20240725001', 
			if(to_date("Modified Time")  > sub_date(to_date(now()), 5), 
				'https://analytics.zoho.eu/clientapi/imageLibrary/fetchImage?ZDBFILEID=12345000023456789&ZSOID=20240725001', 
				'https://analytics.zoho.eu/clientapi/imageLibrary/fetchImage?ZDBFILEID=12345000034567890&ZSOID=20240725001'
			)
		) AS "Status"
FROM  "Accounts" 
ORDER BY "Modified Time" DESC 

/****
Pseudo:

Select
	Modified Time of Record
	If  Modified Time is greater than yesterday's date (today)
		Use URL of the image representing OK
		Else If Modified Time is greater than 5 days ago
			Use URL of the image representing Warning
			Else 
				Use URL of image representing a FAILURE
***/
  1.  SELECT 
  2.           "Modified Time", 
  3.           if(to_date("Modified Time")  > sub_date(to_date(now()), 1), 
  4.               'https://analytics.zoho.eu/clientapi/imageLibrary/fetchImage?ZDBFILEID=12345000012345678&ZSOID=20240725001', 
  5.              if(to_date("Modified Time")  > sub_date(to_date(now()), 5), 
  6.                  'https://analytics.zoho.eu/clientapi/imageLibrary/fetchImage?ZDBFILEID=12345000023456789&ZSOID=20240725001', 
  7.                  'https://analytics.zoho.eu/clientapi/imageLibrary/fetchImage?ZDBFILEID=12345000034567890&ZSOID=20240725001' 
  8.              ) 
  9.          ) AS "Status" 
  10.  FROM  "Accounts" 
  11.  ORDER BY "Modified Time" DESC 
  12.   
  13.  /**** 
  14.  Pseudo: 
  15.   
  16.  Select 
  17.      Modified Time of Record 
  18.      If  Modified Time is greater than yesterday's date (today) 
  19.          Use URL of the image representing OK 
  20.          else If Modified Time is greater than 5 days ago 
  21.              Use URL of the image representing Warning 
  22.              else 
  23.                  Use URL of image representing a FAILURE 
  24.  ***/ 
But if I want it to join to my images table and with a bit more foresight (I plan to do a mega query to rule them all which has all the data for my widgets), I have to write it as such:
copyraw
SELECT
		 'CRM Accounts' AS "DataSource",
		 date(t1."ModifiedTime") AS "Date",
		 t1."RecordID" AS "Record ID",
		 t1."RecordName" AS "Record Name",
		 t1."RecordOwner" AS "Record Owner",
		 img."ZohoAnalytics Image URL" AS "Status Image"
FROM (	SELECT
			 acc."Id" AS "RecordID",
			 acc."Account Name" AS "RecordName",
			 acc."Account Owner Name" AS "RecordOwner",
			 acc."Modified Time" AS "ModifiedTime",
			 if(to_date(acc."Modified Time")  > sub_date(to_date(now()), 1), 
             	'Data OK', 
                if(to_date(acc."Modified Time")  > sub_date(to_date(now()), 5), 
                	'Data Warn', 
                    'Data Failed'
                )
             ) AS "Status"
    FROM  "Accounts" acc 
) AS  t1
LEFT JOIN "Joels Image Library" img ON t1."Status"  = img."Status Value"
  1.  SELECT 
  2.           'CRM Accounts' AS "DataSource", 
  3.           date(t1."ModifiedTime") AS "Date", 
  4.           t1."RecordID" AS "Record ID", 
  5.           t1."RecordName" AS "Record Name", 
  6.           t1."RecordOwner" AS "Record Owner", 
  7.           img."ZohoAnalytics Image URL" AS "Status Image" 
  8.  FROM (    SELECT 
  9.               acc."Id" AS "RecordID", 
  10.               acc."Account Name" AS "RecordName", 
  11.               acc."Account Owner Name" AS "RecordOwner", 
  12.               acc."Modified Time" AS "ModifiedTime", 
  13.               if(to_date(acc."Modified Time")  > sub_date(to_date(now()), 1), 
  14.                   'Data OK', 
  15.                  if(to_date(acc."Modified Time")  > sub_date(to_date(now()), 5), 
  16.                      'Data Warn', 
  17.                      'Data Failed' 
  18.                  ) 
  19.               ) AS "Status" 
  20.      FROM  "Accounts" acc 
  21.  ) AS  t1 
  22.  LEFT JOIN "Joels Image Library" img ON t1."Status"  = img."Status Value" 
This produces something as follows:
Zoho Analytics: Create a Monitoring System with Images -

Create a widget that shows an image
This step here will create a widget that will show the last image (or first image if ordered by modified time in descending order) in this status table. For simplicity, I'm going to select the first type of widget under "1. Select Widget"; then under "2. Select Columns", I'm going to set "Data Column" to display the Maximum Date; then I want to "Group By" the image column, here labeled "Status Image":
Zoho Analytics: Create a Monitoring System with Images -

Then on the 2nd tab, I'm going to filter by my dataSource, which I've selected here to be my "CRM Accounts":
Zoho Analytics: Create a Monitoring System with Images -

Click on the 3rd tab "Settings" and the preview should automatically display the image alongside the data. I'm going to the sub tab "Values" and change the displayed label to a constant text set to "CRM Account Data":
Zoho Analytics: Create a Monitoring System with Images -

I then click on the "image" sub tab and change the "Image Position" so that the image is under the text (personal preference here and completely optional):
Zoho Analytics: Create a Monitoring System with Images -

So now I can go back to my query and expand on it a little to include the other datasources (CRM Tables):
copyraw
SELECT
		 'CRM Accounts' AS "DataSource",
		 date(t1."ModifiedTime") AS "Date",
		 t1."RecordID" AS "Record ID",
		 t1."RecordName" AS "Record Name",
		 t1."RecordOwner" AS "Record Owner",
		 img."ZohoAnalytics Image URL" AS "Status Image"
FROM (	SELECT
			 acc."Id" AS "RecordID",
			 acc."Account Name" AS "RecordName",
			 acc."Account Owner Name" AS "RecordOwner",
			 acc."Modified Time" AS "ModifiedTime",
			 if(to_date(acc."Modified Time")  > sub_date(to_date(now()), 1), 
             	'Data OK', 
                if(to_date(acc."Modified Time")  > sub_date(to_date(now()), 5), 
                	'Data Warn', 
                    'Data Failed'
                )
             ) AS "Status"
    FROM  "Accounts" acc 
) AS  t1
LEFT JOIN "Joels Image Library" img ON t1."Status"  = img."Status Value"  

UNION ALL

SELECT
		 'CRM Contacts' AS "DataSource",
		 date(t2."ModifiedTime") AS "Date",
		 t2."RecordID" AS "Record ID",
		 t2."RecordName" AS "Record Name",
		 t2."RecordOwner" AS "Record Owner",
		 img2."ZohoAnalytics Image URL" AS "Status Image"
FROM (	SELECT
			 con."Id" AS "RecordID",
			 con."Full Name" AS "RecordName",
			 con."Contact Owner Name" AS "RecordOwner",
			 con."Modified Time" AS "ModifiedTime",
			 if(to_date(con."Modified Time")  > sub_date(to_date(now()), 1), 
             	'Data OK', 
                if(to_date(con."Modified Time")  > sub_date(to_date(now()), 5), 
                	'Data Warn', 
                	'Data Failed'
                )
             ) AS "Status"
	FROM  "Contacts" con 
) AS  t2
LEFT JOIN "Joels Image Library" img2 ON t2."Status"  = img2."Status Value"  

UNION ALL

SELECT
		 'CRM Deals' AS "DataSource",
		 date(t3."ModifiedTime") AS "Date",
		 t3."RecordID" AS "Record ID",
		 t3."RecordName" AS "Record Name",
		 t3."RecordOwner" AS "Record Owner",
		 img3."ZohoAnalytics Image URL" AS "Status Image"
FROM (	SELECT
			 opp."Id" AS "RecordID",
			 opp."Deal Name" AS "RecordName",
			 opp."Deal Owner Name" AS "RecordOwner",
			 opp."Modified Time" AS "ModifiedTime",
			 if(to_date(opp."Modified Time")  > sub_date(to_date(now()), 1), 
             	'Data OK', 
                if(to_date(opp."Modified Time")  > sub_date(to_date(now()), 5), 
                	'Data Warn', 
                	'Data Failed'
                )
             ) AS "Status"
	FROM  "Deals" opp 
) AS  t3
LEFT JOIN "Joels Image Library" img3 ON t3."Status"  = img3."Status Value"  

UNION ALL

SELECT
		 'CRM Meetings' AS "DataSource",
		 date(t4."ModifiedTime") AS "Date",
		 t4."RecordID" AS "Record ID",
		 t4."RecordName" AS "Record Name",
		 t4."RecordOwner" AS "Record Owner",
		 img4."ZohoAnalytics Image URL" AS "Status Image"
FROM (	SELECT
			 mtg."Id" AS "RecordID",
			 mtg."Title" AS "RecordName",
			 mtg."Host Name" AS "RecordOwner",
			 mtg."Modified Time" AS "ModifiedTime",
			 if(to_date(mtg."Modified Time")  > sub_date(to_date(now()), 1), 
             	'Data OK', 
                if(to_date(mtg."Modified Time")  > sub_date(to_date(now()), 5), 
                	'Data Warn', 
                	'Data Failed'
                )
             ) AS "Status"
	FROM  "Meetings" mtg 
) AS  t4
LEFT JOIN "Joels Image Library" img4 ON t4."Status"  = img4."Status Value"  

UNION ALL

SELECT
		 'CRM Tasks' AS "DataSource",
		 date(t5."ModifiedTime") AS "Date",
		 t5."RecordID" AS "Record ID",
		 t5."RecordName" AS "Record Name",
		 t5."RecordOwner" AS "Record Owner",
		 img5."ZohoAnalytics Image URL" AS "Status Image"
FROM (	SELECT
			 tsk."Id" AS "RecordID",
			 tsk."Subject" AS "RecordName",
			 tsk."Task Owner Name" AS "RecordOwner",
			 tsk."Modified Time" AS "ModifiedTime",
			 if(to_date(tsk."Modified Time")  > sub_date(to_date(now()), 1), 
             	'Data OK', 
                if(to_date(tsk."Modified Time")  > sub_date(to_date(now()), 5), 
                	'Data Warn', 
                	'Data Failed'
                )
             ) AS "Status"
	FROM  "Tasks" tsk 
) AS  t5
LEFT JOIN "Joels Image Library" img5 ON t5."Status"  = img5."Status Value"
  1.  SELECT 
  2.           'CRM Accounts' AS "DataSource", 
  3.           date(t1."ModifiedTime") AS "Date", 
  4.           t1."RecordID" AS "Record ID", 
  5.           t1."RecordName" AS "Record Name", 
  6.           t1."RecordOwner" AS "Record Owner", 
  7.           img."ZohoAnalytics Image URL" AS "Status Image" 
  8.  FROM (    SELECT 
  9.               acc."Id" AS "RecordID", 
  10.               acc."Account Name" AS "RecordName", 
  11.               acc."Account Owner Name" AS "RecordOwner", 
  12.               acc."Modified Time" AS "ModifiedTime", 
  13.               if(to_date(acc."Modified Time")  > sub_date(to_date(now()), 1), 
  14.                   'Data OK', 
  15.                  if(to_date(acc."Modified Time")  > sub_date(to_date(now()), 5), 
  16.                      'Data Warn', 
  17.                      'Data Failed' 
  18.                  ) 
  19.               ) AS "Status" 
  20.      FROM  "Accounts" acc 
  21.  ) AS  t1 
  22.  LEFT JOIN "Joels Image Library" img ON t1."Status"  = img."Status Value" 
  23.   
  24.  UNION ALL 
  25.   
  26.  SELECT 
  27.           'CRM Contacts' AS "DataSource", 
  28.           date(t2."ModifiedTime") AS "Date", 
  29.           t2."RecordID" AS "Record ID", 
  30.           t2."RecordName" AS "Record Name", 
  31.           t2."RecordOwner" AS "Record Owner", 
  32.           img2."ZohoAnalytics Image URL" AS "Status Image" 
  33.  FROM (    SELECT 
  34.               con."Id" AS "RecordID", 
  35.               con."Full Name" AS "RecordName", 
  36.               con."Contact Owner Name" AS "RecordOwner", 
  37.               con."Modified Time" AS "ModifiedTime", 
  38.               if(to_date(con."Modified Time")  > sub_date(to_date(now()), 1), 
  39.                   'Data OK', 
  40.                  if(to_date(con."Modified Time")  > sub_date(to_date(now()), 5), 
  41.                      'Data Warn', 
  42.                      'Data Failed' 
  43.                  ) 
  44.               ) AS "Status" 
  45.      FROM  "Contacts" con 
  46.  ) AS  t2 
  47.  LEFT JOIN "Joels Image Library" img2 ON t2."Status"  = img2."Status Value" 
  48.   
  49.  UNION ALL 
  50.   
  51.  SELECT 
  52.           'CRM Deals' AS "DataSource", 
  53.           date(t3."ModifiedTime") AS "Date", 
  54.           t3."RecordID" AS "Record ID", 
  55.           t3."RecordName" AS "Record Name", 
  56.           t3."RecordOwner" AS "Record Owner", 
  57.           img3."ZohoAnalytics Image URL" AS "Status Image" 
  58.  FROM (    SELECT 
  59.               opp."Id" AS "RecordID", 
  60.               opp."Deal Name" AS "RecordName", 
  61.               opp."Deal Owner Name" AS "RecordOwner", 
  62.               opp."Modified Time" AS "ModifiedTime", 
  63.               if(to_date(opp."Modified Time")  > sub_date(to_date(now()), 1), 
  64.                   'Data OK', 
  65.                  if(to_date(opp."Modified Time")  > sub_date(to_date(now()), 5), 
  66.                      'Data Warn', 
  67.                      'Data Failed' 
  68.                  ) 
  69.               ) AS "Status" 
  70.      FROM  "Deals" opp 
  71.  ) AS  t3 
  72.  LEFT JOIN "Joels Image Library" img3 ON t3."Status"  = img3."Status Value" 
  73.   
  74.  UNION ALL 
  75.   
  76.  SELECT 
  77.           'CRM Meetings' AS "DataSource", 
  78.           date(t4."ModifiedTime") AS "Date", 
  79.           t4."RecordID" AS "Record ID", 
  80.           t4."RecordName" AS "Record Name", 
  81.           t4."RecordOwner" AS "Record Owner", 
  82.           img4."ZohoAnalytics Image URL" AS "Status Image" 
  83.  FROM (    SELECT 
  84.               mtg."Id" AS "RecordID", 
  85.               mtg."Title" AS "RecordName", 
  86.               mtg."Host Name" AS "RecordOwner", 
  87.               mtg."Modified Time" AS "ModifiedTime", 
  88.               if(to_date(mtg."Modified Time")  > sub_date(to_date(now()), 1), 
  89.                   'Data OK', 
  90.                  if(to_date(mtg."Modified Time")  > sub_date(to_date(now()), 5), 
  91.                      'Data Warn', 
  92.                      'Data Failed' 
  93.                  ) 
  94.               ) AS "Status" 
  95.      FROM  "Meetings" mtg 
  96.  ) AS  t4 
  97.  LEFT JOIN "Joels Image Library" img4 ON t4."Status"  = img4."Status Value" 
  98.   
  99.  UNION ALL 
  100.   
  101.  SELECT 
  102.           'CRM Tasks' AS "DataSource", 
  103.           date(t5."ModifiedTime") AS "Date", 
  104.           t5."RecordID" AS "Record ID", 
  105.           t5."RecordName" AS "Record Name", 
  106.           t5."RecordOwner" AS "Record Owner", 
  107.           img5."ZohoAnalytics Image URL" AS "Status Image" 
  108.  FROM (    SELECT 
  109.               tsk."Id" AS "RecordID", 
  110.               tsk."Subject" AS "RecordName", 
  111.               tsk."Task Owner Name" AS "RecordOwner", 
  112.               tsk."Modified Time" AS "ModifiedTime", 
  113.               if(to_date(tsk."Modified Time")  > sub_date(to_date(now()), 1), 
  114.                   'Data OK', 
  115.                  if(to_date(tsk."Modified Time")  > sub_date(to_date(now()), 5), 
  116.                      'Data Warn', 
  117.                      'Data Failed' 
  118.                  ) 
  119.               ) AS "Status" 
  120.      FROM  "Tasks" tsk 
  121.  ) AS  t5 
  122.  LEFT JOIN "Joels Image Library" img5 ON t5."Status"  = img5."Status Value" 
Repeating the above for a few more widgets (or cloning the first widget and then changing the filter and heading label), I now have a dashboard that has the following:
Zoho Analytics: Create a Monitoring System with Images -

Done!

Source(s):

Category: Zoho :: Article: 879

Credit where Credit is Due:


Feel free to copy, redistribute and share this information. All that we ask is that you attribute credit and possibly even a link back to this website as it really helps in our search engine rankings.

Disclaimer: Please note that the information provided on this website is intended for informational purposes only and does not represent a warranty. The opinions expressed are those of the author only. We recommend testing any solutions in a development environment before implementing them in production. The articles are based on our good faith efforts and were current at the time of writing, reflecting our practical experience in a commercial setting.

Thank you for visiting and, as always, we hope this website was of some use to you!

Kind Regards,

Joel Lipman
www.joellipman.com

Related Articles

Joes Revolver Map

Accreditation

Badge - Certified Zoho Creator Associate
Badge - Certified Zoho Creator Associate

Donate & Support

If you like my content, and would like to support this sharing site, feel free to donate using a method below:

Paypal:
Donate to Joel Lipman via PayPal

Bitcoin:
Donate to Joel Lipman with Bitcoin bc1qf6elrdxc968h0k673l2djc9wrpazhqtxw8qqp4

Ethereum:
Donate to Joel Lipman with Ethereum 0xb038962F3809b425D661EF5D22294Cf45E02FebF
© 2024 Joel Lipman .com. All Rights Reserved.