Try with a subquery instead
SELECT vci.filename, vci.zonenm, vci.ndc, vci.zoneid, vci.sku,vci.lastUpdate,vci.file_directory,
vci.location_code,vci.lookupLnvBu as bu
FROM view_cart_inventory as vci
WHERE SUBSTR(vci.file_directory,-4)=(SELECT MAX(SUBSTR(vci1.file_directory,-4)) FROM view_cart_inventory as vci1)
You are also mixing old and new ways of joining tables
Either (new)
SELECT vci.filename, vci.zonenm, vci.ndc, vci.zoneid, vci.sku,vci.lastUpdate,vci.file_directory,
vci.location_code,vci.lookupLnvBu as bu, vci1.filename,vci1.file_directory
FROM view_cart_inventory as vci
INNER JOIN view_cart_inventory as vci1
ON vci.filename = vci1.filename
WHERE substr(vci.file_directory,-4) > substr(vci1.file_directory,-4 )
or (old)
SELECT vci.filename, vci.zonenm, vci.ndc, vci.zoneid, vci.sku,vci.lastUpdate,vci.file_directory,
vci.location_code,vci.lookupLnvBu as bu, vci1.filename,vci1.file_directory
FROM view_cart_inventory as vci, view_cart_inventory as vci1
WHERE vci.filename = vci1.filename
AND substr(vci.file_directory,-4) > substr(vci1.file_directory,-4 )
And HAVING is used in combination with GROUP BY, use WHERE.